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