From: Greg Kurz <groug@kaod.org>
To: David Gibson <david@gibson.dropbear.id.au>
Cc: pbonzini@redhat.com, qemu-devel@nongnu.org, qemu-ppc@nongnu.org,
lvivier@redhat.com, agraf@suse.de, stefanha@redhat.com,
mst@redhat.com, aik@ozlabs.ru, mdroth@linux.vnet.ibm.com,
thuth@redhat.com
Subject: Re: [Qemu-devel] [PATCHv3 06/11] libqos: Add streaming accessors for PCI MMIO
Date: Thu, 20 Oct 2016 21:37:28 +0200 [thread overview]
Message-ID: <20161020213728.0a870a87@bahia> (raw)
In-Reply-To: <1476934994-5515-7-git-send-email-david@gibson.dropbear.id.au>
On Thu, 20 Oct 2016 14:43:09 +1100
David Gibson <david@gibson.dropbear.id.au> wrote:
> Currently PCI memory (aka MMIO) space is accessed via a set of readb/writeb
> style accessors. This is what we want for accessing discrete registers of
> a certain size. However, there are a few cases where we instead need a
> "bag of bytes" style streaming interface to PCI MMIO space. This can be
> either for streaming data style registers or when there's actual memory
> rather than registers in PCI space, for example frame buffers or ivshmem.
>
> This patch adds backend callbacks, and libqos wrappers for this type of
> byte address order preserving accesses.
>
> Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
> Reviewed-by: Laurent Vivier <lvivier@redhat.com>
> ---
Reviewed-by: Greg Kurz <groug@kaod.org>
> tests/libqos/pci-pc.c | 14 ++++++++++++++
> tests/libqos/pci-spapr.c | 17 +++++++++++++++++
> tests/libqos/pci.c | 16 ++++++++++++++++
> tests/libqos/pci.h | 6 ++++++
> 4 files changed, 53 insertions(+)
>
> diff --git a/tests/libqos/pci-pc.c b/tests/libqos/pci-pc.c
> index d0eb84a..84aee25 100644
> --- a/tests/libqos/pci-pc.c
> +++ b/tests/libqos/pci-pc.c
> @@ -87,6 +87,17 @@ static void qpci_pc_mmio_writel(QPCIBus *bus, uint32_t addr, uint32_t val)
> writel(addr, val);
> }
>
> +static void qpci_pc_memread(QPCIBus *bus, uint32_t addr, void *buf, size_t len)
> +{
> + memread(addr, buf, len);
> +}
> +
> +static void qpci_pc_memwrite(QPCIBus *bus, uint32_t addr,
> + const void *buf, size_t len)
> +{
> + memwrite(addr, buf, len);
> +}
> +
> static uint8_t qpci_pc_config_readb(QPCIBus *bus, int devfn, uint8_t offset)
> {
> outl(0xcf8, (1U << 31) | (devfn << 8) | offset);
> @@ -145,6 +156,9 @@ QPCIBus *qpci_init_pc(QGuestAllocator *alloc)
> ret->bus.mmio_writew = qpci_pc_mmio_writew;
> ret->bus.mmio_writel = qpci_pc_mmio_writel;
>
> + ret->bus.memread = qpci_pc_memread;
> + ret->bus.memwrite = qpci_pc_memwrite;
> +
> ret->bus.config_readb = qpci_pc_config_readb;
> ret->bus.config_readw = qpci_pc_config_readw;
> ret->bus.config_readl = qpci_pc_config_readl;
> diff --git a/tests/libqos/pci-spapr.c b/tests/libqos/pci-spapr.c
> index 70a24b5..ad12c2e 100644
> --- a/tests/libqos/pci-spapr.c
> +++ b/tests/libqos/pci-spapr.c
> @@ -114,6 +114,20 @@ static void qpci_spapr_mmio32_writel(QPCIBus *bus, uint32_t addr, uint32_t val)
> writel(s->mmio32_cpu_base + addr, bswap32(val));
> }
>
> +static void qpci_spapr_memread(QPCIBus *bus, uint32_t addr,
> + void *buf, size_t len)
> +{
> + QPCIBusSPAPR *s = container_of(bus, QPCIBusSPAPR, bus);
> + memread(s->mmio32_cpu_base + addr, buf, len);
> +}
> +
> +static void qpci_spapr_memwrite(QPCIBus *bus, uint32_t addr,
> + const void *buf, size_t len)
> +{
> + QPCIBusSPAPR *s = container_of(bus, QPCIBusSPAPR, bus);
> + memwrite(s->mmio32_cpu_base + addr, buf, len);
> +}
> +
> static uint8_t qpci_spapr_config_readb(QPCIBus *bus, int devfn, uint8_t offset)
> {
> QPCIBusSPAPR *s = container_of(bus, QPCIBusSPAPR, bus);
> @@ -188,6 +202,9 @@ QPCIBus *qpci_init_spapr(QGuestAllocator *alloc)
> ret->bus.mmio_writew = qpci_spapr_mmio32_writew;
> ret->bus.mmio_writel = qpci_spapr_mmio32_writel;
>
> + ret->bus.memread = qpci_spapr_memread;
> + ret->bus.memwrite = qpci_spapr_memwrite;
> +
> ret->bus.config_readb = qpci_spapr_config_readb;
> ret->bus.config_readw = qpci_spapr_config_readw;
> ret->bus.config_readl = qpci_spapr_config_readl;
> diff --git a/tests/libqos/pci.c b/tests/libqos/pci.c
> index 98a2e56..146b063 100644
> --- a/tests/libqos/pci.c
> +++ b/tests/libqos/pci.c
> @@ -289,6 +289,22 @@ void qpci_io_writel(QPCIDevice *dev, void *data, uint32_t value)
> }
> }
>
> +void qpci_memread(QPCIDevice *dev, void *data, void *buf, size_t len)
> +{
> + uintptr_t addr = (uintptr_t)data;
> +
> + g_assert(addr >= QPCI_PIO_LIMIT);
> + dev->bus->memread(dev->bus, addr, buf, len);
> +}
> +
> +void qpci_memwrite(QPCIDevice *dev, void *data, const void *buf, size_t len)
> +{
> + uintptr_t addr = (uintptr_t)data;
> +
> + g_assert(addr >= QPCI_PIO_LIMIT);
> + dev->bus->memwrite(dev->bus, addr, buf, len);
> +}
> +
> void *qpci_iomap(QPCIDevice *dev, int barno, uint64_t *sizeptr)
> {
> QPCIBus *bus = dev->bus;
> diff --git a/tests/libqos/pci.h b/tests/libqos/pci.h
> index b6f855e..2b08362 100644
> --- a/tests/libqos/pci.h
> +++ b/tests/libqos/pci.h
> @@ -39,6 +39,9 @@ struct QPCIBus {
> void (*mmio_writew)(QPCIBus *bus, uint32_t addr, uint16_t value);
> void (*mmio_writel)(QPCIBus *bus, uint32_t addr, uint32_t value);
>
> + void (*memread)(QPCIBus *bus, uint32_t addr, void *buf, size_t len);
> + void (*memwrite)(QPCIBus *bus, uint32_t addr, const void *buf, size_t len);
> +
> uint8_t (*config_readb)(QPCIBus *bus, int devfn, uint8_t offset);
> uint16_t (*config_readw)(QPCIBus *bus, int devfn, uint8_t offset);
> uint32_t (*config_readl)(QPCIBus *bus, int devfn, uint8_t offset);
> @@ -92,6 +95,9 @@ void qpci_io_writeb(QPCIDevice *dev, void *data, uint8_t value);
> void qpci_io_writew(QPCIDevice *dev, void *data, uint16_t value);
> void qpci_io_writel(QPCIDevice *dev, void *data, uint32_t value);
>
> +void qpci_memread(QPCIDevice *bus, void *data, void *buf, size_t len);
> +void qpci_memwrite(QPCIDevice *bus, void *data, const void *buf, size_t len);
> +
> 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);
next prev parent reply other threads:[~2016-10-20 19:37 UTC|newest]
Thread overview: 16+ messages / expand[flat|nested] mbox.gz Atom feed top
2016-10-20 3:43 [Qemu-devel] [PATCHv3 00/11] Cleanups to qtest PCI handling David Gibson
2016-10-20 3:43 ` [Qemu-devel] [PATCHv3 01/11] libqos: Give qvirtio_config_read*() consistent semantics David Gibson
2016-10-20 3:43 ` [Qemu-devel] [PATCHv3 02/11] libqos: Handle PCI IO de-multiplexing in common code David Gibson
2016-10-20 3:43 ` [Qemu-devel] [PATCHv3 03/11] libqos: Move BAR assignment to " David Gibson
2016-10-20 19:32 ` Greg Kurz
2016-10-20 3:43 ` [Qemu-devel] [PATCHv3 04/11] libqos: Better handling of PCI legacy IO David Gibson
2016-10-20 3:43 ` [Qemu-devel] [PATCHv3 05/11] tests: Adjust tco-test to use qpci_legacy_iomap() David Gibson
2016-10-20 3:43 ` [Qemu-devel] [PATCHv3 06/11] libqos: Add streaming accessors for PCI MMIO David Gibson
2016-10-20 19:37 ` Greg Kurz [this message]
2016-10-20 3:43 ` [Qemu-devel] [PATCHv3 07/11] libqos: Implement mmio accessors in terms of mem{read, write} David Gibson
2016-10-20 3:43 ` [Qemu-devel] [PATCHv3 08/11] tests: Clean up IO handling in ide-test David Gibson
2016-10-20 9:54 ` Laurent Vivier
2016-10-20 23:49 ` David Gibson
2016-10-20 3:43 ` [Qemu-devel] [PATCHv3 09/11] libqos: Add 64-bit PCI IO accessors David Gibson
2016-10-20 3:43 ` [Qemu-devel] [PATCHv3 10/11] tests: Use qpci_mem{read, write} in ivshmem-test David Gibson
2016-10-20 3:43 ` [Qemu-devel] [PATCHv3 11/11] libqos: Change PCI accessors to take opaque BAR handle David Gibson
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=20161020213728.0a870a87@bahia \
--to=groug@kaod.org \
--cc=agraf@suse.de \
--cc=aik@ozlabs.ru \
--cc=david@gibson.dropbear.id.au \
--cc=lvivier@redhat.com \
--cc=mdroth@linux.vnet.ibm.com \
--cc=mst@redhat.com \
--cc=pbonzini@redhat.com \
--cc=qemu-devel@nongnu.org \
--cc=qemu-ppc@nongnu.org \
--cc=stefanha@redhat.com \
--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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.