17 #include <asm/delay.h>
18 #include <asm/machdep.h>
19 #include <linux/kernel.h>
26 #define MPC52xx_PCI_GSCR_BM 0x40000000
27 #define MPC52xx_PCI_GSCR_PE 0x20000000
28 #define MPC52xx_PCI_GSCR_SE 0x10000000
29 #define MPC52xx_PCI_GSCR_XLB2PCI_MASK 0x07000000
30 #define MPC52xx_PCI_GSCR_XLB2PCI_SHIFT 24
31 #define MPC52xx_PCI_GSCR_IPG2PCI_MASK 0x00070000
32 #define MPC52xx_PCI_GSCR_IPG2PCI_SHIFT 16
33 #define MPC52xx_PCI_GSCR_BME 0x00004000
34 #define MPC52xx_PCI_GSCR_PEE 0x00002000
35 #define MPC52xx_PCI_GSCR_SEE 0x00001000
36 #define MPC52xx_PCI_GSCR_PR 0x00000001
39 #define MPC52xx_PCI_IWBTAR_TRANSLATION(proc_ad,pci_ad,size) \
40 ( ( (proc_ad) & 0xff000000 ) | \
41 ( (((size) - 1) >> 8) & 0x00ff0000 ) | \
42 ( ((pci_ad) >> 16) & 0x0000ff00 ) )
44 #define MPC52xx_PCI_IWCR_PACK(win0,win1,win2) (((win0) << 24) | \
48 #define MPC52xx_PCI_IWCR_DISABLE 0x0
49 #define MPC52xx_PCI_IWCR_ENABLE 0x1
50 #define MPC52xx_PCI_IWCR_READ 0x0
51 #define MPC52xx_PCI_IWCR_READ_LINE 0x2
52 #define MPC52xx_PCI_IWCR_READ_MULTI 0x4
53 #define MPC52xx_PCI_IWCR_MEM 0x0
54 #define MPC52xx_PCI_IWCR_IO 0x8
56 #define MPC52xx_PCI_TCR_P 0x01000000
57 #define MPC52xx_PCI_TCR_LD 0x00010000
58 #define MPC52xx_PCI_TCR_WCT8 0x00000008
60 #define MPC52xx_PCI_TBATR_DISABLE 0x0
61 #define MPC52xx_PCI_TBATR_ENABLE 0x1
97 { .type =
"pci", .compatible =
"fsl,mpc5200-pci", },
98 { .type =
"pci", .compatible =
"mpc5200-pci", },
113 if (
ppc_md.pci_exclude_device)
114 if (
ppc_md.pci_exclude_device(hose, bus->
number, devfn))
124 #if defined(CONFIG_PPC_MPC5200_BUGFIX)
147 value =
in_le32(hose->cfg_data);
150 value >>= ((offset & 0x3) << 3);
151 value &= 0xffffffff >> (32 - (len << 3));
164 mpc52xx_pci_write_config(
struct pci_bus *bus,
unsigned int devfn,
165 int offset,
int len,
u32 val)
170 if (
ppc_md.pci_exclude_device)
171 if (
ppc_md.pci_exclude_device(hose, bus->
number, devfn))
181 #if defined(CONFIG_PPC_MPC5200_BUGFIX)
192 ((offset>>1) & 1), val);
207 value =
in_le32(hose->cfg_data);
209 offset = (offset & 0x3) << 3;
210 mask = (0xffffffff >> (32 - (len << 3)));
214 val = value | ((val <<
offset) & mask);
227 static struct pci_ops mpc52xx_pci_ops = {
228 .read = mpc52xx_pci_read_config,
229 .write = mpc52xx_pci_write_config
243 int iwcr0 = 0, iwcr1 = 0, iwcr2 = 0;
245 pr_debug(
"mpc52xx_pci_setup(hose=%p, pci_regs=%p)\n", hose, pci_regs);
249 hose->cfg_addr = &pci_regs->car;
250 hose->cfg_data = hose->io_base_virt;
261 "{.start=%llx, .end=%llx, .flags=%llx}\n",
262 (
unsigned long long)res->
start,
263 (
unsigned long long)res->
end,
264 (
unsigned long long)res->
flags);
267 resource_size(res)));
277 pr_debug(
"mem_resource[1] = {.start=%x, .end=%x, .flags=%lx}\n",
281 resource_size(res)));
290 res = &hose->io_resource;
295 pr_debug(
".io_resource={.start=%llx,.end=%llx,.flags=%llx} "
296 ".io_base_phys=0x%p\n",
297 (
unsigned long long)res->
start,
298 (
unsigned long long)res->
end,
299 (
unsigned long long)res->
flags, (
void*)hose->io_base_phys);
303 resource_size(res)));
310 pci_phys &= 0xfffc0000;
320 tmp =
in_be32(&pci_regs->gscr);
335 mpc52xx_pci_fixup_resources(
struct pci_dev *
dev)
339 pr_debug(
"mpc52xx_pci_fixup_resources() %.4x:%.4x\n",
369 const int *bus_range;
374 pci_add_flags(PCI_REASSIGN_ALL_BUS);
382 if (bus_range ==
NULL || len < 2 *
sizeof(
int)) {
390 ppc_md.pcibios_fixup_resources = mpc52xx_pci_fixup_resources;
401 hose->
last_busno = bus_range ? bus_range[1] : 0xff;
403 hose->
ops = &mpc52xx_pci_ops;
413 mpc52xx_pci_setup(hose, pci_regs, rsrc.
start);