diff options
author | Till Straumann <strauman@slac.stanford.edu> | 2007-12-09 05:51:10 +0000 |
---|---|---|
committer | Till Straumann <strauman@slac.stanford.edu> | 2007-12-09 05:51:10 +0000 |
commit | b83b70ae60acdb9bc8218b695ccdc4678bd25233 (patch) | |
tree | 779f027ffb41d987ceaa4e34ea7399b80613c2ff /c/src/lib/libbsp/powerpc | |
parent | 2007-12-08 Till Straumann <strauman@slac.stanford.edu> (diff) | |
download | rtems-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/ChangeLog | 8 | ||||
-rw-r--r-- | c/src/lib/libbsp/powerpc/shared/vme/VMEConfig.h | 5 | ||||
-rw-r--r-- | c/src/lib/libbsp/powerpc/shared/vme/vme_universe.c | 161 |
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 |