1*33d78b07SAlexander Gordeev #ifndef PCI_HOST_GENERIC_H 2*33d78b07SAlexander Gordeev #define PCI_HOST_GENERIC_H 3*33d78b07SAlexander Gordeev /* 4*33d78b07SAlexander Gordeev * PCI host bridge supporting structures and constants 5*33d78b07SAlexander Gordeev * 6*33d78b07SAlexander Gordeev * Copyright (C) 2016, Red Hat Inc, Alexander Gordeev <agordeev@redhat.com> 7*33d78b07SAlexander Gordeev * 8*33d78b07SAlexander Gordeev * This work is licensed under the terms of the GNU LGPL, version 2. 9*33d78b07SAlexander Gordeev */ 10*33d78b07SAlexander Gordeev #include "libcflat.h" 11*33d78b07SAlexander Gordeev 12*33d78b07SAlexander Gordeev struct pci_addr_space { 13*33d78b07SAlexander Gordeev phys_addr_t pci_start; 14*33d78b07SAlexander Gordeev phys_addr_t start; 15*33d78b07SAlexander Gordeev phys_addr_t size; 16*33d78b07SAlexander Gordeev phys_addr_t allocated; 17*33d78b07SAlexander Gordeev int type; 18*33d78b07SAlexander Gordeev }; 19*33d78b07SAlexander Gordeev 20*33d78b07SAlexander Gordeev struct pci_host_bridge { 21*33d78b07SAlexander Gordeev phys_addr_t start; 22*33d78b07SAlexander Gordeev phys_addr_t size; 23*33d78b07SAlexander Gordeev int bus; 24*33d78b07SAlexander Gordeev int bus_max; 25*33d78b07SAlexander Gordeev int nr_addr_spaces; 26*33d78b07SAlexander Gordeev struct pci_addr_space addr_space[]; 27*33d78b07SAlexander Gordeev }; 28*33d78b07SAlexander Gordeev 29*33d78b07SAlexander Gordeev /* 30*33d78b07SAlexander Gordeev * The following constants are derived from Linux, see this source: 31*33d78b07SAlexander Gordeev * 32*33d78b07SAlexander Gordeev * drivers/pci/host/pci-host-generic.c 33*33d78b07SAlexander Gordeev * struct gen_pci_cfg_bus_ops::bus_shift 34*33d78b07SAlexander Gordeev * int gen_pci_parse_map_cfg_windows(struct gen_pci *pci) 35*33d78b07SAlexander Gordeev * 36*33d78b07SAlexander Gordeev * Documentation/devicetree/bindings/pci/host-generic-pci.txt describes 37*33d78b07SAlexander Gordeev * ECAM Configuration Space is be memory-mapped by concatenating the various 38*33d78b07SAlexander Gordeev * components to form an offset: 39*33d78b07SAlexander Gordeev * 40*33d78b07SAlexander Gordeev * cfg_offset(bus, device, function, register) = 41*33d78b07SAlexander Gordeev * bus << 20 | device << 15 | function << 12 | register 42*33d78b07SAlexander Gordeev */ 43*33d78b07SAlexander Gordeev #define PCI_ECAM_BUS_SHIFT 20 44*33d78b07SAlexander Gordeev #define PCI_ECAM_DEVFN_SHIFT 12 45*33d78b07SAlexander Gordeev 46*33d78b07SAlexander Gordeev #endif 47