1 #include <linux/kernel.h>
3 #include <asm/bootinfo.h>
5 #include <asm/lasat/lasat.h>
8 #define PCI_ACCESS_READ 0
9 #define PCI_ACCESS_WRITE 1
11 #define LO(reg) (reg / 4)
12 #define HI(reg) (reg / 4 + 1)
14 volatile unsigned long *const vrc_pciregs
= (void *) Vrc5074_BASE
;
16 static DEFINE_SPINLOCK(nile4_pci_lock
);
18 static int nile4_pcibios_config_access(unsigned char access_type
,
19 struct pci_bus
*bus
, unsigned int devfn
, int where
, u32
*val
)
21 unsigned char busnum
= bus
->number
;
24 if ((busnum
== 0) && (PCI_SLOT(devfn
) > 8))
25 /* The addressing scheme chosen leaves room for just
26 * 8 devices on the first busnum (besides the PCI
27 * controller itself) */
28 return PCIBIOS_DEVICE_NOT_FOUND
;
30 if ((busnum
== 0) && (devfn
== PCI_DEVFN(0, 0))) {
31 /* Access controller registers directly */
32 if (access_type
== PCI_ACCESS_WRITE
) {
33 vrc_pciregs
[(0x200 + where
) >> 2] = *val
;
35 *val
= vrc_pciregs
[(0x200 + where
) >> 2];
37 return PCIBIOS_SUCCESSFUL
;
40 /* Temporarily map PCI Window 1 to config space */
41 mask
= vrc_pciregs
[LO(NILE4_PCIINIT1
)];
42 vrc_pciregs
[LO(NILE4_PCIINIT1
)] = 0x0000001a | (busnum
? 0x200 : 0);
44 /* Clear PCI Error register. This also clears the Error Type
45 * bits in the Control register */
46 vrc_pciregs
[LO(NILE4_PCIERR
)] = 0;
47 vrc_pciregs
[HI(NILE4_PCIERR
)] = 0;
52 KSEG1ADDR(PCI_WINDOW1
) +
53 ((1 << (PCI_SLOT(devfn
) + 15)) | (PCI_FUNC(devfn
) << 8)
56 adr
= KSEG1ADDR(PCI_WINDOW1
) | (busnum
<< 16) | (devfn
<< 8) |
59 if (access_type
== PCI_ACCESS_WRITE
)
64 /* Check for master or target abort */
65 err
= (vrc_pciregs
[HI(NILE4_PCICTRL
)] >> 5) & 0x7;
67 /* Restore PCI Window 1 */
68 vrc_pciregs
[LO(NILE4_PCIINIT1
)] = mask
;
71 return PCIBIOS_DEVICE_NOT_FOUND
;
73 return PCIBIOS_SUCCESSFUL
;
76 static int nile4_pcibios_read(struct pci_bus
*bus
, unsigned int devfn
,
77 int where
, int size
, u32
*val
)
83 if ((size
== 2) && (where
& 1))
84 return PCIBIOS_BAD_REGISTER_NUMBER
;
85 else if ((size
== 4) && (where
& 3))
86 return PCIBIOS_BAD_REGISTER_NUMBER
;
88 spin_lock_irqsave(&nile4_pci_lock
, flags
);
89 err
= nile4_pcibios_config_access(PCI_ACCESS_READ
, bus
, devfn
, where
,
91 spin_unlock_irqrestore(&nile4_pci_lock
, flags
);
97 *val
= (data
>> ((where
& 3) << 3)) & 0xff;
99 *val
= (data
>> ((where
& 3) << 3)) & 0xffff;
103 return PCIBIOS_SUCCESSFUL
;
106 static int nile4_pcibios_write(struct pci_bus
*bus
, unsigned int devfn
,
107 int where
, int size
, u32 val
)
113 if ((size
== 2) && (where
& 1))
114 return PCIBIOS_BAD_REGISTER_NUMBER
;
115 else if ((size
== 4) && (where
& 3))
116 return PCIBIOS_BAD_REGISTER_NUMBER
;
118 spin_lock_irqsave(&nile4_pci_lock
, flags
);
119 err
= nile4_pcibios_config_access(PCI_ACCESS_READ
, bus
, devfn
, where
,
121 spin_unlock_irqrestore(&nile4_pci_lock
, flags
);
127 data
= (data
& ~(0xff << ((where
& 3) << 3))) |
128 (val
<< ((where
& 3) << 3));
130 data
= (data
& ~(0xffff << ((where
& 3) << 3))) |
131 (val
<< ((where
& 3) << 3));
135 if (nile4_pcibios_config_access
136 (PCI_ACCESS_WRITE
, bus
, devfn
, where
, &data
))
139 return PCIBIOS_SUCCESSFUL
;
142 struct pci_ops nile4_pci_ops
= {
143 .read
= nile4_pcibios_read
,
144 .write
= nile4_pcibios_write
,