From nobody Sun Nov 9 22:27:05 2025 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail(p=none dis=none) header.from=redhat.com Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 155198247025166.80622391335385; Thu, 7 Mar 2019 10:14:30 -0800 (PST) Received: from localhost ([127.0.0.1]:56707 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1h1xXF-0005xG-As for importer@patchew.org; Thu, 07 Mar 2019 13:14:25 -0500 Received: from eggs.gnu.org ([209.51.188.92]:39556) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1h1wqr-0003I0-Qi for qemu-devel@nongnu.org; Thu, 07 Mar 2019 12:30:39 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1h1wqp-0008AP-Qr for qemu-devel@nongnu.org; Thu, 07 Mar 2019 12:30:37 -0500 Received: from mail-wr1-x442.google.com ([2a00:1450:4864:20::442]:38635) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1h1wqn-000869-OL for qemu-devel@nongnu.org; Thu, 07 Mar 2019 12:30:35 -0500 Received: by mail-wr1-x442.google.com with SMTP id g12so18406097wrm.5 for ; Thu, 07 Mar 2019 09:30:32 -0800 (PST) Received: from 640k.localdomain ([93.56.166.5]) by smtp.gmail.com with ESMTPSA id d206sm9979753wmc.11.2019.03.07.09.30.30 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Thu, 07 Mar 2019 09:30:30 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=sender:from:to:cc:subject:date:message-id:in-reply-to:references; bh=feTLCIoYdy5tnPeOnsQNprqM2qsQNbtqLifSbJa7rq8=; b=habG9bO0ZvypgGtP6BM0MGKwddQmyP7HmyPL/8jPr81HGVOhGJwx+gvesP3yg1tqfG CaUernS70EPSZMLpaAP92eY5RYBjLdlYA4Goqnws1mH3ZV2bgkvF0B9VIc4tM7kulSlb tNBczvReTU/xZEka4Wom5Uxd4ngwmDE+gQuoRipGAJusoo5OsaPML9bs3KYo+Ulw6/RO v4jHOdn8h46dVP8LaCh1mci8WGHivxI6NId4qSyNzXo3Dj7sYeIn/FUeBySdzx7y2ASJ 72PkzPALxhfd1jlrdcJM05YFriEsHXdU3Z5rasyIPIauTxUUFOEy2JaBA6Sgny2o5faQ sSKg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:sender:from:to:cc:subject:date:message-id :in-reply-to:references; bh=feTLCIoYdy5tnPeOnsQNprqM2qsQNbtqLifSbJa7rq8=; b=o51N4pATZp87ONDqBPI2Epd23wqeJi/eBz0gDokhOPoeHifPqzlrKGCRWD+B+uDgOv u35E+Gevh8BIZcKG4/Y9rwKDGEkysP/5XFg3PM387/xKJJKIc4X841wIzcoiwe4ExW0m SMmY54ypxieXtPtmIFuQbg03JkUYVa170urqcbc3/XF6UdO+26463IXRu611JOdyixbe RqpZbbSex/sGe4mRfjJ3yHNSY1qpe/R7qljC9xkpowXV4y5mqsQH2li1j2gn9Ztw0Cli w/F4cfxzjFoWRr+2S+TwurMsXIHjHXZTRoLiYo/4hjnGN5wWmjvNjKpupQx6a4J80FUs uWdw== X-Gm-Message-State: APjAAAXnvxkveXJcrS65uwhRt58p0moI8LxsCvy7Vl97hxHSTpy5yeGe k0/2tq+eWodkKMEWtpm91Ke1uw7A X-Google-Smtp-Source: APXvYqwANpd/Gkbu5xEvCTyzoQhdOPUthISo6OVd/9Ks4WJyUWYfIPYfJPlI4xOvME1GheahW2cSvg== X-Received: by 2002:adf:ed11:: with SMTP id a17mr7732838wro.283.1551979831466; Thu, 07 Mar 2019 09:30:31 -0800 (PST) From: Paolo Bonzini To: qemu-devel@nongnu.org Date: Thu, 7 Mar 2019 18:29:30 +0100 Message-Id: <1551979804-6060-24-git-send-email-pbonzini@redhat.com> X-Mailer: git-send-email 1.8.3.1 In-Reply-To: <1551979804-6060-1-git-send-email-pbonzini@redhat.com> References: <1551979804-6060-1-git-send-email-pbonzini@redhat.com> X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 2a00:1450:4864:20::442 Subject: [Qemu-devel] [PULL 23/57] tests/libqos: virtio-mmio driver and interface nodes X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: thuth@redhat.com, Emanuele Giuseppe Esposito , lviver@redhat.com Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" From: Emanuele Giuseppe Esposito Add virtio-mmio node in qgraph framework. virtio-mmio produces virtio-bus, the interface consumed by all virtio-*-dev= ice nodes. Being a memory-mapped device, it doesn't have to provide a constructor to qgraph, since it's always "contained" inside some other nodes. Signed-off-by: Emanuele Giuseppe Esposito Reviewed-by: Laurent Vivier Signed-off-by: Paolo Bonzini --- tests/libqos/virtio-mmio.c | 116 +++++++++++++++++++++++++++--------------= ---- tests/libqos/virtio-mmio.h | 6 ++- tests/virtio-blk-test.c | 3 +- 3 files changed, 77 insertions(+), 48 deletions(-) diff --git a/tests/libqos/virtio-mmio.c b/tests/libqos/virtio-mmio.c index 7aa8383..3678c07 100644 --- a/tests/libqos/virtio-mmio.c +++ b/tests/libqos/virtio-mmio.c @@ -12,74 +12,74 @@ #include "libqos/virtio.h" #include "libqos/virtio-mmio.h" #include "libqos/malloc.h" -#include "libqos/malloc-generic.h" +#include "libqos/qgraph.h" #include "standard-headers/linux/virtio_ring.h" =20 static uint8_t qvirtio_mmio_config_readb(QVirtioDevice *d, uint64_t off) { - QVirtioMMIODevice *dev =3D (QVirtioMMIODevice *)d; - return readb(dev->addr + QVIRTIO_MMIO_DEVICE_SPECIFIC + off); + QVirtioMMIODevice *dev =3D container_of(d, QVirtioMMIODevice, vdev); + return qtest_readb(dev->qts, dev->addr + QVIRTIO_MMIO_DEVICE_SPECIFIC = + off); } =20 static uint16_t qvirtio_mmio_config_readw(QVirtioDevice *d, uint64_t off) { - QVirtioMMIODevice *dev =3D (QVirtioMMIODevice *)d; - return readw(dev->addr + QVIRTIO_MMIO_DEVICE_SPECIFIC + off); + QVirtioMMIODevice *dev =3D container_of(d, QVirtioMMIODevice, vdev); + return qtest_readw(dev->qts, dev->addr + QVIRTIO_MMIO_DEVICE_SPECIFIC = + off); } =20 static uint32_t qvirtio_mmio_config_readl(QVirtioDevice *d, uint64_t off) { - QVirtioMMIODevice *dev =3D (QVirtioMMIODevice *)d; - return readl(dev->addr + QVIRTIO_MMIO_DEVICE_SPECIFIC + off); + QVirtioMMIODevice *dev =3D container_of(d, QVirtioMMIODevice, vdev); + return qtest_readl(dev->qts, dev->addr + QVIRTIO_MMIO_DEVICE_SPECIFIC = + off); } =20 static uint64_t qvirtio_mmio_config_readq(QVirtioDevice *d, uint64_t off) { - QVirtioMMIODevice *dev =3D (QVirtioMMIODevice *)d; - return readq(dev->addr + QVIRTIO_MMIO_DEVICE_SPECIFIC + off); + QVirtioMMIODevice *dev =3D container_of(d, QVirtioMMIODevice, vdev); + return qtest_readq(dev->qts, dev->addr + QVIRTIO_MMIO_DEVICE_SPECIFIC = + off); } =20 static uint32_t qvirtio_mmio_get_features(QVirtioDevice *d) { - QVirtioMMIODevice *dev =3D (QVirtioMMIODevice *)d; - writel(dev->addr + QVIRTIO_MMIO_HOST_FEATURES_SEL, 0); - return readl(dev->addr + QVIRTIO_MMIO_HOST_FEATURES); + QVirtioMMIODevice *dev =3D container_of(d, QVirtioMMIODevice, vdev); + qtest_writel(dev->qts, dev->addr + QVIRTIO_MMIO_HOST_FEATURES_SEL, 0); + return qtest_readl(dev->qts, dev->addr + QVIRTIO_MMIO_HOST_FEATURES); } =20 static void qvirtio_mmio_set_features(QVirtioDevice *d, uint32_t features) { - QVirtioMMIODevice *dev =3D (QVirtioMMIODevice *)d; + QVirtioMMIODevice *dev =3D container_of(d, QVirtioMMIODevice, vdev); dev->features =3D features; - writel(dev->addr + QVIRTIO_MMIO_GUEST_FEATURES_SEL, 0); - writel(dev->addr + QVIRTIO_MMIO_GUEST_FEATURES, features); + qtest_writel(dev->qts, dev->addr + QVIRTIO_MMIO_GUEST_FEATURES_SEL, 0); + qtest_writel(dev->qts, dev->addr + QVIRTIO_MMIO_GUEST_FEATURES, featur= es); } =20 static uint32_t qvirtio_mmio_get_guest_features(QVirtioDevice *d) { - QVirtioMMIODevice *dev =3D (QVirtioMMIODevice *)d; + QVirtioMMIODevice *dev =3D container_of(d, QVirtioMMIODevice, vdev); return dev->features; } =20 static uint8_t qvirtio_mmio_get_status(QVirtioDevice *d) { - QVirtioMMIODevice *dev =3D (QVirtioMMIODevice *)d; - return (uint8_t)readl(dev->addr + QVIRTIO_MMIO_DEVICE_STATUS); + QVirtioMMIODevice *dev =3D container_of(d, QVirtioMMIODevice, vdev); + return (uint8_t)qtest_readl(dev->qts, dev->addr + QVIRTIO_MMIO_DEVICE_= STATUS); } =20 static void qvirtio_mmio_set_status(QVirtioDevice *d, uint8_t status) { - QVirtioMMIODevice *dev =3D (QVirtioMMIODevice *)d; - writel(dev->addr + QVIRTIO_MMIO_DEVICE_STATUS, (uint32_t)status); + QVirtioMMIODevice *dev =3D container_of(d, QVirtioMMIODevice, vdev); + qtest_writel(dev->qts, dev->addr + QVIRTIO_MMIO_DEVICE_STATUS, (uint32= _t)status); } =20 static bool qvirtio_mmio_get_queue_isr_status(QVirtioDevice *d, QVirtQueue= *vq) { - QVirtioMMIODevice *dev =3D (QVirtioMMIODevice *)d; + QVirtioMMIODevice *dev =3D container_of(d, QVirtioMMIODevice, vdev); uint32_t isr; =20 - isr =3D readl(dev->addr + QVIRTIO_MMIO_INTERRUPT_STATUS) & 1; + isr =3D qtest_readl(dev->qts, dev->addr + QVIRTIO_MMIO_INTERRUPT_STATU= S) & 1; if (isr !=3D 0) { - writel(dev->addr + QVIRTIO_MMIO_INTERRUPT_ACK, 1); + qtest_writel(dev->qts, dev->addr + QVIRTIO_MMIO_INTERRUPT_ACK, 1); return true; } =20 @@ -88,12 +88,12 @@ static bool qvirtio_mmio_get_queue_isr_status(QVirtioDe= vice *d, QVirtQueue *vq) =20 static bool qvirtio_mmio_get_config_isr_status(QVirtioDevice *d) { - QVirtioMMIODevice *dev =3D (QVirtioMMIODevice *)d; + QVirtioMMIODevice *dev =3D container_of(d, QVirtioMMIODevice, vdev); uint32_t isr; =20 - isr =3D readl(dev->addr + QVIRTIO_MMIO_INTERRUPT_STATUS) & 2; + isr =3D qtest_readl(dev->qts, dev->addr + QVIRTIO_MMIO_INTERRUPT_STATU= S) & 2; if (isr !=3D 0) { - writel(dev->addr + QVIRTIO_MMIO_INTERRUPT_ACK, 2); + qtest_writel(dev->qts, dev->addr + QVIRTIO_MMIO_INTERRUPT_ACK, 2); return true; } =20 @@ -102,34 +102,34 @@ static bool qvirtio_mmio_get_config_isr_status(QVirti= oDevice *d) =20 static void qvirtio_mmio_queue_select(QVirtioDevice *d, uint16_t index) { - QVirtioMMIODevice *dev =3D (QVirtioMMIODevice *)d; - writel(dev->addr + QVIRTIO_MMIO_QUEUE_SEL, (uint32_t)index); + QVirtioMMIODevice *dev =3D container_of(d, QVirtioMMIODevice, vdev); + qtest_writel(dev->qts, dev->addr + QVIRTIO_MMIO_QUEUE_SEL, (uint32_t)i= ndex); =20 - g_assert_cmphex(readl(dev->addr + QVIRTIO_MMIO_QUEUE_PFN), =3D=3D, 0); + g_assert_cmphex(qtest_readl(dev->qts, dev->addr + QVIRTIO_MMIO_QUEUE_P= FN), =3D=3D, 0); } =20 static uint16_t qvirtio_mmio_get_queue_size(QVirtioDevice *d) { - QVirtioMMIODevice *dev =3D (QVirtioMMIODevice *)d; - return (uint16_t)readl(dev->addr + QVIRTIO_MMIO_QUEUE_NUM_MAX); + QVirtioMMIODevice *dev =3D container_of(d, QVirtioMMIODevice, vdev); + return (uint16_t)qtest_readl(dev->qts, dev->addr + QVIRTIO_MMIO_QUEUE_= NUM_MAX); } =20 static void qvirtio_mmio_set_queue_address(QVirtioDevice *d, uint32_t pfn) { - QVirtioMMIODevice *dev =3D (QVirtioMMIODevice *)d; - writel(dev->addr + QVIRTIO_MMIO_QUEUE_PFN, pfn); + QVirtioMMIODevice *dev =3D container_of(d, QVirtioMMIODevice, vdev); + qtest_writel(dev->qts, dev->addr + QVIRTIO_MMIO_QUEUE_PFN, pfn); } =20 static QVirtQueue *qvirtio_mmio_virtqueue_setup(QVirtioDevice *d, QGuestAllocator *alloc, uint16_t i= ndex) { - QVirtioMMIODevice *dev =3D (QVirtioMMIODevice *)d; + QVirtioMMIODevice *dev =3D container_of(d, QVirtioMMIODevice, vdev); QVirtQueue *vq; uint64_t addr; =20 vq =3D g_malloc0(sizeof(*vq)); qvirtio_mmio_queue_select(d, index); - writel(dev->addr + QVIRTIO_MMIO_QUEUE_ALIGN, dev->page_size); + qtest_writel(dev->qts, dev->addr + QVIRTIO_MMIO_QUEUE_ALIGN, dev->page= _size); =20 vq->index =3D index; vq->size =3D qvirtio_mmio_get_queue_size(d); @@ -139,7 +139,7 @@ static QVirtQueue *qvirtio_mmio_virtqueue_setup(QVirtio= Device *d, vq->indirect =3D (dev->features & (1u << VIRTIO_RING_F_INDIRECT_DESC))= !=3D 0; vq->event =3D (dev->features & (1u << VIRTIO_RING_F_EVENT_IDX)) !=3D 0; =20 - writel(dev->addr + QVIRTIO_MMIO_QUEUE_NUM, vq->size); + qtest_writel(dev->qts, dev->addr + QVIRTIO_MMIO_QUEUE_NUM, vq->size); =20 /* Check different than 0 */ g_assert_cmpint(vq->size, !=3D, 0); @@ -163,8 +163,8 @@ static void qvirtio_mmio_virtqueue_cleanup(QVirtQueue *= vq, =20 static void qvirtio_mmio_virtqueue_kick(QVirtioDevice *d, QVirtQueue *vq) { - QVirtioMMIODevice *dev =3D (QVirtioMMIODevice *)d; - writel(dev->addr + QVIRTIO_MMIO_QUEUE_NOTIFY, vq->index); + QVirtioMMIODevice *dev =3D container_of(d, QVirtioMMIODevice, vdev); + qtest_writel(dev->qts, dev->addr + QVIRTIO_MMIO_QUEUE_NOTIFY, vq->inde= x); } =20 const QVirtioBus qvirtio_mmio =3D { @@ -187,21 +187,45 @@ const QVirtioBus qvirtio_mmio =3D { .virtqueue_kick =3D qvirtio_mmio_virtqueue_kick, }; =20 -QVirtioMMIODevice *qvirtio_mmio_init_device(uint64_t addr, uint32_t page_s= ize) +static void *qvirtio_mmio_get_driver(void *obj, const char *interface) { - QVirtioMMIODevice *dev; - uint32_t magic; - dev =3D g_malloc0(sizeof(*dev)); + QVirtioMMIODevice *virtio_mmio =3D obj; + if (!g_strcmp0(interface, "virtio-bus")) { + return &virtio_mmio->vdev; + } + fprintf(stderr, "%s not present in virtio-mmio\n", interface); + g_assert_not_reached(); +} + +static void qvirtio_mmio_start_hw(QOSGraphObject *obj) +{ + QVirtioMMIODevice *dev =3D (QVirtioMMIODevice *) obj; + qvirtio_start_device(&dev->vdev); +} =20 - magic =3D readl(addr + QVIRTIO_MMIO_MAGIC_VALUE); +void qvirtio_mmio_init_device(QVirtioMMIODevice *dev, QTestState *qts, + uint64_t addr, uint32_t page_size) +{ + uint32_t magic; + magic =3D qtest_readl(qts, addr + QVIRTIO_MMIO_MAGIC_VALUE); g_assert(magic =3D=3D ('v' | 'i' << 8 | 'r' << 16 | 't' << 24)); =20 + dev->qts =3D qts; dev->addr =3D addr; dev->page_size =3D page_size; - dev->vdev.device_type =3D readl(addr + QVIRTIO_MMIO_DEVICE_ID); + dev->vdev.device_type =3D qtest_readl(qts, addr + QVIRTIO_MMIO_DEVICE_= ID); dev->vdev.bus =3D &qvirtio_mmio; =20 - writel(addr + QVIRTIO_MMIO_GUEST_PAGE_SIZE, page_size); + qtest_writel(qts, addr + QVIRTIO_MMIO_GUEST_PAGE_SIZE, page_size); + + dev->obj.get_driver =3D qvirtio_mmio_get_driver; + dev->obj.start_hw =3D qvirtio_mmio_start_hw; +} =20 - return dev; +static void virtio_mmio_register_nodes(void) +{ + qos_node_create_driver("virtio-mmio", NULL); + qos_node_produces("virtio-mmio", "virtio-bus"); } + +libqos_init(virtio_mmio_register_nodes); diff --git a/tests/libqos/virtio-mmio.h b/tests/libqos/virtio-mmio.h index e3e52b9..17a1714 100644 --- a/tests/libqos/virtio-mmio.h +++ b/tests/libqos/virtio-mmio.h @@ -11,6 +11,7 @@ #define LIBQOS_VIRTIO_MMIO_H =20 #include "libqos/virtio.h" +#include "libqos/qgraph.h" =20 #define QVIRTIO_MMIO_MAGIC_VALUE 0x000 #define QVIRTIO_MMIO_VERSION 0x004 @@ -33,7 +34,9 @@ #define QVIRTIO_MMIO_DEVICE_SPECIFIC 0x100 =20 typedef struct QVirtioMMIODevice { + QOSGraphObject obj; QVirtioDevice vdev; + QTestState *qts; uint64_t addr; uint32_t page_size; uint32_t features; /* As it cannot be read later, save it */ @@ -41,6 +44,7 @@ typedef struct QVirtioMMIODevice { =20 extern const QVirtioBus qvirtio_mmio; =20 -QVirtioMMIODevice *qvirtio_mmio_init_device(uint64_t addr, uint32_t page_s= ize); +void qvirtio_mmio_init_device(QVirtioMMIODevice *dev, QTestState *qts, + uint64_t addr, uint32_t page_size); =20 #endif diff --git a/tests/virtio-blk-test.c b/tests/virtio-blk-test.c index 8f8ef19..3a8126f 100644 --- a/tests/virtio-blk-test.c +++ b/tests/virtio-blk-test.c @@ -833,7 +833,8 @@ static void mmio_basic(void) =20 arm_test_start(); =20 - dev =3D qvirtio_mmio_init_device(MMIO_DEV_BASE_ADDR, MMIO_PAGE_SIZE); + dev =3D g_malloc0(sizeof(QVirtioMMIODevice)); + qvirtio_mmio_init_device(dev, global_qtest, MMIO_DEV_BASE_ADDR, MMIO_P= AGE_SIZE); g_assert(dev !=3D NULL); g_assert_cmphex(dev->vdev.device_type, =3D=3D, VIRTIO_ID_BLOCK); =20 --=20 1.8.3.1