From nobody Fri Dec 19 18:53:00 2025 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=gmail.com ARC-Seal: i=1; a=rsa-sha256; t=1744815716; cv=none; d=zohomail.com; s=zohoarc; b=OqopdarKBPeAQsGQxQ+It+ctH2mKFwLDddixIebNgVrtSJLt6puuvsSrfW/m6yyYXrwAOv/hxacyF33Xgh2URiD0ikpO9F7SWzG9rzqbv8FBM8VR2jwhoX83j2Fl3NgR9/DC+Uf1lKVuFZ5Xx4KQgOltFJAZO9CQqOcOtvXlFQc= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1744815716; h=Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=JL3huZLXxTALjzanwjU/xxJHfPMSswJPDxEWj9Jb8pw=; b=k6kwMTe2ruxO7Cfk7JA4w3kqmha+BE/9EveyIvh2aKCuaABG0ewXdcm7+MsocqzZI+dki4CnZ5miExIqCNQ0oVYYKxI+tATzfdlzQxySciLGw5srEwWVMgw/Q7H8c6n9Y6LVoLhQAuO1Fy4cbLojmStCHg/boA5JSwuhevFBGf0= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1744815716093172.6874188768951; Wed, 16 Apr 2025 08:01:56 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1u54Fu-0007Fn-Ex; Wed, 16 Apr 2025 11:00:50 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1u54F2-0006gE-AZ; Wed, 16 Apr 2025 10:59:59 -0400 Received: from mail-pf1-x430.google.com ([2607:f8b0:4864:20::430]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1u54Ey-00039o-02; Wed, 16 Apr 2025 10:59:54 -0400 Received: by mail-pf1-x430.google.com with SMTP id d2e1a72fcca58-736c277331eso897775b3a.1; Wed, 16 Apr 2025 07:59:50 -0700 (PDT) Received: from wheely.local0.net ([1.145.55.85]) by smtp.gmail.com with ESMTPSA id d2e1a72fcca58-73bd230e355sm10814506b3a.139.2025.04.16.07.59.44 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 16 Apr 2025 07:59:48 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1744815589; x=1745420389; darn=nongnu.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=JL3huZLXxTALjzanwjU/xxJHfPMSswJPDxEWj9Jb8pw=; b=EklONd6xgWVqbYM7y/D+w+i9B4O7/ZNPxiE29YyctHEJcYj92QrN5ZQHEtC9HuOdN2 Qs2I4zGz3saOrQ17IK07ztMHxvF0A1RX6rQNM5VO4K34se4sZZ7S6voyiCcSG1VQcYWz +0DIGeHRzwzhiEtapwF9lPlxi3MePj/2bmGsJ20v9dzjY2gzrHudL0RTjxvJwGmV9VUD u/p9DIVqfNj+8oZZAHdLnJOUPGmQkojZBjICwynUXYaiM9A8IOikQ2iJSR4x5mrZnJJ2 V5wq1PXkM4xsS4aIVr48i/4TTPG2GZlvTZfYcUlip6WBxIsHsLxsgMImyKBxkAki7XM3 tThg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1744815589; x=1745420389; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=JL3huZLXxTALjzanwjU/xxJHfPMSswJPDxEWj9Jb8pw=; b=QGEvZa2s88QEV5HhxN/gfT57SiTFbq3p06h6fQ01nnMW1+i7ZlqpHcxHhwsLHPlsNg ktIXRGgCYEFXs2dh1f/mV/hboz84l/Hfj/QbQOWHLI96jbp2k5QQpcehry2GP/h9LITP dNXP4A3vxlfjCa+c5TeEWl8An4pQWrLgT8whncxD/JiLvGAFXyDYah9ACQyj3TewXq8M hGT+j9W1Y2j5haVt2u8CHbMI/ilC0Lzm/794r1+SqCQosNpsTJvGyC8ppk5JFq0E0HoQ xYZpPRxPdYQ6LO2BBYd0s2upX80/cAhCP67dKxDX+r6GKMGimeyJgoi6RfZ+D+m13ZD5 2Jfg== X-Forwarded-Encrypted: i=1; AJvYcCVfDDD/3J52V+BT2PgTX4r35FfKT1+N+E7xXbNqHZKjXlyCsMkuA0TCDHwvg+Hrg7PxpuT0BnKFcdNx@nongnu.org, AJvYcCXRBtOTHmahBZAlyoNrw/ad5LvLliZY64Jj0TC7ttRqRA9trQVFyKA9ThVBp0x00SJqicL5EAu6XMAjzQ==@nongnu.org X-Gm-Message-State: AOJu0YydS77Wak3e+ATaSoS5aMZmuH1XGwxRsJcjUVOXdgWkeXYCu5AX 8BayM7dxl78hZE7/Q29eeDHWWD8LQNgTb6A+xRffNxxNL0nBJUkNSgOOrQ== X-Gm-Gg: ASbGnctzH6xV8eZ4VsunVCJA9PNMy00euHI90SSuL3jdwVI+P2pzEr5tO4H+Izz15fX V3syVghzEMKXcrrfT+C+koSNMXoQmHql31W3WyoKMJ74xhG7PlTfG+ohDKgLuZ9r0UBvcW+KSQj x1/exm1qgBfPqAvKiAno/uf7HWURmXt2k+pVWHD7+nUywF+9acPGeIFZaFLgeIocftRsmBzD7pc iWWZHCgYFGzKF63lbEZ6uOOntQVbz/iZbE90M7zPEa3d/vk8lF6111k7k3QLrUxc9ijiLTXn6DH dVUp5qjeq1qwarg3MQOPzHDPIFxNPaZU1mQr94Hn9Otc3Jjf6VnG X-Google-Smtp-Source: AGHT+IGEE++RC7qEhGL8O0gwOdXz4/rfg5nmivuNx12pjqJsUKEVGB9bqG8aXgX/FoBWgbTDD6/fNw== X-Received: by 2002:a05:6a00:3a96:b0:736:aea8:c9b7 with SMTP id d2e1a72fcca58-73c26d17aa0mr3101368b3a.2.1744815589266; Wed, 16 Apr 2025 07:59:49 -0700 (PDT) From: Nicholas Piggin To: qemu-ppc@nongnu.org Cc: Nicholas Piggin , Daniel Henrique Barboza , Harsh Prateek Bora , Fabiano Rosas , Laurent Vivier , Paolo Bonzini , Coiby Xu , Stefan Hajnoczi , Emanuele Giuseppe Esposito , =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= , qemu-devel@nongnu.org, qemu-block@nongnu.org Subject: [PATCH 4/4] tests/qtest: Enable spapr dma with linear iommu map Date: Thu, 17 Apr 2025 00:59:18 +1000 Message-ID: <20250416145918.415674-5-npiggin@gmail.com> X-Mailer: git-send-email 2.47.1 In-Reply-To: <20250416145918.415674-1-npiggin@gmail.com> References: <20250416145918.415674-1-npiggin@gmail.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Received-SPF: pass (zohomail.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; Received-SPF: pass client-ip=2607:f8b0:4864:20::430; envelope-from=npiggin@gmail.com; helo=mail-pf1-x430.google.com X-Spam_score_int: -20 X-Spam_score: -2.1 X-Spam_bar: -- X-Spam_report: (-2.1 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, FREEMAIL_FROM=0.001, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @gmail.com) X-ZM-MESSAGEID: 1744815717969019100 Content-Type: text/plain; charset="utf-8" qtests spapr dma was broken because the iommu was not set up. spapr requires hypercalls to set up the iommu (TCE tables), but there is no support for that or a side-channel to the iommu in qtests at the moment, so add a quick workaround in QEMU to have the spapr iommu provide a linear map to memory when running qtests. The buggy msix checks can all be removed since the tests all work now. Signed-off-by: Nicholas Piggin --- tests/qtest/libqos/pci.h | 4 ---- hw/ppc/spapr_iommu.c | 9 ++++++++- tests/qtest/e1000e-test.c | 21 --------------------- tests/qtest/igb-test.c | 21 --------------------- tests/qtest/libqos/generic-pcihost.c | 1 - tests/qtest/libqos/pci-pc.c | 3 --- tests/qtest/libqos/pci-spapr.c | 7 ++++--- tests/qtest/libqos/pci.c | 14 -------------- tests/qtest/vhost-user-blk-test.c | 6 ------ tests/qtest/virtio-blk-test.c | 12 ------------ 10 files changed, 12 insertions(+), 86 deletions(-) diff --git a/tests/qtest/libqos/pci.h b/tests/qtest/libqos/pci.h index 9f8f154c301..ef40a6917d3 100644 --- a/tests/qtest/libqos/pci.h +++ b/tests/qtest/libqos/pci.h @@ -51,7 +51,6 @@ struct QPCIBus { QTestState *qts; uint64_t pio_alloc_ptr, pio_limit; uint64_t mmio_alloc_ptr, mmio_limit; - bool has_buggy_msi; /* TRUE for spapr, FALSE for pci */ bool not_hotpluggable; /* TRUE if devices cannot be hotplugged */ =20 }; @@ -83,9 +82,6 @@ QPCIDevice *qpci_device_find(QPCIBus *bus, int devfn); void qpci_device_init(QPCIDevice *dev, QPCIBus *bus, QPCIAddress *addr); int qpci_secondary_buses_init(QPCIBus *bus); =20 -bool qpci_has_buggy_msi(QPCIDevice *dev); -bool qpci_check_buggy_msi(QPCIDevice *dev); - void qpci_device_enable(QPCIDevice *dev); uint8_t qpci_find_capability(QPCIDevice *dev, uint8_t id, uint8_t start_ad= dr); void qpci_msix_enable(QPCIDevice *dev); diff --git a/hw/ppc/spapr_iommu.c b/hw/ppc/spapr_iommu.c index db3a14c1dfd..77895c597df 100644 --- a/hw/ppc/spapr_iommu.c +++ b/hw/ppc/spapr_iommu.c @@ -22,6 +22,7 @@ #include "qemu/log.h" #include "qemu/module.h" #include "system/kvm.h" +#include "system/qtest.h" #include "kvm_ppc.h" #include "migration/vmstate.h" #include "system/dma.h" @@ -125,7 +126,13 @@ static IOMMUTLBEntry spapr_tce_translate_iommu(IOMMUMe= moryRegion *iommu, .perm =3D IOMMU_NONE, }; =20 - if ((addr >> tcet->page_shift) < tcet->nb_table) { + if (qtest_enabled()) { + /* spapr qtests does not set up the IOMMU, shortcut a linear map */ + ret.iova =3D addr & TARGET_PAGE_MASK; + ret.translated_addr =3D addr & TARGET_PAGE_MASK; + ret.addr_mask =3D ~TARGET_PAGE_MASK; + ret.perm =3D IOMMU_RW; + } else if ((addr >> tcet->page_shift) < tcet->nb_table) { /* Check if we are in bound */ hwaddr page_mask =3D IOMMU_PAGE_MASK(tcet->page_shift); =20 diff --git a/tests/qtest/e1000e-test.c b/tests/qtest/e1000e-test.c index de9738fdb74..8300bf5a5b3 100644 --- a/tests/qtest/e1000e-test.c +++ b/tests/qtest/e1000e-test.c @@ -139,13 +139,6 @@ static void test_e1000e_tx(void *obj, void *data, QGue= stAllocator * alloc) { QE1000E_PCI *e1000e =3D obj; QE1000E *d =3D &e1000e->e1000e; - QOSGraphObject *e_object =3D obj; - QPCIDevice *dev =3D e_object->get_driver(e_object, "pci-device"); - - /* FIXME: add spapr support */ - if (qpci_check_buggy_msi(dev)) { - return; - } =20 e1000e_send_verify(d, data, alloc); } @@ -154,13 +147,6 @@ static void test_e1000e_rx(void *obj, void *data, QGue= stAllocator * alloc) { QE1000E_PCI *e1000e =3D obj; QE1000E *d =3D &e1000e->e1000e; - QOSGraphObject *e_object =3D obj; - QPCIDevice *dev =3D e_object->get_driver(e_object, "pci-device"); - - /* FIXME: add spapr support */ - if (qpci_check_buggy_msi(dev)) { - return; - } =20 e1000e_receive_verify(d, data, alloc); } @@ -173,13 +159,6 @@ static void test_e1000e_multiple_transfers(void *obj, = void *data, =20 QE1000E_PCI *e1000e =3D obj; QE1000E *d =3D &e1000e->e1000e; - QOSGraphObject *e_object =3D obj; - QPCIDevice *dev =3D e_object->get_driver(e_object, "pci-device"); - - /* FIXME: add spapr support */ - if (qpci_check_buggy_msi(dev)) { - return; - } =20 for (i =3D 0; i < iterations; i++) { e1000e_send_verify(d, data, alloc); diff --git a/tests/qtest/igb-test.c b/tests/qtest/igb-test.c index 3d397ea6973..1b3b5aa6c76 100644 --- a/tests/qtest/igb-test.c +++ b/tests/qtest/igb-test.c @@ -142,13 +142,6 @@ static void test_igb_tx(void *obj, void *data, QGuestA= llocator * alloc) { QE1000E_PCI *e1000e =3D obj; QE1000E *d =3D &e1000e->e1000e; - QOSGraphObject *e_object =3D obj; - QPCIDevice *dev =3D e_object->get_driver(e_object, "pci-device"); - - /* FIXME: add spapr support */ - if (qpci_check_buggy_msi(dev)) { - return; - } =20 igb_send_verify(d, data, alloc); } @@ -157,13 +150,6 @@ static void test_igb_rx(void *obj, void *data, QGuestA= llocator * alloc) { QE1000E_PCI *e1000e =3D obj; QE1000E *d =3D &e1000e->e1000e; - QOSGraphObject *e_object =3D obj; - QPCIDevice *dev =3D e_object->get_driver(e_object, "pci-device"); - - /* FIXME: add spapr support */ - if (qpci_check_buggy_msi(dev)) { - return; - } =20 igb_receive_verify(d, data, alloc); } @@ -176,13 +162,6 @@ static void test_igb_multiple_transfers(void *obj, voi= d *data, =20 QE1000E_PCI *e1000e =3D obj; QE1000E *d =3D &e1000e->e1000e; - QOSGraphObject *e_object =3D obj; - QPCIDevice *dev =3D e_object->get_driver(e_object, "pci-device"); - - /* FIXME: add spapr support */ - if (qpci_check_buggy_msi(dev)) { - return; - } =20 for (i =3D 0; i < iterations; i++) { igb_send_verify(d, data, alloc); diff --git a/tests/qtest/libqos/generic-pcihost.c b/tests/qtest/libqos/gene= ric-pcihost.c index 4bbeb5ff508..568897e0ecc 100644 --- a/tests/qtest/libqos/generic-pcihost.c +++ b/tests/qtest/libqos/generic-pcihost.c @@ -182,7 +182,6 @@ void qpci_init_generic(QGenericPCIBus *qpci, QTestState= *qts, =20 qpci->gpex_pio_base =3D 0x3eff0000; qpci->bus.not_hotpluggable =3D !hotpluggable; - qpci->bus.has_buggy_msi =3D false; =20 qpci->bus.pio_readb =3D qpci_generic_pio_readb; qpci->bus.pio_readw =3D qpci_generic_pio_readw; diff --git a/tests/qtest/libqos/pci-pc.c b/tests/qtest/libqos/pci-pc.c index 147009f4f44..8b79d858bd5 100644 --- a/tests/qtest/libqos/pci-pc.c +++ b/tests/qtest/libqos/pci-pc.c @@ -124,9 +124,6 @@ void qpci_init_pc(QPCIBusPC *qpci, QTestState *qts, QGu= estAllocator *alloc) { assert(qts); =20 - /* tests can use pci-bus */ - qpci->bus.has_buggy_msi =3D false; - qpci->bus.pio_readb =3D qpci_pc_pio_readb; qpci->bus.pio_readw =3D qpci_pc_pio_readw; qpci->bus.pio_readl =3D qpci_pc_pio_readl; diff --git a/tests/qtest/libqos/pci-spapr.c b/tests/qtest/libqos/pci-spapr.c index 0f1023e4a73..dfa2087a599 100644 --- a/tests/qtest/libqos/pci-spapr.c +++ b/tests/qtest/libqos/pci-spapr.c @@ -20,6 +20,10 @@ * PCI devices are always little-endian * SPAPR by default is big-endian * so PCI accessors need to swap data endianness + * + * The spapr iommu model has a qtest_enabled() check that short-cuts + * the TCE table and provides a linear map for DMA, since qtests does + * not have a way to make hcalls to set up the TCE table. */ =20 static uint8_t qpci_spapr_pio_readb(QPCIBus *bus, uint32_t addr) @@ -155,9 +159,6 @@ void qpci_init_spapr(QPCIBusSPAPR *qpci, QTestState *qt= s, { assert(qts); =20 - /* tests cannot use spapr, needs to be fixed first */ - qpci->bus.has_buggy_msi =3D true; - qpci->alloc =3D alloc; =20 qpci->bus.pio_readb =3D qpci_spapr_pio_readb; diff --git a/tests/qtest/libqos/pci.c b/tests/qtest/libqos/pci.c index 773fd1fb6cf..2bae119bfca 100644 --- a/tests/qtest/libqos/pci.c +++ b/tests/qtest/libqos/pci.c @@ -53,20 +53,6 @@ void qpci_device_foreach(QPCIBus *bus, int vendor_id, in= t device_id, } } =20 -bool qpci_has_buggy_msi(QPCIDevice *dev) -{ - return dev->bus->has_buggy_msi; -} - -bool qpci_check_buggy_msi(QPCIDevice *dev) -{ - if (qpci_has_buggy_msi(dev)) { - g_test_skip("Skipping due to incomplete support for MSI"); - return true; - } - return false; -} - static void qpci_device_set(QPCIDevice *dev, QPCIBus *bus, int devfn) { g_assert(dev); diff --git a/tests/qtest/vhost-user-blk-test.c b/tests/qtest/vhost-user-blk= -test.c index ea90d41232e..3e71fdb9d78 100644 --- a/tests/qtest/vhost-user-blk-test.c +++ b/tests/qtest/vhost-user-blk-test.c @@ -554,14 +554,8 @@ static void idx(void *obj, void *u_data, QGuestAllocat= or *t_alloc) uint32_t desc_idx; uint8_t status; char *data; - QOSGraphObject *blk_object =3D obj; - QPCIDevice *pci_dev =3D blk_object->get_driver(blk_object, "pci-device= "); QTestState *qts =3D global_qtest; =20 - if (qpci_check_buggy_msi(pci_dev)) { - return; - } - qpci_msix_enable(pdev->pdev); qvirtio_pci_set_msix_configuration_vector(pdev, t_alloc, 0); =20 diff --git a/tests/qtest/virtio-blk-test.c b/tests/qtest/virtio-blk-test.c index 98c906ebb4a..3a005d600c1 100644 --- a/tests/qtest/virtio-blk-test.c +++ b/tests/qtest/virtio-blk-test.c @@ -474,14 +474,8 @@ static void msix(void *obj, void *u_data, QGuestAlloca= tor *t_alloc) uint32_t free_head; uint8_t status; char *data; - QOSGraphObject *blk_object =3D obj; - QPCIDevice *pci_dev =3D blk_object->get_driver(blk_object, "pci-device= "); QTestState *qts =3D global_qtest; =20 - if (qpci_check_buggy_msi(pci_dev)) { - return; - } - qpci_msix_enable(pdev->pdev); qvirtio_pci_set_msix_configuration_vector(pdev, t_alloc, 0); =20 @@ -584,14 +578,8 @@ static void idx(void *obj, void *u_data, QGuestAllocat= or *t_alloc) uint32_t desc_idx; uint8_t status; char *data; - QOSGraphObject *blk_object =3D obj; - QPCIDevice *pci_dev =3D blk_object->get_driver(blk_object, "pci-device= "); QTestState *qts =3D global_qtest; =20 - if (qpci_check_buggy_msi(pci_dev)) { - return; - } - qpci_msix_enable(pdev->pdev); qvirtio_pci_set_msix_configuration_vector(pdev, t_alloc, 0); =20 --=20 2.47.1