From nobody Sun Nov 9 22:26:49 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 15519819572940.2837684104830487; Thu, 7 Mar 2019 10:05:57 -0800 (PST) Received: from localhost ([127.0.0.1]:56598 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1h1xOz-0006rz-5M for importer@patchew.org; Thu, 07 Mar 2019 13:05:53 -0500 Received: from eggs.gnu.org ([209.51.188.92]:39427) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1h1wqg-00033C-F4 for qemu-devel@nongnu.org; Thu, 07 Mar 2019 12:30:27 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1h1wqf-00080t-9y for qemu-devel@nongnu.org; Thu, 07 Mar 2019 12:30:26 -0500 Received: from mail-wr1-x443.google.com ([2a00:1450:4864:20::443]:38635) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1h1wqf-000800-05 for qemu-devel@nongnu.org; Thu, 07 Mar 2019 12:30:25 -0500 Received: by mail-wr1-x443.google.com with SMTP id g12so18405556wrm.5 for ; Thu, 07 Mar 2019 09:30:24 -0800 (PST) Received: from 640k.localdomain ([93.56.166.5]) by smtp.gmail.com with ESMTPSA id d206sm9979753wmc.11.2019.03.07.09.30.22 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Thu, 07 Mar 2019 09:30:23 -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=3a8rzlsoySZRtDZAwm052QNWwR1TWW7HR2xTrEHHtfk=; b=gPBs5aGRCbBDkGK9fxWnPCC6l8L72aN6P8vkqygnrPgtwrB63GL4s3OgtZWv6K937/ rfi9TbqZul38TWb32Eydgk2kVcuUUh/IjuvL8GDD5b3mPaxh8+nC3MEomiKOA1ZpQ65j SV4IlHt9HLwd6FRmwcxLM6bSP4NWe6WDh6iKdC6wumidvaWR9qcZdUcJgtUjLUPN9ACX +Q1ZPCUM/5UTg54L4D5j6psitl1+74LoBIM9Jvj24X3VYdmBggGpMrg6d2Md75JiqeYK 2a7EzGiZpC27mHJGmcMt1AQlGJmD+lsbeN62hofQ2efPJHWh+z6slnhTUUYCpnzZ6/ax Ob+Q== 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=3a8rzlsoySZRtDZAwm052QNWwR1TWW7HR2xTrEHHtfk=; b=UPF2fXyY9jIfkX57X0lJMqWcqQ4U/0JK1b4P8Ks0XsmblYr0uwAHdvdkyR3Ja81/qw OcYyJRDLmVQncqMrs1n63gkyUDs2CgRhR2UdDJYTl2UD6nVfo3BMxNc7R5ezElU9USC/ 3m6Tz2InkAfsYfzxu9/xaHM46hZ5MyG89j/gm/XVVShVTpbDQZkcF9pxd9HsF7cy5JlA ZMXaOXIFq7IBLeOnVP26FDEWe3EGwZ5tA7VjLQ36qZ2MVGQU53TmbzgL1sfibrfPBfJ+ UxrliAF/c4uGEjrJko2GSx9ppl2/AABxL77V5Dniuh6A7lfQt/S/Fy1PWONHVMtLkiyx gtMQ== X-Gm-Message-State: APjAAAXjmKFUmg+mQ0OBFYU9gAju/e6mh4vAYuQMdiqG4fUl5cTH5cEn sgXUPtN2axNDnJYvpG/KzH7z2Coz X-Google-Smtp-Source: APXvYqzPVXYPhL3RXF+UBzXF6akzBZdkVRVj2Gle0oORimHOVq5+QTGxHx4mKPa6xdYDVO1VJcRnMg== X-Received: by 2002:a5d:4804:: with SMTP id l4mr7970511wrq.177.1551979823566; Thu, 07 Mar 2019 09:30:23 -0800 (PST) From: Paolo Bonzini To: qemu-devel@nongnu.org Date: Thu, 7 Mar 2019 18:29:23 +0100 Message-Id: <1551979804-6060-17-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::443 Subject: [Qemu-devel] [PULL 16/57] tests/libqos: pci-spapr 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 pci-bus-spapr node, that produces pci-bus. Move QPCIBusSPAPR struct declaration in its header (since it will be needed by other drivers) and introduce a setter method for drivers that do not need to allocate but have to initialize QPCIBusSPAPR. Signed-off-by: Emanuele Giuseppe Esposito Signed-off-by: Paolo Bonzini --- tests/Makefile.include | 2 +- tests/libqos/pci-spapr.c | 116 +++++++++++++++++++++++++------------------= ---- tests/libqos/pci-spapr.h | 24 ++++++++++ 3 files changed, 88 insertions(+), 54 deletions(-) diff --git a/tests/Makefile.include b/tests/Makefile.include index 4391b7f..37ca530 100644 --- a/tests/Makefile.include +++ b/tests/Makefile.include @@ -748,7 +748,7 @@ libqos-virtio-obj-y =3D $(libqos-spapr-obj-y) $(libqos-= pc-obj-y) tests/libqos/virt =20 # Devices qos-test-obj-y =3D tests/qos-test.o $(libqgraph-obj-y) -qos-test-obj-y +=3D $(libqos-pc-obj-y) +qos-test-obj-y +=3D $(libqos-pc-obj-y) $(libqos-spapr-obj-y) qos-test-obj-y +=3D tests/libqos/sdhci.o =20 # Machines diff --git a/tests/libqos/pci-spapr.c b/tests/libqos/pci-spapr.c index 59679f6..d9b87a7 100644 --- a/tests/libqos/pci-spapr.c +++ b/tests/libqos/pci-spapr.c @@ -9,33 +9,13 @@ #include "libqtest.h" #include "libqos/pci-spapr.h" #include "libqos/rtas.h" +#include "libqos/qgraph.h" =20 #include "hw/pci/pci_regs.h" =20 #include "qemu-common.h" #include "qemu/host-utils.h" =20 - -/* From include/hw/pci-host/spapr.h */ - -typedef struct QPCIWindow { - uint64_t pci_base; /* window address in PCI space */ - uint64_t size; /* window size */ -} QPCIWindow; - -typedef struct QPCIBusSPAPR { - QPCIBus bus; - QGuestAllocator *alloc; - - uint64_t buid; - - uint64_t pio_cpu_base; - QPCIWindow pio; - - uint64_t mmio32_cpu_base; - QPCIWindow mmio32; -} QPCIBusSPAPR; - /* * PCI devices are always little-endian * SPAPR by default is big-endian @@ -160,60 +140,90 @@ static void qpci_spapr_config_writel(QPCIBus *bus, in= t devfn, uint8_t offset, #define SPAPR_PCI_MMIO32_WIN_SIZE 0x80000000 /* 2 GiB */ #define SPAPR_PCI_IO_WIN_SIZE 0x10000 =20 -QPCIBus *qpci_new_spapr(QTestState *qts, QGuestAllocator *alloc) +static void *qpci_spapr_get_driver(void *obj, const char *interface) { - QPCIBusSPAPR *ret =3D g_new0(QPCIBusSPAPR, 1); + QPCIBusSPAPR *qpci =3D obj; + if (!g_strcmp0(interface, "pci-bus")) { + return &qpci->bus; + } + fprintf(stderr, "%s not present in pci-bus-spapr", interface); + g_assert_not_reached(); +} =20 +void qpci_init_spapr(QPCIBusSPAPR *qpci, QTestState *qts, + QGuestAllocator *alloc) +{ assert(qts); =20 - ret->alloc =3D alloc; + qpci->alloc =3D alloc; =20 - ret->bus.pio_readb =3D qpci_spapr_pio_readb; - ret->bus.pio_readw =3D qpci_spapr_pio_readw; - ret->bus.pio_readl =3D qpci_spapr_pio_readl; - ret->bus.pio_readq =3D qpci_spapr_pio_readq; + qpci->bus.pio_readb =3D qpci_spapr_pio_readb; + qpci->bus.pio_readw =3D qpci_spapr_pio_readw; + qpci->bus.pio_readl =3D qpci_spapr_pio_readl; + qpci->bus.pio_readq =3D qpci_spapr_pio_readq; =20 - ret->bus.pio_writeb =3D qpci_spapr_pio_writeb; - ret->bus.pio_writew =3D qpci_spapr_pio_writew; - ret->bus.pio_writel =3D qpci_spapr_pio_writel; - ret->bus.pio_writeq =3D qpci_spapr_pio_writeq; + qpci->bus.pio_writeb =3D qpci_spapr_pio_writeb; + qpci->bus.pio_writew =3D qpci_spapr_pio_writew; + qpci->bus.pio_writel =3D qpci_spapr_pio_writel; + qpci->bus.pio_writeq =3D qpci_spapr_pio_writeq; =20 - ret->bus.memread =3D qpci_spapr_memread; - ret->bus.memwrite =3D qpci_spapr_memwrite; + qpci->bus.memread =3D qpci_spapr_memread; + qpci->bus.memwrite =3D qpci_spapr_memwrite; =20 - ret->bus.config_readb =3D qpci_spapr_config_readb; - ret->bus.config_readw =3D qpci_spapr_config_readw; - ret->bus.config_readl =3D qpci_spapr_config_readl; + qpci->bus.config_readb =3D qpci_spapr_config_readb; + qpci->bus.config_readw =3D qpci_spapr_config_readw; + qpci->bus.config_readl =3D qpci_spapr_config_readl; =20 - ret->bus.config_writeb =3D qpci_spapr_config_writeb; - ret->bus.config_writew =3D qpci_spapr_config_writew; - ret->bus.config_writel =3D qpci_spapr_config_writel; + qpci->bus.config_writeb =3D qpci_spapr_config_writeb; + qpci->bus.config_writew =3D qpci_spapr_config_writew; + qpci->bus.config_writel =3D qpci_spapr_config_writel; =20 /* FIXME: We assume the default location of the PHB for now. * Ideally we'd parse the device tree deposited in the guest to * get the window locations */ - ret->buid =3D 0x800000020000000ULL; + qpci->buid =3D 0x800000020000000ULL; =20 - ret->pio_cpu_base =3D SPAPR_PCI_BASE; - ret->pio.pci_base =3D 0; - ret->pio.size =3D SPAPR_PCI_IO_WIN_SIZE; + qpci->pio_cpu_base =3D SPAPR_PCI_BASE; + qpci->pio.pci_base =3D 0; + qpci->pio.size =3D SPAPR_PCI_IO_WIN_SIZE; =20 /* 32-bit portion of the MMIO window is at PCI address 2..4 GiB */ - ret->mmio32_cpu_base =3D SPAPR_PCI_BASE; - ret->mmio32.pci_base =3D SPAPR_PCI_MMIO32_WIN_SIZE; - ret->mmio32.size =3D SPAPR_PCI_MMIO32_WIN_SIZE; + qpci->mmio32_cpu_base =3D SPAPR_PCI_BASE; + qpci->mmio32.pci_base =3D SPAPR_PCI_MMIO32_WIN_SIZE; + qpci->mmio32.size =3D SPAPR_PCI_MMIO32_WIN_SIZE; =20 - ret->bus.qts =3D qts; - ret->bus.pio_alloc_ptr =3D 0xc000; - ret->bus.mmio_alloc_ptr =3D ret->mmio32.pci_base; - ret->bus.mmio_limit =3D ret->mmio32.pci_base + ret->mmio32.size; + qpci->bus.qts =3D qts; + qpci->bus.pio_alloc_ptr =3D 0xc000; + qpci->bus.mmio_alloc_ptr =3D qpci->mmio32.pci_base; + qpci->bus.mmio_limit =3D qpci->mmio32.pci_base + qpci->mmio32.size; =20 - return &ret->bus; + qpci->obj.get_driver =3D qpci_spapr_get_driver; +} + +QPCIBus *qpci_new_spapr(QTestState *qts, QGuestAllocator *alloc) +{ + QPCIBusSPAPR *qpci =3D g_new0(QPCIBusSPAPR, 1); + qpci_init_spapr(qpci, qts, alloc); + + return &qpci->bus; } =20 void qpci_free_spapr(QPCIBus *bus) { - QPCIBusSPAPR *s =3D container_of(bus, QPCIBusSPAPR, bus); + QPCIBusSPAPR *s; + + if (!bus) { + return; + } + s =3D container_of(bus, QPCIBusSPAPR, bus); =20 g_free(s); } + +static void qpci_spapr_register_nodes(void) +{ + qos_node_create_driver("pci-bus-spapr", NULL); + qos_node_produces("pci-bus-spapr", "pci-bus"); +} + +libqos_init(qpci_spapr_register_nodes); diff --git a/tests/libqos/pci-spapr.h b/tests/libqos/pci-spapr.h index 177e8c0..d9e2563 100644 --- a/tests/libqos/pci-spapr.h +++ b/tests/libqos/pci-spapr.h @@ -10,7 +10,31 @@ =20 #include "libqos/malloc.h" #include "libqos/pci.h" +#include "libqos/qgraph.h" =20 +/* From include/hw/pci-host/spapr.h */ + +typedef struct QPCIWindow { + uint64_t pci_base; /* window address in PCI space */ + uint64_t size; /* window size */ +} QPCIWindow; + +typedef struct QPCIBusSPAPR { + QOSGraphObject obj; + QPCIBus bus; + QGuestAllocator *alloc; + + uint64_t buid; + + uint64_t pio_cpu_base; + QPCIWindow pio; + + uint64_t mmio32_cpu_base; + QPCIWindow mmio32; +} QPCIBusSPAPR; + +void qpci_init_spapr(QPCIBusSPAPR *ret, QTestState *qts, + QGuestAllocator *alloc); QPCIBus *qpci_new_spapr(QTestState *qts, QGuestAllocator *alloc); void qpci_free_spapr(QPCIBus *bus); =20 --=20 1.8.3.1