[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-ppc] [PATCHv2 04/11] libqos: Better handling of PCI legacy IO
From: |
David Gibson |
Subject: |
[Qemu-ppc] [PATCHv2 04/11] libqos: Better handling of PCI legacy IO |
Date: |
Wed, 19 Oct 2016 23:25:34 +1100 |
The usual model for PCI IO with libqos is to use qpci_iomap() to map a
specific BAR for a PCI device, then perform IOs within that BAR using
qpci_io_{read,write}*().
However, certain devices also have legacy PCI IO. In this case, instead of
(or as well as) being accessed via PCI BARs, the device can be accessed
via certain well-known, fixed addresses in PCI IO space.
Two existing tests use legacy PCI IO, and take different flawed approaches
to it:
* tco-test manually constructs a tco_io_base value instead of calling
qpci_iomap(), which assumes internal knowledge of the structure of
the value it shouldn't have
* ide-test uses direct in*() and out*() calls instead of using
qpci_io_*() accessors, meaning it's not portable to non-x86 machine
types.
tco_test uses the libqos PCI code to access the device. This makes perfect
sense for the PCI config space accesses. However for IO, rather than the
usual PCI approach of mapping a PCI BAR, then accessing that, it instead
uses the legacy approach of fixed, known addresses in PCI IO space.
That doesn't work very well with the qpci_io_{read,write} functions because
we never use qpci_iomap() and so have to make assumptions about the
internal encoding of the address tokens iomap() returns.
This patch avoids that, by directly using the bus's pio_{read,write}
callbacks, which are defined to take addresses within the PCI IO space.
Signed-off-by: David Gibson <address@hidden>
---
tests/libqos/pci.c | 5 +++++
tests/libqos/pci.h | 1 +
2 files changed, 6 insertions(+)
diff --git a/tests/libqos/pci.c b/tests/libqos/pci.c
index bf1c532..98a2e56 100644
--- a/tests/libqos/pci.c
+++ b/tests/libqos/pci.c
@@ -350,6 +350,11 @@ void qpci_iounmap(QPCIDevice *dev, void *data)
/* FIXME */
}
+void *qpci_legacy_iomap(QPCIDevice *dev, uint16_t addr)
+{
+ return (void *)(uintptr_t)addr;
+}
+
void qpci_plug_device_test(const char *driver, const char *id,
uint8_t slot, const char *opts)
{
diff --git a/tests/libqos/pci.h b/tests/libqos/pci.h
index f6f916d..b6f855e 100644
--- a/tests/libqos/pci.h
+++ b/tests/libqos/pci.h
@@ -94,6 +94,7 @@ void qpci_io_writel(QPCIDevice *dev, void *data, uint32_t
value);
void *qpci_iomap(QPCIDevice *dev, int barno, uint64_t *sizeptr);
void qpci_iounmap(QPCIDevice *dev, void *data);
+void *qpci_legacy_iomap(QPCIDevice *dev, uint16_t addr);
void qpci_plug_device_test(const char *driver, const char *id,
uint8_t slot, const char *opts);
--
2.7.4
- [Qemu-ppc] [PATCHv2 00/11] Cleanups to qtest PCI handling, David Gibson, 2016/10/19
- [Qemu-ppc] [PATCHv2 05/11] tests: Adjust tco-test to use qpci_legacy_iomap(), David Gibson, 2016/10/19
- [Qemu-ppc] [PATCHv2 04/11] libqos: Better handling of PCI legacy IO,
David Gibson <=
- [Qemu-ppc] [PATCHv2 02/11] libqos: Handle PCI IO de-multiplexing in common code, David Gibson, 2016/10/19
- [Qemu-ppc] [PATCHv2 06/11] libqos: Add streaming accessors for PCI MMIO, David Gibson, 2016/10/19
- [Qemu-ppc] [PATCHv2 10/11] tests: Use qpci_mem{read, write} in ivshmem-test, David Gibson, 2016/10/19
- [Qemu-ppc] [PATCHv2 07/11] libqos: Implement mmio accessors in terms of mem{read, write}, David Gibson, 2016/10/19