Commit | Line | Data |
---|---|---|
1da177e4 LT |
1 | #ifdef __KERNEL__ |
2 | #ifndef _ASM_PCI_BRIDGE_H | |
3 | #define _ASM_PCI_BRIDGE_H | |
4 | ||
5 | #include <linux/pci.h> | |
6 | ||
252e75a5 SR |
7 | #include <asm/iSeries/HvCallPci.h> |
8 | ||
1da177e4 LT |
9 | /* |
10 | * This program is free software; you can redistribute it and/or | |
11 | * modify it under the terms of the GNU General Public License | |
12 | * as published by the Free Software Foundation; either version | |
13 | * 2 of the License, or (at your option) any later version. | |
14 | */ | |
15 | ||
16 | /* | |
17 | * Structure of a PCI controller (host bridge) | |
18 | */ | |
19 | struct pci_controller { | |
20 | struct pci_bus *bus; | |
21 | char is_dynamic; | |
22 | void *arch_data; | |
23 | struct list_head list_node; | |
24 | ||
25 | int first_busno; | |
26 | int last_busno; | |
27 | ||
28 | void __iomem *io_base_virt; | |
29 | unsigned long io_base_phys; | |
30 | ||
31 | /* Some machines have a non 1:1 mapping of | |
32 | * the PCI memory space in the CPU bus space | |
33 | */ | |
34 | unsigned long pci_mem_offset; | |
35 | unsigned long pci_io_size; | |
36 | ||
37 | struct pci_ops *ops; | |
38 | volatile unsigned int __iomem *cfg_addr; | |
39 | volatile unsigned char __iomem *cfg_data; | |
40 | ||
41 | /* Currently, we limit ourselves to 1 IO range and 3 mem | |
42 | * ranges since the common pci_bus structure can't handle more | |
43 | */ | |
44 | struct resource io_resource; | |
45 | struct resource mem_resources[3]; | |
46 | int global_number; | |
47 | int local_number; | |
48 | unsigned long buid; | |
49 | unsigned long dma_window_base_cur; | |
50 | unsigned long dma_window_size; | |
51 | }; | |
52 | ||
1635317f PM |
53 | /* |
54 | * PCI stuff, for nodes representing PCI devices, pointed to | |
55 | * by device_node->data. | |
56 | */ | |
57 | struct pci_controller; | |
58 | struct iommu_table; | |
59 | ||
60 | struct pci_dn { | |
61 | int busno; /* for pci devices */ | |
62 | int bussubno; /* for pci devices */ | |
63 | int devfn; /* for pci devices */ | |
64 | int eeh_mode; /* See eeh.h for possible EEH_MODEs */ | |
65 | int eeh_config_addr; | |
66 | int eeh_capable; /* from firmware */ | |
67 | int eeh_check_count; /* # times driver ignored error */ | |
68 | int eeh_freeze_count; /* # times this device froze up. */ | |
69 | int eeh_is_bridge; /* device is pci-to-pci bridge */ | |
70 | ||
71 | int pci_ext_config_space; /* for pci devices */ | |
72 | struct pci_controller *phb; /* for pci devices */ | |
73 | struct iommu_table *iommu_table; /* for phb's or bridges */ | |
74 | struct pci_dev *pcidev; /* back-pointer to the pci device */ | |
75 | struct device_node *node; /* back-pointer to the device_node */ | |
252e75a5 SR |
76 | #ifdef CONFIG_PPC_ISERIES |
77 | union HvDsaMap DsaAddr; /* Direct Select Address */ | |
78 | /* busNumber, subBusNumber, */ | |
79 | /* deviceId, barNumber */ | |
80 | int Irq; /* Assigned IRQ */ | |
81 | int Flags; /* Possible flags(disable/bist)*/ | |
82 | u8 LogicalSlot; /* Hv Slot Index for Tces */ | |
83 | #endif | |
1635317f PM |
84 | u32 config_space[16]; /* saved PCI config space */ |
85 | }; | |
86 | ||
87 | /* Get the pointer to a device_node's pci_dn */ | |
88 | #define PCI_DN(dn) ((struct pci_dn *) (dn)->data) | |
89 | ||
1da177e4 LT |
90 | struct device_node *fetch_dev_dn(struct pci_dev *dev); |
91 | ||
1635317f PM |
92 | /* Get a device_node from a pci_dev. This code must be fast except |
93 | * in the case where the sysdata is incorrect and needs to be fixed | |
94 | * up (this will only happen once). | |
95 | * In this case the sysdata will have been inherited from a PCI host | |
96 | * bridge or a PCI-PCI bridge further up the tree, so it will point | |
97 | * to a valid struct pci_dn, just not the one we want. | |
1da177e4 LT |
98 | */ |
99 | static inline struct device_node *pci_device_to_OF_node(struct pci_dev *dev) | |
100 | { | |
101 | struct device_node *dn = dev->sysdata; | |
1635317f | 102 | struct pci_dn *pdn = dn->data; |
1da177e4 | 103 | |
1635317f | 104 | if (pdn && pdn->devfn == dev->devfn && pdn->busno == dev->bus->number) |
1da177e4 | 105 | return dn; /* fast path. sysdata is good */ |
1635317f | 106 | return fetch_dev_dn(dev); |
1da177e4 LT |
107 | } |
108 | ||
109 | static inline struct device_node *pci_bus_to_OF_node(struct pci_bus *bus) | |
110 | { | |
111 | if (bus->self) | |
112 | return pci_device_to_OF_node(bus->self); | |
113 | else | |
114 | return bus->sysdata; /* Must be root bus (PHB) */ | |
115 | } | |
116 | ||
117 | extern void pci_process_bridge_OF_ranges(struct pci_controller *hose, | |
118 | struct device_node *dev); | |
119 | ||
120 | extern int pcibios_remove_root_bus(struct pci_controller *phb); | |
121 | ||
122 | extern void phbs_remap_io(void); | |
123 | ||
124 | static inline struct pci_controller *pci_bus_to_host(struct pci_bus *bus) | |
125 | { | |
126 | struct device_node *busdn = bus->sysdata; | |
127 | ||
128 | BUG_ON(busdn == NULL); | |
1635317f | 129 | return PCI_DN(busdn)->phb; |
1da177e4 LT |
130 | } |
131 | ||
4267292b PM |
132 | /* Return values for ppc_md.pci_probe_mode function */ |
133 | #define PCI_PROBE_NONE -1 /* Don't look at this bus at all */ | |
134 | #define PCI_PROBE_NORMAL 0 /* Do normal PCI probing */ | |
135 | #define PCI_PROBE_DEVTREE 1 /* Instantiate from device tree */ | |
136 | ||
1da177e4 LT |
137 | #endif |
138 | #endif /* __KERNEL__ */ |