From nobody Wed May 7 17:41:28 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=1733992584; cv=none; d=zohomail.com; s=zohoarc; b=HL9wj6tfn5kvFyPwOEekbj3cx1TPvBXElDFZ3AZhZZNAkw69AS3hbeKs38v5sCxbRh4U5L3UAjGjgG0j85fGRppeL9zGA92gmy3NVUG0N1LP0XbJ32E4BD/xXIbNFx6sHHNJ7kokS4zgTkwCGxnD80//i1ewfMrGWyIijgy5Oa8= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1733992584; 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=bRTDyBdfnK9kAprnP+Hh3qG7LUon4ziNP1QIA/V4/Ww=; b=V0EP+04OhytsOJfNOX/i9IohxbOE1cNPH5k/NSWJMRfURJ4BIIVmeHCO8zjIZ2LVLNzSlZAKq9lC9+CgLOUDs6sq80xS7rVmLJzRXPbqBbAA2QiMQ5XFOVyAFAz0huk8o3IAlkxYyXXb0e1zB/FSdEhUD0EWego2S29vosjcPY8= 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=<npiggin@gmail.com> (p=none dis=none) Return-Path: <qemu-devel-bounces+importer=patchew.org@nongnu.org> Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1733992584091409.5259541294856; Thu, 12 Dec 2024 00:36:24 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from <qemu-devel-bounces@nongnu.org>) id 1tLefW-0006iQ-8k; Thu, 12 Dec 2024 03:35:34 -0500 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 <npiggin@gmail.com>) id 1tLefQ-0006i0-Tl for qemu-devel@nongnu.org; Thu, 12 Dec 2024 03:35:30 -0500 Received: from mail-pj1-x102d.google.com ([2607:f8b0:4864:20::102d]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from <npiggin@gmail.com>) id 1tLefO-0004Ls-Rn for qemu-devel@nongnu.org; Thu, 12 Dec 2024 03:35:28 -0500 Received: by mail-pj1-x102d.google.com with SMTP id 98e67ed59e1d1-2ee67e9287fso290199a91.0 for <qemu-devel@nongnu.org>; Thu, 12 Dec 2024 00:35:25 -0800 (PST) Received: from wheely.local0.net ([1.146.48.169]) by smtp.gmail.com with ESMTPSA id 98e67ed59e1d1-2f142dae788sm714624a91.12.2024.12.12.00.35.18 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 12 Dec 2024 00:35:24 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1733992524; x=1734597324; 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=bRTDyBdfnK9kAprnP+Hh3qG7LUon4ziNP1QIA/V4/Ww=; b=HcbhOQVR+uPlLWsJPLabSJ26Ffhp68kv/HkB41mLFAqFK3uLmPLJ9ilsmp8CgU2zLr Dg+cwG0rtHoJkVgTOACN1/UpEE02Qz5v7B+aUNau7IDDn+6rRq2cgsFBnLhrFuRVOX8b IbiAjXs1GaHGcOdYLpmc+5WY6RvLjO6muttpwoAclYk5OGq8yhgUnfnTrXt7YC+j4N5Y IPKf/5Y/nltIYN8fRW8FGzFgnKiq5odmzqASLFWUED6ldIMRQp/u4yv0SuVfgNtfwpCR N5vnkipPDCS7fJWu7Dx640orY6g0aGG9qdrU9zL9Nk/qiDdTZJ5wrVowAFtCBxmuwBfM V9dw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1733992524; x=1734597324; 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=bRTDyBdfnK9kAprnP+Hh3qG7LUon4ziNP1QIA/V4/Ww=; b=vjrnvLHUe3iWLnQY4UpA76TY0BW3+35zjLah9AsBPbSxBrTmWFmtDO5zWfLbzhrmwA R9wuraemzJSm/wy0Z6bUcPRhwK3eCTkWuQRwdJNBjUJpJot2yorI5Q/0n7wctGPNxV0o rI9yxSogYvIETnOWtrNo9J3juM5tFpjThNpS8kJ6+AFXiDGPMEZ0I/tUZ13rM0TSBZvU K7XO+QblxOSLlvJtZyTAM8hIpRbth99nxUzz+01m07Sv+lWQFFrj6N4GGGx/tnOSqqS2 sRcfp0roKz4GlCM9Cc4NBSYPthO6yCmGgTXwZI28bnbcsc0QlFH0U9kc2gCh7n3pca+s Imdw== X-Gm-Message-State: AOJu0YzbRebDOwZ7ZSJg7avxSeXJQVsYUkncHf0VT8zNvxWrlEBIC8C2 M/+AbjMIz388D1Wz8wQIAcHODTPvybbE3FY6e0lmW3ISybFE2VVvW0Ip6g== X-Gm-Gg: ASbGnctxGmAvfYgqpQlIRR1h/nFRSHxk0D+ajhFqf0nlf0tGw17jCBTQUkVZVOQ/kwu CTl8/4LldGcD6Z0aFc/J2ckZ6BJzXUFboUm8o4Nrf4312hKntDt7QHqSIpqPXE/uiU4n7NMFYW+ Or9KAvr+vvIUa9z2v2g5Mxcy4+xOezZQlYzFdvqKIh542ALNOJF8BqMqZHfUrMOZGWiTbqfyYrZ O8D01UiIvnOCBYfvgwBOx6aSROsE+FD95Q/OKTMlsHQMtsjMIELfLEFGz8= X-Google-Smtp-Source: AGHT+IFaR7q9A8I6CLL+C4G3RzbV19Aazhl+tN+GYbYECdGZjY49ShQniQlXvyXdKw9WFbtfEc9ttA== X-Received: by 2002:a17:90b:3c4f:b0:2ee:a744:a4fe with SMTP id 98e67ed59e1d1-2f13930c26bmr4471685a91.25.1733992524389; Thu, 12 Dec 2024 00:35:24 -0800 (PST) From: Nicholas Piggin <npiggin@gmail.com> To: qemu-devel@nongnu.org Cc: Nicholas Piggin <npiggin@gmail.com>, "Michael S. Tsirkin" <mst@redhat.com>, Marcel Apfelbaum <marcel.apfelbaum@gmail.com>, Fabiano Rosas <farosas@suse.de>, Laurent Vivier <lvivier@redhat.com>, Paolo Bonzini <pbonzini@redhat.com>, Dmitry Fleytman <dmitry.fleytman@gmail.com>, Akihiko Odaki <akihiko.odaki@daynix.com>, Sriram Yagnaraman <sriram.yagnaraman@ericsson.com> Subject: [PATCH 1/8] qtest/pci: Enforce balanced iomap/unmap Date: Thu, 12 Dec 2024 18:34:54 +1000 Message-ID: <20241212083502.1439033-2-npiggin@gmail.com> X-Mailer: git-send-email 2.45.2 In-Reply-To: <20241212083502.1439033-1-npiggin@gmail.com> References: <20241212083502.1439033-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::102d; envelope-from=npiggin@gmail.com; helo=mail-pj1-x102d.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: <qemu-devel.nongnu.org> List-Unsubscribe: <https://lists.nongnu.org/mailman/options/qemu-devel>, <mailto:qemu-devel-request@nongnu.org?subject=unsubscribe> List-Archive: <https://lists.nongnu.org/archive/html/qemu-devel> List-Post: <mailto:qemu-devel@nongnu.org> List-Help: <mailto:qemu-devel-request@nongnu.org?subject=help> List-Subscribe: <https://lists.nongnu.org/mailman/listinfo/qemu-devel>, <mailto:qemu-devel-request@nongnu.org?subject=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: 1733992585852116600 Content-Type: text/plain; charset="utf-8" Add assertions to ensure a BAR is not mapped twice, and only previously mapped BARs are unmapped. This can help catch some bugs. Cc: Michael S. Tsirkin <mst@redhat.com> Cc: Marcel Apfelbaum <marcel.apfelbaum@gmail.com> Reviewed-by: Fabiano Rosas <farosas@suse.de> Signed-off-by: Nicholas Piggin <npiggin@gmail.com> --- tests/qtest/libqos/ahci.h | 1 + tests/qtest/libqos/pci.h | 2 ++ tests/qtest/libqos/virtio-pci.h | 1 + tests/qtest/ahci-test.c | 2 ++ tests/qtest/libqos/ahci.c | 6 ++++++ tests/qtest/libqos/pci.c | 32 +++++++++++++++++++++++++++++++- tests/qtest/libqos/virtio-pci.c | 6 +++++- 7 files changed, 48 insertions(+), 2 deletions(-) diff --git a/tests/qtest/libqos/ahci.h b/tests/qtest/libqos/ahci.h index a0487a1557d..5d7e26aee2a 100644 --- a/tests/qtest/libqos/ahci.h +++ b/tests/qtest/libqos/ahci.h @@ -575,6 +575,7 @@ QPCIDevice *get_ahci_device(QTestState *qts, uint32_t *= fingerprint); void free_ahci_device(QPCIDevice *dev); void ahci_pci_enable(AHCIQState *ahci); void start_ahci_device(AHCIQState *ahci); +void stop_ahci_device(AHCIQState *ahci); void ahci_hba_enable(AHCIQState *ahci); =20 /* Port Management */ diff --git a/tests/qtest/libqos/pci.h b/tests/qtest/libqos/pci.h index 83896145235..9dc82ea723a 100644 --- a/tests/qtest/libqos/pci.h +++ b/tests/qtest/libqos/pci.h @@ -65,6 +65,8 @@ struct QPCIDevice { QPCIBus *bus; int devfn; + bool bars_mapped[6]; + QPCIBar bars[6]; bool msix_enabled; QPCIBar msix_table_bar, msix_pba_bar; uint64_t msix_table_off, msix_pba_off; diff --git a/tests/qtest/libqos/virtio-pci.h b/tests/qtest/libqos/virtio-pc= i.h index f5115cacba2..efdf904b254 100644 --- a/tests/qtest/libqos/virtio-pci.h +++ b/tests/qtest/libqos/virtio-pci.h @@ -26,6 +26,7 @@ typedef struct QVirtioPCIDevice { uint64_t config_msix_addr; uint32_t config_msix_data; =20 + bool enabled; int bar_idx; =20 /* VIRTIO 1.0 */ diff --git a/tests/qtest/ahci-test.c b/tests/qtest/ahci-test.c index 5a1923f721b..b3dae7a8ce4 100644 --- a/tests/qtest/ahci-test.c +++ b/tests/qtest/ahci-test.c @@ -1483,6 +1483,8 @@ static void test_reset_pending_callback(void) /* Wait for throttled write to finish. */ sleep(1); =20 + stop_ahci_device(ahci); + /* Start again. */ ahci_clean_mem(ahci); ahci_pci_enable(ahci); diff --git a/tests/qtest/libqos/ahci.c b/tests/qtest/libqos/ahci.c index 34a75b7f43b..cfc435b6663 100644 --- a/tests/qtest/libqos/ahci.c +++ b/tests/qtest/libqos/ahci.c @@ -217,6 +217,12 @@ void start_ahci_device(AHCIQState *ahci) qpci_device_enable(ahci->dev); } =20 +void stop_ahci_device(AHCIQState *ahci) +{ + /* Map AHCI's ABAR (BAR5) */ + qpci_iounmap(ahci->dev, ahci->hba_bar); +} + /** * Test and initialize the AHCI's HBA memory areas. * Initialize and start any ports with devices attached. diff --git a/tests/qtest/libqos/pci.c b/tests/qtest/libqos/pci.c index b23d72346b6..a42ca08261d 100644 --- a/tests/qtest/libqos/pci.c +++ b/tests/qtest/libqos/pci.c @@ -93,12 +93,17 @@ QPCIDevice *qpci_device_find(QPCIBus *bus, int devfn) void qpci_device_init(QPCIDevice *dev, QPCIBus *bus, QPCIAddress *addr) { uint16_t vendor_id, device_id; + int i; =20 qpci_device_set(dev, bus, addr->devfn); vendor_id =3D qpci_config_readw(dev, PCI_VENDOR_ID); device_id =3D qpci_config_readw(dev, PCI_DEVICE_ID); g_assert(!addr->vendor_id || vendor_id =3D=3D addr->vendor_id); g_assert(!addr->device_id || device_id =3D=3D addr->device_id); + + for (i =3D 0; i < 6; i++) { + g_assert(!dev->bars_mapped[i]); + } } =20 static uint8_t qpci_find_resource_reserve_capability(QPCIDevice *dev) @@ -531,6 +536,8 @@ QPCIBar qpci_iomap(QPCIDevice *dev, int barno, uint64_t= *sizeptr) uint64_t loc; =20 g_assert(barno >=3D 0 && barno <=3D 5); + g_assert(!dev->bars_mapped[barno]); + bar_reg =3D bar_reg_map[barno]; =20 qpci_config_writel(dev, bar_reg, 0xFFFFFFFF); @@ -574,12 +581,35 @@ QPCIBar qpci_iomap(QPCIDevice *dev, int barno, uint64= _t *sizeptr) } =20 bar.addr =3D loc; + + dev->bars_mapped[barno] =3D true; + dev->bars[barno] =3D bar; + return bar; } =20 void qpci_iounmap(QPCIDevice *dev, QPCIBar bar) { - /* FIXME */ + static const int bar_reg_map[] =3D { + PCI_BASE_ADDRESS_0, PCI_BASE_ADDRESS_1, PCI_BASE_ADDRESS_2, + PCI_BASE_ADDRESS_3, PCI_BASE_ADDRESS_4, PCI_BASE_ADDRESS_5, + }; + int bar_reg; + int i; + + for (i =3D 0; i < 6; i++) { + if (!dev->bars_mapped[i]) { + continue; + } + if (dev->bars[i].addr =3D=3D bar.addr) { + dev->bars_mapped[i] =3D false; + bar_reg =3D bar_reg_map[i]; + qpci_config_writel(dev, bar_reg, 0xFFFFFFFF); + /* FIXME: the address space is leaked */ + return; + } + } + g_assert_not_reached(); } =20 QPCIBar qpci_legacy_iomap(QPCIDevice *dev, uint16_t addr) diff --git a/tests/qtest/libqos/virtio-pci.c b/tests/qtest/libqos/virtio-pc= i.c index 485b8f6b7e0..2b59fb181c9 100644 --- a/tests/qtest/libqos/virtio-pci.c +++ b/tests/qtest/libqos/virtio-pci.c @@ -304,11 +304,15 @@ void qvirtio_pci_device_enable(QVirtioPCIDevice *d) { qpci_device_enable(d->pdev); d->bar =3D qpci_iomap(d->pdev, d->bar_idx, NULL); + d->enabled =3D true; } =20 void qvirtio_pci_device_disable(QVirtioPCIDevice *d) { - qpci_iounmap(d->pdev, d->bar); + if (d->enabled) { + qpci_iounmap(d->pdev, d->bar); + d->enabled =3D false; + } } =20 void qvirtqueue_pci_msix_setup(QVirtioPCIDevice *d, QVirtQueuePCI *vqpci, --=20 2.45.2 From nobody Wed May 7 17:41:28 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=1733992636; cv=none; d=zohomail.com; s=zohoarc; b=PXjSPRsEsfQcFDxnRiQuxP+5nZ3BEarytjZA6J/0FdYIVFgMkqQxYo0x+40cc9mBMJV275pLI16rc6M4GShW0obBizgYVqWLFmeQd+tiFqADAvNwDHYA+pyC0B1hM+Jx8esT+uxHOg/BFnKCnM8oDpzlZifrIH6AEiXpCPauR50= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1733992636; 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=e6QI+StavfES5vlYy9klhZaUtTtmII/hVb11fVMVfTA=; b=eUfwtpctrFkBTdRaO4czv82obEOlyBh3ONGZJ8LmUvq1YA7ne9wuAxrMdL10zvuQjcJzwRHFkLv0M8SHCFKCAkKFVmVmdRgSCzMIqI5NIPUsC7Ab4fc0hLHtawIOatTfMRXcfw/QzmDjynbBi45ALHmsckCHLDFyu7GMlg44Bpo= 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=<npiggin@gmail.com> (p=none dis=none) Return-Path: <qemu-devel-bounces+importer=patchew.org@nongnu.org> Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 173399263620187.25573153063044; Thu, 12 Dec 2024 00:37:16 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from <qemu-devel-bounces@nongnu.org>) id 1tLefa-0006iv-GM; Thu, 12 Dec 2024 03:35:38 -0500 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 <npiggin@gmail.com>) id 1tLefX-0006ii-Ig for qemu-devel@nongnu.org; Thu, 12 Dec 2024 03:35:35 -0500 Received: from mail-pj1-x1036.google.com ([2607:f8b0:4864:20::1036]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from <npiggin@gmail.com>) id 1tLefU-0004Y3-HL for qemu-devel@nongnu.org; Thu, 12 Dec 2024 03:35:34 -0500 Received: by mail-pj1-x1036.google.com with SMTP id 98e67ed59e1d1-2eeb4d643a5so271760a91.3 for <qemu-devel@nongnu.org>; Thu, 12 Dec 2024 00:35:32 -0800 (PST) Received: from wheely.local0.net ([1.146.48.169]) by smtp.gmail.com with ESMTPSA id 98e67ed59e1d1-2f142dae788sm714624a91.12.2024.12.12.00.35.25 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 12 Dec 2024 00:35:30 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1733992531; x=1734597331; 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=e6QI+StavfES5vlYy9klhZaUtTtmII/hVb11fVMVfTA=; b=iWHzVpGBUP3wia5m1d1bAKeYYURLSwe2/YFuCeCOgHHn4Dmp0vVg7gdDNMrvCdSTFL f8iJvH0jaGIQK2Lp+DFO2DsvF1SbD0ADeDVpyz44XfvMKOY+TXXeoyISsimhfPbXmdBj yt5XG9tWQoCFJaqSm1Zs1FjMgKMlnJtve+5xyJMbvzvuyYOumzqyB3ThmYCo10reguUT Cot3RYxDXQK50dV+xZ9pVHjSkNWdKtAUBUZjZagyN/8ObwW7GXyn5oZeCI3mSX7yrMq6 jnOFqTiepD41eYTCauAVlMeInM56KfRC3wKukPeN8/tEHuILYTyD0YkPb3lIyWT9Uzgy nqng== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1733992531; x=1734597331; 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=e6QI+StavfES5vlYy9klhZaUtTtmII/hVb11fVMVfTA=; b=kExjoz6au4HBe24YxZRsvL+hcm0FnxycDYq0Z3rzCFJkorakK8D5+NBxpxjgZWDn17 Y3u6tm46j4o4JLLNKjBGMKVNDGA6i07yrifMBTh8KM9CK7S9MzJVGnpCaz52hMhlEGu9 by1sW/t85Mjyt8K+OfryrDdlmct2Qfm0TV4h5p6zhHQGgbVV59Vd+QjbgRA7rxTlr2lo I3uMwkbv1KiZn4/GVTC9/QcLnf0dZDdmsx8tJo6YBdQ+Ln76pSJDMsOAo92lgQH9e76v +leMR6338aEuid/22f5/QtwfwzrWFmNmGN0rMbVmOnYYmEg2BCb+HnmEJ5SjwGxgNWJC fYhw== X-Gm-Message-State: AOJu0YzyqzVQqMNSl/UUgADuBs5KZ2YP9L7wjVayEr3hCh7MLyP4RYWg CD/pMRcb28FrcTZTVmXlM9876wWSPP6StItS7RHsF1FnM3s2JoT4VodDIw== X-Gm-Gg: ASbGncsZ5aO77wld//T0FeDHx3AXpKmPza3rmKkBeCD0U3sdhY7vKG8FyFJw0zc3JU6 ozF8Uhrzv2VlM0ZBtuw53KTmCWiWisoaJhHI46kAJT+dWF1pJ9tokzKkL4ci1yY5a3srW3Tgzvi JO4HWQBUs1kfzegazxGW3vXORO8Rjx6egbWlICUhIWdEaI9Z6dGmF/rh81hTFJREmQmj47YoYhG 1Te8arWx/0ntYTKaz0KLe0RijL4DJ2GgC8QIR6UhU68whuCRwxUJWXgFBM= X-Google-Smtp-Source: AGHT+IESTsS3C0fK7iP4KKd2Hu4bTJZGNqCuyMaGPChplcBzzJcsSbnVN1go4XAdghHa83uHYw/sfg== X-Received: by 2002:a17:90b:1c05:b0:2ee:f550:3837 with SMTP id 98e67ed59e1d1-2f127f64262mr9871515a91.7.1733992530781; Thu, 12 Dec 2024 00:35:30 -0800 (PST) From: Nicholas Piggin <npiggin@gmail.com> To: qemu-devel@nongnu.org Cc: Nicholas Piggin <npiggin@gmail.com>, "Michael S. Tsirkin" <mst@redhat.com>, Marcel Apfelbaum <marcel.apfelbaum@gmail.com>, Fabiano Rosas <farosas@suse.de>, Laurent Vivier <lvivier@redhat.com>, Paolo Bonzini <pbonzini@redhat.com>, Dmitry Fleytman <dmitry.fleytman@gmail.com>, Akihiko Odaki <akihiko.odaki@daynix.com>, Sriram Yagnaraman <sriram.yagnaraman@ericsson.com> Subject: [PATCH 2/8] qtest/libqos/pci: Fix qpci_msix_enable sharing bar0 Date: Thu, 12 Dec 2024 18:34:55 +1000 Message-ID: <20241212083502.1439033-3-npiggin@gmail.com> X-Mailer: git-send-email 2.45.2 In-Reply-To: <20241212083502.1439033-1-npiggin@gmail.com> References: <20241212083502.1439033-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::1036; envelope-from=npiggin@gmail.com; helo=mail-pj1-x1036.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: <qemu-devel.nongnu.org> List-Unsubscribe: <https://lists.nongnu.org/mailman/options/qemu-devel>, <mailto:qemu-devel-request@nongnu.org?subject=unsubscribe> List-Archive: <https://lists.nongnu.org/archive/html/qemu-devel> List-Post: <mailto:qemu-devel@nongnu.org> List-Help: <mailto:qemu-devel-request@nongnu.org?subject=help> List-Subscribe: <https://lists.nongnu.org/mailman/listinfo/qemu-devel>, <mailto:qemu-devel-request@nongnu.org?subject=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: 1733992638148116600 Content-Type: text/plain; charset="utf-8" Devices where the MSI-X addresses are shared with other MMIO on BAR0 can not use msi_enable because it unmaps and remaps BAR0, which interferes with device MMIO mappings. xhci-nec is one such device we would like to test msix with. Use the BAR iomap tracking structure introduced in the previous change to have qpci_misx_enable() use existing iomaps if msix bars are already mapped. Cc: Michael S. Tsirkin <mst@redhat.com> Cc: Marcel Apfelbaum <marcel.apfelbaum@gmail.com> Reviewed-by: Fabiano Rosas <farosas@suse.de> Signed-off-by: Nicholas Piggin <npiggin@gmail.com> --- tests/qtest/libqos/pci.h | 1 + tests/qtest/libqos/pci.c | 40 ++++++++++++++++++++++++++++++++++------ 2 files changed, 35 insertions(+), 6 deletions(-) diff --git a/tests/qtest/libqos/pci.h b/tests/qtest/libqos/pci.h index 9dc82ea723a..5a7b2454ad5 100644 --- a/tests/qtest/libqos/pci.h +++ b/tests/qtest/libqos/pci.h @@ -68,6 +68,7 @@ struct QPCIDevice bool bars_mapped[6]; QPCIBar bars[6]; bool msix_enabled; + bool msix_table_bar_iomap, msix_pba_bar_iomap; QPCIBar msix_table_bar, msix_pba_bar; uint64_t msix_table_off, msix_pba_off; }; diff --git a/tests/qtest/libqos/pci.c b/tests/qtest/libqos/pci.c index a42ca08261d..023c1617680 100644 --- a/tests/qtest/libqos/pci.c +++ b/tests/qtest/libqos/pci.c @@ -288,15 +288,21 @@ void qpci_msix_enable(QPCIDevice *dev) =20 table =3D qpci_config_readl(dev, addr + PCI_MSIX_TABLE); bir_table =3D table & PCI_MSIX_FLAGS_BIRMASK; - dev->msix_table_bar =3D qpci_iomap(dev, bir_table, NULL); + if (dev->bars_mapped[bir_table]) { + dev->msix_table_bar =3D dev->bars[bir_table]; + } else { + dev->msix_table_bar_iomap =3D true; + dev->msix_table_bar =3D qpci_iomap(dev, bir_table, NULL); + } dev->msix_table_off =3D table & ~PCI_MSIX_FLAGS_BIRMASK; =20 table =3D qpci_config_readl(dev, addr + PCI_MSIX_PBA); bir_pba =3D table & PCI_MSIX_FLAGS_BIRMASK; - if (bir_pba !=3D bir_table) { - dev->msix_pba_bar =3D qpci_iomap(dev, bir_pba, NULL); + if (dev->bars_mapped[bir_pba]) { + dev->msix_pba_bar =3D dev->bars[bir_pba]; } else { - dev->msix_pba_bar =3D dev->msix_table_bar; + dev->msix_pba_bar_iomap =3D true; + dev->msix_pba_bar =3D qpci_iomap(dev, bir_pba, NULL); } dev->msix_pba_off =3D table & ~PCI_MSIX_FLAGS_BIRMASK; =20 @@ -307,6 +313,7 @@ void qpci_msix_disable(QPCIDevice *dev) { uint8_t addr; uint16_t val; + uint32_t table; =20 g_assert(dev->msix_enabled); addr =3D qpci_find_capability(dev, PCI_CAP_ID_MSIX, 0); @@ -315,10 +322,31 @@ void qpci_msix_disable(QPCIDevice *dev) qpci_config_writew(dev, addr + PCI_MSIX_FLAGS, val & ~PCI_MSIX_FLAGS_ENAB= LE); =20 - if (dev->msix_pba_bar.addr !=3D dev->msix_table_bar.addr) { + if (dev->msix_pba_bar_iomap) { + dev->msix_pba_bar_iomap =3D false; qpci_iounmap(dev, dev->msix_pba_bar); + } else { + /* + * If we had reused an existing iomap, ensure it is still mapped + * otherwise it would be a bug if it were unmapped before msix is + * disabled. A refcounting iomap implementation could avoid this + * issue entirely, but let's wait until that's needed. + */ + uint8_t bir_pba; + table =3D qpci_config_readl(dev, addr + PCI_MSIX_PBA); + bir_pba =3D table & PCI_MSIX_FLAGS_BIRMASK; + g_assert(dev->bars_mapped[bir_pba]); + } + + if (dev->msix_table_bar_iomap) { + dev->msix_table_bar_iomap =3D false; + qpci_iounmap(dev, dev->msix_table_bar); + } else { + uint8_t bir_table; + table =3D qpci_config_readl(dev, addr + PCI_MSIX_TABLE); + bir_table =3D table & PCI_MSIX_FLAGS_BIRMASK; + g_assert(dev->bars_mapped[bir_table]); } - qpci_iounmap(dev, dev->msix_table_bar); =20 dev->msix_enabled =3D 0; dev->msix_table_off =3D 0; --=20 2.45.2 From nobody Wed May 7 17:41:28 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=1733992585; cv=none; d=zohomail.com; s=zohoarc; b=KECJr8d5qJo6eMwTYxggw5QI4IqBSVTOFQu+qpnj6T5PPGob7LftjyVpFYjJXXgnq9a89thOdUM+opBCdjbLBjoep3ryfxxsm1+bRJi1FXuTWFDd9cXfPoJIpiZ+3YnCjzXgVqcIs4sij018XlchSvSt9wTjjLlQRl498CcqFyg= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1733992585; 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=MRzGHL8a7jlvTqq7ZxETU8b2iDxcAK+LJXWt+PmXXJ8=; b=KNGAP/+5ZAQwuc9xCP2GhLnT/IbRlX/lv/UQ2+gurhIAMeaVSveBEBXyZraQorK49PA6unLxqP+/RzSKcdloOTyGRtr8Rw4k9q+6cVcvsG3rqOH0diynOzb91xOtoqZEEMj6yTS+PtcMfkbf/sUaneiMGeVdg6vebcOfrgvkaEQ= 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=<npiggin@gmail.com> (p=none dis=none) Return-Path: <qemu-devel-bounces+importer=patchew.org@nongnu.org> Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1733992585091517.4797778853705; Thu, 12 Dec 2024 00:36:25 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from <qemu-devel-bounces@nongnu.org>) id 1tLefi-0006jp-Sh; Thu, 12 Dec 2024 03:35:46 -0500 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 <npiggin@gmail.com>) id 1tLefd-0006jK-Rb for qemu-devel@nongnu.org; Thu, 12 Dec 2024 03:35:42 -0500 Received: from mail-pj1-x102e.google.com ([2607:f8b0:4864:20::102e]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from <npiggin@gmail.com>) id 1tLefb-0004Yq-W0 for qemu-devel@nongnu.org; Thu, 12 Dec 2024 03:35:41 -0500 Received: by mail-pj1-x102e.google.com with SMTP id 98e67ed59e1d1-2ee67e9287fso290345a91.0 for <qemu-devel@nongnu.org>; Thu, 12 Dec 2024 00:35:39 -0800 (PST) Received: from wheely.local0.net ([1.146.48.169]) by smtp.gmail.com with ESMTPSA id 98e67ed59e1d1-2f142dae788sm714624a91.12.2024.12.12.00.35.31 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 12 Dec 2024 00:35:36 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1733992538; x=1734597338; 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=MRzGHL8a7jlvTqq7ZxETU8b2iDxcAK+LJXWt+PmXXJ8=; b=W3EgflyQrMjey7r7CdotaeEgSJjIQB/Y1/s3RhY9mJangpV5I5AZkiCpGTEhGal2JU YA/D7hzlzetwdqO8FVwcrUyEqi/itvdIJxaaioOxY6pZ04dwFZ9eaWVRwKdrvjdoA2E5 X5Wy4Z/LsjJ06efMEpwS84zeOd5EuYwvHHbtSuof6K5XNJs0JXpS+yc/oUrPPObYLBYd hK10DPr7PFM2yydX/W2QdzzPA2gcEhbRzKoikw4Nj8FKbF+vgbWgRAuMrSKXfMFGzgR/ YdYLDZSBr10FKNC3FaUs3MnvobybC55ZaqvOKq9t7NRgk76OEORqa1EJ3VdS3cQWoc4L +XqQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1733992538; x=1734597338; 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=MRzGHL8a7jlvTqq7ZxETU8b2iDxcAK+LJXWt+PmXXJ8=; b=sXTJWxPv3zOb+0UElxplB7x4ui1f7HcwqrlVmbMWwwV5dfa27rk16TDUPi/qBA3z7i 0NnvwMg8EoqUaHM0WFulJG91cRXR3CT5aK8MbTO0lECj8FlYcCAVSuSzrZIrtyU3l+0Q CAc4gWMEraKDmK0PaYS8RSDhCJ1bejfEuF71jOt3hbPJmycnICDFghdOupUPYUhFPrHJ Lpli5IR6UQQvKJfLzkfeEQJIR8jH8PrTjTnTRi6D0bypl7nVG8gqbTDrFQS4mvXG8vPE UnSHbDbJviTNugum0P6g/cYj0M9IUqdT2J1o6xWvOXwxaV5tRDR+N69CgipmKYdL54/i fivQ== X-Gm-Message-State: AOJu0Yy/K5Z0+V0udrWwdjQ6bcRXKlYquwgw+wrCDQU5uybWyRxuzkos Fd7f5H7eWPjWWsADogl1Mq83KzBmsNDLt4GREK1l+FbYxIzJUr9ymxYXMA== X-Gm-Gg: ASbGncvLrMAP9R6Zi3t+R10GDcp235yR4iw0yH0wYszVqP6Y4q9Av2BGoIxx8U3LQ9F omJNJVUYHEQBWkuJpvI7vt1axbvwMnkKOdK35yajZh9tZb/Nb4ixY3kavnL5lERCHXRM970gXOc XEuQLK2jVUDV/4gGwvOK4hTB4MZdGcYnkRXHX3y9/nm66QjhmPCvAmEAeV9DuUiXq6jPDTdXz/2 NnGutBwrxqJSEHFUTHVC3D25KjdHWVeNw5uqYb9Mas72/AruG/p9FzLYOI= X-Google-Smtp-Source: AGHT+IEocK2ZRipITNsC67Ce6El/pxrG8FwV4hELc5xRDbueT9T55VH48nAGEENfCqen5+p3x/8yaQ== X-Received: by 2002:a17:90b:4c84:b0:2ee:8427:4b02 with SMTP id 98e67ed59e1d1-2f13930c5afmr4261498a91.28.1733992536903; Thu, 12 Dec 2024 00:35:36 -0800 (PST) From: Nicholas Piggin <npiggin@gmail.com> To: qemu-devel@nongnu.org Cc: Nicholas Piggin <npiggin@gmail.com>, "Michael S. Tsirkin" <mst@redhat.com>, Marcel Apfelbaum <marcel.apfelbaum@gmail.com>, Fabiano Rosas <farosas@suse.de>, Laurent Vivier <lvivier@redhat.com>, Paolo Bonzini <pbonzini@redhat.com>, Dmitry Fleytman <dmitry.fleytman@gmail.com>, Akihiko Odaki <akihiko.odaki@daynix.com>, Sriram Yagnaraman <sriram.yagnaraman@ericsson.com> Subject: [PATCH 3/8] pci/msix: Implement PBA writes Date: Thu, 12 Dec 2024 18:34:56 +1000 Message-ID: <20241212083502.1439033-4-npiggin@gmail.com> X-Mailer: git-send-email 2.45.2 In-Reply-To: <20241212083502.1439033-1-npiggin@gmail.com> References: <20241212083502.1439033-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::102e; envelope-from=npiggin@gmail.com; helo=mail-pj1-x102e.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: <qemu-devel.nongnu.org> List-Unsubscribe: <https://lists.nongnu.org/mailman/options/qemu-devel>, <mailto:qemu-devel-request@nongnu.org?subject=unsubscribe> List-Archive: <https://lists.nongnu.org/archive/html/qemu-devel> List-Post: <mailto:qemu-devel@nongnu.org> List-Help: <mailto:qemu-devel-request@nongnu.org?subject=help> List-Subscribe: <https://lists.nongnu.org/mailman/listinfo/qemu-devel>, <mailto:qemu-devel-request@nongnu.org?subject=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: 1733992585852116601 Content-Type: text/plain; charset="utf-8" Implement MMIO PBA writes, 1 to trigger and 0 to clear. This functionality is used by some qtests, which keep the msix irq masked and test irq pending via the PBA bits, for simplicity. Some tests expect to be able to clear the irq with a store, so a side-effect of this is that qpci_msix_pending() would actually clear the pending bit where it previously did not. This actually causes some [possibly buggy] tests to fail. So to avoid breakage until tests are re-examined, prior behavior of qpci_msix_pending() is kept by changing it to avoid clearing PBA. A new function qpci_msix_test_clear_pending() is added for tests that do want the PBA clearing, and it will be used by XHCI and e1000e/igb tests in subsequent changes. Cc: Michael S. Tsirkin <mst@redhat.com> Cc: Marcel Apfelbaum <marcel.apfelbaum@gmail.com> Cc: Dmitry Fleytman <dmitry.fleytman@gmail.com> Cc: Akihiko Odaki <akihiko.odaki@daynix.com> Cc: Sriram Yagnaraman <sriram.yagnaraman@ericsson.com> Signed-off-by: Nicholas Piggin <npiggin@gmail.com> --- tests/qtest/libqos/pci.h | 1 + hw/pci/msix.c | 16 ++++++++++++++++ tests/qtest/libqos/pci.c | 20 +++++++++++++++++--- 3 files changed, 34 insertions(+), 3 deletions(-) diff --git a/tests/qtest/libqos/pci.h b/tests/qtest/libqos/pci.h index 5a7b2454ad5..de540f7803f 100644 --- a/tests/qtest/libqos/pci.h +++ b/tests/qtest/libqos/pci.h @@ -94,6 +94,7 @@ uint8_t qpci_find_capability(QPCIDevice *dev, uint8_t id,= uint8_t start_addr); void qpci_msix_enable(QPCIDevice *dev); void qpci_msix_disable(QPCIDevice *dev); bool qpci_msix_pending(QPCIDevice *dev, uint16_t entry); +bool qpci_msix_test_clear_pending(QPCIDevice *dev, uint16_t entry); bool qpci_msix_masked(QPCIDevice *dev, uint16_t entry); uint16_t qpci_msix_table_size(QPCIDevice *dev); =20 diff --git a/hw/pci/msix.c b/hw/pci/msix.c index 487e49834ee..b16b03b888f 100644 --- a/hw/pci/msix.c +++ b/hw/pci/msix.c @@ -260,6 +260,22 @@ static uint64_t msix_pba_mmio_read(void *opaque, hwadd= r addr, static void msix_pba_mmio_write(void *opaque, hwaddr addr, uint64_t val, unsigned size) { + PCIDevice *dev =3D opaque; + unsigned vector_start =3D addr * 8; + unsigned vector_end =3D MIN(addr + size * 8, dev->msix_entries_nr); + unsigned i; + + for (i =3D vector_start; i < vector_end; i++) { + if ((val >> i) & 1) { + if (!msix_is_pending(dev, i)) { + msix_notify(dev, i); + } + } else { + if (msix_is_pending(dev, i)) { + msix_clr_pending(dev, i); + } + } + } } =20 static const MemoryRegionOps msix_pba_mmio_ops =3D { diff --git a/tests/qtest/libqos/pci.c b/tests/qtest/libqos/pci.c index 023c1617680..f8d655a0e61 100644 --- a/tests/qtest/libqos/pci.c +++ b/tests/qtest/libqos/pci.c @@ -361,9 +361,23 @@ bool qpci_msix_pending(QPCIDevice *dev, uint16_t entry) =20 g_assert(dev->msix_enabled); pba_entry =3D qpci_io_readl(dev, dev->msix_pba_bar, dev->msix_pba_off = + off); - qpci_io_writel(dev, dev->msix_pba_bar, dev->msix_pba_off + off, - pba_entry & ~(1 << bit_n)); - return (pba_entry & (1 << bit_n)) !=3D 0; + return pba_entry & (1 << bit_n); +} + +bool qpci_msix_test_clear_pending(QPCIDevice *dev, uint16_t entry) +{ + uint32_t pba_entry; + uint8_t bit_n =3D entry % 32; + uint64_t off =3D (entry / 32) * PCI_MSIX_ENTRY_SIZE / 4; + + g_assert(dev->msix_enabled); + pba_entry =3D qpci_io_readl(dev, dev->msix_pba_bar, dev->msix_pba_off = + off); + if (pba_entry & (1 << bit_n)) { + qpci_io_writel(dev, dev->msix_pba_bar, dev->msix_pba_off + off, + pba_entry & ~(1 << bit_n)); + return true; + } + return false; } =20 bool qpci_msix_masked(QPCIDevice *dev, uint16_t entry) --=20 2.45.2 From nobody Wed May 7 17:41:28 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=1733992594; cv=none; d=zohomail.com; s=zohoarc; b=bg1hnCUerzxpI5EgvkNW0c9tRdwuVWia6bqeYFDnok1L3z7sNUuBvs/GW1GZ37w+ENCE9BxO/Yem5H3PKcFSkJovPvwIfpWBnQ6Q6Hn4zUo4IXP+oN3Mz7+pkJ+UXZZhT5vj48R+M4VU93MarlicJflCmRei6qhBh/T/EWRUDpo= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1733992594; 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=EwbtPpm8oHZVdeojkJajdcvG/Mqc1VDLbH8Cnvl+GKI=; b=b4WqMvX7503WGIf0G118w3GnNKXpiL31aTKW7fIiaQoW+uTgewAC3eTUi9tMF/o+foiDZcp0Ax8HtW1px3zTQFqLEaPOghCGwHg1ae0fmRH4Vfa9b9KrnX+al0kXFIREH9unCgEauRzJz0b2qWzKaiyIRcvMz0SPiSBOpEcexII= 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=<npiggin@gmail.com> (p=none dis=none) Return-Path: <qemu-devel-bounces+importer=patchew.org@nongnu.org> Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1733992594734817.5160561210407; Thu, 12 Dec 2024 00:36:34 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from <qemu-devel-bounces@nongnu.org>) id 1tLefo-0006ko-04; Thu, 12 Dec 2024 03:35:54 -0500 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 <npiggin@gmail.com>) id 1tLefj-0006k5-Td for qemu-devel@nongnu.org; Thu, 12 Dec 2024 03:35:48 -0500 Received: from mail-pj1-x1031.google.com ([2607:f8b0:4864:20::1031]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from <npiggin@gmail.com>) id 1tLefg-0004j7-T6 for qemu-devel@nongnu.org; Thu, 12 Dec 2024 03:35:47 -0500 Received: by mail-pj1-x1031.google.com with SMTP id 98e67ed59e1d1-2ee67e9287fso290396a91.0 for <qemu-devel@nongnu.org>; Thu, 12 Dec 2024 00:35:44 -0800 (PST) Received: from wheely.local0.net ([1.146.48.169]) by smtp.gmail.com with ESMTPSA id 98e67ed59e1d1-2f142dae788sm714624a91.12.2024.12.12.00.35.37 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 12 Dec 2024 00:35:42 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1733992543; x=1734597343; 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=EwbtPpm8oHZVdeojkJajdcvG/Mqc1VDLbH8Cnvl+GKI=; b=PSOt4Spr9IJ03yHxhSh0l0PdYqAHqwnXyngmv4CO1g9kR/7NUX2KpThXde8AZaQumZ 5Xru3J0QyBxq/mugkKHMzDmV7dysDqpWC/yyBgqA8/Ygw7y5WrrFRVfAORWJqiDPsY/P 4kIpIcrx2ePEfgU3yi5FqootVCzdum1+wmquPx/ohxS2l+nYCGG65y4s0S3+bLDyrIA2 DCCuvQZpVEUCOZwfdOugNOtAbDf5W3Rbm2e/0R44lvT4x+7aTd1wC1iryOxoY1lSBgTU ZG06raV1lC3NEVow1VPeIRorjdHRX8QevqmaF+4vn2XFuAmlcxHwukR5bSiOFfPVVeHF QP/w== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1733992543; x=1734597343; 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=EwbtPpm8oHZVdeojkJajdcvG/Mqc1VDLbH8Cnvl+GKI=; b=AyqvWTLZrEYik0ExjuUVFHVKbyuFYGUV+Kll3NirMKhKTlw+tF+A/OkdAM9zb7b8Xp KnOpgEnrrxGvw01Dxt+TJ3naVFvxYP2y06ODlgVTRYOCZQ2O1otU6tX3MYFHzazcUxR/ rn1GpBBVYbdDpHdp35jVAFYFqMWyItLvphDiM/ufFnOp1a58IBW4x2aeMNN2ok6nyRJq 12rL4Jejx7XGsz7a5epi5BQEDvmcCwH7bFTsEgNrDJUjKIoVDEh9VQqE4XPqhRfyjteV l+ayyoyYplNj/YFZVWEG1hGcJ6mMmi0eFZL9NgcygMag9YLsdrSJGNmtmwJYjqoYcyzk hsBQ== X-Gm-Message-State: AOJu0YzLt01IX914BJzwlAsM8fwb7G7z8Y1uPIPc7VjUniTCynuttVbV ZC3ostNG4XhWXDbnKGoQqNIUNUJDKzQ5bV+bG8Xwz9yHh31ZOPlttEX8fw== X-Gm-Gg: ASbGncuS6Kjr6WueRtjCVhedzCfQNroF8DudbPYX7BAf6qxtow2F/DXHLMtd/HHroRu x5lUFAhQ8AyUdAbjhZI5bNUN7ipdMIcaBWmQX0fYR92C9XNTD0A2/TB1/HFBjB9UdWMiVFb0m4k vniOPEP8+Hnpzr0TQvW/fFYGh8cboLF3dQu5Ps0fVNAvDc97KteWkyQcTu0ZI1+nTAVAyXdAjJD jKD8wfXudIgGxyoGwh22Yb5glp0bBGhaBPidptu4RmPp/m93w1+KVToQAk= X-Google-Smtp-Source: AGHT+IHDkoRZ73NmPWisp+r55BDCN6PStNvz73TuYLMuGj5c2H4c4ow/i/BC7KgQmavnshPn3wM6fA== X-Received: by 2002:a17:90b:1806:b0:2ea:3f34:f18d with SMTP id 98e67ed59e1d1-2f139293053mr4998291a91.10.1733992543081; Thu, 12 Dec 2024 00:35:43 -0800 (PST) From: Nicholas Piggin <npiggin@gmail.com> To: qemu-devel@nongnu.org Cc: Nicholas Piggin <npiggin@gmail.com>, "Michael S. Tsirkin" <mst@redhat.com>, Marcel Apfelbaum <marcel.apfelbaum@gmail.com>, Fabiano Rosas <farosas@suse.de>, Laurent Vivier <lvivier@redhat.com>, Paolo Bonzini <pbonzini@redhat.com>, Dmitry Fleytman <dmitry.fleytman@gmail.com>, Akihiko Odaki <akihiko.odaki@daynix.com>, Sriram Yagnaraman <sriram.yagnaraman@ericsson.com> Subject: [PATCH 4/8] tests/qtest/e1000e|igb: Fix e1000e and igb tests to re-trigger interrupts Date: Thu, 12 Dec 2024 18:34:57 +1000 Message-ID: <20241212083502.1439033-5-npiggin@gmail.com> X-Mailer: git-send-email 2.45.2 In-Reply-To: <20241212083502.1439033-1-npiggin@gmail.com> References: <20241212083502.1439033-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::1031; envelope-from=npiggin@gmail.com; helo=mail-pj1-x1031.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: <qemu-devel.nongnu.org> List-Unsubscribe: <https://lists.nongnu.org/mailman/options/qemu-devel>, <mailto:qemu-devel-request@nongnu.org?subject=unsubscribe> List-Archive: <https://lists.nongnu.org/archive/html/qemu-devel> List-Post: <mailto:qemu-devel@nongnu.org> List-Help: <mailto:qemu-devel-request@nongnu.org?subject=help> List-Subscribe: <https://lists.nongnu.org/mailman/listinfo/qemu-devel>, <mailto:qemu-devel-request@nongnu.org?subject=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: 1733992595982116600 Content-Type: text/plain; charset="utf-8" The e1000e and igb tests don't clear the msix pending bit after waiting for it sit is masked so the irq doesn't get delivered. Failing to clear the pending interrupt means all subsequent waits for interrupt after the first do not actually wait for an interrupt genreated by the device. Explicitly clearing the msix pending bit results in the multiple-transfers test hanging waiting for the second interrupt. This happens because the e1000e and igb tests do not clear (or set auto-clear) on queue interrupts, so the cause remains ste in ICR/EICR, which inhibits triggering of a new interrupt. Fix both these problems. Clear the msix pending bit explicitly after waiting for it; and clear the ICR/EICR cause bits after seeing and interrupt (also verify we saw the correct cause bit). Cc: Michael S. Tsirkin <mst@redhat.com> Cc: Marcel Apfelbaum <marcel.apfelbaum@gmail.com> Cc: Dmitry Fleytman <dmitry.fleytman@gmail.com> Cc: Akihiko Odaki <akihiko.odaki@daynix.com> Cc: Sriram Yagnaraman <sriram.yagnaraman@ericsson.com> Signed-off-by: Nicholas Piggin <npiggin@gmail.com> --- tests/qtest/e1000e-test.c | 8 ++++++-- tests/qtest/igb-test.c | 8 ++++++-- tests/qtest/libqos/e1000e.c | 2 +- 3 files changed, 13 insertions(+), 5 deletions(-) diff --git a/tests/qtest/e1000e-test.c b/tests/qtest/e1000e-test.c index de9738fdb74..a69759da70e 100644 --- a/tests/qtest/e1000e-test.c +++ b/tests/qtest/e1000e-test.c @@ -64,8 +64,10 @@ static void e1000e_send_verify(QE1000E *d, int *test_soc= kets, QGuestAllocator *a /* Put descriptor to the ring */ e1000e_tx_ring_push(d, &descr); =20 - /* Wait for TX WB interrupt */ + /* Wait for TX WB interrupt (this clears the MSIX PBA) */ e1000e_wait_isr(d, E1000E_TX0_MSG_ID); + /* Read ICR which clears it ready for next interrupt, assert TXQ0 caus= e */ + g_assert(e1000e_macreg_read(d, E1000_ICR) & E1000_ICR_TXQ0); =20 /* Check DD bit */ g_assert_cmphex(le32_to_cpu(descr.upper.data) & E1000_TXD_STAT_DD, =3D= =3D, @@ -115,8 +117,10 @@ static void e1000e_receive_verify(QE1000E *d, int *tes= t_sockets, QGuestAllocator /* Put descriptor to the ring */ e1000e_rx_ring_push(d, &descr); =20 - /* Wait for TX WB interrupt */ + /* Wait for TX WB interrupt (this clears the MSIX PBA) */ e1000e_wait_isr(d, E1000E_RX0_MSG_ID); + /* Read ICR which clears it ready for next interrupt, assert RXQ0 caus= e */ + g_assert(e1000e_macreg_read(d, E1000_ICR) & E1000_ICR_RXQ0); =20 /* Check DD bit */ g_assert_cmphex(le32_to_cpu(descr.wb.upper.status_error) & diff --git a/tests/qtest/igb-test.c b/tests/qtest/igb-test.c index 3d397ea6973..2f22c4fb208 100644 --- a/tests/qtest/igb-test.c +++ b/tests/qtest/igb-test.c @@ -67,8 +67,10 @@ static void igb_send_verify(QE1000E *d, int *test_socket= s, QGuestAllocator *allo /* Put descriptor to the ring */ e1000e_tx_ring_push(d, &descr); =20 - /* Wait for TX WB interrupt */ + /* Wait for TX WB interrupt (this clears the MSIX PBA) */ e1000e_wait_isr(d, E1000E_TX0_MSG_ID); + /* Read EICR which clears it ready for next interrupt, assert TXQ0 cau= se */ + g_assert(e1000e_macreg_read(d, E1000_EICR) & (1 << E1000E_TX0_MSG_ID)); =20 /* Check DD bit */ g_assert_cmphex(le32_to_cpu(descr.wb.status) & E1000_TXD_STAT_DD, =3D= =3D, @@ -118,8 +120,10 @@ static void igb_receive_verify(QE1000E *d, int *test_s= ockets, QGuestAllocator *a /* Put descriptor to the ring */ e1000e_rx_ring_push(d, &descr); =20 - /* Wait for TX WB interrupt */ + /* Wait for TX WB interrupt (this clears the MSIX PBA) */ e1000e_wait_isr(d, E1000E_RX0_MSG_ID); + /* Read EICR which clears it ready for next interrupt, assert RXQ0 cau= se */ + g_assert(e1000e_macreg_read(d, E1000_EICR) & (1 << E1000E_RX0_MSG_ID)); =20 /* Check DD bit */ g_assert_cmphex(le32_to_cpu(descr.wb.upper.status_error) & diff --git a/tests/qtest/libqos/e1000e.c b/tests/qtest/libqos/e1000e.c index 925654c7fd4..8ef6a04f43e 100644 --- a/tests/qtest/libqos/e1000e.c +++ b/tests/qtest/libqos/e1000e.c @@ -83,7 +83,7 @@ void e1000e_wait_isr(QE1000E *d, uint16_t msg_id) guint64 end_time =3D g_get_monotonic_time() + 5 * G_TIME_SPAN_SECOND; =20 do { - if (qpci_msix_pending(&d_pci->pci_dev, msg_id)) { + if (qpci_msix_test_clear_pending(&d_pci->pci_dev, msg_id)) { return; } qtest_clock_step(d_pci->pci_dev.bus->qts, 10000); --=20 2.45.2 From nobody Wed May 7 17:41:28 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=1733992599; cv=none; d=zohomail.com; s=zohoarc; b=Ig+/PZi4mhMET7wGG+OqntG118XUbR4Gx2OPxStmEGTLXOy8mWHEXUVed0B94713fcZiw0/fhY+lV2jTjs80r5keOIJHXWRjuj/NjvT6ditUgVIbxOlxcOh00y7RknJELcdIexe9cM6dURZ2rLp4T6/SAqjOBGXiQuu5W/3UnKs= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1733992599; 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=TBPTyr+TozmsNLBY7c67priDhmeDgbccIVy6qyyd/o0=; b=hDnn8nVA+a+ACxvMy0XaXUzZM2uO1HURJpJEuNEEmQokvZlxHmEmcSIPabPYYGAsZIF1kNH7HT6QYJLx6lVUZtTBKJWlXNYZo5M3coRO2HpMZS3yHU9saXGfwFPyfm7VyOaN+S0XcSbBAAc8nfqx425y7eFpLingFI/TlIQ1RJc= 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=<npiggin@gmail.com> (p=none dis=none) Return-Path: <qemu-devel-bounces+importer=patchew.org@nongnu.org> Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1733992599850287.27786939556256; Thu, 12 Dec 2024 00:36:39 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from <qemu-devel-bounces@nongnu.org>) id 1tLegC-0006p5-Iw; Thu, 12 Dec 2024 03:36:18 -0500 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 <npiggin@gmail.com>) id 1tLefr-0006l5-DY for qemu-devel@nongnu.org; Thu, 12 Dec 2024 03:35:56 -0500 Received: from mail-pg1-x536.google.com ([2607:f8b0:4864:20::536]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from <npiggin@gmail.com>) id 1tLefn-00052b-Gf for qemu-devel@nongnu.org; Thu, 12 Dec 2024 03:35:54 -0500 Received: by mail-pg1-x536.google.com with SMTP id 41be03b00d2f7-7e9e38dd5f1so292100a12.0 for <qemu-devel@nongnu.org>; Thu, 12 Dec 2024 00:35:51 -0800 (PST) Received: from wheely.local0.net ([1.146.48.169]) by smtp.gmail.com with ESMTPSA id 98e67ed59e1d1-2f142dae788sm714624a91.12.2024.12.12.00.35.43 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 12 Dec 2024 00:35:49 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1733992550; x=1734597350; 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=TBPTyr+TozmsNLBY7c67priDhmeDgbccIVy6qyyd/o0=; b=PRoB8cHmYHsh5pjCa6BmUOwYfHbl+xzVr521uNSk7sFt1GhgI9GVwHZFJ9UlMkeiYH ri36tauPfxfTrUUIafq8SP+udnQ8sm2RSH/1D8qyUG/tfhbILnQ3USEnrF/yPQpJ8PiA PM3ob3w5cKSzEbgQdOYLjwUdap2P/14zwX1XNOZ6FWBDrvxadYAFemqkS1wgjkKEnmtN 41QhJXg/8coBep/c/VcH/EKb6D6KA4Mq8O3lGnR3UYkjUjqGWGpkiiR2+aZV0r0UTT9C 1lRyZ/+kGDtPoQ1WDHaUQ6Db40OF9mkLFMkGJcNpDd5bnXkQh954V9S6okudOeL32gmT QHxg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1733992550; x=1734597350; 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=TBPTyr+TozmsNLBY7c67priDhmeDgbccIVy6qyyd/o0=; b=nGq38lR1sUd45Z7V0uAuyPFKZEdVCrC8HFEHUvPWn0y4y8qJNHfi8Mzu3DK1EBDiLM yPGOPjJTloPHaTAjhdiEwW0manRPC3hXXRmu67n/9RIzG7BtDhAelQK75u1Az0ZIY3Zm UpHS9H+qjywZO3jT20vMJ0K+enscdeL4bWu8T0HHuyAFr1S6SvDaR2p3iwuDXaQgoWmu EuzSdfgTe5TKUxDA/jaDv8LAzxLwcdF5cxH8nxbYR/EIk1G7eGmnI9XRr9rGlt3IjUXK T4uEcSY0zJzueb5hngMBf5Wk/P6NvGo8vuvbaG0YFaVM/n7vbUoa3e0/9JxnJCM5wXAM mIVg== X-Gm-Message-State: AOJu0YwFK9IKcsoZ6R+bbEkt6Bytss/vjO9KnysXcqWBz1EyCZOSxfE9 s0nf3CX+89Q9QAthHnqX8AW6u1p6hp1uTOgysIH86gVYSBKijX8l2Q/hxg== X-Gm-Gg: ASbGncsf69jSK4nFhJkhrvmv+FeJLi2eWJ7ZcUVTCAWekSAeDSQCtKrpzXKQacEDoFT QK0TwwnenwaHDTvcY5W32Ph2XdU8YeGh5lo/DXujDXeRAoakaNb/pAZKfu6MFS3zi1lx6dMjJCa mZ51LG7ywM9Os0Y11YIyzGaAOPlEdZnNfZ7eEGLbuUYPf0Gh5KxO3CnS92wLow+8GFUoEud7Pr4 ToBvDxH7mKpGvo2l4wm4pbnXazJCvxc6JkYkFIYFXWPOhmY53U9sDQP9po= X-Google-Smtp-Source: AGHT+IHFFoGiQYPsUnFrj1Xx2zpStpVx4hCOL/00sxiaiQYk1o57sGY3tff+wVzyRg40z3dxrzmm9Q== X-Received: by 2002:a17:90b:3c4f:b0:2ee:a744:a4fe with SMTP id 98e67ed59e1d1-2f13930c26bmr4472795a91.25.1733992549765; Thu, 12 Dec 2024 00:35:49 -0800 (PST) From: Nicholas Piggin <npiggin@gmail.com> To: qemu-devel@nongnu.org Cc: Nicholas Piggin <npiggin@gmail.com>, "Michael S. Tsirkin" <mst@redhat.com>, Marcel Apfelbaum <marcel.apfelbaum@gmail.com>, Fabiano Rosas <farosas@suse.de>, Laurent Vivier <lvivier@redhat.com>, Paolo Bonzini <pbonzini@redhat.com>, Dmitry Fleytman <dmitry.fleytman@gmail.com>, Akihiko Odaki <akihiko.odaki@daynix.com>, Sriram Yagnaraman <sriram.yagnaraman@ericsson.com> Subject: [PATCH 5/8] hw/usb/xhci: Move HCD constants to a header and add register constants Date: Thu, 12 Dec 2024 18:34:58 +1000 Message-ID: <20241212083502.1439033-6-npiggin@gmail.com> X-Mailer: git-send-email 2.45.2 In-Reply-To: <20241212083502.1439033-1-npiggin@gmail.com> References: <20241212083502.1439033-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::536; envelope-from=npiggin@gmail.com; helo=mail-pg1-x536.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: <qemu-devel.nongnu.org> List-Unsubscribe: <https://lists.nongnu.org/mailman/options/qemu-devel>, <mailto:qemu-devel-request@nongnu.org?subject=unsubscribe> List-Archive: <https://lists.nongnu.org/archive/html/qemu-devel> List-Post: <mailto:qemu-devel@nongnu.org> List-Help: <mailto:qemu-devel-request@nongnu.org?subject=help> List-Subscribe: <https://lists.nongnu.org/mailman/listinfo/qemu-devel>, <mailto:qemu-devel-request@nongnu.org?subject=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: 1733992602227116600 Content-Type: text/plain; charset="utf-8" Prepare to use some of these constants in xhci qtest code. Signed-off-by: Nicholas Piggin <npiggin@gmail.com> --- hw/usb/hcd-xhci.h | 190 +++++++++++++++++++++++++++++++ hw/usb/hcd-xhci.c | 283 ++++++++++------------------------------------ 2 files changed, 250 insertions(+), 223 deletions(-) diff --git a/hw/usb/hcd-xhci.h b/hw/usb/hcd-xhci.h index fe16d7ad055..5781542f40e 100644 --- a/hw/usb/hcd-xhci.h +++ b/hw/usb/hcd-xhci.h @@ -115,6 +115,196 @@ typedef enum TRBCCode { CC_SPLIT_TRANSACTION_ERROR } TRBCCode; =20 +/* Register definitions */ +#define XHCI_HCCAP_CAPLENGTH 0x00 +#define XHCI_HCCAP_HCIVERSION 0x02 +#define XHCI_HCCAP_HCSPARAMS1 0x04 +#define XHCI_HCCAP_HCSPARAMS2 0x08 +#define XHCI_HCCAP_HCSPARAMS3 0x0C +#define XHCI_HCCAP_HCCPARAMS1 0x10 +#define XHCI_HCCAP_DBOFF 0x14 +#define XHCI_HCCAP_RTSOFF 0x18 +#define XHCI_HCCAP_HCCPARAMS2 0x1C +#define XHCI_HCCAP_EXTCAP_START 0x20 /* SW-defined */ + +#define XHCI_PORT_PORTSC 0x00 +#define PORTSC_CCS (1 << 0) +#define PORTSC_PED (1 << 1) +#define PORTSC_OCA (1 << 3) +#define PORTSC_PR (1 << 4) +#define PORTSC_PLS_SHIFT 5 +#define PORTSC_PLS_MASK 0xf +#define PORTSC_PP (1 << 9) +#define PORTSC_SPEED_SHIFT 10 +#define PORTSC_SPEED_MASK 0xf +#define PORTSC_SPEED_FULL (1 << 10) +#define PORTSC_SPEED_LOW (2 << 10) +#define PORTSC_SPEED_HIGH (3 << 10) +#define PORTSC_SPEED_SUPER (4 << 10) +#define PORTSC_PIC_SHIFT 14 +#define PORTSC_PIC_MASK 0x3 +#define PORTSC_LWS (1 << 16) +#define PORTSC_CSC (1 << 17) +#define PORTSC_PEC (1 << 18) +#define PORTSC_WRC (1 << 19) +#define PORTSC_OCC (1 << 20) +#define PORTSC_PRC (1 << 21) +#define PORTSC_PLC (1 << 22) +#define PORTSC_CEC (1 << 23) +#define PORTSC_CAS (1 << 24) +#define PORTSC_WCE (1 << 25) +#define PORTSC_WDE (1 << 26) +#define PORTSC_WOE (1 << 27) +#define PORTSC_DR (1 << 30) +#define PORTSC_WPR (1 << 31) +#define XHCI_PORT_PORTPMSC 0x04 +#define XHCI_PORT_PORTLI 0x08 +#define XHCI_PORT_PORTHLPMC 0x0C + +#define XHCI_OPER_USBCMD 0x00 +#define USBCMD_RS (1 << 0) +#define USBCMD_HCRST (1 << 1) +#define USBCMD_INTE (1 << 2) +#define USBCMD_HSEE (1 << 3) +#define USBCMD_LHCRST (1 << 7) +#define USBCMD_CSS (1 << 8) +#define USBCMD_CRS (1 << 9) +#define USBCMD_EWE (1 << 10) +#define USBCMD_EU3S (1 << 11) +#define XHCI_OPER_USBSTS 0x04 +#define USBSTS_HCH (1 << 0) +#define USBSTS_HSE (1 << 2) +#define USBSTS_EINT (1 << 3) +#define USBSTS_PCD (1 << 4) +#define USBSTS_SSS (1 << 8) +#define USBSTS_RSS (1 << 9) +#define USBSTS_SRE (1 << 10) +#define USBSTS_CNR (1 << 11) +#define USBSTS_HCE (1 << 12) +#define XHCI_OPER_PAGESIZE 0x08 +#define XHCI_OPER_DNCTRL 0x14 +#define XHCI_OPER_CRCR_LO 0x18 +#define CRCR_RCS (1 << 0) +#define CRCR_CS (1 << 1) +#define CRCR_CA (1 << 2) +#define CRCR_CRR (1 << 3) +#define XHCI_OPER_CRCR_HI 0x1C +#define XHCI_OPER_DCBAAP_LO 0x30 +#define XHCI_OPER_DCBAAP_HI 0x34 +#define XHCI_OPER_CONFIG 0x38 + +#define XHCI_OPER_MFINDEX 0x00 +#define XHCI_OPER_IR0 0x20 +#define XHCI_OPER_IR_SZ 0x20 + +#define XHCI_INTR_IMAN 0x00 +#define IMAN_IP (1 << 0) +#define IMAN_IE (1 << 1) +#define XHCI_INTR_IMOD 0x04 +#define XHCI_INTR_ERSTSZ 0x08 +#define XHCI_INTR_ERSTBA_LO 0x10 +#define XHCI_INTR_ERSTBA_HI 0x14 +#define XHCI_INTR_ERDP_LO 0x18 +#define ERDP_EHB (1 << 3) +#define XHCI_INTR_ERDP_HI 0x1C + +#define TRB_SIZE 16 +typedef struct XHCITRB { + uint64_t parameter; + uint32_t status; + uint32_t control; + dma_addr_t addr; + bool ccs; +} XHCITRB; + +enum { + PLS_U0 =3D 0, + PLS_U1 =3D 1, + PLS_U2 =3D 2, + PLS_U3 =3D 3, + PLS_DISABLED =3D 4, + PLS_RX_DETECT =3D 5, + PLS_INACTIVE =3D 6, + PLS_POLLING =3D 7, + PLS_RECOVERY =3D 8, + PLS_HOT_RESET =3D 9, + PLS_COMPILANCE_MODE =3D 10, + PLS_TEST_MODE =3D 11, + PLS_RESUME =3D 15, +}; + +#define CR_LINK TR_LINK + +#define TRB_C (1 << 0) +#define TRB_TYPE_SHIFT 10 +#define TRB_TYPE_MASK 0x3f +#define TRB_TYPE(t) (((t).control >> TRB_TYPE_SHIFT) & TRB_TYPE_MA= SK) + +#define TRB_EV_ED (1 << 2) + +#define TRB_TR_ENT (1 << 1) +#define TRB_TR_ISP (1 << 2) +#define TRB_TR_NS (1 << 3) +#define TRB_TR_CH (1 << 4) +#define TRB_TR_IOC (1 << 5) +#define TRB_TR_IDT (1 << 6) +#define TRB_TR_TBC_SHIFT 7 +#define TRB_TR_TBC_MASK 0x3 +#define TRB_TR_BEI (1 << 9) +#define TRB_TR_TLBPC_SHIFT 16 +#define TRB_TR_TLBPC_MASK 0xf +#define TRB_TR_FRAMEID_SHIFT 20 +#define TRB_TR_FRAMEID_MASK 0x7ff +#define TRB_TR_SIA (1 << 31) + +#define TRB_TR_DIR (1 << 16) + +#define TRB_CR_SLOTID_SHIFT 24 +#define TRB_CR_SLOTID_MASK 0xff +#define TRB_CR_EPID_SHIFT 16 +#define TRB_CR_EPID_MASK 0x1f + +#define TRB_CR_BSR (1 << 9) +#define TRB_CR_DC (1 << 9) + +#define TRB_LK_TC (1 << 1) + +#define TRB_INTR_SHIFT 22 +#define TRB_INTR_MASK 0x3ff +#define TRB_INTR(t) (((t).status >> TRB_INTR_SHIFT) & TRB_INTR_MAS= K) + +#define EP_TYPE_MASK 0x7 +#define EP_TYPE_SHIFT 3 + +#define EP_STATE_MASK 0x7 +#define EP_DISABLED (0 << 0) +#define EP_RUNNING (1 << 0) +#define EP_HALTED (2 << 0) +#define EP_STOPPED (3 << 0) +#define EP_ERROR (4 << 0) + +#define SLOT_STATE_MASK 0x1f +#define SLOT_STATE_SHIFT 27 +#define SLOT_STATE(s) (((s) >> SLOT_STATE_SHIFT) & SLOT_STATE_MASK) +#define SLOT_ENABLED 0 +#define SLOT_DEFAULT 1 +#define SLOT_ADDRESSED 2 +#define SLOT_CONFIGURED 3 + +#define SLOT_CONTEXT_ENTRIES_MASK 0x1f +#define SLOT_CONTEXT_ENTRIES_SHIFT 27 + +typedef enum EPType { + ET_INVALID =3D 0, + ET_ISO_OUT, + ET_BULK_OUT, + ET_INTR_OUT, + ET_CONTROL, + ET_ISO_IN, + ET_BULK_IN, + ET_INTR_IN, +} EPType; + typedef struct XHCIRing { dma_addr_t dequeue; bool ccs; diff --git a/hw/usb/hcd-xhci.c b/hw/usb/hcd-xhci.c index d85adaca0dc..df0421ec326 100644 --- a/hw/usb/hcd-xhci.c +++ b/hw/usb/hcd-xhci.c @@ -65,154 +65,6 @@ # error Increase XHCI_LEN_REGS #endif =20 -/* bit definitions */ -#define USBCMD_RS (1<<0) -#define USBCMD_HCRST (1<<1) -#define USBCMD_INTE (1<<2) -#define USBCMD_HSEE (1<<3) -#define USBCMD_LHCRST (1<<7) -#define USBCMD_CSS (1<<8) -#define USBCMD_CRS (1<<9) -#define USBCMD_EWE (1<<10) -#define USBCMD_EU3S (1<<11) - -#define USBSTS_HCH (1<<0) -#define USBSTS_HSE (1<<2) -#define USBSTS_EINT (1<<3) -#define USBSTS_PCD (1<<4) -#define USBSTS_SSS (1<<8) -#define USBSTS_RSS (1<<9) -#define USBSTS_SRE (1<<10) -#define USBSTS_CNR (1<<11) -#define USBSTS_HCE (1<<12) - - -#define PORTSC_CCS (1<<0) -#define PORTSC_PED (1<<1) -#define PORTSC_OCA (1<<3) -#define PORTSC_PR (1<<4) -#define PORTSC_PLS_SHIFT 5 -#define PORTSC_PLS_MASK 0xf -#define PORTSC_PP (1<<9) -#define PORTSC_SPEED_SHIFT 10 -#define PORTSC_SPEED_MASK 0xf -#define PORTSC_SPEED_FULL (1<<10) -#define PORTSC_SPEED_LOW (2<<10) -#define PORTSC_SPEED_HIGH (3<<10) -#define PORTSC_SPEED_SUPER (4<<10) -#define PORTSC_PIC_SHIFT 14 -#define PORTSC_PIC_MASK 0x3 -#define PORTSC_LWS (1<<16) -#define PORTSC_CSC (1<<17) -#define PORTSC_PEC (1<<18) -#define PORTSC_WRC (1<<19) -#define PORTSC_OCC (1<<20) -#define PORTSC_PRC (1<<21) -#define PORTSC_PLC (1<<22) -#define PORTSC_CEC (1<<23) -#define PORTSC_CAS (1<<24) -#define PORTSC_WCE (1<<25) -#define PORTSC_WDE (1<<26) -#define PORTSC_WOE (1<<27) -#define PORTSC_DR (1<<30) -#define PORTSC_WPR (1<<31) - -#define CRCR_RCS (1<<0) -#define CRCR_CS (1<<1) -#define CRCR_CA (1<<2) -#define CRCR_CRR (1<<3) - -#define IMAN_IP (1<<0) -#define IMAN_IE (1<<1) - -#define ERDP_EHB (1<<3) - -#define TRB_SIZE 16 -typedef struct XHCITRB { - uint64_t parameter; - uint32_t status; - uint32_t control; - dma_addr_t addr; - bool ccs; -} XHCITRB; - -enum { - PLS_U0 =3D 0, - PLS_U1 =3D 1, - PLS_U2 =3D 2, - PLS_U3 =3D 3, - PLS_DISABLED =3D 4, - PLS_RX_DETECT =3D 5, - PLS_INACTIVE =3D 6, - PLS_POLLING =3D 7, - PLS_RECOVERY =3D 8, - PLS_HOT_RESET =3D 9, - PLS_COMPILANCE_MODE =3D 10, - PLS_TEST_MODE =3D 11, - PLS_RESUME =3D 15, -}; - -#define CR_LINK TR_LINK - -#define TRB_C (1<<0) -#define TRB_TYPE_SHIFT 10 -#define TRB_TYPE_MASK 0x3f -#define TRB_TYPE(t) (((t).control >> TRB_TYPE_SHIFT) & TRB_TYPE_MA= SK) - -#define TRB_EV_ED (1<<2) - -#define TRB_TR_ENT (1<<1) -#define TRB_TR_ISP (1<<2) -#define TRB_TR_NS (1<<3) -#define TRB_TR_CH (1<<4) -#define TRB_TR_IOC (1<<5) -#define TRB_TR_IDT (1<<6) -#define TRB_TR_TBC_SHIFT 7 -#define TRB_TR_TBC_MASK 0x3 -#define TRB_TR_BEI (1<<9) -#define TRB_TR_TLBPC_SHIFT 16 -#define TRB_TR_TLBPC_MASK 0xf -#define TRB_TR_FRAMEID_SHIFT 20 -#define TRB_TR_FRAMEID_MASK 0x7ff -#define TRB_TR_SIA (1<<31) - -#define TRB_TR_DIR (1<<16) - -#define TRB_CR_SLOTID_SHIFT 24 -#define TRB_CR_SLOTID_MASK 0xff -#define TRB_CR_EPID_SHIFT 16 -#define TRB_CR_EPID_MASK 0x1f - -#define TRB_CR_BSR (1<<9) -#define TRB_CR_DC (1<<9) - -#define TRB_LK_TC (1<<1) - -#define TRB_INTR_SHIFT 22 -#define TRB_INTR_MASK 0x3ff -#define TRB_INTR(t) (((t).status >> TRB_INTR_SHIFT) & TRB_INTR_MAS= K) - -#define EP_TYPE_MASK 0x7 -#define EP_TYPE_SHIFT 3 - -#define EP_STATE_MASK 0x7 -#define EP_DISABLED (0<<0) -#define EP_RUNNING (1<<0) -#define EP_HALTED (2<<0) -#define EP_STOPPED (3<<0) -#define EP_ERROR (4<<0) - -#define SLOT_STATE_MASK 0x1f -#define SLOT_STATE_SHIFT 27 -#define SLOT_STATE(s) (((s)>>SLOT_STATE_SHIFT)&SLOT_STATE_MASK) -#define SLOT_ENABLED 0 -#define SLOT_DEFAULT 1 -#define SLOT_ADDRESSED 2 -#define SLOT_CONFIGURED 3 - -#define SLOT_CONTEXT_ENTRIES_MASK 0x1f -#define SLOT_CONTEXT_ENTRIES_SHIFT 27 - #define get_field(data, field) \ (((data) >> field##_SHIFT) & field##_MASK) =20 @@ -223,17 +75,6 @@ enum { *data =3D val_; \ } while (0) =20 -typedef enum EPType { - ET_INVALID =3D 0, - ET_ISO_OUT, - ET_BULK_OUT, - ET_INTR_OUT, - ET_CONTROL, - ET_ISO_IN, - ET_BULK_IN, - ET_INTR_IN, -} EPType; - typedef struct XHCITransfer { XHCIEPContext *epctx; USBPacket packet; @@ -2736,56 +2577,55 @@ static uint64_t xhci_cap_read(void *ptr, hwaddr reg= , unsigned size) uint32_t ret; =20 switch (reg) { - case 0x00: /* HCIVERSION, CAPLENGTH */ + case XHCI_HCCAP_CAPLENGTH: /* Covers HCIVERSION and CAPLENGTH */ ret =3D 0x01000000 | LEN_CAP; break; - case 0x04: /* HCSPARAMS 1 */ + case XHCI_HCCAP_HCSPARAMS1: ret =3D ((xhci->numports_2+xhci->numports_3)<<24) | (xhci->numintrs<<8) | xhci->numslots; break; - case 0x08: /* HCSPARAMS 2 */ + case XHCI_HCCAP_HCSPARAMS2: ret =3D 0x0000000f; break; - case 0x0c: /* HCSPARAMS 3 */ + case XHCI_HCCAP_HCSPARAMS3: ret =3D 0x00000000; break; - case 0x10: /* HCCPARAMS */ - if (sizeof(dma_addr_t) =3D=3D 4) { - ret =3D 0x00080000 | (xhci->max_pstreams_mask << 12); - } else { - ret =3D 0x00080001 | (xhci->max_pstreams_mask << 12); + case XHCI_HCCAP_HCCPARAMS1: + ret =3D (XHCI_HCCAP_EXTCAP_START >> 2) | (xhci->max_pstreams_mask = << 12); + if (sizeof(dma_addr_t) =3D=3D 8) { + ret |=3D 0x00000001; /* AC64 */ } break; - case 0x14: /* DBOFF */ + case XHCI_HCCAP_DBOFF: ret =3D OFF_DOORBELL; break; - case 0x18: /* RTSOFF */ + case XHCI_HCCAP_RTSOFF: ret =3D OFF_RUNTIME; break; =20 /* extended capabilities */ - case 0x20: /* Supported Protocol:00 */ + case XHCI_HCCAP_EXTCAP_START + 0x00: /* Supported Protocol:00 */ ret =3D 0x02000402; /* USB 2.0 */ break; - case 0x24: /* Supported Protocol:04 */ + case XHCI_HCCAP_EXTCAP_START + 0x04: /* Supported Protocol:04 */ ret =3D 0x20425355; /* "USB " */ break; - case 0x28: /* Supported Protocol:08 */ + case XHCI_HCCAP_EXTCAP_START + 0x08: /* Supported Protocol:08 */ ret =3D (xhci->numports_2 << 8) | (xhci->numports_3 + 1); break; - case 0x2c: /* Supported Protocol:0c */ + case XHCI_HCCAP_EXTCAP_START + 0x0c: /* Supported Protocol:0c */ ret =3D 0x00000000; /* reserved */ break; - case 0x30: /* Supported Protocol:00 */ + case XHCI_HCCAP_EXTCAP_START + 0x10: /* Supported Protocol:00 */ ret =3D 0x03000002; /* USB 3.0 */ break; - case 0x34: /* Supported Protocol:04 */ + case XHCI_HCCAP_EXTCAP_START + 0x14: /* Supported Protocol:04 */ ret =3D 0x20425355; /* "USB " */ break; - case 0x38: /* Supported Protocol:08 */ + case XHCI_HCCAP_EXTCAP_START + 0x18: /* Supported Protocol:08 */ ret =3D (xhci->numports_3 << 8) | 1; break; - case 0x3c: /* Supported Protocol:0c */ + case XHCI_HCCAP_EXTCAP_START + 0x1c: /* Supported Protocol:0c */ ret =3D 0x00000000; /* reserved */ break; default: @@ -2803,14 +2643,13 @@ static uint64_t xhci_port_read(void *ptr, hwaddr re= g, unsigned size) uint32_t ret; =20 switch (reg) { - case 0x00: /* PORTSC */ + case XHCI_PORT_PORTSC: ret =3D port->portsc; break; - case 0x04: /* PORTPMSC */ - case 0x08: /* PORTLI */ + case XHCI_PORT_PORTPMSC: + case XHCI_PORT_PORTLI: ret =3D 0; break; - case 0x0c: /* reserved */ default: trace_usb_xhci_unimplemented("port read", reg); ret =3D 0; @@ -2829,7 +2668,7 @@ static void xhci_port_write(void *ptr, hwaddr reg, trace_usb_xhci_port_write(port->portnr, reg, val); =20 switch (reg) { - case 0x00: /* PORTSC */ + case XHCI_PORT_PORTSC: /* write-1-to-start bits */ if (val & PORTSC_WPR) { xhci_port_reset(port, true); @@ -2880,8 +2719,6 @@ static void xhci_port_write(void *ptr, hwaddr reg, xhci_port_notify(port, notify); } break; - case 0x04: /* PORTPMSC */ - case 0x08: /* PORTLI */ default: trace_usb_xhci_unimplemented("port write", reg); } @@ -2893,31 +2730,31 @@ static uint64_t xhci_oper_read(void *ptr, hwaddr re= g, unsigned size) uint32_t ret; =20 switch (reg) { - case 0x00: /* USBCMD */ + case XHCI_OPER_USBCMD: ret =3D xhci->usbcmd; break; - case 0x04: /* USBSTS */ + case XHCI_OPER_USBSTS: ret =3D xhci->usbsts; break; - case 0x08: /* PAGESIZE */ + case XHCI_OPER_PAGESIZE: ret =3D 1; /* 4KiB */ break; - case 0x14: /* DNCTRL */ + case XHCI_OPER_DNCTRL: ret =3D xhci->dnctrl; break; - case 0x18: /* CRCR low */ + case XHCI_OPER_CRCR_LO: ret =3D xhci->crcr_low & ~0xe; break; - case 0x1c: /* CRCR high */ + case XHCI_OPER_CRCR_HI: ret =3D xhci->crcr_high; break; - case 0x30: /* DCBAAP low */ + case XHCI_OPER_DCBAAP_LO: ret =3D xhci->dcbaap_low; break; - case 0x34: /* DCBAAP high */ + case XHCI_OPER_DCBAAP_HI: ret =3D xhci->dcbaap_high; break; - case 0x38: /* CONFIG */ + case XHCI_OPER_CONFIG: ret =3D xhci->config; break; default: @@ -2937,7 +2774,7 @@ static void xhci_oper_write(void *ptr, hwaddr reg, trace_usb_xhci_oper_write(reg, val); =20 switch (reg) { - case 0x00: /* USBCMD */ + case XHCI_OPER_USBCMD: if ((val & USBCMD_RS) && !(xhci->usbcmd & USBCMD_RS)) { xhci_run(xhci); } else if (!(val & USBCMD_RS) && (xhci->usbcmd & USBCMD_RS)) { @@ -2959,19 +2796,19 @@ static void xhci_oper_write(void *ptr, hwaddr reg, xhci_intr_update(xhci, 0); break; =20 - case 0x04: /* USBSTS */ + case XHCI_OPER_USBSTS: /* these bits are write-1-to-clear */ xhci->usbsts &=3D ~(val & (USBSTS_HSE|USBSTS_EINT|USBSTS_PCD|USBST= S_SRE)); xhci_intr_update(xhci, 0); break; =20 - case 0x14: /* DNCTRL */ + case XHCI_OPER_DNCTRL: xhci->dnctrl =3D val & 0xffff; break; - case 0x18: /* CRCR low */ + case XHCI_OPER_CRCR_LO: xhci->crcr_low =3D (val & 0xffffffcf) | (xhci->crcr_low & CRCR_CRR= ); break; - case 0x1c: /* CRCR high */ + case XHCI_OPER_CRCR_HI: xhci->crcr_high =3D val; if (xhci->crcr_low & (CRCR_CA|CRCR_CS) && (xhci->crcr_low & CRCR_C= RR)) { XHCIEvent event =3D {ER_COMMAND_COMPLETE, CC_COMMAND_RING_STOP= PED}; @@ -2984,13 +2821,13 @@ static void xhci_oper_write(void *ptr, hwaddr reg, } xhci->crcr_low &=3D ~(CRCR_CA | CRCR_CS); break; - case 0x30: /* DCBAAP low */ + case XHCI_OPER_DCBAAP_LO: xhci->dcbaap_low =3D val & 0xffffffc0; break; - case 0x34: /* DCBAAP high */ + case XHCI_OPER_DCBAAP_HI: xhci->dcbaap_high =3D val; break; - case 0x38: /* CONFIG */ + case XHCI_OPER_CONFIG: xhci->config =3D val & 0xff; break; default: @@ -3004,9 +2841,9 @@ static uint64_t xhci_runtime_read(void *ptr, hwaddr r= eg, XHCIState *xhci =3D ptr; uint32_t ret =3D 0; =20 - if (reg < 0x20) { + if (reg < XHCI_OPER_IR0) { switch (reg) { - case 0x00: /* MFINDEX */ + case XHCI_OPER_MFINDEX: ret =3D xhci_mfindex_get(xhci) & 0x3fff; break; default: @@ -3014,28 +2851,28 @@ static uint64_t xhci_runtime_read(void *ptr, hwaddr= reg, break; } } else { - int v =3D (reg - 0x20) / 0x20; + int v =3D (reg - XHCI_OPER_IR0) / XHCI_OPER_IR_SZ; XHCIInterrupter *intr =3D &xhci->intr[v]; - switch (reg & 0x1f) { - case 0x00: /* IMAN */ + switch (reg & (XHCI_OPER_IR_SZ - 1)) { + case XHCI_INTR_IMAN: ret =3D intr->iman; break; - case 0x04: /* IMOD */ + case XHCI_INTR_IMOD: ret =3D intr->imod; break; - case 0x08: /* ERSTSZ */ + case XHCI_INTR_ERSTSZ: ret =3D intr->erstsz; break; - case 0x10: /* ERSTBA low */ + case XHCI_INTR_ERSTBA_LO: ret =3D intr->erstba_low; break; - case 0x14: /* ERSTBA high */ + case XHCI_INTR_ERSTBA_HI: ret =3D intr->erstba_high; break; - case 0x18: /* ERDP low */ + case XHCI_INTR_ERDP_LO: ret =3D intr->erdp_low; break; - case 0x1c: /* ERDP high */ + case XHCI_INTR_ERDP_HI: ret =3D intr->erdp_high; break; } @@ -3054,15 +2891,15 @@ static void xhci_runtime_write(void *ptr, hwaddr re= g, =20 trace_usb_xhci_runtime_write(reg, val); =20 - if (reg < 0x20) { + if (reg < XHCI_OPER_IR0) { trace_usb_xhci_unimplemented("runtime write", reg); return; } - v =3D (reg - 0x20) / 0x20; + v =3D (reg - XHCI_OPER_IR0) / XHCI_OPER_IR_SZ; intr =3D &xhci->intr[v]; =20 - switch (reg & 0x1f) { - case 0x00: /* IMAN */ + switch (reg & (XHCI_OPER_IR_SZ - 1)) { + case XHCI_INTR_IMAN: if (val & IMAN_IP) { intr->iman &=3D ~IMAN_IP; } @@ -3070,13 +2907,13 @@ static void xhci_runtime_write(void *ptr, hwaddr re= g, intr->iman |=3D val & IMAN_IE; xhci_intr_update(xhci, v); break; - case 0x04: /* IMOD */ + case XHCI_INTR_IMOD: intr->imod =3D val; break; - case 0x08: /* ERSTSZ */ + case XHCI_INTR_ERSTSZ: intr->erstsz =3D val & 0xffff; break; - case 0x10: /* ERSTBA low */ + case XHCI_INTR_ERSTBA_LO: if (xhci->nec_quirks) { /* NEC driver bug: it doesn't align this to 64 bytes */ intr->erstba_low =3D val & 0xfffffff0; @@ -3084,11 +2921,11 @@ static void xhci_runtime_write(void *ptr, hwaddr re= g, intr->erstba_low =3D val & 0xffffffc0; } break; - case 0x14: /* ERSTBA high */ + case XHCI_INTR_ERSTBA_HI: intr->erstba_high =3D val; xhci_er_reset(xhci, v); break; - case 0x18: /* ERDP low */ + case XHCI_INTR_ERDP_LO: if (val & ERDP_EHB) { intr->erdp_low &=3D ~ERDP_EHB; } @@ -3103,7 +2940,7 @@ static void xhci_runtime_write(void *ptr, hwaddr reg, } } break; - case 0x1c: /* ERDP high */ + case XHCI_INTR_ERDP_HI: intr->erdp_high =3D val; break; default: --=20 2.45.2 From nobody Wed May 7 17:41:28 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=1733992643; cv=none; d=zohomail.com; s=zohoarc; b=cPox68sr6p5P+uSlsK1Vt4Lb0DCjemXQu6SvYcsJb1Ivk9oO945DKwoLNoN/FYibqUXtufuAbHitnKugmqUUoBX4gCKIrWsG8vsqrCbRPJh2VZWavDojg+ZaDcDxaBTAozmW/aBsMys30EsrGz6edX24TJAUVj5WjUFzAxJ+dao= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1733992643; 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=VzC3cEHKBBLIYQgKT356TNBAPRilgUNCzs7VeSQDUkM=; b=QIxFOpJwVSMVKk7ePYiY2JW01S7b0GVTjjFSEe7pMgkyP69ARzkIE2FNxlBnCWqyZAnKbbp7KO9y76iWmLQpr3pLhOCsG4QnVWBrgiLCDaFdfL/rd2qCE+rOvYKYiiiFdTq+U4Vw0W4+jLHvrH3GBMuy1Pmsmz3z3jlIao3xbyw= 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=<npiggin@gmail.com> (p=none dis=none) Return-Path: <qemu-devel-bounces+importer=patchew.org@nongnu.org> Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1733992643751804.5386890682005; Thu, 12 Dec 2024 00:37:23 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from <qemu-devel-bounces@nongnu.org>) id 1tLegQ-0007N5-RC; Thu, 12 Dec 2024 03:36:31 -0500 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 <npiggin@gmail.com>) id 1tLeg0-0006lk-Fx for qemu-devel@nongnu.org; Thu, 12 Dec 2024 03:36:05 -0500 Received: from mail-pl1-x62c.google.com ([2607:f8b0:4864:20::62c]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from <npiggin@gmail.com>) id 1tLefw-0005H6-VV for qemu-devel@nongnu.org; Thu, 12 Dec 2024 03:36:04 -0500 Received: by mail-pl1-x62c.google.com with SMTP id d9443c01a7336-2164b662090so2769805ad.1 for <qemu-devel@nongnu.org>; Thu, 12 Dec 2024 00:35:57 -0800 (PST) Received: from wheely.local0.net ([1.146.48.169]) by smtp.gmail.com with ESMTPSA id 98e67ed59e1d1-2f142dae788sm714624a91.12.2024.12.12.00.35.50 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 12 Dec 2024 00:35:55 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1733992556; x=1734597356; 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=VzC3cEHKBBLIYQgKT356TNBAPRilgUNCzs7VeSQDUkM=; b=VebMr0PI1qF95LUljSuPzXCnosVM+mv7OvSo6bt3lD8Vk3UgUT2GwDgGNkSl0X1B0G doN3Y0ouGBYJn7JCsVfRvHJSl2Vyevxfjrv9a9dOBi1qToFDG7V68N3tBi86kGhKI0OU cm0I7BX7Gig/2LG5FM7jE9CXu0V5znlNPo46kYMwOre1BOTCI1Dkiurbk40ptw4vEPLv sAUNO+92YJaY+/ey4qSUqLyJ6SJ+6vWdtmTchNBUBBMnabDjx2zAtI/hbD/HRNrE7ZMa kqLewEoYQNfGMWNQmdjRTfqUYVPanfkwgzwPuZ9GFH07Sh5Ty2k9ijlY1tozrhQP8DPa Euvw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1733992556; x=1734597356; 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=VzC3cEHKBBLIYQgKT356TNBAPRilgUNCzs7VeSQDUkM=; b=bqh/1POhw5K4vMdfJP9mcG0utxK0yHi227vu99NXAeFkFpv7ny/73MhLG/BafG0UKG IbZkZBOcuah3faFgVaQT4NWYGxf0LdTyge19X8ceKyBlf49sbURNmv/skzuQqY92hDzN xWXieH7qrB1ekywkGoVz809zwdMcHnAFQMBjD5EEp3nSm+5zReA2Doo583L+OQpfN1Yj fKu9Wc4+fZNB+mX6qOm0dsE49qQ0D2JPrGis4rj7HY71Ytfx3YM13y/ZWzVk1/SVjMiZ rLRvCmT3FPFWpQDi3nPtJVQgIGvA/i4xudw08139Mdm2xzG+OmV0d2ZYsTHhnqZS5F89 HnOw== X-Gm-Message-State: AOJu0YyQNQgBjnPyNj+pUjUxW9K3XTSaHxdz50jAmEDIocFu5ychX6i+ Lx/riiyshqI6Ro/ys9JJKSiNfFILqUh8ozKWrXUf3fyykjYLxqbq3Z8Dkw== X-Gm-Gg: ASbGncsY/w1WVeadjb0pO5TyuEcmxU1drv7RivfUcvY+ayoUUgV3QpH7BCc6srE0671 9l7t4nuk1StLj+fSmkJEz0I3jhrIOQXAFuA4jqKM9QTephNurJ637HfYcTVhgcBHSlmJIKZGoOb vyl2JObHfvJVqBAZW+lldbpKpSwO6tuoXWJWLqQ8YH184AMeWwLeuFyHdQjHB2spT1TwBmX6XaQ qlwFbf2XfVdIPbcFOge3nsGyDzhV0IGSGDAEAUX2Kc50FZpTsMv91ToLMM= X-Google-Smtp-Source: AGHT+IGfXhonHJS5URNqnLHWthApHAM0hvuwtqqQgOzHrK6lDLKylbOq7CXLfXyPoE1ivdqszqrQ8g== X-Received: by 2002:a17:90b:49:b0:2ee:d024:e4f7 with SMTP id 98e67ed59e1d1-2f127e1f772mr9821406a91.0.1733992556259; Thu, 12 Dec 2024 00:35:56 -0800 (PST) From: Nicholas Piggin <npiggin@gmail.com> To: qemu-devel@nongnu.org Cc: Nicholas Piggin <npiggin@gmail.com>, "Michael S. Tsirkin" <mst@redhat.com>, Marcel Apfelbaum <marcel.apfelbaum@gmail.com>, Fabiano Rosas <farosas@suse.de>, Laurent Vivier <lvivier@redhat.com>, Paolo Bonzini <pbonzini@redhat.com>, Dmitry Fleytman <dmitry.fleytman@gmail.com>, Akihiko Odaki <akihiko.odaki@daynix.com>, Sriram Yagnaraman <sriram.yagnaraman@ericsson.com> Subject: [PATCH 6/8] qtest/xhci: Add controller and device setup and ring tests Date: Thu, 12 Dec 2024 18:34:59 +1000 Message-ID: <20241212083502.1439033-7-npiggin@gmail.com> X-Mailer: git-send-email 2.45.2 In-Reply-To: <20241212083502.1439033-1-npiggin@gmail.com> References: <20241212083502.1439033-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::62c; envelope-from=npiggin@gmail.com; helo=mail-pl1-x62c.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: <qemu-devel.nongnu.org> List-Unsubscribe: <https://lists.nongnu.org/mailman/options/qemu-devel>, <mailto:qemu-devel-request@nongnu.org?subject=unsubscribe> List-Archive: <https://lists.nongnu.org/archive/html/qemu-devel> List-Post: <mailto:qemu-devel@nongnu.org> List-Help: <mailto:qemu-devel-request@nongnu.org?subject=help> List-Subscribe: <https://lists.nongnu.org/mailman/listinfo/qemu-devel>, <mailto:qemu-devel-request@nongnu.org?subject=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: 1733992644209116600 Content-Type: text/plain; charset="utf-8" Add tests which init the host controller registers to the point where command and event rings, irqs are operational. Enumerate ports and set up an attached device context that enables device transfer ring to be set up and tested. This test does a bunch of things at once and is not yet well librified, but it allows testing basic mechanisms and gives a starting point for further work. Signed-off-by: Nicholas Piggin <npiggin@gmail.com> --- hw/usb/hcd-xhci.h | 7 + hw/usb/hcd-xhci.c | 7 - tests/qtest/usb-hcd-xhci-test.c | 498 +++++++++++++++++++++++++++++++- 3 files changed, 499 insertions(+), 13 deletions(-) diff --git a/hw/usb/hcd-xhci.h b/hw/usb/hcd-xhci.h index 5781542f40e..36d8f4c8309 100644 --- a/hw/usb/hcd-xhci.h +++ b/hw/usb/hcd-xhci.h @@ -310,6 +310,13 @@ typedef struct XHCIRing { bool ccs; } XHCIRing; =20 +typedef struct XHCIEvRingSeg { + uint32_t addr_low; + uint32_t addr_high; + uint32_t size; + uint32_t rsvd; +} XHCIEvRingSeg; + typedef struct XHCIPort { XHCIState *xhci; uint32_t portsc; diff --git a/hw/usb/hcd-xhci.c b/hw/usb/hcd-xhci.c index df0421ec326..90273cd317e 100644 --- a/hw/usb/hcd-xhci.c +++ b/hw/usb/hcd-xhci.c @@ -136,13 +136,6 @@ struct XHCIEPContext { QEMUTimer *kick_timer; }; =20 -typedef struct XHCIEvRingSeg { - uint32_t addr_low; - uint32_t addr_high; - uint32_t size; - uint32_t rsvd; -} XHCIEvRingSeg; - static void xhci_kick_ep(XHCIState *xhci, unsigned int slotid, unsigned int epid, unsigned int streamid); static void xhci_kick_epctx(XHCIEPContext *epctx, unsigned int streamid); diff --git a/tests/qtest/usb-hcd-xhci-test.c b/tests/qtest/usb-hcd-xhci-tes= t.c index 0cccfd85a64..8733299e52f 100644 --- a/tests/qtest/usb-hcd-xhci-test.c +++ b/tests/qtest/usb-hcd-xhci-test.c @@ -8,17 +8,174 @@ */ =20 #include "qemu/osdep.h" +#include "qemu/bswap.h" +#include "libqtest.h" +#include "libqos/libqos-pc.h" #include "libqtest-single.h" #include "libqos/usb.h" +#include "hw/pci/pci_ids.h" +#include "hw/pci/pci_regs.h" +#include "hw/usb/hcd-xhci.h" + +/*** Test Setup & Teardown ***/ +typedef struct XHCIQSlotState { + /* In-memory arrays */ + uint64_t device_context; + uint64_t transfer_ring; + + uint32_t tr_trb_entries; + uint32_t tr_trb_idx; + uint32_t tr_trb_c; +} XHCIQSlotState; + +typedef struct XHCIQState { + /* QEMU PCI variables */ + QOSState *parent; + QPCIDevice *dev; + QPCIBar bar; + uint64_t barsize; + uint32_t fingerprint; + + /* In-memory arrays */ + uint64_t dc_base_array; + uint64_t command_ring; + uint64_t event_ring_seg; + uint64_t event_ring; + + uint32_t cr_trb_entries; + uint32_t cr_trb_idx; + uint32_t cr_trb_c; + uint32_t er_trb_entries; + uint32_t er_trb_idx; + uint32_t er_trb_c; + + /* Host controller properties */ + uint32_t rtoff, dboff; + uint32_t maxports, maxslots, maxintrs; + + XHCIQSlotState slots[32]; +} XHCIQState; + +#define XHCI_NEC_ID (PCI_DEVICE_ID_NEC_UPD720200 << 16 | \ + PCI_VENDOR_ID_NEC) + +/** + * Locate, verify, and return a handle to the XHCI device. + */ +static QPCIDevice *get_xhci_device(QTestState *qts, uint32_t *fingerprint) +{ + QPCIDevice *xhci; + uint32_t xhci_fingerprint; + QPCIBus *pcibus; + + pcibus =3D qpci_new_pc(qts, NULL); + + /* Find the XHCI PCI device and verify it's the right one. */ + xhci =3D qpci_device_find(pcibus, QPCI_DEVFN(0x1D, 0x0)); + g_assert(xhci !=3D NULL); + + xhci_fingerprint =3D qpci_config_readl(xhci, PCI_VENDOR_ID); + switch (xhci_fingerprint) { + case XHCI_NEC_ID: + break; + default: + /* Unknown device. */ + g_assert_not_reached(); + } + + if (fingerprint) { + *fingerprint =3D xhci_fingerprint; + } + return xhci; +} + +static void free_xhci_device(QPCIDevice *dev) +{ + QPCIBus *pcibus =3D dev ? dev->bus : NULL; + + /* libqos doesn't have a function for this, so free it manually */ + g_free(dev); + qpci_free_pc(pcibus); +} + +/** + * Start a Q35 machine and bookmark a handle to the XHCI device. + */ +G_GNUC_PRINTF(1, 0) +static XHCIQState *xhci_vboot(const char *cli, va_list ap) +{ + XHCIQState *s; + + s =3D g_new0(XHCIQState, 1); + s->parent =3D qtest_pc_vboot(cli, ap); + alloc_set_flags(&s->parent->alloc, ALLOC_LEAK_ASSERT); + + /* Verify that we have an XHCI device present. */ + s->dev =3D get_xhci_device(s->parent->qts, &s->fingerprint); + s->bar =3D qpci_iomap(s->dev, 0, &s->barsize); + /* turns on pci.cmd.iose, pci.cmd.mse and pci.cmd.bme */ + qpci_device_enable(s->dev); + + return s; +} + +/** + * Start a Q35 machine and bookmark a handle to the XHCI device. + */ +G_GNUC_PRINTF(1, 2) +static XHCIQState *xhci_boot(const char *cli, ...) +{ + XHCIQState *s; + va_list ap; + + if (cli) { + va_start(ap, cli); + s =3D xhci_vboot(cli, ap); + va_end(ap); + } else { + s =3D xhci_boot("-M q35 " + "-device nec-usb-xhci,id=3Dxhci,bus=3Dpcie.0,addr=3D= 1d.0 " + "-drive id=3Ddrive0,if=3Dnone,file=3Dnull-co://," + "file.read-zeroes=3Don,format=3Draw"); + } + + return s; +} + +/** + * Clean up the PCI device, then terminate the QEMU instance. + */ +static void xhci_shutdown(XHCIQState *xhci) +{ + QOSState *qs =3D xhci->parent; + + free_xhci_device(xhci->dev); + g_free(xhci); + qtest_shutdown(qs); +} + +/*** tests ***/ =20 static void test_xhci_hotplug(void) { - usb_test_hotplug(global_qtest, "xhci", "1", NULL); + XHCIQState *s; + QTestState *qts; + + s =3D xhci_boot(NULL); + qts =3D s->parent->qts; + + usb_test_hotplug(qts, "xhci", "1", NULL); + + xhci_shutdown(s); } =20 static void test_usb_uas_hotplug(void) { - QTestState *qts =3D global_qtest; + XHCIQState *s; + QTestState *qts; + + s =3D xhci_boot(NULL); + qts =3D s->parent->qts; =20 qtest_qmp_device_add(qts, "usb-uas", "uas", "{}"); qtest_qmp_device_add(qts, "scsi-hd", "scsihd", "{'drive': 'drive0'}"); @@ -30,25 +187,353 @@ static void test_usb_uas_hotplug(void) =20 qtest_qmp_device_del(qts, "scsihd"); qtest_qmp_device_del(qts, "uas"); + + xhci_shutdown(s); } =20 static void test_usb_ccid_hotplug(void) { - QTestState *qts =3D global_qtest; + XHCIQState *s; + QTestState *qts; + + s =3D xhci_boot(NULL); + qts =3D s->parent->qts; =20 qtest_qmp_device_add(qts, "usb-ccid", "ccid", "{}"); qtest_qmp_device_del(qts, "ccid"); /* check the device can be added again */ qtest_qmp_device_add(qts, "usb-ccid", "ccid", "{}"); qtest_qmp_device_del(qts, "ccid"); + + xhci_shutdown(s); +} + +static uint64_t xhci_guest_zalloc(XHCIQState *s, uint64_t size) +{ + char mem[0x1000]; + uint64_t ret; + + g_assert(size <=3D 0x1000); + + memset(mem, 0, size); + + ret =3D guest_alloc(&s->parent->alloc, size); + qtest_memwrite(s->parent->qts, ret, mem, size); + + return ret; +} + +static uint32_t xhci_cap_readl(XHCIQState *s, uint64_t addr) +{ + return qpci_io_readl(s->dev, s->bar, addr); +} + +static uint32_t xhci_op_readl(XHCIQState *s, uint64_t addr) +{ + return qpci_io_readl(s->dev, s->bar, 0x40 + addr); +} + +static void xhci_op_writel(XHCIQState *s, uint64_t addr, uint32_t value) +{ + qpci_io_writel(s->dev, s->bar, 0x40 + addr, value); +} + +static uint32_t xhci_port_readl(XHCIQState *s, uint32_t port, uint64_t add= r) +{ + return xhci_op_readl(s, 0x400 + port * 0x10 + addr); +} + +static uint32_t xhci_rt_readl(XHCIQState *s, uint64_t addr) +{ + return qpci_io_readl(s->dev, s->bar, s->rtoff + addr); +} + +static void xhci_rt_writel(XHCIQState *s, uint64_t addr, uint32_t value) +{ + qpci_io_writel(s->dev, s->bar, s->rtoff + addr, value); } =20 +static void xhci_db_writel(XHCIQState *s, uint32_t db, uint32_t value) +{ + qpci_io_writel(s->dev, s->bar, s->dboff + db * 4, value); +} + +static void wait_event_trb(XHCIQState *s, XHCITRB *trb) +{ + XHCITRB t; + uint64_t er_addr =3D s->event_ring + s->er_trb_idx * sizeof(*trb); + uint32_t value; + guint64 end_time =3D g_get_monotonic_time() + 5 * G_TIME_SPAN_SECOND; + + /* Wait for event interrupt */ + + do { + if (g_get_monotonic_time() >=3D end_time) { + g_error("Timeout expired"); + } + qtest_clock_step(s->parent->qts, 10000); + + value =3D xhci_op_readl(s, 0x4); /* USBSTS */ + } while (!(value & USBSTS_EINT)); + + value =3D xhci_rt_readl(s, 0x20 + 0x0); /* IMAN */ + + /* With MSI-X enabled, IMAN IP is cleared after raising the interrupt = */ + g_assert(!(value & IMAN_IP)); + + /* Ensure MSI-X interrupt is pending */ + assert(qpci_msix_test_clear_pending(s->dev, 0)); + /* Then cleared */ + assert(!qpci_msix_pending(s->dev, 0)); + + xhci_op_writel(s, 0x4, USBSTS_EINT); /* USBSTS clear EINT */ + + qtest_memread(s->parent->qts, er_addr, &t, sizeof(t)); + + trb->parameter =3D le64_to_cpu(t.parameter); + trb->status =3D le32_to_cpu(t.status); + trb->control =3D le32_to_cpu(t.control); + + g_assert((trb->status >> 24) =3D=3D CC_SUCCESS); + g_assert((trb->control & TRB_C) =3D=3D s->er_trb_c); /* C bit has been= set */ + + s->er_trb_idx++; + if (s->er_trb_idx =3D=3D s->er_trb_entries) { + s->er_trb_idx =3D 0; + s->er_trb_c ^=3D 1; + } + /* Update ERDP to processed TRB addr and EHB bit, which clears EHB */ + er_addr =3D s->event_ring + s->er_trb_idx * sizeof(*trb); + xhci_rt_writel(s, 0x38, (er_addr & 0xffffffff) | ERDP_EHB); +} + +static void set_link_trb(XHCIQState *s, uint64_t ring, uint32_t c, + uint32_t entries) +{ + XHCITRB trb; + + g_assert(entries > 1); + + memset(&trb, 0, sizeof(trb)); + trb.parameter =3D cpu_to_le64(ring); + trb.control =3D cpu_to_le32(c | /* C */ + (TR_LINK << TRB_TYPE_SHIFT) | + TRB_LK_TC); + qtest_memwrite(s->parent->qts, ring + sizeof(trb) * (entries - 1), + &trb, sizeof(trb)); +} + +static void submit_cr_trb(XHCIQState *s, XHCITRB *trb) +{ + XHCITRB t; + uint64_t cr_addr =3D s->command_ring + s->cr_trb_idx * sizeof(*trb); + + trb->control |=3D s->cr_trb_c; /* C */ + + t.parameter =3D cpu_to_le64(trb->parameter); + t.status =3D cpu_to_le32(trb->status); + t.control =3D cpu_to_le32(trb->control); + + qtest_memwrite(s->parent->qts, cr_addr, &t, sizeof(t)); + s->cr_trb_idx++; + /* Last entry contains the link, so wrap back */ + if (s->cr_trb_idx =3D=3D s->cr_trb_entries - 1) { + set_link_trb(s, s->command_ring, s->cr_trb_c, s->cr_trb_entries); + s->cr_trb_idx =3D 0; + s->cr_trb_c ^=3D 1; + } + xhci_db_writel(s, 0, 0); /* doorbell 0 */ +} + +/* + * This test brings up an endpoint and runs some noops through its command + * ring and gets responses back on the event ring. + * + * This could be librified in future (like AHCI0 to have a way to bring up + * an endpoint to test device protocols. + */ +static void pci_xhci_stress_rings(void) +{ + XHCIQState *s; + uint32_t value; + uint64_t input_context; + XHCIEvRingSeg ev_seg; + XHCITRB trb; + uint32_t hcsparams1; + uint32_t slotid; + g_autofree void *mem =3D g_malloc0(0x1000); /* buffer for writing to g= uest */ + int i; + + s =3D xhci_boot("-M q35 " + "-device nec-usb-xhci,id=3Dxhci,bus=3Dpcie.0,addr=3D1d.0 " + "-device usb-storage,bus=3Dxhci.0,drive=3Ddrive0 " + "-drive id=3Ddrive0,if=3Dnone,file=3Dnull-co://," + "file.read-zeroes=3Don,format=3Draw " + ); + + hcsparams1 =3D xhci_cap_readl(s, 0x4); /* HCSPARAMS1 */ + s->maxports =3D (hcsparams1 >> 24) & 0xff; + s->maxintrs =3D (hcsparams1 >> 8) & 0x3ff; + s->maxslots =3D hcsparams1 & 0xff; + + s->dboff =3D xhci_cap_readl(s, 0x14); /* DBOFF */ + s->rtoff =3D xhci_cap_readl(s, 0x18); /* RTOFF */ + + s->dc_base_array =3D xhci_guest_zalloc(s, 0x800); + s->command_ring =3D xhci_guest_zalloc(s, 0x1000); + s->event_ring =3D xhci_guest_zalloc(s, 0x1000); + s->event_ring_seg =3D xhci_guest_zalloc(s, 0x100); + + /* Arbitrary small sizes so we can make them wrap */ + s->cr_trb_entries =3D 0x20; + s->cr_trb_c =3D 1; + s->er_trb_entries =3D 0x10; + s->er_trb_c =3D 1; + + ev_seg.addr_low =3D cpu_to_le32(s->event_ring & 0xffffffff); + ev_seg.addr_high =3D cpu_to_le32(s->event_ring >> 32); + ev_seg.size =3D cpu_to_le32(0x10); + ev_seg.rsvd =3D 0; + qtest_memwrite(s->parent->qts, s->event_ring_seg, &ev_seg, sizeof(ev_s= eg)); + + xhci_op_writel(s, 0x0, USBCMD_HCRST); /* USBCMD */ + do { + value =3D xhci_op_readl(s, 0x4); /* USBSTS */ + } while (value & (1 << 11)); /* CNR */ + + xhci_op_writel(s, 0x38, s->maxslots); /* CONFIG */ + + /* DCBAAP */ + xhci_op_writel(s, 0x30, s->dc_base_array & 0xffffffff); + xhci_op_writel(s, 0x34, s->dc_base_array >> 32); + + /* CRCR */ + xhci_op_writel(s, 0x18, (s->command_ring & 0xffffffff) | s->cr_trb_c); + xhci_op_writel(s, 0x1c, s->command_ring >> 32); + + xhci_rt_writel(s, 0x28, 1); /* ERSTSZ */ + + /* ERSTBA */ + xhci_rt_writel(s, 0x30, s->event_ring_seg & 0xffffffff); + xhci_rt_writel(s, 0x34, s->event_ring_seg >> 32); + + /* ERDP */ + xhci_rt_writel(s, 0x38, s->event_ring & 0xffffffff); + xhci_rt_writel(s, 0x3c, s->event_ring >> 32); + + qpci_msix_enable(s->dev); + xhci_op_writel(s, 0x0, USBCMD_RS | USBCMD_INTE); /* RUN + INTE */ + + /* Enable interrupts on ER IMAN */ + xhci_rt_writel(s, 0x20, IMAN_IE); + + assert(!qpci_msix_pending(s->dev, 0)); + + /* Wrap the command and event rings with no-ops a few times */ + for (i =3D 0; i < 100; i++) { + /* Issue a command ring no-op */ + memset(&trb, 0, sizeof(trb)); + trb.control |=3D CR_NOOP << TRB_TYPE_SHIFT; + trb.control |=3D TRB_TR_IOC; + submit_cr_trb(s, &trb); + wait_event_trb(s, &trb); + } + + /* Query ports */ + for (i =3D 0; i < s->maxports; i++) { + value =3D xhci_port_readl(s, i, 0); /* PORTSC */ + + /* Only first port should be attached and enabled */ + if (i =3D=3D 0) { + g_assert(value & PORTSC_CCS); + g_assert(value & PORTSC_PED); + /* Port Speed must be identified (non-zero) */ + g_assert(((value >> PORTSC_SPEED_SHIFT) & PORTSC_SPEED_MASK) != =3D 0); + } else { + g_assert(!(value & PORTSC_CCS)); + g_assert(!(value & PORTSC_PED)); + g_assert(((value >> PORTSC_PLS_SHIFT) & PORTSC_PLS_MASK) =3D= =3D 5); + } + } + + /* Issue a command ring enable slot */ + memset(&trb, 0, sizeof(trb)); + trb.control |=3D CR_ENABLE_SLOT << TRB_TYPE_SHIFT; + trb.control |=3D TRB_TR_IOC; + submit_cr_trb(s, &trb); + wait_event_trb(s, &trb); + slotid =3D (trb.control >> TRB_CR_SLOTID_SHIFT) & 0xff; + + s->slots[slotid].transfer_ring =3D xhci_guest_zalloc(s, 0x1000); + s->slots[slotid].tr_trb_entries =3D 0x10; + s->slots[slotid].tr_trb_c =3D 1; + + /* 32-byte input context size, should check HCCPARAMS1 for 64-byte siz= e */ + input_context =3D xhci_guest_zalloc(s, 0x420); + + /* Set input control context */ + ((uint32_t *)mem)[1] =3D cpu_to_le32(0x3); /* Add device contexts 0 an= d 1 */ + ((uint32_t *)mem)[8] =3D cpu_to_le32(1 << 27); /* 1 context entry */ + ((uint32_t *)mem)[9] =3D cpu_to_le32(1 << 16); /* 1 port number */ + + /* Set endpoint 0 context */ + ((uint32_t *)mem)[16] =3D 0; + ((uint32_t *)mem)[17] =3D cpu_to_le32((ET_CONTROL << EP_TYPE_SHIFT) | + (0x200 << 16)); /* max packet sz X= XX? */ + ((uint32_t *)mem)[18] =3D cpu_to_le32((s->slots[slotid].transfer_ring & + 0xffffffff) | 1); /* DCS=3D1 */ + ((uint32_t *)mem)[19] =3D cpu_to_le32(s->slots[slotid].transfer_ring >= > 32); + ((uint32_t *)mem)[20] =3D cpu_to_le32(0x200); /* Average TRB length */ + qtest_memwrite(s->parent->qts, input_context, mem, 0x420); + + s->slots[slotid].device_context =3D xhci_guest_zalloc(s, 0x400); + + ((uint64_t *)mem)[0] =3D cpu_to_le64(s->slots[slotid].device_context); + qtest_memwrite(s->parent->qts, s->dc_base_array + 8 * slotid, mem, 8); + + /* Issue a command ring address device */ + memset(&trb, 0, sizeof(trb)); + trb.parameter =3D input_context; + trb.control |=3D CR_ADDRESS_DEVICE << TRB_TYPE_SHIFT; + trb.control |=3D slotid << TRB_CR_SLOTID_SHIFT; + submit_cr_trb(s, &trb); + wait_event_trb(s, &trb); + + /* XXX: Could check EP state is running */ + + /* Shut it down */ + qpci_msix_disable(s->dev); + + guest_free(&s->parent->alloc, s->slots[slotid].device_context); + guest_free(&s->parent->alloc, s->slots[slotid].transfer_ring); + guest_free(&s->parent->alloc, input_context); + guest_free(&s->parent->alloc, s->event_ring); + guest_free(&s->parent->alloc, s->event_ring_seg); + guest_free(&s->parent->alloc, s->command_ring); + guest_free(&s->parent->alloc, s->dc_base_array); + + xhci_shutdown(s); +} + +/* tests */ int main(int argc, char **argv) { int ret; + const char *arch; =20 g_test_init(&argc, &argv, NULL); =20 + /* Check architecture */ + arch =3D qtest_get_arch(); + if (strcmp(arch, "i386") && strcmp(arch, "x86_64")) { + g_test_message("Skipping test for non-x86"); + return 0; + } + + if (!qtest_has_device("nec-usb-xhci")) { + return 0; + } + qtest_add_func("/xhci/pci/hotplug", test_xhci_hotplug); if (qtest_has_device("usb-uas")) { qtest_add_func("/xhci/pci/hotplug/usb-uas", test_usb_uas_hotplug); @@ -56,11 +541,12 @@ int main(int argc, char **argv) if (qtest_has_device("usb-ccid")) { qtest_add_func("/xhci/pci/hotplug/usb-ccid", test_usb_ccid_hotplug= ); } + if (qtest_has_device("usb-storage")) { + qtest_add_func("/xhci/pci/xhci-stress-rings", pci_xhci_stress_ring= s); + } =20 - qtest_start("-device nec-usb-xhci,id=3Dxhci" - " -drive id=3Ddrive0,if=3Dnone,file=3Dnull-co://," - "file.read-zeroes=3Don,format=3Draw"); ret =3D g_test_run(); + qtest_end(); =20 return ret; --=20 2.45.2 From nobody Wed May 7 17:41:28 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=1733992614; cv=none; d=zohomail.com; s=zohoarc; b=ZimtG4JrEVk5EM3kOJgc+QVpMAvFS1eF/W7k15o28xlB7/yzpIqe2aTRDHCYgbI8wJasCdB5dMSxkzzvMR9xqAbx4rlRfPvMArQkTETNVccnpmIfKWfAjBMCSs2nq955F6mQ3sia95HXrqWcF78g57IfiBtxxdnUhwTKKCMqY6k= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1733992614; 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=sCY8QL0veLcvYLUXlMQP3OezQThH3JzWNYRzOQI/qEo=; b=YQ9uLcxOe0rWlFcWh3HrYoOZZKgLt4DlRMDMwfd3WicPhexkurFiq8lDP93A3JsLy6V0LSIS0IIyYxgfh/n0wJUknAZse5tVbx4NmwnTv/6S0f8kkvONWFxzCKuuaIklfKLTjQikcLaTI5IM+9qkNaxpvE183gJ7XmRGw1x1gLw= 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=<npiggin@gmail.com> (p=none dis=none) Return-Path: <qemu-devel-bounces+importer=patchew.org@nongnu.org> Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1733992614799499.62340317204826; Thu, 12 Dec 2024 00:36:54 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from <qemu-devel-bounces@nongnu.org>) id 1tLegP-0007B1-8t; Thu, 12 Dec 2024 03:36:29 -0500 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 <npiggin@gmail.com>) id 1tLeg2-0006oj-6R for qemu-devel@nongnu.org; Thu, 12 Dec 2024 03:36:06 -0500 Received: from mail-pl1-x631.google.com ([2607:f8b0:4864:20::631]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from <npiggin@gmail.com>) id 1tLeg0-0005Ue-KS for qemu-devel@nongnu.org; Thu, 12 Dec 2024 03:36:05 -0500 Received: by mail-pl1-x631.google.com with SMTP id d9443c01a7336-21669fd5c7cso2665545ad.3 for <qemu-devel@nongnu.org>; Thu, 12 Dec 2024 00:36:04 -0800 (PST) Received: from wheely.local0.net ([1.146.48.169]) by smtp.gmail.com with ESMTPSA id 98e67ed59e1d1-2f142dae788sm714624a91.12.2024.12.12.00.35.57 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 12 Dec 2024 00:36:01 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1733992563; x=1734597363; 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=sCY8QL0veLcvYLUXlMQP3OezQThH3JzWNYRzOQI/qEo=; b=blKIVvuXpkh85aY+R6R9hlfA4F0Q3+xo2vdso115SeMSznQV2/Ulv9TnAmQRgwxJE/ D2icVdoMVMFPxbDd/OtxxX+Et2jy/lYrhpXyArEiUXMbRGOZWZzZ+JbMagsJ6kF3x4SB XmY4ncqu99wjyvTEU8MEfBmJOh5mJqrfrLQNwrqPidGG7NJSfnmMHiL1BNqI58UdLkvd 9tfmDZ1sjaMVKzFcwQIpGADrLHz+ovqX/jGD+kHWNwFyjm9nDR+AW0kRzo5aBtAc4xrx V2pd7ojxT7OOGfl8qGm16WJAymbDUZzPMHtZRi6JNMsYj28eVE56ZalzlBFG/SwHiCuA g+5A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1733992563; x=1734597363; 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=sCY8QL0veLcvYLUXlMQP3OezQThH3JzWNYRzOQI/qEo=; b=mVKwcqkpFM+5xfTB6CvFedBpkKFdKjmbMRPQJ8YqF21/iG6q53XdXVAzRsyMXKN8T/ Ib9wz44b6jhEIFYqrZgE+cNJp782CNis75izbcVQSbVeB4KMU8MXcLqKvE4p27qEqQGo TIYppD/iFARy8z7zHbv8OPgr8Bpiwz7rVG9d2QNACnbMQLWfSTN2x2Q083RpSLL0L2pr 3A7ZmxzPG0uHk1Lq15NKw/GzgC1wIJoG0JUFsGOJqjkd3u5EWePUwWbi2do8rg8gm7S4 5IA35tDhmZdHi2f0HCPWVt+pLiWQgYiCFWakRANK3Bi90uzTFnSfaWyUFgccsTM9iv5C MixQ== X-Gm-Message-State: AOJu0Ywhtbi1RAcaZyAoCOjmv9UjCZycsgdaJJIY6lGa6Wi28GN/cAMO SUjuBF3k7zfXY0xQ/hQypYogYo/FxH84dhfD+LCub9bg00FwcCxdNZIEGQ== X-Gm-Gg: ASbGncsKM/Ms78vkyNRKSzbiQiLMS1wytrA7L/D5chVfYckLUUSviZDeqODD0ME2/uh ZeDPbyxbKfZwgRAtIHizTOVgkMDRoEhURqHUtrVayymtqWkBPwdAXjC246bIcxuGtdDc72IR47Y IvNyio1LGKCF6VSJ0e+zmBUzX4IMF+f0DmN/Mf5ql5eK93xFFBpigLvUSmg64KAlzJ9Ls+h4PRx YjJ+Vk6HwuD+7CSiD5U8P8Zja8L98uJAnrw/a8Qs2KtKB0ou/I135impNA= X-Google-Smtp-Source: AGHT+IG6HH6syHca/BoLf1y+YbDY3O/U+Ipp2m8X6xoXsEhz+Vx43TOWsfC62PWTuJqJFQTgAIbayQ== X-Received: by 2002:a17:90b:4ac4:b0:2ee:e18b:c1fa with SMTP id 98e67ed59e1d1-2f13930ba5cmr4149689a91.28.1733992561955; Thu, 12 Dec 2024 00:36:01 -0800 (PST) From: Nicholas Piggin <npiggin@gmail.com> To: qemu-devel@nongnu.org Cc: Nicholas Piggin <npiggin@gmail.com>, "Michael S. Tsirkin" <mst@redhat.com>, Marcel Apfelbaum <marcel.apfelbaum@gmail.com>, Fabiano Rosas <farosas@suse.de>, Laurent Vivier <lvivier@redhat.com>, Paolo Bonzini <pbonzini@redhat.com>, Dmitry Fleytman <dmitry.fleytman@gmail.com>, Akihiko Odaki <akihiko.odaki@daynix.com>, Sriram Yagnaraman <sriram.yagnaraman@ericsson.com> Subject: [PATCH 7/8] hw/usb/xhci: Support TR NOOP commands Date: Thu, 12 Dec 2024 18:35:00 +1000 Message-ID: <20241212083502.1439033-8-npiggin@gmail.com> X-Mailer: git-send-email 2.45.2 In-Reply-To: <20241212083502.1439033-1-npiggin@gmail.com> References: <20241212083502.1439033-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::631; envelope-from=npiggin@gmail.com; helo=mail-pl1-x631.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: <qemu-devel.nongnu.org> List-Unsubscribe: <https://lists.nongnu.org/mailman/options/qemu-devel>, <mailto:qemu-devel-request@nongnu.org?subject=unsubscribe> List-Archive: <https://lists.nongnu.org/archive/html/qemu-devel> List-Post: <mailto:qemu-devel@nongnu.org> List-Help: <mailto:qemu-devel-request@nongnu.org?subject=help> List-Subscribe: <https://lists.nongnu.org/mailman/listinfo/qemu-devel>, <mailto:qemu-devel-request@nongnu.org?subject=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: 1733992616102116600 Content-Type: text/plain; charset="utf-8" Implement XHCI TR NOOP commands by setting up then immediately completing the packet. The IBM AIX XHCI HCD driver uses NOOP commands to check driver and hardware health, which works after this change. Signed-off-by: Nicholas Piggin <npiggin@gmail.com> --- hw/usb/hcd-xhci.c | 28 +++++++++++++++++++++++++++- 1 file changed, 27 insertions(+), 1 deletion(-) diff --git a/hw/usb/hcd-xhci.c b/hw/usb/hcd-xhci.c index 90273cd317e..844521e10f5 100644 --- a/hw/usb/hcd-xhci.c +++ b/hw/usb/hcd-xhci.c @@ -1666,6 +1666,20 @@ static int xhci_fire_transfer(XHCIState *xhci, XHCIT= ransfer *xfer, XHCIEPContext return xhci_submit(xhci, xfer, epctx); } =20 +static int xhci_noop_transfer(XHCIState *xhci, XHCITransfer *xfer) +{ + /* + * TR NOOP conceptually probably better not call into USB subsystem + * (usb_packet_setup() via xhci_setup_packet()). In practice it + * works and avoids code duplication. + */ + if (xhci_setup_packet(xfer) < 0) { + return -1; + } + xhci_try_complete_packet(xfer); + return 0; +} + static void xhci_kick_ep(XHCIState *xhci, unsigned int slotid, unsigned int epid, unsigned int streamid) { @@ -1788,6 +1802,8 @@ static void xhci_kick_epctx(XHCIEPContext *epctx, uns= igned int streamid) =20 epctx->kick_active++; while (1) { + bool noop =3D false; + length =3D xhci_ring_chain_length(xhci, ring); if (length <=3D 0) { if (epctx->type =3D=3D ET_ISO_OUT || epctx->type =3D=3D ET_ISO= _IN) { @@ -1816,10 +1832,20 @@ static void xhci_kick_epctx(XHCIEPContext *epctx, u= nsigned int streamid) epctx->kick_active--; return; } + if (type =3D=3D TR_NOOP) { + noop =3D true; + } } xfer->streamid =3D streamid; =20 - if (epctx->epid =3D=3D 1) { + if (noop) { + if (length !=3D 1) { + qemu_log_mask(LOG_GUEST_ERROR, + "%s: NOOP TR TRB within TRB chain!\n", __fun= c__); + /* Undefined behavior, we no-op the entire chain */ + } + xhci_noop_transfer(xhci, xfer); + } else if (epctx->epid =3D=3D 1) { xhci_fire_ctl_transfer(xhci, xfer); } else { xhci_fire_transfer(xhci, xfer, epctx); --=20 2.45.2 From nobody Wed May 7 17:41:29 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=1733992596; cv=none; d=zohomail.com; s=zohoarc; b=kRDs6zSn5spnhjvCK6qIWa2nPE4Qb07EhwsOBnnbmg8UFZsTRRY5UMb+/WGz6YW/V3NXDi7zXHVLBo63ZxcqDxZWIQLrKef8Cj/XJuiu3EIv1U44hnNT4Ihu9c1LdA+xg32LFWee1BNmOIs3StQypKvdHew8aXEMEswhnscwF8I= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1733992596; 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=NaApFk3HAaCXgWS7Qs9/zC6MeE/OKY1N8pZvwvf4rQY=; b=lzSpiMMx7KMLe/Pjj22IqROiNH8q4uQ/42Xp8tK5wipV9/YQmR67V5KfDjTK4qq0M0TcTZHSSsle25yeg6+zuOhbH95FGgomxuoGPE0BsMmVRdSnOks1NCT3DP5oNq1mveQojiXkimJEHy+z3jdKcdYuEzNDbDMbJBxdunssuF0= 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=<npiggin@gmail.com> (p=none dis=none) Return-Path: <qemu-devel-bounces+importer=patchew.org@nongnu.org> Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1733992596276313.20816746810385; Thu, 12 Dec 2024 00:36:36 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from <qemu-devel-bounces@nongnu.org>) id 1tLegS-0007Tm-4b; Thu, 12 Dec 2024 03:36:33 -0500 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 <npiggin@gmail.com>) id 1tLegC-0006tK-O5 for qemu-devel@nongnu.org; Thu, 12 Dec 2024 03:36:20 -0500 Received: from mail-pg1-x52f.google.com ([2607:f8b0:4864:20::52f]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from <npiggin@gmail.com>) id 1tLeg8-0005et-GJ for qemu-devel@nongnu.org; Thu, 12 Dec 2024 03:36:13 -0500 Received: by mail-pg1-x52f.google.com with SMTP id 41be03b00d2f7-7fd45005a09so241177a12.2 for <qemu-devel@nongnu.org>; Thu, 12 Dec 2024 00:36:08 -0800 (PST) Received: from wheely.local0.net ([1.146.48.169]) by smtp.gmail.com with ESMTPSA id 98e67ed59e1d1-2f142dae788sm714624a91.12.2024.12.12.00.36.02 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 12 Dec 2024 00:36:07 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1733992567; x=1734597367; 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=NaApFk3HAaCXgWS7Qs9/zC6MeE/OKY1N8pZvwvf4rQY=; b=Gact2AcGYk3uek+BpLhkK7s1Zbn5F9wbxDeR+GHs9d7ymi+7nDex6HAnNHLjjwLSY/ 87/oUkJjWMc6+ut2XTfCq/PDnFBUqEM68JYXmi7DbZrN36HHiFn4xXonrqkxs0czvCbm 8J9pyibIMBfo1Coqh/8ikx0FAyQdvACOcuvLLeoIyt+O1hVaHqtLK3n2E7w1alx6sp1f FVvogxCgjxOvbrJaXxWbeCnmh/vMohVAVWNsLOQ4T4uGGvkBNdIeiEzA+kK8x7GHyngZ yicsizdVqvslfVVMgFKLY9AjCgkKcZoZh3HTgaMkF6ANPkyoRPIqsBuy9AcS2uJfQCUc W3uQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1733992567; x=1734597367; 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=NaApFk3HAaCXgWS7Qs9/zC6MeE/OKY1N8pZvwvf4rQY=; b=ZHGsymYUfCQhm8m6UcRawrefQA6d9M6SxWZPhr7qtrPiGpGB0qtFlptpVU8wBf1lzd gdBRXqWA2pJWZ1wqqb2Bg7Q/jVhSlAj0blmuG7ZWQgni/MNY19TN9EF23/ebDz4W15sE 5uasK+imZ/ecX5Z0SrVWpxgIbbmGHYZUV3V91MTPuIUTSG78/3N+va5MRk1todjLoebo U9gfjJqXXZAaoBmx9fz2Azl26ksb/DS82+wUef4MmsOxfLXX5kHT5Z3tS+1uTRD1mydV dpeMScDXWHjCi1TINvHWTeDIIUPNivD1S//KNlh7ieP/ZExZUz6t3YwBDRKxBfyN1pQw CErg== X-Gm-Message-State: AOJu0YxLjpH70zBhpMmJGuLqsDoJe0AEKcYnSMtSRBxsBCWqnyfV0MN4 Hns+ApXjQK9OTcDviWXcoPtvVnK+hg2h6kAidZrCQd/XT5UQCDomIQaHrQ== X-Gm-Gg: ASbGncuvEoyu4668Gb/VqK4GstE137YjxW4zzruqJPlzR8MFrVCu6dAxNUAzAGzSMtT 2hg3+394Ds5Um4hxzqvKkqiHKVG0sPhP8PZLwV7s55j8mZ0xeaJsvucdE8IwFSxDYqdHkZrh/Ry LDw3QGyAQL7ol6gGX/n7wNIUgKPR/Z4V+IAqcDe/X3fCRhfliobZnngfC/IPSABsazJP0ZQ3aJF dpSvlOSMS+Qt94/ilKcHRyfY7MjYq0XD80sH0cMPr8fGjil5EW7QRBFEY0= X-Google-Smtp-Source: AGHT+IF4TqI4fcyqbkyEuRC4eLKvxegCoUwYBV3Mwew6PTXk5uDXEIgP6gtmSfuTyKCdCvX4iCN9Tg== X-Received: by 2002:a17:90b:4f86:b0:2ef:31a9:95c6 with SMTP id 98e67ed59e1d1-2f139293c58mr4954099a91.14.1733992567474; Thu, 12 Dec 2024 00:36:07 -0800 (PST) From: Nicholas Piggin <npiggin@gmail.com> To: qemu-devel@nongnu.org Cc: Nicholas Piggin <npiggin@gmail.com>, "Michael S. Tsirkin" <mst@redhat.com>, Marcel Apfelbaum <marcel.apfelbaum@gmail.com>, Fabiano Rosas <farosas@suse.de>, Laurent Vivier <lvivier@redhat.com>, Paolo Bonzini <pbonzini@redhat.com>, Dmitry Fleytman <dmitry.fleytman@gmail.com>, Akihiko Odaki <akihiko.odaki@daynix.com>, Sriram Yagnaraman <sriram.yagnaraman@ericsson.com> Subject: [PATCH 8/8] qtest/xhci: add a test for TR NOOP commands Date: Thu, 12 Dec 2024 18:35:01 +1000 Message-ID: <20241212083502.1439033-9-npiggin@gmail.com> X-Mailer: git-send-email 2.45.2 In-Reply-To: <20241212083502.1439033-1-npiggin@gmail.com> References: <20241212083502.1439033-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::52f; envelope-from=npiggin@gmail.com; helo=mail-pg1-x52f.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: <qemu-devel.nongnu.org> List-Unsubscribe: <https://lists.nongnu.org/mailman/options/qemu-devel>, <mailto:qemu-devel-request@nongnu.org?subject=unsubscribe> List-Archive: <https://lists.nongnu.org/archive/html/qemu-devel> List-Post: <mailto:qemu-devel@nongnu.org> List-Help: <mailto:qemu-devel-request@nongnu.org?subject=help> List-Subscribe: <https://lists.nongnu.org/mailman/listinfo/qemu-devel>, <mailto:qemu-devel-request@nongnu.org?subject=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: 1733992598071116600 Content-Type: text/plain; charset="utf-8" Run some TR NOOP commands through the transfer ring. Signed-off-by: Nicholas Piggin <npiggin@gmail.com> --- tests/qtest/usb-hcd-xhci-test.c | 41 +++++++++++++++++++++++++++++++-- 1 file changed, 39 insertions(+), 2 deletions(-) diff --git a/tests/qtest/usb-hcd-xhci-test.c b/tests/qtest/usb-hcd-xhci-tes= t.c index 8733299e52f..93614e55461 100644 --- a/tests/qtest/usb-hcd-xhci-test.c +++ b/tests/qtest/usb-hcd-xhci-test.c @@ -326,7 +326,8 @@ static void set_link_trb(XHCIQState *s, uint64_t ring, = uint32_t c, static void submit_cr_trb(XHCIQState *s, XHCITRB *trb) { XHCITRB t; - uint64_t cr_addr =3D s->command_ring + s->cr_trb_idx * sizeof(*trb); + uint64_t cr_addr =3D s->command_ring + + s->cr_trb_idx * sizeof(*trb); =20 trb->control |=3D s->cr_trb_c; /* C */ =20 @@ -345,9 +346,35 @@ static void submit_cr_trb(XHCIQState *s, XHCITRB *trb) xhci_db_writel(s, 0, 0); /* doorbell 0 */ } =20 +static void submit_tr_trb(XHCIQState *s, int slot, XHCITRB *trb) +{ + XHCITRB t; + uint64_t tr_addr =3D s->slots[slot].transfer_ring + + s->slots[slot].tr_trb_idx * sizeof(*trb); + + trb->control |=3D s->slots[slot].tr_trb_c; /* C */ + + t.parameter =3D cpu_to_le64(trb->parameter); + t.status =3D cpu_to_le32(trb->status); + t.control =3D cpu_to_le32(trb->control); + + qtest_memwrite(s->parent->qts, tr_addr, &t, sizeof(t)); + s->slots[slot].tr_trb_idx++; + /* Last entry contains the link, so wrap back */ + if (s->slots[slot].tr_trb_idx =3D=3D s->slots[slot].tr_trb_entries - 1= ) { + set_link_trb(s, s->slots[slot].transfer_ring, + s->slots[slot].tr_trb_c, + s->slots[slot].tr_trb_entries); + s->slots[slot].tr_trb_idx =3D 0; + s->slots[slot].tr_trb_c ^=3D 1; + } + xhci_db_writel(s, slot, 1); /* doorbell slot, EP0 target */ +} + /* * This test brings up an endpoint and runs some noops through its command - * ring and gets responses back on the event ring. + * ring and gets responses back on the event ring, then brings up a device + * context and runs some noops through its transfer ring. * * This could be librified in future (like AHCI0 to have a way to bring up * an endpoint to test device protocols. @@ -501,6 +528,16 @@ static void pci_xhci_stress_rings(void) =20 /* XXX: Could check EP state is running */ =20 + /* Wrap the transfer ring a few times */ + for (i =3D 0; i < 100; i++) { + /* Issue a transfer ring slot 0 noop */ + memset(&trb, 0, sizeof(trb)); + trb.control |=3D TR_NOOP << TRB_TYPE_SHIFT; + trb.control |=3D TRB_TR_IOC; + submit_tr_trb(s, slotid, &trb); + wait_event_trb(s, &trb); + } + /* Shut it down */ qpci_msix_disable(s->dev); =20 --=20 2.45.2