xref: /qemu/tests/qtest/libqos/pci.h (revision a2ce7dbd917a18408cf4bfd132578b46c2752a72)
1c4efe1caSAnthony Liguori /*
2c4efe1caSAnthony Liguori  * libqos PCI bindings
3c4efe1caSAnthony Liguori  *
4c4efe1caSAnthony Liguori  * Copyright IBM, Corp. 2012-2013
5c4efe1caSAnthony Liguori  *
6c4efe1caSAnthony Liguori  * Authors:
7c4efe1caSAnthony Liguori  *  Anthony Liguori   <aliguori@us.ibm.com>
8c4efe1caSAnthony Liguori  *
9c4efe1caSAnthony Liguori  * This work is licensed under the terms of the GNU GPL, version 2 or later.
10c4efe1caSAnthony Liguori  * See the COPYING file in the top-level directory.
11c4efe1caSAnthony Liguori  */
12c4efe1caSAnthony Liguori 
13c4efe1caSAnthony Liguori #ifndef LIBQOS_PCI_H
14c4efe1caSAnthony Liguori #define LIBQOS_PCI_H
15c4efe1caSAnthony Liguori 
1658368113SMarc Marí #include "libqtest.h"
17*a2ce7dbdSPaolo Bonzini #include "qgraph.h"
18c4efe1caSAnthony Liguori 
19a795fc08SDavid Gibson #define QPCI_PIO_LIMIT    0x10000
20a795fc08SDavid Gibson 
21c4efe1caSAnthony Liguori #define QPCI_DEVFN(dev, fn) (((dev) << 3) | (fn))
22c4efe1caSAnthony Liguori 
23c4efe1caSAnthony Liguori typedef struct QPCIDevice QPCIDevice;
24c4efe1caSAnthony Liguori typedef struct QPCIBus QPCIBus;
25b4ba67d9SDavid Gibson typedef struct QPCIBar QPCIBar;
2685af0057SEmanuele Giuseppe Esposito typedef struct QPCIAddress QPCIAddress;
27c4efe1caSAnthony Liguori 
28b8cc4d02SDavid Gibson struct QPCIBus {
29a795fc08SDavid Gibson     uint8_t (*pio_readb)(QPCIBus *bus, uint32_t addr);
30a795fc08SDavid Gibson     uint16_t (*pio_readw)(QPCIBus *bus, uint32_t addr);
31a795fc08SDavid Gibson     uint32_t (*pio_readl)(QPCIBus *bus, uint32_t addr);
32f775f45aSDavid Gibson     uint64_t (*pio_readq)(QPCIBus *bus, uint32_t addr);
33c4efe1caSAnthony Liguori 
34a795fc08SDavid Gibson     void (*pio_writeb)(QPCIBus *bus, uint32_t addr, uint8_t value);
35a795fc08SDavid Gibson     void (*pio_writew)(QPCIBus *bus, uint32_t addr, uint16_t value);
36a795fc08SDavid Gibson     void (*pio_writel)(QPCIBus *bus, uint32_t addr, uint32_t value);
37f775f45aSDavid Gibson     void (*pio_writeq)(QPCIBus *bus, uint32_t addr, uint64_t value);
38a795fc08SDavid Gibson 
399a84f889SDavid Gibson     void (*memread)(QPCIBus *bus, uint32_t addr, void *buf, size_t len);
409a84f889SDavid Gibson     void (*memwrite)(QPCIBus *bus, uint32_t addr, const void *buf, size_t len);
419a84f889SDavid Gibson 
42c4efe1caSAnthony Liguori     uint8_t (*config_readb)(QPCIBus *bus, int devfn, uint8_t offset);
43c4efe1caSAnthony Liguori     uint16_t (*config_readw)(QPCIBus *bus, int devfn, uint8_t offset);
44c4efe1caSAnthony Liguori     uint32_t (*config_readl)(QPCIBus *bus, int devfn, uint8_t offset);
45c4efe1caSAnthony Liguori 
46c4efe1caSAnthony Liguori     void (*config_writeb)(QPCIBus *bus, int devfn,
47c4efe1caSAnthony Liguori                           uint8_t offset, uint8_t value);
48c4efe1caSAnthony Liguori     void (*config_writew)(QPCIBus *bus, int devfn,
49c4efe1caSAnthony Liguori                           uint8_t offset, uint16_t value);
50c4efe1caSAnthony Liguori     void (*config_writel)(QPCIBus *bus, int devfn,
51c4efe1caSAnthony Liguori                           uint8_t offset, uint32_t value);
52c4efe1caSAnthony Liguori 
53e5d1730dSEric Blake     QTestState *qts;
54b8cc4d02SDavid Gibson     uint16_t pio_alloc_ptr;
55b8cc4d02SDavid Gibson     uint64_t mmio_alloc_ptr, mmio_limit;
5692bbafc7SEmanuele Giuseppe Esposito     bool has_buggy_msi; /* TRUE for spapr, FALSE for pci */
5785af0057SEmanuele Giuseppe Esposito 
58c4efe1caSAnthony Liguori };
59c4efe1caSAnthony Liguori 
60b4ba67d9SDavid Gibson struct QPCIBar {
61b4ba67d9SDavid Gibson     uint64_t addr;
62b4ba67d9SDavid Gibson };
63b4ba67d9SDavid Gibson 
64c4efe1caSAnthony Liguori struct QPCIDevice
65c4efe1caSAnthony Liguori {
66c4efe1caSAnthony Liguori     QPCIBus *bus;
67c4efe1caSAnthony Liguori     int devfn;
6858368113SMarc Marí     bool msix_enabled;
69b4ba67d9SDavid Gibson     QPCIBar msix_table_bar, msix_pba_bar;
70b4ba67d9SDavid Gibson     uint64_t msix_table_off, msix_pba_off;
71c4efe1caSAnthony Liguori };
72c4efe1caSAnthony Liguori 
7385af0057SEmanuele Giuseppe Esposito struct QPCIAddress {
7485af0057SEmanuele Giuseppe Esposito     uint32_t devfn;
7585af0057SEmanuele Giuseppe Esposito     uint16_t vendor_id;
7685af0057SEmanuele Giuseppe Esposito     uint16_t device_id;
7785af0057SEmanuele Giuseppe Esposito };
7885af0057SEmanuele Giuseppe Esposito 
79c4efe1caSAnthony Liguori void qpci_device_foreach(QPCIBus *bus, int vendor_id, int device_id,
80c4efe1caSAnthony Liguori                          void (*func)(QPCIDevice *dev, int devfn, void *data),
81c4efe1caSAnthony Liguori                          void *data);
82c4efe1caSAnthony Liguori QPCIDevice *qpci_device_find(QPCIBus *bus, int devfn);
8385af0057SEmanuele Giuseppe Esposito void qpci_device_init(QPCIDevice *dev, QPCIBus *bus, QPCIAddress *addr);
84c4efe1caSAnthony Liguori 
8592bbafc7SEmanuele Giuseppe Esposito bool qpci_has_buggy_msi(QPCIDevice *dev);
8692bbafc7SEmanuele Giuseppe Esposito bool qpci_check_buggy_msi(QPCIDevice *dev);
8792bbafc7SEmanuele Giuseppe Esposito 
88c4efe1caSAnthony Liguori void qpci_device_enable(QPCIDevice *dev);
89a32a028aSStefan Hajnoczi uint8_t qpci_find_capability(QPCIDevice *dev, uint8_t id, uint8_t start_addr);
9058368113SMarc Marí void qpci_msix_enable(QPCIDevice *dev);
9158368113SMarc Marí void qpci_msix_disable(QPCIDevice *dev);
9258368113SMarc Marí bool qpci_msix_pending(QPCIDevice *dev, uint16_t entry);
9358368113SMarc Marí bool qpci_msix_masked(QPCIDevice *dev, uint16_t entry);
9458368113SMarc Marí uint16_t qpci_msix_table_size(QPCIDevice *dev);
95c4efe1caSAnthony Liguori 
96c4efe1caSAnthony Liguori uint8_t qpci_config_readb(QPCIDevice *dev, uint8_t offset);
97c4efe1caSAnthony Liguori uint16_t qpci_config_readw(QPCIDevice *dev, uint8_t offset);
98c4efe1caSAnthony Liguori uint32_t qpci_config_readl(QPCIDevice *dev, uint8_t offset);
99c4efe1caSAnthony Liguori 
100c4efe1caSAnthony Liguori void qpci_config_writeb(QPCIDevice *dev, uint8_t offset, uint8_t value);
101c4efe1caSAnthony Liguori void qpci_config_writew(QPCIDevice *dev, uint8_t offset, uint16_t value);
102c4efe1caSAnthony Liguori void qpci_config_writel(QPCIDevice *dev, uint8_t offset, uint32_t value);
103c4efe1caSAnthony Liguori 
104b4ba67d9SDavid Gibson uint8_t qpci_io_readb(QPCIDevice *dev, QPCIBar token, uint64_t off);
105b4ba67d9SDavid Gibson uint16_t qpci_io_readw(QPCIDevice *dev, QPCIBar token, uint64_t off);
106b4ba67d9SDavid Gibson uint32_t qpci_io_readl(QPCIDevice *dev, QPCIBar token, uint64_t off);
107b4ba67d9SDavid Gibson uint64_t qpci_io_readq(QPCIDevice *dev, QPCIBar token, uint64_t off);
108c4efe1caSAnthony Liguori 
109b4ba67d9SDavid Gibson void qpci_io_writeb(QPCIDevice *dev, QPCIBar token, uint64_t off,
110b4ba67d9SDavid Gibson                     uint8_t value);
111b4ba67d9SDavid Gibson void qpci_io_writew(QPCIDevice *dev, QPCIBar token, uint64_t off,
112b4ba67d9SDavid Gibson                     uint16_t value);
113b4ba67d9SDavid Gibson void qpci_io_writel(QPCIDevice *dev, QPCIBar token, uint64_t off,
114b4ba67d9SDavid Gibson                     uint32_t value);
115b4ba67d9SDavid Gibson void qpci_io_writeq(QPCIDevice *dev, QPCIBar token, uint64_t off,
116b4ba67d9SDavid Gibson                     uint64_t value);
117c4efe1caSAnthony Liguori 
118b4ba67d9SDavid Gibson void qpci_memread(QPCIDevice *bus, QPCIBar token, uint64_t off,
119b4ba67d9SDavid Gibson                   void *buf, size_t len);
120b4ba67d9SDavid Gibson void qpci_memwrite(QPCIDevice *bus, QPCIBar token, uint64_t off,
121b4ba67d9SDavid Gibson                    const void *buf, size_t len);
122b4ba67d9SDavid Gibson QPCIBar qpci_iomap(QPCIDevice *dev, int barno, uint64_t *sizeptr);
123b4ba67d9SDavid Gibson void qpci_iounmap(QPCIDevice *dev, QPCIBar addr);
124b4ba67d9SDavid Gibson QPCIBar qpci_legacy_iomap(QPCIDevice *dev, uint16_t addr);
125c4efe1caSAnthony Liguori 
1266ebb8d2aSThomas Huth void qpci_unplug_acpi_device_test(QTestState *qs, const char *id, uint8_t slot);
12785af0057SEmanuele Giuseppe Esposito 
12885af0057SEmanuele Giuseppe Esposito void add_qpci_address(QOSGraphEdgeOptions *opts, QPCIAddress *addr);
129c4efe1caSAnthony Liguori #endif
130