summaryrefslogtreecommitdiff
path: root/c/src/lib/libbsp/powerpc/mvme5500/vme/vmeconfig.c
diff options
context:
space:
mode:
Diffstat (limited to 'c/src/lib/libbsp/powerpc/mvme5500/vme/vmeconfig.c')
-rw-r--r--c/src/lib/libbsp/powerpc/mvme5500/vme/vmeconfig.c132
1 files changed, 132 insertions, 0 deletions
diff --git a/c/src/lib/libbsp/powerpc/mvme5500/vme/vmeconfig.c b/c/src/lib/libbsp/powerpc/mvme5500/vme/vmeconfig.c
new file mode 100644
index 0000000000..1094be2a56
--- /dev/null
+++ b/c/src/lib/libbsp/powerpc/mvme5500/vme/vmeconfig.c
@@ -0,0 +1,132 @@
+/* vmeconfig.c,v 1.1.2.2 2003/03/25 16:46:01 joel Exp */
+
+/* Standard VME bridge configuration for PPC boards */
+
+/* Copyright Author: Till Straumann <strauman@slac.stanford.edu>, 3/2002 */
+
+/* Copyright 2004, Brookhaven National Lab. and S. Kate Feng <feng1@bnl.gov>
+ * Modified to support the MVME5500, 3/2004
+ */
+
+#include <bsp.h>
+#include <bsp/VME.h>
+#include <bsp/VMEConfig.h>
+#include <bsp/vmeUniverse.h>
+#include <bsp/irq.h>
+#include <libcpu/bat.h>
+
+/* Use a weak alias for the VME configuration.
+ * This permits individual applications to override
+ * this routine.
+ * They may even create an 'empty'
+ *
+ * void BSP_vme_config(void) {}
+ *
+ * which will avoid linking in the Universe driver
+ * at all :-).
+ */
+
+void BSP_vme_config(void) __attribute__ (( weak, alias("__BSP_default_vme_config") ));
+
+/* translate through host bridge and vme master window of vme bridge */
+int
+BSP_vme2local_adrs(unsigned long am, unsigned long vmeaddr, unsigned long *plocaladdr)
+{
+ int rval=vmeUniverseXlateAddr(1,0,am,vmeaddr,plocaladdr);
+ *plocaladdr+=PCI_MEM_BASE;
+ return rval;
+}
+
+/* how a CPU address is mapped to the VME bus (if at all) */
+int
+BSP_local2vme_adrs(unsigned long am, unsigned long localaddr, unsigned long *pvmeaddr)
+{
+ return vmeUniverseXlateAddr(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));
+}
+
+int
+BSP_removeVME_isr(unsigned long vector, BSP_VME_ISR_t handler, void *arg)
+{
+ return(vmeUniverseRemoveISR(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));
+}
+
+int BSP_enableVME_int_lvl(unsigned int level)
+{
+ return(vmeUniverseIntEnable(level));
+}
+
+int BSP_disableVME_int_lvl(unsigned int level)
+{
+ return(vmeUniverseIntDisable(level));
+}
+
+
+void
+__BSP_default_vme_config(void)
+{
+
+ vmeUniverseInit();
+ vmeUniverseReset();
+
+ /* setup a PCI0 area to map the VME bus */
+ setdbat(0,_VME_A32_WIN0_ON_PCI, _VME_A32_WIN0_ON_PCI, 0x10000000, IO_PAGE);
+
+ /* map VME address ranges */
+ vmeUniverseMasterPortCfg(
+ 0,
+ VME_AM_EXT_SUP_DATA,
+ _VME_A32_WIN0_ON_VME,
+ _VME_A32_WIN0_ON_PCI,
+ 0x0F000000);
+ vmeUniverseMasterPortCfg(
+ 1,
+ VME_AM_STD_SUP_DATA,
+ 0x00000000,
+ _VME_A24_ON_PCI,
+ 0x00ff0000);
+ vmeUniverseMasterPortCfg(
+ 2,
+ VME_AM_SUP_SHORT_IO,
+ 0x00000000,
+ _VME_A16_ON_PCI,
+ 0x00010000);
+
+#ifdef _VME_DRAM_OFFSET
+ /* map our memory to VME */
+ vmeUniverseSlavePortCfg(
+ 0,
+ VME_AM_EXT_SUP_DATA| VME_AM_IS_MEMORY,
+ _VME_DRAM_OFFSET,
+ PCI_DRAM_OFFSET,
+ BSP_mem_size);
+
+ /* make sure the host bridge PCI master is enabled */
+ vmeUniverseWriteReg(
+ vmeUniverseReadReg(UNIV_REGOFF_PCI_CSR) | UNIV_PCI_CSR_BM,
+ UNIV_REGOFF_PCI_CSR);
+#endif
+
+ /* stdio is not yet initialized; the driver will revert to printk */
+ vmeUniverseMasterPortsShow(0);
+ vmeUniverseSlavePortsShow(0);
+
+ /* install the VME insterrupt manager */
+ vmeUniverseInstallIrqMgrAlt(1,
+ 0, BSP_GPP_IRQ_LOWEST_OFFSET + 12,
+ 1, BSP_GPP_IRQ_LOWEST_OFFSET + 13,
+ 2, BSP_GPP_IRQ_LOWEST_OFFSET + 14,
+ 3, BSP_GPP_IRQ_LOWEST_OFFSET + 15,
+ -1);
+
+}