From: "Michael S. Tsirkin" <mst@redhat.com>
To: qemu-devel@nongnu.org
Cc: "Laurent Vivier" <lvivier@redhat.com>,
"Peter Maydell" <peter.maydell@linaro.org>,
"Thomas Huth" <thuth@redhat.com>,
"Daniel Henrique Barboza" <danielhb413@gmail.com>,
"Greg Kurz" <groug@kaod.org>,
"Eric Auger" <eric.auger@redhat.com>,
qemu-ppc@nongnu.org, "Cédric Le Goater" <clg@kaod.org>,
"Paolo Bonzini" <pbonzini@redhat.com>,
"David Gibson" <david@gibson.dropbear.id.au>
Subject: [PULL 13/45] tests/qtest/libqos/pci: Introduce pio_limit
Date: Fri, 4 Mar 2022 08:39:01 -0500 [thread overview]
Message-ID: <20220304133556.233983-14-mst@redhat.com> (raw)
In-Reply-To: <20220304133556.233983-1-mst@redhat.com>
From: Eric Auger <eric.auger@redhat.com>
At the moment the IO space limit is hardcoded to
QPCI_PIO_LIMIT = 0x10000. When accesses are performed to a bar,
the base address of this latter is compared against the limit
to decide whether we perform an IO or a memory access.
On ARM, we cannot keep this PIO limit as the arm-virt machine
uses [0x3eff0000, 0x3f000000 ] for the IO space map and we
are mandated to allocate at 0x0.
Add a new flag in QPCIBar indicating whether it is an IO bar
or a memory bar. This flag is set on QPCIBar allocation and
provisionned based on the BAR configuration. Then the new flag
is used in access functions and in iomap() function.
Signed-off-by: Eric Auger <eric.auger@redhat.com>
Reviewed-by: Thomas Huth <thuth@redhat.com>
Message-Id: <20220210145254.157790-3-eric.auger@redhat.com>
Signed-off-by: Eric Auger <eric.auger@redhat.com>
Reviewed-by: Thomas Huth <thuth@redhat.com>
---
tests/qtest/libqos/pci.h | 5 +--
tests/qtest/libqos/pci-pc.c | 1 +
tests/qtest/libqos/pci-spapr.c | 1 +
tests/qtest/libqos/pci.c | 78 ++++++++++++++++++++++------------
4 files changed, 54 insertions(+), 31 deletions(-)
diff --git a/tests/qtest/libqos/pci.h b/tests/qtest/libqos/pci.h
index becb800f9e..44f6806fe4 100644
--- a/tests/qtest/libqos/pci.h
+++ b/tests/qtest/libqos/pci.h
@@ -16,8 +16,6 @@
#include "libqtest.h"
#include "qgraph.h"
-#define QPCI_PIO_LIMIT 0x10000
-
#define QPCI_DEVFN(dev, fn) (((dev) << 3) | (fn))
typedef struct QPCIDevice QPCIDevice;
@@ -51,7 +49,7 @@ struct QPCIBus {
uint8_t offset, uint32_t value);
QTestState *qts;
- uint16_t pio_alloc_ptr;
+ uint64_t pio_alloc_ptr, pio_limit;
uint64_t mmio_alloc_ptr, mmio_limit;
bool has_buggy_msi; /* TRUE for spapr, FALSE for pci */
@@ -59,6 +57,7 @@ struct QPCIBus {
struct QPCIBar {
uint64_t addr;
+ bool is_io;
};
struct QPCIDevice
diff --git a/tests/qtest/libqos/pci-pc.c b/tests/qtest/libqos/pci-pc.c
index f97844289f..8051a0881a 100644
--- a/tests/qtest/libqos/pci-pc.c
+++ b/tests/qtest/libqos/pci-pc.c
@@ -150,6 +150,7 @@ void qpci_init_pc(QPCIBusPC *qpci, QTestState *qts, QGuestAllocator *alloc)
qpci->bus.qts = qts;
qpci->bus.pio_alloc_ptr = 0xc000;
+ qpci->bus.pio_limit = 0x10000;
qpci->bus.mmio_alloc_ptr = 0xE0000000;
qpci->bus.mmio_limit = 0x100000000ULL;
diff --git a/tests/qtest/libqos/pci-spapr.c b/tests/qtest/libqos/pci-spapr.c
index 262226985f..870ffdd8b5 100644
--- a/tests/qtest/libqos/pci-spapr.c
+++ b/tests/qtest/libqos/pci-spapr.c
@@ -197,6 +197,7 @@ void qpci_init_spapr(QPCIBusSPAPR *qpci, QTestState *qts,
qpci->bus.qts = qts;
qpci->bus.pio_alloc_ptr = 0xc000;
+ qpci->bus.pio_limit = 0x10000;
qpci->bus.mmio_alloc_ptr = qpci->mmio32.pci_base;
qpci->bus.mmio_limit = qpci->mmio32.pci_base + qpci->mmio32.size;
diff --git a/tests/qtest/libqos/pci.c b/tests/qtest/libqos/pci.c
index 3a9076ae58..b23d72346b 100644
--- a/tests/qtest/libqos/pci.c
+++ b/tests/qtest/libqos/pci.c
@@ -398,44 +398,56 @@ void qpci_config_writel(QPCIDevice *dev, uint8_t offset, uint32_t value)
uint8_t qpci_io_readb(QPCIDevice *dev, QPCIBar token, uint64_t off)
{
- if (token.addr < QPCI_PIO_LIMIT) {
- return dev->bus->pio_readb(dev->bus, token.addr + off);
+ QPCIBus *bus = dev->bus;
+
+ if (token.is_io) {
+ return bus->pio_readb(bus, token.addr + off);
} else {
uint8_t val;
- dev->bus->memread(dev->bus, token.addr + off, &val, sizeof(val));
+
+ bus->memread(dev->bus, token.addr + off, &val, sizeof(val));
return val;
}
}
uint16_t qpci_io_readw(QPCIDevice *dev, QPCIBar token, uint64_t off)
{
- if (token.addr < QPCI_PIO_LIMIT) {
- return dev->bus->pio_readw(dev->bus, token.addr + off);
+ QPCIBus *bus = dev->bus;
+
+ if (token.is_io) {
+ return bus->pio_readw(bus, token.addr + off);
} else {
uint16_t val;
- dev->bus->memread(dev->bus, token.addr + off, &val, sizeof(val));
+
+ bus->memread(bus, token.addr + off, &val, sizeof(val));
return le16_to_cpu(val);
}
}
uint32_t qpci_io_readl(QPCIDevice *dev, QPCIBar token, uint64_t off)
{
- if (token.addr < QPCI_PIO_LIMIT) {
- return dev->bus->pio_readl(dev->bus, token.addr + off);
+ QPCIBus *bus = dev->bus;
+
+ if (token.is_io) {
+ return bus->pio_readl(bus, token.addr + off);
} else {
uint32_t val;
- dev->bus->memread(dev->bus, token.addr + off, &val, sizeof(val));
+
+ bus->memread(dev->bus, token.addr + off, &val, sizeof(val));
return le32_to_cpu(val);
}
}
uint64_t qpci_io_readq(QPCIDevice *dev, QPCIBar token, uint64_t off)
{
- if (token.addr < QPCI_PIO_LIMIT) {
- return dev->bus->pio_readq(dev->bus, token.addr + off);
+ QPCIBus *bus = dev->bus;
+
+ if (token.is_io) {
+ return bus->pio_readq(bus, token.addr + off);
} else {
uint64_t val;
- dev->bus->memread(dev->bus, token.addr + off, &val, sizeof(val));
+
+ bus->memread(bus, token.addr + off, &val, sizeof(val));
return le64_to_cpu(val);
}
}
@@ -443,57 +455,65 @@ uint64_t qpci_io_readq(QPCIDevice *dev, QPCIBar token, uint64_t off)
void qpci_io_writeb(QPCIDevice *dev, QPCIBar token, uint64_t off,
uint8_t value)
{
- if (token.addr < QPCI_PIO_LIMIT) {
- dev->bus->pio_writeb(dev->bus, token.addr + off, value);
+ QPCIBus *bus = dev->bus;
+
+ if (token.is_io) {
+ bus->pio_writeb(bus, token.addr + off, value);
} else {
- dev->bus->memwrite(dev->bus, token.addr + off, &value, sizeof(value));
+ bus->memwrite(bus, token.addr + off, &value, sizeof(value));
}
}
void qpci_io_writew(QPCIDevice *dev, QPCIBar token, uint64_t off,
uint16_t value)
{
- if (token.addr < QPCI_PIO_LIMIT) {
- dev->bus->pio_writew(dev->bus, token.addr + off, value);
+ QPCIBus *bus = dev->bus;
+
+ if (token.is_io) {
+ bus->pio_writew(bus, token.addr + off, value);
} else {
value = cpu_to_le16(value);
- dev->bus->memwrite(dev->bus, token.addr + off, &value, sizeof(value));
+ bus->memwrite(bus, token.addr + off, &value, sizeof(value));
}
}
void qpci_io_writel(QPCIDevice *dev, QPCIBar token, uint64_t off,
uint32_t value)
{
- if (token.addr < QPCI_PIO_LIMIT) {
- dev->bus->pio_writel(dev->bus, token.addr + off, value);
+ QPCIBus *bus = dev->bus;
+
+ if (token.is_io) {
+ bus->pio_writel(bus, token.addr + off, value);
} else {
value = cpu_to_le32(value);
- dev->bus->memwrite(dev->bus, token.addr + off, &value, sizeof(value));
+ bus->memwrite(bus, token.addr + off, &value, sizeof(value));
}
}
void qpci_io_writeq(QPCIDevice *dev, QPCIBar token, uint64_t off,
uint64_t value)
{
- if (token.addr < QPCI_PIO_LIMIT) {
- dev->bus->pio_writeq(dev->bus, token.addr + off, value);
+ QPCIBus *bus = dev->bus;
+
+ if (token.is_io) {
+ bus->pio_writeq(bus, token.addr + off, value);
} else {
value = cpu_to_le64(value);
- dev->bus->memwrite(dev->bus, token.addr + off, &value, sizeof(value));
+ bus->memwrite(bus, token.addr + off, &value, sizeof(value));
}
}
void qpci_memread(QPCIDevice *dev, QPCIBar token, uint64_t off,
void *buf, size_t len)
{
- g_assert(token.addr >= QPCI_PIO_LIMIT);
+ g_assert(!token.is_io);
dev->bus->memread(dev->bus, token.addr + off, buf, len);
}
void qpci_memwrite(QPCIDevice *dev, QPCIBar token, uint64_t off,
const void *buf, size_t len)
{
- g_assert(token.addr >= QPCI_PIO_LIMIT);
+ g_assert(!token.is_io);
dev->bus->memwrite(dev->bus, token.addr + off, buf, len);
}
@@ -534,9 +554,10 @@ QPCIBar qpci_iomap(QPCIDevice *dev, int barno, uint64_t *sizeptr)
loc = QEMU_ALIGN_UP(bus->pio_alloc_ptr, size);
g_assert(loc >= bus->pio_alloc_ptr);
- g_assert(loc + size <= QPCI_PIO_LIMIT); /* Keep PIO below 64kiB */
+ g_assert(loc + size <= bus->pio_limit);
bus->pio_alloc_ptr = loc + size;
+ bar.is_io = true;
qpci_config_writel(dev, bar_reg, loc | PCI_BASE_ADDRESS_SPACE_IO);
} else {
@@ -547,6 +568,7 @@ QPCIBar qpci_iomap(QPCIDevice *dev, int barno, uint64_t *sizeptr)
g_assert(loc + size <= bus->mmio_limit);
bus->mmio_alloc_ptr = loc + size;
+ bar.is_io = false;
qpci_config_writel(dev, bar_reg, loc);
}
@@ -562,7 +584,7 @@ void qpci_iounmap(QPCIDevice *dev, QPCIBar bar)
QPCIBar qpci_legacy_iomap(QPCIDevice *dev, uint16_t addr)
{
- QPCIBar bar = { .addr = addr };
+ QPCIBar bar = { .addr = addr, .is_io = true };
return bar;
}
--
MST
next prev parent reply other threads:[~2022-03-04 14:13 UTC|newest]
Thread overview: 52+ messages / expand[flat|nested] mbox.gz Atom feed top
2022-03-04 13:36 [PULL 00/45] virtio,pc,pci: features, cleanups, fixes Michael S. Tsirkin
2022-03-04 13:37 ` [PULL 01/45] qom: assert integer does not overflow Michael S. Tsirkin
2022-03-04 13:37 ` [PULL 02/45] ACPI ERST: specification for ERST support Michael S. Tsirkin
2022-03-04 13:37 ` [PULL 03/45] MAINTAINERS: no need to add my name explicitly as a reviewer for VIOT tables Michael S. Tsirkin
2022-03-04 13:37 ` [PULL 04/45] docs/acpi/erst: add device id for ACPI ERST device in pci-ids.txt Michael S. Tsirkin
2022-03-04 13:37 ` [PULL 05/45] hw/acpi/erst: clean up unused IS_UEFI_CPER_RECORD macro Michael S. Tsirkin
2022-03-04 13:37 ` [PULL 06/45] hw/smbios: code cleanup - use macro definitions for table header handles Michael S. Tsirkin
2022-03-04 13:38 ` [PULL 07/45] hw/smbios: fix overlapping table handle numbers with large memory vms Michael S. Tsirkin
2022-03-04 13:38 ` [PULL 08/45] hw/smbios: add assertion to ensure handles of tables 19 and 32 do not collide Michael S. Tsirkin
2022-03-04 13:38 ` [PULL 09/45] vhost-user: remove VirtQ notifier restore Michael S. Tsirkin
2022-03-04 13:38 ` [PULL 10/45] vhost-user: fix VirtQ notifier cleanup Michael S. Tsirkin
2022-03-04 13:38 ` [PULL 11/45] virtio: fix the condition for iommu_platform not supported Michael S. Tsirkin
2022-03-04 13:38 ` [PULL 12/45] hw/vhost-user-i2c: Add support for VIRTIO_I2C_F_ZERO_LENGTH_REQUEST Michael S. Tsirkin
2022-03-04 13:39 ` Michael S. Tsirkin [this message]
2022-03-04 13:39 ` [PULL 14/45] tests/qtest/libqos: Skip hotplug tests if pci root bus is not hotpluggable Michael S. Tsirkin
2022-03-04 13:39 ` [PULL 15/45] tests/qtest/vhost-user-blk-test: Temporary hack to get tests passing on aarch64 Michael S. Tsirkin
2022-03-04 13:39 ` [PULL 16/45] tests/qtest/libqos: Add generic pci host bridge in arm-virt machine Michael S. Tsirkin
2022-03-07 10:02 ` Michael S. Tsirkin
2022-03-07 11:07 ` Eric Auger
2022-03-04 13:39 ` [PULL 17/45] hw/virtio: vdpa: Fix leak of host-notifier memory-region Michael S. Tsirkin
2022-03-04 13:39 ` [PULL 18/45] vhost-vdpa: make notifiers _init()/_uninit() symmetric Michael S. Tsirkin
2022-03-04 13:39 ` [PULL 19/45] intel_iommu: support snoop control Michael S. Tsirkin
2022-03-04 13:39 ` [PULL 20/45] hw/i386: Improve bounds checking in OVMF table parsing Michael S. Tsirkin
2022-03-04 13:40 ` [PULL 21/45] hw/i386: Replace magic number with field length calculation Michael S. Tsirkin
2022-03-04 13:40 ` [PULL 22/45] virtio-iommu: Default to bypass during boot Michael S. Tsirkin
2022-03-04 13:40 ` [PULL 23/45] virtio-iommu: Support bypass domain Michael S. Tsirkin
2022-03-04 13:40 ` [PULL 24/45] tests/qtest/virtio-iommu-test: Check bypass config Michael S. Tsirkin
2022-03-04 13:40 ` [PULL 25/45] hw/i386/pc_piix: Mark the machine types from version 1.4 to 1.7 as deprecated Michael S. Tsirkin
2022-03-04 13:40 ` [PULL 26/45] hw/pci-bridge/pxb: Fix missing swizzle Michael S. Tsirkin
2022-03-04 13:40 ` [PULL 27/45] virtio-net: Unlimit tx queue size if peer is vdpa Michael S. Tsirkin
2022-03-04 13:40 ` [PULL 28/45] pcie: Add support for Single Root I/O Virtualization (SR/IOV) Michael S. Tsirkin
2022-03-04 13:40 ` [PULL 29/45] pcie: Add some SR/IOV API documentation in docs/pcie_sriov.txt Michael S. Tsirkin
2022-03-04 13:40 ` [PULL 30/45] pcie: Add a helper to the SR/IOV API Michael S. Tsirkin
2022-03-04 13:41 ` [PULL 31/45] pcie: Add 1.2 version token for the Power Management Capability Michael S. Tsirkin
2022-03-04 13:41 ` [PULL 32/45] pci-bridge/xio3130_upstream: Fix error handling Michael S. Tsirkin
2022-03-04 13:41 ` [PULL 33/45] pci-bridge/xio3130_downstream: " Michael S. Tsirkin
2022-03-04 13:41 ` [PULL 34/45] headers: Add pvpanic.h Michael S. Tsirkin
2022-03-04 13:41 ` [PULL 35/45] hw/misc/pvpanic: Use standard headers instead Michael S. Tsirkin
2022-03-04 13:41 ` [PULL 36/45] pci: show id info when pci BDF conflict Michael S. Tsirkin
2022-03-04 13:42 ` [PULL 37/45] pci: expose TYPE_XIO3130_DOWNSTREAM name Michael S. Tsirkin
2022-03-04 13:42 ` [PULL 38/45] acpi: pcihp: pcie: set power on cap on parent slot Michael S. Tsirkin
2022-03-04 13:42 ` [PULL 39/45] pc: add option to disable PS/2 mouse/keyboard Michael S. Tsirkin
2022-03-04 13:42 ` [PULL 40/45] vhost-vsock: detach the virqueue element in case of error Michael S. Tsirkin
2022-03-04 13:42 ` [PULL 41/45] x86: cleanup unused compat_apic_id_mode Michael S. Tsirkin
2022-03-04 13:42 ` [PULL 42/45] event_notifier: add event_notifier_get_wfd() Michael S. Tsirkin
2022-03-04 13:42 ` [PULL 43/45] vhost: use wfd on functions setting vring call fd Michael S. Tsirkin
2022-03-04 13:42 ` [PULL 44/45] configure, meson: allow enabling vhost-user on all POSIX systems Michael S. Tsirkin
2022-03-04 13:42 ` [PULL 45/45] docs: vhost-user: add subsection for non-Linux platforms Michael S. Tsirkin
2022-03-04 22:13 ` [PULL 00/45] virtio,pc,pci: features, cleanups, fixes Peter Maydell
2022-03-06 10:37 ` Michael S. Tsirkin
2022-03-07 10:48 ` Eric Auger
2022-03-07 11:55 ` Peter Maydell
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20220304133556.233983-14-mst@redhat.com \
--to=mst@redhat.com \
--cc=clg@kaod.org \
--cc=danielhb413@gmail.com \
--cc=david@gibson.dropbear.id.au \
--cc=eric.auger@redhat.com \
--cc=groug@kaod.org \
--cc=lvivier@redhat.com \
--cc=pbonzini@redhat.com \
--cc=peter.maydell@linaro.org \
--cc=qemu-devel@nongnu.org \
--cc=qemu-ppc@nongnu.org \
--cc=thuth@redhat.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).