xref: /kvm-unit-tests/lib/pci-host-generic.h (revision 9f0ae3012430ed7072d04247fb674125c616a6b4)
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