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