xref: /kvm-unit-tests/lib/pci.h (revision e1cad5c8904c444dae3846cc08fbc41e6d04b2c2)
14932b58aSMichael S. Tsirkin #ifndef PCI_H
24932b58aSMichael S. Tsirkin #define PCI_H
3456c55bcSAndrew Jones /*
4456c55bcSAndrew Jones  * API for scanning a PCI bus for a given device, as well to access
5456c55bcSAndrew Jones  * BAR registers.
6456c55bcSAndrew Jones  *
7456c55bcSAndrew Jones  * Copyright (C) 2013, Red Hat Inc, Michael S. Tsirkin <mst@redhat.com>
8456c55bcSAndrew Jones  *
9456c55bcSAndrew Jones  * This work is licensed under the terms of the GNU LGPL, version 2.
10456c55bcSAndrew Jones  */
114932b58aSMichael S. Tsirkin #include "libcflat.h"
124932b58aSMichael S. Tsirkin 
134932b58aSMichael S. Tsirkin typedef uint16_t pcidevaddr_t;
144932b58aSMichael S. Tsirkin enum {
15d3a8ad49SAndrew Jones 	PCIDEVADDR_INVALID = 0xffff,
164932b58aSMichael S. Tsirkin };
17ebb58e7eSAlexander Gordeev 
18*e1cad5c8SAlexander Gordeev extern bool pci_dev_exists(pcidevaddr_t dev);
19fa80a74dSAlexander Gordeev extern pcidevaddr_t pci_find_dev(uint16_t vendor_id, uint16_t device_id);
202455ef20SAlexander Gordeev 
212455ef20SAlexander Gordeev /*
222455ef20SAlexander Gordeev  * @bar_num in all BAR access functions below is the index of the 32-bit
232455ef20SAlexander Gordeev  * register starting from the PCI_BASE_ADDRESS_0 offset.
242455ef20SAlexander Gordeev  *
252455ef20SAlexander Gordeev  * In cases where the BAR size is 64-bit, a caller should still provide
262455ef20SAlexander Gordeev  * @bar_num in terms of 32-bit words. For example, if a device has a 64-bit
272455ef20SAlexander Gordeev  * BAR#0 and a 32-bit BAR#1, then caller should provide 2 to address BAR#1,
282455ef20SAlexander Gordeev  * not 1.
292455ef20SAlexander Gordeev  *
302455ef20SAlexander Gordeev  * It is expected the caller is aware of the device BAR layout and never
312455ef20SAlexander Gordeev  * tries to address the middle of a 64-bit register.
322455ef20SAlexander Gordeev  */
33647f92c7SAlexander Gordeev extern phys_addr_t pci_bar_get_addr(pcidevaddr_t dev, int bar_num);
34647f92c7SAlexander Gordeev extern void pci_bar_set_addr(pcidevaddr_t dev, int bar_num, phys_addr_t addr);
352455ef20SAlexander Gordeev extern phys_addr_t pci_bar_size(pcidevaddr_t dev, int bar_num);
362455ef20SAlexander Gordeev extern bool pci_bar_is64(pcidevaddr_t dev, int bar_num);
37fa80a74dSAlexander Gordeev extern bool pci_bar_is_memory(pcidevaddr_t dev, int bar_num);
38fa80a74dSAlexander Gordeev extern bool pci_bar_is_valid(pcidevaddr_t dev, int bar_num);
394932b58aSMichael S. Tsirkin 
40289ebf8fSAndrew Jones /*
41289ebf8fSAndrew Jones  * pci-testdev is a driver for the pci-testdev qemu pci device. The
42289ebf8fSAndrew Jones  * device enables testing mmio and portio exits, and measuring their
43289ebf8fSAndrew Jones  * speed.
44289ebf8fSAndrew Jones  */
45289ebf8fSAndrew Jones #define PCI_VENDOR_ID_REDHAT		0x1b36
46289ebf8fSAndrew Jones #define PCI_DEVICE_ID_REDHAT_TEST	0x0005
47289ebf8fSAndrew Jones 
48289ebf8fSAndrew Jones #define PCI_TESTDEV_NUM_BARS		2
49289ebf8fSAndrew Jones 
50289ebf8fSAndrew Jones struct pci_test_dev_hdr {
51289ebf8fSAndrew Jones 	uint8_t  test;
52289ebf8fSAndrew Jones 	uint8_t  width;
53289ebf8fSAndrew Jones 	uint8_t  pad0[2];
54289ebf8fSAndrew Jones 	uint32_t offset;
55289ebf8fSAndrew Jones 	uint32_t data;
56289ebf8fSAndrew Jones 	uint32_t count;
57289ebf8fSAndrew Jones 	uint8_t  name[];
58289ebf8fSAndrew Jones };
59289ebf8fSAndrew Jones 
60289ebf8fSAndrew Jones #endif /* PCI_H */
61