From nobody Wed Nov 5 10:47:35 2025 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.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 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail(p=none dis=none) header.from=gmail.com Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 1534156556724500.4004364323756; Mon, 13 Aug 2018 03:35:56 -0700 (PDT) Received: from localhost ([::1]:38669 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1fpACZ-0001fC-IX for importer@patchew.org; Mon, 13 Aug 2018 06:35:55 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:43905) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1fp9t2-0007Ww-Bj for qemu-devel@nongnu.org; Mon, 13 Aug 2018 06:15:47 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1fp9t0-0002c0-RL for qemu-devel@nongnu.org; Mon, 13 Aug 2018 06:15:44 -0400 Received: from mail-ed1-x541.google.com ([2a00:1450:4864:20::541]:44345) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1fp9t0-0002aZ-HW; Mon, 13 Aug 2018 06:15:42 -0400 Received: by mail-ed1-x541.google.com with SMTP id f23-v6so7941511edr.11; Mon, 13 Aug 2018 03:15:42 -0700 (PDT) Received: from localhost.localdomain ([194.230.159.125]) by smtp.gmail.com with ESMTPSA id s27-v6sm11670006edb.73.2018.08.13.03.15.35 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Mon, 13 Aug 2018 03:15:40 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=WkxSd5dIkx+P8DEUUMpCT8APty2xqjqTOZ2RsogGT1s=; b=qaOUp8jazImI1WgZepgVjqV1qGN1ptb6Muz0Uvv7AhKJy9m0hAQowy22a3d6Po/ioJ 9MlHj0yWbmLFDH8spn8b4nhbljZYj8sjsRNtznOI5oEKKhd95DSAIZpv29U+a6LnU4Vo 9zRAn9Av8hId3iIh1u1PRWYNbrTHj/LdKh7htp9m29x34lvUFBFYxa5kbnGOOHIR0dIV ofdtYs2b4He718n4eaBbokSljmWIfIuw3coBbmOcc/ilqCRBGt202hPE9p+/IcyT/FqW rWheOYFowuAMUN1zrA77Q7L5Rq9lGov3ruHKkGUf36wMVjRum73gWrC48b0j+fy8c17H 3EYg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=WkxSd5dIkx+P8DEUUMpCT8APty2xqjqTOZ2RsogGT1s=; b=C+CFv3RqXw12PiL8R7CXm4+KXTZLDPSXUfs+9tymUxnYdRtRoUlg5gRvqUzlFDI5cC kMojhsIvMTmifvciBt0zPq/guECKWTXsQXf0VzXR15BTo8YQZotBUPuXILzkfz54l9PD BIx9VNPYYYMGRLrmk4sF7bUrQdmIdPJA1jeK9Ecc+FpkiJ3RkGWct+sJtXQKDHAcrMT4 LmcVYbXPuO104MGuWOsUSU2hTS/baYobaXCir0HfH2juW4+7FSViuG9jnvePCTJjFZjT gb1BtCiz4KFl3JO7FKZYeCs4R2YAYj/jC06oFMTXjfix7/ufflFHrbBGy9mCt8pESDDA AtNA== X-Gm-Message-State: AOUpUlHYCxDIdhH1UVlqWrnrJvcpN2l4tUFfuwmEUlUyoFU7bxyxdYUc 7r8QWQbrqgy/MWklgP75o03nF1VqngE= X-Google-Smtp-Source: AA+uWPx278GE7OqzhMUjyrf4rM4vwjTXyDcxDwy3XwtdkWJ7WN60UrEuIp2oqcbg2Lj7ulTcuxrP3Q== X-Received: by 2002:a50:a542:: with SMTP id z2-v6mr20945830edb.77.1534155341232; Mon, 13 Aug 2018 03:15:41 -0700 (PDT) From: Emanuele Giuseppe Esposito To: qemu-devel@nongnu.org Date: Mon, 13 Aug 2018 12:14:35 +0200 Message-Id: <20180813101453.10200-16-e.emanuelegiuseppe@gmail.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20180813101453.10200-1-e.emanuelegiuseppe@gmail.com> References: <20180813101453.10200-1-e.emanuelegiuseppe@gmail.com> X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 2a00:1450:4864:20::541 Subject: [Qemu-devel] [PATCH 15/33] tests/qgraph: 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: Laurent Vivier , Fam Zheng , qemu-block@nongnu.org, "Michael S. Tsirkin" , Jason Wang , Amit Shah , Emanuele Giuseppe Esposito , Alexander Graf , =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= , Greg Kurz , qemu-ppc@nongnu.org, Gerd Hoffmann , Stefan Hajnoczi , Paolo Bonzini , John Snow , David Gibson Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) X-ZohoMail: RDMRC_1 RDKM_2 RSF_0 Z_629925259 SPT_0 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Add virtio-mmio node in qgraph framework. virtio-mmio produces virtio, the interface consumed by all virtio-*-device 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. Also rename qvirtio_mmio_init_device in qvirtio_mmio_device_new, since the = function actually allocates a new QVirtioMMIODevice and initialize it. Signed-off-by: Emanuele Giuseppe Esposito Reviewed-by: Laurent Vivier --- tests/libqos/virtio-mmio.c | 66 ++++++++++++++++++++++++++------------ tests/libqos/virtio-mmio.h | 5 ++- tests/virtio-blk-test.c | 3 +- 3 files changed, 51 insertions(+), 23 deletions(-) diff --git a/tests/libqos/virtio-mmio.c b/tests/libqos/virtio-mmio.c index 7aa8383338..61ed0e549b 100644 --- a/tests/libqos/virtio-mmio.c +++ b/tests/libqos/virtio-mmio.c @@ -13,42 +13,43 @@ #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; + QVirtioMMIODevice *dev =3D container_of(d, QVirtioMMIODevice, vdev); return readb(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; + QVirtioMMIODevice *dev =3D container_of(d, QVirtioMMIODevice, vdev); return readw(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; + QVirtioMMIODevice *dev =3D container_of(d, QVirtioMMIODevice, vdev); return readl(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; + QVirtioMMIODevice *dev =3D container_of(d, QVirtioMMIODevice, vdev); return readq(dev->addr + QVIRTIO_MMIO_DEVICE_SPECIFIC + off); } =20 static uint32_t qvirtio_mmio_get_features(QVirtioDevice *d) { - QVirtioMMIODevice *dev =3D (QVirtioMMIODevice *)d; + QVirtioMMIODevice *dev =3D container_of(d, QVirtioMMIODevice, vdev); writel(dev->addr + QVIRTIO_MMIO_HOST_FEATURES_SEL, 0); return readl(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); @@ -56,25 +57,25 @@ static void qvirtio_mmio_set_features(QVirtioDevice *d,= uint32_t features) =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; + QVirtioMMIODevice *dev =3D container_of(d, QVirtioMMIODevice, vdev); return (uint8_t)readl(dev->addr + QVIRTIO_MMIO_DEVICE_STATUS); } =20 static void qvirtio_mmio_set_status(QVirtioDevice *d, uint8_t status) { - QVirtioMMIODevice *dev =3D (QVirtioMMIODevice *)d; + QVirtioMMIODevice *dev =3D container_of(d, QVirtioMMIODevice, vdev); writel(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; @@ -88,7 +89,7 @@ static bool qvirtio_mmio_get_queue_isr_status(QVirtioDevi= ce *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; @@ -102,7 +103,7 @@ static bool qvirtio_mmio_get_config_isr_status(QVirtioD= evice *d) =20 static void qvirtio_mmio_queue_select(QVirtioDevice *d, uint16_t index) { - QVirtioMMIODevice *dev =3D (QVirtioMMIODevice *)d; + QVirtioMMIODevice *dev =3D container_of(d, QVirtioMMIODevice, vdev); writel(dev->addr + QVIRTIO_MMIO_QUEUE_SEL, (uint32_t)index); =20 g_assert_cmphex(readl(dev->addr + QVIRTIO_MMIO_QUEUE_PFN), =3D=3D, 0); @@ -110,20 +111,20 @@ static void qvirtio_mmio_queue_select(QVirtioDevice *= d, uint16_t index) =20 static uint16_t qvirtio_mmio_get_queue_size(QVirtioDevice *d) { - QVirtioMMIODevice *dev =3D (QVirtioMMIODevice *)d; + QVirtioMMIODevice *dev =3D container_of(d, QVirtioMMIODevice, vdev); return (uint16_t)readl(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; + QVirtioMMIODevice *dev =3D container_of(d, QVirtioMMIODevice, vdev); writel(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 @@ -163,7 +164,7 @@ static void qvirtio_mmio_virtqueue_cleanup(QVirtQueue *= vq, =20 static void qvirtio_mmio_virtqueue_kick(QVirtioDevice *d, QVirtQueue *vq) { - QVirtioMMIODevice *dev =3D (QVirtioMMIODevice *)d; + QVirtioMMIODevice *dev =3D container_of(d, QVirtioMMIODevice, vdev); writel(dev->addr + QVIRTIO_MMIO_QUEUE_NOTIFY, vq->index); } =20 @@ -187,12 +188,26 @@ 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")) { + 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 +void qvirtio_mmio_init_device(QVirtioMMIODevice *dev, uint64_t addr, + uint32_t page_size) +{ + uint32_t magic; magic =3D readl(addr + QVIRTIO_MMIO_MAGIC_VALUE); g_assert(magic =3D=3D ('v' | 'i' << 8 | 'r' << 16 | 't' << 24)); =20 @@ -203,5 +218,14 @@ QVirtioMMIODevice *qvirtio_mmio_init_device(uint64_t a= ddr, uint32_t page_size) =20 writel(addr + QVIRTIO_MMIO_GUEST_PAGE_SIZE, page_size); =20 - return dev; + dev->obj.get_driver =3D qvirtio_mmio_get_driver; + dev->obj.start_hw =3D qvirtio_mmio_start_hw; +} + +static void virtio_mmio_register_nodes(void) +{ + qos_node_create_driver("virtio-mmio", NULL); + qos_node_produces("virtio-mmio", "virtio"); } + +libqos_init(virtio_mmio_register_nodes); diff --git a/tests/libqos/virtio-mmio.h b/tests/libqos/virtio-mmio.h index e3e52b9ce1..aadc60d6ed 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,6 +34,7 @@ #define QVIRTIO_MMIO_DEVICE_SPECIFIC 0x100 =20 typedef struct QVirtioMMIODevice { + QOSGraphObject obj; QVirtioDevice vdev; uint64_t addr; uint32_t page_size; @@ -41,6 +43,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, uint64_t addr, + uint32_t page_size); =20 #endif diff --git a/tests/virtio-blk-test.c b/tests/virtio-blk-test.c index 66797d0348..e60b33c38a 100644 --- a/tests/virtio-blk-test.c +++ b/tests/virtio-blk-test.c @@ -709,7 +709,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, MMIO_DEV_BASE_ADDR, MMIO_PAGE_SIZE); g_assert(dev !=3D NULL); g_assert_cmphex(dev->vdev.device_type, =3D=3D, VIRTIO_ID_BLOCK); =20 --=20 2.17.1