summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTill Straumann <strauman@slac.stanford.edu>2006-01-12 00:15:16 +0000
committerTill Straumann <strauman@slac.stanford.edu>2006-01-12 00:15:16 +0000
commit85c005f3300f54c9b566e1ec610467e217a5768f (patch)
treea2970cc03c6dca2e3c81950d0e0597a0fd8b1875
parent * vmeUniverse/vmeTsi148.c, vmeUniverse/vmeTsi148.h: (diff)
downloadrtems-85c005f3300f54c9b566e1ec610467e217a5768f.tar.bz2
* 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.
-rw-r--r--c/src/lib/libbsp/shared/ChangeLog9
-rw-r--r--c/src/lib/libbsp/shared/vmeUniverse/vmeTsi148.c5
-rw-r--r--c/src/lib/libbsp/shared/vmeUniverse/vmeUniverse.c63
-rw-r--r--c/src/lib/libbsp/shared/vmeUniverse/vmeUniverse.h10
-rw-r--r--c/src/lib/libbsp/shared/vmeUniverse/vme_am_defs.h14
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,4 +1,13 @@
2006-01-11 Till Straumann <strauman@slac.stanford.edu>
+ * 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 <strauman@slac.stanford.edu>
* vmeUniverse/vmeTsi148.c, vmeUniverse/vmeTsi148.h:
Eliminate obsolete types.
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 <stdarg.h>
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