pci-bridge.h 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990
  1. #ifdef __KERNEL__
  2. #ifndef _ASM_PCI_BRIDGE_H
  3. #define _ASM_PCI_BRIDGE_H
  4. #include <linux/pci.h>
  5. /*
  6. * This program is free software; you can redistribute it and/or
  7. * modify it under the terms of the GNU General Public License
  8. * as published by the Free Software Foundation; either version
  9. * 2 of the License, or (at your option) any later version.
  10. */
  11. /*
  12. * Structure of a PCI controller (host bridge)
  13. */
  14. struct pci_controller {
  15. struct pci_bus *bus;
  16. char is_dynamic;
  17. void *arch_data;
  18. struct list_head list_node;
  19. int first_busno;
  20. int last_busno;
  21. void __iomem *io_base_virt;
  22. unsigned long io_base_phys;
  23. /* Some machines have a non 1:1 mapping of
  24. * the PCI memory space in the CPU bus space
  25. */
  26. unsigned long pci_mem_offset;
  27. unsigned long pci_io_size;
  28. struct pci_ops *ops;
  29. volatile unsigned int __iomem *cfg_addr;
  30. volatile unsigned char __iomem *cfg_data;
  31. /* Currently, we limit ourselves to 1 IO range and 3 mem
  32. * ranges since the common pci_bus structure can't handle more
  33. */
  34. struct resource io_resource;
  35. struct resource mem_resources[3];
  36. int global_number;
  37. int local_number;
  38. unsigned long buid;
  39. unsigned long dma_window_base_cur;
  40. unsigned long dma_window_size;
  41. };
  42. struct device_node *fetch_dev_dn(struct pci_dev *dev);
  43. /* Get a device_node from a pci_dev. This code must be fast except in the case
  44. * where the sysdata is incorrect and needs to be fixed up (hopefully just once)
  45. */
  46. static inline struct device_node *pci_device_to_OF_node(struct pci_dev *dev)
  47. {
  48. struct device_node *dn = dev->sysdata;
  49. if (dn->devfn == dev->devfn && dn->busno == dev->bus->number)
  50. return dn; /* fast path. sysdata is good */
  51. else
  52. return fetch_dev_dn(dev);
  53. }
  54. static inline struct device_node *pci_bus_to_OF_node(struct pci_bus *bus)
  55. {
  56. if (bus->self)
  57. return pci_device_to_OF_node(bus->self);
  58. else
  59. return bus->sysdata; /* Must be root bus (PHB) */
  60. }
  61. extern void pci_process_bridge_OF_ranges(struct pci_controller *hose,
  62. struct device_node *dev);
  63. extern int pcibios_remove_root_bus(struct pci_controller *phb);
  64. extern void phbs_remap_io(void);
  65. static inline struct pci_controller *pci_bus_to_host(struct pci_bus *bus)
  66. {
  67. struct device_node *busdn = bus->sysdata;
  68. BUG_ON(busdn == NULL);
  69. return busdn->phb;
  70. }
  71. #endif
  72. #endif /* __KERNEL__ */