From nobody Tue Nov 4 22:00:42 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 1533567092796665.8886127443309; Mon, 6 Aug 2018 07:51:32 -0700 (PDT) Received: from localhost ([::1]:34439 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1fmgr5-0002kY-GB for importer@patchew.org; Mon, 06 Aug 2018 10:51:31 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:35699) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1fmgb5-000540-3q for qemu-devel@nongnu.org; Mon, 06 Aug 2018 10:35:00 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1fmgb3-0000v3-P3 for qemu-devel@nongnu.org; Mon, 06 Aug 2018 10:34:59 -0400 Received: from mail-ed1-x541.google.com ([2a00:1450:4864:20::541]:35057) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1fmgb3-0000uK-Dp for qemu-devel@nongnu.org; Mon, 06 Aug 2018 10:34:57 -0400 Received: by mail-ed1-x541.google.com with SMTP id e6-v6so5262682edr.2 for ; Mon, 06 Aug 2018 07:34:57 -0700 (PDT) Received: from localhost.localdomain ([194.230.159.126]) by smtp.gmail.com with ESMTPSA id x13-v6sm14615157edx.17.2018.08.06.07.34.55 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Mon, 06 Aug 2018 07:34:55 -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=jwZTOZCwdFx4STLu8DxbPeFqIhLBb9b8g6LApKYoeQk=; b=JnxT22OE0K+delttZ4UPcwB/fJhdeByDgRLCfCCgWOlRkwM9cHbdzwitjzXlIUsNcR 8tKc6yLlYeeYMk/oFoZ10Cwr2P8a+PTDE79tvStz7V5TVxbylqj0HGUg3N3PChx2nom3 i2oA5S4yHuEoQb2wb63EO7z7G1T8Odd7WJwfrFfA1WMuTVa2Xy5Tw6mZXebdJ256BSSB RuwSLqfY7vxH+KmqQtQwyGUsV+3cyAfCx5kWWKgHjuYrBNqaYVgWtWT7hS6Jqdj+Vegh zzYW81Dc5WKlZ5t1TEFIxlqE1Ua45FMhfy9nk39okOMMNe/BTFkhsfotLHJmkk9RyH45 FXAQ== 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=jwZTOZCwdFx4STLu8DxbPeFqIhLBb9b8g6LApKYoeQk=; b=nPjpoalXxHFaNs0P8DyO8mSZx6AssIFpD4NP4NqqQGkfjNb003YGuo7fwZlOLjc3Y0 NsvroeZeGOvXg3bdhuQW1kNHDbNi8FOUYARVmHvPSv4KcCRb7YBUscdWNt5UxoDMq3bq 9S34sQDPslqwlTc0MvEZQ/0xHEm/qQezjd+FXEPWro5nesmvLpEUysKLjSfCJHtCtPJo D2w4ud48mTP9dQXZ2izjubX4TNA1P1QjhGOxvVIy2xclD1DjNV2WTFd/OaErbaGWaCpO 6sIdvUyGwH0nCbc+2YAMLn/fs7zRNbT410f20KPVLxo95zaGaRwVnLaBiFWdoENlZs9E +/yg== X-Gm-Message-State: AOUpUlG0UAX8X1uhgoxTcskhPMzAHCXrkOoPm7vmTMKQ4JUzo+K4Y9um CCUv2FBWVzOcWFw6oYCS6zw= X-Google-Smtp-Source: AAOMgpcNMxLK6AzdiDpE/OAvGRgFj/3DiuDSZkLSW4mwZDs2ngr3+gXRi6lm6u3Uus+acP0SyVGJ3Q== X-Received: by 2002:a50:9a02:: with SMTP id o2-v6mr18610956edb.236.1533566096363; Mon, 06 Aug 2018 07:34:56 -0700 (PDT) From: Emanuele Giuseppe Esposito To: Paolo Bonzini Date: Mon, 6 Aug 2018 16:33:54 +0200 Message-Id: <20180806143412.27722-17-e.emanuelegiuseppe@gmail.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20180806143412.27722-1-e.emanuelegiuseppe@gmail.com> References: <20180806143412.27722-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 v2 16/34] test/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 , Stefan Hajnoczi , Emanuele Giuseppe Esposito , =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= , qemu-devel@nongnu.org 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. Signed-off-by: Emanuele Giuseppe Esposito --- tests/libqos/virtio-mmio.c | 70 ++++++++++++++++++++++++++++---------- tests/libqos/virtio-mmio.h | 4 +++ 2 files changed, 56 insertions(+), 18 deletions(-) diff --git a/tests/libqos/virtio-mmio.c b/tests/libqos/virtio-mmio.c index 6f4c1b0955..68bceb9a17 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,36 @@ const QVirtioBus qvirtio_mmio =3D { .virtqueue_kick =3D qvirtio_mmio_virtqueue_kick, }; =20 +static void *qvirtio_mmio_get_driver(void *obj, const char *interface) +{ + QVirtioMMIODevice *virtio_mmio =3D obj; + if (!g_strcmp0(interface, "virtio")) { + return &virtio_mmio->vdev; + } + printf("%s not present in virtio-mmio\n", interface); + abort(); +} + QVirtioMMIODevice *qvirtio_mmio_device_new(uint64_t addr, uint32_t page_si= ze) { QVirtioMMIODevice *dev; - uint32_t magic; dev =3D g_malloc0(sizeof(*dev)); =20 + qvirtio_mmio_init_device(dev, addr, page_size); + + return dev; +} + +static void qvirtio_mmio_start_hw(QOSGraphObject *obj) +{ + QVirtioMMIODevice *dev =3D (QVirtioMMIODevice *) obj; + qvirtio_start_device(&dev->vdev); +} + +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 +228,14 @@ QVirtioMMIODevice *qvirtio_mmio_device_new(uint64_t ad= dr, 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(void) +{ + qos_node_create_driver("virtio-mmio", NULL); + qos_node_produces("virtio-mmio", "virtio"); +} + +libqos_init(virtio_mmio); diff --git a/tests/libqos/virtio-mmio.h b/tests/libqos/virtio-mmio.h index bcc09895fd..9d5af70cfc 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; @@ -42,5 +44,7 @@ typedef struct QVirtioMMIODevice { extern const QVirtioBus qvirtio_mmio; =20 QVirtioMMIODevice *qvirtio_mmio_device_new(uint64_t addr, uint32_t page_si= ze); +void qvirtio_mmio_init_device(QVirtioMMIODevice *dev, uint64_t addr, + uint32_t page_size); =20 #endif --=20 2.17.1