summaryrefslogtreecommitdiff
path: root/c/src/lib/libbsp/powerpc/mvme5500/vme/vmeconfig.c
blob: 1094be2a56324b5f7ff25c82bcfa945d6cd4cf14 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
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); 
  
}