From nobody Wed Nov 5 10:47:37 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 1534155885695218.01373314202465; Mon, 13 Aug 2018 03:24:45 -0700 (PDT) Received: from localhost ([::1]:38548 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1fpA1k-0006RF-GG for importer@patchew.org; Mon, 13 Aug 2018 06:24:44 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:43548) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1fp9sg-0007D1-FO for qemu-devel@nongnu.org; Mon, 13 Aug 2018 06:15:24 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1fp9se-00022r-Ih for qemu-devel@nongnu.org; Mon, 13 Aug 2018 06:15:22 -0400 Received: from mail-ed1-x541.google.com ([2a00:1450:4864:20::541]:37137) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1fp9se-00022N-5z; Mon, 13 Aug 2018 06:15:20 -0400 Received: by mail-ed1-x541.google.com with SMTP id b10-v6so7961975eds.4; Mon, 13 Aug 2018 03:15:20 -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.17 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Mon, 13 Aug 2018 03:15:18 -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=/aEfaD/ZIOKVtnLBfwbcr0+Rt1jI/fK52Q2mJHseM7Q=; b=k+/MvO7igtKlx5/qyGqMdxN4n7DzFT+j4B471pUl/XoedIe5C8/xcxBKZDfnPe8IRC IrvxyJQkt4Fm8w8ZU4X8vpBDXs7m0dInYrqc+9mPopElkkwnN5j8C/43c8YV8c6SLZ7a jH9LxGGYf5u5AqH7ro1uezc5itJUcHp5RoNtCaIBxT4BYGlwf14l5Ga2d7/sUNxko77F ZMW2ZfdVA7EjOgysAZ7MM0XOHaN7Jx+StWcyq9atAaK7n8Wb51FLIjACHXE7Z9FVvZeb n2LTxmsSdcIJTVTV4nUJhOXyCbRRhEmHElTO/yebWf9+TBHTsXGWb7gwST3uHRGByykT VneA== 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=/aEfaD/ZIOKVtnLBfwbcr0+Rt1jI/fK52Q2mJHseM7Q=; b=tCTZtlvb+zWk0Hihcf6S6dKVMQXCGlCRZoNk6+/s6NHiwCYFxmR7o9tjySrAcdbJ3b VXLgbL4qPsR9lOXen5oqgbvjP352XNEpN+VySNTFPdE2CyXx6BXt+Y+7JlwxdCfe6OcX W9/12IDN4GiyOrOkl+nYjY6YdhV4hY+vcmYaPkQ+ZmwcZqq1n4wI59SFi1g8mbhJ1ldx GpnpjZt0TsCD4hZR3cGM8dLLsIRPKMF5hHaVP2i2XilK7tO24GplOxpy7piW6rFznp2n Lk85gjGzMlIBEZs44nZfhz8VZKEyBMuRftXDtTIuWf5yUrzgd6YsxQKAf73C+Pd2uS+9 zIYw== X-Gm-Message-State: AOUpUlGFBWC+G+YDzHSUwcX/AB0WJ838+WSyxm5pQ42UrKbkmCDo35WM nSlOT3y93Pivp66JqpU1NPju8xehEnc= X-Google-Smtp-Source: AA+uWPzbVadb6hBoAAULMmNo3CDq2Anufxgb+DTwyURgxo1NXOSKVuqJUUq+ajyWqnOqpCnnYczO0A== X-Received: by 2002:a50:9e2f:: with SMTP id z44-v6mr21120059ede.303.1534155318870; Mon, 13 Aug 2018 03:15:18 -0700 (PDT) From: Emanuele Giuseppe Esposito To: qemu-devel@nongnu.org Date: Mon, 13 Aug 2018 12:14:28 +0200 Message-Id: <20180813101453.10200-9-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 08/33] tests/qgraph: 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: 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 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 --- 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 67dbec0d35..5713be3ec4 100644 --- a/tests/Makefile.include +++ b/tests/Makefile.include @@ -771,7 +771,7 @@ libqos-virtio-obj-y =3D $(libqos-spapr-obj-y) $(libqos-= pc-obj-y) tests/libqos/virt libqgraph-machines-obj-y =3D tests/libqos/x86_64_pc-machine.o libqgraph-machines-obj-y +=3D tests/libqos/raspi2-machine.o =20 -libqgraph-pci-obj-y =3D $(libqos-pc-obj-y) +libqgraph-pci-obj-y =3D $(libqos-pc-obj-y) $(libqos-spapr-obj-y) libqgraph-pci-obj-y +=3D $(libqgraph-machines-obj-y) libqgraph-pci-obj-y +=3D tests/libqos/sdhci.o =20 diff --git a/tests/libqos/pci-spapr.c b/tests/libqos/pci-spapr.c index f306cb746d..24f2c2c60d 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 177e8c002c..d9e25631c6 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 2.17.1