#ifndef PCI_HOST_GENERIC_H #define PCI_HOST_GENERIC_H /* * PCI host bridge supporting structures and constants * * Copyright (C) 2016, Red Hat Inc, Alexander Gordeev * * This work is licensed under the terms of the GNU LGPL, version 2. */ #include "libcflat.h" struct pci_addr_space { phys_addr_t pci_start; phys_addr_t start; phys_addr_t size; phys_addr_t allocated; int type; }; struct pci_host_bridge { phys_addr_t start; phys_addr_t size; int bus; int bus_max; int nr_addr_spaces; struct pci_addr_space addr_space[]; }; /* * The following constants are derived from Linux, see this source: * * drivers/pci/host/pci-host-generic.c * struct gen_pci_cfg_bus_ops::bus_shift * int gen_pci_parse_map_cfg_windows(struct gen_pci *pci) * * Documentation/devicetree/bindings/pci/host-generic-pci.txt describes * ECAM Configuration Space is be memory-mapped by concatenating the various * components to form an offset: * * cfg_offset(bus, device, function, register) = * bus << 20 | device << 15 | function << 12 | register */ #define PCI_ECAM_BUS_SHIFT 20 #define PCI_ECAM_DEVFN_SHIFT 12 #endif