1*9f0ae301SCornelia Huck #ifndef _PCI_HOST_GENERIC_H_ 2*9f0ae301SCornelia Huck #define _PCI_HOST_GENERIC_H_ 333d78b07SAlexander Gordeev /* 433d78b07SAlexander Gordeev * PCI host bridge supporting structures and constants 533d78b07SAlexander Gordeev * 633d78b07SAlexander Gordeev * Copyright (C) 2016, Red Hat Inc, Alexander Gordeev <agordeev@redhat.com> 733d78b07SAlexander Gordeev * 833d78b07SAlexander Gordeev * This work is licensed under the terms of the GNU LGPL, version 2. 933d78b07SAlexander Gordeev */ 1033d78b07SAlexander Gordeev #include "libcflat.h" 1133d78b07SAlexander Gordeev 1233d78b07SAlexander Gordeev struct pci_addr_space { 1333d78b07SAlexander Gordeev phys_addr_t pci_start; 1433d78b07SAlexander Gordeev phys_addr_t start; 1533d78b07SAlexander Gordeev phys_addr_t size; 1633d78b07SAlexander Gordeev phys_addr_t allocated; 1733d78b07SAlexander Gordeev int type; 1833d78b07SAlexander Gordeev }; 1933d78b07SAlexander Gordeev 2033d78b07SAlexander Gordeev struct pci_host_bridge { 21340cf7dbSAndrew Jones void __iomem *start; 22340cf7dbSAndrew Jones size_t size; 2333d78b07SAlexander Gordeev int bus; 2433d78b07SAlexander Gordeev int bus_max; 2533d78b07SAlexander Gordeev int nr_addr_spaces; 2633d78b07SAlexander Gordeev struct pci_addr_space addr_space[]; 2733d78b07SAlexander Gordeev }; 2833d78b07SAlexander Gordeev 2933d78b07SAlexander Gordeev /* 3033d78b07SAlexander Gordeev * The following constants are derived from Linux, see this source: 3133d78b07SAlexander Gordeev * 3233d78b07SAlexander Gordeev * drivers/pci/host/pci-host-generic.c 3333d78b07SAlexander Gordeev * struct gen_pci_cfg_bus_ops::bus_shift 3433d78b07SAlexander Gordeev * int gen_pci_parse_map_cfg_windows(struct gen_pci *pci) 3533d78b07SAlexander Gordeev * 3633d78b07SAlexander Gordeev * Documentation/devicetree/bindings/pci/host-generic-pci.txt describes 3733d78b07SAlexander Gordeev * ECAM Configuration Space is be memory-mapped by concatenating the various 3833d78b07SAlexander Gordeev * components to form an offset: 3933d78b07SAlexander Gordeev * 4033d78b07SAlexander Gordeev * cfg_offset(bus, device, function, register) = 4133d78b07SAlexander Gordeev * bus << 20 | device << 15 | function << 12 | register 4233d78b07SAlexander Gordeev */ 4333d78b07SAlexander Gordeev #define PCI_ECAM_BUS_SHIFT 20 4433d78b07SAlexander Gordeev #define PCI_ECAM_DEVFN_SHIFT 12 4533d78b07SAlexander Gordeev 4633d78b07SAlexander Gordeev #endif 47