summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTill Straumann <strauman@slac.stanford.edu>2007-12-09 05:51:10 +0000
committerTill Straumann <strauman@slac.stanford.edu>2007-12-09 05:51:10 +0000
commitb83b70ae60acdb9bc8218b695ccdc4678bd25233 (patch)
tree779f027ffb41d987ceaa4e34ea7399b80613c2ff
parent2007-12-08 Till Straumann <strauman@slac.stanford.edu> (diff)
downloadrtems-b83b70ae60acdb9bc8218b695ccdc4678bd25233.tar.bz2
2007-12-08 Till Straumann <strauman@slac.stanford.edu>
* shared/vme/VMEConfig.h, shared/vme/vme_universe.c: added support for Tsi148 bridge; BSP can define which bridge driver to use from VMEConfig.h. Added 'err' macro parameter to BSP_VME_INSTALL_IRQ_MGR(err) macro so that an error status can be passed back.
Diffstat (limited to '')
-rw-r--r--c/src/lib/libbsp/powerpc/ChangeLog8
-rw-r--r--c/src/lib/libbsp/powerpc/shared/vme/VMEConfig.h5
-rw-r--r--c/src/lib/libbsp/powerpc/shared/vme/vme_universe.c161
3 files changed, 148 insertions, 26 deletions
diff --git a/c/src/lib/libbsp/powerpc/ChangeLog b/c/src/lib/libbsp/powerpc/ChangeLog
index 2007d1bbe2..b57c0c9106 100644
--- a/c/src/lib/libbsp/powerpc/ChangeLog
+++ b/c/src/lib/libbsp/powerpc/ChangeLog
@@ -1,5 +1,13 @@
2007-12-08 Till Straumann <strauman@slac.stanford.edu>
+ * shared/vme/VMEConfig.h, shared/vme/vme_universe.c:
+ added support for Tsi148 bridge; BSP can define which
+ bridge driver to use from VMEConfig.h.
+ Added 'err' macro parameter to BSP_VME_INSTALL_IRQ_MGR(err)
+ macro so that an error status can be passed back.
+
+2007-12-08 Till Straumann <strauman@slac.stanford.edu>
+
* irq_supp.h: was moved from shared/irq to
libcpu/powerpc/new-exceptions/bspsupport.
diff --git a/c/src/lib/libbsp/powerpc/shared/vme/VMEConfig.h b/c/src/lib/libbsp/powerpc/shared/vme/VMEConfig.h
index 5d669bae8a..9447fce4b7 100644
--- a/c/src/lib/libbsp/powerpc/shared/vme/VMEConfig.h
+++ b/c/src/lib/libbsp/powerpc/shared/vme/VMEConfig.h
@@ -185,7 +185,7 @@ extern int _BSP_vme_bridge_irq;
#include <bsp/motorola.h>
#include <bsp/pci.h>
-#define BSP_VME_UNIVERSE_INSTALL_IRQ_MGR \
+#define BSP_VME_UNIVERSE_INSTALL_IRQ_MGR(err) \
do { \
int bus, dev, i = 0, j; \
const struct _int_map *bspmap; \
@@ -193,6 +193,7 @@ const struct _int_map *bspmap; \
* if there's a bsp route map, use it to \
* configure additional lines... \
*/ \
+ err = -1; \
if (0 == pci_find_device(0x10e3, 0x0000, 0, &bus, &dev, &i)){ \
if ( (bspmap = motorolaIntMap(currentBoard)) ) { \
for ( i=0; bspmap[i].bus >= 0; i++ ) { \
@@ -220,7 +221,7 @@ const struct _int_map *bspmap; \
} \
} \
if ( i >= 0 ) \
- vmeUniverseInstallIrqMgrAlt( \
+ err = vmeUniverseInstallIrqMgrAlt( \
VMEUNIVERSE_IRQ_MGR_FLAG_SHARED, \
0,-1, \
-1); \
diff --git a/c/src/lib/libbsp/powerpc/shared/vme/vme_universe.c b/c/src/lib/libbsp/powerpc/shared/vme/vme_universe.c
index dd1d38aa95..97e1552757 100644
--- a/c/src/lib/libbsp/powerpc/shared/vme/vme_universe.c
+++ b/c/src/lib/libbsp/powerpc/shared/vme/vme_universe.c
@@ -5,12 +5,30 @@
#include <bsp/VME.h>
#include <bsp/VMEConfig.h>
#include <bsp/irq.h>
-#define __INSIDE_RTEMS_BSP__
+#include <stdio.h>
+
+#if !defined(_VME_DRIVER_TSI148) && !defined(_VME_DRIVER_UNIVERSE)
+#define _VME_DRIVER_UNIVERSE
+#endif
+
+#if defined(_VME_DRIVER_TSI148)
+#define _VME_TSI148_DECLARE_SHOW_ROUTINES
+#include <bsp/vmeTsi148.h>
+#endif
+
+#if defined(_VME_DRIVER_UNIVERSE)
+#define _VME_UNIVERSE_DECLARE_SHOW_ROUTINES
#include <bsp/vmeUniverse.h>
+#if !defined(BSP_VME_INSTALL_IRQ_MGR) && defined(BSP_VME_UNIVERSE_INSTALL_IRQ_MGR)
+#define BSP_VME_INSTALL_IRQ_MGR BSP_VME_UNIVERSE_INSTALL_IRQ_MGR
+#endif
+#endif
/* Wrap BSP VME calls around driver calls - we do this so EPICS doesn't have to
* include bridge-specific headers. This file provides the necessary glue
* to make VME.h and vmeconfig.c independent of the bridge chip.
+ *
+ * This file is named 'vme_universe.c' for historical reasons.
*/
/*
@@ -57,11 +75,62 @@
*
* ------------------ SLAC Software Notices, Set 4 OTT.002a, 2004 FEB 03
*/
+typedef struct {
+ int (*xlate_adrs)(int, int, unsigned long, unsigned long, unsigned long *);
+ int (*install_isr)(unsigned long, BSP_VME_ISR_t, void *);
+ int (*remove_isr)(unsigned long, BSP_VME_ISR_t, void *);
+ BSP_VME_ISR_t (*get_isr)(unsigned long vector, void **);
+ int (*enable_int_lvl)(unsigned int);
+ int (*disable_int_lvl)(unsigned int);
+ int (*outbound_p_cfg)(unsigned long, unsigned long, unsigned long, unsigned long, unsigned long);
+ int (*inbound_p_cfg) (unsigned long, unsigned long, unsigned long, unsigned long, unsigned long);
+ void (*outbound_p_show)(FILE*);
+ void (*inbound_p_show) (FILE*);
+ int (*install_irq_mgr)(int, int, int, ...);
+ int irq_mgr_flags;
+} VMEOpsRec, *VMEOps;
+
+#ifdef _VME_DRIVER_UNIVERSE
+static VMEOpsRec uniOpsRec = {
+ xlate_adrs: vmeUniverseXlateAddr,
+ install_isr: vmeUniverseInstallISR,
+ remove_isr: vmeUniverseRemoveISR,
+ get_isr: vmeUniverseISRGet,
+ enable_int_lvl: vmeUniverseIntEnable,
+ disable_int_lvl: vmeUniverseIntDisable,
+ outbound_p_cfg: vmeUniverseMasterPortCfg,
+ inbound_p_cfg: vmeUniverseSlavePortCfg,
+ outbound_p_show: vmeUniverseMasterPortsShow,
+ inbound_p_show: vmeUniverseSlavePortsShow,
+ install_irq_mgr: vmeUniverseInstallIrqMgrAlt,
+ irq_mgr_flags: VMEUNIVERSE_IRQ_MGR_FLAG_SHARED |
+ VMEUNIVERSE_IRQ_MGR_FLAG_PW_WORKAROUND,
+};
+#endif
+
+#ifdef _VME_DRIVER_TSI148
+static VMEOpsRec tsiOpsRec = {
+ xlate_adrs: vmeTsi148XlateAddr,
+ install_isr: vmeTsi148InstallISR,
+ remove_isr: vmeTsi148RemoveISR,
+ get_isr: vmeTsi148ISRGet,
+ enable_int_lvl: vmeTsi148IntEnable,
+ disable_int_lvl: vmeTsi148IntDisable,
+ outbound_p_cfg: vmeTsi148OutboundPortCfg,
+ inbound_p_cfg: vmeTsi148InboundPortCfg,
+ outbound_p_show: vmeTsi148OutboundPortsShow,
+ inbound_p_show: vmeTsi148InboundPortsShow,
+ install_irq_mgr: vmeTsi148InstallIrqMgrAlt,
+ irq_mgr_flags: VMETSI148_IRQ_MGR_FLAG_SHARED,
+};
+#endif
+
+static VMEOps theOps = 0;
int
BSP_vme2local_adrs(unsigned long am, unsigned long vmeaddr, unsigned long *plocaladdr)
{
-int rval=vmeUniverseXlateAddr(1,0,am,vmeaddr,plocaladdr);
+int rval=theOps->xlate_adrs(1,0,am,vmeaddr,plocaladdr);
*plocaladdr+=PCI_MEM_BASE;
return rval;
}
@@ -69,39 +138,38 @@ int rval=vmeUniverseXlateAddr(1,0,am,vmeaddr,plocaladdr);
int
BSP_local2vme_adrs(unsigned long am, unsigned long localaddr, unsigned long *pvmeaddr)
{
- return vmeUniverseXlateAddr(0, 0, am,localaddr+PCI_DRAM_OFFSET,pvmeaddr);
+ return theOps->xlate_adrs(0, 0, am,localaddr+PCI_DRAM_OFFSET,pvmeaddr);
}
-
int
BSP_installVME_isr(unsigned long vector, BSP_VME_ISR_t handler, void *arg)
{
- return vmeUniverseInstallISR(vector, handler, arg);
+ return theOps->install_isr(vector, handler, arg);
}
int
BSP_removeVME_isr(unsigned long vector, BSP_VME_ISR_t handler, void *arg)
{
- return vmeUniverseRemoveISR(vector, handler, arg);
+ return theOps->remove_isr(vector, handler, arg);
}
/* retrieve the currently installed ISR for a given vector */
BSP_VME_ISR_t
BSP_getVME_isr(unsigned long vector, void **parg)
{
- return vmeUniverseISRGet(vector, parg);
+ return theOps->get_isr(vector, parg);
}
int
BSP_enableVME_int_lvl(unsigned int level)
{
- return vmeUniverseIntEnable(level);
+ return theOps->enable_int_lvl(level);
}
int
BSP_disableVME_int_lvl(unsigned int level)
{
- return vmeUniverseIntDisable(level);
+ return theOps->disable_int_lvl(level);
}
int
@@ -112,7 +180,7 @@ BSP_VMEOutboundPortCfg(
unsigned long pci_address,
unsigned long size)
{
- return vmeUniverseMasterPortCfg(port, address_space, vme_address, pci_address, size);
+ return theOps->outbound_p_cfg(port, address_space, vme_address, pci_address, size);
}
int
@@ -123,47 +191,92 @@ BSP_VMEInboundPortCfg(
unsigned long pci_address,
unsigned long size)
{
- return vmeUniverseSlavePortCfg(port, address_space, vme_address, pci_address, size);
+ return theOps->inbound_p_cfg(port, address_space, vme_address, pci_address, size);
}
void
BSP_VMEOutboundPortsShow(FILE *f)
{
- vmeUniverseMasterPortsShow(f);
+ theOps->outbound_p_show(f);
}
void
BSP_VMEInboundPortsShow(FILE *f)
{
- vmeUniverseSlavePortsShow(f);
+ theOps->inbound_p_show(f);
}
+#if defined(_VME_DRIVER_TSI148) && !defined(VME_CLEAR_BRIDGE_ERRORS)
+static unsigned short
+tsi_clear_errors(int quiet)
+{
+unsigned long v;
+unsigned short rval;
+ v = vmeTsi148ClearVMEBusErrors(0);
+
+ /* return bits 8..23 of VEAT; set bit 15 to make sure rval is nonzero on error */
+ rval = v ? ((v>>8) & 0xffff) | (1<<15) : 0;
+ return rval;
+}
+
+#define VME_CLEAR_BRIDGE_ERRORS tsi_clear_errors
+#endif
int BSP_VMEInit()
{
- if ( vmeUniverseInit() ) {
- /* maybe no VME at all - or no universe ... */
- return -1;
+#if defined(_VME_DRIVER_UNIVERSE)
+ if ( 0 == vmeUniverseInit() ) {
+ theOps = &uniOpsRec;
+ vmeUniverseReset();
}
- vmeUniverseReset();
+#endif
+#if defined(_VME_DRIVER_UNIVERSE) && defined(_VME_DRIVER_TSI148)
+ else
+#endif
+#if defined(_VME_DRIVER_TSI148)
+ if ( 0 == vmeUniverseInit() ) {
+ theOps = &tsiOpsRec;
+ vmeUniverseReset();
+#ifdef VME_CLEAR_BRIDGE_ERRORS
+ {
+ extern unsigned short (*_BSP_clear_vmebridge_errors)();
+
+ _BSP_clear_vmebridge_errors = VME_CLEAR_BRIDGE_ERRORS;
+
+ }
+#endif
+ }
+#endif
+ else
+ /* maybe no VME at all - or no universe/tsi148 ... */
+ return -1;
+
return 0;
}
int BSP_VMEIrqMgrInstall()
{
-#ifndef BSP_VME_UNIVERSE_INSTALL_IRQ_MGR
+int err;
+#ifndef BSP_VME_INSTALL_IRQ_MGR
/* No map; use first line only and obtain PIC wire from PCI config */
- vmeUniverseInstallIrqMgrAlt(
- VMEUNIVERSE_IRQ_MGR_FLAG_SHARED, /* use shared IRQs */
- 0, -1, /* Universe pin0 -> PIC line from config space */
+ err = theOps->install_irq_mgr(
+ theOps->irq_mgr_flags, /* use shared IRQs */
+ 0, -1, /* Universe/Tsi148 pin0 -> PIC line from config space */
-1 /* terminate list */
);
-
#else
- BSP_VME_UNIVERSE_INSTALL_IRQ_MGR;
+ BSP_VME_INSTALL_IRQ_MGR(err);
#endif
+
+ if ( err )
+ return err;
+
+/* This feature is only supported by the Universe driver (not Tsi148) */
#if defined(BSP_PCI_VME_DRIVER_DOES_EOI) && defined(BSP_PIC_DO_EOI)
- if (vmeUniverse0PciIrqLine<0)
+#ifdef _VME_DRIVER_TSI148
+#error "BSP_PCI_VME_DRIVER_DOES_EOI/BSP_PIC_DO_EOI feature can only be used with vmeUniverse"
+#endif
+ if ( vmeUniverse0PciIrqLine < 0 )
BSP_panic("Unable to get universe interrupt line info from PCI config");
_BSP_vme_bridge_irq = vmeUniverse0PciIrqLine;
#endif