1 /* 2 * libqos PCI bindings 3 * 4 * Copyright IBM, Corp. 2012-2013 5 * 6 * Authors: 7 * Anthony Liguori <aliguori@us.ibm.com> 8 * 9 * This work is licensed under the terms of the GNU GPL, version 2 or later. 10 * See the COPYING file in the top-level directory. 11 */ 12 13 #ifndef LIBQOS_PCI_H 14 #define LIBQOS_PCI_H 15 16 #include "libqtest.h" 17 18 #define QPCI_PIO_LIMIT 0x10000 19 20 #define QPCI_DEVFN(dev, fn) (((dev) << 3) | (fn)) 21 22 typedef struct QPCIDevice QPCIDevice; 23 typedef struct QPCIBus QPCIBus; 24 25 struct QPCIBus { 26 uint8_t (*pio_readb)(QPCIBus *bus, uint32_t addr); 27 uint16_t (*pio_readw)(QPCIBus *bus, uint32_t addr); 28 uint32_t (*pio_readl)(QPCIBus *bus, uint32_t addr); 29 uint64_t (*pio_readq)(QPCIBus *bus, uint32_t addr); 30 31 void (*pio_writeb)(QPCIBus *bus, uint32_t addr, uint8_t value); 32 void (*pio_writew)(QPCIBus *bus, uint32_t addr, uint16_t value); 33 void (*pio_writel)(QPCIBus *bus, uint32_t addr, uint32_t value); 34 void (*pio_writeq)(QPCIBus *bus, uint32_t addr, uint64_t value); 35 36 void (*memread)(QPCIBus *bus, uint32_t addr, void *buf, size_t len); 37 void (*memwrite)(QPCIBus *bus, uint32_t addr, const void *buf, size_t len); 38 39 uint8_t (*config_readb)(QPCIBus *bus, int devfn, uint8_t offset); 40 uint16_t (*config_readw)(QPCIBus *bus, int devfn, uint8_t offset); 41 uint32_t (*config_readl)(QPCIBus *bus, int devfn, uint8_t offset); 42 43 void (*config_writeb)(QPCIBus *bus, int devfn, 44 uint8_t offset, uint8_t value); 45 void (*config_writew)(QPCIBus *bus, int devfn, 46 uint8_t offset, uint16_t value); 47 void (*config_writel)(QPCIBus *bus, int devfn, 48 uint8_t offset, uint32_t value); 49 50 uint16_t pio_alloc_ptr; 51 uint64_t mmio_alloc_ptr, mmio_limit; 52 }; 53 54 struct QPCIDevice 55 { 56 QPCIBus *bus; 57 int devfn; 58 bool msix_enabled; 59 void *msix_table; 60 void *msix_pba; 61 }; 62 63 void qpci_device_foreach(QPCIBus *bus, int vendor_id, int device_id, 64 void (*func)(QPCIDevice *dev, int devfn, void *data), 65 void *data); 66 QPCIDevice *qpci_device_find(QPCIBus *bus, int devfn); 67 68 void qpci_device_enable(QPCIDevice *dev); 69 uint8_t qpci_find_capability(QPCIDevice *dev, uint8_t id); 70 void qpci_msix_enable(QPCIDevice *dev); 71 void qpci_msix_disable(QPCIDevice *dev); 72 bool qpci_msix_pending(QPCIDevice *dev, uint16_t entry); 73 bool qpci_msix_masked(QPCIDevice *dev, uint16_t entry); 74 uint16_t qpci_msix_table_size(QPCIDevice *dev); 75 76 uint8_t qpci_config_readb(QPCIDevice *dev, uint8_t offset); 77 uint16_t qpci_config_readw(QPCIDevice *dev, uint8_t offset); 78 uint32_t qpci_config_readl(QPCIDevice *dev, uint8_t offset); 79 80 void qpci_config_writeb(QPCIDevice *dev, uint8_t offset, uint8_t value); 81 void qpci_config_writew(QPCIDevice *dev, uint8_t offset, uint16_t value); 82 void qpci_config_writel(QPCIDevice *dev, uint8_t offset, uint32_t value); 83 84 uint8_t qpci_io_readb(QPCIDevice *dev, void *data); 85 uint16_t qpci_io_readw(QPCIDevice *dev, void *data); 86 uint32_t qpci_io_readl(QPCIDevice *dev, void *data); 87 uint64_t qpci_io_readq(QPCIDevice *dev, void *data); 88 89 void qpci_io_writeb(QPCIDevice *dev, void *data, uint8_t value); 90 void qpci_io_writew(QPCIDevice *dev, void *data, uint16_t value); 91 void qpci_io_writel(QPCIDevice *dev, void *data, uint32_t value); 92 void qpci_io_writeq(QPCIDevice *dev, void *data, uint64_t value); 93 94 void qpci_memread(QPCIDevice *bus, void *data, void *buf, size_t len); 95 void qpci_memwrite(QPCIDevice *bus, void *data, const void *buf, size_t len); 96 97 void *qpci_iomap(QPCIDevice *dev, int barno, uint64_t *sizeptr); 98 void qpci_iounmap(QPCIDevice *dev, void *data); 99 void *qpci_legacy_iomap(QPCIDevice *dev, uint16_t addr); 100 101 void qpci_plug_device_test(const char *driver, const char *id, 102 uint8_t slot, const char *opts); 103 void qpci_unplug_acpi_device_test(const char *id, uint8_t slot); 104 #endif 105