1#ifndef _ASM_POWERPC_PCI_BRIDGE_H 2#define _ASM_POWERPC_PCI_BRIDGE_H 3#ifdef __KERNEL__ 4 5#ifndef CONFIG_PPC64 6#include <asm-ppc/pci-bridge.h> 7#else 8 9#include <linux/pci.h> 10#include <linux/list.h> 11 12/* 13 * This program is free software; you can redistribute it and/or 14 * modify it under the terms of the GNU General Public License 15 * as published by the Free Software Foundation; either version 16 * 2 of the License, or (at your option) any later version. 17 */ 18 19/* 20 * Structure of a PCI controller (host bridge) 21 */ 22struct pci_controller { 23 struct pci_bus *bus; 24 char is_dynamic; 25 int node; 26 void *arch_data; 27 struct list_head list_node; 28 struct device *parent; 29 30 int first_busno; 31 int last_busno; 32 33 void __iomem *io_base_virt; 34 resource_size_t io_base_phys; 35 36 /* Some machines have a non 1:1 mapping of 37 * the PCI memory space in the CPU bus space 38 */ 39 resource_size_t pci_mem_offset; 40 unsigned long pci_io_size; 41 42 struct pci_ops *ops; 43 volatile unsigned int __iomem *cfg_addr; 44 volatile void __iomem *cfg_data; 45 46 /* Currently, we limit ourselves to 1 IO range and 3 mem 47 * ranges since the common pci_bus structure can't handle more 48 */ 49 struct resource io_resource; 50 struct resource mem_resources[3]; 51 int global_number; 52 int local_number; 53 unsigned long buid; 54 unsigned long dma_window_base_cur; 55 unsigned long dma_window_size; 56 57 void *private_data; 58}; 59 60/* 61 * PCI stuff, for nodes representing PCI devices, pointed to 62 * by device_node->data. 63 */ 64struct pci_controller; 65struct iommu_table; 66 67struct pci_dn { 68 int busno; /* pci bus number */ 69 int bussubno; /* pci subordinate bus number */ 70 int devfn; /* pci device and function number */ 71 int class_code; /* pci device class */ 72 73#ifdef CONFIG_PPC_PSERIES 74 int eeh_mode; /* See eeh.h for possible EEH_MODEs */ 75 int eeh_config_addr; 76 int eeh_pe_config_addr; /* new-style partition endpoint address */ 77 int eeh_check_count; /* # times driver ignored error */ 78 int eeh_freeze_count; /* # times this device froze up. */ 79#endif 80 int pci_ext_config_space; /* for pci devices */ 81 struct pci_controller *phb; /* for pci devices */ 82 struct iommu_table *iommu_table; /* for phb's or bridges */ 83 struct pci_dev *pcidev; /* back-pointer to the pci device */ 84 struct device_node *node; /* back-pointer to the device_node */ 85 u32 config_space[16]; /* saved PCI config space */ 86}; 87 88/* Get the pointer to a device_node's pci_dn */ 89#define PCI_DN(dn) ((struct pci_dn *) (dn)->data) 90 91struct device_node *fetch_dev_dn(struct pci_dev *dev); 92 93/* Get a device_node from a pci_dev. This code must be fast except 94 * in the case where the sysdata is incorrect and needs to be fixed 95 * up (this will only happen once). 96 * In this case the sysdata will have been inherited from a PCI host 97 * bridge or a PCI-PCI bridge further up the tree, so it will point 98 * to a valid struct pci_dn, just not the one we want. 99 */ 100static inline struct device_node *pci_device_to_OF_node(struct pci_dev *dev) 101{ 102 struct device_node *dn = dev->sysdata; 103 struct pci_dn *pdn = dn->data; 104 105 if (pdn && pdn->devfn == dev->devfn && pdn->busno == dev->bus->number) 106 return dn; /* fast path. sysdata is good */ 107 return fetch_dev_dn(dev); 108} 109 110static inline int pci_device_from_OF_node(struct device_node *np, 111 u8 *bus, u8 *devfn) 112{ 113 if (!PCI_DN(np)) 114 return -ENODEV; 115 *bus = PCI_DN(np)->busno; 116 *devfn = PCI_DN(np)->devfn; 117 return 0; 118} 119 120static inline struct device_node *pci_bus_to_OF_node(struct pci_bus *bus) 121{ 122 if (bus->self) 123 return pci_device_to_OF_node(bus->self); 124 else 125 return bus->sysdata; /* Must be root bus (PHB) */ 126} 127 128/** Find the bus corresponding to the indicated device node */ 129struct pci_bus * pcibios_find_pci_bus(struct device_node *dn); 130 131extern void pci_process_bridge_OF_ranges(struct pci_controller *hose, 132 struct device_node *dev, int primary); 133 134/** Remove all of the PCI devices under this bus */ 135void pcibios_remove_pci_devices(struct pci_bus *bus); 136 137/** Discover new pci devices under this bus, and add them */ 138void pcibios_add_pci_devices(struct pci_bus * bus); 139void pcibios_fixup_new_pci_devices(struct pci_bus *bus, int fix_bus); 140 141extern int pcibios_remove_root_bus(struct pci_controller *phb); 142 143static inline struct pci_controller *pci_bus_to_host(struct pci_bus *bus) 144{ 145 struct device_node *busdn = bus->sysdata; 146 147 BUG_ON(busdn == NULL); 148 return PCI_DN(busdn)->phb; 149} 150 151extern struct pci_controller* 152pci_find_hose_for_OF_device(struct device_node* node); 153 154extern struct pci_controller * 155pcibios_alloc_controller(struct device_node *dev); 156extern void pcibios_free_controller(struct pci_controller *phb); 157 158#ifdef CONFIG_PCI 159extern unsigned long pci_address_to_pio(phys_addr_t address); 160#else 161static inline unsigned long pci_address_to_pio(phys_addr_t address) 162{ 163 return (unsigned long)-1; 164} 165#endif 166 167/* Return values for ppc_md.pci_probe_mode function */ 168#define PCI_PROBE_NONE -1 /* Don't look at this bus at all */ 169#define PCI_PROBE_NORMAL 0 /* Do normal PCI probing */ 170#define PCI_PROBE_DEVTREE 1 /* Instantiate from device tree */ 171 172#ifdef CONFIG_NUMA 173#define PHB_SET_NODE(PHB, NODE) ((PHB)->node = (NODE)) 174#else 175#define PHB_SET_NODE(PHB, NODE) ((PHB)->node = -1) 176#endif 177 178#endif /* CONFIG_PPC64 */ 179#endif /* __KERNEL__ */ 180#endif 181