From 85c005f3300f54c9b566e1ec610467e217a5768f Mon Sep 17 00:00:00 2001 From: Till Straumann Date: Thu, 12 Jan 2006 00:15:16 +0000 Subject: * vmeUniverse/vmeTsi148.c, vmeUniverse/vmeTsi148.h, vmeUniverse/vmeUniverse.c, vmeUniverse/vmeUniverse.h, vmeUniverse/vme_amd_defs.h: No longer enable posted-writes on master windows (creates race-condition on memory-mapped devices). A new flag allows for signalling that a window maps 'ordinary memory'. Disable VME IRQ level if no handler is registered with interrupting vector. --- c/src/lib/libbsp/shared/ChangeLog | 9 ++++ c/src/lib/libbsp/shared/vmeUniverse/vmeTsi148.c | 5 +- c/src/lib/libbsp/shared/vmeUniverse/vmeUniverse.c | 63 +++++++++++++++++------ c/src/lib/libbsp/shared/vmeUniverse/vmeUniverse.h | 10 ++++ c/src/lib/libbsp/shared/vmeUniverse/vme_am_defs.h | 14 ++++- 5 files changed, 81 insertions(+), 20 deletions(-) diff --git a/c/src/lib/libbsp/shared/ChangeLog b/c/src/lib/libbsp/shared/ChangeLog index cd8334ae39..37701444ae 100644 --- a/c/src/lib/libbsp/shared/ChangeLog +++ b/c/src/lib/libbsp/shared/ChangeLog @@ -1,3 +1,12 @@ +2006-01-11 Till Straumann + * vmeUniverse/vmeTsi148.c, vmeUniverse/vmeTsi148.h, + vmeUniverse/vmeUniverse.c, vmeUniverse/vmeUniverse.h, + vmeUniverse/vme_amd_defs.h: No longer enable posted-writes + on master windows (creates race-condition on memory-mapped + devices). A new flag allows for signalling that a window + maps 'ordinary memory'. Disable VME IRQ level if no + handler is registered with interrupting vector. + 2006-01-11 Till Straumann * vmeUniverse/vmeTsi148.c, vmeUniverse/vmeTsi148.h: diff --git a/c/src/lib/libbsp/shared/vmeUniverse/vmeTsi148.c b/c/src/lib/libbsp/shared/vmeUniverse/vmeTsi148.c index 41b466171b..a2520a06a3 100644 --- a/c/src/lib/libbsp/shared/vmeUniverse/vmeTsi148.c +++ b/c/src/lib/libbsp/shared/vmeUniverse/vmeTsi148.c @@ -1147,8 +1147,9 @@ int lvl; if ( !(ip=irqHdlTbl[vector])) { /* TODO: log error message - RTEMS has no logger :-( */ - printk("vmeTsi148 ISR: ERROR: no handler registered (level %i) IACK 0x%08x\n", - lvl, vector); + vmeTsi148IntDisable(lvl); + printk("vmeTsi148 ISR: ERROR: no handler registered (level %i) IACK 0x%08x -- DISABING level %i\n", + lvl, vector, lvl); } else { /* dispatch handler, it must clear the IRQ at the device */ ip->isr(ip->usrData, vecarg); diff --git a/c/src/lib/libbsp/shared/vmeUniverse/vmeUniverse.c b/c/src/lib/libbsp/shared/vmeUniverse/vmeUniverse.c index b4f178805d..888d71da13 100644 --- a/c/src/lib/libbsp/shared/vmeUniverse/vmeUniverse.c +++ b/c/src/lib/libbsp/shared/vmeUniverse/vmeUniverse.c @@ -290,10 +290,31 @@ static int am2mode(int ismaster, unsigned long address_space, unsigned long *pmode) { unsigned long mode=0; + + /* NOTE: reading the CY961 (Echotek ECDR814) with VDW32 + * generated bus errors when reading 32-bit words + * - very weird, because the registers are 16-bit + * AFAIK. + * - 32-bit accesses worked fine on vxWorks which + * has the port set to 64-bit. + * ???????? + */ + if (!ismaster) { mode |= UNIV_SCTL_DAT | UNIV_SCTL_PGM; mode |= UNIV_SCTL_USER; + if ( VME_AM_IS_MEMORY & address_space ) + mode |= UNIV_SCTL_PWEN | UNIV_SCTL_PREN; + mode |= UNIV_SCTL_EN; + } else { + mode |= UNIV_MCTL_VDW64 | UNIV_MCTL_VCT /* enable block transfers */; + if ( VME_AM_IS_MEMORY & address_space ) + mode |= UNIV_MCTL_PWEN; + mode |= UNIV_MCTL_EN; } + + address_space &= ~VME_AM_IS_MEMORY; + switch (address_space) { case VME_AM_STD_SUP_PGM: case VME_AM_STD_USR_PGM: @@ -456,19 +477,6 @@ unsigned long mode=0; #else WRITE_LE(offst,preg,12); #endif - /* calculate configuration word and enable the port */ - /* NOTE: reading the CY961 (Echotek ECDR814) with VDW32 - * generated bus errors when reading 32-bit words - * - very weird, because the registers are 16-bit - * AFAIK. - * - 32-bit accesses worked fine on vxWorks which - * has the port set to 64-bit. - * ???????? - */ - if (ismaster) - mode |= UNIV_MCTL_EN | UNIV_MCTL_PWEN | UNIV_MCTL_VDW64 | UNIV_MCTL_VCT; - else - mode |= UNIV_SCTL_EN | UNIV_SCTL_PWEN | UNIV_SCTL_PREN; #ifdef TSILL uprintf(stderr,"writing 0x%08x to 0x%08x + 0\n",mode,preg); @@ -545,12 +553,18 @@ showUniversePort( uprintf(f,"%s, %s", cntrl&UNIV_MCTL_PGM ? "Pgm" : "Dat", cntrl&UNIV_MCTL_SUPER ? "Sup" : "Usr"); + if ( cntrl & UNIV_MCTL_PWEN ) + uprintf(f,", PWEN"); } else { uprintf(f,"%s %s %s %s", cntrl&UNIV_SCTL_PGM ? "Pgm," : " ", cntrl&UNIV_SCTL_DAT ? "Dat," : " ", cntrl&UNIV_SCTL_SUPER ? "Sup," : " ", cntrl&UNIV_SCTL_USER ? "Usr" : ""); + if ( cntrl & UNIV_SCTL_PWEN ) + uprintf(f,", PWEN"); + if ( cntrl & UNIV_SCTL_PREN ) + uprintf(f,", PREN"); } uprintf(f,"\n"); return 0; @@ -590,8 +604,13 @@ unsigned long cntrl, start, bound, offst, mask, x; l->aspace); return -1; } - if ( (cntrl & (ismaster ? UNIV_MCTL_AM_MASK : UNIV_SCTL_AM_MASK)) - != offst ) + + if ( ! (VME_MODE_EXACT_MATCH & l->aspace) ) { + cntrl &= (ismaster ? UNIV_MCTL_AM_MASK : UNIV_SCTL_AM_MASK); + offst &= (ismaster ? UNIV_MCTL_AM_MASK : UNIV_SCTL_AM_MASK); + } + + if ( cntrl != offst ) return 0; /* mode doesn't match requested AM */ /* OK, we found a matching mode, now we must check the address range */ @@ -1305,10 +1324,20 @@ unsigned long linten; if (status & UNIV_VIRQ_ERR) { /* TODO: log error message - RTEMS has no logger :-( */ - printk("vmeUniverse ISR: error read from STATID register; (level: %i) STATID: 0x%08x\n", lvl, status); +#ifdef BSP_PIC_DO_EOI + linten &= ~msk; +#else + vmeUniverseIntDisable(lvl); +#endif + printk("vmeUniverse ISR: error read from STATID register; (level: %i) STATID: 0x%08x -- DISABLING\n", lvl, status); } else if (!(ip=universeHdlTbl[status & UNIV_VIRQ_STATID_MASK])) { +#ifdef BSP_PIC_DO_EOI + linten &= ~msk; +#else + vmeUniverseIntDisable(lvl); +#endif /* TODO: log error message - RTEMS has no logger :-( */ - printk("vmeUniverse ISR: no handler installed for this vector; (level: %i) STATID: 0x%08x\n", lvl, status); + printk("vmeUniverse ISR: no handler installed for this vector; (level: %i) STATID: 0x%08x -- DISABLING\n", lvl, status); } else { /* dispatch handler, it must clear the IRQ at the device */ ip->isr(ip->usrData, status&UNIV_VIRQ_STATID_MASK); diff --git a/c/src/lib/libbsp/shared/vmeUniverse/vmeUniverse.h b/c/src/lib/libbsp/shared/vmeUniverse/vmeUniverse.h index 29ff1e62db..42283a95da 100644 --- a/c/src/lib/libbsp/shared/vmeUniverse/vmeUniverse.h +++ b/c/src/lib/libbsp/shared/vmeUniverse/vmeUniverse.h @@ -74,8 +74,18 @@ #define VME_AM_MASK 0xff #endif +/* Enables posted writes (and on a VME slave: prefetched reads, too) */ +#ifndef VME_AM_IS_MEMORY +#define VME_AM_IS_MEMORY (1<<8) #endif +#endif + + + +/* When looking for an address translation, ask for a match of VME_MODE_PWEN etc., too */ +#define VME_MODE_EXACT_MATCH (1<<31) + #include typedef unsigned long LERegister; /* emphasize contents are little endian */ diff --git a/c/src/lib/libbsp/shared/vmeUniverse/vme_am_defs.h b/c/src/lib/libbsp/shared/vmeUniverse/vme_am_defs.h index 0292c3060a..7d467cd0e0 100644 --- a/c/src/lib/libbsp/shared/vmeUniverse/vme_am_defs.h +++ b/c/src/lib/libbsp/shared/vmeUniverse/vme_am_defs.h @@ -58,10 +58,22 @@ #define VME_AM_IS_SUP(a) ((a) & 4) #endif -/* Higher order bits are driver specific */ +/* Mask for standard address modifiers */ #ifndef VME_AM_MASK #define VME_AM_MASK 0xff #endif +/* Hint that the a window is mapping memory; the + * driver may assume it to be safe to enable decoupled + * cycles, caching and the like... + */ +#ifndef VME_AM_IS_MEMORY +#define VME_AM_IS_MEMORY (1<<8) +#endif + +/* Flags 1<<11 .. 1<<8 are reserved + * Flags 1<<12 .. 1<<31 are for driver specific options + */ + #endif -- cgit v1.2.3