diff options
-rw-r--r-- | include/asm-powerpc/pci-bridge.h | 138 | ||||
-rw-r--r-- | include/asm-ppc/pci-bridge.h | 17 |
2 files changed, 120 insertions, 35 deletions
diff --git a/include/asm-powerpc/pci-bridge.h b/include/asm-powerpc/pci-bridge.h index 5261527ed7b1..b0325931c324 100644 --- a/include/asm-powerpc/pci-bridge.h +++ b/include/asm-powerpc/pci-bridge.h | |||
@@ -3,7 +3,103 @@ | |||
3 | #ifdef __KERNEL__ | 3 | #ifdef __KERNEL__ |
4 | 4 | ||
5 | #ifndef CONFIG_PPC64 | 5 | #ifndef CONFIG_PPC64 |
6 | #include <asm-ppc/pci-bridge.h> | 6 | #include <linux/ioport.h> |
7 | #include <linux/pci.h> | ||
8 | |||
9 | struct device_node; | ||
10 | struct pci_controller; | ||
11 | |||
12 | /* | ||
13 | * pci_io_base returns the memory address at which you can access | ||
14 | * the I/O space for PCI bus number `bus' (or NULL on error). | ||
15 | */ | ||
16 | extern void __iomem *pci_bus_io_base(unsigned int bus); | ||
17 | extern unsigned long pci_bus_io_base_phys(unsigned int bus); | ||
18 | extern unsigned long pci_bus_mem_base_phys(unsigned int bus); | ||
19 | |||
20 | /* Allocate a new PCI host bridge structure */ | ||
21 | extern struct pci_controller* pcibios_alloc_controller(void); | ||
22 | |||
23 | /* Helper function for setting up resources */ | ||
24 | extern void pci_init_resource(struct resource *res, resource_size_t start, | ||
25 | resource_size_t end, int flags, char *name); | ||
26 | |||
27 | /* Get the PCI host controller for a bus */ | ||
28 | extern struct pci_controller* pci_bus_to_hose(int bus); | ||
29 | |||
30 | /* | ||
31 | * Structure of a PCI controller (host bridge) | ||
32 | */ | ||
33 | struct pci_controller { | ||
34 | struct pci_bus *bus; | ||
35 | void *arch_data; | ||
36 | int index; /* PCI domain number */ | ||
37 | struct pci_controller *next; | ||
38 | struct device *parent; | ||
39 | |||
40 | int first_busno; | ||
41 | int last_busno; | ||
42 | int self_busno; | ||
43 | |||
44 | void __iomem *io_base_virt; | ||
45 | resource_size_t io_base_phys; | ||
46 | |||
47 | /* Some machines (PReP) have a non 1:1 mapping of | ||
48 | * the PCI memory space in the CPU bus space | ||
49 | */ | ||
50 | resource_size_t pci_mem_offset; | ||
51 | |||
52 | struct pci_ops *ops; | ||
53 | volatile unsigned int __iomem *cfg_addr; | ||
54 | volatile void __iomem *cfg_data; | ||
55 | |||
56 | /* | ||
57 | * Used for variants of PCI indirect handling and possible quirks: | ||
58 | * SET_CFG_TYPE - used on 4xx or any PHB that does explicit type0/1 | ||
59 | * EXT_REG - provides access to PCI-e extended registers | ||
60 | * SURPRESS_PRIMARY_BUS - we surpress the setting of PCI_PRIMARY_BUS | ||
61 | * on Freescale PCI-e controllers since they used the PCI_PRIMARY_BUS | ||
62 | * to determine which bus number to match on when generating type0 | ||
63 | * config cycles | ||
64 | */ | ||
65 | #define PPC_INDIRECT_TYPE_SET_CFG_TYPE (0x00000001) | ||
66 | #define PPC_INDIRECT_TYPE_EXT_REG (0x00000002) | ||
67 | #define PPC_INDIRECT_TYPE_SURPRESS_PRIMARY_BUS (0x00000004) | ||
68 | u32 indirect_type; | ||
69 | |||
70 | /* Currently, we limit ourselves to 1 IO range and 3 mem | ||
71 | * ranges since the common pci_bus structure can't handle more | ||
72 | */ | ||
73 | struct resource io_resource; | ||
74 | struct resource mem_resources[3]; | ||
75 | }; | ||
76 | |||
77 | static inline struct pci_controller *pci_bus_to_host(struct pci_bus *bus) | ||
78 | { | ||
79 | return bus->sysdata; | ||
80 | } | ||
81 | |||
82 | /* These are used for config access before all the PCI probing | ||
83 | has been done. */ | ||
84 | int early_read_config_byte(struct pci_controller *hose, int bus, int dev_fn, | ||
85 | int where, u8 *val); | ||
86 | int early_read_config_word(struct pci_controller *hose, int bus, int dev_fn, | ||
87 | int where, u16 *val); | ||
88 | int early_read_config_dword(struct pci_controller *hose, int bus, int dev_fn, | ||
89 | int where, u32 *val); | ||
90 | int early_write_config_byte(struct pci_controller *hose, int bus, int dev_fn, | ||
91 | int where, u8 val); | ||
92 | int early_write_config_word(struct pci_controller *hose, int bus, int dev_fn, | ||
93 | int where, u16 val); | ||
94 | int early_write_config_dword(struct pci_controller *hose, int bus, int dev_fn, | ||
95 | int where, u32 val); | ||
96 | |||
97 | extern void setup_indirect_pci_nomap(struct pci_controller* hose, | ||
98 | void __iomem *cfg_addr, void __iomem *cfg_data); | ||
99 | extern void setup_indirect_pci(struct pci_controller* hose, | ||
100 | u32 cfg_addr, u32 cfg_data); | ||
101 | extern void setup_grackle(struct pci_controller *hose); | ||
102 | |||
7 | #else | 103 | #else |
8 | 104 | ||
9 | #include <linux/pci.h> | 105 | #include <linux/pci.h> |
@@ -49,8 +145,8 @@ struct pci_controller { | |||
49 | */ | 145 | */ |
50 | struct resource io_resource; | 146 | struct resource io_resource; |
51 | struct resource mem_resources[3]; | 147 | struct resource mem_resources[3]; |
52 | int global_number; | 148 | int global_number; |
53 | int local_number; | 149 | int local_number; |
54 | unsigned long buid; | 150 | unsigned long buid; |
55 | unsigned long dma_window_base_cur; | 151 | unsigned long dma_window_base_cur; |
56 | unsigned long dma_window_size; | 152 | unsigned long dma_window_size; |
@@ -132,9 +228,6 @@ static inline struct device_node *pci_bus_to_OF_node(struct pci_bus *bus) | |||
132 | /** Find the bus corresponding to the indicated device node */ | 228 | /** Find the bus corresponding to the indicated device node */ |
133 | struct pci_bus * pcibios_find_pci_bus(struct device_node *dn); | 229 | struct pci_bus * pcibios_find_pci_bus(struct device_node *dn); |
134 | 230 | ||
135 | extern void pci_process_bridge_OF_ranges(struct pci_controller *hose, | ||
136 | struct device_node *dev, int primary); | ||
137 | |||
138 | /** Remove all of the PCI devices under this bus */ | 231 | /** Remove all of the PCI devices under this bus */ |
139 | void pcibios_remove_pci_devices(struct pci_bus *bus); | 232 | void pcibios_remove_pci_devices(struct pci_bus *bus); |
140 | 233 | ||
@@ -152,22 +245,10 @@ static inline struct pci_controller *pci_bus_to_host(struct pci_bus *bus) | |||
152 | return PCI_DN(busdn)->phb; | 245 | return PCI_DN(busdn)->phb; |
153 | } | 246 | } |
154 | 247 | ||
155 | extern struct pci_controller* | ||
156 | pci_find_hose_for_OF_device(struct device_node* node); | ||
157 | |||
158 | extern struct pci_controller * | 248 | extern struct pci_controller * |
159 | pcibios_alloc_controller(struct device_node *dev); | 249 | pcibios_alloc_controller(struct device_node *dev); |
160 | extern void pcibios_free_controller(struct pci_controller *phb); | 250 | extern void pcibios_free_controller(struct pci_controller *phb); |
161 | 251 | ||
162 | #ifdef CONFIG_PCI | ||
163 | extern unsigned long pci_address_to_pio(phys_addr_t address); | ||
164 | #else | ||
165 | static inline unsigned long pci_address_to_pio(phys_addr_t address) | ||
166 | { | ||
167 | return (unsigned long)-1; | ||
168 | } | ||
169 | #endif | ||
170 | |||
171 | extern void isa_bridge_find_early(struct pci_controller *hose); | 252 | extern void isa_bridge_find_early(struct pci_controller *hose); |
172 | 253 | ||
173 | extern int pcibios_unmap_io_space(struct pci_bus *bus); | 254 | extern int pcibios_unmap_io_space(struct pci_bus *bus); |
@@ -185,5 +266,26 @@ extern int pcibios_map_io_space(struct pci_bus *bus); | |||
185 | #endif | 266 | #endif |
186 | 267 | ||
187 | #endif /* CONFIG_PPC64 */ | 268 | #endif /* CONFIG_PPC64 */ |
269 | |||
270 | /* Get the PCI host controller for an OF device */ | ||
271 | extern struct pci_controller* | ||
272 | pci_find_hose_for_OF_device(struct device_node* node); | ||
273 | |||
274 | /* Fill up host controller resources from the OF node */ | ||
275 | extern void | ||
276 | pci_process_bridge_OF_ranges(struct pci_controller *hose, | ||
277 | struct device_node *dev, int primary); | ||
278 | |||
279 | #ifdef CONFIG_PCI | ||
280 | extern unsigned long pci_address_to_pio(phys_addr_t address); | ||
281 | #else | ||
282 | static inline unsigned long pci_address_to_pio(phys_addr_t address) | ||
283 | { | ||
284 | return (unsigned long)-1; | ||
285 | } | ||
286 | #endif | ||
287 | |||
288 | |||
289 | |||
188 | #endif /* __KERNEL__ */ | 290 | #endif /* __KERNEL__ */ |
189 | #endif | 291 | #endif |
diff --git a/include/asm-ppc/pci-bridge.h b/include/asm-ppc/pci-bridge.h index c09fbf02ef24..4d35b844bc58 100644 --- a/include/asm-ppc/pci-bridge.h +++ b/include/asm-ppc/pci-bridge.h | |||
@@ -47,8 +47,6 @@ struct pci_controller { | |||
47 | 47 | ||
48 | int first_busno; | 48 | int first_busno; |
49 | int last_busno; | 49 | int last_busno; |
50 | int self_busno; | ||
51 | /* bus_offset is only used by ARCH=ppc */ | ||
52 | int bus_offset; | 50 | int bus_offset; |
53 | 51 | ||
54 | void __iomem *io_base_virt; | 52 | void __iomem *io_base_virt; |
@@ -65,24 +63,9 @@ struct pci_controller { | |||
65 | /* | 63 | /* |
66 | * If set, indirect method will set the cfg_type bit as | 64 | * If set, indirect method will set the cfg_type bit as |
67 | * needed to generate type 1 configuration transactions. | 65 | * needed to generate type 1 configuration transactions. |
68 | * use only on ARCH=ppc | ||
69 | */ | 66 | */ |
70 | int set_cfg_type; | 67 | int set_cfg_type; |
71 | 68 | ||
72 | /* | ||
73 | * Used for variants of PCI indirect handling and possible quirks: | ||
74 | * SET_CFG_TYPE - used on 4xx or any PHB that does explicit type0/1 | ||
75 | * EXT_REG - provides access to PCI-e extended registers | ||
76 | * SURPRESS_PRIMARY_BUS - we surpress the setting of PCI_PRIMARY_BUS | ||
77 | * on Freescale PCI-e controllers since they used the PCI_PRIMARY_BUS | ||
78 | * to determine which bus number to match on when generating type0 | ||
79 | * config cycles | ||
80 | */ | ||
81 | #define PPC_INDIRECT_TYPE_SET_CFG_TYPE (0x00000001) | ||
82 | #define PPC_INDIRECT_TYPE_EXT_REG (0x00000002) | ||
83 | #define PPC_INDIRECT_TYPE_SURPRESS_PRIMARY_BUS (0x00000004) | ||
84 | u32 indirect_type; | ||
85 | |||
86 | /* Currently, we limit ourselves to 1 IO range and 3 mem | 69 | /* Currently, we limit ourselves to 1 IO range and 3 mem |
87 | * ranges since the common pci_bus structure can't handle more | 70 | * ranges since the common pci_bus structure can't handle more |
88 | */ | 71 | */ |