From: Andrew Jones <drjones@redhat.com>
To: Alexander Gordeev <agordeev@redhat.com>
Cc: kvmarm@lists.cs.columbia.edu
Subject: Re: [kvm-unit-tests PATCH 07/11] arm/pci: PCI device operation test
Date: Fri, 15 Jan 2016 16:32:11 +0100 [thread overview]
Message-ID: <20160115153211.GL3915@hawk.localdomain> (raw)
In-Reply-To: <597fba0ba6cdc84495acd7dd2119d9c785a76548.1452341807.git.agordeev@redhat.com>
On Sat, Jan 09, 2016 at 01:22:54PM +0100, Alexander Gordeev wrote:
> Cc: Andrew Jones <drjones@redhat.com>
> Signed-off-by: Alexander Gordeev <agordeev@redhat.com>
> ---
> arm/pci-test.c | 2 +-
> lib/pci-testdev.c | 139 ++++++++++++++++++++++++++++++++++++++++++++++++++++--
> lib/pci.h | 2 +-
> 3 files changed, 138 insertions(+), 5 deletions(-)
>
> diff --git a/arm/pci-test.c b/arm/pci-test.c
> index 695acf9..44e2857 100644
> --- a/arm/pci-test.c
> +++ b/arm/pci-test.c
> @@ -23,7 +23,7 @@ int main(void)
> report("PCI bus scanning detected %d devices", true, ret);
>
> ret = pci_testdev(pci);
> - report("PCI test device", ret);
> + report("PCI test device passed %d tests", (ret >= 6), ret);
>
> pci_shutdown(pci);
>
> diff --git a/lib/pci-testdev.c b/lib/pci-testdev.c
> index a7e0995..de97f82 100644
> --- a/lib/pci-testdev.c
> +++ b/lib/pci-testdev.c
> @@ -11,21 +11,154 @@
> #define PCI_VENDOR_ID_REDHAT 0x1b36
> #define PCI_DEVICE_ID_REDHAT_TEST 0x0005
>
> -bool pci_testdev(struct pci *pci)
> +struct pci_test_dev_hdr {
> + u8 test;
> + u8 width;
> + u8 pad0[2];
> + u32 offset;
> + u32 data;
> + u32 count;
> + u8 name[];
> +};
> +
> +struct pci_testdev_ops {
> + u8 (*read8)(const volatile void *addr);
> + u16 (*read16)(const volatile void *addr);
> + u32 (*read32)(const volatile void *addr);
> + void (*write8)(u8 value, volatile void *addr);
> + void (*write16)(u16 value, volatile void *addr);
> + void (*write32)(u32 value, volatile void *addr);
Please use the standard 'b', 'w', 'l' in these names.
> +};
> +
> +static u8 ioread8(const volatile void *addr)
> +{
> + return readb(addr);
> +}
> +
> +static u16 ioread16(const volatile void *addr)
> +{
> + return readw(addr);
> +}
> +
> +static u32 ioread32(const volatile void *addr)
> +{
> + return readl(addr);
> +}
> +
> +static void iowrite8(u8 value, volatile void *addr)
> +{
> + writeb(value, addr);
> +}
> +
> +static void iowrite16(u16 value, volatile void *addr)
> +{
> + writew(value, addr);
> +}
> +
> +static void iowrite32(u32 value, volatile void *addr)
> +{
> + writel(value, addr);
> +}
> +
> +static struct pci_testdev_ops pci_testdev_io_ops = {
> + .read8 = ioread8,
> + .read16 = ioread16,
> + .read32 = ioread32,
> + .write8 = iowrite8,
> + .write16 = iowrite16,
> + .write32 = iowrite32
> +};
> +
> +static u8 memread8(const volatile void *addr)
> +{
> + return *(const volatile u8 __force *)addr;
> +}
> +
> +static u16 memread16(const volatile void *addr)
> +{
> + return *(const volatile u16 __force *)addr;
> +}
> +
> +static u32 memread32(const volatile void *addr)
> +{
> + return *(const volatile u32 __force *)addr;
> +}
> +
> +static void memwrite8(u8 value, volatile void *addr)
> +{
> + *(volatile u8 __force *)addr = value;
> +}
> +
> +static void memwrite16(u16 value, volatile void *addr)
> +{
> + *(volatile u16 __force *)addr = value;
> +}
> +
> +static void memwrite32(u32 value, volatile void *addr)
> +{
> + *(volatile u32 __force *)addr = value;
> +}
> +
> +static struct pci_testdev_ops pci_testdev_mem_ops = {
> + .read8 = memread8,
> + .read16 = memread16,
> + .read32 = memread32,
> + .write8 = memwrite8,
> + .write16 = memwrite16,
> + .write32 = memwrite32
> +};
> +
> +static bool pci_testdev_one(struct pci_test_dev_hdr *test,
> + int test_nr,
> + struct pci_testdev_ops *ops)
> +{
> + u8 width;
> +
> + ops->write8(test_nr, &test->test);
> + assert(ops->read32(&test->count) == 0);
> +
> + width = ops->read8(&test->width);
> + if ((width != 1) && (width != 2) && (width != 4))
> + return false;
> +
> + return true;
> +}
> +
> +static int pci_testdev_all(struct pci_test_dev_hdr *test,
> + struct pci_testdev_ops *ops)
> +{
> + int i;
> +
> + for (i = 0;; i++) {
> + if (!pci_testdev_one(test, i, ops))
> + break;
> + }
> +
> + return i;
> +}
> +
> +int pci_testdev(struct pci *pci)
> {
> phys_addr_t addr;
> + void __iomem *mem, *io;
> + int nr_tests = 0;
> pcidevaddr_t dev = pci_find_dev(pci,
> PCI_VENDOR_ID_REDHAT,
> PCI_DEVICE_ID_REDHAT_TEST);
>
> if (dev == PCIDEVADDR_INVALID)
> - return false;
> + return 0;
>
> addr = pci_bar_addr(pci, dev, 0);
> assert(addr);
> + mem = ioremap(addr, 0);
>
> addr = pci_bar_addr(pci, dev, 1);
> assert(addr);
> + io = (void*)addr;
>
> - return true;
> + nr_tests += pci_testdev_all(mem, &pci_testdev_mem_ops);
> + nr_tests += pci_testdev_all(io, &pci_testdev_io_ops);
> +
> + return nr_tests;
> }
> diff --git a/lib/pci.h b/lib/pci.h
> index 6af5599..0cb0e27 100644
> --- a/lib/pci.h
> +++ b/lib/pci.h
> @@ -24,7 +24,7 @@ typedef enum {
>
> extern struct pci *pci_dt_probe(void);
> extern int pci_bus_scan(struct pci *pci);
> -extern bool pci_testdev(struct pci *pci);
> +extern int pci_testdev(struct pci *pci);
> extern void pci_shutdown(struct pci *pci);
>
> extern pcidevaddr_t pci_find_dev(struct pci *pci, u16 vendor_id, u16 device_id);
> --
> 1.8.3.1
>
This patch can be squashed into the last one.
Thanks,
drew
next prev parent reply other threads:[~2016-01-15 15:28 UTC|newest]
Thread overview: 31+ messages / expand[flat|nested] mbox.gz Atom feed top
2016-01-09 12:22 [kvm-unit-tests PATCH 00/11] pci/arm: add PCI bus support Alexander Gordeev
2016-01-09 12:22 ` [kvm-unit-tests PATCH 01/11] arm/pci: Device tree PCI probing Alexander Gordeev
2016-01-13 15:13 ` Andrew Jones
2016-01-28 15:17 ` Alexander Gordeev
2016-01-28 16:40 ` Andrew Jones
2016-02-05 11:48 ` Alexander Gordeev
2016-02-05 12:18 ` Andrew Jones
2016-01-09 12:22 ` [kvm-unit-tests PATCH 02/11] arm/pci: PCI bus scanning Alexander Gordeev
2016-01-13 15:58 ` Andrew Jones
2016-02-02 9:34 ` Alexander Gordeev
2016-02-02 11:20 ` Andrew Jones
2016-01-09 12:22 ` [kvm-unit-tests PATCH 03/11] arm/pci: Read devices BARs Alexander Gordeev
2016-01-09 12:22 ` [kvm-unit-tests PATCH 04/11] arm/pci: Allocate and assign memory/io space resources Alexander Gordeev
2016-01-09 12:22 ` [kvm-unit-tests PATCH 05/11] arm/pci: Add pci_find_dev() and pci_bar_addr() functions Alexander Gordeev
2016-01-15 15:17 ` Andrew Jones
2016-01-09 12:22 ` [kvm-unit-tests PATCH 06/11] arm/pci: PCI testdev existence test Alexander Gordeev
2016-01-09 12:22 ` [kvm-unit-tests PATCH 07/11] arm/pci: PCI device operation test Alexander Gordeev
2016-01-15 15:32 ` Andrew Jones [this message]
2016-02-04 12:18 ` Alexander Gordeev
2016-02-04 15:31 ` Andrew Jones
2016-01-09 12:22 ` [kvm-unit-tests PATCH 08/11] arm/pci: PCI device read/write test Alexander Gordeev
2016-01-15 15:33 ` Andrew Jones
2016-02-04 12:03 ` Alexander Gordeev
2016-01-15 15:34 ` Andrew Jones
2016-01-09 12:22 ` [kvm-unit-tests PATCH 09/11] arm/pci: PCI host bridge info printing Alexander Gordeev
2016-01-15 15:35 ` Andrew Jones
2016-01-09 12:22 ` [kvm-unit-tests PATCH 10/11] arm/pci: PCI devices basic " Alexander Gordeev
2016-01-15 15:38 ` Andrew Jones
2016-01-09 12:22 ` [kvm-unit-tests PATCH 11/11] arm/pci: PCI testdev test flavour printing Alexander Gordeev
2016-01-15 15:39 ` Andrew Jones
2016-01-15 15:42 ` [kvm-unit-tests PATCH 00/11] pci/arm: add PCI bus support Andrew Jones
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=20160115153211.GL3915@hawk.localdomain \
--to=drjones@redhat.com \
--cc=agordeev@redhat.com \
--cc=kvmarm@lists.cs.columbia.edu \
/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