diff options
Diffstat (limited to 'arch/mips/pci')
-rw-r--r-- | arch/mips/pci/ops-bridge.c | 20 | ||||
-rw-r--r-- | arch/mips/pci/pci-ip27.c | 8 | ||||
-rw-r--r-- | arch/mips/pci/pci-sb1250.c | 8 | ||||
-rw-r--r-- | arch/mips/pci/pci-vr41xx.c | 14 |
4 files changed, 44 insertions, 6 deletions
diff --git a/arch/mips/pci/ops-bridge.c b/arch/mips/pci/ops-bridge.c index 1fa09929cd7a..b46b3e211775 100644 --- a/arch/mips/pci/ops-bridge.c +++ b/arch/mips/pci/ops-bridge.c | |||
@@ -14,6 +14,22 @@ | |||
14 | #include <asm/sn/sn0/hub.h> | 14 | #include <asm/sn/sn0/hub.h> |
15 | 15 | ||
16 | /* | 16 | /* |
17 | * Most of the IOC3 PCI config register aren't present | ||
18 | * we emulate what is needed for a normal PCI enumeration | ||
19 | */ | ||
20 | static u32 emulate_ioc3_cfg(int where, int size) | ||
21 | { | ||
22 | if (size == 1 && where == 0x3d) | ||
23 | return 0x01; | ||
24 | else if (size == 2 && where == 0x3c) | ||
25 | return 0x0100; | ||
26 | else if (size == 4 && where == 0x3c) | ||
27 | return 0x00000100; | ||
28 | |||
29 | return 0; | ||
30 | } | ||
31 | |||
32 | /* | ||
17 | * The Bridge ASIC supports both type 0 and type 1 access. Type 1 is | 33 | * The Bridge ASIC supports both type 0 and type 1 access. Type 1 is |
18 | * not really documented, so right now I can't write code which uses it. | 34 | * not really documented, so right now I can't write code which uses it. |
19 | * Therefore we use type 0 accesses for now even though they won't work | 35 | * Therefore we use type 0 accesses for now even though they won't work |
@@ -64,7 +80,7 @@ oh_my_gawd: | |||
64 | * generic PCI code a chance to look at the wrong register. | 80 | * generic PCI code a chance to look at the wrong register. |
65 | */ | 81 | */ |
66 | if ((where >= 0x14 && where < 0x40) || (where >= 0x48)) { | 82 | if ((where >= 0x14 && where < 0x40) || (where >= 0x48)) { |
67 | *value = 0; | 83 | *value = emulate_ioc3_cfg(where, size); |
68 | return PCIBIOS_SUCCESSFUL; | 84 | return PCIBIOS_SUCCESSFUL; |
69 | } | 85 | } |
70 | 86 | ||
@@ -127,7 +143,7 @@ oh_my_gawd: | |||
127 | * generic PCI code a chance to look at the wrong register. | 143 | * generic PCI code a chance to look at the wrong register. |
128 | */ | 144 | */ |
129 | if ((where >= 0x14 && where < 0x40) || (where >= 0x48)) { | 145 | if ((where >= 0x14 && where < 0x40) || (where >= 0x48)) { |
130 | *value = 0; | 146 | *value = emulate_ioc3_cfg(where, size); |
131 | return PCIBIOS_SUCCESSFUL; | 147 | return PCIBIOS_SUCCESSFUL; |
132 | } | 148 | } |
133 | 149 | ||
diff --git a/arch/mips/pci/pci-ip27.c b/arch/mips/pci/pci-ip27.c index bb64828a92fe..a18516925cdd 100644 --- a/arch/mips/pci/pci-ip27.c +++ b/arch/mips/pci/pci-ip27.c | |||
@@ -47,6 +47,9 @@ int __cpuinit bridge_probe(nasid_t nasid, int widget_id, int masterwid) | |||
47 | static int num_bridges = 0; | 47 | static int num_bridges = 0; |
48 | bridge_t *bridge; | 48 | bridge_t *bridge; |
49 | int slot; | 49 | int slot; |
50 | extern int pci_probe_only; | ||
51 | |||
52 | pci_probe_only = 1; | ||
50 | 53 | ||
51 | printk("a bridge\n"); | 54 | printk("a bridge\n"); |
52 | 55 | ||
@@ -100,6 +103,11 @@ int __cpuinit bridge_probe(nasid_t nasid, int widget_id, int masterwid) | |||
100 | */ | 103 | */ |
101 | bridge->b_wid_control |= BRIDGE_CTRL_IO_SWAP | | 104 | bridge->b_wid_control |= BRIDGE_CTRL_IO_SWAP | |
102 | BRIDGE_CTRL_MEM_SWAP; | 105 | BRIDGE_CTRL_MEM_SWAP; |
106 | #ifdef CONFIG_PAGE_SIZE_4KB | ||
107 | bridge->b_wid_control &= ~BRIDGE_CTRL_PAGE_SIZE; | ||
108 | #else /* 16kB or larger */ | ||
109 | bridge->b_wid_control |= BRIDGE_CTRL_PAGE_SIZE; | ||
110 | #endif | ||
103 | 111 | ||
104 | /* | 112 | /* |
105 | * Hmm... IRIX sets additional bits in the address which | 113 | * Hmm... IRIX sets additional bits in the address which |
diff --git a/arch/mips/pci/pci-sb1250.c b/arch/mips/pci/pci-sb1250.c index 42e4d2c800fa..2a09ad91ec8c 100644 --- a/arch/mips/pci/pci-sb1250.c +++ b/arch/mips/pci/pci-sb1250.c | |||
@@ -207,6 +207,7 @@ struct pci_controller sb1250_controller = { | |||
207 | 207 | ||
208 | static int __init sb1250_pcibios_init(void) | 208 | static int __init sb1250_pcibios_init(void) |
209 | { | 209 | { |
210 | void __iomem *io_map_base; | ||
210 | uint32_t cmdreg; | 211 | uint32_t cmdreg; |
211 | uint64_t reg; | 212 | uint64_t reg; |
212 | extern int pci_probe_only; | 213 | extern int pci_probe_only; |
@@ -253,12 +254,13 @@ static int __init sb1250_pcibios_init(void) | |||
253 | * works correctly with most of Linux's drivers. | 254 | * works correctly with most of Linux's drivers. |
254 | * XXX ehs: Should this happen in PCI Device mode? | 255 | * XXX ehs: Should this happen in PCI Device mode? |
255 | */ | 256 | */ |
256 | |||
257 | set_io_port_base((unsigned long) | ||
258 | ioremap(A_PHYS_LDTPCI_IO_MATCH_BYTES, 65536)); | ||
259 | isa_slot_offset = (unsigned long) | 257 | isa_slot_offset = (unsigned long) |
260 | ioremap(A_PHYS_LDTPCI_IO_MATCH_BYTES_32, 1024 * 1024); | 258 | ioremap(A_PHYS_LDTPCI_IO_MATCH_BYTES_32, 1024 * 1024); |
261 | 259 | ||
260 | io_map_base = ioremap(A_PHYS_LDTPCI_IO_MATCH_BYTES, 1024 * 1024); | ||
261 | sb1250_controller.io_map_base = io_map_base; | ||
262 | set_io_port_base((unsigned long)io_map_base); | ||
263 | |||
262 | #ifdef CONFIG_SIBYTE_HAS_LDT | 264 | #ifdef CONFIG_SIBYTE_HAS_LDT |
263 | /* | 265 | /* |
264 | * Also check the LDT bridge's enable, just in case we didn't | 266 | * Also check the LDT bridge's enable, just in case we didn't |
diff --git a/arch/mips/pci/pci-vr41xx.c b/arch/mips/pci/pci-vr41xx.c index 33c4f683d067..d1e049b55f34 100644 --- a/arch/mips/pci/pci-vr41xx.c +++ b/arch/mips/pci/pci-vr41xx.c | |||
@@ -3,7 +3,7 @@ | |||
3 | * | 3 | * |
4 | * Copyright (C) 2001-2003 MontaVista Software Inc. | 4 | * Copyright (C) 2001-2003 MontaVista Software Inc. |
5 | * Author: Yoichi Yuasa <yyuasa@mvista.com or source@mvista.com> | 5 | * Author: Yoichi Yuasa <yyuasa@mvista.com or source@mvista.com> |
6 | * Copyright (C) 2004-2005 Yoichi Yuasa <yoichi_yuasa@tripeaks.co.jp> | 6 | * Copyright (C) 2004-2008 Yoichi Yuasa <yoichi_yuasa@tripeaks.co.jp> |
7 | * Copyright (C) 2004 by Ralf Baechle (ralf@linux-mips.org) | 7 | * Copyright (C) 2004 by Ralf Baechle (ralf@linux-mips.org) |
8 | * | 8 | * |
9 | * This program is free software; you can redistribute it and/or modify | 9 | * This program is free software; you can redistribute it and/or modify |
@@ -300,6 +300,18 @@ static int __init vr41xx_pciu_init(void) | |||
300 | ioport_resource.end = IO_PORT_RESOURCE_END; | 300 | ioport_resource.end = IO_PORT_RESOURCE_END; |
301 | } | 301 | } |
302 | 302 | ||
303 | if (setup->master_io) { | ||
304 | void __iomem *io_map_base; | ||
305 | struct resource *res = vr41xx_pci_controller.io_resource; | ||
306 | master = setup->master_io; | ||
307 | io_map_base = ioremap(master->bus_base_address, | ||
308 | res->end - res->start + 1); | ||
309 | if (!io_map_base) | ||
310 | return -EBUSY; | ||
311 | |||
312 | vr41xx_pci_controller.io_map_base = (unsigned long)io_map_base; | ||
313 | } | ||
314 | |||
303 | register_pci_controller(&vr41xx_pci_controller); | 315 | register_pci_controller(&vr41xx_pci_controller); |
304 | 316 | ||
305 | return 0; | 317 | return 0; |