From nobody Mon Jun 8 16:49:04 2026 Received: from BL0PR03CU003.outbound.protection.outlook.com (mail-eastusazon11012041.outbound.protection.outlook.com [52.101.53.41]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id C579B31618C for ; Thu, 28 May 2026 05:18:15 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=52.101.53.41 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1779945497; cv=fail; b=oDHibmY79RzivzGoiMrRm2eIiNfhkoiOHYPnY0ljUODeLe0Jez8Xy1sL0IschuFCqu7AryVVD4HqbXByExhE+D3Rc3pvvnLupERGwhQ1ToQHq03Mog85vBRYCQ9i92Ii3LR9q3rasw4sZSPUdotH1mRyL8O9a/qJNsxWmpmktZQ= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1779945497; c=relaxed/simple; bh=odHT2BNcAHB4NqygKFcS7aQfHDGVKq4cEY1M4C1kjKE=; h=From:To:CC:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=WWQzfeP3L42e8HrNlhT7FJo/IXf6Gk6csyzLEsjskEtNRGNnTHe7P/TWEuJmKHqQ8QRqRkAF+8qVGDGnHkiBDwF1mdUaIQIgzVWMhWw+lQx1ut5d0P0M2BRNTXsMcRzMM0OeUr5iKRWgBWBtd0JFM/WK0NA76AVD2djzTHxtfPc= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=amd.com; spf=fail smtp.mailfrom=amd.com; dkim=pass (1024-bit key) header.d=amd.com header.i=@amd.com header.b=X31jy66o; arc=fail smtp.client-ip=52.101.53.41 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=amd.com Authentication-Results: smtp.subspace.kernel.org; spf=fail smtp.mailfrom=amd.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=amd.com header.i=@amd.com header.b="X31jy66o" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=ZReykCrXijyDhZcs7bahr0YW9rSSMIAY07Dyu4hBEc38qU1jgWo2KgNjQZ+vY3K0k0xWzKwbdHwa9LxRGdTdOvQ68vglW5gX3AawTJWg3tOga5oex06y2XjN8IRiLGiJC+kPiGt43KsCXhpr/QuxvloWVQ23ezPYU1gcIRBmhl/pPZwGZU6VPJZaMuwECdMKHnJidrQidZ24OhGmOnBeFDRGXcXD09DbGJltxX59Ey8tNbsBO42ckFowhAHuN8ZQ2DZdLbE+OxxAAN4Wrn023xxFcm8Tw6a/+NDiGo9EvntzypXkI1oGICDSfWcIwMStuTP3OoBgnit7HhZtBG6kqw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector10001; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=WbYyrX5LIC4AUWXl9AJpPbmLpc+Kwym0OIpshrs+P6w=; b=CFbptSN3k3s7wlrTAcOqCFhYErM3Qc9v+XJ4slH4mphPP1h68SnLHjWmc1htocvqM6qHo9fZdvJMq/O2OiJIAakS0pri2y35QANv7harWeodLZ9cc/zz2gMfPjDAaE9TiJQWrSTa/BYohHa2xsLfhd5W2PNdaHC4eHhXC7nFiQ8ueK0OTLQ23qK/ep2u+Wbni0DifRuxOcrmru4/IvBicspQRiv/DwdnDcyEFqC4WPM4awkHkJRot6aFSfeoDIu8Fo9EVCDSp3Sl4WmlCScwGhULf+On+V7CjMmAaBe/nXdlmwrBA5u7u1Q1SB51G6WF24H2VCk47U1kOzcGE96Siw== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass (sender ip is 165.204.84.17) smtp.rcpttodomain=vger.kernel.org smtp.mailfrom=amd.com; dmarc=pass (p=quarantine sp=quarantine pct=100) action=none header.from=amd.com; dkim=none (message not signed); arc=none (0) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=amd.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=WbYyrX5LIC4AUWXl9AJpPbmLpc+Kwym0OIpshrs+P6w=; b=X31jy66ohhouVg0P2Fn66n4qnXzJynKnB3O41zlFSxczwERQfGaLl2HiAnxTLG+jULvwkdz5fWUkTrdnldvL4UdftW/jsnXqMH6v5ftX1LkpzwCZFMLyrZTlnSakKtyKo2wdGtRlO1tw2sdJ2ivjU6KmCeYJ0Bquy+bUncqZoy4= Received: from PH7PR02CA0002.namprd02.prod.outlook.com (2603:10b6:510:33d::33) by CH3PR12MB9314.namprd12.prod.outlook.com (2603:10b6:610:1c5::5) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.21.71.13; Thu, 28 May 2026 05:18:09 +0000 Received: from SN1PEPF00036F40.namprd05.prod.outlook.com (2603:10b6:510:33d:cafe::4e) by PH7PR02CA0002.outlook.office365.com (2603:10b6:510:33d::33) with Microsoft SMTP Server (version=TLS1_3, cipher=TLS_AES_256_GCM_SHA384) id 15.21.71.13 via Frontend Transport; Thu, 28 May 2026 05:18:09 +0000 X-MS-Exchange-Authentication-Results: spf=pass (sender IP is 165.204.84.17) smtp.mailfrom=amd.com; dkim=none (message not signed) header.d=none;dmarc=pass action=none header.from=amd.com; Received-SPF: Pass (protection.outlook.com: domain of amd.com designates 165.204.84.17 as permitted sender) receiver=protection.outlook.com; client-ip=165.204.84.17; helo=satlexmb07.amd.com; pr=C Received: from satlexmb07.amd.com (165.204.84.17) by SN1PEPF00036F40.mail.protection.outlook.com (10.167.248.24) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.21.71.7 via Frontend Transport; Thu, 28 May 2026 05:18:09 +0000 Received: from purico-ed03host.amd.com (10.180.168.240) by satlexmb07.amd.com (10.181.42.216) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.2562.41; Thu, 28 May 2026 00:18:01 -0500 From: Suravee Suthikulpanit To: , , , CC: , , , , , , , , , , , , , Suravee Suthikulpanit Subject: [PATCH v2 01/26] iommu/amd: Make amd_iommu_completion_wait() non-static Date: Thu, 28 May 2026 05:17:13 +0000 Message-ID: <20260528051738.596013-2-suravee.suthikulpanit@amd.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20260528051738.596013-1-suravee.suthikulpanit@amd.com> References: <20260528051738.596013-1-suravee.suthikulpanit@amd.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: satlexmb08.amd.com (10.181.42.217) To satlexmb07.amd.com (10.181.42.216) X-EOPAttributedMessage: 0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: SN1PEPF00036F40:EE_|CH3PR12MB9314:EE_ X-MS-Office365-Filtering-Correlation-Id: 16ee9c40-48c2-4c17-f74d-08debc7881e0 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|376014|7416014|82310400026|36860700016|1800799024|3023799007|22082099003|18002099003|6133799003|56012099006|11063799006; X-Microsoft-Antispam-Message-Info: ao2wh+wPVgzbfbbrNbiUu+DNb/gX39kSAq7DiQDx6oXylrgjhr3pjm9wsHoP0IQzB3oyDwnn23N/MRlmIzpyrFT6582k0kmNYgHTZFyWwNGr2rPQgPbLzVOP0peRPDs35/1kAAflTmoUBExVCeHncZ184fSGadYbhlVvcSwBFEwE4wziTo4LFlKXN0m4fwJnTuJA+DlS54gEe4Ekee2EjABnhuuqpqRyRMyxkjJAtI+aG8MXBK+o5WY05wHNUnZaNxelqvgTVb3Pi2i3hrsxdAupZXg5Co6T4L5U46vSe4g4hG5/sVZBEAqvZRtgSQYnhnofB/+mVydWe8hTB3ENr4VPyJMCEh4K55wF+Y5JxNu3vkzFycnhUjqxYV4cGddrTmXgnfa4VyBDszALpX7Qeei9/N+UN090g+LvBYQnZMvw2afv7Cyk3Jt3UbX0szemWu4z0oiK9ygv62JARWZcVRADsfvW+iphAGXZHAaEiwvES9uxMzNwD+owvp+JaeELaEn/kD3scMgFyLOlioavChlFZy826tK/rKY9T98LFA9C2uHiEdwXRn6NQFwCZwcs8ZznWHo/GoNwCaVeSqs1spLRa0L+Lx+55NMQJNP9YjesdR0E7mpw9tiUKOR8KWqkFUUo8wBpZZZRunC2QPdxZUu4eu3ApaILg7fWg/q1dolVrvLAUvpfZk+wRisFCyOrOWbdqCYUK36L646LyMtA7uAl591+vWmDayroWQxQkw0= X-Forefront-Antispam-Report: CIP:165.204.84.17;CTRY:US;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:satlexmb07.amd.com;PTR:InfoDomainNonexistent;CAT:NONE;SFS:(13230040)(376014)(7416014)(82310400026)(36860700016)(1800799024)(3023799007)(22082099003)(18002099003)(6133799003)(56012099006)(11063799006);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: nzVnMxmQ6CC/Ggel2b/MjjLdC+xYNdcJgC+Vm46+oLFbRB8apvuzQQkGl5qv+53pGYaJPI+brPz+xr6ghfX84IwyK7Ev/MuNjIher9sySA3XoW+xqruKx5ryI7q1NLym1aotPJABXHAm2kyOgwvevsavqZkiwClPUTsrY6YIZf/xaEU+spsHSPO1VLuGz2kOamS1xaJDS/SNQQy8ZG8EcpcOxAAzzFqyHn8kRPjHVv1driyY1U5V4LLGf2eurrFqoi9EhilVzQsuBaeabCp5mrRgex+FYEWRiNMO9VhP8gsUAT2l/vi3I6jKlff6rARmzhowdF4Ozw0vqhSi2RFL2rE/Mz2UqMOLTKl9MqZDPLlMzfyOtSxvGo9DIGRVvb05JMZAfSOXV8ar7vwhr4mFzcb1rMq7wyDUa9BCLqk/aYmFlVXvdymRcA4XNVi4wdk4 X-OriginatorOrg: amd.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 28 May 2026 05:18:09.3904 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: 16ee9c40-48c2-4c17-f74d-08debc7881e0 X-MS-Exchange-CrossTenant-Id: 3dd8961f-e488-4e60-8e11-a82d994e183d X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp: TenantId=3dd8961f-e488-4e60-8e11-a82d994e183d;Ip=[165.204.84.17];Helo=[satlexmb07.amd.com] X-MS-Exchange-CrossTenant-AuthSource: SN1PEPF00036F40.namprd05.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Anonymous X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: CH3PR12MB9314 Content-Type: text/plain; charset="utf-8" This will be reused in a new iommufd.c file for nested translation. Reviewed-by: Nicolin Chen Signed-off-by: Suravee Suthikulpanit --- drivers/iommu/amd/amd_iommu.h | 1 + drivers/iommu/amd/iommu.c | 26 ++++++++++++-------------- 2 files changed, 13 insertions(+), 14 deletions(-) diff --git a/drivers/iommu/amd/amd_iommu.h b/drivers/iommu/amd/amd_iommu.h index af720bf14914..9f961ccbe3b4 100644 --- a/drivers/iommu/amd/amd_iommu.h +++ b/drivers/iommu/amd/amd_iommu.h @@ -199,6 +199,7 @@ void amd_iommu_set_dte_v1(struct iommu_dev_data *dev_da= ta, void amd_iommu_update_dte(struct amd_iommu *iommu, struct iommu_dev_data *dev_data, struct dev_table_entry *new); +int amd_iommu_completion_wait(struct amd_iommu *iommu); =20 static inline void amd_iommu_make_clear_dte(struct iommu_dev_data *dev_data, struct dev_table= _entry *new) diff --git a/drivers/iommu/amd/iommu.c b/drivers/iommu/amd/iommu.c index 84cad43dc188..4b4dd20ebec6 100644 --- a/drivers/iommu/amd/iommu.c +++ b/drivers/iommu/amd/iommu.c @@ -90,8 +90,6 @@ static int amd_iommu_set_dirty_tracking(struct iommu_doma= in *domain, =20 static void clone_aliases(struct amd_iommu *iommu, struct device *dev); =20 -static int iommu_completion_wait(struct amd_iommu *iommu); - /*************************************************************************= *** * * Helper functions @@ -216,7 +214,7 @@ void amd_iommu_update_dte(struct amd_iommu *iommu, update_dte256(iommu, dev_data, new); clone_aliases(iommu, dev_data->dev); device_flush_dte(dev_data); - iommu_completion_wait(iommu); + amd_iommu_completion_wait(iommu); } =20 static void get_dte256(struct amd_iommu *iommu, struct iommu_dev_data *dev= _data, @@ -1449,7 +1447,7 @@ static u64 get_cmdsem_val(struct amd_iommu *iommu) * This function queues a completion wait command into the command * buffer of an IOMMU */ -static int iommu_completion_wait(struct amd_iommu *iommu) +int amd_iommu_completion_wait(struct amd_iommu *iommu) { struct iommu_cmd cmd; unsigned long flags; @@ -1487,7 +1485,7 @@ static void domain_flush_complete(struct protection_d= omain *domain) * We need to wait for completion of all commands. */ xa_for_each(&domain->iommu_array, i, pdom_iommu_info) - iommu_completion_wait(pdom_iommu_info->iommu); + amd_iommu_completion_wait(pdom_iommu_info->iommu); } =20 static int iommu_flush_dte(struct amd_iommu *iommu, u16 devid) @@ -1505,7 +1503,7 @@ static void iommu_flush_dte_sync(struct amd_iommu *io= mmu, u16 devid) =20 ret =3D iommu_flush_dte(iommu, devid); if (!ret) - iommu_completion_wait(iommu); + amd_iommu_completion_wait(iommu); } =20 static void amd_iommu_flush_dte_all(struct amd_iommu *iommu) @@ -1516,7 +1514,7 @@ static void amd_iommu_flush_dte_all(struct amd_iommu = *iommu) for (devid =3D 0; devid <=3D last_bdf; ++devid) iommu_flush_dte(iommu, devid); =20 - iommu_completion_wait(iommu); + amd_iommu_completion_wait(iommu); } =20 /* @@ -1535,7 +1533,7 @@ static void amd_iommu_flush_tlb_all(struct amd_iommu = *iommu) iommu_queue_command(iommu, &cmd); } =20 - iommu_completion_wait(iommu); + amd_iommu_completion_wait(iommu); } =20 static void amd_iommu_flush_tlb_domid(struct amd_iommu *iommu, u32 dom_id) @@ -1546,7 +1544,7 @@ static void amd_iommu_flush_tlb_domid(struct amd_iomm= u *iommu, u32 dom_id) dom_id, IOMMU_NO_PASID, false); iommu_queue_command(iommu, &cmd); =20 - iommu_completion_wait(iommu); + amd_iommu_completion_wait(iommu); } =20 static int iommu_flush_pages_v1_hdom_ids(struct protection_domain *pdom, u= 64 address, size_t size) @@ -1582,7 +1580,7 @@ static void amd_iommu_flush_all(struct amd_iommu *iom= mu) build_inv_all(&cmd); =20 iommu_queue_command(iommu, &cmd); - iommu_completion_wait(iommu); + amd_iommu_completion_wait(iommu); } =20 static void iommu_flush_irt(struct amd_iommu *iommu, u16 devid) @@ -1605,7 +1603,7 @@ static void amd_iommu_flush_irt_all(struct amd_iommu = *iommu) for (devid =3D 0; devid <=3D last_bdf; devid++) iommu_flush_irt(iommu, devid); =20 - iommu_completion_wait(iommu); + amd_iommu_completion_wait(iommu); } =20 void amd_iommu_flush_all_caches(struct amd_iommu *iommu) @@ -1841,7 +1839,7 @@ void amd_iommu_dev_flush_pasid_pages(struct iommu_dev= _data *dev_data, if (dev_data->ats_enabled) device_flush_iotlb(dev_data, address, size, pasid, true); =20 - iommu_completion_wait(iommu); + amd_iommu_completion_wait(iommu); } =20 static void dev_flush_pasid_all(struct iommu_dev_data *dev_data, @@ -2495,7 +2493,7 @@ static struct iommu_device *amd_iommu_probe_device(st= ruct device *dev) goto out_err; } =20 - iommu_completion_wait(iommu); + amd_iommu_completion_wait(iommu); =20 if (FEATURE_NUM_INT_REMAP_SUP_2K(amd_iommu_efr2)) dev_data->max_irqs =3D MAX_IRQS_PER_TABLE_2K; @@ -3392,7 +3390,7 @@ static struct irq_remap_table *alloc_irq_table(struct= amd_iommu *iommu, set_remap_table_entry(iommu, alias, table); =20 out_wait: - iommu_completion_wait(iommu); + amd_iommu_completion_wait(iommu); =20 out_unlock: spin_unlock_irqrestore(&iommu_table_lock, flags); --=20 2.34.1 From nobody Mon Jun 8 16:49:04 2026 Received: from SJ2PR03CU001.outbound.protection.outlook.com (mail-westusazon11012065.outbound.protection.outlook.com [52.101.43.65]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 6D025279DCC for ; Thu, 28 May 2026 05:18:18 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=52.101.43.65 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1779945499; cv=fail; b=KzsRdZqe2Fx+p6zjaMVAWcQGjqMci+2gPpG/LHE//7nHvo48WoVvCOkEHjeUtbs+cjLVIMBbMREufA5EmFw+RECY+UgAtYSRPNHkLywLzwvblDlFI7sWOhMRV+To7fEj/UhZjuYEswLjQ+lEKvKlHOYLNYyEWoUbbfX1b86nf/c= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1779945499; c=relaxed/simple; bh=5kFyqaWgCNyXfWEjy+33hFAM6QsnSe54BwzRdZvcKrM=; h=From:To:CC:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=i4RSWC0Hmj8akxcRQJ9A7dNGceqjiYpyp2D2HhUEhhh3vcnGc3b/qCjcun93dihocS4DRJPAm/OHfGv3przvRJTnYWuRDAnAg4kwMI18wkpTb1Pe9vZH9ZiiYr/v9R9EElk8dwzoNZ+rP7BWVA8K8ZEVQafhLp5hwjTiB/+F1gQ= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=amd.com; spf=fail smtp.mailfrom=amd.com; dkim=pass (1024-bit key) header.d=amd.com header.i=@amd.com header.b=IREAsgr8; arc=fail smtp.client-ip=52.101.43.65 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=amd.com Authentication-Results: smtp.subspace.kernel.org; spf=fail smtp.mailfrom=amd.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=amd.com header.i=@amd.com header.b="IREAsgr8" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=uMPJ+4yTaB8COwEB2Q2UJe59weiKloz/1yJIMPr4NHHdUrsZ9ayMY/QKZKm3H3oJzpWp4wRlVWO6YJFOOh2zNCsWeDz7EZorMqYJTad4ZtA16/ja56ZegyPcO3L5c74j7JS5jE+ZTwQaAQc3ffGeinogsASV/LgCIrgXJceSdKAR26F8ih8SNACgeeaE8IPcOYbKkPcFEu2o/QR17fHLW9S0l/cYibNsSTfVJ4gKXGn1jKRcqiqa6W2txI64wcmJgrONwDfylJg1nwhB97Pv7ba10sjFhw1vz4yOhNz1fUodosPHCYWnaxhzXXpoQIJOSBdW6kdZtOUT1jlhzR8r3g== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector10001; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=Tn+cvTpnS6/vo37XynuieszjwqOF2/DJgkEchgffwf4=; b=OAvhBDzlRO0WiMMfJW4QpRXMlwziV6qqz2oexsfBN+MRmhJ0Zj5b6LYnIwSnshDCntnvQ+F/UEjOQub/anqD8aBmZWAJnktL5Es6Fvh9eHpSXQAL6ehekmeRJBryDvjaJTxoKNWhM+lRvL4Uicf46rz7qpxTvFMECBJyW6wh5q4c3wn+VJsEHRfFGviigt7lYizYJ5o1nPenLMukAhJBIMUIKl/ntUIwUzy2JM2MOoG1rWbkZVBXyuEDqbiv6peX3mFwYr1OnvtPGfaKPbD1XENW5ZVD8fBJsPXqBJFQELrAF2zgAKa6I1i4zW3+B09j9XxXkj2VxHA+7M/wBbY5eg== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass (sender ip is 165.204.84.17) smtp.rcpttodomain=vger.kernel.org smtp.mailfrom=amd.com; dmarc=pass (p=quarantine sp=quarantine pct=100) action=none header.from=amd.com; dkim=none (message not signed); arc=none (0) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=amd.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=Tn+cvTpnS6/vo37XynuieszjwqOF2/DJgkEchgffwf4=; b=IREAsgr8V9UTbU9GOA4b6Kn+mhgZRrg3j5KAWW6q3nLTtROkuNA1se9Y201wj9pwEdnXRf8UjxBzA3q4erbR/MaAic7ZjhB2Ix8RyIhcWAmGoN1zur9hl3W1D8/XKZaRHtD9Kg2rszZvAKS2lHQKNuL4ip/+XIPpGtZYWSGN6lc= Received: from PH7PR02CA0005.namprd02.prod.outlook.com (2603:10b6:510:33d::22) by SJ1PR12MB6265.namprd12.prod.outlook.com (2603:10b6:a03:458::21) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.21.71.12; Thu, 28 May 2026 05:18:13 +0000 Received: from SN1PEPF00036F40.namprd05.prod.outlook.com (2603:10b6:510:33d:cafe::12) by PH7PR02CA0005.outlook.office365.com (2603:10b6:510:33d::22) with Microsoft SMTP Server (version=TLS1_3, cipher=TLS_AES_256_GCM_SHA384) id 15.21.71.13 via Frontend Transport; Thu, 28 May 2026 05:18:12 +0000 X-MS-Exchange-Authentication-Results: spf=pass (sender IP is 165.204.84.17) smtp.mailfrom=amd.com; dkim=none (message not signed) header.d=none;dmarc=pass action=none header.from=amd.com; Received-SPF: Pass (protection.outlook.com: domain of amd.com designates 165.204.84.17 as permitted sender) receiver=protection.outlook.com; client-ip=165.204.84.17; helo=satlexmb07.amd.com; pr=C Received: from satlexmb07.amd.com (165.204.84.17) by SN1PEPF00036F40.mail.protection.outlook.com (10.167.248.24) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.21.71.7 via Frontend Transport; Thu, 28 May 2026 05:18:12 +0000 Received: from purico-ed03host.amd.com (10.180.168.240) by satlexmb07.amd.com (10.181.42.216) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.2562.41; Thu, 28 May 2026 00:18:06 -0500 From: Suravee Suthikulpanit To: , , , CC: , , , , , , , , , , , , , Suravee Suthikulpanit Subject: [PATCH v2 02/26] iommu/amd: Introduce vIOMMU-specific events and event Date: Thu, 28 May 2026 05:17:14 +0000 Message-ID: <20260528051738.596013-3-suravee.suthikulpanit@amd.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20260528051738.596013-1-suravee.suthikulpanit@amd.com> References: <20260528051738.596013-1-suravee.suthikulpanit@amd.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: satlexmb08.amd.com (10.181.42.217) To satlexmb07.amd.com (10.181.42.216) X-EOPAttributedMessage: 0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: SN1PEPF00036F40:EE_|SJ1PR12MB6265:EE_ X-MS-Office365-Filtering-Correlation-Id: f2a91032-582a-4abb-c8b9-08debc7883d1 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|7416014|82310400026|36860700016|376014|1800799024|6133799003|18002099003|22082099003|56012099006|11063799006; X-Microsoft-Antispam-Message-Info: JB2RoAg0IQwKVUdqrTbqyr73Q+LfdLPDCntRIaTOe1i4Oy1V8cK3sw2py4sjjypqjmKmr2sudz1Vh50GyKQvtb5MJ1XLJ5i7Mw7ndsGCTwtO7C8Z89vgAeT8Mi9SSbSb9Qw/9uPyYjnPoB2GsZhgNcoX6hp+l/zm4hgdyhoSMEGK1vsFAN34C8Nh4Buz6M+T3Zpb1BdCkwv63+KHfFlHE09t2DfWwuqa9ShI1/3XtQb7ukzyDLXfq52cUhvO1KyLAisrNURRQHKNPFnZYQvQJuwNShlAIh79Maj3SrfpkyWdgtfLJdvDnGljT+tfU+0SJRkeOcYLNaneg8Hd9wDkhEOF+LWXSMlJF9y9lYjlbBZ/Mob+TgWVb9J8UFzVEcY9NWQ7Kv0/kRzXX0P5TEBlntEdTusrWbQ80UXp3o1J+SsmCxOB7JTVQpiGVdlQdnS62Y26ed23Z/KOzK9tdqy/7o+Qo1liCc5vOcHvVYXwALR8gHponoSyi2UdkpOaE3TWsJi3ggEF9tNrFhsZFoSEHUeBbqNR6+WtwZQSGPqC6D3kEbLGSMG7cxUvjcdsj5rdhk/b3p5+pKGcNA0bveU8J6Znr2sQq+pM7WVtS8OaBCLhc0GdeTj9IxteovNRoePPCpIY2fPKRJ1cb/V/7EgnOH/GN52k7ogEPu5e0c4j/u+WF05kaSq0uw3kefls9IWU8dvs2ST8lVkfk6jMga4PZpPQjB3ujlQcFk88gLfOvOA= X-Forefront-Antispam-Report: CIP:165.204.84.17;CTRY:US;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:satlexmb07.amd.com;PTR:InfoDomainNonexistent;CAT:NONE;SFS:(13230040)(7416014)(82310400026)(36860700016)(376014)(1800799024)(6133799003)(18002099003)(22082099003)(56012099006)(11063799006);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: Qcdx+Mxt9dHXM2Wc9R3NZ1wlznYfWEXXnAenZ8s92pveoit1UgwKOIbi1MhHL/ebK+iTL6kkCeti9ShC+z//k74faL91pHq4EGBsRuooYTEsHgrKT//XNYz5iDXlrLHA8uKEuqpQmf8nHjfEMlmWaSqUXIWUrSmaLxMFiNtLdNnAv9CuSYdg7NO9vFdDiDRK+QQqIbKFQrH0/4t9QbAc/CD8vUKtvbPy5O9K4p8rS8OmFEbckHAPvOcNZdO0FGSzKHgjIZ6kMFmriLNcaXDjGXRTiXVhzr3P4+d+d+WQYN4eOeBXJxoXk4Juj5eaYWvhvhORJDkwmB9pgT7s63BYGHfBB+OecWhxfgLhG5/nkRO3bHu8UkPz4XTJxtmtZ0MipqMkqM+OD0zHMIJJrOoIzHmJLzA5bBlou9qPjQnfOBzT//bncyuaAdolmxWR9Afl X-OriginatorOrg: amd.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 28 May 2026 05:18:12.6226 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: f2a91032-582a-4abb-c8b9-08debc7883d1 X-MS-Exchange-CrossTenant-Id: 3dd8961f-e488-4e60-8e11-a82d994e183d X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp: TenantId=3dd8961f-e488-4e60-8e11-a82d994e183d;Ip=[165.204.84.17];Helo=[satlexmb07.amd.com] X-MS-Exchange-CrossTenant-AuthSource: SN1PEPF00036F40.namprd05.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Anonymous X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: SJ1PR12MB6265 Content-Type: text/plain; charset="utf-8" Adding support for new vIOMMU events: * Guest Event Fault event * vIOMMU Hardware Error event Also, adding support for the additional vIOMMU related flags in existing events. Signed-off-by: Suravee Suthikulpanit --- drivers/iommu/amd/amd_iommu_types.h | 7 ++++ drivers/iommu/amd/iommu.c | 58 ++++++++++++++++++++++------- 2 files changed, 52 insertions(+), 13 deletions(-) diff --git a/drivers/iommu/amd/amd_iommu_types.h b/drivers/iommu/amd/amd_io= mmu_types.h index c685d3771436..31af02d12afd 100644 --- drivers/iommu/amd/amd_iommu_types.h | 7 ++++ drivers/iommu/amd/iommu.c | 58 ++++++++++++++++++++++------- 2 files changed, 52 insertions(+), 13 deletions(-) diff --git a/drivers/iommu/amd/amd_iommu_types.h b/drivers/iommu/amd/amd_io= mmu_types.h index d2c64e2e9f05..4df6a50128de 100644 --- a/drivers/iommu/amd/amd_iommu_types.h +++ b/drivers/iommu/amd/amd_iommu_types.h @@ -149,6 +149,9 @@ #define EVENT_TYPE_IOTLB_INV_TO 0x7 #define EVENT_TYPE_INV_DEV_REQ 0x8 #define EVENT_TYPE_INV_PPR_REQ 0x9 +#define EVENT_TYPE_GUEST_EVENT_FAULT 0xb +#define EVENT_TYPE_VIOMMU_HW_ERR 0xc + #define EVENT_TYPE_RMP_FAULT 0xd #define EVENT_TYPE_RMP_HW_ERR 0xe #define EVENT_DEVID_MASK 0xffff @@ -261,6 +264,10 @@ #define EVTLOG_SIZE_MAX SZ_512K /* 32K entries */ #define EVTLOG_LEN_MASK_MAX (0xFULL << EVTLOG_SIZE_SHIFT) =20 +/* Constants for IO_PAGE_FAULT event */ +#define IO_PAGE_FAULT_VFLAGS_SHIFT 27 +#define IO_PAGE_FAULT_VFLAGS_MASK GENMASK_ULL(27, 23) + /* Constants for PPR Log handling */ #define PPRLOG_ENTRY_SIZE 0x10 #define PPRLOG_SIZE_SHIFT 56 diff --git a/drivers/iommu/amd/iommu.c b/drivers/iommu/amd/iommu.c index 4b4dd20ebec6..50f26c8123f3 100644 --- a/drivers/iommu/amd/iommu.c +++ b/drivers/iommu/amd/iommu.c @@ -854,7 +854,7 @@ static void amd_iommu_report_rmp_fault(struct amd_iommu= *iommu, volatile u32 *ev =20 static void amd_iommu_report_page_fault(struct amd_iommu *iommu, u16 devid, u16 domain_id, - u64 address, int flags) + u64 address, int flags, u8 vflags) { struct iommu_dev_data *dev_data =3D NULL; struct pci_dev *pdev; @@ -889,13 +889,13 @@ static void amd_iommu_report_page_fault(struct amd_io= mmu *iommu, } =20 if (__ratelimit(&dev_data->rs)) { - pci_err(pdev, "Event logged [IO_PAGE_FAULT domain=3D0x%04x address=3D0x= %llx flags=3D0x%04x]\n", - domain_id, address, flags); + pci_err(pdev, "Event logged [IO_PAGE_FAULT domain=3D0x%04x address=3D0x= %llx flags=3D0x%04x vflags=3D%#x]\n", + domain_id, address, flags, vflags); } } else { - pr_err_ratelimited("Event logged [IO_PAGE_FAULT device=3D%04x:%02x:%02x.= %x domain=3D0x%04x address=3D0x%llx flags=3D0x%04x]\n", + pr_err_ratelimited("Event logged [IO_PAGE_FAULT device=3D%04x:%02x:%02x.= %x domain=3D0x%04x address=3D0x%llx flags=3D0x%04x vflags=3D%#x]\n", iommu->pci_seg->id, PCI_BUS_NUM(devid), PCI_SLOT(devid), PCI_FUNC(devid= ), - domain_id, address, flags); + domain_id, address, flags, vflags); } =20 out: @@ -932,29 +932,42 @@ static void iommu_print_event(struct amd_iommu *iommu= , void *__evt) } =20 if (type =3D=3D EVENT_TYPE_IO_FAULT) { - amd_iommu_report_page_fault(iommu, devid, pasid, address, flags); + u8 vflags =3D FIELD_GET(IO_PAGE_FAULT_VFLAGS_MASK, event[0]); + + amd_iommu_report_page_fault(iommu, devid, pasid, address, flags, vflags); return; } =20 switch (type) { case EVENT_TYPE_ILL_DEV: - dev_err(dev, "Event logged [ILLEGAL_DEV_TABLE_ENTRY device=3D%04x:%02x:%= 02x.%x pasid=3D0x%05x address=3D0x%llx flags=3D0x%04x]\n", + { + u8 vflags =3D FIELD_GET(IO_PAGE_FAULT_VFLAGS_MASK, event[0]); + + dev_err(dev, "Event logged [ILLEGAL_DEV_TABLE_ENTRY deice=3D%04x:%02x:%0= 2x.%x pasid=3D0x%05x address=3D0x%llx flags=3D0x%04x vflags=3D%#x]\n", iommu->pci_seg->id, PCI_BUS_NUM(devid), PCI_SLOT(devid), PCI_FUNC(devid= ), - pasid, address, flags); + pasid, address, flags, vflags); dev_err(dev, "Control Reg : 0x%llx\n", ctrl); dump_dte_entry(iommu, devid); break; + } case EVENT_TYPE_DEV_TAB_ERR: - dev_err(dev, "Event logged [DEV_TAB_HARDWARE_ERROR device=3D%04x:%02x:%0= 2x.%x " - "address=3D0x%llx flags=3D0x%04x]\n", + { + u8 vflags =3D FIELD_GET(IO_PAGE_FAULT_VFLAGS_MASK, event[0]); + + dev_err(dev, "Event logged [DEV_TAB_HARDWARE_ERROR device=3D%04x:%02x:%0= 2x.%x address=3D%#llx flags=3D%#04x vlfags=3D%#x]\n", iommu->pci_seg->id, PCI_BUS_NUM(devid), PCI_SLOT(devid), PCI_FUNC(devid= ), - address, flags); + address, flags, vflags); break; + } case EVENT_TYPE_PAGE_TAB_ERR: - dev_err(dev, "Event logged [PAGE_TAB_HARDWARE_ERROR device=3D%04x:%02x:%= 02x.%x pasid=3D0x%04x address=3D0x%llx flags=3D0x%04x]\n", + { + u8 vflags =3D FIELD_GET(IO_PAGE_FAULT_VFLAGS_MASK, event[0]); + + dev_err(dev, "Event logged [PAGE_TAB_HARDWARE_ERROR device=3D%04x:%02x:%= 02x.%x pasid=3D0x%04x address=3D0x%llx flags=3D0x%04x vflags=3D%#x]\n", iommu->pci_seg->id, PCI_BUS_NUM(devid), PCI_SLOT(devid), PCI_FUNC(devid= ), - pasid, address, flags); + pasid, address, flags, vflags); break; + } case EVENT_TYPE_ILL_CMD: dev_err(dev, "Event logged [ILLEGAL_COMMAND_ERROR address=3D0x%llx]\n", = address); dump_command(address); @@ -986,6 +999,25 @@ static void iommu_print_event(struct amd_iommu *iommu,= void *__evt) iommu->pci_seg->id, PCI_BUS_NUM(devid), PCI_SLOT(devid), PCI_FUNC(devid= ), pasid, address, flags, tag); break; + case EVENT_TYPE_GUEST_EVENT_FAULT: + { + u8 gid =3D event[1] & 0xFFFF; + u8 vflags =3D FIELD_GET(IO_PAGE_FAULT_VFLAGS_MASK, event[0]); + + dev_err(dev, "Event logged [GUEST_EVENT_FAULT gid=3D#%x flags=3D0x%04x v= flags=3D%#x]\n", + gid, flags, vflags); + break; + } + case EVENT_TYPE_VIOMMU_HW_ERR: + { + u16 gid =3D event[0] & 0xFFFF; + u8 src =3D (event[0] >> 16) & 0x3; + u8 vflags =3D FIELD_GET(IO_PAGE_FAULT_VFLAGS_MASK, event[0]); + + dev_err(dev, "Event logged [VIOMMU_HW_ERR gid=3D%#x address=3D%#llx src= =3D%#x flags=3D%#x vflags=3D%#x]\n", + gid, address, src, flags, vflags); + break; + } default: dev_err(dev, "Event logged [UNKNOWN event[0]=3D0x%08x event[1]=3D0x%08x = event[2]=3D0x%08x event[3]=3D0x%08x\n", event[0], event[1], event[2], event[3]); --=20 2.34.1 From nobody Mon Jun 8 16:49:04 2026 Received: from PH0PR06CU001.outbound.protection.outlook.com (mail-westus3azon11011052.outbound.protection.outlook.com [40.107.208.52]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id DE12F285CBC for ; Thu, 28 May 2026 05:18:22 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=40.107.208.52 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1779945504; cv=fail; b=YPgn/WplKICSo/bIfgYhRqwLDJuLsAEpQAMDUnFfu42Iyjn3UN/c0CX0V3QR50KIGKm5GqOCqTXRy0Y1/46APvAiW2l3asgbH06tyz9+2APhj5V4CfubaRHoFy72w73S129aNFCt98SMlhxd++tA5TzT3nr3aWs76/sd/cFhODg= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1779945504; c=relaxed/simple; bh=K+1tNmuKOFLBdKYHTtUZWmKcX25lJvXGj1tIBwux5JQ=; h=From:To:CC:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=SyXifqCJ8NSLnwm9BZvlz5boC2C27PSqgw/RVVrfh6JQFxgjM41wkLbp43nrhSMER2eUst46sNz5QG5OUiQx0UBsjUcrYZMG4FG0cqnVT3QlYwGYbyKvi73eQbXOoRLfOsMVcPiHDEgc1ZaOntDGvtjYXeZlH/YPu26EsVyO4hE= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=amd.com; spf=fail smtp.mailfrom=amd.com; dkim=pass (1024-bit key) header.d=amd.com header.i=@amd.com header.b=Qi5GBaX8; arc=fail smtp.client-ip=40.107.208.52 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=amd.com Authentication-Results: smtp.subspace.kernel.org; spf=fail smtp.mailfrom=amd.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=amd.com header.i=@amd.com header.b="Qi5GBaX8" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=PhnP4w+omj9p6u5uffTg7jkP+DkegrjvXE9Q+BZjWtzVIEuXjqPzriFeBbpn4M8KjTSFjTZdj7+iNP6e15vTKlVzeL1t6dLGFITyZ005OU6J12rpC6EwSt7Sge4V0ojs+XdEHqzCVHaaBTsDWV5NId1owurA2L8VoEzrQn8ps5Y0JGpE3ULIGc8+rwmObwK5ED9EJfTRXCFjw5UnQWntLjG2nkxV6TtT3UaKz0xpES3NmInnHFuXhdYN5Dnw45ogXTS6pZC2WYvx1sbzOdWQeK6X0I0g4AayzwZftLmPR/+Vwkwl142Tt3O31iRGFK6iMnK/mECWvexo0GFDAwsyfA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector10001; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=hJ7yr/9aWp4x0Ijjw6sQZ0oasA/e+Kcq7Zw2G4tNyhE=; b=hGnj92rwaIUpOB9tVKD/Ke80mheYGRxeMY2aSLWWPlQCVGVqHwFxN+Zqb6SUMx4glWUJvoXhORWaPJK9RDIxLeDtaPxEbVb31ZwsqeF9TxYbXR9Hcp0Qyr4zmZLx1iGLpLmzZ/TqTyernG0to8dETPouONbRRGmMKPJeqRJYnyfbLBjZwKczJFBLOpQ888Grbt4a5zXsrhRpjMcqyT/pONXTk4c7eCVJUI+1KJF/TU/Y1Ba1bGux1hecL+R6WrvzRdM56XzhutZecWY0GARo/wuRzvX9ZdI9y/woqtveu/3Q6Uxs17GcW7ed+vCSczxL0tLXXFNtu7xRyDInpR2psA== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass (sender ip is 165.204.84.17) smtp.rcpttodomain=vger.kernel.org smtp.mailfrom=amd.com; dmarc=pass (p=quarantine sp=quarantine pct=100) action=none header.from=amd.com; dkim=none (message not signed); arc=none (0) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=amd.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=hJ7yr/9aWp4x0Ijjw6sQZ0oasA/e+Kcq7Zw2G4tNyhE=; b=Qi5GBaX8wrjgRid0dVGBr8C9dy7AvA5nBWibIqaz9XKoRfbLKCixcGSEyKz2gDAj2iMeRzlEXSycMyk6zHvpKQbjTPGloxQnSW41HW/QDB9SSeZMQnNInloVpBx5yN/dLXUTAlt83jEWLqT6jsPMDJk/4l2QDi2phgMy7Fmzw1I= Received: from PH0P220CA0022.NAMP220.PROD.OUTLOOK.COM (2603:10b6:510:d3::21) by CH8PR12MB9742.namprd12.prod.outlook.com (2603:10b6:610:27a::19) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.21.71.14; Thu, 28 May 2026 05:18:17 +0000 Received: from SN1PEPF00036F42.namprd05.prod.outlook.com (2603:10b6:510:d3:cafe::a5) by PH0P220CA0022.outlook.office365.com (2603:10b6:510:d3::21) with Microsoft SMTP Server (version=TLS1_3, cipher=TLS_AES_256_GCM_SHA384) id 15.21.71.12 via Frontend Transport; Thu, 28 May 2026 05:18:16 +0000 X-MS-Exchange-Authentication-Results: spf=pass (sender IP is 165.204.84.17) smtp.mailfrom=amd.com; dkim=none (message not signed) header.d=none;dmarc=pass action=none header.from=amd.com; Received-SPF: Pass (protection.outlook.com: domain of amd.com designates 165.204.84.17 as permitted sender) receiver=protection.outlook.com; client-ip=165.204.84.17; helo=satlexmb07.amd.com; pr=C Received: from satlexmb07.amd.com (165.204.84.17) by SN1PEPF00036F42.mail.protection.outlook.com (10.167.248.26) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.21.71.7 via Frontend Transport; Thu, 28 May 2026 05:18:16 +0000 Received: from purico-ed03host.amd.com (10.180.168.240) by satlexmb07.amd.com (10.181.42.216) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.2562.41; Thu, 28 May 2026 00:18:11 -0500 From: Suravee Suthikulpanit To: , , , CC: , , , , , , , , , , , , , Suravee Suthikulpanit Subject: [PATCH v2 03/26] iommu/amd: Detect and initialize AMD vIOMMU feature Date: Thu, 28 May 2026 05:17:15 +0000 Message-ID: <20260528051738.596013-4-suravee.suthikulpanit@amd.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20260528051738.596013-1-suravee.suthikulpanit@amd.com> References: <20260528051738.596013-1-suravee.suthikulpanit@amd.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: satlexmb08.amd.com (10.181.42.217) To satlexmb07.amd.com (10.181.42.216) X-EOPAttributedMessage: 0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: SN1PEPF00036F42:EE_|CH8PR12MB9742:EE_ X-MS-Office365-Filtering-Correlation-Id: c4bae7f8-2210-4046-dafe-08debc788642 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|36860700016|82310400026|7416014|376014|1800799024|6133799003|13003099007|11063799006|18002099003|22082099003|56012099006; X-Microsoft-Antispam-Message-Info: 6lt/nRWtzHovcLiWmeonz/n39q6PgR1aPcEaVENMsetXLVVN6VkisZlS8YpJ4r74ZWcYAyukstNhi5ceaKonq5ZUsIAwL34D/bsFWt34ATVMGJEeuuvlCoG5X2mE3JmtQZ6dRX2Is2wxtizhO3lWrRiWpP9MuyvnBT963Jx4flXnKfRkIfCnCz8+k5T1f9VPjD5UB8fkKQ3Z7+JrzSAt3SplYr/wnZ/DCUZbhaePzjptH5c088pRNc6OXqoZSXm+WNR9p5WBqFKizvmob9djeXHJMVxYcxUN1ZgexrrV3FsFnT0zJ2u4EMex+MyWd3+VwmuU32nzOmF/I0vrX8uvrS1yKRBwuXxQoiOLUs0p9dwOuS6vVsfASvPUfqCyOMbZ/03pPT7ro6byv8S4RvxlVgYZdLM0VsVdFyjL1ERnF8fbOyGw0Hf2CPZlF39xqdNV6hr0mu0tZwqyqkl0ErJHsydth0WX6KQSNRiNGj+NZjmddjh5ckaidoaLnAQUj+l7jBeLqsFO/318ZuC3VKq3AdPdwmLWC5KWs+ujpliFFDR/11A1ZmcqD3hSwfzKozrQIgA6WWllAUmddSk2VDT22pBl5Oz54+eySc2qeMqaIwMRZtxNC5gG2rit0jqs4iXR/iyCjrQksEEyK9InGj323CgjPlQS5vWfSJnfnNCpWAuQMY/nKRWYKjdE6pZGc3VBJ3Y4yzsZ9H2g/JHhwGln6Ceuxteiqn1TqMOVIWRg3a8= X-Forefront-Antispam-Report: CIP:165.204.84.17;CTRY:US;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:satlexmb07.amd.com;PTR:InfoDomainNonexistent;CAT:NONE;SFS:(13230040)(36860700016)(82310400026)(7416014)(376014)(1800799024)(6133799003)(13003099007)(11063799006)(18002099003)(22082099003)(56012099006);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: aronNSBw0wZIfDi7s8FgEjgWpKAN7RiR0lg5OFC2sCc9/NdP/BTDuLVFqRMtH0EXNweT8L8d7v8ejrWfHGpB9b74v1EhtFsXnNVs3KwjAP24ZBZecrzf/0ZRCei+yXp4dnDhj6sgmBGUKRiyH1gZyALI3qoumQQ3kZCNi4KuAFKWuuJY7ItoUwkRmqAE+TjhpmRKNBAv2x+npbwMJbWNIT4PHl5PgGFijJXkdJ193QTGWZPAqHLo9eaNxNrw8TLB/bnGL0QCRW4vQMxVZTnNrNuHPVkxoqU/rJXkS7zQsUudHdqhhDOQbZi7OqBF/EUOt35FUUmhtO6BwOhQI0fBjNiiTdSaggUfr96Ljq5rRPK3RizgfJbkJZNnnNlPyaz34xlFi0du3Q9Nxxss8AjJNHQcqsEk3t0pAZmDmXZ2mvF5XJ5ANZRG1yY7wfhl7Quj X-OriginatorOrg: amd.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 28 May 2026 05:18:16.7463 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: c4bae7f8-2210-4046-dafe-08debc788642 X-MS-Exchange-CrossTenant-Id: 3dd8961f-e488-4e60-8e11-a82d994e183d X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp: TenantId=3dd8961f-e488-4e60-8e11-a82d994e183d;Ip=[165.204.84.17];Helo=[satlexmb07.amd.com] X-MS-Exchange-CrossTenant-AuthSource: SN1PEPF00036F42.namprd05.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Anonymous X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: CH8PR12MB9742 Content-Type: text/plain; charset="utf-8" The feature is advertised w/ EFR[VIOMMUSup]. Please see the AMD IOMMU specification[1] for more detail. Introduce a new global variable amd_iommu_viommu, which is used to control the feature enablement in the driver. Currently, the feature is default to disabled. Once the feature is fully supported, it will be changed to enabled by default along with a command-line option to disable if needed. [1] https://docs.amd.com/v/u/en-US/48882_3.10_PUB Signed-off-by: Suravee Suthikulpanit --- drivers/iommu/amd/Makefile | 2 +- drivers/iommu/amd/amd_iommu.h | 2 ++ drivers/iommu/amd/amd_iommu_types.h | 1 + drivers/iommu/amd/amd_viommu.h | 22 ++++++++++++++++++++++ drivers/iommu/amd/init.c | 15 +++++++++++++++ drivers/iommu/amd/viommu.c | 29 +++++++++++++++++++++++++++++ 6 files changed, 70 insertions(+), 1 deletion(-) create mode 100644 drivers/iommu/amd/amd_viommu.h create mode 100644 drivers/iommu/amd/viommu.c diff --git a/drivers/iommu/amd/Makefile b/drivers/iommu/amd/Makefile index 94b8ef2acb18..e1e824b9c7b0 100644 --- a/drivers/iommu/amd/Makefile +++ b/drivers/iommu/amd/Makefile @@ -1,4 +1,4 @@ # SPDX-License-Identifier: GPL-2.0-only obj-y +=3D iommu.o init.o quirks.o ppr.o pasid.o -obj-$(CONFIG_AMD_IOMMU_IOMMUFD) +=3D iommufd.o nested.o +obj-$(CONFIG_AMD_IOMMU_IOMMUFD) +=3D iommufd.o nested.o viommu.o obj-$(CONFIG_AMD_IOMMU_DEBUGFS) +=3D debugfs.o diff --git a/drivers/iommu/amd/amd_iommu.h b/drivers/iommu/amd/amd_iommu.h index 9f961ccbe3b4..17fc0b5b3fa8 100644 --- a/drivers/iommu/amd/amd_iommu.h +++ b/drivers/iommu/amd/amd_iommu.h @@ -35,6 +35,8 @@ void amd_iommu_debugfs_setup(void); static inline void amd_iommu_debugfs_setup(void) {} #endif =20 +extern bool amd_iommu_viommu; + /* Needed for interrupt remapping */ int amd_iommu_prepare(void); int amd_iommu_enable(void); diff --git a/drivers/iommu/amd/amd_iommu_types.h b/drivers/iommu/amd/amd_io= mmu_types.h index 4df6a50128de..b5327bf6814b 100644 --- a/drivers/iommu/amd/amd_iommu_types.h +++ b/drivers/iommu/amd/amd_iommu_types.h @@ -103,6 +103,7 @@ #define FEATURE_HASUP BIT_ULL(49) #define FEATURE_EPHSUP BIT_ULL(50) #define FEATURE_HDSUP BIT_ULL(52) +#define FEATURE_VIOMMU BIT_ULL(55) #define FEATURE_SNP BIT_ULL(63) =20 =20 diff --git a/drivers/iommu/amd/amd_viommu.h b/drivers/iommu/amd/amd_viommu.h new file mode 100644 index 000000000000..f08ab9ef23a9 --- /dev/null +++ b/drivers/iommu/amd/amd_viommu.h @@ -0,0 +1,22 @@ +/* SPDX-License-Identifier: GPL-2.0-only */ +/* + * Copyright (C) 2026 Advanced Micro Devices, Inc. + */ + +#ifndef AMD_VIOMMU_H +#define AMD_VIOMMU_H + +#if IS_ENABLED(CONFIG_AMD_IOMMU_IOMMUFD) + +int amd_viommu_init(struct amd_iommu *iommu); + +#else + +static inline int amd_viommu_init(struct amd_iommu *iommu) +{ + return -EOPNOTSUPP; +} + +#endif /* CONFIG_AMD_IOMMU_IOMMUFD */ + +#endif /* AMD_VIOMMU_H */ diff --git a/drivers/iommu/amd/init.c b/drivers/iommu/amd/init.c index d4dc9b2a50f3..5ac883429ced 100644 --- a/drivers/iommu/amd/init.c +++ b/drivers/iommu/amd/init.c @@ -34,6 +34,7 @@ #include =20 #include "amd_iommu.h" +#include "amd_viommu.h" #include "../irq_remapping.h" #include "../iommu-pages.h" =20 @@ -196,6 +197,9 @@ bool amdr_ivrs_remap_support __read_mostly; =20 bool amd_iommu_force_isolation __read_mostly; =20 +/* VIOMMU enabling flag */ +bool amd_iommu_viommu; + unsigned long amd_iommu_pgsize_bitmap __ro_after_init =3D AMD_IOMMU_PGSIZE= S; =20 enum iommu_init_state { @@ -2188,6 +2192,12 @@ static int __init iommu_init_pci(struct amd_iommu *i= ommu) if (check_feature(FEATURE_PPR) && amd_iommu_alloc_ppr_log(iommu)) return -ENOMEM; =20 + ret =3D amd_viommu_init(iommu); + if (ret) { + pr_err("Failed to initialize vIOMMU.\n"); + amd_iommu_viommu =3D false; + } + if (iommu->cap & (1UL << IOMMU_CAP_NPCACHE)) { pr_info("Using strict mode due to virtualization\n"); iommu_set_dma_strict(); @@ -2281,6 +2291,9 @@ static void print_iommu_info(void) if (check_feature2(FEATURE_SEVSNPIO_SUP)) pr_cont(" SEV-TIO"); =20 + if (check_feature(FEATURE_VIOMMU)) + pr_cont(" vIOMMU"); + pr_cont("\n"); } =20 @@ -2293,6 +2306,8 @@ static void print_iommu_info(void) pr_info("V2 page table enabled (Paging mode : %d level)\n", amd_iommu_gpt_level); } + if (amd_iommu_viommu) + pr_info("AMD-Vi: vIOMMU enabled\n"); } =20 static int __init amd_iommu_init_pci(void) diff --git a/drivers/iommu/amd/viommu.c b/drivers/iommu/amd/viommu.c new file mode 100644 index 000000000000..f4b5f96d4785 --- /dev/null +++ b/drivers/iommu/amd/viommu.c @@ -0,0 +1,29 @@ +// SPDX-License-Identifier: GPL-2.0-only +/* + * Copyright (C) 2023 Advanced Micro Devices, Inc. + */ + +#define pr_fmt(fmt) "AMD-Vi: " fmt +#define dev_fmt(fmt) pr_fmt(fmt) + +#include +#include +#include +#include + +#include +#include + +#include "iommufd.h" +#include "amd_iommu.h" +#include "amd_iommu_types.h" +#include "amd_viommu.h" + +int __init amd_viommu_init(struct amd_iommu *iommu) +{ + if (!amd_iommu_viommu || + !check_feature(FEATURE_VIOMMU)) + return 0; + + return 0; +} --=20 2.34.1 From nobody Mon Jun 8 16:49:04 2026 Received: from CH4PR04CU002.outbound.protection.outlook.com (mail-northcentralusazon11013053.outbound.protection.outlook.com [40.107.201.53]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 492A32C11F9 for ; Thu, 28 May 2026 05:18:28 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=40.107.201.53 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1779945509; cv=fail; b=ftNXiXqhLHXqADeWlAlwLCco4okBFVvo82UtpGmFaJ0B8tNW9v/5K0Z9N4sNmw+LEJg0TbplklfhMS2ynpfIm/I9ecqtr30UkakWwUxgPtWnF1gVYClNbFIDazFwNZzRdbh5bsnY8ZcS3JMJ59ns17sXfs8OM+AVkCxZjT2EhVk= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1779945509; c=relaxed/simple; bh=sZwA1Cen4R1/by+HFkCx3mTTvn9egd/WRqSVkYBOX9A=; h=From:To:CC:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=cfeJ4ufdk6QJ6/CpcKlUDvePA080uZJl8mJzds8RU+VKsAxapF6kEpTdXrHWot6MNJsZhFyKdREMDpQ4HkmlGiC/6sL/mikIBF44w3Wamxd8ubn8AInT2dI3tKqjeeieTd7AV8utpKT34XIQjAoYgVWPXEWkiGoAq7RsZZvXduc= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=amd.com; spf=fail smtp.mailfrom=amd.com; dkim=pass (1024-bit key) header.d=amd.com header.i=@amd.com header.b=Q6IJvYN1; arc=fail smtp.client-ip=40.107.201.53 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=amd.com Authentication-Results: smtp.subspace.kernel.org; spf=fail smtp.mailfrom=amd.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=amd.com header.i=@amd.com header.b="Q6IJvYN1" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=GUhZVpSKUc6vw1Og4b8Rv3xnaFdvN5ck0qxqmsQU27JYHkxM++8kxnkRQa36ZFNw7kI5SQTHms2IOFDqGnIdlSwsceiXUZKWXTSjz0ejmVqUNSD78sUXhKpjeo4o+SSXOJwf2uJ6uZb/cb2bxXwXMKnVAp8uS+xGE3kqQDsfccFKrxXfPJMLCxNP+ppoNLQBxlsElkmDkKpbnm4lgIEd7FkEYymBUs0qx+IKOpe+NMoAxCmygVX7MBT4JtAQMcQRaKqf+6qFNXDyX8CdAQ1ztY/BwW+n3MBNbG8+GqEAK48+jgEzeOT+5NlLdyotkRVKMRiGIIcLqj/sB5IrEJnHYg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector10001; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=A/KJaHbi21kfCEU2Wy9JJpPfLvx4o7nl9eO+5MEc8nY=; b=GH4Sx0H6fdX/8iqp5DOQlXBV4olVKyKDnlauArRB688Ax83Q6MbSRh+rHpYBxjcx109zxZEpyzBUhyjTB/QaRz29eZsWIuFyivQFS/suo8lMCDUIp3ArkyE5RCdjsavLbcarIUUzAPY2ddi3s/QTiNIEs0mqLSVFOFU6tTTCL3BzHSGV2H1Es494+86Oyh5SsEg/t1KX2rmVzQsQFhXOSgZsd343qyi0+QZUJlHVeWzEiGNTe22rVWppHEn7htp40fHrczurc/R2n2D7KxIcxToKmjfE7dbGPiIZSJCLlb8BHfAip9sS/22vdnhFBYv3+G/ZynpZzS7/o4VEquoLpw== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass (sender ip is 165.204.84.17) smtp.rcpttodomain=vger.kernel.org smtp.mailfrom=amd.com; dmarc=pass (p=quarantine sp=quarantine pct=100) action=none header.from=amd.com; dkim=none (message not signed); arc=none (0) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=amd.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=A/KJaHbi21kfCEU2Wy9JJpPfLvx4o7nl9eO+5MEc8nY=; b=Q6IJvYN1u9qDneuTDgykrKTuMde9mUsfa+f7JFhU1VOZk5E5/RA9NdMcDIobyzztKX1UvxF6neR6Y1drFUmPX+Lg0IntmjoZQZ6lrnGaNpu9AT386u1mYtaHQ4oIZmEfh6qnQ+8LibHCBRqKZP3C1Vc+ayQMeK2IqqXsu01OfKY= Received: from SA1PR04CA0014.namprd04.prod.outlook.com (2603:10b6:806:2ce::20) by SJ1PR12MB6100.namprd12.prod.outlook.com (2603:10b6:a03:45d::20) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.21.71.12; Thu, 28 May 2026 05:18:22 +0000 Received: from SN1PEPF00036F3D.namprd05.prod.outlook.com (2603:10b6:806:2ce:cafe::70) by SA1PR04CA0014.outlook.office365.com (2603:10b6:806:2ce::20) with Microsoft SMTP Server (version=TLS1_3, cipher=TLS_AES_256_GCM_SHA384) id 15.21.71.13 via Frontend Transport; Thu, 28 May 2026 05:18:22 +0000 X-MS-Exchange-Authentication-Results: spf=pass (sender IP is 165.204.84.17) smtp.mailfrom=amd.com; dkim=none (message not signed) header.d=none;dmarc=pass action=none header.from=amd.com; Received-SPF: Pass (protection.outlook.com: domain of amd.com designates 165.204.84.17 as permitted sender) receiver=protection.outlook.com; client-ip=165.204.84.17; helo=satlexmb07.amd.com; pr=C Received: from satlexmb07.amd.com (165.204.84.17) by SN1PEPF00036F3D.mail.protection.outlook.com (10.167.248.21) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.21.71.7 via Frontend Transport; Thu, 28 May 2026 05:18:21 +0000 Received: from purico-ed03host.amd.com (10.180.168.240) by satlexmb07.amd.com (10.181.42.216) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.2562.41; Thu, 28 May 2026 00:18:16 -0500 From: Suravee Suthikulpanit To: , , , CC: , , , , , , , , , , , , , Suravee Suthikulpanit Subject: [PATCH v2 04/26] iommu/amd: Introduce IOMMUFD vIOMMU support for AMD Date: Thu, 28 May 2026 05:17:16 +0000 Message-ID: <20260528051738.596013-5-suravee.suthikulpanit@amd.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20260528051738.596013-1-suravee.suthikulpanit@amd.com> References: <20260528051738.596013-1-suravee.suthikulpanit@amd.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: satlexmb08.amd.com (10.181.42.217) To satlexmb07.amd.com (10.181.42.216) X-EOPAttributedMessage: 0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: SN1PEPF00036F3D:EE_|SJ1PR12MB6100:EE_ X-MS-Office365-Filtering-Correlation-Id: 740237b5-2347-4e26-3cb5-08debc788933 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|82310400026|1800799024|7416014|36860700016|376014|22082099003|18002099003|56012099006|11063799006|6133799003; X-Microsoft-Antispam-Message-Info: ZOCvBoRy8Ql1D4HlxA+FYMZ0/oISDpf6HjiAxjSDOdPjMVIxoWRsYG0Qs4yna12M4Fepq4x5aMi3A7fe3dF5S7qPep66OIkOc7EP9B5F+YZBLnUcR3CpAq5wSL5z1rUFugBEdwmaVotNHjUP5TFeVaWiohqpGRaXjGZhIRioSU7RuJef8599CGBKxU7F0D/2sZV1sY6ARoubaQEfh4Apr4Qa+M0FFxl1DIfFXsHxipRUedfrowA6vXLStnAhGtu4BOv/tV7041A5sl1myiK+9nrjZ9xIMw9MN0KoQedKAAIPoIlQLgpkwqbmtdNvLmQQnhS2cXerrXEJSymq6B6Uv909iI6Tu2TCKDQF++zowrLfGsYl1lli+xN7NqlOxsPnWbHJfaQVZgLh4bhwWdDCDWMva+uA4DqAn8f56K01HrCXxt8LR1advwwygVnR1RkMVYULFjkl+zvUFfB5gyAr1qiRSqsaf1wM2+IiGVq3+xUmFfWpoQ6sLqI71BKrQf/me3uzdBq4nzuAB31bjqbFfIDe5JanW5gfyB7K/ghwDettRvufGMwN53R4vLWQrX8UbMslK7cek6mCrAplJBoBGxgoHNl1sJZeP/09ySF+S8w4VMxTHZyRyvPGy5+zXGGGw5b2knNrYtn30BT4UNNULlXHMYLMbz3WAi4ZosfZYIp3RDQ8QZltX40t0Rx8j3O6xrbX6BudWzfFYAGhpSZGbEjr8Fq9TeujXrBziXJvjn8= X-Forefront-Antispam-Report: CIP:165.204.84.17;CTRY:US;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:satlexmb07.amd.com;PTR:InfoDomainNonexistent;CAT:NONE;SFS:(13230040)(82310400026)(1800799024)(7416014)(36860700016)(376014)(22082099003)(18002099003)(56012099006)(11063799006)(6133799003);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: mHxJ8eIGcJOpmVpX4PoEjreG62XRH9HLbrcMAOsFlGWv9l2VnQh8yTMfzWJNt5GWaamoX336X1b5NBF/tigo+RrvtINJ1JZIGZ6mjWRJrjVH5gMRPWbXAkhU9Km/7KE6FM2p7FkUdy1M4EXNBgSp2I8pkYYRY+uyoGNKHxeY3cqHHnwI4t6p/iegyo/MKgwmMm7xer/dfWlvM4kR38ckyQZDEKDESAkZVprjTYR7Fd57UYw99ttPRyobxmSaIv9WszCjgiljo0Rqf6fF323UbvLxofzH+LB2daygvt7PpWrcTpGrYGVzaJ19v5TZqYtxy94OygxB0oP8fXYLa8uv9xCUPWDhXv6jyc2IvStjhrj95HLSNwNZtI602CF8qTVMTPvsC68YZBd2gOEL/MqTQhi9hYnn38lWXYl1PyNIzmRI5uPxllUyqvJHKhkEbZfm X-OriginatorOrg: amd.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 28 May 2026 05:18:21.6734 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: 740237b5-2347-4e26-3cb5-08debc788933 X-MS-Exchange-CrossTenant-Id: 3dd8961f-e488-4e60-8e11-a82d994e183d X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp: TenantId=3dd8961f-e488-4e60-8e11-a82d994e183d;Ip=[165.204.84.17];Helo=[satlexmb07.amd.com] X-MS-Exchange-CrossTenant-AuthSource: SN1PEPF00036F3D.namprd05.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Anonymous X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: SJ1PR12MB6100 Content-Type: text/plain; charset="utf-8" Introduce a new enum iommu_viommu_type (IOMMU_VIOMMU_TYPE_AMD) for AMD vIOMMU along with the struct iommu_viommu_amd, which is used to initialize IOMMUFD vIOMMU instance when calling struct iommu_ops.viommu_init(). Also, hook up struct iomufd_viomu_ops.alloc_domain_nested to connect nested domain allocation with AMD vIOMMU implementation. Additional initialization will be added in subsequent patches. Signed-off-by: Suravee Suthikulpanit --- drivers/iommu/amd/iommufd.c | 4 ++++ include/uapi/linux/iommufd.h | 10 ++++++++++ 2 files changed, 14 insertions(+) diff --git a/drivers/iommu/amd/iommufd.c b/drivers/iommu/amd/iommufd.c index 52300b867c1f..eee29c26169a 100644 --- drivers/iommu/amd/iommufd.c | 4 ++++ include/uapi/linux/iommufd.h | 10 ++++++++++ 2 files changed, 14 insertions(+) diff --git a/drivers/iommu/amd/iommufd.c b/drivers/iommu/amd/iommufd.c index 52300b867c1f..eee29c26169a 100644 --- a/drivers/iommu/amd/iommufd.c +++ b/drivers/iommu/amd/iommufd.c @@ -34,6 +34,9 @@ void *amd_iommufd_hw_info(struct device *dev, u32 *length= , enum iommu_hw_info_ty =20 size_t amd_iommufd_get_viommu_size(struct device *dev, enum iommu_viommu_t= ype viommu_type) { + if (!amd_iommu_viommu || (viommu_type !=3D IOMMU_VIOMMU_TYPE_AMD)) + return 0; + return VIOMMU_STRUCT_SIZE(struct amd_iommu_viommu, core); } =20 @@ -73,5 +76,6 @@ static void amd_iommufd_viommu_destroy(struct iommufd_vio= mmu *viommu) * struct iommufd_viommu_ops - vIOMMU specific operations */ static const struct iommufd_viommu_ops amd_viommu_ops =3D { + .alloc_domain_nested =3D amd_iommu_alloc_domain_nested, .destroy =3D amd_iommufd_viommu_destroy, }; diff --git a/include/uapi/linux/iommufd.h b/include/uapi/linux/iommufd.h index e998dfbd6960..83ed10610957 100644 --- a/include/uapi/linux/iommufd.h +++ b/include/uapi/linux/iommufd.h @@ -1052,6 +1052,7 @@ struct iommu_fault_alloc { * @IOMMU_VIOMMU_TYPE_ARM_SMMUV3: ARM SMMUv3 driver specific type * @IOMMU_VIOMMU_TYPE_TEGRA241_CMDQV: NVIDIA Tegra241 CMDQV (extension for= ARM * SMMUv3) enabled ARM SMMUv3 type + * @IOMMU_VIOMMU_TYPE_AMD: AMD HW-vIOMMU type */ enum iommu_viommu_type { IOMMU_VIOMMU_TYPE_DEFAULT =3D 0, @@ -1062,6 +1063,7 @@ enum iommu_viommu_type { * VMM must wire the HYP_OWN bit to 0 in guest VINTF_CONFIG register */ IOMMU_VIOMMU_TYPE_TEGRA241_CMDQV =3D 2, + IOMMU_VIOMMU_TYPE_AMD =3D 3, }; =20 /** @@ -1080,6 +1082,14 @@ struct iommu_viommu_tegra241_cmdqv { __aligned_u64 out_vintf_mmap_length; }; =20 +/** + * struct iommu_viommu_amd - AMD vIOMMU Interface (IOMMU_VIOMMU_TYPE_AMD) + * @reserved: Must be zero + */ +struct iommu_viommu_amd { + __u32 reserved; /* must be last */ +}; + /** * struct iommu_viommu_alloc - ioctl(IOMMU_VIOMMU_ALLOC) * @size: sizeof(struct iommu_viommu_alloc) --=20 2.34.1 From nobody Mon Jun 8 16:49:04 2026 Received: from PH7PR06CU001.outbound.protection.outlook.com (mail-westus3azon11010032.outbound.protection.outlook.com [52.101.201.32]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 508E72E1EE7 for ; Thu, 28 May 2026 05:18:31 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=52.101.201.32 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1779945512; cv=fail; b=hz8kiDr9V8CRVmLSxQix6wX97e3x0aSWdGOqq9ZZmV2ZP3/GR+RAT1Mw4Uxc0fefXI1TY48ybSkV6S16GIcf79BV0VfiBh15kxRAbxjaKVtviCf2jB7OGa/l10vAqW4te3snGtqMWUXczmF487vAWVjtrWLKPpwvKcz7Ygx972Y= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1779945512; c=relaxed/simple; bh=G/i0zP+IutlgiRfeyMRDGrforDMb0KSwPv3D0llF5Bg=; h=From:To:CC:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=EAObLA/Z2xB0Ivvbf0udPSqkW9Q0n27NH3aD+c8Hzg35ykfeDHaqNDHyeL6ggwUsLzPjcudoKDovOnD9+U0mBpZs1jeInzlXTrSCuDsELvhJ08VpnVieYI9Ou4aKPUO5D8UU0qs2p+AS9XNLYJdyx4BJd5vX+IIHU8OnTw0IwY8= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=amd.com; spf=fail smtp.mailfrom=amd.com; dkim=pass (1024-bit key) header.d=amd.com header.i=@amd.com header.b=vziDhgFI; arc=fail smtp.client-ip=52.101.201.32 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=amd.com Authentication-Results: smtp.subspace.kernel.org; spf=fail smtp.mailfrom=amd.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=amd.com header.i=@amd.com header.b="vziDhgFI" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=n/Lzz+F7BxYkrSxdCnKQCG28G2QMpWePoKHOCMaq55jQyVmDQm2/sB6DFNKqMlgbVo5sr+sQ2gwbMr691I2FTIrFkQ/emEisa3JaCcQlvUOZznpyVxBRmebUtH+DVDkkAA6r62UcJ9AsO/PIa2gZ1PVcogdy+z5wRr8aaT6fBpFdcHqEick+f7sKzgscF/C1Ujc4ktD489qe+ZXhgzzFdrM4wUdHaFpDOO0WEbXVsTUGVFN2rZp9gaGW8PokmT6ZElqRz/vazbD/8rib9giQbXwKGdTzsnhufekvQbre+2Qe/M+YkcJ4yb3f0WQTT47WvUtlE0XrumRvhKqmWt/MpQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector10001; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=ZDtwgOA4UxIGBZsB0c9/EIOs3IcmIToykEuOOG/PjP0=; b=WJDYlQQ5W5xA0BUVOex+dF8l8zFoR7IebGcERinbVJSIf4BjCu7B3ZQi+v9V7o0MzMfgbxooBWJ9QWej6SWcbtmYrr2jBNdkr63g8ngbYJuDg5zX4ChuJZcs9hiLA24P1bEynRX0a8UUirQieRhprzBGh/KtCfJ5P6ZSa8kXqpkxJt5GrXlcVaypijLLmPJgMrnKWNMZW4jF/3LZ6zqxp5B7SXwkT+A45ut6i+s8OvIUA8KOq8n9BaZpy3H6Xm6dKY6BnzZUnK1enJTIqNpuKwA29VWyeH/I8EZnJARl/Rg5SS5CWLuI+212xFozxg3uWPdMDUiZUJ6aJ1yoRZ50Qw== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass (sender ip is 165.204.84.17) smtp.rcpttodomain=vger.kernel.org smtp.mailfrom=amd.com; dmarc=pass (p=quarantine sp=quarantine pct=100) action=none header.from=amd.com; dkim=none (message not signed); arc=none (0) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=amd.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=ZDtwgOA4UxIGBZsB0c9/EIOs3IcmIToykEuOOG/PjP0=; b=vziDhgFI9YeIQa9g7UaTtt4sBCZePe4QQ9E4hOJ3oKYlnRin1iVrz6YcXqtRIW77dtZZJxfD4U+9HzvIvfZXv/8Hs8nRsYtZmU7NmodXmNp8KAidxZAQmiKPYEssp2+L7x2DzoGo7aDBLxRhYg2VHN7AlhjiBLl2HRiNbfaKGDw= Received: from PH7PR02CA0003.namprd02.prod.outlook.com (2603:10b6:510:33d::31) by SA1PR12MB999251.namprd12.prod.outlook.com (2603:10b6:806:4dd::7) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.21.71.14; Thu, 28 May 2026 05:18:27 +0000 Received: from SN1PEPF00036F40.namprd05.prod.outlook.com (2603:10b6:510:33d:cafe::45) by PH7PR02CA0003.outlook.office365.com (2603:10b6:510:33d::31) with Microsoft SMTP Server (version=TLS1_3, cipher=TLS_AES_256_GCM_SHA384) id 15.21.71.13 via Frontend Transport; Thu, 28 May 2026 05:18:26 +0000 X-MS-Exchange-Authentication-Results: spf=pass (sender IP is 165.204.84.17) smtp.mailfrom=amd.com; dkim=none (message not signed) header.d=none;dmarc=pass action=none header.from=amd.com; Received-SPF: Pass (protection.outlook.com: domain of amd.com designates 165.204.84.17 as permitted sender) receiver=protection.outlook.com; client-ip=165.204.84.17; helo=satlexmb07.amd.com; pr=C Received: from satlexmb07.amd.com (165.204.84.17) by SN1PEPF00036F40.mail.protection.outlook.com (10.167.248.24) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.21.71.7 via Frontend Transport; Thu, 28 May 2026 05:18:26 +0000 Received: from purico-ed03host.amd.com (10.180.168.240) by satlexmb07.amd.com (10.181.42.216) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.2562.41; Thu, 28 May 2026 00:18:21 -0500 From: Suravee Suthikulpanit To: , , , CC: , , , , , , , , , , , , , Suravee Suthikulpanit Subject: [PATCH v2 05/26] iommu/amd: Allocate Guest IDs for IOMMUFD vIOMMU instances Date: Thu, 28 May 2026 05:17:17 +0000 Message-ID: <20260528051738.596013-6-suravee.suthikulpanit@amd.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20260528051738.596013-1-suravee.suthikulpanit@amd.com> References: <20260528051738.596013-1-suravee.suthikulpanit@amd.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: satlexmb08.amd.com (10.181.42.217) To satlexmb07.amd.com (10.181.42.216) X-EOPAttributedMessage: 0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: SN1PEPF00036F40:EE_|SA1PR12MB999251:EE_ X-MS-Office365-Filtering-Correlation-Id: 928831fe-0fe9-4ce9-265c-08debc788c44 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|36860700016|82310400026|7416014|376014|1800799024|22082099003|18002099003|56012099006|11063799006|5023799004; X-Microsoft-Antispam-Message-Info: L+dChwTJi02Cl5ou0pA9e08tNj0LibxvtoCGKNeCAoUB2txGr/lilema0dUnYS4WeWqlbsLT1EiKlWn5TrePLuulPYC79zrqOrGHOf8ytw8a3x2Inz3GIUuEmWmTRqo4g3v72d6d6GtAfb3dIeRmfPPda3QyvhBtQBDilBNc9JLoDboKN9/8X3jZwuEl0d7iGgU1RXJ675dmRLnnse9nIpvrrb5+fhOABEDTVS9Sy0+qrP0OIKIIhks0lARLmRxD4vjwC3q3kCrb572MFCHkG1wrI3eLSB1k1XUcn+djwhtKWF853rd4Da7849jSu+OWiDtIXUF2QEglJGqFCZhYQwY4Ltz0w796v7pHnnTsdeSX60K62eNJA6+dkwiriiltimjAi1zbkxYb1ukC8tROlEVaajadE/2p2wGWnwbrGkG5oPG0iDng1bB2Lnp+M9DSNbg0lxpYNL5EL0f12ujQTv3SWb28SbZkK6BkzSHG0XMtSzMwJyQ6HhK56B76dtSKGWdxR0NAF1fNmA/9P6yT8mb3zCUD8nodQfXNnWOVejzWbXqGjH+J+qNWy8X27NT7z9nrjTkExLvKpWbbMuK3zB/FDWt99RL3/+kcCMRy6TwPXsun5DVb+QjZtCEo8cedw7DgERm8ZLZ1FfO9YdyC7PsNcO7gEfZ0V/t4O6jNlpnWZJE0G8T5cQfQtuj4ozKydsmRKxamdWVAiN0/5kjv7O2W2zxg0IjN1Jpd2NjgqrI= X-Forefront-Antispam-Report: CIP:165.204.84.17;CTRY:US;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:satlexmb07.amd.com;PTR:InfoDomainNonexistent;CAT:NONE;SFS:(13230040)(36860700016)(82310400026)(7416014)(376014)(1800799024)(22082099003)(18002099003)(56012099006)(11063799006)(5023799004);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: sGIpg35EzJloYZFRxW5RT9RVpo1GV0tSigWnEd5JWPWUq3go2lfPJGy0Em8SjcD611OB4td/NW9s4T3zjTqrG84hi5Qw/yPD1/2XGXsiHVCUq5YIuc1OxtQgey2pBKCnVY4kMtIkyUnVhUf63SRF+a/AOW6W/zJ2c0H6wARnXfvVfdt/ReP2U33mkbQSlkNDdCAge5dmNgmf17l4qh1xyS4tykQOwVKeCn2f9mPSNmLaRJ0QT8WnW2TtmdKBvVAiPoPfvvQYR8XdI/SlJcId8NWQWgr0v4v9cUMJbVGmF34KHYJcoTBOEk/y1NvbyZy0YTtUl/sBR2RbyZI1ZdxxKKdcUluKQ1HUk//4ij5KsCP6/66p1flxwlSOfW9SgCKhw6nzt1mWrdhz+8VFVlfHRXGvhhFXCoWwYNuiHAlHaz/y745jN1cpGe83sK3+gIXy X-OriginatorOrg: amd.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 28 May 2026 05:18:26.7895 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: 928831fe-0fe9-4ce9-265c-08debc788c44 X-MS-Exchange-CrossTenant-Id: 3dd8961f-e488-4e60-8e11-a82d994e183d X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp: TenantId=3dd8961f-e488-4e60-8e11-a82d994e183d;Ip=[165.204.84.17];Helo=[satlexmb07.amd.com] X-MS-Exchange-CrossTenant-AuthSource: SN1PEPF00036F40.namprd05.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Anonymous X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: SA1PR12MB999251 Content-Type: text/plain; charset="utf-8" Hardware vIOMMU uses a 16-bit Guest ID (GID) per guest IOMMU to index driver and hardware state. Allocate one GID per IOMMUFD vIOMMU from a per-amd_iommu IDA (unique within that IOMMU; a VM behind multiple IOMMUs may hold more than one GID). Add amd_iommu_gid_alloc() and amd_iommu_gid_free(), store the ID in amd_iommu_viommu::gid, and call them from amd_iommufd_viommu_init() and destroy after copying struct iommu_viommu_amd to userspace. ida_init() for gid_ida is done when vIOMMU MMIO is mapped (next patch). Signed-off-by: Suravee Suthikulpanit --- drivers/iommu/amd/amd_iommu.h | 4 ++++ drivers/iommu/amd/amd_iommu_types.h | 8 ++++++++ drivers/iommu/amd/iommu.c | 19 +++++++++++++++++ drivers/iommu/amd/iommufd.c | 32 +++++++++++++++++++++++++++++ 4 files changed, 63 insertions(+) diff --git a/drivers/iommu/amd/amd_iommu.h b/drivers/iommu/amd/amd_iommu.h index 17fc0b5b3fa8..9f2a1a8a6d3c 100644 --- a/drivers/iommu/amd/amd_iommu.h +++ b/drivers/iommu/amd/amd_iommu.h @@ -228,4 +228,8 @@ amd_iommu_make_clear_dte(struct iommu_dev_data *dev_dat= a, struct dev_table_entry struct iommu_domain * amd_iommu_alloc_domain_nested(struct iommufd_viommu *viommu, u32 flags, const struct iommu_user_data *user_data); + +/* Guest ID for vIOMMU */ +int amd_iommu_gid_alloc(struct amd_iommu *iommu); +void amd_iommu_gid_free(struct amd_iommu *iommu, int gid); #endif /* AMD_IOMMU_H */ diff --git a/drivers/iommu/amd/amd_iommu_types.h b/drivers/iommu/amd/amd_io= mmu_types.h index b5327bf6814b..00f964d5b149 100644 --- a/drivers/iommu/amd/amd_iommu_types.h +++ b/drivers/iommu/amd/amd_iommu_types.h @@ -21,6 +21,7 @@ #include #include #include +#include =20 #include =20 @@ -413,6 +414,9 @@ =20 #define MAX_DOMAIN_ID 65536 =20 +/* For vIOMMU, the GID is 16-bit. */ +#define VIOMMU_MAX_GID 0xFFFF + /* Timeout stuff */ #define LOOP_TIMEOUT 100000 #define MMIO_STATUS_TIMEOUT 2000000 @@ -509,6 +513,7 @@ struct amd_iommu_viommu { struct iommufd_viommu core; struct protection_domain *parent; /* nest parent domain for this viommu */ struct list_head pdom_list; /* For protection_domain->viommu_list */ + u16 gid; /* Guest ID for the vIOMMU */ =20 /* * Per-vIOMMU guest domain ID to host domain ID mapping. @@ -768,6 +773,9 @@ struct amd_iommu { /* IOPF support */ struct iopf_queue *iopf_queue; unsigned char iopfq_name[32]; + + struct ida gid_ida; /* guest IDs for this IOMMU */ + bool gid_ida_inited; }; =20 static inline struct amd_iommu *dev_to_amd_iommu(struct device *dev) diff --git a/drivers/iommu/amd/iommu.c b/drivers/iommu/amd/iommu.c index 50f26c8123f3..73fba8be40d1 100644 --- a/drivers/iommu/amd/iommu.c +++ b/drivers/iommu/amd/iommu.c @@ -252,6 +252,25 @@ static inline bool pdom_is_sva_capable(struct protecti= on_domain *pdom) return pdom_is_v2_pgtbl_mode(pdom) || pdom_is_in_pt_mode(pdom); } =20 +int amd_iommu_gid_alloc(struct amd_iommu *iommu) +{ + int ret =3D ida_alloc_range(&iommu->gid_ida, 1, VIOMMU_MAX_GID, GFP_KERNE= L); + + if (ret < 0) + pr_err("%s: Failed to allocate guest ID (devid=3D%#x)\n", + __func__, iommu->devid); + else + pr_debug("%s: iommu devid=3D%#x, gid=3D%u\n", __func__, iommu->devid, re= t); + + return ret; +} + +void amd_iommu_gid_free(struct amd_iommu *iommu, int gid) +{ + pr_debug("%s: iommu devid=3D%#x, gid=3D%u\n", __func__, iommu->devid, gid= ); + ida_free(&iommu->gid_ida, gid); +} + static inline int get_acpihid_device_id(struct device *dev, struct acpihid_map_entry **entry) { diff --git a/drivers/iommu/amd/iommufd.c b/drivers/iommu/amd/iommufd.c index eee29c26169a..785fa2d575f2 100644 --- a/drivers/iommu/amd/iommufd.c +++ b/drivers/iommu/amd/iommufd.c @@ -43,13 +43,37 @@ size_t amd_iommufd_get_viommu_size(struct device *dev, = enum iommu_viommu_type vi int amd_iommufd_viommu_init(struct iommufd_viommu *viommu, struct iommu_do= main *parent, const struct iommu_user_data *user_data) { + int ret; unsigned long flags; + struct iommu_viommu_amd data; struct protection_domain *pdom =3D to_pdomain(parent); struct amd_iommu_viommu *aviommu =3D container_of(viommu, struct amd_iomm= u_viommu, core); + struct amd_iommu *iommu =3D container_of(viommu->iommu_dev, struct amd_io= mmu, iommu); =20 xa_init_flags(&aviommu->gdomid_array, XA_FLAGS_ALLOC1); aviommu->parent =3D pdom; =20 + if (!user_data) + return -EINVAL; + + ret =3D iommu_copy_struct_from_user(&data, user_data, + IOMMU_VIOMMU_TYPE_AMD, + reserved); + if (ret) + return ret; + + ret =3D amd_iommu_gid_alloc(iommu); + if (ret < 0) + goto err_gid; + aviommu->gid =3D ret; + pr_debug("%s: gid=3D%#x", __func__, aviommu->gid); + + ret =3D iommu_copy_struct_to_user(user_data, &data, + IOMMU_VIOMMU_TYPE_AMD, + reserved); + if (ret) + goto err_init; + viommu->ops =3D &amd_viommu_ops; =20 spin_lock_irqsave(&pdom->lock, flags); @@ -57,6 +81,10 @@ int amd_iommufd_viommu_init(struct iommufd_viommu *viomm= u, struct iommu_domain * spin_unlock_irqrestore(&pdom->lock, flags); =20 return 0; +err_init: + amd_iommu_gid_free(iommu, aviommu->gid); +err_gid: + return ret; } =20 static void amd_iommufd_viommu_destroy(struct iommufd_viommu *viommu) @@ -64,11 +92,15 @@ static void amd_iommufd_viommu_destroy(struct iommufd_v= iommu *viommu) unsigned long flags; struct amd_iommu_viommu *aviommu =3D container_of(viommu, struct amd_iomm= u_viommu, core); struct protection_domain *pdom =3D aviommu->parent; + struct amd_iommu *iommu =3D container_of(viommu->iommu_dev, struct amd_io= mmu, iommu); + + pr_debug("%s: gid=3D%#x, iommu devid=3D%#x\n", __func__, aviommu->gid, io= mmu->devid); =20 spin_lock_irqsave(&pdom->lock, flags); list_del(&aviommu->pdom_list); spin_unlock_irqrestore(&pdom->lock, flags); xa_destroy(&aviommu->gdomid_array); + amd_iommu_gid_free(iommu, aviommu->gid); } =20 /* --=20 2.34.1 From nobody Mon Jun 8 16:49:04 2026 Received: from BN1PR04CU002.outbound.protection.outlook.com (mail-eastus2azon11010049.outbound.protection.outlook.com [52.101.56.49]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 79AAA279DCC for ; Thu, 28 May 2026 05:18:38 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=52.101.56.49 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1779945520; cv=fail; b=oda2g5tuxd9qzym/7Jmy/inGyIHT4mz1mCFOiQSOh/IsXtyoJk/aJrzJ2SdIHtFSVic0TS5dNbzjFS3FuKgRT5h1/KSh98ZOS/vkDyAWd2lDBd0lhq3aL4Op1Uw1gTz3BdCJi71rLXmdvEJsoPgNWZpncAoa61a+SSBtqCHWkLU= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1779945520; c=relaxed/simple; bh=h+yD2HJSNmiI6mDK9rxsq05TCBqbgAWQVKFWMkKweP4=; h=From:To:CC:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=MYlpWud1ab1yjjPN5PPmUUT+N1Un/3MHtC4ei+oOsi36nyIvJM8mnRNLh0QlfAydQRo7HKLBFRq+nFska7BK+ip7QBjulW4pOk7CBuGP07uEtbJhbyjCStJmdiETwpIgOk/tKye4oIspNTMiXtd9ps5gVjoEFYV0LEC3bthHI2c= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=amd.com; spf=fail smtp.mailfrom=amd.com; dkim=pass (1024-bit key) header.d=amd.com header.i=@amd.com header.b=Av94WdXA; arc=fail smtp.client-ip=52.101.56.49 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=amd.com Authentication-Results: smtp.subspace.kernel.org; spf=fail smtp.mailfrom=amd.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=amd.com header.i=@amd.com header.b="Av94WdXA" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=xhjnjx93Ty+yjuRN9+Vz2ukOdH/pEo/ffwxQlp3RwDgRxI2bLljjwyI7skcjmzfvtc5hB7G1m9IyY71UajpVYE596LX/EP4yoeJgj8Nxwk8fNcR8eQxY5P/TAYTDP/uaHKPV/aig2ZAt/NSbJRNCL9DInFg0jzy93JFh01GkAyLMB4AhAhfK339ljTy/VjjgXNAPH4x8q1oRJ6PM2KjGz/Dn/fEalhmiMkSs2z+d2ZZZmiJZmwhCs4bgpCaypaGLG0Nb+iWa1vnh3zd6vRZpTk3yB1FOcT18oi6yMfz7hwxtkeLRp1SY3Hvn2MOlI0pYlv3gozkDpaYj/XxN2KKrkQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector10001; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=NiQEnwP2Wydt1FXeRAxCxKqmiqbXQRcCXk9UlzIt++A=; b=DOnxGci1w+5178XY3YuQfoy4MN9RJJcJ206Fwl4XyAdRcqKhLJwUL4zvfcAByoXNaLxqT6tFnTPX/3Z/VSf9jOwcn7CesP+QDKeWvjOGImYt/IlpBgSPybu5w7NJXu/yLkywkWd2ewBT2ZdwFTBAtbKJuhcrLUFZzgZ/+xzFBwF2xs8oDtWlAbyt/RdTDwk4sG45o1z5e0f71ljQCkjBfxviKKCVnAlOyd1M1O1Rz9XRhLldabYDjSb5pUO00aAlv0Otf0E+fD7biLeqBarAmO5P+rbfzuM/fTMi5j4REnqooSJaTc8mYMWrKdkuhsMMMlrLExvG++DcFFEPu98xBQ== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass (sender ip is 165.204.84.17) smtp.rcpttodomain=vger.kernel.org smtp.mailfrom=amd.com; dmarc=pass (p=quarantine sp=quarantine pct=100) action=none header.from=amd.com; dkim=none (message not signed); arc=none (0) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=amd.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=NiQEnwP2Wydt1FXeRAxCxKqmiqbXQRcCXk9UlzIt++A=; b=Av94WdXA63hAex7678q06pDyOYlh0DLuDQKipSpKvwSLH20RYJf28QZlnRIbSP2WSsy7oZrdM2wj/M9sGtvteE30O6yp02tMHuQSsLmWuDy00u20MxCdDjeClDK47vk65r12u/+HMnzZSJs3xzfeBZRcodgJw4XVEz6e5sAuDrU= Received: from SA1PR03CA0019.namprd03.prod.outlook.com (2603:10b6:806:2d3::21) by CH3PR12MB7714.namprd12.prod.outlook.com (2603:10b6:610:14e::7) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.21.71.13; Thu, 28 May 2026 05:18:32 +0000 Received: from SN1PEPF00036F41.namprd05.prod.outlook.com (2603:10b6:806:2d3:cafe::12) by SA1PR03CA0019.outlook.office365.com (2603:10b6:806:2d3::21) with Microsoft SMTP Server (version=TLS1_3, cipher=TLS_AES_256_GCM_SHA384) id 15.21.71.13 via Frontend Transport; Thu, 28 May 2026 05:18:32 +0000 X-MS-Exchange-Authentication-Results: spf=pass (sender IP is 165.204.84.17) smtp.mailfrom=amd.com; dkim=none (message not signed) header.d=none;dmarc=pass action=none header.from=amd.com; Received-SPF: Pass (protection.outlook.com: domain of amd.com designates 165.204.84.17 as permitted sender) receiver=protection.outlook.com; client-ip=165.204.84.17; helo=satlexmb07.amd.com; pr=C Received: from satlexmb07.amd.com (165.204.84.17) by SN1PEPF00036F41.mail.protection.outlook.com (10.167.248.25) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.21.71.7 via Frontend Transport; Thu, 28 May 2026 05:18:31 +0000 Received: from purico-ed03host.amd.com (10.180.168.240) by satlexmb07.amd.com (10.181.42.216) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.2562.41; Thu, 28 May 2026 00:18:26 -0500 From: Suravee Suthikulpanit To: , , , CC: , , , , , , , , , , , , , Suravee Suthikulpanit Subject: [PATCH v2 06/26] iommu/amd: Map vIOMMU VF and VF Control MMIO BARs Date: Thu, 28 May 2026 05:17:18 +0000 Message-ID: <20260528051738.596013-7-suravee.suthikulpanit@amd.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20260528051738.596013-1-suravee.suthikulpanit@amd.com> References: <20260528051738.596013-1-suravee.suthikulpanit@amd.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: satlexmb08.amd.com (10.181.42.217) To satlexmb07.amd.com (10.181.42.216) X-EOPAttributedMessage: 0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: SN1PEPF00036F41:EE_|CH3PR12MB7714:EE_ X-MS-Office365-Filtering-Correlation-Id: 35ba93e9-4419-44ff-7cb9-08debc788f59 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|36860700016|376014|7416014|82310400026|1800799024|56012099006|11063799006|6133799003|18002099003|22082099003; X-Microsoft-Antispam-Message-Info: m6CuAwQMjrx2BHzlBAcLJ3wJRvQa9CetrxlAkYh79hRbVI5ECE/X7/Mz9eU9FXqF6PmHXtywZ/WlWAmzOuREYnFGC9nTqdmyI3lUd5CO3pfYU0XOqSbAnVrUq1L/0+/6rDd+oqB9oEfebF1c/gfGEGGuUnK8Hbj6zvlQBAlFCaZVo0TXTapT34rtUkEsb4TpvY26iRGctfPA7+xvDp5aR2610patQd8ugIqwZgzDnF2Bm3uv48PONou4eSjvdjDMAem5Ug2ZTBirCA7cd/ntisOsoXVyeqFlmym5+c8UNantnnojLi+fGt7nQ2YcO4+lE+VpaGZC93RC9NZBGsZBlS3rvfN3GLWs9UX/25FnKNHT97wX0TArmOraK8UnSW4pOqhf5LuOGLdvkvymczhItY0UqwSO+Cru0EMYgx9LI1Qo1H2VMnEzjx6eVieOMZRRidt3FZF0hpvwtjEDdTnfA0ArnA48/jZrn7Perb+Q9UPPXl/OniPRujNYL4A0DL57kDkxjpO4k4Fnw/ApTRhT6QUnHIEOJYnaIFP6m4y/vHVcO5rzUXcxo2z1OU3ypyXVGr0cXd9AEuFmSNVVXDdPPfLaVwc6HdmOPjw0ezI4wYiZcMWoAp5otJwiKgNXJC6DGcVdhYrkaHQkm2BPfEJK4vRqkl04PdvwmdUXlke2vf7PS6KEnJcCwnqD0XzozsQGc1VGexP88mJLfk2HpWwL52dgPIHc3UjgG6ugkGxq52E= X-Forefront-Antispam-Report: CIP:165.204.84.17;CTRY:US;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:satlexmb07.amd.com;PTR:InfoDomainNonexistent;CAT:NONE;SFS:(13230040)(36860700016)(376014)(7416014)(82310400026)(1800799024)(56012099006)(11063799006)(6133799003)(18002099003)(22082099003);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: NK7BMOdux5D8SPhNO08+nnGoeq2YF+YMpKFAIcooyUUk2w9v1Mfhke+aHOV3638TxY3oIk47mTNA8X21rpa/XZ0Zd0W/5sf2XSUY/ilom/MZFuRSoWC8n7Z2p8+4+lTG7fprRPMbXp46Dn5onruV2cxhE6o5AjM5Hb20T/SpXJkl7Zmes8imA/VHWJC1E/2BbQvK0VnJ7NDaCCPpj39fpwFA6pBCvKmiEgMBFZ3TK+JQZX1IzNzM8rr/bkNCGOWVtW855zfEfKPwPWmztdmIEzEouRb80Mez/QoLuHRNiP9ZM8pPcz5BVIO0M8+GBpLLSJC1NEQ9FSTwe9kMEIJouHi4Vsd2VtBMjlAMkrAvHGoSi7c/zcxc1+Tg+xkFY9BCxmZ1AQTdfcXq/wO/T8+EV6GJbIWGUw7OmLHV+ZTIp22oV9zDTYPF9D52LTqLd5wW X-OriginatorOrg: amd.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 28 May 2026 05:18:31.9649 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: 35ba93e9-4419-44ff-7cb9-08debc788f59 X-MS-Exchange-CrossTenant-Id: 3dd8961f-e488-4e60-8e11-a82d994e183d X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp: TenantId=3dd8961f-e488-4e60-8e11-a82d994e183d;Ip=[165.204.84.17];Helo=[satlexmb07.amd.com] X-MS-Exchange-CrossTenant-AuthSource: SN1PEPF00036F41.namprd05.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Anonymous X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: CH3PR12MB7714 Content-Type: text/plain; charset="utf-8" Enable hardware vIOMMU on an IOMMU by locating its PCI vendor-specific capability (VSC), reading the VF and VF Control BAR addresses, and mapping them for host access (256MB VF, 4MB VF Control). VF Control covers the first 4K of guest IOMMU MMIO (control registers, trapped by QEMU). VF MMIO covers the third 4K (virtualized by the IOMMU). Per-guest bases use the Guest ID from the previous patch. Initialize the per-amd_iommu gid_ida here so amd_iommu_gid_alloc() can run when IOMMUFD creates a vIOMMU instance. Export MMIO map helpers and call amd_viommu_uninit() from IOMMU teardown. Signed-off-by: Vasant Hegde Signed-off-by: Suravee Suthikulpanit --- drivers/iommu/amd/amd_iommu.h | 2 + drivers/iommu/amd/amd_iommu_types.h | 34 ++++++++ drivers/iommu/amd/amd_viommu.h | 6 ++ drivers/iommu/amd/init.c | 5 +- drivers/iommu/amd/viommu.c | 124 ++++++++++++++++++++++++++++ 5 files changed, 169 insertions(+), 2 deletions(-) diff --git a/drivers/iommu/amd/amd_iommu.h b/drivers/iommu/amd/amd_iommu.h index 9f2a1a8a6d3c..044bc9a634a1 100644 --- a/drivers/iommu/amd/amd_iommu.h +++ b/drivers/iommu/amd/amd_iommu.h @@ -28,6 +28,8 @@ void amd_iommu_set_rlookup_table(struct amd_iommu *iommu,= u16 devid); void iommu_feature_enable(struct amd_iommu *iommu, u8 bit); void *__init iommu_alloc_4k_pages(struct amd_iommu *iommu, gfp_t gfp, size_t size); +u8 __iomem * __init iommu_map_mmio_space(u64 address, u64 end); +void __init iommu_unmap_mmio_space(struct amd_iommu *iommu); =20 #ifdef CONFIG_AMD_IOMMU_DEBUGFS void amd_iommu_debugfs_setup(void); diff --git a/drivers/iommu/amd/amd_iommu_types.h b/drivers/iommu/amd/amd_io= mmu_types.h index 00f964d5b149..e88e0bacd1a9 100644 --- a/drivers/iommu/amd/amd_iommu_types.h +++ b/drivers/iommu/amd/amd_iommu_types.h @@ -40,6 +40,12 @@ #define MMIO_RANGE_OFFSET 0x0c #define MMIO_MISC_OFFSET 0x10 =20 +/* vIOMMU Capability offsets (from IOMMU Capability Header) */ +#define MMIO_VSC_VF_BAR_LO_OFFSET 0x08 +#define MMIO_VSC_VF_BAR_HI_OFFSET 0x0c +#define MMIO_VSC_VF_CNTL_BAR_LO_OFFSET 0x10 +#define MMIO_VSC_VF_CNTL_BAR_HI_OFFSET 0x14 + /* Masks, shifts and macros to parse the device range capability */ #define MMIO_RANGE_LD_MASK 0xff000000 #define MMIO_RANGE_FD_MASK 0x00ff0000 @@ -473,6 +479,20 @@ extern bool amdr_ivrs_remap_support; #define for_each_ivhd_dte_flags(entry) \ list_for_each_entry((entry), &amd_ivhd_dev_flags_list, list) =20 +/* VIOMMU stuff */ +#define VIOMMU_VF_MMIO_ENTRY_SIZE 4096 +#define VIOMMU_VFCTRL_MMIO_ENTRY_SIZE 64 + +/* Host ioremap/request_mem_region sizes for VF / VF_CNTL BARs */ +#define VIOMMU_VF_MMIO_MAP_SIZE 0x10000000UL +#define VIOMMU_VF_CNTL_MMIO_MAP_SIZE 0x400000UL + +#define VIOMMU_VF_MMIO_BASE(iommu, guestId) \ + (iommu->vf_base + (guestId * VIOMMU_VF_MMIO_ENTRY_SIZE)) + +#define VIOMMU_VFCTRL_MMIO_BASE(iommu, guestId) \ + (iommu->vfctrl_base + (guestId * VIOMMU_VFCTRL_MMIO_ENTRY_SIZE)) + struct amd_iommu; struct iommu_domain; struct irq_domain; @@ -686,6 +706,20 @@ struct amd_iommu { */ u16 cap_ptr; =20 + /* Vendor-Specific Capability (VSC) pointer. */ + u16 vsc_offset; + + /* + * VF MMIO base physical address. This is needed to calculate/pass + * per guest VF MMIO address (3rd 4K of IOMMU MMIO space) + */ + u64 vf_base_phys; + u64 vf_cntl_phys; + + /* virtual addresses of vIOMMU VF/VF_CNTL BAR */ + u8 __iomem *vf_base; + u8 __iomem *vfctrl_base; + /* pci domain of this IOMMU */ struct amd_iommu_pci_seg *pci_seg; =20 diff --git a/drivers/iommu/amd/amd_viommu.h b/drivers/iommu/amd/amd_viommu.h index f08ab9ef23a9..d0c4fdd00809 100644 --- a/drivers/iommu/amd/amd_viommu.h +++ b/drivers/iommu/amd/amd_viommu.h @@ -10,6 +10,8 @@ =20 int amd_viommu_init(struct amd_iommu *iommu); =20 +void __init amd_viommu_uninit(struct amd_iommu *iommu); + #else =20 static inline int amd_viommu_init(struct amd_iommu *iommu) @@ -17,6 +19,10 @@ static inline int amd_viommu_init(struct amd_iommu *iomm= u) return -EOPNOTSUPP; } =20 +static inline void amd_viommu_uninit(struct amd_iommu *iommu) +{ +} + #endif /* CONFIG_AMD_IOMMU_IOMMUFD */ =20 #endif /* AMD_VIOMMU_H */ diff --git a/drivers/iommu/amd/init.c b/drivers/iommu/amd/init.c index 5ac883429ced..6e69b3dd8b1e 100644 --- a/drivers/iommu/amd/init.c +++ b/drivers/iommu/amd/init.c @@ -459,7 +459,7 @@ static void iommu_disable(struct amd_iommu *iommu) * mapping and unmapping functions for the IOMMU MMIO space. Each AMD IOMM= U in * the system has one. */ -static u8 __iomem * __init iommu_map_mmio_space(u64 address, u64 end) +u8 __iomem * __init iommu_map_mmio_space(u64 address, u64 end) { if (!request_mem_region(address, end, "amd_iommu")) { pr_err("Can not reserve memory region %llx-%llx for mmio\n", @@ -471,7 +471,7 @@ static u8 __iomem * __init iommu_map_mmio_space(u64 add= ress, u64 end) return (u8 __iomem *)ioremap(address, end); } =20 -static void __init iommu_unmap_mmio_space(struct amd_iommu *iommu) +void __init iommu_unmap_mmio_space(struct amd_iommu *iommu) { if (iommu->mmio_base) iounmap(iommu->mmio_base); @@ -1790,6 +1790,7 @@ static void __init free_iommu_one(struct amd_iommu *i= ommu) free_iommu_buffers(iommu); amd_iommu_free_ppr_log(iommu); free_ga_log(iommu); + amd_viommu_uninit(iommu); iommu_unmap_mmio_space(iommu); amd_iommu_iopf_uninit(iommu); } diff --git a/drivers/iommu/amd/viommu.c b/drivers/iommu/amd/viommu.c index f4b5f96d4785..014ae16bf58b 100644 --- a/drivers/iommu/amd/viommu.c +++ b/drivers/iommu/amd/viommu.c @@ -7,9 +7,15 @@ #define dev_fmt(fmt) pr_fmt(fmt) =20 #include +#include + +#include +#include +#include #include #include #include +#include =20 #include #include @@ -18,12 +24,130 @@ #include "amd_iommu.h" #include "amd_iommu_types.h" #include "amd_viommu.h" +#include "../iommu-pages.h" + +LIST_HEAD(viommu_devid_map); + +static int viommu_init_pci_vsc(struct amd_iommu *iommu) +{ + iommu->vsc_offset =3D pci_find_capability(iommu->dev, PCI_CAP_ID_VNDR); + if (!iommu->vsc_offset) + return -ENODEV; + + DUMP_printk("device:%s, vsc offset:%04x\n", + pci_name(iommu->dev), iommu->vsc_offset); + return 0; +} + +static void amd_viommu_gid_ida_init(struct amd_iommu *iommu) +{ + ida_init(&iommu->gid_ida); + iommu->gid_ida_inited =3D true; +} + +static void amd_viommu_gid_ida_fini(struct amd_iommu *iommu) +{ + if (!iommu->gid_ida_inited) + return; + + ida_destroy(&iommu->gid_ida); + iommu->gid_ida_inited =3D false; +} + +static void __init amd_viommu_vf_vfcntl_unmap(struct amd_iommu *iommu) +{ + if (iommu->vfctrl_base) { + iounmap(iommu->vfctrl_base); + iommu->vfctrl_base =3D NULL; + } + if (iommu->vf_cntl_phys) + release_mem_region(iommu->vf_cntl_phys, VIOMMU_VF_CNTL_MMIO_MAP_SIZE); + + if (iommu->vf_base) { + iounmap(iommu->vf_base); + iommu->vf_base =3D NULL; + } + if (iommu->vf_base_phys) + release_mem_region(iommu->vf_base_phys, VIOMMU_VF_MMIO_MAP_SIZE); +} + +void __init amd_viommu_uninit(struct amd_iommu *iommu) +{ + amd_viommu_gid_ida_fini(iommu); + amd_viommu_vf_vfcntl_unmap(iommu); +} + +static int __init viommu_vf_vfcntl_init(struct amd_iommu *iommu) +{ + u32 lo, hi; + u64 vf_phys, vf_cntl_phys; + + /* Setting up VF and VF_CNTL MMIOs */ + pci_read_config_dword(iommu->dev, iommu->vsc_offset + MMIO_VSC_VF_BAR_LO_= OFFSET, &lo); + pci_read_config_dword(iommu->dev, iommu->vsc_offset + MMIO_VSC_VF_BAR_HI_= OFFSET, &hi); + vf_phys =3D hi; + vf_phys =3D (vf_phys << 32) | lo; + if (!(vf_phys & 1)) { + pr_err(FW_BUG "vf_phys disabled\n"); + return -EINVAL; + } + + pci_read_config_dword(iommu->dev, iommu->vsc_offset + MMIO_VSC_VF_CNTL_BA= R_LO_OFFSET, &lo); + pci_read_config_dword(iommu->dev, iommu->vsc_offset + MMIO_VSC_VF_CNTL_BA= R_HI_OFFSET, &hi); + vf_cntl_phys =3D hi; + vf_cntl_phys =3D (vf_cntl_phys << 32) | lo; + if (!(vf_cntl_phys & 1)) { + pr_err(FW_BUG "vf_cntl_phys disabled\n"); + return -EINVAL; + } + + if (!vf_phys || !vf_cntl_phys) { + pr_err(FW_BUG "AMD-Vi: Unassigned VF resources.\n"); + return -ENOMEM; + } + + /* Mapping 256MB of VF and 4MB of VF_CNTL BARs */ + vf_phys &=3D ~1ULL; + iommu->vf_base =3D iommu_map_mmio_space(vf_phys, VIOMMU_VF_MMIO_MAP_SIZE); + if (!iommu->vf_base) { + pr_err("Can't reserve vf_base\n"); + return -ENOMEM; + } + iommu->vf_base_phys =3D vf_phys; + + vf_cntl_phys &=3D ~1ULL; + iommu->vfctrl_base =3D iommu_map_mmio_space(vf_cntl_phys, VIOMMU_VF_CNTL_= MMIO_MAP_SIZE); + if (!iommu->vfctrl_base) { + pr_err("Can't reserve vfctrl_base\n"); + goto err_out; + } + iommu->vf_cntl_phys =3D vf_cntl_phys; + + pr_debug("%s: IOMMU device:%s, vf_base:%#llx, vfctrl_base:%#llx\n", + __func__, pci_name(iommu->dev), vf_phys, vf_cntl_phys); + return 0; +err_out: + amd_viommu_uninit(iommu); + return -ENOMEM; +} =20 int __init amd_viommu_init(struct amd_iommu *iommu) { + int ret; + if (!amd_iommu_viommu || !check_feature(FEATURE_VIOMMU)) return 0; =20 + ret =3D viommu_init_pci_vsc(iommu); + if (ret) + return ret; + + ret =3D viommu_vf_vfcntl_init(iommu); + if (ret) + return ret; + + amd_viommu_gid_ida_init(iommu); + return 0; } --=20 2.34.1 From nobody Mon Jun 8 16:49:04 2026 Received: from CO1PR03CU002.outbound.protection.outlook.com (mail-westus2azon11010035.outbound.protection.outlook.com [52.101.46.35]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 693DD2E1EE7 for ; Thu, 28 May 2026 05:18:44 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=52.101.46.35 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1779945525; cv=fail; b=V3IA2RF2VpZs/4bqq424Oxk17Z2JG+iSY1T+ihPHjvCroQ90+wh/b44nFVzVH2wSUukPBxIoT/ulqZJ241HAs12CnJwENVsO9B4HdC3CJtmb0scz1vrnWcYKQucdlNsse8JL5/zyTpw+C+HNv5N90WubPsNyZPqc8NvfD6m7ILo= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1779945525; c=relaxed/simple; bh=AICmOGOWQW3w+LeUDez7HkxRGJNRLxLWnCYLvC/cmHg=; h=From:To:CC:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=ulev/y2+/k90g/O477Vh1u6DyIXWpmqZDqMxQSiJw0Fr/i/jzHDe36Dw6XAqWOglmErRa/hnlpIrYJ9j52aOoCLzVlPtLaDBN7QvJjj9fCwCiDuwRPWOySOmrzTIT//BjypNk0PeRpKX94EN62R8jPgBkeuIESYlL7UoFFph67E= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=amd.com; spf=fail smtp.mailfrom=amd.com; dkim=pass (1024-bit key) header.d=amd.com header.i=@amd.com header.b=qup7RkSJ; arc=fail smtp.client-ip=52.101.46.35 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=amd.com Authentication-Results: smtp.subspace.kernel.org; spf=fail smtp.mailfrom=amd.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=amd.com header.i=@amd.com header.b="qup7RkSJ" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=t6Qu9GUUpXxavgMfd6E10PN82bJzcrlAuq/u3ejAjuP3GoBLcPQO4tyYNKMjv3iklKiKn+ZyA4nx/iDX1HLXKOHO8hRl+E56WZv033wcNYsuCO0vceMB6lEMF61z+ycvJ0ak3hIVCFxggOz3Qsq1fvuNZzZmb3I+GiRnDRyAwG2LfMj4TVmZ0W0Y//XnNPqkGVaJP5332oGfd+K9ZnyilOxytfd0lBxo+omB8woGGUYzfNJZ1BzVh9XFmX8UyiRj9/TRQxjMPTaOAKYXHqHMcnGtkmDli0HP/9keOJm8Sm0SA09cg7AwnL3d25fsViLSWbDYXGsXroWsf9CPmecEAg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector10001; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=C5tJrYhaQPs3lgGY6anwOUe5aPcfs6He3NDyXP0tRSk=; b=WEA9X6EiscUcOqeVF13r37KO+bRntqlzl8JnbHHW4gC4vHVXqvGtuZHaQaxWSrBSX3Q75ziEh66+tIgP+qR9cRwi0Bc5wzLzmCF08F1hkwcyODWC4pryt21Ri1/4YAYId4gU5uo8KZ53xcaGBCGpasjPqlymFHXqRiE1JqrSsVD4KpGOW+1vHn1y8Ob6Qo89GPAWmhmynxx+QIqxWnk8hg3dDSqfe2wpT5trP3mnOW7+pzAfciyCXs/HGUwd0pRRpfsRY1RIrbnt9STNiJWnXxzb+an1C04AbCssYWIaGLMXVkFPYUGL+iFec34mkGs0UUepSSr5rSHXpi56URySIg== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass (sender ip is 165.204.84.17) smtp.rcpttodomain=vger.kernel.org smtp.mailfrom=amd.com; dmarc=pass (p=quarantine sp=quarantine pct=100) action=none header.from=amd.com; dkim=none (message not signed); arc=none (0) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=amd.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=C5tJrYhaQPs3lgGY6anwOUe5aPcfs6He3NDyXP0tRSk=; b=qup7RkSJtV2Jg6lsiw1Hx3I2YyOAxqGkmR6eYO1bnNoG5sOGtDl+A+KAsMi0Tm1zYOP/x1Q9mYu/xcZmQ3qFVYKh16ykfwG880ph38mY2OHWa8Dd+Xdmzn70WYCvGp6DMajZzzTzc3MtG/7wZO4fJ6XUm+bd3sDlCfrbmOjb8L0= Received: from SN6PR2101CA0006.namprd21.prod.outlook.com (2603:10b6:805:106::16) by BY5PR12MB4177.namprd12.prod.outlook.com (2603:10b6:a03:201::14) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.21.71.14; Thu, 28 May 2026 05:18:37 +0000 Received: from SN1PEPF00036F3F.namprd05.prod.outlook.com (2603:10b6:805:106:cafe::a4) by SN6PR2101CA0006.outlook.office365.com (2603:10b6:805:106::16) with Microsoft SMTP Server (version=TLS1_3, cipher=TLS_AES_256_GCM_SHA384) id 15.21.92.5 via Frontend Transport; Thu, 28 May 2026 05:18:36 +0000 X-MS-Exchange-Authentication-Results: spf=pass (sender IP is 165.204.84.17) smtp.mailfrom=amd.com; dkim=none (message not signed) header.d=none;dmarc=pass action=none header.from=amd.com; Received-SPF: Pass (protection.outlook.com: domain of amd.com designates 165.204.84.17 as permitted sender) receiver=protection.outlook.com; client-ip=165.204.84.17; helo=satlexmb07.amd.com; pr=C Received: from satlexmb07.amd.com (165.204.84.17) by SN1PEPF00036F3F.mail.protection.outlook.com (10.167.248.23) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.21.71.7 via Frontend Transport; Thu, 28 May 2026 05:18:36 +0000 Received: from purico-ed03host.amd.com (10.180.168.240) by satlexmb07.amd.com (10.181.42.216) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.2562.41; Thu, 28 May 2026 00:18:31 -0500 From: Suravee Suthikulpanit To: , , , CC: , , , , , , , , , , , , , Suravee Suthikulpanit , Vasant Hegde Subject: [PATCH v2 07/26] iommu/amd: Add support for AMD vIOMMU VF MMIO region Date: Thu, 28 May 2026 05:17:19 +0000 Message-ID: <20260528051738.596013-8-suravee.suthikulpanit@amd.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20260528051738.596013-1-suravee.suthikulpanit@amd.com> References: <20260528051738.596013-1-suravee.suthikulpanit@amd.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: satlexmb08.amd.com (10.181.42.217) To satlexmb07.amd.com (10.181.42.216) X-EOPAttributedMessage: 0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: SN1PEPF00036F3F:EE_|BY5PR12MB4177:EE_ X-MS-Office365-Filtering-Correlation-Id: cba8423f-cb6e-4d16-7a37-08debc789248 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|376014|7416014|1800799024|82310400026|36860700016|56012099006|11063799006|18002099003|22082099003; X-Microsoft-Antispam-Message-Info: jKRn57I1wJwCoFmAcst7wPZ617Voeg+Jk4OKSdx92xMRmgdi+8w4oZK93a5lA4YtXiVn0AQkPBeDX7OTyyV/BVzY7vCY/tOVTUla6TgK9zGlbDnzbxUofIU7BAmsgGitcjikEAG9YGjSpoqn4Dqzr3WM2VYhokqNQO28hncUK2mldosSTm89PV7fhK2EnXsSLJYJQey1ajqBsgKv0T6yUl8qUqAERJBOyEMLtaqTpg1LFktJ+7HKGAnLNQ5mQyD29PqI+Fe6WU4gWjeH5yFcp5UJhTov9fU7lrPlQeG/mMDvi2pmfwCMxy731CXV7lUu9UK/9NQEYSakAQmV4Ned5D4AApGoI50dW/7uSRw6o7m/P97J34fbRPTnX3N9otLvU/psFX2lsq9G9H7bcw2IxPYxXfx4xtaUJRP1N2iE9AumchTOqzcqumXNvlM7HZ8zVnQB3cN61IxxnQ8cA63esJjdao7DgUn32XjFdY/JnxrNVWnvPEBw2uHABBTXb/E70luImKOVM3Y8THIWj5qBPr8M7jZ2nIRI9ABWwVRd4BeRIvi7ggBDvfbA9x+qMyY5JOtWBRapWApeaj9J8El5oGYS5gfxPIZMnDUAkydsA80uJrOOBrFK4u61ZlWQ0HacrR+brjHa9oHy2YwxgKpdY7gfjDs9KKB9uTNrrDEb+CtpldqEFVPnyfoh8nJNTazw0O+Lxshc5z6mv8R04H8bv+OuxD3Twowu0FkgsMnvk1c= X-Forefront-Antispam-Report: CIP:165.204.84.17;CTRY:US;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:satlexmb07.amd.com;PTR:InfoDomainNonexistent;CAT:NONE;SFS:(13230040)(376014)(7416014)(1800799024)(82310400026)(36860700016)(56012099006)(11063799006)(18002099003)(22082099003);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: L70jSu0d796X8InpPBm3XanIYKMTrgqz1BKL9rFhvx4G+MUxuk9L4zWHifWUgGHcspw3RFGVP0bACc4pIqLIuTJIVojCHvnnBSSk3cUcu+E6ETcaq+FF6DmDFnKKwIBBDGpsM3X9GdkB4WxYfjEn/fDtA+F4j2MZcC/qhOaEO87GyBIHvPNi67yMeoxkdEMa3Rfyiu8QhN5GLJJdNZF7vlqpVDVFEdgBPhf2lB4rExaQPSS4+wVZsozrP3xo1mUKlQccQ/x8qEPMShdLjaLSyPg9TV0uPuZXPFkYJEmaM2+/HTl7kaAYSMp24IVl/ONlEjwZsIyQNaSmiw2Vw0Q45qgAHBSdYHO45itYBdWJiHJYtDdnxl7scjoLERHOXojeeA0sufUpFqGhYRjiTZQ/faoX9118XZ+8xLjIWKBuvirqaqG8mUe2Vcf/wgS+VTZq X-OriginatorOrg: amd.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 28 May 2026 05:18:36.8852 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: cba8423f-cb6e-4d16-7a37-08debc789248 X-MS-Exchange-CrossTenant-Id: 3dd8961f-e488-4e60-8e11-a82d994e183d X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp: TenantId=3dd8961f-e488-4e60-8e11-a82d994e183d;Ip=[165.204.84.17];Helo=[satlexmb07.amd.com] X-MS-Exchange-CrossTenant-AuthSource: SN1PEPF00036F3F.namprd05.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Anonymous X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: BY5PR12MB4177 Content-Type: text/plain; charset="utf-8" The AMD vIOMMU virtualizes guest MMIO registers at the 3rd 4K region. This is achieved using the iommufd_viommu_alloc_mmap(). Co-developed-by: Vasant Hegde Signed-off-by: Vasant Hegde Signed-off-by: Suravee Suthikulpanit --- drivers/iommu/amd/amd_iommu_types.h | 3 +++ drivers/iommu/amd/amd_viommu.h | 7 +++++++ drivers/iommu/amd/iommufd.c | 18 +++++++++++++++++- drivers/iommu/amd/viommu.c | 11 +++++++++++ include/uapi/linux/iommufd.h | 2 ++ 5 files changed, 40 insertions(+), 1 deletion(-) diff --git a/drivers/iommu/amd/amd_iommu_types.h b/drivers/iommu/amd/amd_io= mmu_types.h index e88e0bacd1a9..cc7049bbfa14 100644 --- a/drivers/iommu/amd/amd_iommu_types.h +++ b/drivers/iommu/amd/amd_iommu_types.h @@ -540,6 +540,9 @@ struct amd_iommu_viommu { * Indexed by guest domain ID. */ struct xarray gdomid_array; + + /* Offset for mmap() of guest VF MMIO; set after iommufd_viommu_alloc_mma= p(). */ + unsigned long vfmmio_mmap_offset; }; =20 /* diff --git a/drivers/iommu/amd/amd_viommu.h b/drivers/iommu/amd/amd_viommu.h index d0c4fdd00809..447692b9101c 100644 --- a/drivers/iommu/amd/amd_viommu.h +++ b/drivers/iommu/amd/amd_viommu.h @@ -12,6 +12,8 @@ int amd_viommu_init(struct amd_iommu *iommu); =20 void __init amd_viommu_uninit(struct amd_iommu *iommu); =20 +u64 amd_viommu_get_vfmmio_addr(struct amd_iommu *iommu, u16 gid); + #else =20 static inline int amd_viommu_init(struct amd_iommu *iommu) @@ -23,6 +25,11 @@ static inline void amd_viommu_uninit(struct amd_iommu *i= ommu) { } =20 +static inline u64 amd_viommu_get_vfmmio_addr(struct amd_iommu *iommu, u16 = gid) +{ + return 0; +} + #endif /* CONFIG_AMD_IOMMU_IOMMUFD */ =20 #endif /* AMD_VIOMMU_H */ diff --git a/drivers/iommu/amd/iommufd.c b/drivers/iommu/amd/iommufd.c index 785fa2d575f2..34524c1309c3 100644 --- a/drivers/iommu/amd/iommufd.c +++ b/drivers/iommu/amd/iommufd.c @@ -7,6 +7,7 @@ =20 #include "iommufd.h" #include "amd_iommu.h" +#include "amd_viommu.h" #include "amd_iommu_types.h" =20 static const struct iommufd_viommu_ops amd_viommu_ops; @@ -44,11 +45,12 @@ int amd_iommufd_viommu_init(struct iommufd_viommu *viom= mu, struct iommu_domain * const struct iommu_user_data *user_data) { int ret; + phys_addr_t page_base; unsigned long flags; struct iommu_viommu_amd data; struct protection_domain *pdom =3D to_pdomain(parent); - struct amd_iommu_viommu *aviommu =3D container_of(viommu, struct amd_iomm= u_viommu, core); struct amd_iommu *iommu =3D container_of(viommu->iommu_dev, struct amd_io= mmu, iommu); + struct amd_iommu_viommu *aviommu =3D container_of(viommu, struct amd_iomm= u_viommu, core); =20 xa_init_flags(&aviommu->gdomid_array, XA_FLAGS_ALLOC1); aviommu->parent =3D pdom; @@ -68,6 +70,16 @@ int amd_iommufd_viommu_init(struct iommufd_viommu *viomm= u, struct iommu_domain * aviommu->gid =3D ret; pr_debug("%s: gid=3D%#x", __func__, aviommu->gid); =20 + page_base =3D amd_viommu_get_vfmmio_addr(iommu, aviommu->gid); + + ret =3D iommufd_viommu_alloc_mmap(&aviommu->core, + page_base, SZ_4K, + (unsigned long *)&data.out_vfmmio_mmap_offset); + if (ret) + goto err_mmap; + + aviommu->vfmmio_mmap_offset =3D data.out_vfmmio_mmap_offset; + ret =3D iommu_copy_struct_to_user(user_data, &data, IOMMU_VIOMMU_TYPE_AMD, reserved); @@ -82,6 +94,8 @@ int amd_iommufd_viommu_init(struct iommufd_viommu *viommu= , struct iommu_domain * =20 return 0; err_init: + iommufd_viommu_destroy_mmap(&aviommu->core, aviommu->vfmmio_mmap_offset); +err_mmap: amd_iommu_gid_free(iommu, aviommu->gid); err_gid: return ret; @@ -100,6 +114,8 @@ static void amd_iommufd_viommu_destroy(struct iommufd_v= iommu *viommu) list_del(&aviommu->pdom_list); spin_unlock_irqrestore(&pdom->lock, flags); xa_destroy(&aviommu->gdomid_array); + if (aviommu->vfmmio_mmap_offset) + iommufd_viommu_destroy_mmap(&aviommu->core, aviommu->vfmmio_mmap_offset); amd_iommu_gid_free(iommu, aviommu->gid); } =20 diff --git a/drivers/iommu/amd/viommu.c b/drivers/iommu/amd/viommu.c index 014ae16bf58b..9e6eb2f977ec 100644 --- a/drivers/iommu/amd/viommu.c +++ b/drivers/iommu/amd/viommu.c @@ -131,6 +131,17 @@ static int __init viommu_vf_vfcntl_init(struct amd_iom= mu *iommu) return -ENOMEM; } =20 +/* + * Returns VF MMIO BAR offset for the give guest ID which will be + * mapped to guest vIOMMU 3rd 4K MMIO address + */ +u64 amd_viommu_get_vfmmio_addr(struct amd_iommu *iommu, u16 gid) +{ + /* TODO: Add check for sVIOMMU and set gid[bit 15] */ + return iommu->vf_base_phys + gid * VIOMMU_VF_MMIO_ENTRY_SIZE; +} +EXPORT_SYMBOL(amd_viommu_get_vfmmio_addr); + int __init amd_viommu_init(struct amd_iommu *iommu) { int ret; diff --git a/include/uapi/linux/iommufd.h b/include/uapi/linux/iommufd.h index 83ed10610957..0b7a3e5b057c 100644 --- a/include/uapi/linux/iommufd.h +++ b/include/uapi/linux/iommufd.h @@ -1084,9 +1084,11 @@ struct iommu_viommu_tegra241_cmdqv { =20 /** * struct iommu_viommu_amd - AMD vIOMMU Interface (IOMMU_VIOMMU_TYPE_AMD) + * @out_vfmmio_mmap_offset: (out) mmap offset for vIOMMU VF-MMIO * @reserved: Must be zero */ struct iommu_viommu_amd { + __aligned_u64 out_vfmmio_mmap_offset; __u32 reserved; /* must be last */ }; =20 --=20 2.34.1 From nobody Mon Jun 8 16:49:04 2026 Received: from CH5PR02CU005.outbound.protection.outlook.com (mail-northcentralusazon11012013.outbound.protection.outlook.com [40.107.200.13]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 830D9285CBC for ; Thu, 28 May 2026 05:18:45 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=40.107.200.13 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1779945526; cv=fail; b=tUo1uT8mG2bauhA0M5GlwYE/QbysAiVmDklhVq0Y8xGyHqlZgflpw6bFBAXAQB6k8q0RBJdgDWD/h1h2jtoDv7HCfqaPoTZCK4YSJLUbEGizcQ6llJdyQ18PmB4bBEp1Lfe4wjxnE7y8jiOxUHS11arasxXtfgS/Wkh23HA5zMs= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1779945526; c=relaxed/simple; bh=Iu7xykQ7JWnHJ0W8K/LRh5dvL8Wy1SsJonrspCqEcTk=; h=From:To:CC:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=ItX4z8bCgB2ktBHUAtRAvkeNsBSisDfSvPUcy2TL+RP2fgX/yJKwBtHagMRH/MHajyMSReCmSQp/u5VFMm2MZqs4PgZMVjXa2c2nKxuWG1ckEtcOTBlS1U6vVAlCzsfrlwnWPYm7sMCQPjEQgtxunCoX2XfCU0FQBb9tNpImbiY= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=amd.com; spf=fail smtp.mailfrom=amd.com; dkim=pass (1024-bit key) header.d=amd.com header.i=@amd.com header.b=Me1TyGC4; arc=fail smtp.client-ip=40.107.200.13 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=amd.com Authentication-Results: smtp.subspace.kernel.org; spf=fail smtp.mailfrom=amd.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=amd.com header.i=@amd.com header.b="Me1TyGC4" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=i/Dm+K+dlUP2P9aRkYqkyv4qFKDarNrkxLvV4HSUWsx3ayOgJGUzd0jCL2CknyQYdNdvO9NpxX1KIqzH89QTtsoSIYecHgdaVHRuNmKTl//kEa3gJhxE/Sx2KtdVuX+vKVmUD8oUTAPfhkvEiyzi91aQiyLyeJ7E0Gm72nUutxNlgg35fcYRMRhtFV84PJkP8lAKq9l9p4ZIWGlDKKpd+wzVMllnnTbUN8LYypKOS8Qj4S5et9A8R8oSxPIO68jDwZ5Ln25fbcjf4n1hgT30/eBjsUBCWwVJIGZtXsttpLM0gT4Tf63B1DkewfzWki/l5FB8mxLBLCKQO9VHon19vA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector10001; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=LE+IAbsRSTYFbvCJ1lxiH4CWMjOTQS2v1uAwAIY05cA=; b=xy6wzd6NLYD98DbrVI/hHDEKtbI05xTc7mONExTc9ZFOmsIgQ/BC80DlRJzuY7uLbq9+OwJO+WLmgT8iF3XHvM6sUr4V0M/Xbva+ln0DCbVplJw4byR3dd/gSA5t/DLYnlgOj/0mHjwA3egPDg9z/8P1bjhlmDgWyszbNGNP6QwPN00cJkNRm+Bd5bxN99LxSQuQGn6AuyyHkxx2dpiTtc3brlBOhefCkgMljn5jYLT7ECsIVkVad4kP8ztbNZ/uhuwPprcJqIaz68j5QydFLTf+9LWP0qgqAdtU70+sJrwYif/EYJZ3vBKUkWK/BuB4MmbLCjYQqEuANANVV+NfwA== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass (sender ip is 165.204.84.17) smtp.rcpttodomain=vger.kernel.org smtp.mailfrom=amd.com; dmarc=pass (p=quarantine sp=quarantine pct=100) action=none header.from=amd.com; dkim=none (message not signed); arc=none (0) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=amd.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=LE+IAbsRSTYFbvCJ1lxiH4CWMjOTQS2v1uAwAIY05cA=; b=Me1TyGC4KfjZSm+o4dlU/g44d3xJdTFahp5BuBeR7Qtogmh1OvwP+GNl07g1jo+96/GVy88x9BaWLnvnpMW+YHK0CajuH096iaxMvET/c0cxW8UpxAoOyCemaa7zbVITsjlEmXhTBNlbWyXP5hKzq3BCTL2Wy/Oa7pnJhtys8Qc= Received: from SN6PR05CA0001.namprd05.prod.outlook.com (2603:10b6:805:de::14) by SA1PR12MB999107.namprd12.prod.outlook.com (2603:10b6:806:4a2::14) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.21.71.12; Thu, 28 May 2026 05:18:42 +0000 Received: from SN1PEPF00036F43.namprd05.prod.outlook.com (2603:10b6:805:de:cafe::3e) by SN6PR05CA0001.outlook.office365.com (2603:10b6:805:de::14) with Microsoft SMTP Server (version=TLS1_3, cipher=TLS_AES_256_GCM_SHA384) id 15.21.92.4 via Frontend Transport; Thu, 28 May 2026 05:18:42 +0000 X-MS-Exchange-Authentication-Results: spf=pass (sender IP is 165.204.84.17) smtp.mailfrom=amd.com; dkim=none (message not signed) header.d=none;dmarc=pass action=none header.from=amd.com; Received-SPF: Pass (protection.outlook.com: domain of amd.com designates 165.204.84.17 as permitted sender) receiver=protection.outlook.com; client-ip=165.204.84.17; helo=satlexmb07.amd.com; pr=C Received: from satlexmb07.amd.com (165.204.84.17) by SN1PEPF00036F43.mail.protection.outlook.com (10.167.248.27) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.21.71.7 via Frontend Transport; Thu, 28 May 2026 05:18:41 +0000 Received: from purico-ed03host.amd.com (10.180.168.240) by satlexmb07.amd.com (10.181.42.216) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.2562.41; Thu, 28 May 2026 00:18:36 -0500 From: Suravee Suthikulpanit To: , , , CC: , , , , , , , , , , , , , Suravee Suthikulpanit Subject: [PATCH v2 08/26] iommu/amd: Introduce Reset vMMIO Command Date: Thu, 28 May 2026 05:17:20 +0000 Message-ID: <20260528051738.596013-9-suravee.suthikulpanit@amd.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20260528051738.596013-1-suravee.suthikulpanit@amd.com> References: <20260528051738.596013-1-suravee.suthikulpanit@amd.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: satlexmb08.amd.com (10.181.42.217) To satlexmb07.amd.com (10.181.42.216) X-EOPAttributedMessage: 0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: SN1PEPF00036F43:EE_|SA1PR12MB999107:EE_ X-MS-Office365-Filtering-Correlation-Id: a0f43fec-4703-4c35-159e-08debc78953e X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|1800799024|82310400026|376014|7416014|36860700016|22082099003|3023799007|18002099003|11063799006|56012099006; X-Microsoft-Antispam-Message-Info: 3C3ITdZmCiIh7szXxS6EsQju2aPwxQrwqVnUDroZxX9m13IftvPBJ6shTAWeWDK5sMQHMPDbalmLTZwnjHO0S5CheLrNa84wa1MGRPtu6+Z482kpl6Sy+aW7V8PuFGv3WN31hM7GAmyFFMwtFDqa7jB10qpKXmSiDrkWyk2SmQYr2HrbAzrOPATZ9iSvGb+ZvAoMmneBpPzmQlmyzQxVwYDEfZSlCW9NN1kTWodPuGkX0tFXOiTPh+0/KWIjNQW82Az1ZUkrMaYMmuTd1L5Mw6Errtt/OCmbZM9TY6QUSvdBmfh9X4HbyLl+Y8UwK6SlSuntTIkgveo9ectd0+jsCgJ+Gx27p9OKQD9SuKG1C3neKmNtPbZLPYUDmffwDciclT7XiQzTiDWF3g24Vv6ommIWOkLfY3lN/i46EYYql7AeM0FB4ihZWUEw/lLuSsFfveWr/REQKpIwtf/+GW44Rr4wlx0CZD3yJrTk48+Wj3A6uKGvqAw3VZLNuJKlTo7hEf/QQXqIWAR/Hgw/M7Wp7a6FBhcrl7se+E2AYzAl6aeLfnya7kZDuznFpgjWPewe7ug1W2GVWAUIKVSxkpSVbflbOFBT5KUadNUr7kME8lsqEESh/n4EaoZcJ7P1xXmbJ6pwJfrXHfBv5BRGpYhifSVwPeI3Mg6b6n6nFIJk3R5uCqH3o6ZYc9p7bsdPj7pxRLFkedDGOwfMUzTxm6SnSmyNXVBn5cKvNzdMHMoBjho= X-Forefront-Antispam-Report: CIP:165.204.84.17;CTRY:US;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:satlexmb07.amd.com;PTR:InfoDomainNonexistent;CAT:NONE;SFS:(13230040)(1800799024)(82310400026)(376014)(7416014)(36860700016)(22082099003)(3023799007)(18002099003)(11063799006)(56012099006);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: Pm+izBQifFhFLoDw0ZY0JkfLBqw6EySFDefWgSvkAv3NewoQVxxozq11WYHMoccnZ1VBt0bytDo1WTd8U6rf8FbLoNI0fHanWgU916N6Eg1phMRW8+aJQLkV2xYXhrg4Kx4v/qQANIsVrm+y6edo4rZH+KcukE5a/dVt8DYK1gBc5t5GfVo0NMguyyB1rLmc0Fgi1SZv5an0G/EqV1yjGNBRUZNoMRbtiCLjwLUWV/Gpex4P9z1krQ8UpPocxOBs0ImozprQa01GDfM0fFw7rOB4tZIaqFKTOyjLFafKQSh2bsBN4bGLhH+dZt9yLfguutceXqN6KOe67hX8ouxFkDYugdM+0LtqQmrMIta/9Al/eWy3cHHVci4yQTT6CEAOgspH9ZSUBqGi9LeJZNgI6YULoFnlBIUJghwd637tr+qSZYhI/nc5uZAPhcm60m0P X-OriginatorOrg: amd.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 28 May 2026 05:18:41.8530 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: a0f43fec-4703-4c35-159e-08debc78953e X-MS-Exchange-CrossTenant-Id: 3dd8961f-e488-4e60-8e11-a82d994e183d X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp: TenantId=3dd8961f-e488-4e60-8e11-a82d994e183d;Ip=[165.204.84.17];Helo=[satlexmb07.amd.com] X-MS-Exchange-CrossTenant-AuthSource: SN1PEPF00036F43.namprd05.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Anonymous X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: SA1PR12MB999107 Content-Type: text/plain; charset="utf-8" Introduce new IOMMU commands for vIOMMU to reset virtualized MMIO registers of a particular guest. Reviewed-by: Weinan Liu Signed-off-by: Suravee Suthikulpanit --- drivers/iommu/amd/amd_iommu.h | 1 + drivers/iommu/amd/amd_iommu_types.h | 1 + drivers/iommu/amd/iommu.c | 22 ++++++++++++++++++++++ drivers/iommu/amd/iommufd.c | 3 +++ 4 files changed, 27 insertions(+) diff --git a/drivers/iommu/amd/amd_iommu.h b/drivers/iommu/amd/amd_iommu.h index 044bc9a634a1..2ce207529ea0 100644 --- a/drivers/iommu/amd/amd_iommu.h +++ b/drivers/iommu/amd/amd_iommu.h @@ -11,6 +11,7 @@ =20 #include "amd_iommu_types.h" =20 +void iommu_reset_vmmio(struct amd_iommu *iommu, u16 gid); extern int amd_iommu_evtlog_size; extern int amd_iommu_pprlog_size; =20 diff --git a/drivers/iommu/amd/amd_iommu_types.h b/drivers/iommu/amd/amd_io= mmu_types.h index cc7049bbfa14..44fa1d6c64d6 100644 --- a/drivers/iommu/amd/amd_iommu_types.h +++ b/drivers/iommu/amd/amd_iommu_types.h @@ -218,6 +218,7 @@ #define CMD_INV_IRT 0x05 #define CMD_COMPLETE_PPR 0x07 #define CMD_INV_ALL 0x08 +#define CMD_RESET_VMMIO 0x0A =20 #define CMD_COMPL_WAIT_STORE_MASK 0x01 #define CMD_COMPL_WAIT_INT_MASK 0x02 diff --git a/drivers/iommu/amd/iommu.c b/drivers/iommu/amd/iommu.c index 73fba8be40d1..6f5ecc48f4ad 100644 --- a/drivers/iommu/amd/iommu.c +++ b/drivers/iommu/amd/iommu.c @@ -1428,6 +1428,18 @@ static void build_inv_irt(struct iommu_cmd *cmd, u16= devid) CMD_SET_TYPE(cmd, CMD_INV_IRT); } =20 +static void build_reset_vmmio(struct iommu_cmd *cmd, u16 gid, + bool vcmd, bool all) +{ + memset(cmd, 0, sizeof(*cmd)); + cmd->data[0] =3D gid; + if (all) + cmd->data[0] |=3D (1 << 28); + if (vcmd) + cmd->data[0] |=3D (1 << 31); + CMD_SET_TYPE(cmd, CMD_RESET_VMMIO); +} + /* * Writes the command to the IOMMUs command buffer and informs the * hardware about the new command. @@ -1668,6 +1680,16 @@ void amd_iommu_flush_all_caches(struct amd_iommu *io= mmu) } } =20 +void iommu_reset_vmmio(struct amd_iommu *iommu, u16 gid) +{ + struct iommu_cmd cmd; + + build_reset_vmmio(&cmd, gid, 1, 1); + + iommu_queue_command(iommu, &cmd); + amd_iommu_completion_wait(iommu); +} + /* * Command send function for flushing on-device TLB */ diff --git a/drivers/iommu/amd/iommufd.c b/drivers/iommu/amd/iommufd.c index 34524c1309c3..42307ae71b24 100644 --- a/drivers/iommu/amd/iommufd.c +++ b/drivers/iommu/amd/iommufd.c @@ -80,6 +80,9 @@ int amd_iommufd_viommu_init(struct iommufd_viommu *viommu= , struct iommu_domain * =20 aviommu->vfmmio_mmap_offset =3D data.out_vfmmio_mmap_offset; =20 + /* Reset vIOMMU MMIOs to initialize the vIOMMU */ + iommu_reset_vmmio(iommu, aviommu->gid); + ret =3D iommu_copy_struct_to_user(user_data, &data, IOMMU_VIOMMU_TYPE_AMD, reserved); --=20 2.34.1 From nobody Mon Jun 8 16:49:04 2026 Received: from DM5PR21CU001.outbound.protection.outlook.com (mail-centralusazon11011055.outbound.protection.outlook.com [52.101.62.55]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 44A672E4257 for ; Thu, 28 May 2026 05:18:51 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=52.101.62.55 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1779945534; cv=fail; b=P5zhPqKesvZb3D/hwYfKkuYGMs7wwI+mXrXSN9shw5SaaLvudu8W2Kb3sTy3d8/AMR8tE6w2O+eAwhz0yn3PrPKwK8jlPSj2mCXoEtR26e0l2WAId3umtgmorMqFT78spb5uObqrk4xe152ci9oB90wC+g0GFufWBM92J11ZTzg= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1779945534; c=relaxed/simple; bh=reYQffqwXyRQ0qLCQrt4dgroEyXAJv+io1R6HEOyqJ4=; h=From:To:CC:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=KoY/WYU3JveW+9+SzJ8RTewKpHzP2ZCUclhdHQCOZ/s10rMK3qFzdUs1pbSBPSpOltcsVAdPYw31NqpqZIFQQi6ec1KNmvqnzzaxRFSfXprUdbjIOvQHnXBKeY4RhKRWp+fqm0u0LQi7OUjza6sR6hkKAEyEGVCqp8cKA6EuxCc= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=amd.com; spf=fail smtp.mailfrom=amd.com; dkim=pass (1024-bit key) header.d=amd.com header.i=@amd.com header.b=pNlfc8YD; arc=fail smtp.client-ip=52.101.62.55 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=amd.com Authentication-Results: smtp.subspace.kernel.org; spf=fail smtp.mailfrom=amd.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=amd.com header.i=@amd.com header.b="pNlfc8YD" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=f+KosOxJruqixRNn2gC2Z1lKBGXQha8JxZzhL8WAYrdpz78J0AdMtGXAHY7+WanPEwxZ5noHWLUOVxbPwpC87uSsz/u8iyASp0qkcahptrNW0WnVe9nkZfhCuh9Ja7ja+QgGuPFeL+Wf3HFpyeyBOwyn7EPKWXuvZBN9ohA4LmYe+PXHYxqwOLVYJueJQvIG0e5pQU9WU8xkSgY4Vu3PUOqFEJ/h5tQj4nbx7OtLntQQJ/kzKkfLlXc8f5Cq6qVe5nKZSdczUgYrTOMucqiawGZ3D9FdI2wJY5co7XWKjUudfreIsNMJ9M/caY8fILLnNAgsozGph95UDBHpNcD4qw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector10001; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=dpXpK4qISvc8AcuRVTOCOrgjdQVbI2N2hQjOeBgstn0=; b=ORC5pFcit5AkwjSxdfDhQmT/2mTqPv7jB9r8nnuJDY4sDQMgRoZuFFjUl+lJZfMP50XtUqEsD1BEGn8SlQk9P58dBY26otphlaBipyUY9zoBOmB/e9RaaQISG2GMKDkFNCCUzc4O5QJDQIPxZxqfMAVQhcZQL7mB79epm4DBHK9BWQTMZIZ2dUtWNnNTz8lyukMvyAe52MfltqdA69kuN5aqbAn1Bljdc0zfSP37n7CBQ9wM2oIqwfnf6APCXNXWZXts8VvSKN/ZrHyTJrGRFDoA8kvaT8mSNbQwGpJYJYWDf4ud+YKGg+rtoi8x3JRFiZNj5/nssz6h8HbueosTGA== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass (sender ip is 165.204.84.17) smtp.rcpttodomain=vger.kernel.org smtp.mailfrom=amd.com; dmarc=pass (p=quarantine sp=quarantine pct=100) action=none header.from=amd.com; dkim=none (message not signed); arc=none (0) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=amd.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=dpXpK4qISvc8AcuRVTOCOrgjdQVbI2N2hQjOeBgstn0=; b=pNlfc8YDa8SnOZ9kYKtbRoXDgLFX4I93F7Ex6prNWOXMY0G8epnJSBRrFbTbJa8inTmPcyNV2Pjj3oDE7JHlQ7Y2F0pnpRFOY2Bmf8VkJlUC9nBUhCKhluw9fUSRM/NSTYYwtqmLLyyKz+ST6Ar9ZwpAG/Ca4oA6gZN8PVl+W/0= Received: from SA1PR03CA0001.namprd03.prod.outlook.com (2603:10b6:806:2d3::12) by PH7PR12MB7164.namprd12.prod.outlook.com (2603:10b6:510:203::13) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.21.71.12; Thu, 28 May 2026 05:18:47 +0000 Received: from SN1PEPF00036F41.namprd05.prod.outlook.com (2603:10b6:806:2d3:cafe::e) by SA1PR03CA0001.outlook.office365.com (2603:10b6:806:2d3::12) with Microsoft SMTP Server (version=TLS1_3, cipher=TLS_AES_256_GCM_SHA384) id 15.21.71.13 via Frontend Transport; Thu, 28 May 2026 05:18:47 +0000 X-MS-Exchange-Authentication-Results: spf=pass (sender IP is 165.204.84.17) smtp.mailfrom=amd.com; dkim=none (message not signed) header.d=none;dmarc=pass action=none header.from=amd.com; Received-SPF: Pass (protection.outlook.com: domain of amd.com designates 165.204.84.17 as permitted sender) receiver=protection.outlook.com; client-ip=165.204.84.17; helo=satlexmb07.amd.com; pr=C Received: from satlexmb07.amd.com (165.204.84.17) by SN1PEPF00036F41.mail.protection.outlook.com (10.167.248.25) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.21.71.7 via Frontend Transport; Thu, 28 May 2026 05:18:47 +0000 Received: from purico-ed03host.amd.com (10.180.168.240) by satlexmb07.amd.com (10.181.42.216) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.2562.41; Thu, 28 May 2026 00:18:41 -0500 From: Suravee Suthikulpanit To: , , , CC: , , , , , , , , , , , , , Suravee Suthikulpanit Subject: [PATCH v2 09/26] iommu/amd: Introduce domain for IOMMU Private Address (IPA) region Date: Thu, 28 May 2026 05:17:21 +0000 Message-ID: <20260528051738.596013-10-suravee.suthikulpanit@amd.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20260528051738.596013-1-suravee.suthikulpanit@amd.com> References: <20260528051738.596013-1-suravee.suthikulpanit@amd.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: satlexmb08.amd.com (10.181.42.217) To satlexmb07.amd.com (10.181.42.216) X-EOPAttributedMessage: 0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: SN1PEPF00036F41:EE_|PH7PR12MB7164:EE_ X-MS-Office365-Filtering-Correlation-Id: e1e7cd31-4e61-4843-e86c-08debc789859 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|376014|7416014|36860700016|82310400026|1800799024|18002099003|22082099003|56012099006|11063799006; X-Microsoft-Antispam-Message-Info: tzuqzuvMhAdFeKUvoJWR8Zoxt88Oa/zsWYbcl5u7xHw5MWFH6F5sIyYZzpx9bTa1hNTMvZAbWNctqxIphAcQd/QUecQnXElOWn8PQJkZWpEKYs+GRGgFurgupPg+MPBrxXdPyS7mm3xfuB8CDh/QU3Gu6kLfCmPFa5pHJF2SMgk/eOG5ZmwjSq+Mjt9zTkE0YvH7QDKYm4XJf13VfbeQuVNMdtqeeue9pIxI4ktY0nPbr1KSIj6CWOmKnakuR5ED7+qbh4VRKYXeSXRr/cHKNebcHdbpcT1lTymztOrwCPa+dnlch8NVI3cAfeiWUaddr/t1Dqr/wE6J04Vzor9Xq/vn1y8tmr+jhRorGIfBMlXya6YtPEM6Q1NeoUMHobMb4rVCIHZtCdxgD1ullF6Iq3/+uyGVd9becpgBHFs+WyDubukbWGaTKaJuYCniMC07RauIznMqqV6hnvgN+zsq25mmJS++vveCliFL3vOpfqF44BuaWGDhk/TS0eDRJq/XAMoVDKw9vVYqgGwwlVTq+e0fgPPasl2lOHQ3c3e2V0bkrsB2DsgX5Xjd6cBS/SkTG8HU49xlka/lzmqeqfuebh7IAfte/F6isBCpHr8gDXC5bWe4XxdbuJAdJi9BPqdcDEEPPNvVVH+w9BWRN/fXe5bvpjVOoqpA5mWtJS+Dpp83BmAsO/FekH4ggK3Jt1ZDuVMb/DJ/um5p0g5VyckuS4uvZaOybBfvbrBf76ZGbHU= X-Forefront-Antispam-Report: CIP:165.204.84.17;CTRY:US;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:satlexmb07.amd.com;PTR:InfoDomainNonexistent;CAT:NONE;SFS:(13230040)(376014)(7416014)(36860700016)(82310400026)(1800799024)(18002099003)(22082099003)(56012099006)(11063799006);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: zQoRGXkfoSel/j+gLPUaGCC14vhWuuu05yztuFJrQzuoC58tl5nGr0NNUNa777yxeySluUDk/iqN9/EUvgYkPascb+jcFEXapGo2Ru7iR/g4oRyfM1j6+YDmaU4ErnLYr1NyHR6ub/szsc0VBE7JLhHTK4Tk4oGauzcv9JNpkDeRQM8tbORKK6UW4RRIUJP0K2c8Nu83K99lf2MpyqNdwgb/4zZsyKDq6uHjkMDgQrSb/tqWAW6Bb6dMKb71YPLENFQhyd8WjK2c0TeYkDK/tlVnDKKtJkbZSgTsotbLzwdGG7oyzTnq0AxBkxtIoyg5a7NBQTQLhg5XP4D7R7xDBoasV8/EhGluyxJw8CCa72V7uQH2TWh6fVZ8tkUPK1V73c4KaPi3QzmxWKwou8g09yHNOwNpKzPhUaqPjMHQDVwL8XAsw1b3u8QPFqzsa2ZY X-OriginatorOrg: amd.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 28 May 2026 05:18:47.0700 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: e1e7cd31-4e61-4843-e86c-08debc789859 X-MS-Exchange-CrossTenant-Id: 3dd8961f-e488-4e60-8e11-a82d994e183d X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp: TenantId=3dd8961f-e488-4e60-8e11-a82d994e183d;Ip=[165.204.84.17];Helo=[satlexmb07.amd.com] X-MS-Exchange-CrossTenant-AuthSource: SN1PEPF00036F41.namprd05.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Anonymous X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: PH7PR12MB7164 Content-Type: text/plain; charset="utf-8" AMD vIOMMU introduces the IOMMU Private Address (IPA) region, which is used to manage data structures necessary for IOMMU virtualization within the guest. Introduce a new domain specifically for IPA region for each IOMMU, which is stored in struct amd_iommu.viommu_pdom. This domain uses AMD IOMMU v1 page table. For more info, please see section vIOMMU Private Address Space of the IOMMU specification [1]. [1] https://docs.amd.com/v/u/en-US/48882_3.10_PUB Signed-off-by: Suravee Suthikulpanit --- drivers/iommu/amd/amd_iommu.h | 5 +++++ drivers/iommu/amd/amd_iommu_types.h | 3 +++ drivers/iommu/amd/iommu.c | 9 ++++---- drivers/iommu/amd/viommu.c | 35 +++++++++++++++++++++++++++++ 4 files changed, 47 insertions(+), 5 deletions(-) diff --git a/drivers/iommu/amd/amd_iommu.h b/drivers/iommu/amd/amd_iommu.h index 2ce207529ea0..1aa79a26a127 100644 --- a/drivers/iommu/amd/amd_iommu.h +++ b/drivers/iommu/amd/amd_iommu.h @@ -31,6 +31,7 @@ void *__init iommu_alloc_4k_pages(struct amd_iommu *iommu, gfp_t gfp, size_t size); u8 __iomem * __init iommu_map_mmio_space(u64 address, u64 end); void __init iommu_unmap_mmio_space(struct amd_iommu *iommu); +int iommu_flush_dte(struct amd_iommu *iommu, u16 devid); =20 #ifdef CONFIG_AMD_IOMMU_DEBUGFS void amd_iommu_debugfs_setup(void); @@ -39,6 +40,8 @@ static inline void amd_iommu_debugfs_setup(void) {} #endif =20 extern bool amd_iommu_viommu; +extern const struct pt_iommu_driver_ops amd_hw_driver_ops_v1; +extern const struct iommu_domain_ops amdv1_ops; =20 /* Needed for interrupt remapping */ int amd_iommu_prepare(void); @@ -56,6 +59,8 @@ extern bool amd_iommu_hatdis; /* Protection domain ops */ void amd_iommu_init_identity_domain(void); struct protection_domain *protection_domain_alloc(void); +struct iommu_domain *amd_iommu_domain_alloc_paging_v1(struct device *dev, + u32 flags); struct iommu_domain *amd_iommu_domain_alloc_sva(struct device *dev, struct mm_struct *mm); void amd_iommu_domain_free(struct iommu_domain *dom); diff --git a/drivers/iommu/amd/amd_iommu_types.h b/drivers/iommu/amd/amd_io= mmu_types.h index 44fa1d6c64d6..02d359f09148 100644 --- a/drivers/iommu/amd/amd_iommu_types.h +++ b/drivers/iommu/amd/amd_iommu_types.h @@ -814,6 +814,9 @@ struct amd_iommu { =20 struct ida gid_ida; /* guest IDs for this IOMMU */ bool gid_ida_inited; + + /* HW vIOMMU support */ + struct protection_domain *viommu_pdom; }; =20 static inline struct amd_iommu *dev_to_amd_iommu(struct device *dev) diff --git a/drivers/iommu/amd/iommu.c b/drivers/iommu/amd/iommu.c index 6f5ecc48f4ad..d89664eba898 100644 --- a/drivers/iommu/amd/iommu.c +++ b/drivers/iommu/amd/iommu.c @@ -1551,7 +1551,7 @@ static void domain_flush_complete(struct protection_d= omain *domain) amd_iommu_completion_wait(pdom_iommu_info->iommu); } =20 -static int iommu_flush_dte(struct amd_iommu *iommu, u16 devid) +int iommu_flush_dte(struct amd_iommu *iommu, u16 devid) { struct iommu_cmd cmd; =20 @@ -2726,12 +2726,12 @@ static void amd_iommu_iotlb_sync(struct iommu_domai= n *domain, iommu_put_pages_list(&gather->freelist); } =20 -static const struct pt_iommu_driver_ops amd_hw_driver_ops_v1 =3D { +const struct pt_iommu_driver_ops amd_hw_driver_ops_v1 =3D { .get_top_lock =3D amd_iommu_get_top_lock, .change_top =3D amd_iommu_change_top, }; =20 -static const struct iommu_domain_ops amdv1_ops =3D { +const struct iommu_domain_ops amdv1_ops =3D { IOMMU_PT_DOMAIN_OPS(amdv1), .iotlb_sync_map =3D amd_iommu_iotlb_sync_map, .flush_iotlb_all =3D amd_iommu_flush_iotlb_all, @@ -2746,8 +2746,7 @@ static const struct iommu_dirty_ops amdv1_dirty_ops = =3D { .set_dirty_tracking =3D amd_iommu_set_dirty_tracking, }; =20 -static struct iommu_domain *amd_iommu_domain_alloc_paging_v1(struct device= *dev, - u32 flags) +struct iommu_domain *amd_iommu_domain_alloc_paging_v1(struct device *dev, = u32 flags) { struct pt_iommu_amdv1_cfg cfg =3D {}; struct protection_domain *domain; diff --git a/drivers/iommu/amd/viommu.c b/drivers/iommu/amd/viommu.c index 9e6eb2f977ec..63360eef6b0d 100644 --- a/drivers/iommu/amd/viommu.c +++ b/drivers/iommu/amd/viommu.c @@ -131,6 +131,37 @@ static int __init viommu_vf_vfcntl_init(struct amd_iom= mu *iommu) return -ENOMEM; } =20 +static int viommu_private_space_init(struct amd_iommu *iommu) +{ + struct iommu_domain *dom; + struct protection_domain *pdom; + struct pt_iommu_amdv1_hw_info pt_info; + + /* + * Setup page table root pointer, Guest MMIO and + * Cmdbuf Dirty Status regions. + */ + dom =3D amd_iommu_domain_alloc_paging_v1(&iommu->dev->dev, 0); + if (!dom) { + pr_err("%s: Failed to initialize private space\n", __func__); + goto err_out; + } + + pdom =3D to_pdomain(dom); + iommu->viommu_pdom =3D pdom; + + pt_iommu_amdv1_hw_info(&pdom->amdv1, &pt_info); + pr_debug("%s: devid=3D%#x, pte_root=3D%#llx\n", + __func__, iommu->devid, + (unsigned long long)pt_info.host_pt_root); + + return 0; +err_out: + if (dom) + amd_iommu_domain_free(dom); + return -ENOMEM; +} + /* * Returns VF MMIO BAR offset for the give guest ID which will be * mapped to guest vIOMMU 3rd 4K MMIO address @@ -160,5 +191,9 @@ int __init amd_viommu_init(struct amd_iommu *iommu) =20 amd_viommu_gid_ida_init(iommu); =20 + ret =3D viommu_private_space_init(iommu); + if (ret) + return ret; + return 0; } --=20 2.34.1 From nobody Mon Jun 8 16:49:04 2026 Received: from BL0PR03CU003.outbound.protection.outlook.com (mail-eastusazon11012039.outbound.protection.outlook.com [52.101.53.39]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 156B1318139 for ; Thu, 28 May 2026 05:18:54 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=52.101.53.39 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1779945536; cv=fail; b=g1qL/ao4YyQiZsR0msOiD/aNzEE0CD+q+O9NoLUUxwPgJNGRm38yBPfBPUByrdnOlk77BTQeU6NANvj1bGhXebrbfhhdRP8qFlCihL9gB1QqXBVmqViA9IzdiIq2+xdFxmMglkVAP9H21UEDlvwFdm/Dco7kFu+/pZsx43mhifM= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1779945536; c=relaxed/simple; bh=Y7gZpdYAiH3pTIbSvExUPIP1HKpd5h/Wk71QgVUuq9k=; h=From:To:CC:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=OZV39Fw1xMkdJ8rhnaKQXFKqAAlVlemmZwg8js5IseU8RQsmWb+YWZm8bn8pXoO/tbTXJ6aD6vsVXRoeYCatqBm73cCQKQtdcpBXC7xXpxhZNdjK7bUnXP7YNXQSilowZUGgJ4QjOJb4Bnw6+f/dZMXOgg2MpHmX92HKVr0UMNo= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=amd.com; spf=fail smtp.mailfrom=amd.com; dkim=pass (1024-bit key) header.d=amd.com header.i=@amd.com header.b=dEKBf36F; arc=fail smtp.client-ip=52.101.53.39 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=amd.com Authentication-Results: smtp.subspace.kernel.org; spf=fail smtp.mailfrom=amd.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=amd.com header.i=@amd.com header.b="dEKBf36F" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=XZxvl6rx/nn3KpnJzHefBoadAo4wf9izCd5fSm9b8mXKNBWpX9aw9opixOkXMi4niaOz+AXYE4YYRgj9qMSxYEzZHNjkn6mZSW9nJqwK43IL1rcUFHyolHnHkdKIOJbsPCKF4bGYYmA1igjOAOa1pTgrEYgMUz+ZFxVEZl905sccHvMSF6IRoDvbP1aN2bcUirUe1U4Cm+ByawvGkW/DKvTqq3O3mF/2dYNeRRcxgrKJ96TRcgdDTInlcwqR5timltnI1VPCugqd1wbdASKkLtmcsESRYaEGYFIDDKTK+leNVLHTpJvx42SaB9w7hV2+YvP3rKindZtmFYZ6WUd7wg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector10001; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=EdisAbtTTjI+vSDL7wCQdXt7D+ue6l0B9nFo94dCuoM=; b=vCNdw+2UYBCTFwnEbZBG0TsGKJnkBnGF7fZs+qodnJorrN6LgX1dqMjrINKviMhDVlzMFDs6tVR/m+s+JtEh8k8ZLhXPARNrkLtUCgr+nBU2IA8qBOG+c+OWIhTojoRU0RsoA9/6uuDyVCVu9WuvXS7YnUEvXsUfQ3tnMcojyLvaR7FM9YVXKvtFYw4XjTuUil/olk3HlhvbijaicZQUoTSXOm15vQ5EznGtsV1cQ7KRtbjIuR/nd3ynvUTGm734VMR8RPT3/n6CHVWMQJarDaFYzKiUJbF1OvY+htHz1kRHIul/MCLOCK662J9SMit1eGw0+HntGCzcUxry8paJkQ== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass (sender ip is 165.204.84.17) smtp.rcpttodomain=vger.kernel.org smtp.mailfrom=amd.com; dmarc=pass (p=quarantine sp=quarantine pct=100) action=none header.from=amd.com; dkim=none (message not signed); arc=none (0) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=amd.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=EdisAbtTTjI+vSDL7wCQdXt7D+ue6l0B9nFo94dCuoM=; b=dEKBf36FAywi5qgfDfZHD/Gb1Xn/8f7C9S09txmdv4LwAUEPbVPhfrnvoc7SsFcNtTHapZxlQk6xemEyhbauaA1sX8HHPF4nDHbz00YWBI8tD+GDVzyrHFDkerJRPhRX2ahSABLDyTYkCeL+NMkfh/edOi433Q3TA6eNLCu4VgA= Received: from PH7PR02CA0009.namprd02.prod.outlook.com (2603:10b6:510:33d::11) by BL1PR12MB5946.namprd12.prod.outlook.com (2603:10b6:208:399::8) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.21.71.14; Thu, 28 May 2026 05:18:51 +0000 Received: from SN1PEPF00036F40.namprd05.prod.outlook.com (2603:10b6:510:33d:cafe::51) by PH7PR02CA0009.outlook.office365.com (2603:10b6:510:33d::11) with Microsoft SMTP Server (version=TLS1_3, cipher=TLS_AES_256_GCM_SHA384) id 15.21.71.13 via Frontend Transport; Thu, 28 May 2026 05:18:51 +0000 X-MS-Exchange-Authentication-Results: spf=pass (sender IP is 165.204.84.17) smtp.mailfrom=amd.com; dkim=none (message not signed) header.d=none;dmarc=pass action=none header.from=amd.com; Received-SPF: Pass (protection.outlook.com: domain of amd.com designates 165.204.84.17 as permitted sender) receiver=protection.outlook.com; client-ip=165.204.84.17; helo=satlexmb07.amd.com; pr=C Received: from satlexmb07.amd.com (165.204.84.17) by SN1PEPF00036F40.mail.protection.outlook.com (10.167.248.24) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.21.71.7 via Frontend Transport; Thu, 28 May 2026 05:18:51 +0000 Received: from purico-ed03host.amd.com (10.180.168.240) by satlexmb07.amd.com (10.181.42.216) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.2562.41; Thu, 28 May 2026 00:18:46 -0500 From: Suravee Suthikulpanit To: , , , CC: , , , , , , , , , , , , , Suravee Suthikulpanit Subject: [PATCH v2 10/26] iommu/amd: Assign IOMMU Private Address domain to IOMMU Date: Thu, 28 May 2026 05:17:22 +0000 Message-ID: <20260528051738.596013-11-suravee.suthikulpanit@amd.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20260528051738.596013-1-suravee.suthikulpanit@amd.com> References: <20260528051738.596013-1-suravee.suthikulpanit@amd.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: satlexmb08.amd.com (10.181.42.217) To satlexmb07.amd.com (10.181.42.216) X-EOPAttributedMessage: 0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: SN1PEPF00036F40:EE_|BL1PR12MB5946:EE_ X-MS-Office365-Filtering-Correlation-Id: 85acf147-2556-4a31-80ab-08debc789ae0 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|36860700016|7416014|1800799024|376014|82310400026|22082099003|18002099003|11063799006|56012099006; X-Microsoft-Antispam-Message-Info: ZTMC4C39mJokMYZbytbJmlXMysOT4K+fVO0wm9c74VoGbaAq0HM2GMneoijYQnIfOCKYNiTC2lz2iAIzHDMCAPYMujoSwHMP06kQ0g1JPYmFrehGzyXlQebnOVd0ZjamJFbfQfextsAGHKW8qxcqGJmyccsBnx24O4ohwSnD62Iv3FkseAMurIBtUnboUzJBvnXXH27gVacO76jmGpSi/o+w2ZMMhIVH0RsvOV1EnaycVUWiMwV2KE/UxAOx2NvxJZBGTajNz967AIr4KHhLuYFUt2Vno/NmXS4MDiRzEi4umlBStM73KFfwZ9O35QA485K3dWBku5F/PSyfnPijRBfTqsai9/frGqNG5PMddTfbs7SYnvQRr/9Fho3wJT6rD7SxplvkfOezWh4vpQymWU4P7vU7bZxQ5vpfrd3wjF196R2D5QFwUa3yHeWAHNhukbEJ+jT4WaaAtz0VXOD0ECzGpJDXn6TqWuwfB/Yc5C+DulbAPEJDAupl9yg/YZekkSgscjYiaOr9bsSGNwoxpDxXt0Q3ueNKHmJ0Ikkfk81HhSL0XEFpDaXZpz+6G3HXwFRH9/KHD9281J10j/Uwllj31Vep+wjKL0V583X099WGR1w0AlkGsxikZVs+ipREcFZ29PcmFpHv9MWozA1hnAfh774+tv4NdQCewy/X45Bn7GDqfr/aKakBGLbDkNaLtWvsw1dTYEbK34cY3zQr7Q51ZEOSnhPb8+cjV+fJAzI= X-Forefront-Antispam-Report: CIP:165.204.84.17;CTRY:US;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:satlexmb07.amd.com;PTR:InfoDomainNonexistent;CAT:NONE;SFS:(13230040)(36860700016)(7416014)(1800799024)(376014)(82310400026)(22082099003)(18002099003)(11063799006)(56012099006);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: m/jVm/r5vs+1GXRT7aSLqJ+QncDHRG9qziNsX4FOOohbrt3B5w3UK+eH5ss2QeSiVKEfzox/do+4fwEjiDdCk+Cge+7tMTzraUzLKbMWGXGkeh0Sqaq3TvgaZzSytrvesFK2whKU1xHQRtpWE9sabaYskX97bX1vZMDbFOrTK/+23Oo2iL24OMEAd+dBm1SEZSFQHkUFUMNNtyiNJVkqk5Xdj/s/wqfBP4CTnWOX1Xbdz17v+vzd0Y4Yr+o1fwdyiSR5LPhAmAEvENizNRnbNBdMW8UWsiBzgGWMym0VFbmVPDEOYGYrwmDgLRV92OFoCaetGBzJDlOGnozKb6LAcixRwvRdGMjMOE32N9MKw0VuI5n/M89yUKrb948/eBzzegGQLyrqeBlpVh2TV3s8x/yjvYuoNdJyIbQa9KXvQKrNuwCQo5pxOjij7QWehXnG X-OriginatorOrg: amd.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 28 May 2026 05:18:51.3048 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: 85acf147-2556-4a31-80ab-08debc789ae0 X-MS-Exchange-CrossTenant-Id: 3dd8961f-e488-4e60-8e11-a82d994e183d X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp: TenantId=3dd8961f-e488-4e60-8e11-a82d994e183d;Ip=[165.204.84.17];Helo=[satlexmb07.amd.com] X-MS-Exchange-CrossTenant-AuthSource: SN1PEPF00036F40.namprd05.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Anonymous X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: BL1PR12MB5946 Content-Type: text/plain; charset="utf-8" By setting the domain ID, pagetable mode, and IOMMU v1 page table in the IOMMU Device Table Entry (DTE) indexed using the device ID of the AMD IOMMU. Signed-off-by: Suravee Suthikulpanit --- drivers/iommu/amd/viommu.c | 31 +++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) diff --git a/drivers/iommu/amd/viommu.c b/drivers/iommu/amd/viommu.c index 63360eef6b0d..14426649074f 100644 --- a/drivers/iommu/amd/viommu.c +++ b/drivers/iommu/amd/viommu.c @@ -173,6 +173,35 @@ u64 amd_viommu_get_vfmmio_addr(struct amd_iommu *iommu= , u16 gid) } EXPORT_SYMBOL(amd_viommu_get_vfmmio_addr); =20 +/* Set DTE for IOMMU device */ +static void set_iommu_dte(struct amd_iommu *iommu) +{ + u64 dte0, dte1; + u16 devid =3D iommu->devid; + struct pt_iommu_amdv1_hw_info pt_info; + struct protection_domain *pdom =3D iommu->viommu_pdom; + struct dev_table_entry *dev_table =3D get_dev_table(iommu); + + pt_iommu_amdv1_hw_info(&pdom->amdv1, &pt_info); + + pr_debug("%s: host_pt_root=3D%#llx, mode=3D%#x\n", + __func__, pt_info.host_pt_root, pt_info.mode); + + dte0 =3D FIELD_PREP(DTE_HOST_TRP, pt_info.host_pt_root >> 12); + dte0 |=3D (pt_info.mode & DEV_ENTRY_MODE_MASK) << DEV_ENTRY_MODE_SHIFT; + dte0 |=3D DTE_FLAG_IR | DTE_FLAG_IW | DTE_FLAG_V | DTE_FLAG_TV; + + dte1 =3D dev_table[devid].data[1]; + dte1 &=3D ~DTE_DOMID_MASK; + dte1 |=3D pdom->id; + + dev_table[devid].data[1] =3D dte1; + dev_table[devid].data[0] =3D dte0; + + iommu_flush_dte(iommu, devid); + amd_iommu_completion_wait(iommu); +} + int __init amd_viommu_init(struct amd_iommu *iommu) { int ret; @@ -195,5 +224,7 @@ int __init amd_viommu_init(struct amd_iommu *iommu) if (ret) return ret; =20 + set_iommu_dte(iommu); + return 0; } --=20 2.34.1 From nobody Mon Jun 8 16:49:04 2026 Received: from CH1PR05CU001.outbound.protection.outlook.com (mail-northcentralusazon11010012.outbound.protection.outlook.com [52.101.193.12]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 52201318B85 for ; Thu, 28 May 2026 05:19:01 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=52.101.193.12 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1779945543; cv=fail; b=dPOIUNLKcjunDCl4HOSPTV6GWG9kPV50kOqiA4oUBfX6SYYks22hBCEYLVvdB/2mZ2NQGtND4N3tyHRyXNVyjC0YMCJhUKM7M15seO62CbExISABOyU/y2LZlW3AZUzZWh8EhhZv7FeBGwv1aREP7OCr1kbzBS+LUd4oqUpFTRw= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1779945543; c=relaxed/simple; bh=ACaTyPfSIdzZkIkGItc+WWfLgD2VIZfLfmxQ270/PjQ=; h=From:To:CC:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=X8ubgU544xprPEjDuRz1NU/Atf3W4CGnjDP2iUdNp2BREi53eHmzCHV0/GxHURxHFvY1pfyE143lif3fXirrLCnpYVq7JBE7IKEzvHAtsv2c48E5x4rGKeVH61AcjB82G7sUUh+zxLjCUU+SN4LNkMWtauz8BzFyct5PYy42meY= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=amd.com; spf=fail smtp.mailfrom=amd.com; dkim=pass (1024-bit key) header.d=amd.com header.i=@amd.com header.b=OgZZTeh8; arc=fail smtp.client-ip=52.101.193.12 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=amd.com Authentication-Results: smtp.subspace.kernel.org; spf=fail smtp.mailfrom=amd.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=amd.com header.i=@amd.com header.b="OgZZTeh8" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=trLTFehYvRRnu8PgAC903QS0UvPv/UMac1UdCbRCvYn7+vuRIA8ES9RikmXuR3HD1PyE8c5PjqqLo4Hxlfj803F6o+swqTQs/EByIsTBjUYNEGrD3DdtjD4G+UNuqzNIPmI/Kb5crhEj6TP0uW30KSx27fopcQClS6+XpYOaDX1FiDfR3hWXqwL9fvdb2Cnw6KwD20qXH/vEo/hcNnqAzJ5vzYg1yllLysLrZ6gJHQQwLXykvW9PYtAb/zHrvP3COaH5btwZQ3AyRS146zGgZ5/BTnaq/sLYdfyh94u4LU2UlHgzNyc9E70Jdkd1kx/hEHqgFPWtVzYr8hvnCLQzAg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector10001; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=Wv+PHbubPbFtyfR0yekV5N60fuFmsJ/EnEFDdFOs1eo=; b=G/+3fWhUlsLZ4luTA9pVMu7vMFEq9UOhNg4o4v7FUIgVIvmSTtKk0Gpxy6XbYDmLeIu+Lfi7IzYR0SH5jf0vu51j2IF1ycvUxWuEA4qLrsZQCjHL1DN/l00XqcZ7DTFZeVWY4A/SjY2DrCTif/zktoQnhfbMgOXwnlH8rRpe19W6U4XL+2x4AeYg8wj4tfEw8DC6W6P2DjX9Wu4x/dTQAlRsiigoEmKCP7dhQmFahbyxPo+N0lbBjVW4TP80wJm5phk9mTWT9kYsEcoRTCdfU0W1k3bJEnPHPE5ivKQFpSIqkN4szCUbw95qMuUK7gKx0HhsZvyamcnEm18NvpoDig== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass (sender ip is 165.204.84.17) smtp.rcpttodomain=vger.kernel.org smtp.mailfrom=amd.com; dmarc=pass (p=quarantine sp=quarantine pct=100) action=none header.from=amd.com; dkim=none (message not signed); arc=none (0) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=amd.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=Wv+PHbubPbFtyfR0yekV5N60fuFmsJ/EnEFDdFOs1eo=; b=OgZZTeh8h7Ajzin1C6GKPD+PDILtloRCdfMSjXDJu7EuGHdBh40sxeWMbrAl3v8GVqmJ5Q7/n0ZrxUpMB1TmOQK8p92rH4aV6rlJU3izcZ8Yya4e94WiwPTNvk2ETBcwJwnJm3Y9X2aIcV9Dam8ZClVZLLUJO9hf3WeczYCKIn4= Received: from PH0P220CA0004.NAMP220.PROD.OUTLOOK.COM (2603:10b6:510:d3::22) by BY5PR12MB4228.namprd12.prod.outlook.com (2603:10b6:a03:20b::22) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.21.48.19; Thu, 28 May 2026 05:18:56 +0000 Received: from SN1PEPF00036F42.namprd05.prod.outlook.com (2603:10b6:510:d3:cafe::1b) by PH0P220CA0004.outlook.office365.com (2603:10b6:510:d3::22) with Microsoft SMTP Server (version=TLS1_3, cipher=TLS_AES_256_GCM_SHA384) id 15.21.71.12 via Frontend Transport; Thu, 28 May 2026 05:18:56 +0000 X-MS-Exchange-Authentication-Results: spf=pass (sender IP is 165.204.84.17) smtp.mailfrom=amd.com; dkim=none (message not signed) header.d=none;dmarc=pass action=none header.from=amd.com; Received-SPF: Pass (protection.outlook.com: domain of amd.com designates 165.204.84.17 as permitted sender) receiver=protection.outlook.com; client-ip=165.204.84.17; helo=satlexmb07.amd.com; pr=C Received: from satlexmb07.amd.com (165.204.84.17) by SN1PEPF00036F42.mail.protection.outlook.com (10.167.248.26) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.21.71.7 via Frontend Transport; Thu, 28 May 2026 05:18:56 +0000 Received: from purico-ed03host.amd.com (10.180.168.240) by satlexmb07.amd.com (10.181.42.216) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.2562.41; Thu, 28 May 2026 00:18:51 -0500 From: Suravee Suthikulpanit To: , , , CC: , , , , , , , , , , , , , Suravee Suthikulpanit Subject: [PATCH v2 11/26] iommu/amd: Allocate and map vIOMMU private regions Date: Thu, 28 May 2026 05:17:23 +0000 Message-ID: <20260528051738.596013-12-suravee.suthikulpanit@amd.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20260528051738.596013-1-suravee.suthikulpanit@amd.com> References: <20260528051738.596013-1-suravee.suthikulpanit@amd.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: satlexmb08.amd.com (10.181.42.217) To satlexmb07.amd.com (10.181.42.216) X-EOPAttributedMessage: 0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: SN1PEPF00036F42:EE_|BY5PR12MB4228:EE_ X-MS-Office365-Filtering-Correlation-Id: 86e0b27c-6a48-4e97-809a-08debc789db0 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|82310400026|1800799024|376014|7416014|36860700016|6133799003|11063799006|22082099003|18002099003|56012099006; X-Microsoft-Antispam-Message-Info: XtuRKcfhJdEeQUE24iVzQwXsOZoxHXaw5drqDUXq7OuOI14t3Dl775uoTZHYIVmaT/boBS6UdpeDAtr5/7pqvSpBJ2LxFfdDaMWdKmbdBXa/9EWjKwQiIRRe/NJvj8RSW7vaOt9ztpKB+qAGZRh0K8pd95SaqoP7rn03wUZ/Ss+fTJ5oVGKO2TZq/ri3/feJWUI3k0r5PXGThZThG+LXILPaIjPKk20xuBvxtxMKKvO1edGPnh2vKCOrVteKD65e7PUkd0C7FVxWmBzpMPMLfI2jaXmS4a3OqNnGzCwZ8CJy9CXhX/MyquTnRyuxd39wMAziBcund6Yu/DbeFcecD091xefvb8towWma5uw0CbUY8KE3UyrbGwr9A2eWjwZuC4VZqBVehiANt0C1Jn2duk7j1Ptnvk8jkc9li8LS3SNPDzocO1KNW0DGS4UU+wDhvFpi7l74dBClhMN8kZf+bO0Uvxq29+eCW9xfOjP2UzghXfPACFEQOySFRP/xM0c5tmn4Fbxbr8zOopb3kpQNKZ+FRPh52oMYzgZLT4sk0mvslktgiVUyLBUSBEyGvdaQlU67KrzfKntJn0LPNly15IDuZR4zz6UV20f4xXI6IWUmi8cZQlWM8im6YOMik8xPj4wD+sDQxt7BlF9Of/Mja7Nag4sOEvwYggcNG+ctPigjOGspwM/NOMjWqwWZpfP4tInYePG1EFt5L/dreA5MfULYKb8dec8Q2RDDUQONJjY= X-Forefront-Antispam-Report: CIP:165.204.84.17;CTRY:US;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:satlexmb07.amd.com;PTR:InfoDomainNonexistent;CAT:NONE;SFS:(13230040)(82310400026)(1800799024)(376014)(7416014)(36860700016)(6133799003)(11063799006)(22082099003)(18002099003)(56012099006);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: YEMSBndj5xpD/FNSSaIa2HkVGcb/P5IbJxj4/0sVZSdSKGuy4aEGxvQ9koi/FfvGxoCmBimOO+vZkkaseQDOETYBgATwWQ9rvQ1/+LJ7X2/obHNlXLfyO5p3gLdGeSDTaN8xHV4B6JiO6VwBWLgu8F4XdtK42hmWTtW5eM5vEnc42uCKRgP0PCIis25zJP2HpwX9J7vHORgtfjzB+SXT+opKvIWIn9OqamKQSnjddZw3f664m7A7nQaY5qFk7S2FmelKJC9+jY2ZFjlJILM2NifvVeHLLwbej1INgs1X31RJr2l23UkucvrSvXwt7FtN3sWHTznWVFje2Jyb387724d0zuIq99+VyiF/PadITe0H9tyEsUebTowGWQDNanSsymzoDgaAbuYigH7NZkVNB3qZanxnr8HFMdShmoyBTsBdHJhwmUkbMHvonEwj4FAq X-OriginatorOrg: amd.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 28 May 2026 05:18:56.0220 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: 86e0b27c-6a48-4e97-809a-08debc789db0 X-MS-Exchange-CrossTenant-Id: 3dd8961f-e488-4e60-8e11-a82d994e183d X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp: TenantId=3dd8961f-e488-4e60-8e11-a82d994e183d;Ip=[165.204.84.17];Helo=[satlexmb07.amd.com] X-MS-Exchange-CrossTenant-AuthSource: SN1PEPF00036F42.namprd05.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Anonymous X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: BY5PR12MB4228 Content-Type: text/plain; charset="utf-8" The AMD IOMMU Private Address (IPA) region is allocated and mapped during IOMMU driver initialization. According to the specification, 8MB is needed. Since the hardware does not require the IPA region to be physically contiguous, split the IPA region into 4 2MB subregions to match hugepage granularity and create mapping in the v1 page-table for each IOMMU. Signed-off-by: Suravee Suthikulpanit --- drivers/iommu/amd/amd_iommu.h | 3 ++ drivers/iommu/amd/amd_iommu_types.h | 8 +++ drivers/iommu/amd/iommu.c | 16 ++++++ drivers/iommu/amd/viommu.c | 79 +++++++++++++++++++++++++++-- 4 files changed, 101 insertions(+), 5 deletions(-) diff --git a/drivers/iommu/amd/amd_iommu.h b/drivers/iommu/amd/amd_iommu.h index 1aa79a26a127..279f458becda 100644 --- a/drivers/iommu/amd/amd_iommu.h +++ b/drivers/iommu/amd/amd_iommu.h @@ -105,6 +105,9 @@ void amd_iommu_domain_flush_pages(struct protection_dom= ain *domain, void amd_iommu_dev_flush_pasid_pages(struct iommu_dev_data *dev_data, ioasid_t pasid, u64 address, size_t size); =20 +int amd_iommu_flush_private_vm_region(struct amd_iommu *iommu, struct prot= ection_domain *pdom, + u64 address, size_t size); + #ifdef CONFIG_IRQ_REMAP int amd_iommu_create_irq_domain(struct amd_iommu *iommu); #else diff --git a/drivers/iommu/amd/amd_iommu_types.h b/drivers/iommu/amd/amd_io= mmu_types.h index 02d359f09148..a5e2f32590d1 100644 --- a/drivers/iommu/amd/amd_iommu_types.h +++ b/drivers/iommu/amd/amd_iommu_types.h @@ -424,6 +424,13 @@ /* For vIOMMU, the GID is 16-bit. */ #define VIOMMU_MAX_GID 0xFFFF =20 +/* + * Total IOMMU private region is 8MB (4 x 2MB-subregion) + */ +#define VIOMMU_PRIV_REGION_BASE (0) +#define VIOMMU_PRIV_SUBREGION_CNT (4) +#define VIOMMU_PRIV_SUBREGION_SIZE (0x200000) /* 2MB */ + /* Timeout stuff */ #define LOOP_TIMEOUT 100000 #define MMIO_STATUS_TIMEOUT 2000000 @@ -817,6 +824,7 @@ struct amd_iommu { =20 /* HW vIOMMU support */ struct protection_domain *viommu_pdom; + void *viommu_priv_region[VIOMMU_PRIV_SUBREGION_CNT]; }; =20 static inline struct amd_iommu *dev_to_amd_iommu(struct device *dev) diff --git a/drivers/iommu/amd/iommu.c b/drivers/iommu/amd/iommu.c index d89664eba898..8b441f68bc47 100644 --- a/drivers/iommu/amd/iommu.c +++ b/drivers/iommu/amd/iommu.c @@ -1808,6 +1808,22 @@ static int domain_flush_pages_v1(struct protection_d= omain *pdom, return ret; } =20 +int amd_iommu_flush_private_vm_region(struct amd_iommu *iommu, struct prot= ection_domain *pdom, + u64 address, size_t size) +{ + int ret; + struct iommu_cmd cmd; + + build_inv_iommu_pages(&cmd, address, size, pdom->id, 0, false); + + ret =3D iommu_queue_command(iommu, &cmd); + if (ret) + return ret; + + amd_iommu_completion_wait(iommu); + return ret; +} + /* * TLB invalidation function which is called from the mapping functions. * It flushes range of PTEs of the domain. diff --git a/drivers/iommu/amd/viommu.c b/drivers/iommu/amd/viommu.c index 14426649074f..90ed2eb92aeb 100644 --- a/drivers/iommu/amd/viommu.c +++ b/drivers/iommu/amd/viommu.c @@ -131,8 +131,66 @@ static int __init viommu_vf_vfcntl_init(struct amd_iom= mu *iommu) return -ENOMEM; } =20 +static void *alloc_private_subregion(struct amd_iommu *iommu, u64 base, si= ze_t size) +{ + int ret; + void *region; + int nid =3D iommu && iommu->dev ? dev_to_node(&iommu->dev->dev) : NUMA_NO= _NODE; + + region =3D (void *)iommu_alloc_pages_node_sz(nid, GFP_KERNEL | __GFP_ZERO= , size); + if (!region) + return NULL; + + ret =3D set_memory_uc((unsigned long)region, size >> PAGE_SHIFT); + if (ret) + goto err_out; + + ret =3D iommu_map(&iommu->viommu_pdom->domain, base, + iommu_virt_to_phys(region), size, + IOMMU_PROT_IR | IOMMU_PROT_IW, GFP_KERNEL); + + if (ret) + goto cleanup_mem_attr; + + pr_debug("%s: base=3D%#llx, size=3D%#lx, subregion=3D%#llx(%#llx)\n", + __func__, base, size, (unsigned long long)region, iommu_virt_to_phys(re= gion)); + + amd_iommu_flush_private_vm_region(iommu, iommu->viommu_pdom, base, size); + + return region; +cleanup_mem_attr: + set_memory_wb((unsigned long)region, size >> PAGE_SHIFT); +err_out: + iommu_free_pages(region); + return NULL; +} + +static void viommu_private_space_uninit(struct amd_iommu *iommu) +{ + int i; + struct iommu_domain *dom; + + if (!iommu->viommu_pdom) + return; + + for (i =3D 0; i < VIOMMU_PRIV_SUBREGION_CNT; i++) { + if (!iommu->viommu_priv_region[i]) + continue; + set_memory_wb((unsigned long)iommu->viommu_priv_region[i], + VIOMMU_PRIV_SUBREGION_SIZE >> PAGE_SHIFT); + iommu_free_pages(iommu->viommu_priv_region[i]); + iommu->viommu_priv_region[i] =3D NULL; + } + + dom =3D &iommu->viommu_pdom->domain; + amd_iommu_domain_free(dom); + iommu->viommu_pdom =3D NULL; +} + static int viommu_private_space_init(struct amd_iommu *iommu) { + int i; + u64 base; struct iommu_domain *dom; struct protection_domain *pdom; struct pt_iommu_amdv1_hw_info pt_info; @@ -144,22 +202,33 @@ static int viommu_private_space_init(struct amd_iommu= *iommu) dom =3D amd_iommu_domain_alloc_paging_v1(&iommu->dev->dev, 0); if (!dom) { pr_err("%s: Failed to initialize private space\n", __func__); - goto err_out; + return -ENOMEM; } =20 pdom =3D to_pdomain(dom); iommu->viommu_pdom =3D pdom; =20 + /* + * Each private region requires to 8MB of memory to be allocated + * and mapped. Split the region into 4 x 2MB-subregion. + */ + for (i =3D 0; i < VIOMMU_PRIV_SUBREGION_CNT; i++) { + base =3D VIOMMU_PRIV_REGION_BASE + (i * VIOMMU_PRIV_SUBREGION_SIZE); + iommu->viommu_priv_region[i] =3D alloc_private_subregion(iommu, base, + VIOMMU_PRIV_SUBREGION_SIZE); + if (!iommu->viommu_priv_region[i]) { + pr_err("%s: Failed to allocate vIOMMU private subregion %d\n", __func__= , i); + viommu_private_space_uninit(iommu); + return -ENOMEM; + } + } + pt_iommu_amdv1_hw_info(&pdom->amdv1, &pt_info); pr_debug("%s: devid=3D%#x, pte_root=3D%#llx\n", __func__, iommu->devid, (unsigned long long)pt_info.host_pt_root); =20 return 0; -err_out: - if (dom) - amd_iommu_domain_free(dom); - return -ENOMEM; } =20 /* --=20 2.34.1 From nobody Mon Jun 8 16:49:04 2026 Received: from SJ2PR03CU001.outbound.protection.outlook.com (mail-westusazon11012008.outbound.protection.outlook.com [52.101.43.8]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 2AEA6319859 for ; Thu, 28 May 2026 05:19:06 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=52.101.43.8 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1779945548; cv=fail; b=H0F2qr+MKfCf6oVibzb/VzWm1cznHs5iSwIDYTENgSuV8U4yPHEI2jd6bMC9XQZkVyPXlxEztjOk+K+FVCfRz1qyHuZuG7GCmx98VAuLuklHk1AgOfO1ji1boB4fC4nZwsFVQkSZ8NtYdZlC/0kjqdKygGZ3gljUcN+Ir7ovRI8= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1779945548; c=relaxed/simple; bh=WDvAmfDnJxVobOAnNbX+1xWUmqI/DmbyTr3NKvFzAbU=; h=From:To:CC:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=tVJvmVclCHtWKfO+xVc7qu9j6jZqekG17/hLTLztp/iKpOoB0Vc0d/Q7gml6F8pp33eycwO8531EV66dOTXeMwkUGNtMlKDgPzzDBOU50gHe4Wk1LUlcMNzdXMnF5+qNI50IQCSh3SWMAYMiF0ZeHLSlfL0n+q8dCgKAmq/HW68= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=amd.com; spf=fail smtp.mailfrom=amd.com; dkim=pass (1024-bit key) header.d=amd.com header.i=@amd.com header.b=QZ9sssmK; arc=fail smtp.client-ip=52.101.43.8 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=amd.com Authentication-Results: smtp.subspace.kernel.org; spf=fail smtp.mailfrom=amd.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=amd.com header.i=@amd.com header.b="QZ9sssmK" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=SqP9bo+SwXpY8bc6/pGt1XbXaGfKi7cqrx1ZkjwI171OT6jPJo5jNHr3+6GcVggek26EK0yt3hIHWWsXZvGPbydJhgml70V7b7xcXFpmhxgwbGuKHRC6ucIiOxFicitKCmDtwdo62+ml4EKCL9O3cPPDt1BenCRJmf3OPLOg5eQe22U2Q2onIh8ymPrlyvcszLB9Ix+f/DF8WA7RS/CItw45F6lpwfWhaa2PJWvAVDXzE6GaJxvph/WRIwGuBZPff5Xe+PWehky+jmCqct9nmd2Ef/jnzCVUuajhd42r+kD8HmaXMuUf3MWvJHP995yG1CWY3VJ/6z6WRasa65T6dw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector10001; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=B8yo0JtAdv8/uFI/iVLG0iSq3jQ3GB4celNpGqod1Xc=; b=JWtXqo55A5P7PpKmkJ8djx6D0LzjFWZ+j+4/ZHfURBbwxbnklXcFX1LatNbwqsi/QwA3iG86oOQlTBtXJGxuBOZ0hqjXgporSZ2q2+f2ckXPPPXofl/EHd3KnFPIe5RO37fmzyaeSx5MH7MsKFdZ/bPnUxUsFOl7pNfEawUTUsy1vEjo/uU+wMEUMkaC79M0yWV0IVQVa3ZBfM9ksNc/vdonDrMEdpo6jVIDeXKMaIpXzwfh86hrPtNpKNH3DPb0k03Jubc9qNb+0rE+HGjdELSpNf7+D8LrNR8Ex6B9c7zVR/pu9fsDFwc2H+gLA9MYgzG5QcYisyz6V0bPP4Tj2g== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass (sender ip is 165.204.84.17) smtp.rcpttodomain=vger.kernel.org smtp.mailfrom=amd.com; dmarc=pass (p=quarantine sp=quarantine pct=100) action=none header.from=amd.com; dkim=none (message not signed); arc=none (0) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=amd.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=B8yo0JtAdv8/uFI/iVLG0iSq3jQ3GB4celNpGqod1Xc=; b=QZ9sssmKQ2TMjPzwV1c/IZl0k5MV/XFF8VUC0koEhfvUBcrLxAI8BpOXhoNgxaJ/HAFCk+GEzyrWWyRMFadJV4QfdMjTK83OU+YyL+aNKNHJM8s0dkx4glk+pc6uiow1IImaU9w+WSUhdIaJ/mGNz9f39A2tM+RH4cEmn5fnci4= Received: from SN1PR12CA0102.namprd12.prod.outlook.com (2603:10b6:802:21::37) by CH3PR12MB9195.namprd12.prod.outlook.com (2603:10b6:610:1a3::6) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.21.71.12; Thu, 28 May 2026 05:19:01 +0000 Received: from SN1PEPF00036F40.namprd05.prod.outlook.com (2603:10b6:802:21:cafe::1a) by SN1PR12CA0102.outlook.office365.com (2603:10b6:802:21::37) with Microsoft SMTP Server (version=TLS1_3, cipher=TLS_AES_256_GCM_SHA384) id 15.21.71.13 via Frontend Transport; Thu, 28 May 2026 05:19:01 +0000 X-MS-Exchange-Authentication-Results: spf=pass (sender IP is 165.204.84.17) smtp.mailfrom=amd.com; dkim=none (message not signed) header.d=none;dmarc=pass action=none header.from=amd.com; Received-SPF: Pass (protection.outlook.com: domain of amd.com designates 165.204.84.17 as permitted sender) receiver=protection.outlook.com; client-ip=165.204.84.17; helo=satlexmb07.amd.com; pr=C Received: from satlexmb07.amd.com (165.204.84.17) by SN1PEPF00036F40.mail.protection.outlook.com (10.167.248.24) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.21.71.7 via Frontend Transport; Thu, 28 May 2026 05:19:01 +0000 Received: from purico-ed03host.amd.com (10.180.168.240) by satlexmb07.amd.com (10.181.42.216) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.2562.41; Thu, 28 May 2026 00:18:55 -0500 From: Suravee Suthikulpanit To: , , , CC: , , , , , , , , , , , , , Suravee Suthikulpanit Subject: [PATCH v2 12/26] iommu/amd: Add per-VM private IPA alloc/map helpers Date: Thu, 28 May 2026 05:17:24 +0000 Message-ID: <20260528051738.596013-13-suravee.suthikulpanit@amd.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20260528051738.596013-1-suravee.suthikulpanit@amd.com> References: <20260528051738.596013-1-suravee.suthikulpanit@amd.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: satlexmb08.amd.com (10.181.42.217) To satlexmb07.amd.com (10.181.42.216) X-EOPAttributedMessage: 0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: SN1PEPF00036F40:EE_|CH3PR12MB9195:EE_ X-MS-Office365-Filtering-Correlation-Id: 4d1df9bf-4df4-4447-60bb-08debc78a0d1 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|36860700016|7416014|1800799024|376014|82310400026|18002099003|22082099003|56012099006|11063799006; X-Microsoft-Antispam-Message-Info: 8MAgQ+239AiqoP8BgmT5fsNuTTn/9Mh8yDFPuaiLjh9CJ1KBIgHVwXPAThsGBGNxelVFaGVxt0bKEoqjaaGzI6puAVIFye6NsDfl76mJ2+IYgZWUJ6tT2FOAllFJwskI7AAWnOWholwiidqkCGcjZRBTSAYOwgQgQ7biL6DqZxt9Y8jquCcT2cs5eyaBX0QBlp738dUrkH4fI5dq7WEquxEl1iyBl6Rb/h+aU0EKeE9EVJIK28WCt4qv4Gp1M1+l1jggK6vnOA9S9oQXy134HIwoOeE39iDAGc+2CgtoOLp5eFB0Pu7V00nYMInO9p+jalag5Jxy9CLqUdlrUu0KYBCMVuTDr/SyA3sJ+zrMkQUuV4YeylKWXg9JjLDNJV1zK2JEGlLCpWkfMimamFrLZb4rh7opnfXfNjbULexdjzY78bLQYSVcz/GvTPcFDXVMqNvsp8WKmc3b6/A2GLqgeIn8p87EYu709CLkjrRwyLeEzNlG0c3DpeioIorS73fFgK5bVf+GUIr7MtxTohZ8VPq+WiJito40u097DhZ/T3ZihzaM1dXsxDvNxCiAmv0+jvWCVDkkLASH2CYZw/+TAEnfrgvwbkpZd2q7kyka6BHobOyCtsQr+EHWWywTRkFw/My+Zk2s8HTIAmcleP840vkuY3Vbws4x8JD7CWMOvGAvGNCBvEqB3nmzWAimfISAvHBmw+dg8Sly8YzXRSOZTDSIUHxi2c4t/7oz7HYU0es= X-Forefront-Antispam-Report: CIP:165.204.84.17;CTRY:US;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:satlexmb07.amd.com;PTR:InfoDomainNonexistent;CAT:NONE;SFS:(13230040)(36860700016)(7416014)(1800799024)(376014)(82310400026)(18002099003)(22082099003)(56012099006)(11063799006);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: oQywkFmqoUj4xql6boH36DjnBmJd3NTnWJYMsmKt1GoBZaDMY6SOaOhUOhaZF6rDIvbNDu2HTp06Lh8IMMPYnDZo/4DRZ4z1fClqovKe4LBydKJz6Yd8muw244kc+w4NotM4vfVsV29f+v+WO9dpFE1RkQPFMnqLOvcNAxgLAEz4sUZlkcHMih8x/N/a9GA+IzMtO4dO71QtHXWyGRJtdk/4Ve4JGkW9j9KHLvplmt/jguYeh1t8tyA0ujjmfN0pDlkf+YlwTRno08mNdn/pdeGaTk0gnf7oSSqEyU5KZH92XqczpEqGUVeb+6bhcBfl24Nr2ckY484rQS0kokIcPQiTCkA4TlveTFx5gdvJvFa05J//QPH4vuWc46sYisXt9giVX8Jh02oh8OVNXDqSHk8HX5C7VSME8frrh+X/J0Gt8WqGQFzIsxKnueANKG0R X-OriginatorOrg: amd.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 28 May 2026 05:19:01.2746 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: 4d1df9bf-4df4-4447-60bb-08debc78a0d1 X-MS-Exchange-CrossTenant-Id: 3dd8961f-e488-4e60-8e11-a82d994e183d X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp: TenantId=3dd8961f-e488-4e60-8e11-a82d994e183d;Ip=[165.204.84.17];Helo=[satlexmb07.amd.com] X-MS-Exchange-CrossTenant-AuthSource: SN1PEPF00036F40.namprd05.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Anonymous X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: CH3PR12MB9195 Content-Type: text/plain; charset="utf-8" Guest device ID and guest domain ID tables use dedicated slots in the vIOMMU private address (IPA) region, indexed by guest ID (GID). Add alloc_private_vm_region() and free_private_vm_region() to allocate backing pages, map them through viommu_pdom, flush the private VM mapping, and tear down on VM destroy. Export amd_iommu_iotlb_sync() and use it for nested domain iotlb_sync so nested attach paths can flush gathered IOTLB state. Signed-off-by: Suravee Suthikulpanit --- drivers/iommu/amd/amd_iommu.h | 2 ++ drivers/iommu/amd/iommu.c | 4 +-- drivers/iommu/amd/nested.c | 1 + drivers/iommu/amd/viommu.c | 59 +++++++++++++++++++++++++++++++++++ 4 files changed, 64 insertions(+), 2 deletions(-) diff --git a/drivers/iommu/amd/amd_iommu.h b/drivers/iommu/amd/amd_iommu.h index 7c725e032d20..304cb9093249 100644 --- drivers/iommu/amd/amd_iommu.h | 2 ++ drivers/iommu/amd/iommu.c | 4 +-- drivers/iommu/amd/nested.c | 1 + drivers/iommu/amd/viommu.c | 55 +++++++++++++++++++++++++++++++++++ 4 files changed, 60 insertions(+), 2 deletions(-) diff --git a/drivers/iommu/amd/amd_iommu.h b/drivers/iommu/amd/amd_iommu.h index 279f458becda..1d8727c16840 100644 --- a/drivers/iommu/amd/amd_iommu.h +++ b/drivers/iommu/amd/amd_iommu.h @@ -105,6 +105,8 @@ void amd_iommu_domain_flush_pages(struct protection_dom= ain *domain, void amd_iommu_dev_flush_pasid_pages(struct iommu_dev_data *dev_data, ioasid_t pasid, u64 address, size_t size); =20 +void amd_iommu_iotlb_sync(struct iommu_domain *domain, + struct iommu_iotlb_gather *gather); int amd_iommu_flush_private_vm_region(struct amd_iommu *iommu, struct prot= ection_domain *pdom, u64 address, size_t size); =20 diff --git a/drivers/iommu/amd/iommu.c b/drivers/iommu/amd/iommu.c index 8b441f68bc47..e0433e65cfa5 100644 --- a/drivers/iommu/amd/iommu.c +++ b/drivers/iommu/amd/iommu.c @@ -2729,8 +2729,8 @@ static void amd_iommu_flush_iotlb_all(struct iommu_do= main *domain) spin_unlock_irqrestore(&dom->lock, flags); } =20 -static void amd_iommu_iotlb_sync(struct iommu_domain *domain, - struct iommu_iotlb_gather *gather) +void amd_iommu_iotlb_sync(struct iommu_domain *domain, + struct iommu_iotlb_gather *gather) { struct protection_domain *dom =3D to_pdomain(domain); unsigned long flags; diff --git a/drivers/iommu/amd/nested.c b/drivers/iommu/amd/nested.c index 5b902598e68a..15dc57cf7c5f 100644 --- a/drivers/iommu/amd/nested.c +++ b/drivers/iommu/amd/nested.c @@ -291,4 +291,5 @@ static void nested_domain_free(struct iommu_domain *dom) static const struct iommu_domain_ops nested_domain_ops =3D { .attach_dev =3D nested_attach_device, .free =3D nested_domain_free, + .iotlb_sync =3D amd_iommu_iotlb_sync, }; diff --git a/drivers/iommu/amd/viommu.c b/drivers/iommu/amd/viommu.c index 90ed2eb92aeb..6dcb02b12a28 100644 --- a/drivers/iommu/amd/viommu.c +++ b/drivers/iommu/amd/viommu.c @@ -297,3 +297,58 @@ int __init amd_viommu_init(struct amd_iommu *iommu) =20 return 0; } + +static int __maybe_unused alloc_private_vm_region(struct amd_iommu *iommu,= u64 **entry, + u64 base, size_t size, u16 gid) +{ + int ret; + u64 addr =3D base + (gid * size); + int nid =3D iommu && iommu->dev ? dev_to_node(&iommu->dev->dev) : NUMA_NO= _NODE; + + *entry =3D (void *)iommu_alloc_pages_node_sz(nid, GFP_KERNEL | __GFP_ZERO= , size); + if (!*entry) + return -ENOMEM; + + ret =3D set_memory_uc((unsigned long)*entry, size >> PAGE_SHIFT); + if (ret) + goto err_out; + + pr_debug("%s: entry=3D%#llx(%#llx), addr=3D%#llx, size=3D%#lx\n", __func_= _, + (unsigned long long)*entry, iommu_virt_to_phys(*entry), addr, size); + + ret =3D iommu_map(&iommu->viommu_pdom->domain, addr, + iommu_virt_to_phys(*entry), size, + IOMMU_PROT_IR | IOMMU_PROT_IW, GFP_KERNEL); + if (ret) + goto cleanup_mem_attr; + + return amd_iommu_flush_private_vm_region(iommu, iommu->viommu_pdom, addr,= size); +cleanup_mem_attr: + set_memory_wb((unsigned long)*entry, size >> PAGE_SHIFT); +err_out: + iommu_free_pages(*entry); + *entry =3D NULL; + return ret; +} + +static void __maybe_unused free_private_vm_region(struct amd_iommu *iommu,= u64 **entry, + u64 base, size_t size, u16 gid) +{ + size_t unmapped; + u64 addr =3D base + (gid * size); + + pr_debug("%s: entry=3D%#llx(%#llx), base=3D%#llx, addr=3D%#llx, size=3D%#= lx\n", + __func__, (unsigned long long)*entry, + iommu_virt_to_phys(*entry), base, addr, size); + + if (!iommu || !iommu->viommu_pdom) + return; + + unmapped =3D iommu_unmap(&iommu->viommu_pdom->domain, addr, size); + if (unmapped !=3D size) + pr_warn("%s: unmapped %#zx of %#lx at %#llx\n", __func__, unmapped, size= , addr); + + set_memory_wb((unsigned long)*entry, size >> PAGE_SHIFT); + iommu_free_pages(*entry); + *entry =3D NULL; +} --=20 2.34.1 From nobody Mon Jun 8 16:49:04 2026 Received: from SA9PR02CU001.outbound.protection.outlook.com (mail-southcentralusazon11013036.outbound.protection.outlook.com [40.93.196.36]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 269EB3191D3 for ; Thu, 28 May 2026 05:19:11 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=40.93.196.36 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1779945553; cv=fail; b=SXRse6WE6vodzDUhz5cySpqqKlcsVqbjK3zPQ2L6WEdAblBDzf+icih4RfjSAzNCbXQeOFtkmm0OHxln9P7fLawcqwXQ7cTaKFbkM+itygr+JeIkbNmU0u07nNxGTMxJyoMuqOAAMKuff2MNJ76gAZL1nUn0R0ZIp6p+qj00S2U= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1779945553; c=relaxed/simple; bh=J+dWIfq8QTs6GZtxGObsHkSwPI4Hh9pKTSV20QXyzpg=; h=From:To:CC:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=RmoZ14ZJ0dnXDAQA4BiR+qKRwU4z9g+cS+wPSY3VxmKWNHFvym6csz1xBCdFTpgQLJHK8MdC3uilpGaPU/j/AAKykQztn/ieD5nN2Vgd/SQm7TP7kUPoL2xiG3f5Kt7W512znkgCACtQTWenKZfBZNX+KGLIod6QSQdgq6VHqeE= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=amd.com; spf=fail smtp.mailfrom=amd.com; dkim=pass (1024-bit key) header.d=amd.com header.i=@amd.com header.b=PEdRgzdm; arc=fail smtp.client-ip=40.93.196.36 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=amd.com Authentication-Results: smtp.subspace.kernel.org; spf=fail smtp.mailfrom=amd.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=amd.com header.i=@amd.com header.b="PEdRgzdm" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=RhZgMu/oM5l6RPaEzRjxDLFSi6DKy4zlcx4IcSrN9csdwH0tJzAZmECHJfWDN90wkuH9NHdk/u0DUsbmmzjRDCxp5NTbpweoEQYK0QKB56Cr+Gg4S2wmdf0CnxY1dhHDcZwXeny1QL/fmpXzGdFGFsDBwJcncm45CwfQpQomQ5ZEs5QLCHncqbbHrMnmChBUVFA/S5eu0Jp1F/TEcNl0Ts4et8dt0V+EPWTkVkoNRXVcFDXRWRUYHZEIVwWAWx4q86QNaNR7e3el5bPxQQB6NdasNDoZa65PZb+O7ovCtCz80BZmC8dwV7EsoPR30Riplr2xSYTztE6p/DDN2KVMLQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector10001; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=jkM/DZc2XfiYQGkhif8sZd1yvVdeP2kGTqvPi+Gbnkg=; b=EE4LWxjN/6efQqKvScdymR1cnlEKPBjBK+7PPPedjipwAPRbuTuaQQD4PL1LdD560DngffdGfFOKgE4+8vymuxJ21HmvRomBI43qHYYbh8yVmu2KZK15tz03dZ+AQ5fSmG+A6w9A3fd4/iYAuZADFsRa4zZSWD0WhMDC7OL4Lz5cm4UMBaez5QtYWYxn3ZVqo9CGx6v0MOsjrPeqxjwMklP9DDvHsKsfmp5qcNliBWwI8ZHKOobNknvccohy0u0rsTMiy62yWrytenkyCIfEDHQIHrqrT8725LI6eRo1dQXz37wTZgAhGSUfRvorl6SGDjRrPanowAyw1QbbDxoRFw== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass (sender ip is 165.204.84.17) smtp.rcpttodomain=vger.kernel.org smtp.mailfrom=amd.com; dmarc=pass (p=quarantine sp=quarantine pct=100) action=none header.from=amd.com; dkim=none (message not signed); arc=none (0) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=amd.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=jkM/DZc2XfiYQGkhif8sZd1yvVdeP2kGTqvPi+Gbnkg=; b=PEdRgzdmoDnkt7TigPF1YSSQgZdBQJGvi566AK5The9yi9sA/mXO4aiYhCn8pk0i0C9IGzyaaREewLQcy3YEAND8QgQudiFmh7/SZ6K5Ant+Rumft1HIw/xqe5SPer5GbId9H4BaSBH8R4U3HLM0DHujqhaVipnK9W5YcyozLgE= Received: from SN6PR2101CA0026.namprd21.prod.outlook.com (2603:10b6:805:106::36) by LV2PR12MB5800.namprd12.prod.outlook.com (2603:10b6:408:178::12) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.21.71.13; Thu, 28 May 2026 05:19:05 +0000 Received: from SN1PEPF00036F3F.namprd05.prod.outlook.com (2603:10b6:805:106:cafe::5c) by SN6PR2101CA0026.outlook.office365.com (2603:10b6:805:106::36) with Microsoft SMTP Server (version=TLS1_3, cipher=TLS_AES_256_GCM_SHA384) id 15.21.92.4 via Frontend Transport; Thu, 28 May 2026 05:19:05 +0000 X-MS-Exchange-Authentication-Results: spf=pass (sender IP is 165.204.84.17) smtp.mailfrom=amd.com; dkim=none (message not signed) header.d=none;dmarc=pass action=none header.from=amd.com; Received-SPF: Pass (protection.outlook.com: domain of amd.com designates 165.204.84.17 as permitted sender) receiver=protection.outlook.com; client-ip=165.204.84.17; helo=satlexmb07.amd.com; pr=C Received: from satlexmb07.amd.com (165.204.84.17) by SN1PEPF00036F3F.mail.protection.outlook.com (10.167.248.23) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.21.71.7 via Frontend Transport; Thu, 28 May 2026 05:19:05 +0000 Received: from purico-ed03host.amd.com (10.180.168.240) by satlexmb07.amd.com (10.181.42.216) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.2562.41; Thu, 28 May 2026 00:19:00 -0500 From: Suravee Suthikulpanit To: , , , CC: , , , , , , , , , , , , , Suravee Suthikulpanit Subject: [PATCH v2 13/26] iommu/amd: Add helper functions to manage DevID / DomID mapping tables Date: Thu, 28 May 2026 05:17:25 +0000 Message-ID: <20260528051738.596013-14-suravee.suthikulpanit@amd.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20260528051738.596013-1-suravee.suthikulpanit@amd.com> References: <20260528051738.596013-1-suravee.suthikulpanit@amd.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: satlexmb08.amd.com (10.181.42.217) To satlexmb07.amd.com (10.181.42.216) X-EOPAttributedMessage: 0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: SN1PEPF00036F3F:EE_|LV2PR12MB5800:EE_ X-MS-Office365-Filtering-Correlation-Id: cbe49e7a-dbd0-4f2d-3535-08debc78a35d X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|7416014|376014|36860700016|82310400026|1800799024|56012099006|11063799006|6133799003|22082099003|18002099003; X-Microsoft-Antispam-Message-Info: qgceGBzUSsT71+QvlQhJvab1E+a2vO7gl7Fx2ilmUrPk+E2Zbpnavs/s6zOvDZ1JA3MLthZniwuJRKvO51Y0/WGD73q/B6klWJgjXcf79LChrPKLqmQJK34bWwShKmG3JUSffYWauw5269uPkXHNFXkkwbeTd2/+m1ZOp1wq3S+chj9Szd30vD2BwXjDqLKU5aInzxxBLw0jzFbQQ2Z7RnkeMkpDgB1YHsOnULWRCJEq33P7DNfEzYLVNLSgx5d2n4gyBXju45Vq87+a3Y1hL8Nr1uaG8D3onCus3bwv9vZgqbVwHkJ1jmc/oZq078O70uRxY2vPE3B1JevTXI9KizU2jlw06QfI4rX+CTLzCwwmG8rAtSIWcILplGVbfl6PA/cMoMGNn1V53gtjIhKToKLGIyUGRB2GkFGMIw7PyWj52r21epQCSNBXkvBcttNxloNP54wrwOyj6E12h7OgE+3gd1+MOR5GaXtOps5Mz6+Z1u4zwkO1YuvV2P67iURmnV8htKQvt8d75JtBQuyXCcvC4HvvAyf1+S01Xd3O5/rt9DbmHInF+NkE/DrxY9qs59mNU+R6hzOS39p93c0e0Fzo70HMVGueLtPHOHQJS3rguyCx8BaPoU3GyHJnNkoJJzeVUcF48ObxOc7+82e/U35JLpTW7KczPhjnbv1lRv98Ydyi67L3NArFm2eGzIpwPGG/XLtEqcFGWNSE04DkDgj5SF7AvbJ7ns1UMOcogto= X-Forefront-Antispam-Report: CIP:165.204.84.17;CTRY:US;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:satlexmb07.amd.com;PTR:InfoDomainNonexistent;CAT:NONE;SFS:(13230040)(7416014)(376014)(36860700016)(82310400026)(1800799024)(56012099006)(11063799006)(6133799003)(22082099003)(18002099003);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: rlON1anqhJUg+Q5MdpnEoVkfMxoPngagoHG48dkk2sVW0pfzefr0NhykKYjw+VKerRZ90Wh/IX8idnt5TnZnKiYxar2wb46dRYc78UeEdS1BR0ksjT9bNgOigTQbIwiP/bV1lCMdOCLpv1t9kW1kfpDLV5XkHNMN8JmyGHeBfB7hra98gQJfInjlnjuocV+hIrqu/MZTe0yY/AQ+9TehBdMz3q86AazTL6XjKZvcQvB6Xi00JOjDGtxg8lqxzkunb63oFZ2nhlJHI8ZeEcufSFRFCfaTX/xYAdkD6eIhAnVnXgLvRu1PmbAuxFTfS5tQ3fLhLs4B/Ndp66WT1atqy2upQQKJs/Jut9Y4X+lIN5rk7unQz9TLKe+NHtGx/VtoO6vHLQIxeOqV0QZgclp2g/Toq9HO0rwRZetupP2JEOh6ZNo1MxHNcnzFzO5c8kOE X-OriginatorOrg: amd.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 28 May 2026 05:19:05.5424 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: cbe49e7a-dbd0-4f2d-3535-08debc78a35d X-MS-Exchange-CrossTenant-Id: 3dd8961f-e488-4e60-8e11-a82d994e183d X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp: TenantId=3dd8961f-e488-4e60-8e11-a82d994e183d;Ip=[165.204.84.17];Helo=[satlexmb07.amd.com] X-MS-Exchange-CrossTenant-AuthSource: SN1PEPF00036F3F.namprd05.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Anonymous X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: LV2PR12MB5800 Content-Type: text/plain; charset="utf-8" Introduce amd_viommu_init_one() and amd_viommu_uninit_one(). These functions are called during IOMMUFD vIOMMU initialize and destroy. Currently, it manages the IPA mapping for Device ID and Domain ID mapping tables. Signed-off-by: Suravee Suthikulpanit --- drivers/iommu/amd/amd_iommu_types.h | 3 ++ drivers/iommu/amd/amd_viommu.h | 13 ++++++++ drivers/iommu/amd/iommu.c | 1 + drivers/iommu/amd/iommufd.c | 5 +++ drivers/iommu/amd/viommu.c | 52 +++++++++++++++++++++++++++++ 5 files changed, 74 insertions(+) diff --git a/drivers/iommu/amd/amd_iommu_types.h b/drivers/iommu/amd/amd_io= mmu_types.h index a5e2f32590d1..63410028bae3 100644 --- a/drivers/iommu/amd/amd_iommu_types.h +++ b/drivers/iommu/amd/amd_iommu_types.h @@ -549,6 +549,9 @@ struct amd_iommu_viommu { */ struct xarray gdomid_array; =20 + u64 *devid_table; + u64 *domid_table; + /* Offset for mmap() of guest VF MMIO; set after iommufd_viommu_alloc_mma= p(). */ unsigned long vfmmio_mmap_offset; }; diff --git a/drivers/iommu/amd/amd_viommu.h b/drivers/iommu/amd/amd_viommu.h index 447692b9101c..8b57717c22a6 100644 --- a/drivers/iommu/amd/amd_viommu.h +++ b/drivers/iommu/amd/amd_viommu.h @@ -14,6 +14,10 @@ void __init amd_viommu_uninit(struct amd_iommu *iommu); =20 u64 amd_viommu_get_vfmmio_addr(struct amd_iommu *iommu, u16 gid); =20 +int amd_viommu_init_one(struct amd_iommu *iommu, struct amd_iommu_viommu *= viommu); + +void amd_viommu_uninit_one(struct amd_iommu *iommu, struct amd_iommu_viomm= u *viommu); + #else =20 static inline int amd_viommu_init(struct amd_iommu *iommu) @@ -30,6 +34,15 @@ static inline u64 amd_viommu_get_vfmmio_addr(struct amd_= iommu *iommu, u16 gid) return 0; } =20 +static inline int amd_viommu_init_one(struct amd_iommu *iommu, struct amd_= iommu_viommu *viommu) +{ + return -EOPNOTSUPP; +} + +static inline void amd_viommu_uninit_one(struct amd_iommu *iommu, struct a= md_iommu_viommu *viommu) +{ +} + #endif /* CONFIG_AMD_IOMMU_IOMMUFD */ =20 #endif /* AMD_VIOMMU_H */ diff --git a/drivers/iommu/amd/iommu.c b/drivers/iommu/amd/iommu.c index e0433e65cfa5..44d20e598d85 100644 --- a/drivers/iommu/amd/iommu.c +++ b/drivers/iommu/amd/iommu.c @@ -43,6 +43,7 @@ #include =20 #include "amd_iommu.h" +#include "amd_viommu.h" #include "iommufd.h" #include "../irq_remapping.h" #include "../iommu-pages.h" diff --git a/drivers/iommu/amd/iommufd.c b/drivers/iommu/amd/iommufd.c index 42307ae71b24..efa9e1f49550 100644 --- a/drivers/iommu/amd/iommufd.c +++ b/drivers/iommu/amd/iommufd.c @@ -83,6 +83,10 @@ int amd_iommufd_viommu_init(struct iommufd_viommu *viomm= u, struct iommu_domain * /* Reset vIOMMU MMIOs to initialize the vIOMMU */ iommu_reset_vmmio(iommu, aviommu->gid); =20 + ret =3D amd_viommu_init_one(iommu, aviommu); + if (ret) + goto err_init; + ret =3D iommu_copy_struct_to_user(user_data, &data, IOMMU_VIOMMU_TYPE_AMD, reserved); @@ -120,6 +124,7 @@ static void amd_iommufd_viommu_destroy(struct iommufd_v= iommu *viommu) if (aviommu->vfmmio_mmap_offset) iommufd_viommu_destroy_mmap(&aviommu->core, aviommu->vfmmio_mmap_offset); amd_iommu_gid_free(iommu, aviommu->gid); + amd_viommu_uninit_one(iommu, aviommu); } =20 /* diff --git a/drivers/iommu/amd/viommu.c b/drivers/iommu/amd/viommu.c index 6dcb02b12a28..3636093732ce 100644 --- a/drivers/iommu/amd/viommu.c +++ b/drivers/iommu/amd/viommu.c @@ -26,6 +26,20 @@ #include "amd_viommu.h" #include "../iommu-pages.h" =20 +/* + * Guest Device ID Mapping Table + */ +#define VIOMMU_MAX_GDEVID 0xFFFF +#define VIOMMU_DEVID_MAPPING_BASE 0x1000000000ULL +#define VIOMMU_DEVID_MAPPING_ENTRY_SIZE (1 << 20) + +/* + * Guest Domain ID Mapping Table + */ +#define VIOMMU_MAX_GDOMID 0xFFFF +#define VIOMMU_DOMID_MAPPING_BASE 0x2000000000ULL +#define VIOMMU_DOMID_MAPPING_ENTRY_SIZE (1 << 19) + LIST_HEAD(viommu_devid_map); =20 static int viommu_init_pci_vsc(struct amd_iommu *iommu) @@ -352,3 +366,41 @@ static void __maybe_unused free_private_vm_region(stru= ct amd_iommu *iommu, u64 * iommu_free_pages(*entry); *entry =3D NULL; } + +void amd_viommu_uninit_one(struct amd_iommu *iommu, struct amd_iommu_viomm= u *aviommu) +{ + pr_debug("%s: gid=3D%u\n", __func__, aviommu->gid); + + free_private_vm_region(iommu, &aviommu->devid_table, + VIOMMU_DEVID_MAPPING_BASE, + VIOMMU_DEVID_MAPPING_ENTRY_SIZE, + aviommu->gid); + free_private_vm_region(iommu, &aviommu->domid_table, + VIOMMU_DOMID_MAPPING_BASE, + VIOMMU_DOMID_MAPPING_ENTRY_SIZE, + aviommu->gid); +} + +int amd_viommu_init_one(struct amd_iommu *iommu, struct amd_iommu_viommu *= viommu) +{ + int ret; + + ret =3D alloc_private_vm_region(iommu, &viommu->devid_table, + VIOMMU_DEVID_MAPPING_BASE, + VIOMMU_DEVID_MAPPING_ENTRY_SIZE, + viommu->gid); + if (ret) + goto err_out; + + ret =3D alloc_private_vm_region(iommu, &viommu->domid_table, + VIOMMU_DOMID_MAPPING_BASE, + VIOMMU_DOMID_MAPPING_ENTRY_SIZE, + viommu->gid); + if (ret) + goto err_out; + + return 0; +err_out: + amd_viommu_uninit_one(iommu, viommu); + return -ENOMEM; +} --=20 2.34.1 From nobody Mon Jun 8 16:49:04 2026 Received: from CH1PR05CU001.outbound.protection.outlook.com (mail-northcentralusazon11010061.outbound.protection.outlook.com [52.101.193.61]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 36DBD318EE6 for ; Thu, 28 May 2026 05:19:14 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=52.101.193.61 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1779945556; cv=fail; b=NgXmZJYWfPg0y+i/yGNu6WkpbUaVWHRN47MBHTcY43YwWTa7RVFIXsPWi5nmoD5EJis4zFbZGTtKqv2H7S1imQ/dqul0y7rrTFmTOKbwTkXxfyZfulzQtywNaAydUQHgsPKsu+mcBkphsmAm29/RAzm8aTLKbjGSh90ls56Q6ms= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1779945556; c=relaxed/simple; bh=pspvVki876oVGW/eNXDDWqMLMB58kSy+IaoDHlFXqWc=; h=From:To:CC:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=JFcDgjB27UXbOLf1hpJdxdyhCZbG2SKlHQ1jO8THQy14bCkzTOZDsUr2C/mMZZrswgfmwukTvYDHg6DlYsCwpQfjYMdjH058z1hioqQhexNX2ZY4xGmzO/ZH3AK0qkmFiX3/YqGiPlGLB2I29DSfxRwuskWi1B1VQhwksLEYrVw= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=amd.com; spf=fail smtp.mailfrom=amd.com; dkim=pass (1024-bit key) header.d=amd.com header.i=@amd.com header.b=E2AjTLdV; arc=fail smtp.client-ip=52.101.193.61 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=amd.com Authentication-Results: smtp.subspace.kernel.org; spf=fail smtp.mailfrom=amd.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=amd.com header.i=@amd.com header.b="E2AjTLdV" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=ewuWmKhfvxA0uWjLehj0xapTdykbiAG5Q/thhjzfxuLaTREXRyBWIsDyHDyfKeSFzJ6cVyEJE4sXpraBdgUc1sIXaTt5HRelUddcjgX6SY4ud2cKYjt+PgwSXOXVf3MWLp+qhFWjmXul4hpThV3vhOfIu1ptAlCsCVwRa1Zc/pG1N+k+Cey2h47s2xyYgY9KCqWGFeu8qh/3whTvAJYWmht9JBUt1WL4GmWznf1xOftMvZp+Dp5fN/8RDPnM3x+5u0Ur61EQUSP+pfaZuAK1Ru2nod8w9QAnHQq9eGQeGdTXkiffMD/bwX0+eCH1tLYLeMQFKCkY8IwRae6KD8TssA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector10001; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=dSSdfmQtTyg5GhsJWQQjHr8On5E1LNZetsqiV6Wqtyw=; b=L2wj57DzKqSKrOXwEA3jtLpQbW5e5n8+a9j9dwL/eh2o0yTlflyByGBxv4HhJFBJ1jQHr0rly/DTXd1Xaq2Lz0yLeliJgdXTiJcaMo3M7aS18qlG1sONyVluZ9604eQp6eNLTUuDMGexTib4mzp2w2kin3UdhhDyU+VA2s5tYSdOPjiydG535ISaIj8dtICoPKvma7DwYR97khlG4rTmbUCzufQcmjZgEJVWvMFeT2viYvOKRTbBnPKjrFilKEV0snM6UBwLi8xlRN0qp4SwNm2z35qDFzAJOiI3t6bgdgg6S8uEnY2qDXu3GWq2EjRs0MttXmKZGbfLhyVvRKR+ng== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass (sender ip is 165.204.84.17) smtp.rcpttodomain=vger.kernel.org smtp.mailfrom=amd.com; dmarc=pass (p=quarantine sp=quarantine pct=100) action=none header.from=amd.com; dkim=none (message not signed); arc=none (0) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=amd.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=dSSdfmQtTyg5GhsJWQQjHr8On5E1LNZetsqiV6Wqtyw=; b=E2AjTLdVqzIemfftE7yA51RI8yY5T19CLze9RHHGagivb3+hck9eH0dwmKYaiS32pQwiJiYLTDzkVDj8pMTLBZ/jgGQNWBAMChVJsdnoGUESLGFtwUPn6hVeSTt50U8Oal1p2VoD/+SvUXdycBfBsrV6YiwGaEHIQMmjOsdQBiA= Received: from SN1PR12CA0097.namprd12.prod.outlook.com (2603:10b6:802:21::32) by MN2PR12MB4157.namprd12.prod.outlook.com (2603:10b6:208:1db::13) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.21.71.12; Thu, 28 May 2026 05:19:11 +0000 Received: from SN1PEPF00036F40.namprd05.prod.outlook.com (2603:10b6:802:21:cafe::11) by SN1PR12CA0097.outlook.office365.com (2603:10b6:802:21::32) with Microsoft SMTP Server (version=TLS1_3, cipher=TLS_AES_256_GCM_SHA384) id 15.21.71.13 via Frontend Transport; Thu, 28 May 2026 05:19:11 +0000 X-MS-Exchange-Authentication-Results: spf=pass (sender IP is 165.204.84.17) smtp.mailfrom=amd.com; dkim=none (message not signed) header.d=none;dmarc=pass action=none header.from=amd.com; Received-SPF: Pass (protection.outlook.com: domain of amd.com designates 165.204.84.17 as permitted sender) receiver=protection.outlook.com; client-ip=165.204.84.17; helo=satlexmb07.amd.com; pr=C Received: from satlexmb07.amd.com (165.204.84.17) by SN1PEPF00036F40.mail.protection.outlook.com (10.167.248.24) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.21.71.7 via Frontend Transport; Thu, 28 May 2026 05:19:11 +0000 Received: from purico-ed03host.amd.com (10.180.168.240) by satlexmb07.amd.com (10.181.42.216) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.2562.41; Thu, 28 May 2026 00:19:05 -0500 From: Suravee Suthikulpanit To: , , , CC: , , , , , , , , , , , , , Suravee Suthikulpanit Subject: [PATCH v2 14/26] iommu/amd: Introduce IOMMUFD vDevice support for AMD Date: Thu, 28 May 2026 05:17:26 +0000 Message-ID: <20260528051738.596013-15-suravee.suthikulpanit@amd.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20260528051738.596013-1-suravee.suthikulpanit@amd.com> References: <20260528051738.596013-1-suravee.suthikulpanit@amd.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: satlexmb08.amd.com (10.181.42.217) To satlexmb07.amd.com (10.181.42.216) X-EOPAttributedMessage: 0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: SN1PEPF00036F40:EE_|MN2PR12MB4157:EE_ X-MS-Office365-Filtering-Correlation-Id: 4b79f779-337d-4abd-c8d7-08debc78a6a0 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|1800799024|36860700016|376014|82310400026|7416014|11063799006|22082099003|18002099003|56012099006; X-Microsoft-Antispam-Message-Info: h9BjNHRes7Y9mzw7kpXqRReUo3cKTJvgdlFlJIvClATH1eDtEL/agVk9FeFlV9JiWyfs2O1rlyPgJ/2lVYQu2fPo1DJRvSfl8Gi8DzkNl7TOckBCHAREh1ifZfRIQg+mWOh/lPmwOWgkxCgxXDLIfywCa3lIzoHmH1saFjLeun/Nuvedac5hs/gPa6yjX8bdRiHIREcjEprnX/h8LoN3JpY5D6CdFo84IVryHw1OABDTw4n2Rlr1RTKJpyuY1zaC8l66KuVhwi5nGPHIyzMoSYqDqKFnb3pMyXXEUCwS0lMbgG4aDS82RV+Htn8qSD1x8XbVFoIDT2gN9283ipWq/45dXQa7M5Fz6cL9ZUytGNFO1yJmMGhng0ajTWafCxbtWNnAFe3bgR8ZK3kCJfOXa5dJPuE45/uXTOm69AZ5KwF+tbxvEoCbNhnP0uRlI26d2/lBmKDlnwfN4IT9gCEug6SYVGIThKZK4mRKtdICgsFHbOEuhBK0N2VbysjgSqWidM9TfI6HfBrj95pJVAYUBQRWWATY26boh/v8RH8pR338yVEQ3EvEMP7f6BPAcwr5sdeKBe7RM0Wfgh9RrUXCPXuvL2L7VQAFYFaWs1W/tUaKBLvRpbGfCLO030DENut9Y6UGlPHc9M7cwECrgPpYdpcSbI6uQ5UodmEz/zXgeTLXJ4IDCTnHazNnv2iU8Mx1bh/psHj9V3QmIp2HB05AJfHoYNocL42GhyfzWRBBc6I= X-Forefront-Antispam-Report: CIP:165.204.84.17;CTRY:US;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:satlexmb07.amd.com;PTR:InfoDomainNonexistent;CAT:NONE;SFS:(13230040)(1800799024)(36860700016)(376014)(82310400026)(7416014)(11063799006)(22082099003)(18002099003)(56012099006);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: JiXGDjt62TMJf3X4u7DNuAuK18+Jh2PmE01cHGjkQ03aSSmJFGkgKvGsh9qIB8A29tH3NVOXZyJBNuYtVE6aKPlbHWMqNgtXf6vMKl8Wx1fbKhwokxVTsZ246/zUELRfCEJocIJx0kCJ4gZdndIYbglEiSChifGz/T5IgxRuoEmElU5/RC11WO3DaKA04HTrG4NFXQW/4SgUTrLcednHIYt5Jk9V06IhOlc7oIntL2kRbSRc23H4uSNMgmgbRykUrVs03RzdZ9CzxyfedeSUr4mZIu//MwlIzWhn815x4FQdnWuRg3OX27Zblpq25jRoY3jbmWlRyZbah6kTTxQe3Pho/NsjXKZcWQUt+FnijUXvbDbC3R5XQBRR92LOQC7N5bSSyO0rUusAFDadF4QBLi9s82FM2gpcv9LcaKguTBMi8jir2YxOxlSLkwKzapwB X-OriginatorOrg: amd.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 28 May 2026 05:19:11.0225 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: 4b79f779-337d-4abd-c8d7-08debc78a6a0 X-MS-Exchange-CrossTenant-Id: 3dd8961f-e488-4e60-8e11-a82d994e183d X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp: TenantId=3dd8961f-e488-4e60-8e11-a82d994e183d;Ip=[165.204.84.17];Helo=[satlexmb07.amd.com] X-MS-Exchange-CrossTenant-AuthSource: SN1PEPF00036F40.namprd05.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Anonymous X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: MN2PR12MB4157 Content-Type: text/plain; charset="utf-8" Initialize vDevice for AMD vIOMMU by setting up the Device ID Mapping table using the guest device ID. Signed-off-by: Suravee Suthikulpanit --- drivers/iommu/amd/amd_iommu_types.h | 12 +++++++++++ drivers/iommu/amd/iommufd.c | 33 +++++++++++++++++++++++++++++ drivers/iommu/amd/nested.c | 12 +++++++++++ 3 files changed, 57 insertions(+) diff --git a/drivers/iommu/amd/amd_iommu_types.h b/drivers/iommu/amd/amd_io= mmu_types.h index 63410028bae3..836d5cd08134 100644 --- a/drivers/iommu/amd/amd_iommu_types.h +++ b/drivers/iommu/amd/amd_iommu_types.h @@ -388,6 +388,11 @@ #define DTE_GPT_LEVEL_SHIFT 54 #define DTE_GPT_LEVEL_MASK GENMASK_ULL(55, 54) =20 +/* vIOMMU bit fields */ +#define DTE_VIOMMU_EN_SHIFT 15 +#define DTE_VIOMMU_GDEVICEID_MASK GENMASK_ULL(31, 16) +#define DTE_VIOMMU_GUESTID_MASK GENMASK_ULL(47, 32) + #define GCR3_VALID 0x01ULL =20 /* DTE[128:179] | DTE[184:191] */ @@ -894,6 +899,9 @@ struct iommu_dev_data { bool defer_attach; =20 struct ratelimit_state rs; /* Ratelimit IOPF messages */ + + u16 gid; /* Guest ID */ + u16 gDevId; /* Guest Device ID */ }; =20 /* Map HPET and IOAPIC ids to the devid used by the IOMMU */ @@ -1121,6 +1129,10 @@ struct amd_irte_ops { void (*clear_allocated)(struct irq_remap_table *, int); }; =20 +struct amd_iommu_vdevice { + struct iommufd_vdevice core; +}; + #ifdef CONFIG_IRQ_REMAP extern struct amd_irte_ops irte_32_ops; extern struct amd_irte_ops irte_128_ops; diff --git a/drivers/iommu/amd/iommufd.c b/drivers/iommu/amd/iommufd.c index efa9e1f49550..eb43d02371a8 100644 --- a/drivers/iommu/amd/iommufd.c +++ b/drivers/iommu/amd/iommufd.c @@ -9,6 +9,7 @@ #include "amd_iommu.h" #include "amd_viommu.h" #include "amd_iommu_types.h" +#include "../iommufd/iommufd_private.h" =20 static const struct iommufd_viommu_ops amd_viommu_ops; =20 @@ -127,6 +128,36 @@ static void amd_iommufd_viommu_destroy(struct iommufd_= viommu *viommu) amd_viommu_uninit_one(iommu, aviommu); } =20 +/* + * Called from drivers/iommu/iommufd/viommu.c: iommufd_vdevice_alloc_ioctl= () + */ +static int _amd_viommu_vdevice_init(struct iommufd_vdevice *vdev) +{ + struct iommu_dev_data *dev_data; + struct pci_dev *pdev =3D to_pci_dev(vdev->idev->dev); + struct iommufd_viommu *viommu =3D vdev->viommu; + struct amd_iommu_viommu *aviommu =3D container_of(viommu, struct amd_iomm= u_viommu, core); + + if (!pdev) { + pr_err("%s: not a PCI device\n", __func__); + return -EINVAL; + } + + dev_data =3D dev_iommu_priv_get(&pdev->dev); + if (!dev_data) { + pr_err("%s: Device not found (devid=3D%#x)\n", + __func__, pci_dev_id(pdev)); + return -EINVAL; + } + + dev_data->gid =3D aviommu->gid; + dev_data->gDevId =3D vdev->virt_id; + pr_debug("%s: gid=3D%#x, hdev_id=3D%#x, gdev_id=3D%#x\n", __func__, + dev_data->gid, pci_dev_id(pdev), dev_data->gDevId); + + return 0; +} + /* * See include/linux/iommufd.h * struct iommufd_viommu_ops - vIOMMU specific operations @@ -134,4 +165,6 @@ static void amd_iommufd_viommu_destroy(struct iommufd_v= iommu *viommu) static const struct iommufd_viommu_ops amd_viommu_ops =3D { .alloc_domain_nested =3D amd_iommu_alloc_domain_nested, .destroy =3D amd_iommufd_viommu_destroy, + .vdevice_size =3D VDEVICE_STRUCT_SIZE(struct amd_iommu_vdevice, core), + .vdevice_init =3D _amd_viommu_vdevice_init, }; diff --git a/drivers/iommu/amd/nested.c b/drivers/iommu/amd/nested.c index 15dc57cf7c5f..08f74ebb3523 100644 --- a/drivers/iommu/amd/nested.c +++ b/drivers/iommu/amd/nested.c @@ -227,6 +227,18 @@ static void set_dte_nested(struct amd_iommu *iommu, st= ruct iommu_domain *dom, =20 /* Guest paging mode */ new->data[2] |=3D gdte->dte[2] & DTE_GPT_LEVEL_MASK; + + /* vImuEn */ + new->data[3] |=3D 1ULL << DTE_VIOMMU_EN_SHIFT; + + /* GDeviceID */ + new->data[3] |=3D FIELD_PREP(DTE_VIOMMU_GDEVICEID_MASK, + dev_data->gDevId); + + /* GuestID */ + new->data[3] |=3D FIELD_PREP(DTE_VIOMMU_GUESTID_MASK, + dev_data->gid); + } =20 static int nested_attach_device(struct iommu_domain *dom, struct device *d= ev, --=20 2.34.1 From nobody Mon Jun 8 16:49:04 2026 Received: from PH0PR06CU001.outbound.protection.outlook.com (mail-westus3azon11011017.outbound.protection.outlook.com [40.107.208.17]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 48F6031D367 for ; Thu, 28 May 2026 05:19:18 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=40.107.208.17 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1779945559; cv=fail; b=jOTPjbMuDC1/0tOQrQ7UWPTlrcvHDWsf8fux6my2Y4sUwecLLt99G0ShGF+VrNC/QoN6bhQstDjy6mPlejjurcmMYiSVy9B6ECvPrGbykVjwJNiSHQ/I9CzNOxcTRz9XUTQ/pC70juk3JkeyVblCpgYgd5WKA0+lRDwa2tEoilg= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1779945559; c=relaxed/simple; bh=U/VcJPvqyi2GAvL96daTF//aCtYcDfWpehfSDMbchn0=; h=From:To:CC:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=uXqd3yZEgk/VnAeBVLVAlTDwGL1Bk0CL1mqsIw+N/Or1R4swDi/sN7RReRJoVczror5+UGnCj/NZCZES19ny3+yxybcWMP4JwHcKY5YJzNARYzZ1WnzU0QbDMAj7Gy6Dyz34xdgvxBqbiZDSWGMEQuVVem7xaJSAP3O7DzOBIls= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=amd.com; spf=fail smtp.mailfrom=amd.com; dkim=pass (1024-bit key) header.d=amd.com header.i=@amd.com header.b=dWXMC948; arc=fail smtp.client-ip=40.107.208.17 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=amd.com Authentication-Results: smtp.subspace.kernel.org; spf=fail smtp.mailfrom=amd.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=amd.com header.i=@amd.com header.b="dWXMC948" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=v+KwxZdQE5ja4sO1O3gptXiIuJs0R8OSPixIIqgfYYoCFM4GjTi4nGtyu56BaghKSc+ODKejNREfRebwHZ7s6+tVSb8/gvoZJGWC5545Kwo76nmMoKT2L+n3KqF8dB3kFXeSitGWDU+M1hlnkXPGopFpRnGGNLcFjqvpqdZmPFzojy2H811gO/4Xyx5FXybZ/iHYfrMMfILhP8pE8qJ7GLTHLxbysai1SsL4H9IA7rwZoQkrmJ9DkS8N+nQjvNojJU3TBM1sEV/O8MVXuZQh7i69W2Xc27BqILVjRVLlNRmq2ef1722n9QJ0/MRTS5XIhxPlFLzGtyyAKcNkNWZ6fA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector10001; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=XOqGGBi01P+ukGhHZgDuA/KrO1d6ZT/oPMAl1f1kj74=; b=DKPZVMthewTtTbxgHn6Gjb1GLSYXwzqe9RO1FyfKkWv54pyqWJ1fuYYZPtMBlg2xmnnB4+iIc/tTPxQqgKz214C9w8SztbqBNxaEpcrTFe21QMeXzO4BdZHPKpn1xPEJXDw1bqGbBL7ndVfWj9wG9++AJB6anm9eFhPfqNXD0lnVez2hoAjMqA8bFkCQXJcHYwwRuqfcMOy9W4QDDYRCdRZMF2xa2UwthFfPIwnjMHse980zTmPmfjzAd80s19L84BAtulKlFlxCHqfDkxtdkulsUmUCHQzzapR9WsZ11nhTrmlunHf7sJRUfk/rygML4gAeBoPAxLsuS+q0Qy/WBQ== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass (sender ip is 165.204.84.17) smtp.rcpttodomain=vger.kernel.org smtp.mailfrom=amd.com; dmarc=pass (p=quarantine sp=quarantine pct=100) action=none header.from=amd.com; dkim=none (message not signed); arc=none (0) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=amd.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=XOqGGBi01P+ukGhHZgDuA/KrO1d6ZT/oPMAl1f1kj74=; b=dWXMC9480QegZai+neSSgkrD6a+ZRSlAVyT45NHTA8khId+sKQYeT8a2rXL56cr8lJ2xrPF9ZO05rPMMY4vGwOEkTMdKATcUJ+Y8bYUVVno4UYj/4josOT4umSkhabjNRlz4PLmTXUNA3YaVnONzw4ajhqdYGPBJ6GCn8Cia+EM= Received: from SN6PR05CA0026.namprd05.prod.outlook.com (2603:10b6:805:de::39) by SA0PR12MB4495.namprd12.prod.outlook.com (2603:10b6:806:70::13) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.21.71.13; Thu, 28 May 2026 05:19:15 +0000 Received: from SN1PEPF00036F43.namprd05.prod.outlook.com (2603:10b6:805:de:cafe::1d) by SN6PR05CA0026.outlook.office365.com (2603:10b6:805:de::39) with Microsoft SMTP Server (version=TLS1_3, cipher=TLS_AES_256_GCM_SHA384) id 15.21.92.5 via Frontend Transport; Thu, 28 May 2026 05:19:15 +0000 X-MS-Exchange-Authentication-Results: spf=pass (sender IP is 165.204.84.17) smtp.mailfrom=amd.com; dkim=none (message not signed) header.d=none;dmarc=pass action=none header.from=amd.com; Received-SPF: Pass (protection.outlook.com: domain of amd.com designates 165.204.84.17 as permitted sender) receiver=protection.outlook.com; client-ip=165.204.84.17; helo=satlexmb07.amd.com; pr=C Received: from satlexmb07.amd.com (165.204.84.17) by SN1PEPF00036F43.mail.protection.outlook.com (10.167.248.27) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.21.71.7 via Frontend Transport; Thu, 28 May 2026 05:19:15 +0000 Received: from purico-ed03host.amd.com (10.180.168.240) by satlexmb07.amd.com (10.181.42.216) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.2562.41; Thu, 28 May 2026 00:19:10 -0500 From: Suravee Suthikulpanit To: , , , CC: , , , , , , , , , , , , , Suravee Suthikulpanit Subject: [PATCH v2 15/26] iommu/amd: Introduce helper function for updating domain ID mapping table Date: Thu, 28 May 2026 05:17:27 +0000 Message-ID: <20260528051738.596013-16-suravee.suthikulpanit@amd.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20260528051738.596013-1-suravee.suthikulpanit@amd.com> References: <20260528051738.596013-1-suravee.suthikulpanit@amd.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: satlexmb08.amd.com (10.181.42.217) To satlexmb07.amd.com (10.181.42.216) X-EOPAttributedMessage: 0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: SN1PEPF00036F43:EE_|SA0PR12MB4495:EE_ X-MS-Office365-Filtering-Correlation-Id: c00db1b5-10de-41f6-0595-08debc78a901 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|82310400026|36860700016|1800799024|376014|7416014|56012099006|11063799006|18002099003|22082099003|3023799007; X-Microsoft-Antispam-Message-Info: NOZSBAWmGcxftYA6jy5Ne64mCuIm5wkUG1oveiZGqCtwBNAQ944NZDQlez4HJIhVjCMse6IDRxMVaPh3DZoOhK8+00fLpRkdxoNgqtyT5gUkHl9R1Rygz4T7VKhxS3fXRCZoL1pYXz16JuXzHL/VUaS6LlzHEMTg5M4gsnfkqI0Qa9SJbzD66nUoy8G0e32lAu/sLrqTvdFG+PnZ7W+PQtcxdIT8BMjJ4Z/pykEK6aeA7djLQCvNzZUdimtlIxd67PP6qnKHkDXAWmnh0QHh+ds6dR/IVAmxs4XY7IhegkgD7+d8xUwkzaaHKo2xf14ar2184/RZjLD5mOvtkWd4iXzS6tKQ5eBcnSUXKHhA35EkKvWPeKhCj2jAw1fnGKFAxgmZv/irW95gSqebqO3/zZAp0fieAQqKHk+Ou+6ewJbMgyZg0WhF9+SvbauswQGCXoGPCAHlSjed0RQmDu31h5ZTm/P21Moqq6ZPpbWQWXF1YQbSVluOoWKIx0KZ9Be05JGlTYbeP3WJPILAzxEyct7IRaiebKDA71nCqHVuSLXKGxmjUJo9y/PwaxEamxzoP7BHpF+soZPlqcIOd8T1OclpE61Tv7WvWC0K3nzBuuLF2H0Rcbc+9Lxv7vT095bJsdChcupsiaxIjuk/53H7sGbOiJgihzMKQ7Zpa6MS5FRIqwaCXw7vAbepCXB7BFLRk+EcM4z00Aam8FRkp/4ZLldarng4YXJNJax38xUc1HI= X-Forefront-Antispam-Report: CIP:165.204.84.17;CTRY:US;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:satlexmb07.amd.com;PTR:InfoDomainNonexistent;CAT:NONE;SFS:(13230040)(82310400026)(36860700016)(1800799024)(376014)(7416014)(56012099006)(11063799006)(18002099003)(22082099003)(3023799007);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: OLzw3lh834rups5fkGX7eOPkBDEWh6oydmAo/jp3vVF4DUUfC8mpEUkZvGFDSFMFbIu9lcmH33dboFaXp03QuoNPBA/Fbhf/VhjoSWwQf5ngjTJk46x3gBEThUGM+haKg/ryi9BuFjEh8/IcKiCeeE5MoEvQxzXgBty2jzO0BMGZGv/+nkB1jrbxoq5LXMtpn6bF4+g+Ir9fg/7lGuzTj0U756uxfW/5k3jdTsEp1qZdmzN4umvjbPLfmvEXu4ApJn1WhE6/IBT0gqY69MCShFsbm+RDNcixYENx6tHLFyWT58xSTj6lCskaYM+cJkLc2/RTqx2c0YTsMujOsfAXjtN3gfzayIEiO9uIrWlToZfEybAaPNNgnlLQiaH0shycUmTFhF3LeYal02EBmCFzqGZ7j1b9B9cy1cAk5jfWhQJUW+WGf1/H01+HIz7VcoHq X-OriginatorOrg: amd.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 28 May 2026 05:19:15.0033 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: c00db1b5-10de-41f6-0595-08debc78a901 X-MS-Exchange-CrossTenant-Id: 3dd8961f-e488-4e60-8e11-a82d994e183d X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp: TenantId=3dd8961f-e488-4e60-8e11-a82d994e183d;Ip=[165.204.84.17];Helo=[satlexmb07.amd.com] X-MS-Exchange-CrossTenant-AuthSource: SN1PEPF00036F43.namprd05.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Anonymous X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: SA0PR12MB4495 Content-Type: text/plain; charset="utf-8" AMD vIOMMU hardware uses the Domain ID mapping table to map Guest Domain ID (GDomID) to Host Domain ID when it virtualises guest IOMMU commands. It uses GID and GDomID to index into the table to look up host domain ID. Linux IOMMU driver programs the table entry using VFCntlMMIO Guest Domain Map Control Register. Introduce amd_viommu_domain_id_update(), which is used to set the entry when attaching the nested device. Clearing the entry is done during VM destroy. Signed-off-by: Suravee Suthikulpanit --- drivers/iommu/amd/amd_viommu.h | 2 ++ drivers/iommu/amd/nested.c | 5 ++++ drivers/iommu/amd/viommu.c | 46 ++++++++++++++++++++++++++++++++++ 3 files changed, 53 insertions(+) diff --git a/drivers/iommu/amd/amd_viommu.h b/drivers/iommu/amd/amd_viommu.h index 8b57717c22a6..b6fd5ffc3b82 100644 --- a/drivers/iommu/amd/amd_viommu.h +++ b/drivers/iommu/amd/amd_viommu.h @@ -18,6 +18,8 @@ int amd_viommu_init_one(struct amd_iommu *iommu, struct a= md_iommu_viommu *viommu =20 void amd_viommu_uninit_one(struct amd_iommu *iommu, struct amd_iommu_viomm= u *viommu); =20 +int amd_viommu_domain_id_update(struct amd_iommu *iommu, u16 gid, + u16 hdom_id, u16 gdom_id); #else =20 static inline int amd_viommu_init(struct amd_iommu *iommu) diff --git a/drivers/iommu/amd/nested.c b/drivers/iommu/amd/nested.c index 08f74ebb3523..ce16c8404c28 100644 --- a/drivers/iommu/amd/nested.c +++ b/drivers/iommu/amd/nested.c @@ -10,6 +10,7 @@ #include =20 #include "amd_iommu.h" +#include "amd_viommu.h" =20 static const struct iommu_domain_ops nested_domain_ops; =20 @@ -245,6 +246,7 @@ static int nested_attach_device(struct iommu_domain *do= m, struct device *dev, struct iommu_domain *old) { struct dev_table_entry new =3D {0}; + struct nested_domain *ndom =3D to_ndomain(dom); struct iommu_dev_data *dev_data =3D dev_iommu_priv_get(dev); struct amd_iommu *iommu =3D get_amd_iommu_from_dev_data(dev_data); int ret =3D 0; @@ -262,6 +264,9 @@ static int nested_attach_device(struct iommu_domain *do= m, struct device *dev, =20 amd_iommu_update_dte(iommu, dev_data, &new); =20 + ret =3D amd_viommu_domain_id_update(iommu, dev_data->gid, + ndom->gdom_info->hdom_id, ndom->gdom_id); + mutex_unlock(&dev_data->mutex); =20 return ret; diff --git a/drivers/iommu/amd/viommu.c b/drivers/iommu/amd/viommu.c index 3636093732ce..3f7c17d400d0 100644 --- a/drivers/iommu/amd/viommu.c +++ b/drivers/iommu/amd/viommu.c @@ -40,6 +40,8 @@ #define VIOMMU_DOMID_MAPPING_BASE 0x2000000000ULL #define VIOMMU_DOMID_MAPPING_ENTRY_SIZE (1 << 19) =20 +#define VIOMMU_VFCTRL_GUEST_DID_MAP_CONTROL1_OFFSET 0x08 + LIST_HEAD(viommu_devid_map); =20 static int viommu_init_pci_vsc(struct amd_iommu *iommu) @@ -367,6 +369,22 @@ static void __maybe_unused free_private_vm_region(stru= ct amd_iommu *iommu, u64 * *entry =3D NULL; } =20 +static void viommu_clear_mapping(struct amd_iommu *iommu, + struct amd_iommu_viommu *aviommu) +{ + int i; + u16 gid =3D aviommu->gid; + + /* + * IOMMU hardware uses the domain ID mapping table to map gdom ID to hdom= ID. + * If the mapping does not exist, the hardware would generate error in th= e event log. + * Therefore, initialize all gdom ID entries to map to parent domain ID t= o prevent + * unknown mapping scenario. + */ + for (i =3D 0; i <=3D VIOMMU_MAX_GDOMID; i++) + amd_viommu_domain_id_update(iommu, gid, aviommu->parent->id, i); +} + void amd_viommu_uninit_one(struct amd_iommu *iommu, struct amd_iommu_viomm= u *aviommu) { pr_debug("%s: gid=3D%u\n", __func__, aviommu->gid); @@ -379,6 +397,7 @@ void amd_viommu_uninit_one(struct amd_iommu *iommu, str= uct amd_iommu_viommu *avi VIOMMU_DOMID_MAPPING_BASE, VIOMMU_DOMID_MAPPING_ENTRY_SIZE, aviommu->gid); + viommu_clear_mapping(iommu, aviommu); } =20 int amd_viommu_init_one(struct amd_iommu *iommu, struct amd_iommu_viommu *= viommu) @@ -399,8 +418,35 @@ int amd_viommu_init_one(struct amd_iommu *iommu, struc= t amd_iommu_viommu *viommu if (ret) goto err_out; =20 + viommu_clear_mapping(iommu, viommu); + return 0; err_out: amd_viommu_uninit_one(iommu, viommu); return -ENOMEM; } + +/* + * Program the DomID via VFCTRL registers + * This function will be called during VM init via VFIO. + */ + + #define DOMID_ENTRY_GDOMID_MASK GENMASK_ULL(61, 46) + #define DOMID_ENTRY_HDOMID_MASK GENMASK_ULL(29, 14) + #define DOMID_ENTRY_VALID BIT_ULL(0) + #define DOMID_ENTRY_WRITE BIT_ULL(63) + +int amd_viommu_domain_id_update(struct amd_iommu *iommu, u16 gid, + u16 hdom_id, u16 gdom_id) +{ + u64 val; + u8 __iomem *vfctrl =3D VIOMMU_VFCTRL_MMIO_BASE(iommu, gid); + + val =3D FIELD_PREP(DOMID_ENTRY_GDOMID_MASK, gdom_id) | + FIELD_PREP(DOMID_ENTRY_HDOMID_MASK, hdom_id) | + DOMID_ENTRY_WRITE | DOMID_ENTRY_VALID; + + writeq(val, vfctrl + VIOMMU_VFCTRL_GUEST_DID_MAP_CONTROL1_OFFSET); + return 0; +} +EXPORT_SYMBOL(amd_viommu_domain_id_update); --=20 2.34.1 From nobody Mon Jun 8 16:49:04 2026 Received: from SN4PR2101CU001.outbound.protection.outlook.com (mail-southcentralusazon11012045.outbound.protection.outlook.com [40.93.195.45]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id C53B131A045 for ; Thu, 28 May 2026 05:19:23 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=40.93.195.45 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1779945565; cv=fail; b=Wa9RQ6k4+Cry0nhsOreGMPxyMJF4GnynT6gqV7WvoiVM0gK2jkjiG5vnE/rn5BW9YGiwC2jbjiKOVksG8i4zGOttg8V74Yv+jjevkeW4kQLveBy9cDxQtaicohT/njp7nTxLpw+RcvbqnJH4614Bc9N+EVri00zhdPlJKrvHWe0= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1779945565; c=relaxed/simple; bh=QoU/T0hmFSXYRNhpKeqYa9Fs3LZ+ruw7NGldAS5GUE8=; h=From:To:CC:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=iuRR1u5L05aBcOshLF2jt2HQjWGpvI3SjVoXnoENEo00vbUHADn5weA4DeVPj7PnTIewK/5ndiekL1NvbrIOD21X3F175RWRHOEB3XGrgL8CmKfcNHRZzE7aJFeMBaRFXzPZmgggJ+PxR32KzcStdd65hs3PxVrqGZVJo8rfKG0= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=amd.com; spf=fail smtp.mailfrom=amd.com; dkim=pass (1024-bit key) header.d=amd.com header.i=@amd.com header.b=bbjMoSvL; arc=fail smtp.client-ip=40.93.195.45 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=amd.com Authentication-Results: smtp.subspace.kernel.org; spf=fail smtp.mailfrom=amd.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=amd.com header.i=@amd.com header.b="bbjMoSvL" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=qQJQ4rg4SA5up3i7vLqAareKwufR1PlpOPt/YQU9trbTeEHxzmfxuZ4hYP+qFEfHQqJKICP8SgGVlPWlaZhI1W36oz/H82ccJj3eVKl00Wx+4Nm9zS6PBXHjj7bdwFFh/efmyGOl8vTKpH62fNHGpGzRnpZryvRAAlQUyc0LYY3YWQPRkSw4vyk3Yw5pYKdSkdsuka+fcOqwFr+3qVgSmzAm+EX93sCEBMFCzUt2k8oNTZq0YxWzRq02e8sA7ajVRk7OkS9GMRG9ek2N0xVG4oOEU/D4Or3Cf7hZdwGc7jSwEFk3syLP4YJ9G8QxAuYEuXP/PEF0SDp4jzRYcf3LnQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector10001; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=NEuNJU4aQLsY4xYV/WH761Np6oaBMqZQPHN1FkDZygA=; b=guwE0iIDJX7K3EcvtxDNIuBBFx2C3l8u84IimBBgZkZkoDxTY7tAZttaJ6MQ6XJ7LpF4PdaJNwV49g1Rep1YwGhh8CQeNmqPQrDVZKmNOs5riUa8aiRVHxfJP0mHm2X3E6kS8yheO/M8T3doN0+mAtNtkN2I7DoXEp47bWZS9v+MirV6f1ex5E5DNam36fpaDnH74Irwbh4rGfiLTaUI9XqJi7B71XYQdr63b+y7wN795o3q0lY1Z6bafdjqHJhye4Ou/bt0ziCiPOzzBB98PEEWTwC2QZ0lMg7Xg7jtLwkKQzSkB9gjrhB3V0LaVgsmmmk2I5N8Ty7dtBSqF/rIMA== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass (sender ip is 165.204.84.17) smtp.rcpttodomain=vger.kernel.org smtp.mailfrom=amd.com; dmarc=pass (p=quarantine sp=quarantine pct=100) action=none header.from=amd.com; dkim=none (message not signed); arc=none (0) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=amd.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=NEuNJU4aQLsY4xYV/WH761Np6oaBMqZQPHN1FkDZygA=; b=bbjMoSvLXq1wjDBl6izSTgW31K2F6m8glFDUEqKvNpDsWC7S3DdnRKmc98CVqmXtk24c3/mh9i5Ru/kgZzLkBUstU63o+S8sBsez26ZPDC+5zLGJqMsHL39suBKCcfPhPpKdJd5C41C1UeOyd31PvHuRfo3gMZhyagDEAJ2UcyM= Received: from SN6PR2101CA0006.namprd21.prod.outlook.com (2603:10b6:805:106::16) by IA4PR12MB9788.namprd12.prod.outlook.com (2603:10b6:208:5d5::11) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.21.71.12; Thu, 28 May 2026 05:19:20 +0000 Received: from SN1PEPF00036F3D.namprd05.prod.outlook.com (2603:10b6:805:106:cafe::8e) by SN6PR2101CA0006.outlook.office365.com (2603:10b6:805:106::16) with Microsoft SMTP Server (version=TLS1_3, cipher=TLS_AES_256_GCM_SHA384) id 15.21.92.5 via Frontend Transport; Thu, 28 May 2026 05:19:19 +0000 X-MS-Exchange-Authentication-Results: spf=pass (sender IP is 165.204.84.17) smtp.mailfrom=amd.com; dkim=none (message not signed) header.d=none;dmarc=pass action=none header.from=amd.com; Received-SPF: Pass (protection.outlook.com: domain of amd.com designates 165.204.84.17 as permitted sender) receiver=protection.outlook.com; client-ip=165.204.84.17; helo=satlexmb07.amd.com; pr=C Received: from satlexmb07.amd.com (165.204.84.17) by SN1PEPF00036F3D.mail.protection.outlook.com (10.167.248.21) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.21.71.7 via Frontend Transport; Thu, 28 May 2026 05:19:19 +0000 Received: from purico-ed03host.amd.com (10.180.168.240) by satlexmb07.amd.com (10.181.42.216) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.2562.41; Thu, 28 May 2026 00:19:14 -0500 From: Suravee Suthikulpanit To: , , , CC: , , , , , , , , , , , , , Suravee Suthikulpanit Subject: [PATCH v2 16/26] iommu/amd: Introduce helper function for updating device ID mapping table Date: Thu, 28 May 2026 05:17:28 +0000 Message-ID: <20260528051738.596013-17-suravee.suthikulpanit@amd.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20260528051738.596013-1-suravee.suthikulpanit@amd.com> References: <20260528051738.596013-1-suravee.suthikulpanit@amd.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: satlexmb08.amd.com (10.181.42.217) To satlexmb07.amd.com (10.181.42.216) X-EOPAttributedMessage: 0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: SN1PEPF00036F3D:EE_|IA4PR12MB9788:EE_ X-MS-Office365-Filtering-Correlation-Id: fc93d1e6-579a-4624-eea9-08debc78abe1 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|1800799024|82310400026|36860700016|376014|7416014|22082099003|18002099003|3023799007|56012099006|11063799006; X-Microsoft-Antispam-Message-Info: tZ4zVsVKuS7S8yOzfBeUlbDctOKbQrlY9s8qmiemDi44w0GpvbUkqvZgUFaNVmgiQGp2oZG/De9gtGJeUArYQnzwotHLskcopOORfRdVV+fCm4ljE2gOiv0zBcm6mGh2Vdt1QMiasmBVCfk93bl+qgkbTP+2xMsmsfASD2pOjZAuE4Vl/3pssyTj81ShEvcUIGFGVvatj9E+w7qYuGu5pJPwFhcvHsQRvWlyEKvxg3dvLUhz353fpamzGfEtxCKI23defxyp59b8QvU6iOV/LDHRsvPf/ZVWfDDxAKrS2zYmMiacTXJJJyKAsbPonjq5+QArTIZy2Tt101zJrtLbBFMCFVz53XjWEPmGa9oiyS9pqN5QjOaW3OLWvWGbEfYgTn59ebcLtEKx47RWNqnINNXfq+VurTZmRgrBxc1t1GucWF6uULWnuGKxQayqX8gTfFgNgPYtmiUo16BsL8ZhCUYfmd3xNR1g+1YiizucVlD0StegKrgjyHIszj7Aiap3TUchENsMNTsNgdK77z9q88ytb5463sV7H7seMaS1+KnHOvEurXaFA0ql324OtwtN6hE6c6H1fqZQ9yFMFOy0HjFYh3dL0FvYqGwPi6kZuY0ep4epko6w1jAT40XoTBhzpT9wiIYLj5fTvgO86bB20utHLZCiU62nJa1pFjA8rQOzFM4iMy721IKm8lBonU3wADw0i9KcJB9unOBWSU1f6tUA/kD9TFXcZnlxpBK17p8= X-Forefront-Antispam-Report: CIP:165.204.84.17;CTRY:US;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:satlexmb07.amd.com;PTR:InfoDomainNonexistent;CAT:NONE;SFS:(13230040)(1800799024)(82310400026)(36860700016)(376014)(7416014)(22082099003)(18002099003)(3023799007)(56012099006)(11063799006);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: w/m4g25X7YJFGxJSj8KfmtL3A62ChjNkpYNVxNCYU0VrOFq9DwKgC7H6f3UthEv+2VcfAac9WpFbLhr6+8xK0CkC75rMzCMAhkZhE7e3Fcv/h421vJb7nlSEqpI+O+t/Oyin0Lme1dncAg0fnTrDl+ObRo23UcA4w/NFZKIbAAVmviCUET38iPIZN2zcmWpuJPOtJAF6k1Uo6MY49P1ch75FgNCgtmjJ5zJsa5kx7MMi6avzagNdZgR0BpFxJKGaCTESr+UNZ3ohVlxC+tmg2qIoKm3dBl6G/cgKvj8IavnpEWiEJ0KZHHeH7hHKA76zQvrigmzhPiPrCiu2DinjVV2xb9P5/55zgIVuCZYl9vr7wah05BwZ0crqOWS5nVcYkh6R5Ov02o5ea/vD3XDAhIwvVz7XFbZm2hch5kDYThv9/H7aPXJuRXiWnS9hyurU X-OriginatorOrg: amd.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 28 May 2026 05:19:19.8350 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: fc93d1e6-579a-4624-eea9-08debc78abe1 X-MS-Exchange-CrossTenant-Id: 3dd8961f-e488-4e60-8e11-a82d994e183d X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp: TenantId=3dd8961f-e488-4e60-8e11-a82d994e183d;Ip=[165.204.84.17];Helo=[satlexmb07.amd.com] X-MS-Exchange-CrossTenant-AuthSource: SN1PEPF00036F3D.namprd05.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Anonymous X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: IA4PR12MB9788 Content-Type: text/plain; charset="utf-8" AMD vIOMMU hardware uses the Device ID mapping table to map Guest Device ID (GDevID) to Host Device ID when it virtualises guest IOMMU commands. It uses GID and GDevID to indexe into the table to look up host device ID. Linux IOMMU driver programs the table entry using VFCntlMMIO Guest Device Map Control Register. Introduce amd_viommu_set/clear_device_mapping(), which are used to set the entry when initialize the IOMMUFD vDevice. Clearing the entry is done during VM destroy. Signed-off-by: Suravee Suthikulpanit --- drivers/iommu/amd/amd_viommu.h | 8 ++++++ drivers/iommu/amd/iommufd.c | 3 ++ drivers/iommu/amd/viommu.c | 52 ++++++++++++++++++++++++++++++++++ 3 files changed, 63 insertions(+) diff --git a/drivers/iommu/amd/amd_viommu.h b/drivers/iommu/amd/amd_viommu.h index b6fd5ffc3b82..3a8f41baaab9 100644 --- a/drivers/iommu/amd/amd_viommu.h +++ b/drivers/iommu/amd/amd_viommu.h @@ -20,6 +20,9 @@ void amd_viommu_uninit_one(struct amd_iommu *iommu, struc= t amd_iommu_viommu *vio =20 int amd_viommu_domain_id_update(struct amd_iommu *iommu, u16 gid, u16 hdom_id, u16 gdom_id); + +void amd_viommu_set_device_mapping(struct amd_iommu *iommu, u16 hDevId, + u16 guestId, u16 gDevId); #else =20 static inline int amd_viommu_init(struct amd_iommu *iommu) @@ -45,6 +48,11 @@ static inline void amd_viommu_uninit_one(struct amd_iomm= u *iommu, struct amd_iom { } =20 +static inline void amd_viommu_set_device_mapping(struct amd_iommu *iommu, = u16 hDevId, + u16 guestId, u16 gDevId) +{ +} + #endif /* CONFIG_AMD_IOMMU_IOMMUFD */ =20 #endif /* AMD_VIOMMU_H */ diff --git a/drivers/iommu/amd/iommufd.c b/drivers/iommu/amd/iommufd.c index eb43d02371a8..6020f2caf445 100644 --- a/drivers/iommu/amd/iommufd.c +++ b/drivers/iommu/amd/iommufd.c @@ -137,6 +137,7 @@ static int _amd_viommu_vdevice_init(struct iommufd_vdev= ice *vdev) struct pci_dev *pdev =3D to_pci_dev(vdev->idev->dev); struct iommufd_viommu *viommu =3D vdev->viommu; struct amd_iommu_viommu *aviommu =3D container_of(viommu, struct amd_iomm= u_viommu, core); + struct amd_iommu *iommu =3D container_of(viommu->iommu_dev, struct amd_io= mmu, iommu); =20 if (!pdev) { pr_err("%s: not a PCI device\n", __func__); @@ -155,6 +156,8 @@ static int _amd_viommu_vdevice_init(struct iommufd_vdev= ice *vdev) pr_debug("%s: gid=3D%#x, hdev_id=3D%#x, gdev_id=3D%#x\n", __func__, dev_data->gid, pci_dev_id(pdev), dev_data->gDevId); =20 + amd_viommu_set_device_mapping(iommu, pci_dev_id(pdev), dev_data->gid, dev= _data->gDevId); + return 0; } =20 diff --git a/drivers/iommu/amd/viommu.c b/drivers/iommu/amd/viommu.c index 3f7c17d400d0..b3150f7bcec3 100644 --- a/drivers/iommu/amd/viommu.c +++ b/drivers/iommu/amd/viommu.c @@ -40,6 +40,7 @@ #define VIOMMU_DOMID_MAPPING_BASE 0x2000000000ULL #define VIOMMU_DOMID_MAPPING_ENTRY_SIZE (1 << 19) =20 +#define VIOMMU_VFCTRL_GUEST_DID_MAP_CONTROL0_OFFSET 0x00 #define VIOMMU_VFCTRL_GUEST_DID_MAP_CONTROL1_OFFSET 0x08 =20 LIST_HEAD(viommu_devid_map); @@ -369,6 +370,53 @@ static void __maybe_unused free_private_vm_region(stru= ct amd_iommu *iommu, u64 * *entry =3D NULL; } =20 +#define DEVID_ENTRY_GDEVID_MASK GENMASK_ULL(61, 46) +#define DEVID_ENTRY_HDEVID_MASK GENMASK_ULL(29, 14) +#define DEVID_ENTRY_WRITE BIT_ULL(63) +#define DEVID_ENTRY_VALID BIT_ULL(0) + +/* + * Program the DevID via VFCTRL registers + * This function will be called during VM init via VFIO. + */ +void amd_viommu_set_device_mapping(struct amd_iommu *iommu, u16 hDevId, + u16 guestId, u16 gDevId) +{ + u64 val; + u8 __iomem *vfctrl; + + pr_debug("%s: iommu_devid=3D%#x, gid=3D%#x, hDevId=3D%#x, gDevId=3D%#x\n", + __func__, pci_dev_id(iommu->dev), guestId, hDevId, gDevId); + + val =3D FIELD_PREP(DEVID_ENTRY_GDEVID_MASK, gDevId) | + FIELD_PREP(DEVID_ENTRY_HDEVID_MASK, hDevId) | + DEVID_ENTRY_WRITE | DEVID_ENTRY_VALID; + + vfctrl =3D VIOMMU_VFCTRL_MMIO_BASE(iommu, guestId); + + writeq(val, vfctrl + VIOMMU_VFCTRL_GUEST_DID_MAP_CONTROL0_OFFSET); +} + +/* + * Clear the DevID via VFCTRL registers + * This function will be called during VM destroy via VFIO. + */ +static void clear_device_mapping(struct amd_iommu *iommu, u16 guestId, u16= gDevId) +{ + u64 val; + u8 __iomem *vfctrl; + + /* + * Clear the DevID in VFCTRL registers + */ + val =3D FIELD_PREP(DEVID_ENTRY_GDEVID_MASK, gDevId) | + FIELD_PREP(DEVID_ENTRY_HDEVID_MASK, 0) | + DEVID_ENTRY_WRITE | DEVID_ENTRY_VALID; + + vfctrl =3D VIOMMU_VFCTRL_MMIO_BASE(iommu, guestId); + writeq(val, vfctrl + VIOMMU_VFCTRL_GUEST_DID_MAP_CONTROL0_OFFSET); +} + static void viommu_clear_mapping(struct amd_iommu *iommu, struct amd_iommu_viommu *aviommu) { @@ -383,6 +431,10 @@ static void viommu_clear_mapping(struct amd_iommu *iom= mu, */ for (i =3D 0; i <=3D VIOMMU_MAX_GDOMID; i++) amd_viommu_domain_id_update(iommu, gid, aviommu->parent->id, i); + + for (i =3D 0; i <=3D VIOMMU_MAX_GDEVID; i++) + clear_device_mapping(iommu, gid, i); + } =20 void amd_viommu_uninit_one(struct amd_iommu *iommu, struct amd_iommu_viomm= u *aviommu) --=20 2.34.1 From nobody Mon Jun 8 16:49:04 2026 Received: from MW6PR02CU001.outbound.protection.outlook.com (mail-westus2azon11012021.outbound.protection.outlook.com [52.101.48.21]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 51FDB31D367 for ; Thu, 28 May 2026 05:19:28 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=52.101.48.21 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1779945570; cv=fail; b=qd39SN57xCugkb8KJ/Gq/NUnnzj8ZqNOApjO3mLjiw20m6yxJ1ZfRa1jsQJKmumLe/a9qTiiIU3d9IRseRWNDggNlcYq717wAdd+81Lajlq5C8gWjK8MuWTGQ2lDd3+rV0aJX2ywzpksSK8HXc6NZ3pHB/CJjuLkj6n2tfVwyWc= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1779945570; c=relaxed/simple; bh=xZcRY8nknHRyQ8jR73yciPqIYBtft7gVPGk5MMp/xzI=; h=From:To:CC:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=kRiutO32F+zHldJysqyXwGobeD/Lp7RA76cA8cfmGl+PAEFEIL2yZYGQ4bhrcwjMuEpmPGGBBUbiFGGeBtmD9PX9RWw7NOSn4Lm6kNEo+3kmPrl13lpp3Y4aeewKBmCHAuSe7yrnX6ffNjleuM467Jow6hqzlonOmPVKBd1ANrA= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=amd.com; spf=fail smtp.mailfrom=amd.com; dkim=pass (1024-bit key) header.d=amd.com header.i=@amd.com header.b=f7rQjCPo; arc=fail smtp.client-ip=52.101.48.21 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=amd.com Authentication-Results: smtp.subspace.kernel.org; spf=fail smtp.mailfrom=amd.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=amd.com header.i=@amd.com header.b="f7rQjCPo" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=k2qkfv/G2/pW709vkLz3yJtOmbgm1UN2iGU0dATK/1JZwH9/XDlv2PEEiSLgG4dHajF3Hbus9cYjLCXCsVgb+qZM3w4Af+HElG+NEVDM49xsWX4Wi6wfZQ6vr6UYPjA6XqYh6aKEKribN9XRVxCARBa3yoUc/X6gCNdJPhyfFWmXMCHKtOU/5HebwZRktLFhz7Ct4uwKHGnSaWHfgECt8AAxE59cCNWwXnwPciJdOjbe4fwGeE45Z9NZWG3bLb51Cg1mss9Jlc889/yiCTL0dPiCCkoH0H5Hbtw7xccQBr1jbwhm+kT7CoG5QniA5DlWcBqO4/X9PMQ1/gMQqgsIPA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector10001; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=liUs//QCuBPnucrw5CaCgDgeIefNCbpXhRv3NtHnkv4=; b=uAsFkJwPw5uFIRkGEXcvQGhu4oWatjQFVoA7/TbYb3GXf4GMe9lchCE9/XDZ0hHPc6sbq5k1PAF0yAjzUESmpsXSShBHbZPglZ61L/TvOd88B6PmlzJVe0yQWRyVFgaAN/0uPj67OoSKNryPT5V+/0sF3c5lXJJxb1azfphVCW7IKHOKs4Kswc6A99XwUSxpNgsahFQ22tHu3rklfvFhLkVkbsbGXmu5+95y6zRMKf7mSsfPdiPZ2jsCsa6Uhg5vfwOT+OQjvMwmHgAO3DcGqWT6+pLE91x0k1WXJcIkWvLiSimapItXnkjBG0COPxX1I5Z8Bvka3DBRzhe+c6pNtg== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass (sender ip is 165.204.84.17) smtp.rcpttodomain=vger.kernel.org smtp.mailfrom=amd.com; dmarc=pass (p=quarantine sp=quarantine pct=100) action=none header.from=amd.com; dkim=none (message not signed); arc=none (0) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=amd.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=liUs//QCuBPnucrw5CaCgDgeIefNCbpXhRv3NtHnkv4=; b=f7rQjCPoxwDRfFmPOwk8GfdvcDKnstCxKzltJTFRmp0QTKvUCRNEiwfydOzNmRQZYIu8dEIBUKGQglnn2CfUohccizlDTIj5xWcWwpvYaUE/UePVJv2TY6jmeEI+/4oniwJb3Ta3Fs65HWSP3/Yi27q5wsHVBUDD+Wv/6bQCdNU= Received: from SN6PR2101CA0005.namprd21.prod.outlook.com (2603:10b6:805:106::15) by SA0PR12MB4397.namprd12.prod.outlook.com (2603:10b6:806:93::10) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.21.71.11; Thu, 28 May 2026 05:19:24 +0000 Received: from SN1PEPF00036F3D.namprd05.prod.outlook.com (2603:10b6:805:106:cafe::5a) by SN6PR2101CA0005.outlook.office365.com (2603:10b6:805:106::15) with Microsoft SMTP Server (version=TLS1_3, cipher=TLS_AES_256_GCM_SHA384) id 15.21.92.4 via Frontend Transport; Thu, 28 May 2026 05:19:24 +0000 X-MS-Exchange-Authentication-Results: spf=pass (sender IP is 165.204.84.17) smtp.mailfrom=amd.com; dkim=none (message not signed) header.d=none;dmarc=pass action=none header.from=amd.com; Received-SPF: Pass (protection.outlook.com: domain of amd.com designates 165.204.84.17 as permitted sender) receiver=protection.outlook.com; client-ip=165.204.84.17; helo=satlexmb07.amd.com; pr=C Received: from satlexmb07.amd.com (165.204.84.17) by SN1PEPF00036F3D.mail.protection.outlook.com (10.167.248.21) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.21.71.7 via Frontend Transport; Thu, 28 May 2026 05:19:24 +0000 Received: from purico-ed03host.amd.com (10.180.168.240) by satlexmb07.amd.com (10.181.42.216) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.2562.41; Thu, 28 May 2026 00:19:19 -0500 From: Suravee Suthikulpanit To: , , , CC: , , , , , , , , , , , , , Suravee Suthikulpanit Subject: [PATCH v2 17/26] iommu/amd: Pass KVM FD from userspace when initializing vIOMMU Date: Thu, 28 May 2026 05:17:29 +0000 Message-ID: <20260528051738.596013-18-suravee.suthikulpanit@amd.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20260528051738.596013-1-suravee.suthikulpanit@amd.com> References: <20260528051738.596013-1-suravee.suthikulpanit@amd.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: satlexmb08.amd.com (10.181.42.217) To satlexmb07.amd.com (10.181.42.216) X-EOPAttributedMessage: 0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: SN1PEPF00036F3D:EE_|SA0PR12MB4397:EE_ X-MS-Office365-Filtering-Correlation-Id: 3d1b150c-b19f-48de-9b1b-08debc78aeab X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|1800799024|36860700016|376014|7416014|82310400026|18002099003|22082099003|11063799006|56012099006; X-Microsoft-Antispam-Message-Info: H7B143QqUhuw1OZAQOv8P/cx29YQ5xrwKBrFlQHI77KD91ZHumS1luO5v6C6+Rvydp0tGCWmnk1md/mhLWLBE9s/VqHYFg5lgIkQRMHZr5bVzvyQvU/xB7yH35VDkXSJEgekAQI8itp98QYBVoXKeUKRbeWSZH2DYC8Qxri8OBc+WACFUu/MEarTpMg7SyYJIENCkVrJhLG2xGrpAOADXt/DvgLCy4/Da+liM0r0zNdnozhkOoh3yq39fJbuJFfG8QXYc49XJe+Ssr9iymxSUNQ3ZLf9w1/WMkwEogKFdNR63wwzRnKT9KzVcghhFsGUupSiWXP+1tn0FUP+iWQMrssE0d/Jbq9J6U3kgiyAdiWCHaEMtaIUHuQ1o2UfUCjkB1EhqWVHDsYEn12Z75Awi0NybgfIFqPJEIn3iDWrl00XRXbgK2BrvhaGipXB/C2rWp4p6+xEB5MC5FIHLXJgYDFqTKxwvZ22lq+DHyfolBZN78iZnMBziL2BD0uxfSPvpezykRbLVQ2XlcThxH0mNLyFxGnuYbSAvHZdZ+a7oFZM/IdXMeqk9nAyAzd8DcFzWQIBzkI9kiMIQy/FgEpMC3pYWeJcFy5owPKhcvze/tKrOacvt9jC+wBpMrw1vBRH0TWmfShVjs0W8bgjkyUkZZsbkVlnAn3GE85o3xpQjKfNPhCHLv9OdOnBo0mZA3U6C8TLGgP9KXQ00dIasABD1wiWkaXJKGWidJXyPM5gXgM= X-Forefront-Antispam-Report: CIP:165.204.84.17;CTRY:US;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:satlexmb07.amd.com;PTR:InfoDomainNonexistent;CAT:NONE;SFS:(13230040)(1800799024)(36860700016)(376014)(7416014)(82310400026)(18002099003)(22082099003)(11063799006)(56012099006);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: w+vEQPgJUOXj3dbinGxl6fVYwpFS3jQRaaW88PQSmDqoAw7xcuiDqMGcwehXHmnBc6Z4oYtrMjN5oboiKTmObJoOo7tJPeT45D6Pg7F3NuEH7DXlFi6g4wD/kRHlurMv7c3zaJgqYSPjrzGOl2Y0MoIuDD1Nzz5HIZHfUcX1YopGc2bz93vY7XuEeTMCeK0DhIxPvY84ICIyxAFxbWC3KaIVtXvmIhmP1jqu45yucVsJ1imJZlYbS3qhni5iqOQjAlezekeqbdq1rX0NoH1Shl/S3yIVrbD/dAK5bBK1g7hk5L8v4j10GcV9yzgre1LJu9RQKP5jS63BDYSptKuBL7ABx0Ls0RNyjAQaUE5h3MFV6EhOP6kx9TObj7lOyTEd2ugYEs8e4qNbFwbmOajK9oud2Y+iAfceHdTpb++ylqnTtA4kB/6FVrFvs+Yu2icO X-OriginatorOrg: amd.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 28 May 2026 05:19:24.5378 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: 3d1b150c-b19f-48de-9b1b-08debc78aeab X-MS-Exchange-CrossTenant-Id: 3dd8961f-e488-4e60-8e11-a82d994e183d X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp: TenantId=3dd8961f-e488-4e60-8e11-a82d994e183d;Ip=[165.204.84.17];Helo=[satlexmb07.amd.com] X-MS-Exchange-CrossTenant-AuthSource: SN1PEPF00036F3D.namprd05.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Anonymous X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: SA0PR12MB4397 Content-Type: text/plain; charset="utf-8" AMD HW-vIOMMU feature requires IOMMU driver to keep track of each guest. This information is used by AMD IOMMU driver to manage the following: * GID: Each guest is assigned a unique 16-bit Guest ID (GID), which is used to index into various data structures for configuring the hardware. * Translation-devid: Each guest has one GPA->SPA mapping, which requires one trans_devid to program the v1 page table in the DTE[trans_devid]. * Extended interrupt remapping: The AMD HW-vIOMMU uses AVIC to implement extended interrupt remapping to virtualize Event/PPR log interrupts. A KVM reference is neeed to get the AVIC vm_id. The KVM FD can be used for these purposes. Signed-off-by: Suravee Suthikulpanit --- drivers/iommu/amd/amd_iommu_types.h | 2 ++ drivers/iommu/amd/iommufd.c | 27 ++++++++++++++++++++++++++- include/uapi/linux/iommufd.h | 2 ++ 3 files changed, 30 insertions(+), 1 deletion(-) diff --git a/drivers/iommu/amd/amd_iommu_types.h b/drivers/iommu/amd/amd_io= mmu_types.h index 836d5cd08134..e9b49f0b9051 100644 --- a/drivers/iommu/amd/amd_iommu_types.h +++ b/drivers/iommu/amd/amd_iommu_types.h @@ -547,6 +547,8 @@ struct amd_iommu_viommu { struct protection_domain *parent; /* nest parent domain for this viommu */ struct list_head pdom_list; /* For protection_domain->viommu_list */ u16 gid; /* Guest ID for the vIOMMU */ + u32 kvmfd; /* KVM fd from VMM */ + void *kvm; /* Hold struct kvm pointer */ =20 /* * Per-vIOMMU guest domain ID to host domain ID mapping. diff --git a/drivers/iommu/amd/iommufd.c b/drivers/iommu/amd/iommufd.c index 6020f2caf445..7c7ef267088b 100644 --- a/drivers/iommu/amd/iommufd.c +++ b/drivers/iommu/amd/iommufd.c @@ -4,6 +4,8 @@ */ =20 #include +#include +#include =20 #include "iommufd.h" #include "amd_iommu.h" @@ -42,13 +44,27 @@ size_t amd_iommufd_get_viommu_size(struct device *dev, = enum iommu_viommu_type vi return VIOMMU_STRUCT_SIZE(struct amd_iommu_viommu, core); } =20 +static void *get_kvm_handler(u32 kvmfd) +{ + struct fd f; + + f =3D fdget(kvmfd); + + if (fd_empty(f)) { + pr_warn("%s: fdget failed\n", __func__); + return NULL; + } + + return fd_file(f)->private_data; +} + int amd_iommufd_viommu_init(struct iommufd_viommu *viommu, struct iommu_do= main *parent, const struct iommu_user_data *user_data) { int ret; phys_addr_t page_base; unsigned long flags; - struct iommu_viommu_amd data; + struct iommu_viommu_amd data =3D {}; struct protection_domain *pdom =3D to_pdomain(parent); struct amd_iommu *iommu =3D container_of(viommu->iommu_dev, struct amd_io= mmu, iommu); struct amd_iommu_viommu *aviommu =3D container_of(viommu, struct amd_iomm= u_viommu, core); @@ -81,6 +97,13 @@ int amd_iommufd_viommu_init(struct iommufd_viommu *viomm= u, struct iommu_domain * =20 aviommu->vfmmio_mmap_offset =3D data.out_vfmmio_mmap_offset; =20 + aviommu->kvm =3D get_kvm_handler(data.kvmfd); + if (aviommu->kvm =3D=3D NULL) { + pr_err("%s: Failed to get KVM handler (kvmfd=3D%#x)\n", __func__, data.k= vmfd); + ret =3D -EINVAL; + goto err_kvmfd; + } + /* Reset vIOMMU MMIOs to initialize the vIOMMU */ iommu_reset_vmmio(iommu, aviommu->gid); =20 @@ -94,6 +117,7 @@ int amd_iommufd_viommu_init(struct iommufd_viommu *viomm= u, struct iommu_domain * if (ret) goto err_init; =20 + aviommu->kvmfd =3D data.kvmfd; viommu->ops =3D &amd_viommu_ops; =20 spin_lock_irqsave(&pdom->lock, flags); @@ -102,6 +126,7 @@ int amd_iommufd_viommu_init(struct iommufd_viommu *viom= mu, struct iommu_domain * =20 return 0; err_init: +err_kvmfd: iommufd_viommu_destroy_mmap(&aviommu->core, aviommu->vfmmio_mmap_offset); err_mmap: amd_iommu_gid_free(iommu, aviommu->gid); diff --git a/include/uapi/linux/iommufd.h b/include/uapi/linux/iommufd.h index 0b7a3e5b057c..69aa44bba95a 100644 --- a/include/uapi/linux/iommufd.h +++ b/include/uapi/linux/iommufd.h @@ -1085,10 +1085,12 @@ struct iommu_viommu_tegra241_cmdqv { /** * struct iommu_viommu_amd - AMD vIOMMU Interface (IOMMU_VIOMMU_TYPE_AMD) * @out_vfmmio_mmap_offset: (out) mmap offset for vIOMMU VF-MMIO + * @kvmfd: KVM FD handler * @reserved: Must be zero */ struct iommu_viommu_amd { __aligned_u64 out_vfmmio_mmap_offset; + __u32 kvmfd; __u32 reserved; /* must be last */ }; =20 --=20 2.34.1 From nobody Mon Jun 8 16:49:04 2026 Received: from SN4PR0501CU005.outbound.protection.outlook.com (mail-southcentralusazon11011019.outbound.protection.outlook.com [40.93.194.19]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id B642631F983 for ; Thu, 28 May 2026 05:19:33 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=40.93.194.19 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1779945575; cv=fail; b=H0vL/8YkEftZ4JyDFMUp3hmq7Uvr7v/sI9mEsGkVUG79WvpgJZizz77maFEB6rnGnCxIjbu3MJ9scH2FANO2nm2TrO5M+9ZEy9aF+vwtZwdCRDDO1kV6p9RSyFk0eL9hhmiTpfF/LWnqSQPiRpOPj9sMHmBpnVE1CkBhMUYpQxM= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1779945575; c=relaxed/simple; bh=YFhIIfFwyfkoWBsvYcbSQ75H7zy0QCjWOEPERjUSIhA=; h=From:To:CC:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=oX9VjsNK5KdMqrmV6HQayn32IfikbqBLuiNzb6GLH30PWZYboPEiFhYxHmp5TEQxmAIa5LU1C8wTo/qRs7Uv4PvRAbRlWgAC8XZbT9D4cYu5HrL8LmTPrZ2cKQkCnlPN+QCbbgSzV1y/gWiQhFWipJlqud7tP0bp2DoxG+UcIi4= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=amd.com; spf=fail smtp.mailfrom=amd.com; dkim=pass (1024-bit key) header.d=amd.com header.i=@amd.com header.b=c2tS6rwJ; arc=fail smtp.client-ip=40.93.194.19 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=amd.com Authentication-Results: smtp.subspace.kernel.org; spf=fail smtp.mailfrom=amd.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=amd.com header.i=@amd.com header.b="c2tS6rwJ" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=iyjTvF+HFipiKDzDcz+wm5LgyMSpE+CQW1qDQj69rYJoKYqgw96kE0CerJDQLK+HnxX/Tn+/HoP2MPWy3xh5ha2IeEvE3+ylaYTCvt02qfVF+BXrtOZICUlX1+jzGfFaXL/1nZv/MfIWszFfrol6w0dqzi4v29tVv0ylYDnAXxxTMvb/Z8lJMSr9ts5xMwJqLAgxA/2RlMZWTAJW2yHu2VSUUCbpw+N4aU0o7mA1+Wux9dRl4RhgyStOcEUDjirz9aaVh9gNLhmph+8+cEMo7uYdInVm33YjW2ygrIBQVW0+Ai7c/azgJ+1VkHy08ECESE90qVwDpgU6/DOaFx6uwA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector10001; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=eFYA5+gAAJ91xWMxnfnIA0zz6rE5qyp16zoafBmyI60=; b=rv1iA/9df2xjogakztAQam5q+/gLLx2XXSlxztGW9WVZow3y0iKHz3kkr5040fWJy0Zy+stoCAIDdlx+dbDJHm5WlE1JiAzkNh1ltjSDOSFUl/nKnLqADuKDDLVpA37FnqdgaMbeiTuaQk0Li5Iraw6lfgxSn4K9VLDRwY8SovwrEjEh2ZDKaXgCV1C9Kt8ABtWPPvnhsGXfKxxDjgWJ3/oHsroZckzK7/JoIhOGjEVNeB7ANTo79/QgYOJEGHnRGahcSnmURjkaqGHEu6BQRNmw4EFztqXdBaWW4/SDhUK9B2IE6dsi392nzTldzR6h1dx3OU6or1u6qvlJV5jhYQ== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass (sender ip is 165.204.84.17) smtp.rcpttodomain=vger.kernel.org smtp.mailfrom=amd.com; dmarc=pass (p=quarantine sp=quarantine pct=100) action=none header.from=amd.com; dkim=none (message not signed); arc=none (0) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=amd.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=eFYA5+gAAJ91xWMxnfnIA0zz6rE5qyp16zoafBmyI60=; b=c2tS6rwJEUNEc/1nlYAui2VnixCZx5VKcpkKuAVtkO0b4iorW7acHCkpVN8ZbnrF+txkMhLGr9QcFE28vcflEpIxpi/2VDYEh/B+upNEimFKTlKnJ0r6egtOJbZEEpncPIVfK9lz7Lw0ofaJiAgqerGgjlbIQtJc4NKM5J+ZLBQ= Received: from PH7PR10CA0015.namprd10.prod.outlook.com (2603:10b6:510:23d::17) by SA1PR12MB8885.namprd12.prod.outlook.com (2603:10b6:806:376::22) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.21.71.12; Thu, 28 May 2026 05:19:29 +0000 Received: from SN1PEPF00036F3E.namprd05.prod.outlook.com (2603:10b6:510:23d:cafe::a6) by PH7PR10CA0015.outlook.office365.com (2603:10b6:510:23d::17) with Microsoft SMTP Server (version=TLS1_3, cipher=TLS_AES_256_GCM_SHA384) id 15.21.71.13 via Frontend Transport; Thu, 28 May 2026 05:19:29 +0000 X-MS-Exchange-Authentication-Results: spf=pass (sender IP is 165.204.84.17) smtp.mailfrom=amd.com; dkim=none (message not signed) header.d=none;dmarc=pass action=none header.from=amd.com; Received-SPF: Pass (protection.outlook.com: domain of amd.com designates 165.204.84.17 as permitted sender) receiver=protection.outlook.com; client-ip=165.204.84.17; helo=satlexmb07.amd.com; pr=C Received: from satlexmb07.amd.com (165.204.84.17) by SN1PEPF00036F3E.mail.protection.outlook.com (10.167.248.22) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.21.71.7 via Frontend Transport; Thu, 28 May 2026 05:19:29 +0000 Received: from purico-ed03host.amd.com (10.180.168.240) by satlexmb07.amd.com (10.181.42.216) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.2562.41; Thu, 28 May 2026 00:19:24 -0500 From: Suravee Suthikulpanit To: , , , CC: , , , , , , , , , , , , , Suravee Suthikulpanit Subject: [PATCH v2 18/26] iommu/amd: Add translation DTE and VFctrl TransDevID helpers Date: Thu, 28 May 2026 05:17:30 +0000 Message-ID: <20260528051738.596013-19-suravee.suthikulpanit@amd.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20260528051738.596013-1-suravee.suthikulpanit@amd.com> References: <20260528051738.596013-1-suravee.suthikulpanit@amd.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: satlexmb08.amd.com (10.181.42.217) To satlexmb07.amd.com (10.181.42.216) X-EOPAttributedMessage: 0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: SN1PEPF00036F3E:EE_|SA1PR12MB8885:EE_ X-MS-Office365-Filtering-Correlation-Id: 7406fb4e-aee4-4fa9-9243-08debc78b185 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|376014|7416014|36860700016|1800799024|82310400026|22082099003|18002099003|5023799004|11063799006|56012099006; X-Microsoft-Antispam-Message-Info: nzRLBy7fc/D7kZOTMHNFTyL6WEyu5zvcR1k36pzelYud5/WesUa0sq9hOfhN06yJvgF+VITs0IQL0f3oLGIqMNSykwdeqtRNLaz4lFHbsajQoBuQ1fG9//4RVBb5A7/fzpkyZ2tou5gVU4lAaD1V/jmOeIiuPUb5Ywpqmjfr5IuvtqqwYERmKZ9QC5va/dgAYBMUkIaxOm55qbFwujcm4pvM/EXzKJSE/JZCTxtY7wAzkvmTnMMiArVq785FWivx6I4zlX/qIP455Fesj7deD3FnWbu69tr9UOkXh7sYsWL1nyTtybRZ4QcdsCKn0fmgGpQszUQcnqzPYsEEZjmki7czsH1wJnQ/z+vJhGAp38hyf9XAZFWZyDPSZTjA6lB6BUC5Sjx1fgc4RwGoWqE5hKxaMc6jQ9bwq4KAWE+zSDkY9MTKlKTtvP0+QYJQ7q4mZrJ0usecxBOoRYGeQPUD3U/foNY8JOPELPb54nZE/RfYaGNHIOjvAPaF9zppTmcka8g8Nm7YspZvFg79IoiNeul9IN4V/qhOdGZx9kTVT/vR8gcrWCGUeMhBM6B2Ty5zjWn3P9MIsvJrmAGK0l4ybQtsZcF+mXFw7HgPiBRX2hifmxV/l0N8ws/oxTA3Z3/IuyU7ZzywSCb71dUAKdND9ImXMaaZpBASy+GpY6CNqKwxrTTei7rxj/kfdVT50ruHSjXtpaCXBlT7kEeNJhW2uzp57LqG/qDPmraY1QSflSc= X-Forefront-Antispam-Report: CIP:165.204.84.17;CTRY:US;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:satlexmb07.amd.com;PTR:InfoDomainNonexistent;CAT:NONE;SFS:(13230040)(376014)(7416014)(36860700016)(1800799024)(82310400026)(22082099003)(18002099003)(5023799004)(11063799006)(56012099006);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: Ds3yCwrL/2r7RND3mRRS8cLcT9+g1kIp/IK4Tajuyv8QQ7pcv9CWXGN6GdMCisILGd4YUiO8wP6L5DwXm77ekLDuGcy7V+p8YknSMEiJDP16g2Tztdr869rPTqUOHhe/7NmnFCGYv0wldCeFLLDyjKSQoxa4cqkRGipkir8AdL2ELN4pKkzn82rpuiu7YH6FDV97gPTFUPC4lFpzvOcdwGjmHicjtJaDvP7EAS2qGQsoW/V9sqNlo6h0iRLu2p4E8ADX4uS+I+evbohCBsIOHfcVRWsYnCtcT0489OxVJr4gJvQ5LYcRvvJwUOE/meU+aKHPRcSboZlfXnK9+qYRqlv2HtJbPifzInqjOSHJbJmJeD6JCPbV/EUz9GVvXfjUrbRjJTjICek7a71WdldOlw7mOxWMDcuZoyCpMrb7iVzjHF3fmGhnR5eceeqpIkoG X-OriginatorOrg: amd.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 28 May 2026 05:19:29.2998 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: 7406fb4e-aee4-4fa9-9243-08debc78b185 X-MS-Exchange-CrossTenant-Id: 3dd8961f-e488-4e60-8e11-a82d994e183d X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp: TenantId=3dd8961f-e488-4e60-8e11-a82d994e183d;Ip=[165.204.84.17];Helo=[satlexmb07.amd.com] X-MS-Exchange-CrossTenant-AuthSource: SN1PEPF00036F3E.namprd05.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Anonymous X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: SA1PR12MB8885 Content-Type: text/plain; charset="utf-8" The hardware vIOMMU uses a per-VM translate device ID (TransDevID) to index the host device table when guest IOMMU traffic needs GPA->SPA translation. The VF Control guest miscellaneous register tells the IOMMU which TransDevID to use; the corresponding device table entry (DTE) points at the nested IOMMU v1 page table that performs the walk from guest physical to system physical addresses. Add amd_iommu_set_translate_dte() and amd_iommu_clear_translate_dte() to install or clear that DTE for a given TransDevID slot, using the AMDv1 page table root and mode from the protection domain. Add amd_iommu_update_vfctrl_mmio_translate_devid() to publish the TransDevID in VFctrl guest-misc MMIO, and VIOMMU_VFCTRL_GUEST_MISC_CONTROL_OFFSET for the register offset. Signed-off-by: Suravee Suthikulpanit --- drivers/iommu/amd/amd_iommu.h | 7 ++++ drivers/iommu/amd/amd_iommu_types.h | 1 + drivers/iommu/amd/iommu.c | 51 +++++++++++++++++++++++++++++ 3 files changed, 59 insertions(+) diff --git a/drivers/iommu/amd/amd_iommu.h b/drivers/iommu/amd/amd_iommu.h index 1d8727c16840..d1640181b292 100644 --- a/drivers/iommu/amd/amd_iommu.h +++ b/drivers/iommu/amd/amd_iommu.h @@ -216,6 +216,13 @@ void amd_iommu_update_dte(struct amd_iommu *iommu, struct dev_table_entry *new); int amd_iommu_completion_wait(struct amd_iommu *iommu); =20 +void amd_iommu_set_translate_dte(struct amd_iommu *iommu, u16 gid, + struct protection_domain *pdom, + u32 devid); +void amd_iommu_clear_translate_dte(struct amd_iommu *iommu, u16 gid, u32 d= evid); +void amd_iommu_update_vfctrl_mmio_translate_devid(struct amd_iommu *iommu, + u16 gid, u32 trans_devid); + static inline void amd_iommu_make_clear_dte(struct iommu_dev_data *dev_data, struct dev_table= _entry *new) { diff --git a/drivers/iommu/amd/amd_iommu_types.h b/drivers/iommu/amd/amd_io= mmu_types.h index e9b49f0b9051..2d7bc791dbd9 100644 --- a/drivers/iommu/amd/amd_iommu_types.h +++ b/drivers/iommu/amd/amd_iommu_types.h @@ -495,6 +495,7 @@ extern bool amdr_ivrs_remap_support; /* VIOMMU stuff */ #define VIOMMU_VF_MMIO_ENTRY_SIZE 4096 #define VIOMMU_VFCTRL_MMIO_ENTRY_SIZE 64 +#define VIOMMU_VFCTRL_GUEST_MISC_CONTROL_OFFSET 0x10 =20 /* Host ioremap/request_mem_region sizes for VF / VF_CNTL BARs */ #define VIOMMU_VF_MMIO_MAP_SIZE 0x10000000UL diff --git a/drivers/iommu/amd/iommu.c b/drivers/iommu/amd/iommu.c index 44d20e598d85..6c4c4f62ddde 100644 --- a/drivers/iommu/amd/iommu.c +++ b/drivers/iommu/amd/iommu.c @@ -3242,6 +3242,57 @@ static bool amd_iommu_enforce_cache_coherency(struct= iommu_domain *domain) return true; } =20 +#if IS_ENABLED(CONFIG_AMD_IOMMU_IOMMUFD) + +void amd_iommu_update_vfctrl_mmio_translate_devid(struct amd_iommu *iommu, + u16 gid, u32 devid) +{ + writeq((devid & 0xFFFFULL) << 16, + VIOMMU_VFCTRL_MMIO_BASE(iommu, gid) + + VIOMMU_VFCTRL_GUEST_MISC_CONTROL_OFFSET); +} + +void amd_iommu_set_translate_dte(struct amd_iommu *iommu, u16 gid, + struct protection_domain *pdom, + u32 devid) +{ + u64 tmp0 =3D 0ULL, tmp1 =3D 0ULL; + struct pt_iommu_amdv1_hw_info pt_info; + struct dev_table_entry *dev_table =3D get_dev_table(iommu); + + pt_iommu_amdv1_hw_info(&pdom->amdv1, &pt_info); + + pr_debug("%s: gid=3D%#x, iommu_devid=3D%#x, devid=3D%#x, host_pt_root=3D%= #llx, mode=3D%#x\n", + __func__, gid, iommu->devid, devid, pt_info.host_pt_root, pt_info.mode); + + /* Setup DTE for v1 page table at the offset specified by devid */ + tmp0 |=3D FIELD_PREP(DTE_HOST_TRP, pt_info.host_pt_root >> 12); + tmp0 |=3D FIELD_PREP(DTE_MODE_MASK, pt_info.mode); + tmp0 |=3D (DTE_FLAG_IR | DTE_FLAG_IW | DTE_FLAG_TV | DTE_FLAG_V); + tmp1 |=3D FIELD_PREP(DTE_DOMID_MASK, pdom->id); + + dev_table[devid].data[0] =3D tmp0; + dev_table[devid].data[1] =3D tmp1; + + iommu_flush_dte(iommu, devid); + amd_iommu_completion_wait(iommu); +} + +void amd_iommu_clear_translate_dte(struct amd_iommu *iommu, u16 gid, u32 d= evid) +{ + struct dev_table_entry *dev_table =3D get_dev_table(iommu); + + pr_debug("%s: gid=3D%#x, iommu_devid=3D%#x, devid=3D%#x\n", + __func__, gid, iommu->devid, devid); + + dev_table[devid].data[0] =3D 0ULL; + dev_table[devid].data[1] =3D 0ULL; + + iommu_flush_dte(iommu, devid); + amd_iommu_completion_wait(iommu); +} +#endif /* CONFIG_AMD_IOMMU_IOMMUFD */ + const struct iommu_ops amd_iommu_ops =3D { .capable =3D amd_iommu_capable, .hw_info =3D amd_iommufd_hw_info, --=20 2.34.1 From nobody Mon Jun 8 16:49:04 2026 Received: from SN4PR2101CU001.outbound.protection.outlook.com (mail-southcentralusazon11012018.outbound.protection.outlook.com [40.93.195.18]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 8495D31618C for ; Thu, 28 May 2026 05:19:41 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=40.93.195.18 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1779945583; cv=fail; b=tBG2g4ty7+QnRZC13ygVzzffHPPaOnyjVswktanjY0x/nU5+TyqTx/TPsrmYEWUqBhcoXisMUB3orde6pKMdM0/DQCyB7FahI/o8OedKINcro39AVa28WC9E9HfzJ31AIPLAlhOQWi4lnO6DCp5oG9ufAG6DpYNFpm0qEZ74A3Y= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1779945583; c=relaxed/simple; bh=DIP/qiPCf+p79x8ghzHjMscMZeXDdLmG/mjqQDlD1DU=; h=From:To:CC:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=N1dSfq8P/6CrDuWH32mK32ZXbrEHJPiPB9PovTtEzSJvwOt8yAliQuh0hXlK5vvcF9HSp9mn3WXQM4NnqMnep06CScWbAtOlgtq7y89T2bF/0+nqZ3F0J9FX+roCRr3mLpILIi5REfvPQE9VvfekXQp6t6GszMwLNQ1ct0TmErg= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=amd.com; spf=fail smtp.mailfrom=amd.com; dkim=pass (1024-bit key) header.d=amd.com header.i=@amd.com header.b=rlQY93k/; arc=fail smtp.client-ip=40.93.195.18 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=amd.com Authentication-Results: smtp.subspace.kernel.org; spf=fail smtp.mailfrom=amd.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=amd.com header.i=@amd.com header.b="rlQY93k/" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=DN2k8kTEutvb2rsmknizmpjf4izeXR8FSdXlwTbwF6aTWCxtaBMwJTUR58DSyCfvVMtsP7rmep4PlH9AYr4MC2qXnb3PTj1djswWS22LLr3sz0UgbeV+ZUgQ6p3GASZKke2hWy2P0HPyrHzibI67XD3f71g93w//OVaLJ4z3X2BZyzr3P7/yzY7nUmUixHM+5O1x7gHxGBkNwyU8VXoBsbFu3iKhenuegA24tCxZdyIn2LuZO2h+kICbuNvaMxu0XDf1Y9vNNK5Ys7qNAGiAEyTjjXdXN9n0SMpT9y6b58gkT1u8TJiCkhtOxxtM92oOVGXvwTe0NvDUy1EIFk64kw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector10001; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=dseA4dLyQyWo9i1aw8sZEb+1iHPWZohCzGb2+gs5MNg=; b=J4UhVtnWsRbtY9oC4v1YJrQZziumnVCTFmV6zn6NTDoNymXfg29rCq+V8EAUtqqy+i/SgLJIx99Mroom7zUP6VBkEjZEiR2IPp1QOV2IBz1qyYdIFheEdJDF7vTRktGCDeGj2sLkcl4ccEG+wUpG97I1au/wXB05UkTu5TKoPWym6bPe9KtksZylfjtiIEW2nJa7Ky6PPQjan95zdpIZzf7AR9phg2ST74NUZL5rUsIEQ7yYWlv3B95gK2uWD+d993y6m6dYmKddruaByiepi/RhqEt1BWQ/UeL7Uvxt6kFuOhZoXq2nZWoegJ783Rptw3foZwr5lrUe8zZnpyveqg== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass (sender ip is 165.204.84.17) smtp.rcpttodomain=vger.kernel.org smtp.mailfrom=amd.com; dmarc=pass (p=quarantine sp=quarantine pct=100) action=none header.from=amd.com; dkim=none (message not signed); arc=none (0) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=amd.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=dseA4dLyQyWo9i1aw8sZEb+1iHPWZohCzGb2+gs5MNg=; b=rlQY93k/ixVKEFTdfdcHqGrffH2mne8wVYz8BLUKoVgkvLsk6YlugXSysxrH7yLJUUi/Ul7QDKCn1IsvX4Z1XJq3hpELKOfpZpM0KqTZVPryORQHz9SWO0H4yEEdB5M2cv0ArIQV3TJvcre76uS6gWNdAZJwFaUoNiIcX7JicA0= Received: from SN6PR05CA0016.namprd05.prod.outlook.com (2603:10b6:805:de::29) by IA1PR12MB6041.namprd12.prod.outlook.com (2603:10b6:208:3d7::16) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.21.71.12; Thu, 28 May 2026 05:19:34 +0000 Received: from SN1PEPF00036F43.namprd05.prod.outlook.com (2603:10b6:805:de:cafe::53) by SN6PR05CA0016.outlook.office365.com (2603:10b6:805:de::29) with Microsoft SMTP Server (version=TLS1_3, cipher=TLS_AES_256_GCM_SHA384) id 15.21.92.5 via Frontend Transport; Thu, 28 May 2026 05:19:34 +0000 X-MS-Exchange-Authentication-Results: spf=pass (sender IP is 165.204.84.17) smtp.mailfrom=amd.com; dkim=none (message not signed) header.d=none;dmarc=pass action=none header.from=amd.com; Received-SPF: Pass (protection.outlook.com: domain of amd.com designates 165.204.84.17 as permitted sender) receiver=protection.outlook.com; client-ip=165.204.84.17; helo=satlexmb07.amd.com; pr=C Received: from satlexmb07.amd.com (165.204.84.17) by SN1PEPF00036F43.mail.protection.outlook.com (10.167.248.27) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.21.71.7 via Frontend Transport; Thu, 28 May 2026 05:19:33 +0000 Received: from purico-ed03host.amd.com (10.180.168.240) by satlexmb07.amd.com (10.181.42.216) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.2562.41; Thu, 28 May 2026 00:19:29 -0500 From: Suravee Suthikulpanit To: , , , CC: , , , , , , , , , , , , , Suravee Suthikulpanit Subject: [PATCH v2 19/26] iommu/amd: Add per-segment translate device ID pool Date: Thu, 28 May 2026 05:17:31 +0000 Message-ID: <20260528051738.596013-20-suravee.suthikulpanit@amd.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20260528051738.596013-1-suravee.suthikulpanit@amd.com> References: <20260528051738.596013-1-suravee.suthikulpanit@amd.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: satlexmb08.amd.com (10.181.42.217) To satlexmb07.amd.com (10.181.42.216) X-EOPAttributedMessage: 0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: SN1PEPF00036F43:EE_|IA1PR12MB6041:EE_ X-MS-Office365-Filtering-Correlation-Id: a997875f-3192-41b5-18fd-08debc78b44f X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|82310400026|376014|7416014|1800799024|36860700016|18002099003|22082099003|3023799007|11063799006|56012099006; X-Microsoft-Antispam-Message-Info: 7BtoRG454QiY6w7Rc9aTlH4pKilurFP2nlCfTYbTV36bE96lRkGddPQgXrY0numNs4rcUO8bE8wMuFZJN//Ztp0lz6UbnmQLsgeVpzK+U6cZCcVveixTKr8WtubpXLthYrkUPPHFv7u6MpgXcNYXySVzhW6qySXKnAFlWSOKYcY6KTPHyvbKWFJwyrXHH6LNLHU2rr4fLF5sYb+1T7vOyaCqlLwl2sFWp2ZmqRQS6hFWug5uxa50yZqyYX8qNJDIjs/ENriQw1ef4RvdThQOZOVq65jHSVuKqB8PDd8UT27qMN9h0+ueuKWw012lQNNu9rObfUHwnaSFhw+JPufjWJWkTsBLze9OuThVaACSCeZDem7vOG+1Wo7E/x+SV4uEvcxRkHKWiXUm6DzLdzwiNsei07TgLpAvnlAr3pbVCfVU4Bg6Iq8Qx2btVvnGemBrWoBBjVOmzxWWnTPcm7Hej4y5JasV46mCcKPblSu6Ocs62xsdXRvynTRLoTyZ5ivtfNzOWJTtrbxbss5vhwgR9V5OYVplihDkUelya9ltUtZyUR2NN2Hm9DV0ZW97A85hs+wcbLcbwtHxqMgnBCwSy3TDs+UC2/h2VtESjUAl+axhJxRycuudfxUITgiVHCo7U5MBmNiHlsUdw6FJRU4kT26LDTXh1ZCB2KwZYZUp1DB9sQ7HR/SDyydzyx9APVcoqto2ZEnU3wizNmflOZ2SN0K2cKt/7lCU2/K+/MKPMfA= X-Forefront-Antispam-Report: CIP:165.204.84.17;CTRY:US;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:satlexmb07.amd.com;PTR:InfoDomainNonexistent;CAT:NONE;SFS:(13230040)(82310400026)(376014)(7416014)(1800799024)(36860700016)(18002099003)(22082099003)(3023799007)(11063799006)(56012099006);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: 1Rdl693ZP3kIWuWWWRdsXwc8bC0Vb89hUM4oFrbImcdL6MxNDz6/2/+ZXvicpedkM31hYwTaPz+9JvNwVULLkuuLayhV4rioHh7lHDIiCkcBeEoYiBv1Pf3xaKoiera/wvvADCQWBh86C92r0ky1+nnP2vp6SyOJ72FbeXavTgR0DsKooWEqYDNtFHp373Usd/pXQSBOjzppm75FCwG878Be2x92q7SsymNl8TFkae611NlInwPPGzHQqkeR8vjMmGJzGlPGz6cf5lz4n2AWSV5Pmv9b/MnLxhlRa9w+1BAVkSSgtd0EfsERWv1r3B3q1sFtNzD6h5QjeMZCkYvSPUoX4HTszQEiejo3zjv8TniLxDPE0kCumWyLtxv8dB4k4HIE3jNB2v0oc22JJJ+sZBC1S3VyMhducmUkKIB1lf2pWGEfwkgrjR5DFIhq6/LB X-OriginatorOrg: amd.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 28 May 2026 05:19:33.9714 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: a997875f-3192-41b5-18fd-08debc78b44f X-MS-Exchange-CrossTenant-Id: 3dd8961f-e488-4e60-8e11-a82d994e183d X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp: TenantId=3dd8961f-e488-4e60-8e11-a82d994e183d;Ip=[165.204.84.17];Helo=[satlexmb07.amd.com] X-MS-Exchange-CrossTenant-AuthSource: SN1PEPF00036F43.namprd05.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Anonymous X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: IA1PR12MB6041 Content-Type: text/plain; charset="utf-8" Track translate-device-id slots per PCI segment so real PCI device IDs can be reserved for normal DTE programming and excluded from dynamic allocation for vIOMMU translation DTEs. Add amd_iommu_pci_seg_trans_devid_init/fini() during segment setup and teardown, amd_iommu_trans_devid_reserve() for attach-time reservation, and trans_devid.c implementing the xarray-backed state machine. Call the reserve hook from amd_iommu_attach_device() before programming the DTE. Signed-off-by: Suravee Suthikulpanit --- drivers/iommu/amd/Makefile | 2 +- drivers/iommu/amd/amd_iommu.h | 12 +++++ drivers/iommu/amd/amd_iommu_types.h | 17 ++++++ drivers/iommu/amd/init.c | 3 ++ drivers/iommu/amd/iommu.c | 12 +++++ drivers/iommu/amd/trans_devid.c | 80 +++++++++++++++++++++++++++++ 6 files changed, 125 insertions(+), 1 deletion(-) create mode 100644 drivers/iommu/amd/trans_devid.c diff --git a/drivers/iommu/amd/Makefile b/drivers/iommu/amd/Makefile index e1e824b9c7b0..12c3fe83e4ce 100644 --- a/drivers/iommu/amd/Makefile +++ b/drivers/iommu/amd/Makefile @@ -1,4 +1,4 @@ # SPDX-License-Identifier: GPL-2.0-only obj-y +=3D iommu.o init.o quirks.o ppr.o pasid.o -obj-$(CONFIG_AMD_IOMMU_IOMMUFD) +=3D iommufd.o nested.o viommu.o +obj-$(CONFIG_AMD_IOMMU_IOMMUFD) +=3D iommufd.o nested.o viommu.o trans_dev= id.o obj-$(CONFIG_AMD_IOMMU_DEBUGFS) +=3D debugfs.o diff --git a/drivers/iommu/amd/amd_iommu.h b/drivers/iommu/amd/amd_iommu.h index d1640181b292..d411bc326241 100644 --- a/drivers/iommu/amd/amd_iommu.h +++ b/drivers/iommu/amd/amd_iommu.h @@ -216,6 +216,18 @@ void amd_iommu_update_dte(struct amd_iommu *iommu, struct dev_table_entry *new); int amd_iommu_completion_wait(struct amd_iommu *iommu); =20 +/* Per-segment translate-device-id pool (CONFIG_AMD_IOMMU_IOMMUFD) */ +#ifdef CONFIG_AMD_IOMMU_IOMMUFD +void amd_iommu_pci_seg_trans_devid_init(struct amd_iommu_pci_seg *pci_seg); +void amd_iommu_pci_seg_trans_devid_fini(struct amd_iommu_pci_seg *pci_seg); +int amd_iommu_trans_devid_reserve(struct amd_iommu_pci_seg *pci_seg, u16 i= d); +#else +static inline void +amd_iommu_pci_seg_trans_devid_init(struct amd_iommu_pci_seg *pci_seg) { } +static inline void +amd_iommu_pci_seg_trans_devid_fini(struct amd_iommu_pci_seg *pci_seg) { } +#endif + void amd_iommu_set_translate_dte(struct amd_iommu *iommu, u16 gid, struct protection_domain *pdom, u32 devid); diff --git a/drivers/iommu/amd/amd_iommu_types.h b/drivers/iommu/amd/amd_io= mmu_types.h index 2d7bc791dbd9..ffa338c8735f 100644 --- a/drivers/iommu/amd/amd_iommu_types.h +++ b/drivers/iommu/amd/amd_iommu_types.h @@ -615,6 +615,14 @@ PT_IOMMU_CHECK_DOMAIN(struct protection_domain, iommu,= domain); PT_IOMMU_CHECK_DOMAIN(struct protection_domain, amdv1.iommu, domain); PT_IOMMU_CHECK_DOMAIN(struct protection_domain, amdv2.iommu, domain); =20 +#ifdef CONFIG_AMD_IOMMU_IOMMUFD +enum trans_devid_state { + TRANS_DEVID_FREE =3D 0, + TRANS_DEVID_RESERVED, + TRANS_DEVID_ALLOCATED, +}; +#endif + /* * This structure contains information about one PCI segment in the system. */ @@ -676,6 +684,15 @@ struct amd_iommu_pci_seg { * parsing time. */ struct list_head unity_map; + +#ifdef CONFIG_AMD_IOMMU_IOMMUFD + /* + * Per-segment translate-device-id allocation. The xarray is indexed by + * the translate-device-id. The value is the state (enum trans_devid_stat= e). + */ + struct mutex trans_devid_mutex; + struct xarray trans_devid_xa; +#endif }; =20 /* diff --git a/drivers/iommu/amd/init.c b/drivers/iommu/amd/init.c index 6e69b3dd8b1e..622bc0337eda 100644 --- a/drivers/iommu/amd/init.c +++ b/drivers/iommu/amd/init.c @@ -1737,6 +1737,8 @@ static struct amd_iommu_pci_seg *__init alloc_pci_seg= ment(u16 id, if (alloc_rlookup_table(pci_seg)) goto err_free_alias_table; =20 + amd_iommu_pci_seg_trans_devid_init(pci_seg); + return pci_seg; =20 err_free_alias_table: @@ -1768,6 +1770,7 @@ static void __init free_pci_segments(void) =20 for_each_pci_segment_safe(pci_seg, next) { list_del(&pci_seg->list); + amd_iommu_pci_seg_trans_devid_fini(pci_seg); free_irq_lookup_table(pci_seg); free_rlookup_table(pci_seg); free_alias_table(pci_seg); diff --git a/drivers/iommu/amd/iommu.c b/drivers/iommu/amd/iommu.c index 6c4c4f62ddde..2600af84c8ca 100644 --- a/drivers/iommu/amd/iommu.c +++ b/drivers/iommu/amd/iommu.c @@ -3055,6 +3055,18 @@ static int amd_iommu_attach_device(struct iommu_doma= in *dom, struct device *dev, if (dom->dirty_ops && !amd_iommu_hd_support(iommu)) return -EINVAL; =20 +#if IS_ENABLED(CONFIG_AMD_IOMMU_IOMMUFD) + /* Translate-device-id reservation must be done before setting up + * the DTE for the device to make sure that the id has not been allocated + * yet. (See amd_iommu_trans_devid_alloc().) + */ + ret =3D amd_iommu_trans_devid_reserve(iommu->pci_seg, dev_data->devid); + if (ret) { + pr_err("%s: Failed to reserve device id %#x\n", __func__, dev_data->devi= d); + return ret; + } +#endif + if (dev_data->domain) detach_device(dev); =20 diff --git a/drivers/iommu/amd/trans_devid.c b/drivers/iommu/amd/trans_devi= d.c new file mode 100644 index 000000000000..f15cbaae9118 --- /dev/null +++ b/drivers/iommu/amd/trans_devid.c @@ -0,0 +1,80 @@ +// SPDX-License-Identifier: GPL-2.0-only +/* + * Copyright (C) 2025 Advanced Micro Devices, Inc. + * + * AMD vIOMMU translate-device-id pool per PCI segment. + */ + +#include +#include + +#include "amd_iommu.h" + +static inline enum trans_devid_state trans_devid_xa_get_state(void *entry) +{ + if (!entry) + return TRANS_DEVID_FREE; + if (WARN_ON_ONCE(!xa_is_value(entry))) + return TRANS_DEVID_FREE; + return (enum trans_devid_state)xa_to_value(entry); +} + +static inline void *trans_devid_xa_mk_state(enum trans_devid_state s) +{ + return xa_mk_value((unsigned long)s); +} + +void amd_iommu_pci_seg_trans_devid_init(struct amd_iommu_pci_seg *pci_seg) +{ + mutex_init(&pci_seg->trans_devid_mutex); + xa_init(&pci_seg->trans_devid_xa); +} + +void amd_iommu_pci_seg_trans_devid_fini(struct amd_iommu_pci_seg *pci_seg) +{ + xa_destroy(&pci_seg->trans_devid_xa); +} + +/** + * amd_iommu_trans_devid_reserve - occupy @id so it is never returned by a= lloc + * + * Reservation is done when attaching device to a domain (see amd_iommu_at= tach_device()). + * + * Note: Since PCI hot-plug devices are enumerated during runtime, they co= uld clash + * with the translate-device-id allocation. In such case, amd_iommu_trans_= devid_reserve() + * could fail with %-EBUSY. This can be avoided by reserving the hot-plug = id range if it + * is known in advance. + * + * Return: 0 on success, %-EBUSY if @id is already allocated. A second res= erve of + * an already-reserved @id succeeds. + */ +int amd_iommu_trans_devid_reserve(struct amd_iommu_pci_seg *pci_seg, u16 i= d) +{ + void *entry, *old; + int ret =3D 0; + + mutex_lock(&pci_seg->trans_devid_mutex); + entry =3D xa_load(&pci_seg->trans_devid_xa, id); + switch (trans_devid_xa_get_state(entry)) { + case TRANS_DEVID_ALLOCATED: + ret =3D -EBUSY; + break; + case TRANS_DEVID_RESERVED: + break; + case TRANS_DEVID_FREE: + old =3D xa_store(&pci_seg->trans_devid_xa, id, + trans_devid_xa_mk_state(TRANS_DEVID_RESERVED), GFP_KERNEL); + if (xa_is_err(old)) { + ret =3D xa_err(old); + break; + } + WARN_ON_ONCE(old); + break; + } + mutex_unlock(&pci_seg->trans_devid_mutex); + + if (!ret) + pr_debug("%s: Reserved trans_devid %#x (seg %#x)\n", __func__, id, + pci_seg->id); + return ret; +} --=20 2.34.1 From nobody Mon Jun 8 16:49:04 2026 Received: from DM1PR04CU001.outbound.protection.outlook.com (mail-centralusazon11010000.outbound.protection.outlook.com [52.101.61.0]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 58B263176EE for ; Thu, 28 May 2026 05:19:44 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=52.101.61.0 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1779945586; cv=fail; b=IWk0wkLz4fxBQPVJAElilPwPtzFzywtLYWe/Wqp776vG9CiMf9YxvfW10p9T9FG9T+utZgSINchdhX5SY22lTLvjKUjK3o+gZx4dsb0q8+2dm5vlV2CnkoJB2aq2iNn3jlzitWtZEnPmfLHBtSFAU86cgrpFtr+KEV7MYz+U1/Q= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1779945586; c=relaxed/simple; bh=7jTN6pDPftsxuCcTtPKEcdmR4mup/b6LLVOYLuWGZqI=; h=From:To:CC:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=j3SNH3dC6Am3ZbI3T3G9UqkDhT5BuXERj9qwv82BVVlTl1iovykydYfc0C5T3w12PDT6xQzX+GQ776yAcgUI5sAlcwlDgWQEGvSDVAbhj6iSiajEUX42eH6LtK5GbQEqlwhiOpbx5ITOBxZ580LhhsOFP62+XbI4PXkyL40tr2I= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=amd.com; spf=fail smtp.mailfrom=amd.com; dkim=pass (1024-bit key) header.d=amd.com header.i=@amd.com header.b=B06TOyrp; arc=fail smtp.client-ip=52.101.61.0 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=amd.com Authentication-Results: smtp.subspace.kernel.org; spf=fail smtp.mailfrom=amd.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=amd.com header.i=@amd.com header.b="B06TOyrp" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=NKgGvuDv6D0ahMeEnrGa1/qrj1l2i0pof5919ROuj38LdYQ5UQxoxanCmnz1V0xrbblXtNRZabv/qU3kyDJgNri600pXZ9xyZrqrBed9vkd4u3Sga1ol2xJDQu5fiwO2X4BYSDFcjp9XOiIcuB0KoV+0HTAkUtqu1NbaJXJRM48OT/UZIF2zTiItuS6YafuHHpfF/MOIt3DZpTnKX5qTA19vrbt7sscJT8nC7NoG8kfwFg1aCN63Lo6P986hDtSzqSr7eCk0O6Iv8pqxLQygwqd8l5Z2h4o4UN3AkdJ7Nc33tj+lMxwYsBOlPHqwcjBexR/RWbWhWCc3vuSq/LLIDg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector10001; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=Oi3QrDtfIqcniS2971sGVoX17eJtytQBRYiFt8qLOaU=; b=JOWiJzMRO5SLGkhwYoLEyEfcjwdL7TmdjWA2bH0n/6QWdz7u8FxFh6lyHLeSP6p4itURdc3xX8ptPv5nDFbPQkdUZWj/ZzqB8XLygIn8oKEtdP+5JBpcA+OZMd8A9rGZWnsppOsmVppsfk5r1fp/uIMuYyjVwdoOcjHA4FjQHu7TqQAI7yO/spOGadk39gS+S1dBc0VrMn02HK5dhHvXxIDfEwXJSQOJRZc/1ti7pMg2z6z2Z1R9HJVAH2W6oySuhT3RHJNJGl+f1RIFE7kUCk9CHYTPxwNjAsKH40hHBW+8Ug4YmV4bkdhZ2sMf5b22vC1049b02wJ7kBUfK4IBeA== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass (sender ip is 165.204.84.17) smtp.rcpttodomain=vger.kernel.org smtp.mailfrom=amd.com; dmarc=pass (p=quarantine sp=quarantine pct=100) action=none header.from=amd.com; dkim=none (message not signed); arc=none (0) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=amd.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=Oi3QrDtfIqcniS2971sGVoX17eJtytQBRYiFt8qLOaU=; b=B06TOyrpLQAWR/gXbU9jafyz/Bos42vSWiTWMxK5a4MyScCvJkWHxrLOSz34b8Qu2y902PB+TPYBPA/gqkCIrxsLA9ziRORvVUe+0uvmIcYQlysZScj0rp/j6ZGEVZUf8+MV8wTBEillNzaI+MODIOWvxGK3ItOBQfilf74xBow= Received: from CH0PR04CA0017.namprd04.prod.outlook.com (2603:10b6:610:76::22) by LV8PR12MB9666.namprd12.prod.outlook.com (2603:10b6:408:296::19) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.21.48.17; Thu, 28 May 2026 05:19:39 +0000 Received: from CH3PEPF00000009.namprd04.prod.outlook.com (2603:10b6:610:76:cafe::85) by CH0PR04CA0017.outlook.office365.com (2603:10b6:610:76::22) with Microsoft SMTP Server (version=TLS1_3, cipher=TLS_AES_256_GCM_SHA384) id 15.21.71.13 via Frontend Transport; Thu, 28 May 2026 05:19:39 +0000 X-MS-Exchange-Authentication-Results: spf=pass (sender IP is 165.204.84.17) smtp.mailfrom=amd.com; dkim=none (message not signed) header.d=none;dmarc=pass action=none header.from=amd.com; Received-SPF: Pass (protection.outlook.com: domain of amd.com designates 165.204.84.17 as permitted sender) receiver=protection.outlook.com; client-ip=165.204.84.17; helo=satlexmb07.amd.com; pr=C Received: from satlexmb07.amd.com (165.204.84.17) by CH3PEPF00000009.mail.protection.outlook.com (10.167.244.36) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.21.71.7 via Frontend Transport; Thu, 28 May 2026 05:19:39 +0000 Received: from purico-ed03host.amd.com (10.180.168.240) by satlexmb07.amd.com (10.181.42.216) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.2562.41; Thu, 28 May 2026 00:19:33 -0500 From: Suravee Suthikulpanit To: , , , CC: , , , , , , , , , , , , , Suravee Suthikulpanit Subject: [PATCH v2 20/26] iommu/amd: Reserve translate-device-id for PCI requestor aliases Date: Thu, 28 May 2026 05:17:32 +0000 Message-ID: <20260528051738.596013-21-suravee.suthikulpanit@amd.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20260528051738.596013-1-suravee.suthikulpanit@amd.com> References: <20260528051738.596013-1-suravee.suthikulpanit@amd.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: satlexmb08.amd.com (10.181.42.217) To satlexmb07.amd.com (10.181.42.216) X-EOPAttributedMessage: 0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: CH3PEPF00000009:EE_|LV8PR12MB9666:EE_ X-MS-Office365-Filtering-Correlation-Id: 25851409-32b0-42a6-6c70-08debc78b753 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|36860700016|7416014|376014|1800799024|82310400026|22082099003|18002099003|11063799006|56012099006|5023799004|6133799003; X-Microsoft-Antispam-Message-Info: PBgAL4SuSj53jYoR7Z6tq7ebBxt0260qOw2BxdDv9qy/YlWPUXbQPg/sl07UXDN1uwohjmkF+pHn9mF/OdL5+nus+UWir00bphQ3DAHiUeG/REvTZ0w8XZuFmsUExTldyxM1/NbjjOI0t1LSoKw4LEUtdJwovn+WX/V5zV9S2nnosjFMX4Mrrz7kOqcJFjj3ZCPPmrshSB1O+TvAdrwo73td1UCLOoA12pNyi1kgX1BiIYg3LsvRVfjj8/zT/aMUjHJUKldcgVIOQgOqri79r3pYQPdmW51BHoNRcAT4N/mPOkmEAu7llT2u5IV5znRNN0fXfvvwRZpRCCQYx1hyNXBFR2zEwDc3zP63ylTZ40qm1DWUD+dyyO52EuMihtkf+0vTqWPWgkpGxc0QXf6Mvi3e0DGkIhqU9tOaam+/t8jhbsOYAK3XSLEhcMk2F2oeUQ0UpfmpGNP5kWmF5mm3KErn8RnPTCuvig2R/IeUtwMCFRNSbF6xuyVtsJzsPmVdVWh2YpjAzMxYoVytSopawIMP+tJtnwCW53565uQalnLxeet6YMutxtGr9btsQ2amurGTkLhlLH51BOE3IkFd9rfsPKUh+aWkbXsjt5uQsRlQu1TiVkEQOsjJvvPj7I3KGnALjzQvCAcO2tXbBOQ1Ez0oLU+VVt+Lf0UKLnEGcdH+HJYHyNtQko58JGYwZV6YZG3kcJypM2KrgBncqsBcc+DYAGCvuJ5ULfIZFql3lmw= X-Forefront-Antispam-Report: CIP:165.204.84.17;CTRY:US;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:satlexmb07.amd.com;PTR:InfoDomainNonexistent;CAT:NONE;SFS:(13230040)(36860700016)(7416014)(376014)(1800799024)(82310400026)(22082099003)(18002099003)(11063799006)(56012099006)(5023799004)(6133799003);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: rRKb6DznDWe4jTBzSyhHXJbBu6dsUC7FXYJSpw2lsmTSxF+quM7RUrG97IrnzAuW/giG0MxzHxM8vjLubOkljwNH6cLy5zrngrRCzbi0PJk7uaRwaaE/JqKB+N8/3zrM0jvWcjjCB0qNm967R1WgYZ0Vb1jiIjRX+9ZY84yK3aQOyqrYir+cc4NR4efTwAtaCUWNrlwKBFsUa5amUZzYuTONd30Tts4IE/H+tP2eByP+Cuzl3XR+/z1gf7A9SWC4GJxE4ArNFjtzCH57HKqKGBOiyN+4Y9teDhAYBmWNIY1qKd1H/sc+SCvLRNG8Tce5rfYlOP0VHewcW4lFbeT/4j+tdabdD/IfDiip0U7YThU0DqI0xrrd5vJpk1XGiVIJSsJ56W53krAyq8Iom03kogggb6yzFLiI1WmtxdhGz8G4WC+US3yhjkH7IoT5TdDI X-OriginatorOrg: amd.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 28 May 2026 05:19:39.0667 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: 25851409-32b0-42a6-6c70-08debc78b753 X-MS-Exchange-CrossTenant-Id: 3dd8961f-e488-4e60-8e11-a82d994e183d X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp: TenantId=3dd8961f-e488-4e60-8e11-a82d994e183d;Ip=[165.204.84.17];Helo=[satlexmb07.amd.com] X-MS-Exchange-CrossTenant-AuthSource: CH3PEPF00000009.namprd04.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Anonymous X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: LV8PR12MB9666 Content-Type: text/plain; charset="utf-8" The per-segment translate-device-id (trans_devid) pool hands out numeric device-table indices used by the AMD vIOMMU / iommufd path (e.g. mapping a KVM file descriptor to a shared trans_devid). amd_iommu_attach_device() already calls amd_iommu_trans_devid_reserve() for the struct device's own PCI BDF so that id cannot later be returned by the allocator. That is not sufficient on its own. The AMD IOMMU driver programs identical DMA translation device-table entries (DTEs) for every requestor ID that can issue DMA on behalf of the same PCI function: the IVRS alias from alias_table[] when it is not covered by the PCI DMA-alias walk (different bus than the device), and every alias visited by pci_for_each_dma_alias(). Those alternate BDFs are not separate struct device attach targets, so they never received a trans_devid reservation and could in principle collide with a dynamically allocated trans_devid. Introduce amd_iommu_trans_devid_reserve_pci_aliases() in trans_devid.c and invoke it from amd_iommu_attach_device() immediately after the primary amd_iommu_trans_devid_reserve() succeeds. For PCI devices the helper reserves the IVRS alias when it differs from the device BDF, then walks pci_for_each_dma_alias() and reserves each alias BDF. Repeated attach and overlap with the primary BDF in the PCI walk are handled by the existing idempotency of amd_iommu_trans_devid_reserve() (a second reserve of an already-reserved id succeeds). Signed-off-by: Suravee Suthikulpanit --- drivers/iommu/amd/amd_iommu.h | 2 ++ drivers/iommu/amd/iommu.c | 7 +++++ drivers/iommu/amd/trans_devid.c | 45 +++++++++++++++++++++++++++++++++ 3 files changed, 54 insertions(+) diff --git a/drivers/iommu/amd/amd_iommu.h b/drivers/iommu/amd/amd_iommu.h index d411bc326241..ddfc6329d235 100644 --- a/drivers/iommu/amd/amd_iommu.h +++ b/drivers/iommu/amd/amd_iommu.h @@ -221,6 +221,8 @@ int amd_iommu_completion_wait(struct amd_iommu *iommu); void amd_iommu_pci_seg_trans_devid_init(struct amd_iommu_pci_seg *pci_seg); void amd_iommu_pci_seg_trans_devid_fini(struct amd_iommu_pci_seg *pci_seg); int amd_iommu_trans_devid_reserve(struct amd_iommu_pci_seg *pci_seg, u16 i= d); +int amd_iommu_trans_devid_reserve_pci_aliases(struct amd_iommu *iommu, + struct device *dev); #else static inline void amd_iommu_pci_seg_trans_devid_init(struct amd_iommu_pci_seg *pci_seg) { } diff --git a/drivers/iommu/amd/iommu.c b/drivers/iommu/amd/iommu.c index 2600af84c8ca..2f9ca8f2d3c6 100644 --- a/drivers/iommu/amd/iommu.c +++ b/drivers/iommu/amd/iommu.c @@ -3065,6 +3065,13 @@ static int amd_iommu_attach_device(struct iommu_doma= in *dom, struct device *dev, pr_err("%s: Failed to reserve device id %#x\n", __func__, dev_data->devi= d); return ret; } + + ret =3D amd_iommu_trans_devid_reserve_pci_aliases(iommu, dev); + if (ret) { + pr_err("%s: Failed to reserve translate devid for alias of %#x (err %d)\= n", + __func__, dev_data->devid, ret); + return ret; + } #endif =20 if (dev_data->domain) diff --git a/drivers/iommu/amd/trans_devid.c b/drivers/iommu/amd/trans_devi= d.c index f15cbaae9118..76450d1735e2 100644 --- a/drivers/iommu/amd/trans_devid.c +++ b/drivers/iommu/amd/trans_devid.c @@ -6,6 +6,7 @@ */ =20 #include +#include #include =20 #include "amd_iommu.h" @@ -78,3 +79,47 @@ int amd_iommu_trans_devid_reserve(struct amd_iommu_pci_s= eg *pci_seg, u16 id) pci_seg->id); return ret; } + +static int reserve_trans_devid_each_dma_alias(struct pci_dev *pdev, u16 al= ias, + void *data) +{ + struct amd_iommu_pci_seg *pci_seg =3D data; + + (void)pdev; + return amd_iommu_trans_devid_reserve(pci_seg, alias); +} + +/** + * amd_iommu_trans_devid_reserve_pci_aliases - reserve translate-device-id= s for + * PCI DMA aliases and for the IVRS alias when it is not walked as a PCI D= MA + * alias (different bus). Idempotent for repeated attach; see + * amd_iommu_trans_devid_reserve(). + * + * Return: 0 on success or if @dev is not PCI; otherwise an errno from + * amd_iommu_trans_devid_reserve() or pci_for_each_dma_alias(). + */ +int amd_iommu_trans_devid_reserve_pci_aliases(struct amd_iommu *iommu, + struct device *dev) +{ + struct pci_dev *pdev; + struct amd_iommu_pci_seg *pci_seg; + u16 devid, ivrs_alias; + int ret; + + if (!dev_is_pci(dev)) + return 0; + + pdev =3D to_pci_dev(dev); + pci_seg =3D iommu->pci_seg; + devid =3D pci_dev_id(pdev); + + ivrs_alias =3D pci_seg->alias_table[devid]; + if (ivrs_alias !=3D devid) { + ret =3D amd_iommu_trans_devid_reserve(pci_seg, ivrs_alias); + if (ret) + return ret; + } + + return pci_for_each_dma_alias(pdev, reserve_trans_devid_each_dma_alias, + pci_seg); +} --=20 2.34.1 From nobody Mon Jun 8 16:49:04 2026 Received: from CH4PR04CU002.outbound.protection.outlook.com (mail-northcentralusazon11013011.outbound.protection.outlook.com [40.107.201.11]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id A0FA42DEA9D for ; Thu, 28 May 2026 05:19:49 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=40.107.201.11 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1779945591; cv=fail; b=gXum5hKd6gDGcC8J2tXUJGiMZTLtdQ2Z7fkJnzmIU5qtfAQj/2vCtf2kT+/i6osQlETS/Wr3cfJhA27tEiXzOlhRKUd2NKzssLHxaRtZpbfDRClEqK15fyTu7ukFRnGImwHQDnNhMpYc5yrObbVRWspZgBH+e3n/xKwwimr5fZc= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1779945591; c=relaxed/simple; bh=T5D+PGUFCjkqxYA5LWS60+0BfFwu87uSSaTjBQxDz4U=; h=From:To:CC:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=o4+nVCUfigdbtE35Wi98o9VliotIK0A1sOBnZCd+rgaN9njGsQjlMrZCLFlUGPrczUVpgSoNifjY5D4JwEuL7zDz7vLA6IPIDOl3FSSR1mS7vi1c3HmkYIXlWpDKrbBPh87q/KXFBb9eeEjTDBhlu9kFzv+VFwyZyThUxGRWWBQ= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=amd.com; spf=fail smtp.mailfrom=amd.com; dkim=pass (1024-bit key) header.d=amd.com header.i=@amd.com header.b=rfXDFQ1I; arc=fail smtp.client-ip=40.107.201.11 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=amd.com Authentication-Results: smtp.subspace.kernel.org; spf=fail smtp.mailfrom=amd.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=amd.com header.i=@amd.com header.b="rfXDFQ1I" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=GQvOBnt6aQzocPyhzApFjXS1UX2gwXKRPkrIm2mVDFwSbu0wpnEFcgeFQr8bTuM/+FWt3CxhSH/BM6Rk9re4HhqGl3oATNlHAHyoUAEq+tWYqZ1j9nUY/GX4iwkLrmLlgP0HMlQB5DuW/KY1DZCJMxkT6rUZHiTvK+vo52/zvybj8wjYADBIwft08KZbtilzEc8rZzBW4JxxJqu4ce2hirY3Znt3trqc3V19+INaqeSdqdSBMsR3dh4u/3JhZU5IrXFG04zV/FqsR9mptl0MWQxGhIgUZ062EQVMqc7Pih2HlemHNYT8QJ0x5EBzoQeomPsYdFlF3t3IiN9eW3+YwQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector10001; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=DyjVNi6k0FptJT2iprliP4IZu+50ZQRUBnjY7J2ouO4=; b=O49q8THfO1Q9Jme7zNtBZqn5EYK0PcGPpUXHo/xBaD+YT0U1AMAzCizw67CyVTafLOgg5J8xBB+IaFwIL8IEaMZ+LCGZQw0quvx6+YYJnFbMjPFVsfsyWfTqXd7BfE4SRUt+NRPvmikyCPF2fA63XNGyZhBVWglcHk90urqRWqWEzonlpAj1pZxGhOxlHg74ys6Z0ffsHDEWjObsxxTUSYFqSqLao7fi8iGLAL09krPPe5xehyZf4vcPKB8LGqTnL+VKTKfvFk/2niQSXufO9eCVmAcm9W8OMSam68k3ND42u4XqoC0pTNh+szr9j9yCCrv20Uh5CefyhrnsZ8I30Q== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass (sender ip is 165.204.84.17) smtp.rcpttodomain=vger.kernel.org smtp.mailfrom=amd.com; dmarc=pass (p=quarantine sp=quarantine pct=100) action=none header.from=amd.com; dkim=none (message not signed); arc=none (0) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=amd.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=DyjVNi6k0FptJT2iprliP4IZu+50ZQRUBnjY7J2ouO4=; b=rfXDFQ1Is0nNAzRNJ95tGG+hqXSO6lB+6WwtslG0B8TJteB7Qy+LgSZIuRQL6PkNZjykG0fNTdGgyQ6ZoVYtp/NQ2qTyLDsYzYe4uY2k/vuO4p/ryT5WNWyuquayKzws6ajRSA4HUedrFp7uiTrrmA5Rbc6QC2Y0KWxB8KNXTvQ= Received: from CH0PR04CA0017.namprd04.prod.outlook.com (2603:10b6:610:76::22) by DM6PR12MB4059.namprd12.prod.outlook.com (2603:10b6:5:215::14) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.21.71.13; Thu, 28 May 2026 05:19:44 +0000 Received: from CH3PEPF00000010.namprd04.prod.outlook.com (2603:10b6:610:76:cafe::2c) by CH0PR04CA0017.outlook.office365.com (2603:10b6:610:76::22) with Microsoft SMTP Server (version=TLS1_3, cipher=TLS_AES_256_GCM_SHA384) id 15.21.71.13 via Frontend Transport; Thu, 28 May 2026 05:19:43 +0000 X-MS-Exchange-Authentication-Results: spf=pass (sender IP is 165.204.84.17) smtp.mailfrom=amd.com; dkim=none (message not signed) header.d=none;dmarc=pass action=none header.from=amd.com; Received-SPF: Pass (protection.outlook.com: domain of amd.com designates 165.204.84.17 as permitted sender) receiver=protection.outlook.com; client-ip=165.204.84.17; helo=satlexmb07.amd.com; pr=C Received: from satlexmb07.amd.com (165.204.84.17) by CH3PEPF00000010.mail.protection.outlook.com (10.167.244.41) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.21.71.7 via Frontend Transport; Thu, 28 May 2026 05:19:43 +0000 Received: from purico-ed03host.amd.com (10.180.168.240) by satlexmb07.amd.com (10.181.42.216) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.2562.41; Thu, 28 May 2026 00:19:38 -0500 From: Suravee Suthikulpanit To: , , , CC: , , , , , , , , , , , , , Suravee Suthikulpanit Subject: [PATCH v2 21/26] iommu/amd: Map kvmfd to shared translate device ID for vIOMMU Date: Thu, 28 May 2026 05:17:33 +0000 Message-ID: <20260528051738.596013-22-suravee.suthikulpanit@amd.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20260528051738.596013-1-suravee.suthikulpanit@amd.com> References: <20260528051738.596013-1-suravee.suthikulpanit@amd.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: satlexmb08.amd.com (10.181.42.217) To satlexmb07.amd.com (10.181.42.216) X-EOPAttributedMessage: 0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: CH3PEPF00000010:EE_|DM6PR12MB4059:EE_ X-MS-Office365-Filtering-Correlation-Id: 7ad5af7a-6c8b-4a7c-06a1-08debc78ba39 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|1800799024|376014|82310400026|36860700016|7416014|56012099006|3023799007|11063799006|6133799003|22082099003|18002099003; X-Microsoft-Antispam-Message-Info: KAP1Ik0witLLXnD3JlNj9SxW26YrGBF34kCwQqMuBTBUcHN8qPC2z9kJG+b3dx9usuLiiRSy58EAJt2+eR8mAgQjXRNApWkfvJnFj0TfCNhAV+AlkqPrXfu6w8bmMV89pEV95zZAigyNtCAH7WEKMICv4UlP5CLCOyxTCvfKAVCjBCP0VN+4N+fnvxQeD7nVgxZIrF/G2am1w5LCTZHiNHeE7+KybzzKxFqnhgliXibWopRAw0sHVETm+Ja3hI2V+nVosivvaMArVzx3kz+iyTZ6mCDiTIYLfIinUyXu9VvcfWUW0A8OiiztSofyCbJcawGCSEgIsxK5OUorNR4FRhcfxlqqmOiKmRnpQ7uGNoKg8TG9SUoS9ZUlcHebe14v2YmQ3aqPgfbpOmwLQ/wiK5N8B2dB1RaJuDHqe5pEq5r9xIOLY2xsVE55jUQBkRmzWTwu4ve6PdkP+PcH/o26FCeT1dDQTENJl/QYq1OlM5kzjGV8kM9By6R4nMZncGswpelNOGMaxQBqLSyE2th5cIhbihFwQss1Ks59rNYDCsvvN+P7G3DID8f7AZo2yr3DDlsQF551lvLdvG31AGxQUsTP7bLdYUoJbJa4w8oBtAEMb0/5wWjLMh91Y36jtzlaEJUO2yR7ljo6gkdXgSMvY/kCOwewjWca/6intIu7nfCIWdYCgGfbz4lcFEFDCa1kg+hTY64LHwv5DirMfIYtX7RZpYPaAQ6Vb1HxZO0Is7Q= X-Forefront-Antispam-Report: CIP:165.204.84.17;CTRY:US;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:satlexmb07.amd.com;PTR:InfoDomainNonexistent;CAT:NONE;SFS:(13230040)(1800799024)(376014)(82310400026)(36860700016)(7416014)(56012099006)(3023799007)(11063799006)(6133799003)(22082099003)(18002099003);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: s8oqUSBN+X8HopAmsT9gYH7Wo5fhF5MV3jWK9ZTxtV2lUC+6q249d2kvbavT28NctfKMBrnU3tF1KbfbXVBP54cIVL+C5VGgWaA9amFHh4KM8oh7RDMaQtEXXScnkZwt2kNoaRL9mgXLonnPDSqnBK/BsEXSEZinP2SDsfo7Nys3aANnP9QcyLtOlza4IoOSEU+YckNd9G5ZayDgFx50az/NYb46aTGPfC5S+7kRjYjTevI1p6lvRwOxXCrpwMUQN1jeGk7tPBDppipQQ39Pe2/rkZDaF153/QXh0wHkHTpF6hD4MpPD8RDB8RcmgFJ9IhvwdXGo+S8jILjZnF+iwpcx2I7XaOU+jKjDiVsR2cyi2G78k/vqZiW9NOVc3vVODlySgSXg7oNPzdoL1b60oDNm+0MBwcbrOK0Z2zLBoE+e+j+8M9W9wpyoEgw2uyvN X-OriginatorOrg: amd.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 28 May 2026 05:19:43.9263 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: 7ad5af7a-6c8b-4a7c-06a1-08debc78ba39 X-MS-Exchange-CrossTenant-Id: 3dd8961f-e488-4e60-8e11-a82d994e183d X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp: TenantId=3dd8961f-e488-4e60-8e11-a82d994e183d;Ip=[165.204.84.17];Helo=[satlexmb07.amd.com] X-MS-Exchange-CrossTenant-AuthSource: CH3PEPF00000010.namprd04.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Anonymous X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: DM6PR12MB4059 Content-Type: text/plain; charset="utf-8" Add per-PCI-segment kvmfd xarray amd_iommu_kvmfd_trans_entry with refcounted so all vIOMMUs for one VM share one translate-device-id and GPA->SPA DTE. Expose helper functions: * amd_iommu_get_trans_devid_by_kvmfd() * amd_iommu_free_trans_devid_by_kvmfd() * amd_iommu_trans_devid_alloc() and extend segment init/fini for the kvmfd map. Wire iommufd vIOMMU init/destroy to obtain the ID, program the translation DTE and VFctrl TransDevID field, and tear down on error or uninit. Clear translation state in amd_viommu_uninit_one(). Signed-off-by: Suravee Suthikulpanit --- drivers/iommu/amd/amd_iommu.h | 4 + drivers/iommu/amd/amd_iommu_types.h | 13 ++ drivers/iommu/amd/iommu.c | 2 +- drivers/iommu/amd/iommufd.c | 18 ++- drivers/iommu/amd/trans_devid.c | 194 +++++++++++++++++++++++++++- drivers/iommu/amd/viommu.c | 3 + 6 files changed, 230 insertions(+), 4 deletions(-) diff --git a/drivers/iommu/amd/amd_iommu.h b/drivers/iommu/amd/amd_iommu.h index ddfc6329d235..cf2b051948a3 100644 --- a/drivers/iommu/amd/amd_iommu.h +++ b/drivers/iommu/amd/amd_iommu.h @@ -223,6 +223,10 @@ void amd_iommu_pci_seg_trans_devid_fini(struct amd_iom= mu_pci_seg *pci_seg); int amd_iommu_trans_devid_reserve(struct amd_iommu_pci_seg *pci_seg, u16 i= d); int amd_iommu_trans_devid_reserve_pci_aliases(struct amd_iommu *iommu, struct device *dev); +int amd_iommu_get_trans_devid_by_kvmfd(struct amd_iommu_pci_seg *pci_seg, + u32 kvmfd, u16 *trans_devid); +void amd_iommu_free_trans_devid_by_kvmfd(struct amd_iommu_pci_seg *pci_seg, + u32 kvmfd); #else static inline void amd_iommu_pci_seg_trans_devid_init(struct amd_iommu_pci_seg *pci_seg) { } diff --git a/drivers/iommu/amd/amd_iommu_types.h b/drivers/iommu/amd/amd_io= mmu_types.h index ffa338c8735f..92c83c68b2b1 100644 --- a/drivers/iommu/amd/amd_iommu_types.h +++ b/drivers/iommu/amd/amd_iommu_types.h @@ -559,6 +559,7 @@ struct amd_iommu_viommu { =20 u64 *devid_table; u64 *domid_table; + u16 trans_devid; =20 /* Offset for mmap() of guest VF MMIO; set after iommufd_viommu_alloc_mma= p(). */ unsigned long vfmmio_mmap_offset; @@ -621,6 +622,11 @@ enum trans_devid_state { TRANS_DEVID_RESERVED, TRANS_DEVID_ALLOCATED, }; + +struct amd_iommu_kvmfd_trans_entry { + refcount_t refs; + u16 trans_devid; +}; #endif =20 /* @@ -692,6 +698,13 @@ struct amd_iommu_pci_seg { */ struct mutex trans_devid_mutex; struct xarray trans_devid_xa; + + /* + * Per-segment kvmfd mapping. The xarray is indexed by the kvmfd. + * Values are struct amd_iommu_kvmfd_trans_entry * or xa_mk_value(trans_d= evid). + */ + struct mutex kvmfd_xa_mutex; + struct xarray kvmfd_xa; #endif }; =20 diff --git a/drivers/iommu/amd/iommu.c b/drivers/iommu/amd/iommu.c index 2f9ca8f2d3c6..2530c8e5490c 100644 --- a/drivers/iommu/amd/iommu.c +++ b/drivers/iommu/amd/iommu.c @@ -3058,7 +3058,7 @@ static int amd_iommu_attach_device(struct iommu_domai= n *dom, struct device *dev, #if IS_ENABLED(CONFIG_AMD_IOMMU_IOMMUFD) /* Translate-device-id reservation must be done before setting up * the DTE for the device to make sure that the id has not been allocated - * yet. (See amd_iommu_trans_devid_alloc().) + * yet. (See trans_devid_alloc() in trans_devid.c.) */ ret =3D amd_iommu_trans_devid_reserve(iommu->pci_seg, dev_data->devid); if (ret) { diff --git a/drivers/iommu/amd/iommufd.c b/drivers/iommu/amd/iommufd.c index 7c7ef267088b..23a2c8c20365 100644 --- a/drivers/iommu/amd/iommufd.c +++ b/drivers/iommu/amd/iommufd.c @@ -64,6 +64,7 @@ int amd_iommufd_viommu_init(struct iommufd_viommu *viommu= , struct iommu_domain * int ret; phys_addr_t page_base; unsigned long flags; + u16 trans_devid; struct iommu_viommu_amd data =3D {}; struct protection_domain *pdom =3D to_pdomain(parent); struct amd_iommu *iommu =3D container_of(viommu->iommu_dev, struct amd_io= mmu, iommu); @@ -104,9 +105,17 @@ int amd_iommufd_viommu_init(struct iommufd_viommu *vio= mmu, struct iommu_domain * goto err_kvmfd; } =20 + ret =3D amd_iommu_get_trans_devid_by_kvmfd(iommu->pci_seg, data.kvmfd, + &trans_devid); + if (ret) + goto err_kvmfd; + /* Reset vIOMMU MMIOs to initialize the vIOMMU */ iommu_reset_vmmio(iommu, aviommu->gid); =20 + amd_iommu_set_translate_dte(iommu, aviommu->gid, pdom, trans_devid); + amd_iommu_update_vfctrl_mmio_translate_devid(iommu, aviommu->gid, trans_d= evid); + ret =3D amd_viommu_init_one(iommu, aviommu); if (ret) goto err_init; @@ -117,6 +126,7 @@ int amd_iommufd_viommu_init(struct iommufd_viommu *viom= mu, struct iommu_domain * if (ret) goto err_init; =20 + aviommu->trans_devid =3D trans_devid; aviommu->kvmfd =3D data.kvmfd; viommu->ops =3D &amd_viommu_ops; =20 @@ -126,6 +136,9 @@ int amd_iommufd_viommu_init(struct iommufd_viommu *viom= mu, struct iommu_domain * =20 return 0; err_init: + amd_iommu_update_vfctrl_mmio_translate_devid(iommu, aviommu->gid, 0); + amd_iommu_clear_translate_dte(iommu, aviommu->gid, trans_devid); + amd_iommu_free_trans_devid_by_kvmfd(iommu->pci_seg, data.kvmfd); err_kvmfd: iommufd_viommu_destroy_mmap(&aviommu->core, aviommu->vfmmio_mmap_offset); err_mmap: @@ -147,10 +160,11 @@ static void amd_iommufd_viommu_destroy(struct iommufd= _viommu *viommu) list_del(&aviommu->pdom_list); spin_unlock_irqrestore(&pdom->lock, flags); xa_destroy(&aviommu->gdomid_array); - if (aviommu->vfmmio_mmap_offset) - iommufd_viommu_destroy_mmap(&aviommu->core, aviommu->vfmmio_mmap_offset); amd_iommu_gid_free(iommu, aviommu->gid); amd_viommu_uninit_one(iommu, aviommu); + if (aviommu->vfmmio_mmap_offset) + iommufd_viommu_destroy_mmap(&aviommu->core, aviommu->vfmmio_mmap_offset); + amd_iommu_free_trans_devid_by_kvmfd(iommu->pci_seg, aviommu->kvmfd); } =20 /* diff --git a/drivers/iommu/amd/trans_devid.c b/drivers/iommu/amd/trans_devi= d.c index 76450d1735e2..712e0aabcd94 100644 --- a/drivers/iommu/amd/trans_devid.c +++ b/drivers/iommu/amd/trans_devid.c @@ -2,15 +2,22 @@ /* * Copyright (C) 2025 Advanced Micro Devices, Inc. * - * AMD vIOMMU translate-device-id pool per PCI segment. + * AMD vIOMMU translate-device-id management. + * + * The id must be allocated from unused range. It is used to program the v= IOMMU VF Control + * register to specify the DTE used to contain the GPA->SPA mapping (v1 pa= ge table). */ =20 #include #include +#include +#include #include =20 #include "amd_iommu.h" =20 +static void trans_devid_free(struct amd_iommu_pci_seg *pci_seg, u16 id); + static inline enum trans_devid_state trans_devid_xa_get_state(void *entry) { if (!entry) @@ -29,10 +36,32 @@ void amd_iommu_pci_seg_trans_devid_init(struct amd_iomm= u_pci_seg *pci_seg) { mutex_init(&pci_seg->trans_devid_mutex); xa_init(&pci_seg->trans_devid_xa); + mutex_init(&pci_seg->kvmfd_xa_mutex); + xa_init(&pci_seg->kvmfd_xa); } =20 void amd_iommu_pci_seg_trans_devid_fini(struct amd_iommu_pci_seg *pci_seg) { + unsigned long index =3D 0; + void *e; + + while ((e =3D xa_find(&pci_seg->kvmfd_xa, &index, ULONG_MAX, XA_PRESENT))= ) { + unsigned long cur =3D index; + + if (xa_is_value(e)) + trans_devid_free(pci_seg, (u16)xa_to_value(e)); + else { + struct amd_iommu_kvmfd_trans_entry *entry =3D e; + + trans_devid_free(pci_seg, entry->trans_devid); + kfree(entry); + } + xa_erase(&pci_seg->kvmfd_xa, cur); + if (cur =3D=3D ULONG_MAX) + break; + index =3D cur + 1; + } + xa_destroy(&pci_seg->kvmfd_xa); xa_destroy(&pci_seg->trans_devid_xa); } =20 @@ -123,3 +152,166 @@ int amd_iommu_trans_devid_reserve_pci_aliases(struct = amd_iommu *iommu, return pci_for_each_dma_alias(pdev, reserve_trans_devid_each_dma_alias, pci_seg); } + +/** + * trans_devid_alloc - allocate a translate-device-id for @pci_seg + * + * The trans_devid is allocated from the highest id to the lowest id. + * Generally, the PCI devices enumerated from the beginning of the bus ran= ge. + * Therefore, ids in the high range are likely to not be used. + * + * Return: allocated id on success, negative errno on failure. + */ +static int trans_devid_alloc(struct amd_iommu_pci_seg *pci_seg) +{ + int id; + + mutex_lock(&pci_seg->trans_devid_mutex); + for (id =3D U16_MAX; id >=3D 0; id--) { + void *entry, *old; + + entry =3D xa_load(&pci_seg->trans_devid_xa, id); + if (entry) + continue; + + old =3D xa_store(&pci_seg->trans_devid_xa, id, + trans_devid_xa_mk_state(TRANS_DEVID_ALLOCATED), GFP_KERNEL); + if (xa_is_err(old)) { + int err =3D xa_err(old); + + mutex_unlock(&pci_seg->trans_devid_mutex); + return err; + } + WARN_ON_ONCE(old); + mutex_unlock(&pci_seg->trans_devid_mutex); + pr_debug("%s: Allocated trans_devid %#x (seg %#x)\n", __func__, id, + pci_seg->id); + return id; + } + pr_err("%s: No free trans_devid found (seg %#x)\n", __func__, pci_seg->id= ); + mutex_unlock(&pci_seg->trans_devid_mutex); + return -ENOSPC; +} + +static void trans_devid_free(struct amd_iommu_pci_seg *pci_seg, u16 id) +{ + void *old; + + mutex_lock(&pci_seg->trans_devid_mutex); + old =3D xa_erase(&pci_seg->trans_devid_xa, id); + if (WARN_ON_ONCE(!old || trans_devid_xa_get_state(old) =3D=3D TRANS_DEVID= _FREE)) + goto out; + pr_debug("%s: Freed trans_devid %#x (seg %#x)\n", __func__, id, pci_seg->= id); +out: + mutex_unlock(&pci_seg->trans_devid_mutex); +} + +/** + * amd_iommu_get_trans_devid_by_kvmfd - look up or allocate trans_devid fo= r @kvmfd + * + * If an entry already exists for @kvmfd, bumps its refcount and returns t= he same + * @trans_devid. Otherwise allocates a new translate devid, inserts an ent= ry with + * refcount 1, and returns it. + * + * Note: Each translate-device-id is allocated per VM (kvmfd) since there = is one + * GPA->SPA mapping per VM. In case of multiple vIOMMUs, all vIOMMUs share= the same + * translate-device-id. + * + * Return: 0 on success, %-ENOMEM on allocation failure, %-EIO if the map = holds an + * unexpected entry type. + */ +int amd_iommu_get_trans_devid_by_kvmfd(struct amd_iommu_pci_seg *pci_seg, = u32 kvmfd, + u16 *trans_devid) +{ + struct amd_iommu_kvmfd_trans_entry *entry; + void *prev; + int id, ret =3D 0; + + mutex_lock(&pci_seg->kvmfd_xa_mutex); + entry =3D xa_load(&pci_seg->kvmfd_xa, kvmfd); + if (entry) { + if (WARN_ON_ONCE(xa_is_value(entry))) { + ret =3D -EIO; + goto out_unlock; + } + refcount_inc(&entry->refs); + *trans_devid =3D entry->trans_devid; + pr_debug("%s: Got trans_devid %#x for kvmfd %#x (seg %#x)\n", + __func__, *trans_devid, kvmfd, pci_seg->id); + goto out_unlock; + } + + id =3D trans_devid_alloc(pci_seg); + if (id < 0) { + pr_err("%s: Failed to allocate trans_devid (kvmfd=3D%#x seg=3D%#x err=3D= %d)\n", + __func__, kvmfd, pci_seg->id, id); + ret =3D id; + goto out_unlock; + } + + entry =3D kzalloc(sizeof(*entry), GFP_KERNEL); + if (!entry) { + trans_devid_free(pci_seg, id); + ret =3D -ENOMEM; + goto out_unlock; + } + + refcount_set(&entry->refs, 1); + entry->trans_devid =3D id; + + prev =3D xa_store(&pci_seg->kvmfd_xa, kvmfd, entry, GFP_KERNEL); + if (xa_is_err(prev)) { + ret =3D xa_err(prev); + kfree(entry); + trans_devid_free(pci_seg, id); + goto out_unlock; + } + WARN_ON_ONCE(prev); + + *trans_devid =3D id; + pr_debug("%s: Allocated trans_devid %#x for kvmfd %#x (seg %#x)\n", + __func__, id, kvmfd, pci_seg->id); + +out_unlock: + mutex_unlock(&pci_seg->kvmfd_xa_mutex); + return ret; +} + +/** + * amd_iommu_free_trans_devid_by_kvmfd - drop one reference for @kvmfd + * + * Decrements the per-kvmfd refcount. The translate devid is returned to t= he + * segment pool and the map entry is removed only when the refcount reache= s zero. + */ +void amd_iommu_free_trans_devid_by_kvmfd(struct amd_iommu_pci_seg *pci_seg= , u32 kvmfd) +{ + struct amd_iommu_kvmfd_trans_entry *entry; + u16 tid; + + mutex_lock(&pci_seg->kvmfd_xa_mutex); + entry =3D xa_load(&pci_seg->kvmfd_xa, kvmfd); + if (!entry) { + mutex_unlock(&pci_seg->kvmfd_xa_mutex); + return; + } + + if (WARN_ON_ONCE(xa_is_value(entry))) { + mutex_unlock(&pci_seg->kvmfd_xa_mutex); + return; + } + + if (!refcount_dec_and_test(&entry->refs)) { + pr_debug("%s: kvmfd %#x, trans_devid %#x (seg %#x)\n", + __func__, kvmfd, entry->trans_devid, pci_seg->id); + mutex_unlock(&pci_seg->kvmfd_xa_mutex); + return; + } + + tid =3D entry->trans_devid; + trans_devid_free(pci_seg, tid); + xa_erase(&pci_seg->kvmfd_xa, kvmfd); + kfree(entry); + mutex_unlock(&pci_seg->kvmfd_xa_mutex); + pr_debug("%s: Freed trans_devid %#x for kvmfd %#x (seg %#x)\n", __func__,= tid, + kvmfd, pci_seg->id); +} diff --git a/drivers/iommu/amd/viommu.c b/drivers/iommu/amd/viommu.c index b3150f7bcec3..d2c883e314f8 100644 --- a/drivers/iommu/amd/viommu.c +++ b/drivers/iommu/amd/viommu.c @@ -449,6 +449,9 @@ void amd_viommu_uninit_one(struct amd_iommu *iommu, str= uct amd_iommu_viommu *avi VIOMMU_DOMID_MAPPING_BASE, VIOMMU_DOMID_MAPPING_ENTRY_SIZE, aviommu->gid); + + amd_iommu_update_vfctrl_mmio_translate_devid(iommu, aviommu->gid, 0); + amd_iommu_clear_translate_dte(iommu, aviommu->gid, aviommu->trans_devid); viommu_clear_mapping(iommu, aviommu); } =20 --=20 2.34.1 From nobody Mon Jun 8 16:49:04 2026 Received: from CY7PR03CU001.outbound.protection.outlook.com (mail-westcentralusazon11010019.outbound.protection.outlook.com [40.93.198.19]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 7E09B318B85 for ; Thu, 28 May 2026 05:19:55 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=40.93.198.19 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1779945597; cv=fail; b=ZOlWMejXNcgyJ+2oBKmTlj7u7/lu4maef0b70tUmRAKndsffZJiVQS+QF6oB5GMTv84wLyUIwIJU4jGxLA9UQ9gefQkl6Qd6iAq76Kz5GyVdyZvjJwjwwOnydn030/CpirS71VBTcQRepYKxnLGqmpcQbONHg5+R6oLeLp1zJuU= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1779945597; c=relaxed/simple; bh=iLFNT5uuof/cR0tkfkV0I3EawBYtNAfS/w4qqjE1chg=; h=From:To:CC:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=CoJcnaxCZ6jmPQjWcz4zGimtgbDW0ibRBAmxJ7H1U+6Jy29dRKbDSgwWnIASpS6G5myEA9JFOnrZUEWxD5iCToM39ryfPItth9mhhR3aAVpniDztioMVzYc3pildQQdyqnHnDSFX9+aj8FYtExhmHNWyPV1tDUvep3Yo8eCfjeY= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=amd.com; spf=fail smtp.mailfrom=amd.com; dkim=pass (1024-bit key) header.d=amd.com header.i=@amd.com header.b=2ON+th03; arc=fail smtp.client-ip=40.93.198.19 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=amd.com Authentication-Results: smtp.subspace.kernel.org; spf=fail smtp.mailfrom=amd.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=amd.com header.i=@amd.com header.b="2ON+th03" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=ysWHr2MMSmR2vPTmeLM287bx1u8DcdZoQRxhpXrNQOQfP1GSkKVomqzRrNh+UF/S92/oVljqHI6g0od8R6/ATsmLNmCE51Ws/wWvat5YQ8lIklMVnCMaRmuR488Ox0p8YqVHsh3j4el6yHHenwQoBr2WfRMmo2edQM1tqXbghvoLoJnw/C5+UpMcYXiO85dtNuJ6t8GEr8YIPzuSX2t8FaWdduFPCnQM0E8ILozE+RMDsUZzeik9U3ar/K1A1w3yKR9CAJUIQPbYhu2rfGp1jXm7PRpeWI4myoqKKC9qMwzfh1KugIUs6FnNtnjsoxrISFyuZqMEmyneaAiOW7dlqQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector10001; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=W7F06jwZqnK7p+n/QixpygG1qmq4KGtepiaBzCgZWaY=; b=BpXF4Kg2zjIKEhcERdxfVPNxQS1a4zkYfm9ROKsiTOtEpyyC1T2hnGUZqlHR8p87sDe9i6XLuCKrmGy/WDHsDdaU/wEC0TXN7z9c5SXGnaZZCllUCKu8m9y1ur/etmNAttjnTRH0ip4/uVB9KHrBCMSSwVfjKu3DartzdlQK0omcZj4r8HQJiVMC6UvgM8kiElN0bPiO9vPuasHTcFQihGuMv6yQpoPoJluwLU4Jgf49hX6WicV9AbZfDWCW0THeseO8tJLfgcL1TmKN3W+3USu+i/wvcS1SPWtwz1nWEHT5kNgvftP4a3JKrUWFHxwKFGCmPWIhwNf8d0vLnbAk8Q== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass (sender ip is 165.204.84.17) smtp.rcpttodomain=vger.kernel.org smtp.mailfrom=amd.com; dmarc=pass (p=quarantine sp=quarantine pct=100) action=none header.from=amd.com; dkim=none (message not signed); arc=none (0) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=amd.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=W7F06jwZqnK7p+n/QixpygG1qmq4KGtepiaBzCgZWaY=; b=2ON+th03/87fLxEjA6pEtI0U81WayvpSwUSPELh7AeSJEdmtU0vsQgcDKcE9mMPLcKfTV4Bq8Nocw7AW1wQcSXKp5NDfjsF/Sjfj6cc5qGSzhpaYQBLMBMuRTlsXeUaj2ega90JoK0k1ANz/eK7kPGLEgGOh5/CrMEPVDd3KhEY= Received: from CH0PR03CA0354.namprd03.prod.outlook.com (2603:10b6:610:11a::17) by DS7PR12MB9502.namprd12.prod.outlook.com (2603:10b6:8:250::19) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.21.71.13; Thu, 28 May 2026 05:19:48 +0000 Received: from CH3PEPF0000000C.namprd04.prod.outlook.com (2603:10b6:610:11a:cafe::8d) by CH0PR03CA0354.outlook.office365.com (2603:10b6:610:11a::17) with Microsoft SMTP Server (version=TLS1_3, cipher=TLS_AES_256_GCM_SHA384) id 15.21.71.13 via Frontend Transport; Thu, 28 May 2026 05:19:48 +0000 X-MS-Exchange-Authentication-Results: spf=pass (sender IP is 165.204.84.17) smtp.mailfrom=amd.com; dkim=none (message not signed) header.d=none;dmarc=pass action=none header.from=amd.com; Received-SPF: Pass (protection.outlook.com: domain of amd.com designates 165.204.84.17 as permitted sender) receiver=protection.outlook.com; client-ip=165.204.84.17; helo=satlexmb07.amd.com; pr=C Received: from satlexmb07.amd.com (165.204.84.17) by CH3PEPF0000000C.mail.protection.outlook.com (10.167.244.39) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.21.71.7 via Frontend Transport; Thu, 28 May 2026 05:19:47 +0000 Received: from purico-ed03host.amd.com (10.180.168.240) by satlexmb07.amd.com (10.181.42.216) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.2562.41; Thu, 28 May 2026 00:19:43 -0500 From: Suravee Suthikulpanit To: , , , CC: , , , , , , , , , , , , , Suravee Suthikulpanit Subject: [PATCH v2 22/26] iommufd: Add hw_queue_init and split queue alloc paths Date: Thu, 28 May 2026 05:17:34 +0000 Message-ID: <20260528051738.596013-23-suravee.suthikulpanit@amd.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20260528051738.596013-1-suravee.suthikulpanit@amd.com> References: <20260528051738.596013-1-suravee.suthikulpanit@amd.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: satlexmb08.amd.com (10.181.42.217) To satlexmb07.amd.com (10.181.42.216) X-EOPAttributedMessage: 0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: CH3PEPF0000000C:EE_|DS7PR12MB9502:EE_ X-MS-Office365-Filtering-Correlation-Id: bb0a947a-780d-4fdb-4622-08debc78bc9d X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|376014|7416014|1800799024|82310400026|36860700016|22082099003|18002099003|56012099006|11063799006; X-Microsoft-Antispam-Message-Info: ts6m3wWF5AQDseHO9EBaigo/fLuPVWtWimbnrtTneJSw53GxCTObt6u8HaUOHhX0d8Jo5AG1R+RqpZzCVqwfnFrGspzLdewrHJKzdOxk3QeP4uB37t88SvovccAMWwkm0rFczA3576r8+pDA4WFX0bcDeHjDOFO/rRmXhNTIAmfLQk3s2FgDLcK/dpuXAojA93/87/b6BNvWeLT/Yyz5vFRp33Mpbx7dw3ra/dUVd94lgA37JQdlG+SbafpnjT0TSVObpvvgfD2xAfVx5aaora4AV8Ua2xUmEfjgJbpLGGwsg4vTpP4LGOniLrIc50Cr25a6ftElWi0X/CS0SmLmV+rRn8giYEqfRAIqBs6r3M95RZW5oe06EHG9sr5x5310UbgBqbclF4tJ+vnrwc60KNk3QIlNrpKlXZM6GszBWTKcP5WvelS6kBC2TvdPMi5kYUMyvSW8h5on1GKWe6FmE2Jz4yAjbFMQFLvyWix/iHpeL4aCR9H8eH5Efe77xAEirQv5WbcRpaQqNtgHwWRXw3qSlgqn1PYB/0423R5mgzdUiFvOUZO6M2wTAc0zzLkc0eeHxn5sq4oGh4Qy0mFJfRKs6HXPUC6rOVf24g6slFOTC76vViA9ITQhrt6y1zVklnkYfJVdhlBkfQ9XQt/e1iuvw+215M2XnVzItjB0LVNP4k0h8yTZ9Cr6Z1EgQnNaIL2OUT28bR8WFAPINMw016Wycmu0D0PkBQqrMViuLT0= X-Forefront-Antispam-Report: CIP:165.204.84.17;CTRY:US;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:satlexmb07.amd.com;PTR:InfoDomainNonexistent;CAT:NONE;SFS:(13230040)(376014)(7416014)(1800799024)(82310400026)(36860700016)(22082099003)(18002099003)(56012099006)(11063799006);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: BxchjsE8YobIHm79jeTKY+pcKRGRP3pDw1WSvyL8rj2dhRpw901aMhIF6IYy1f5CwMGrHKRIcIy4OVwVWn8WmeBZ+JjOjmz18e3zdwHiRFrKLfTk58pfHj+/ZKk3Uo0DNeK9TiRloFAFwB1f9UjfmS/8YQOkCigTunCPhLEvbHTEkl0n5ctbXxprI7ZpvTh/35GyDfrlcnfO4eLFcQXdWkXV6PehI0NMg66esnch+ZeS55Uto9+VPguLdj2W68dBMZ9se6Ze08/6F9BUS0IiYiErwKxS/IyuEpjyeG3CMcvKrx7Ue1USqVxueKunKQIZSTw5rmt/NXpubu27ICCXlSGAp4MbOWQQEW/NMpifg4kg5HoispgNmgByDSfv3cqkvebH8M8yi+y0nztqNwN1d8YZLobnI2LcXNVM0x3tlubzFr10oNao6IBYRhEc/kHf X-OriginatorOrg: amd.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 28 May 2026 05:19:47.9395 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: bb0a947a-780d-4fdb-4622-08debc78bc9d X-MS-Exchange-CrossTenant-Id: 3dd8961f-e488-4e60-8e11-a82d994e183d X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp: TenantId=3dd8961f-e488-4e60-8e11-a82d994e183d;Ip=[165.204.84.17];Helo=[satlexmb07.amd.com] X-MS-Exchange-CrossTenant-AuthSource: CH3PEPF0000000C.namprd04.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Anonymous X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: DS7PR12MB9502 Content-Type: text/plain; charset="utf-8" Add iommufd_viommu_ops.hw_queue_init for vIOMMU backends whose hardware uses a guest physical queue base from hw_queue->base_addr instead of a host physical address. Previously, HW queue alloc always went through iommufd_hw_queue_alloc_phys(), an iommufd_access, and hw_queue_init_phys(base_pa). AMD vIOMMU instead takes GPA from userspace in hw_queue->base_addr and programs hardware without host PA resolution. Splitting helpers and dispatching from the ioctl keeps one uAPI while making the contract explicit. Each vIOMMU driver should implement only one of hw_queue_init_phys or hw_queue_init. Refactor iommufd_hw_queue_alloc_ioctl() so shared validation and viommu lookup stay in the ioctl, while setup is delegated to _iommufd_hw_queue_init_phys() or _iommufd_hw_queue_init(). Signed-off-by: Suravee Suthikulpanit --- drivers/iommu/iommufd/viommu.c | 125 +++++++++++++++++++++++---------- include/linux/iommufd.h | 5 +- 2 files changed, 91 insertions(+), 39 deletions(-) diff --git a/drivers/iommu/iommufd/viommu.c b/drivers/iommu/iommufd/viommu.c index 4081deda9b33..bc58d240fafd 100644 --- a/drivers/iommu/iommufd/viommu.c +++ b/drivers/iommu/iommufd/viommu.c @@ -353,62 +353,35 @@ iommufd_hw_queue_alloc_phys(struct iommu_hw_queue_all= oc *cmd, return ERR_PTR(rc); } =20 -int iommufd_hw_queue_alloc_ioctl(struct iommufd_ucmd *ucmd) +static int _iommufd_hw_queue_init_phys(struct iommufd_ucmd *ucmd, + struct iommufd_viommu *viommu) { struct iommu_hw_queue_alloc *cmd =3D ucmd->cmd; struct iommufd_hw_queue *hw_queue; - struct iommufd_viommu *viommu; struct iommufd_access *access; size_t hw_queue_size; phys_addr_t base_pa; - u64 last; int rc; =20 - if (cmd->flags || cmd->type =3D=3D IOMMU_HW_QUEUE_TYPE_DEFAULT) - return -EOPNOTSUPP; - if (!cmd->length) - return -EINVAL; - if (check_add_overflow(cmd->nesting_parent_iova, cmd->length - 1, - &last)) - return -EOVERFLOW; - - viommu =3D iommufd_get_viommu(ucmd, cmd->viommu_id); - if (IS_ERR(viommu)) - return PTR_ERR(viommu); - - if (!viommu->ops || !viommu->ops->get_hw_queue_size || - !viommu->ops->hw_queue_init_phys) { - rc =3D -EOPNOTSUPP; - goto out_put_viommu; - } - hw_queue_size =3D viommu->ops->get_hw_queue_size(viommu, cmd->type); - if (!hw_queue_size) { - rc =3D -EOPNOTSUPP; - goto out_put_viommu; - } + if (!hw_queue_size) + return -EOPNOTSUPP; =20 /* * It is a driver bug for providing a hw_queue_size smaller than the * core HW queue structure size */ - if (WARN_ON_ONCE(hw_queue_size < sizeof(*hw_queue))) { - rc =3D -EOPNOTSUPP; - goto out_put_viommu; - } + if (WARN_ON_ONCE(hw_queue_size < sizeof(*hw_queue))) + return -EOPNOTSUPP; =20 hw_queue =3D (struct iommufd_hw_queue *)_iommufd_object_alloc_ucmd( ucmd, hw_queue_size, IOMMUFD_OBJ_HW_QUEUE); - if (IS_ERR(hw_queue)) { - rc =3D PTR_ERR(hw_queue); - goto out_put_viommu; - } + if (IS_ERR(hw_queue)) + return PTR_ERR(hw_queue); =20 access =3D iommufd_hw_queue_alloc_phys(cmd, viommu, &base_pa); - if (IS_ERR(access)) { - rc =3D PTR_ERR(access); - goto out_put_viommu; - } + if (IS_ERR(access)) + return PTR_ERR(access); =20 hw_queue->viommu =3D viommu; refcount_inc(&viommu->obj.users); @@ -419,9 +392,85 @@ int iommufd_hw_queue_alloc_ioctl(struct iommufd_ucmd *= ucmd) =20 rc =3D viommu->ops->hw_queue_init_phys(hw_queue, cmd->index, base_pa); if (rc) - goto out_put_viommu; + return rc; =20 cmd->out_hw_queue_id =3D hw_queue->obj.id; + return rc; +} + +static int _iommufd_hw_queue_init(struct iommufd_ucmd *ucmd, + struct iommufd_viommu *viommu) +{ + struct iommu_hw_queue_alloc *cmd =3D ucmd->cmd; + struct iommufd_hw_queue *hw_queue; + size_t hw_queue_size; + int rc; + + hw_queue_size =3D viommu->ops->get_hw_queue_size(viommu, cmd->type); + if (!hw_queue_size) + return -EOPNOTSUPP; + + /* + * It is a driver bug for providing a hw_queue_size smaller than the + * core HW queue structure size + */ + if (WARN_ON_ONCE(hw_queue_size < sizeof(*hw_queue))) + return -EOPNOTSUPP; + + hw_queue =3D (struct iommufd_hw_queue *)_iommufd_object_alloc_ucmd( + ucmd, hw_queue_size, IOMMUFD_OBJ_HW_QUEUE); + if (IS_ERR(hw_queue)) + return PTR_ERR(hw_queue); + + hw_queue->viommu =3D viommu; + refcount_inc(&viommu->obj.users); + hw_queue->access =3D NULL; + hw_queue->type =3D cmd->type; + hw_queue->length =3D cmd->length; + hw_queue->base_addr =3D cmd->nesting_parent_iova; + + rc =3D viommu->ops->hw_queue_init(hw_queue, cmd->index); + if (rc) + return rc; + + cmd->out_hw_queue_id =3D hw_queue->obj.id; + return rc; +} + +int iommufd_hw_queue_alloc_ioctl(struct iommufd_ucmd *ucmd) +{ + struct iommu_hw_queue_alloc *cmd =3D ucmd->cmd; + struct iommufd_viommu *viommu; + u64 last; + int rc; + + if (cmd->flags || cmd->type =3D=3D IOMMU_HW_QUEUE_TYPE_DEFAULT) + return -EOPNOTSUPP; + if (!cmd->length) + return -EINVAL; + if (check_add_overflow(cmd->nesting_parent_iova, cmd->length - 1, + &last)) + return -EOVERFLOW; + + viommu =3D iommufd_get_viommu(ucmd, cmd->viommu_id); + if (IS_ERR(viommu)) + return PTR_ERR(viommu); + + if (!viommu->ops || !viommu->ops->get_hw_queue_size) { + rc =3D -EOPNOTSUPP; + goto out_put_viommu; + } + + if (viommu->ops->hw_queue_init_phys) + rc =3D _iommufd_hw_queue_init_phys(ucmd, viommu); + else if (viommu->ops->hw_queue_init) + rc =3D _iommufd_hw_queue_init(ucmd, viommu); + else + rc =3D -EOPNOTSUPP; + + if (rc) + goto out_put_viommu; + rc =3D iommufd_ucmd_respond(ucmd, sizeof(*cmd)); =20 out_put_viommu: diff --git a/include/linux/iommufd.h b/include/linux/iommufd.h index 6e7efe83bc5d..c0030677e13c 100644 --- a/include/linux/iommufd.h +++ b/include/linux/iommufd.h @@ -180,6 +180,9 @@ struct iommufd_hw_queue { * the physical location of the guest queue * If driver has a deinit function to revert what thi= s op * does, it should set it to the @hw_queue->destroy p= ointer + * @hw_queue_init: Similar to hw_queue_init_phys, but driver providing thi= s op + * indicates that HW accesses the guest queue memory via + * @hw_queue->baseaddr. */ struct iommufd_viommu_ops { void (*destroy)(struct iommufd_viommu *viommu); @@ -192,9 +195,9 @@ struct iommufd_viommu_ops { int (*vdevice_init)(struct iommufd_vdevice *vdev); size_t (*get_hw_queue_size)(struct iommufd_viommu *viommu, enum iommu_hw_queue_type queue_type); - /* AMD's HW will add hw_queue_init simply using @hw_queue->base_addr */ int (*hw_queue_init_phys)(struct iommufd_hw_queue *hw_queue, u32 index, phys_addr_t base_addr_pa); + int (*hw_queue_init)(struct iommufd_hw_queue *hw_queue, u32 index); }; =20 #if IS_ENABLED(CONFIG_IOMMUFD) --=20 2.34.1 From nobody Mon Jun 8 16:49:04 2026 Received: from PH8PR06CU001.outbound.protection.outlook.com (mail-westus3azon11012016.outbound.protection.outlook.com [40.107.209.16]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 1F883318BB8 for ; Thu, 28 May 2026 05:20:03 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=40.107.209.16 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1779945606; cv=fail; b=dP8hX64KsIXeCdzgjCmzeo38e9C/6jC58FUVhPspa7eDnF3N0X1n/VZj8kipib6JkIfCC3tMpCqMuhhZkUVp7REEDCSaoQ/hL/LgdoHiEfUep2zf54P7n9C1RGhZfZULfvcZr2JoUsUGGGYOZztaytC+zrnpo6XMF7gbEyMHQJU= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1779945606; c=relaxed/simple; bh=oRL2AQPqEFbVB/j0LKqLT70YJx9wT43cMo+Q94hBFCo=; h=From:To:CC:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=awL71QNt7bJARAr9sph1ksXZQJM9iPlS9a2t3OxrjPx9K52FckkNpi3lAqgmL7uB8WV7i+DhWFufIq62jvyFgpulHFNvTHARa+hd51Eq7SbkC1FnDqBOSsrsl/5ypxf4HCz1JtInLd3l7OUhmzsb3NfEkFsNXjSPcgKlibj2tGQ= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=amd.com; spf=fail smtp.mailfrom=amd.com; dkim=pass (1024-bit key) header.d=amd.com header.i=@amd.com header.b=pD5zCTM9; arc=fail smtp.client-ip=40.107.209.16 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=amd.com Authentication-Results: smtp.subspace.kernel.org; spf=fail smtp.mailfrom=amd.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=amd.com header.i=@amd.com header.b="pD5zCTM9" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=F8+Dzp80se1tbuE/UN7dxWBBYWAh+2IBy1uY+AKSJ7QwDKOCKQ3/zoShagJ17Tpvviish0aU02paJ73UwtRRqwbn1YHQ/EM/bzZFSQtyH4whepbSqQUusNLtUYp9lynRdk2p5H2Keqq7HZ1US9DsZCzn7xRyf96JBf+CzbWRf+pfuq78iQour+hZJKuYMybOoVxmMXRuPsslEDI7avtG+UZUHB6Ta4sDrbBSKyVRdRhUD2UOBEXeriwb5X2kYyf+FeJNEs3tm4+9A65qKnjj6asIlP9iMminV7whza40iIiMCzK8M+PfT314yIyC68cu7u2VqMdqQRNIfx9j1r4MLA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector10001; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=A7ZNJuy0brnwnWX/5TFAZBfiQfXzJvYKMJiyLPmphfI=; b=j9pqZBNt7eeCN/6YFLG0ivN4SePfaNRqWPkoggGRVJIXNPtSSyBI5mjuurOUqX99j6KiOMHf2Y/dKURihvayyCSaylZBeRWQQ8/yS09A5fmt4FY86290PRtjeJdOjdIr1Q0Kh6I0B196lBWEmo3JWfdQAlUFuIELTNebY4/dB9DEqwB3xtYBTmY3IaRwMgmuoYu18mTDXu4A2Fi6tKHbGFbppkQGAcb/Sx9wEyIUJQjdvC4ayPLB5kxtlwr+Q3/LMx3SsnokXocUVTVTsIebuzcGWTWi72uy83F7CSviLD1xt4r6Yh9PVfmQpah0og13+7DCz6eOlxSNIk8R7WdFNA== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass (sender ip is 165.204.84.17) smtp.rcpttodomain=vger.kernel.org smtp.mailfrom=amd.com; dmarc=pass (p=quarantine sp=quarantine pct=100) action=none header.from=amd.com; dkim=none (message not signed); arc=none (0) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=amd.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=A7ZNJuy0brnwnWX/5TFAZBfiQfXzJvYKMJiyLPmphfI=; b=pD5zCTM957qKobb6LF16xBXOspmsaLhPCJytuZ2UwnTS2+96vNZBSfkfSp/bzmXh4BXJ0k4q5jjxYX1Mbl4sGXk35r0uum+v1aw/UbA6JZtmKzgIpufXahrH9HQTq3gQ9s0JIAR1fG0HplvpF9y0LRejXRoB55cVTyOlR4nCzhc= Received: from CH0P223CA0006.NAMP223.PROD.OUTLOOK.COM (2603:10b6:610:116::24) by IA1PR12MB6460.namprd12.prod.outlook.com (2603:10b6:208:3a8::13) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.21.71.12; Thu, 28 May 2026 05:19:53 +0000 Received: from CH3PEPF0000000F.namprd04.prod.outlook.com (2603:10b6:610:116:cafe::a6) by CH0P223CA0006.outlook.office365.com (2603:10b6:610:116::24) with Microsoft SMTP Server (version=TLS1_3, cipher=TLS_AES_256_GCM_SHA384) id 15.21.71.13 via Frontend Transport; Thu, 28 May 2026 05:19:52 +0000 X-MS-Exchange-Authentication-Results: spf=pass (sender IP is 165.204.84.17) smtp.mailfrom=amd.com; dkim=none (message not signed) header.d=none;dmarc=pass action=none header.from=amd.com; Received-SPF: Pass (protection.outlook.com: domain of amd.com designates 165.204.84.17 as permitted sender) receiver=protection.outlook.com; client-ip=165.204.84.17; helo=satlexmb07.amd.com; pr=C Received: from satlexmb07.amd.com (165.204.84.17) by CH3PEPF0000000F.mail.protection.outlook.com (10.167.244.40) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.21.71.7 via Frontend Transport; Thu, 28 May 2026 05:19:52 +0000 Received: from purico-ed03host.amd.com (10.180.168.240) by satlexmb07.amd.com (10.181.42.216) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.2562.41; Thu, 28 May 2026 00:19:48 -0500 From: Suravee Suthikulpanit To: , , , CC: , , , , , , , , , , , , , Suravee Suthikulpanit Subject: [PATCH v2 23/26] iommu/amd: Add support for vIOMMU HW queues initialization Date: Thu, 28 May 2026 05:17:35 +0000 Message-ID: <20260528051738.596013-24-suravee.suthikulpanit@amd.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20260528051738.596013-1-suravee.suthikulpanit@amd.com> References: <20260528051738.596013-1-suravee.suthikulpanit@amd.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: satlexmb08.amd.com (10.181.42.217) To satlexmb07.amd.com (10.181.42.216) X-EOPAttributedMessage: 0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: CH3PEPF0000000F:EE_|IA1PR12MB6460:EE_ X-MS-Office365-Filtering-Correlation-Id: c02c5050-4438-4b6a-9424-08debc78bf81 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|36860700016|1800799024|376014|7416014|82310400026|56012099006|11063799006|18002099003|22082099003; X-Microsoft-Antispam-Message-Info: fw30T5PXSeG0iNpeYhbLXdWcRgewTrEBTWZmnMCmJQXHOdff5F0BJlu/wjiXQ1BH7iAMHMfTbjzQGbVlD790OYPE23CyJTwmrYpUH3V4Lc7TNdaEWSNdM5icVLUiROpap64kOpDsBvyJzaC4Ei7t/KAv6NJtTO26yWTUJo9sGaKaKzDYDri1QGazKXw8rCcyH62XbBhnqh54qPx/20bXIDpfg+LGqsouL0J8cbGJsJBH7kSfYlOq4di5lhHne3wuc8UF5UkuzEa697gnUybakcv6GxSlNDO8JF4p5/T+v4PcU7uhptRUubZvYoh4lbVYgUlLzFDYai06ovFr1mFvYkIJSdAnRspndozxNVBpcW59NbX8Ejv1stecw39ICP5/BrQRtXo7ujU8/uPVSnnB3pJPvxD124VIE9b23rbGd0hfH6/zKLLc8+6RPIpPBaUghC9shDHZarU5xaa9rVgqJhGf37vjnxvnNkX0CIwd8x0MRtG9oXu3UnnRFi4cJsMYVFTe9uSkgj4MX/G3KuuG+hxWScPg+NeFRiUZ87cucse6nAmhTJ7ainWyqywbAdCF3z5wckhd/9DxmDsoCdliSaXptuYm/8bLexbEvqrc+VFs9qB6tbbFyTCUKyRgda3+mTekoWzLHK+kKz/yj6KxvMEFbjjhFmdkTDw24RQ5aLOWzyLXV5yhAmzTiTTlEEVRT3a/KwrjIHm8Vy9bvnjNnnLQP1pMPFHaUFjeK6pUXKg= X-Forefront-Antispam-Report: CIP:165.204.84.17;CTRY:US;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:satlexmb07.amd.com;PTR:InfoDomainNonexistent;CAT:NONE;SFS:(13230040)(36860700016)(1800799024)(376014)(7416014)(82310400026)(56012099006)(11063799006)(18002099003)(22082099003);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: 1skURhEQhrSFGJ6gp7/d2nif/1pmZQPZIX/ZMQZSfzSJdRHGiXgLXDgiFHtPWfHO4fRjdWhgPLw4js1r4TCURL+KQSg2A8eu1ULaeB3E00Bdtaim1evF/MOcB8JGvHYYKANJmau+mcthWcidfWD98XLrWcuBDaDLHYvVixTFWZHKitJAAfKExaSFnv2P0jWuXeh/mnZ/k/8Nz5bkBsPhlceLdDL0gS7MoeDqrE7qNa1eDB2Vtmd9o1WN5aoBwy//dv808v0euqwmGdGZazEdwH8zbeKAjcmbtqRjPSXHYYxNbzGuH3NOuIW3wI9pQQANHUkoF7KTKiVRKPCOiVKuTg6UAta/Wl7+sfJ3suHzHdWOo5Lt8ct/LqYp1NYGRU3aIXgwgDR5tLYvkx1JIvOXLCGJWPnyLam4K0fFg5V631hFncvxt7tAACLtXAN2TOYo X-OriginatorOrg: amd.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 28 May 2026 05:19:52.7887 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: c02c5050-4438-4b6a-9424-08debc78bf81 X-MS-Exchange-CrossTenant-Id: 3dd8961f-e488-4e60-8e11-a82d994e183d X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp: TenantId=3dd8961f-e488-4e60-8e11-a82d994e183d;Ip=[165.204.84.17];Helo=[satlexmb07.amd.com] X-MS-Exchange-CrossTenant-AuthSource: CH3PEPF0000000F.namprd04.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Anonymous X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: IA1PR12MB6460 Content-Type: text/plain; charset="utf-8" AMD HW vIOMMU supports virtualizing Command buffer, Event log, and PPR log. Each can be initialized using the struct iommufd_viommu_ops.hw_queue_init to communicate base address (GPA) and length of each queue to the AMD IOMMU driver in order to programe the corresponded VF control MMIO registers. Signed-off-by: Suravee Suthikulpanit --- drivers/iommu/amd/amd_iommu_types.h | 8 +++ drivers/iommu/amd/iommufd.c | 108 ++++++++++++++++++++++++++++ include/uapi/linux/iommufd.h | 3 + 3 files changed, 119 insertions(+) diff --git a/drivers/iommu/amd/amd_iommu_types.h b/drivers/iommu/amd/amd_io= mmu_types.h index 92c83c68b2b1..70d060a85e66 100644 --- a/drivers/iommu/amd/amd_iommu_types.h +++ b/drivers/iommu/amd/amd_iommu_types.h @@ -507,6 +507,10 @@ extern bool amdr_ivrs_remap_support; #define VIOMMU_VFCTRL_MMIO_BASE(iommu, guestId) \ (iommu->vfctrl_base + (guestId * VIOMMU_VFCTRL_MMIO_ENTRY_SIZE)) =20 +#define VIOMMU_VFCTRL_MMIO_GUEST_COMMAND_CONTROL_OFFSET 0x20 +#define VIOMMU_VFCTRL_MMIO_GUEST_EVENT_CONTROL_OFFSET 0x28 +#define VIOMMU_VFCTRL_MMIO_GUEST_PPR_CONTROL_OFFSET 0x30 + struct amd_iommu; struct iommu_domain; struct irq_domain; @@ -1166,6 +1170,10 @@ struct amd_iommu_vdevice { struct iommufd_vdevice core; }; =20 +struct amd_iommu_hw_queue { + struct iommufd_hw_queue core; +}; + #ifdef CONFIG_IRQ_REMAP extern struct amd_irte_ops irte_32_ops; extern struct amd_irte_ops irte_128_ops; diff --git a/drivers/iommu/amd/iommufd.c b/drivers/iommu/amd/iommufd.c index 23a2c8c20365..7e6381e5a06b 100644 --- a/drivers/iommu/amd/iommufd.c +++ b/drivers/iommu/amd/iommufd.c @@ -200,6 +200,112 @@ static int _amd_viommu_vdevice_init(struct iommufd_vd= evice *vdev) return 0; } =20 +static size_t _amd_viommu_get_hw_queue_size(struct iommufd_viommu *viommu, + enum iommu_hw_queue_type queue_type) +{ + /* Currently do not support Eventlog B and PPRlog B */ + if ((queue_type !=3D IOMMU_HW_QUEUE_TYPE_AMD_CMD) && + (queue_type !=3D IOMMU_HW_QUEUE_TYPE_AMD_EVT) && + (queue_type !=3D IOMMU_HW_QUEUE_TYPE_AMD_PPR)) + return 0; + + return HW_QUEUE_STRUCT_SIZE(struct amd_iommu_hw_queue, core); +} + +static int _amd_viommu_hw_queue_init(struct iommufd_hw_queue *hw_queue, u3= 2 index) +{ + int ret =3D 0; + u64 val, vfctrl_mask, base; + u8 __iomem *vfctrl, *vf; + struct iommufd_viommu *viommu =3D hw_queue->viommu; + struct amd_iommu_viommu *aviommu =3D container_of(viommu, struct amd_iomm= u_viommu, core); + struct amd_iommu *iommu =3D container_of(viommu->iommu_dev, struct amd_io= mmu, iommu); + int gid =3D aviommu->gid; + + vf =3D VIOMMU_VF_MMIO_BASE(iommu, gid); + vfctrl =3D VIOMMU_VFCTRL_MMIO_BASE(iommu, gid); + + switch (hw_queue->type) { + case IOMMU_HW_QUEUE_TYPE_AMD_CMD: + { + /* + * Capture base and length from guest Command Buffer control register. + * and program onto VF Ctrl MMIO Command Buffer Control register. + * + * Command Buffer Control register field mapping : + * - ComBase[51:12] =3D vfctrl[51:12] + * - ComLen[3:0] =3D vfctrl[3:0] + * + * Guest Command Buffer Control Register field mapping : + * - ComBase[51:12] =3D vfctrl[51:12] + * - ComLen[3:0] =3D vfctrl[3:0] + */ + vfctrl_mask =3D GENMASK_ULL(51, 12) | GENMASK_ULL(3, 0); + val =3D readq(vfctrl + VIOMMU_VFCTRL_MMIO_GUEST_COMMAND_CONTROL_OFFSET) & + (~vfctrl_mask); + base =3D FIELD_GET(GENMASK_ULL(51, 12), hw_queue->base_addr); + val |=3D FIELD_PREP(GENMASK_ULL(51, 12), base) | + FIELD_PREP(GENMASK_ULL(3, 0), hw_queue->length); + writeq(val, vfctrl + VIOMMU_VFCTRL_MMIO_GUEST_COMMAND_CONTROL_OFFSET); + break; + } + case IOMMU_HW_QUEUE_TYPE_AMD_EVT: + { + /* + * Capture base and length from guest Event Buffer control register. + * and program onto VF Ctrl MMIO Event Buffer Control register. + * + * Event Buffer Control register field mapping : + * - EvtBase[51:12] =3D vfctrl[51:12] + * - EvtLen[3:0] =3D vfctrl[3:0] + * + * Guest Event Buffer Control Register field mapping : + * - EvtBase[51:12] =3D vfctrl[51:12] + * - EvtLen[3:0] =3D vfctrl[3:0] + */ + vfctrl_mask =3D GENMASK_ULL(51, 12) | GENMASK_ULL(3, 0); + val =3D readq(vfctrl + VIOMMU_VFCTRL_MMIO_GUEST_EVENT_CONTROL_OFFSET) & + (~vfctrl_mask); + base =3D FIELD_GET(GENMASK_ULL(51, 12), hw_queue->base_addr); + val |=3D FIELD_PREP(GENMASK_ULL(51, 12), base) | + FIELD_PREP(GENMASK_ULL(3, 0), hw_queue->length); + writeq(val, vfctrl + VIOMMU_VFCTRL_MMIO_GUEST_EVENT_CONTROL_OFFSET); + break; + } + case IOMMU_HW_QUEUE_TYPE_AMD_PPR: + { + /* + * Capture base and length from guest PPR Buffer control register. + * and program onto VF Ctrl MMIO PPR Buffer Control register. + * + * PPR Buffer Control register field mapping : + * - PPRBase[51:12] =3D vfctrl[55:16] + * - PPRLen[3:0] =3D vfctrl[3:0] + * + * Guest PPR Buffer Control Register field mapping : + * - PPRBase[51:12] =3D vfctrl[55:16] + * - PPRLen[3:0] =3D vfctrl[3:0] + */ + vfctrl_mask =3D GENMASK_ULL(55, 16) | GENMASK_ULL(3, 0); + val =3D readq(vfctrl + VIOMMU_VFCTRL_MMIO_GUEST_PPR_CONTROL_OFFSET) & (~= vfctrl_mask); + base =3D FIELD_GET(GENMASK_ULL(51, 12), hw_queue->base_addr); + val |=3D FIELD_PREP(GENMASK_ULL(55, 16), base) | + FIELD_PREP(GENMASK_ULL(3, 0), hw_queue->length); + writeq(val, vfctrl + VIOMMU_VFCTRL_MMIO_GUEST_PPR_CONTROL_OFFSET); + break; + } + default: + pr_err("%s: Invalid type (%#x)\n", __func__, hw_queue->type); + return -EINVAL; + } + + pr_debug("%s: iommu_devid=3D%#x, gid=3D%#x, type=3D%#x, addr=3D%#llx, len= =3D%#lx, val=3D%#llx\n", + __func__, iommu->devid, gid, hw_queue->type, + hw_queue->base_addr, hw_queue->length, val); + + return ret; +} + /* * See include/linux/iommufd.h * struct iommufd_viommu_ops - vIOMMU specific operations @@ -209,4 +315,6 @@ static const struct iommufd_viommu_ops amd_viommu_ops = =3D { .destroy =3D amd_iommufd_viommu_destroy, .vdevice_size =3D VDEVICE_STRUCT_SIZE(struct amd_iommu_vdevice, core), .vdevice_init =3D _amd_viommu_vdevice_init, + .get_hw_queue_size =3D _amd_viommu_get_hw_queue_size, + .hw_queue_init =3D _amd_viommu_hw_queue_init, }; diff --git a/include/uapi/linux/iommufd.h b/include/uapi/linux/iommufd.h index 69aa44bba95a..e08de6ab8209 100644 --- a/include/uapi/linux/iommufd.h +++ b/include/uapi/linux/iommufd.h @@ -1326,6 +1326,9 @@ enum iommu_hw_queue_type { * emulated vSMMU's IDR1.CMDQS to log2(huge page size / 16 bytes) */ IOMMU_HW_QUEUE_TYPE_TEGRA241_CMDQV =3D 1, + IOMMU_HW_QUEUE_TYPE_AMD_CMD, + IOMMU_HW_QUEUE_TYPE_AMD_EVT, + IOMMU_HW_QUEUE_TYPE_AMD_PPR, }; =20 /** --=20 2.34.1 From nobody Mon Jun 8 16:49:04 2026 Received: from CO1PR03CU002.outbound.protection.outlook.com (mail-westus2azon11010027.outbound.protection.outlook.com [52.101.46.27]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id EC6D231717E for ; Thu, 28 May 2026 05:20:01 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=52.101.46.27 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1779945603; cv=fail; b=PlROnv9rIFgXrA5Su/fmHia0M7Rsq18IU16aJKTzJyMnAcGZ4ZzRr33v+sR+cGbuP9zvcPoY1nBOWlMnf7AGQmAU+uXwBbdjHWd1eKRF9cqDkNBe45q92xRv//wtT0zNmKE5HMME4JIeO/raLLn7QtPoilsd7EfavkQjdPeyzos= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1779945603; c=relaxed/simple; bh=K9fMpxfLxW8IcXfTEEy9w4eN4pvf0zetE+Tr/fUdRhc=; h=From:To:CC:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=QMp6jDOSX/BFlRx0AUnFcLmwqnVXw6qoB+KooMIf+SI2wyGZ6BYkeVlaPbpUTOy2qmXjvmPfz8QrZxC9FJ9aWhpCcLOqPXMaldaOSKCANAdpcOzXWnsPYh9mVueg6RL1ALrMfTG+gFwbCP+0qHDWvXy6A/JpeKueqfD6Ywbn4e4= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=amd.com; spf=fail smtp.mailfrom=amd.com; dkim=pass (1024-bit key) header.d=amd.com header.i=@amd.com header.b=lc9PTRNY; arc=fail smtp.client-ip=52.101.46.27 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=amd.com Authentication-Results: smtp.subspace.kernel.org; spf=fail smtp.mailfrom=amd.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=amd.com header.i=@amd.com header.b="lc9PTRNY" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=AUVpspzTqjJAyi1NA5JEjlHvj4AI6eqt2pR/sir4izmWgoiut134CiwAzXICOwiRZ44GjXnb0aCA0InL8SY3u+wXV2nQ7xQ/tOy2mzQb8qOdr7oubNaksjxKaSrpLP1wUAQDmNcBk4uCHdd5FuolYkAcoRNNQAZFcSvYFQZwlUkBef9JakuJUcgKxkb8OPkgRBpBjzvlqelQuLGYMDhFg7sItbnoS3kB4lEB5y7D7UTFTGVUC08X5efxJAOlpxg5VhFr69FdbA+a09rgftG182WuCEAuFQhMTspAMF1xZ8sOlPDHgi4jrTIRskLfJUIaJiKrLVE1cC9UcEJgQmuNkg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector10001; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=BKPDMblZtXySMdkSBPumt32oCSe2TIQ/DeNLt6cS1Fg=; b=ZqMAaRLA6n3R09PDWLrSUhn4CT+qeaqa5Q1Y63F+W0qjNiKoLCRdNBT79Vxw7Errr0bsAP3f0U0V7ZKL+jaJc7t/gSOCXM3ZxdzVCwOstjd9+EivZRcwB7wSDBF1uVxf2Jc8ADrLoQ2udqrNpJTupCAxZa6eBMq38IB5hbeQJgelw2+uaYCp/zhociVn3U/uHQi24L7xo84OSIfwk1prfL6N5JrVDb+3VYtJyUT1H+23vvs3QoVLkg5uUl/5rYJlW5YnENUGJark9atUqPhxGkplg8xH8fx2AS6+9gobQkBacJLPOSDdcn+0E39F2qMlEH5HmfZS7i0eQ06UKTBHpg== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass (sender ip is 165.204.84.17) smtp.rcpttodomain=vger.kernel.org smtp.mailfrom=amd.com; dmarc=pass (p=quarantine sp=quarantine pct=100) action=none header.from=amd.com; dkim=none (message not signed); arc=none (0) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=amd.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=BKPDMblZtXySMdkSBPumt32oCSe2TIQ/DeNLt6cS1Fg=; b=lc9PTRNYR666AokrgI00HU+bMzAgPcm7ZLqPvlUpR9cN8A1WjBRbm2HH2qdHJIwve2TxW2Q141GhxsmnPoKkpyudp7HA7fn5C2O+RUBdiAALvC2bfyiqEJcBveORXa1jzpF4BtfWBbTsSYD/acJrxCtF/64itBazToqZprEFoO8= Received: from CH0P223CA0028.NAMP223.PROD.OUTLOOK.COM (2603:10b6:610:116::25) by MN2PR12MB4192.namprd12.prod.outlook.com (2603:10b6:208:1d5::15) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.21.71.14; Thu, 28 May 2026 05:19:57 +0000 Received: from CH3PEPF0000000F.namprd04.prod.outlook.com (2603:10b6:610:116:cafe::32) by CH0P223CA0028.outlook.office365.com (2603:10b6:610:116::25) with Microsoft SMTP Server (version=TLS1_3, cipher=TLS_AES_256_GCM_SHA384) id 15.21.71.13 via Frontend Transport; Thu, 28 May 2026 05:19:57 +0000 X-MS-Exchange-Authentication-Results: spf=pass (sender IP is 165.204.84.17) smtp.mailfrom=amd.com; dkim=none (message not signed) header.d=none;dmarc=pass action=none header.from=amd.com; Received-SPF: Pass (protection.outlook.com: domain of amd.com designates 165.204.84.17 as permitted sender) receiver=protection.outlook.com; client-ip=165.204.84.17; helo=satlexmb07.amd.com; pr=C Received: from satlexmb07.amd.com (165.204.84.17) by CH3PEPF0000000F.mail.protection.outlook.com (10.167.244.40) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.21.71.7 via Frontend Transport; Thu, 28 May 2026 05:19:57 +0000 Received: from purico-ed03host.amd.com (10.180.168.240) by satlexmb07.amd.com (10.181.42.216) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.2562.41; Thu, 28 May 2026 00:19:52 -0500 From: Suravee Suthikulpanit To: , , , CC: , , , , , , , , , , , , , Suravee Suthikulpanit Subject: [PATCH v2 24/26] iommufd: Introduce vIOMMU command via VIOMMU_COMMAND ioctl Date: Thu, 28 May 2026 05:17:36 +0000 Message-ID: <20260528051738.596013-25-suravee.suthikulpanit@amd.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20260528051738.596013-1-suravee.suthikulpanit@amd.com> References: <20260528051738.596013-1-suravee.suthikulpanit@amd.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: satlexmb08.amd.com (10.181.42.217) To satlexmb07.amd.com (10.181.42.216) X-EOPAttributedMessage: 0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: CH3PEPF0000000F:EE_|MN2PR12MB4192:EE_ X-MS-Office365-Filtering-Correlation-Id: dc86b6c7-e257-46ce-5096-08debc78c240 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|376014|7416014|1800799024|82310400026|36860700016|3023799007|56012099006|11063799006|18002099003|22082099003; X-Microsoft-Antispam-Message-Info: ejH32d3OUzRutLpevGSp9U20KFmCo77SFvZ5cLBb1z7PrHuetQrbw/f1kcjtWowwyGH4ouN2EaEQELXMgUXTmrEb3sF+iQXElhnE4XC6zmGsS8+4aie0/5EYZBp5ORtLV1g7pkC7eSqBakHlT7pN2uQTIMLlAupjtL28dSw9ZmA/qlgCWS5SlRDEZLbr+lQlXI90HhKXGk7k8IbRGvF1sfJpm2b+Yz20DhaqwhNCYQh5pPs54DMgEZQ7hboYp5Q8WGzKmsDcgt1ZlhKEZzCTEvpggch8ViTIQevZWBsMsVbP46Jj3NQuMDJk8jpq7LlO5AHKO6Grz1GPhX5QMpuR+WTBZiwtoBoiN+3LWA87AD1dJICMSQSlbwufgrKdtYagXOvYHr4mLWljo0Ep+YsCqIlfGmncQ87QnTSYD2Ocdu/cFxo+JoCURO8g30GTrrAIb8OU29HwSXHnIp6iHLWYVwXlo81aZro7orqjyq9/2h2VseifNOQAPcbv8lSH2uzo2vtn5Oq0PxAI1owrqRlDRpMQEBIdnHYqDBVsaKoReMix+rAcq2U4jUk/ApwSgRXyssTtBSwhXMH6TQ2mtvgI0wXc0czegzwNmI9DMAFvCw8TBZ6CQJUQxkKSa+wbIsCShU/TRC/3VehsgWX1OLcNQPDpfuwMmcmZ5xeLsAuz9xfI9adlQ09oWsR06WpgvSkodYcPMHV0Th5bFP3sn2EEFjh08qG/de8m3ZoCK2LDQOM= X-Forefront-Antispam-Report: CIP:165.204.84.17;CTRY:US;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:satlexmb07.amd.com;PTR:InfoDomainNonexistent;CAT:NONE;SFS:(13230040)(376014)(7416014)(1800799024)(82310400026)(36860700016)(3023799007)(56012099006)(11063799006)(18002099003)(22082099003);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: xYbafoCIQB5X6IZ6wv0tvV6xC0WFXWHqkU+IxAx0kqPF85FAzd0hgjkEZUcAAjw0ww/XPhR9mvqOfyn0s8qmm3pD420m4OM4/t0t1BQtXhBJEhWHxG2Kxa26UJR/uwMZ6mSzB8hmuBkz+3IfJ7RcyjLB3Z9ktbZC2dt86SzJhWt4+tVUOh6zQ143C6K80AtbIsXODWPkuEjIypaZG1515jV5mXsWOxOK97scC0Mg0U9vacJLDz/b6CDF12+kv18rXtUJPi421MIOliaQOY+C3Ozb0tccjEjV3dmdG+mMvC6yZzmZysR5jWhjjOXPNiAJfztKFGuFULP5KRq3BhhGlIdkuNk9IjxfsLpkLkUzgb9PgGO6Lf2QzDy7Li5MmGDZpuGwSxFuWvVVhrkFAWBFm/k77pxLnNF/o6i5xRTW80ng8RUxjnbRsf5dJLOMTMwk X-OriginatorOrg: amd.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 28 May 2026 05:19:57.3942 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: dc86b6c7-e257-46ce-5096-08debc78c240 X-MS-Exchange-CrossTenant-Id: 3dd8961f-e488-4e60-8e11-a82d994e183d X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp: TenantId=3dd8961f-e488-4e60-8e11-a82d994e183d;Ip=[165.204.84.17];Helo=[satlexmb07.amd.com] X-MS-Exchange-CrossTenant-AuthSource: CH3PEPF0000000F.namprd04.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Anonymous X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: MN2PR12MB4192 Content-Type: text/plain; charset="utf-8" Introduce a new IOMMU_VIOMMU_COMMAND ioctl, to support vIOMMU-specific commands. Initially, the ioctl support set / get operations on a specified index to write / read value. This allows write / read access to a particular index of a data arrays such as hardware registers. Signed-off-by: Suravee Suthikulpanit --- drivers/iommu/iommufd/iommufd_private.h | 1 + drivers/iommu/iommufd/main.c | 3 ++ drivers/iommu/iommufd/viommu.c | 39 +++++++++++++++++++++++++ include/linux/iommufd.h | 5 ++++ include/uapi/linux/iommufd.h | 34 +++++++++++++++++++++ 5 files changed, 82 insertions(+) diff --git a/drivers/iommu/iommufd/iommufd_private.h b/drivers/iommu/iommuf= d/iommufd_private.h index 6ac1965199e9..5cf839a4405a 100644 --- a/drivers/iommu/iommufd/iommufd_private.h +++ b/drivers/iommu/iommufd/iommufd_private.h @@ -692,6 +692,7 @@ iommufd_viommu_find_veventq(struct iommufd_viommu *viom= mu, =20 int iommufd_viommu_alloc_ioctl(struct iommufd_ucmd *ucmd); void iommufd_viommu_destroy(struct iommufd_object *obj); +int iommufd_viommu_command_ioctl(struct iommufd_ucmd *ucmd); int iommufd_vdevice_alloc_ioctl(struct iommufd_ucmd *ucmd); void iommufd_vdevice_destroy(struct iommufd_object *obj); void iommufd_vdevice_abort(struct iommufd_object *obj); diff --git a/drivers/iommu/iommufd/main.c b/drivers/iommu/iommufd/main.c index 8c6d43601afb..194f6409ce53 100644 --- a/drivers/iommu/iommufd/main.c +++ b/drivers/iommu/iommufd/main.c @@ -432,6 +432,7 @@ union ucmd_buffer { struct iommu_veventq_alloc veventq; struct iommu_vfio_ioas vfio_ioas; struct iommu_viommu_alloc viommu; + struct iommu_viommu_command viommu_command; #ifdef CONFIG_IOMMUFD_TEST struct iommu_test_cmd test; #endif @@ -493,6 +494,8 @@ static const struct iommufd_ioctl_op iommufd_ioctl_ops[= ] =3D { __reserved), IOCTL_OP(IOMMU_VIOMMU_ALLOC, iommufd_viommu_alloc_ioctl, struct iommu_viommu_alloc, out_viommu_id), + IOCTL_OP(IOMMU_VIOMMU_COMMAND, iommufd_viommu_command_ioctl, + struct iommu_viommu_command, val64), #ifdef CONFIG_IOMMUFD_TEST IOCTL_OP(IOMMU_TEST_CMD, iommufd_test, struct iommu_test_cmd, last), #endif diff --git a/drivers/iommu/iommufd/viommu.c b/drivers/iommu/iommufd/viommu.c index bc58d240fafd..53f9a7d2734a 100644 --- a/drivers/iommu/iommufd/viommu.c +++ b/drivers/iommu/iommufd/viommu.c @@ -477,3 +477,42 @@ int iommufd_hw_queue_alloc_ioctl(struct iommufd_ucmd *= ucmd) iommufd_put_object(ucmd->ictx, &viommu->obj); return rc; } + +int iommufd_viommu_command_ioctl(struct iommufd_ucmd *ucmd) +{ + int rc =3D 0; + struct iommu_viommu_command *cmd =3D ucmd->cmd; + struct iommufd_viommu *viommu =3D iommufd_get_viommu(ucmd, cmd->object_id= ); + + if (cmd->__reserved) { + rc =3D -EOPNOTSUPP; + goto out_put_viommu; + } + + if (IS_ERR(viommu)) { + rc =3D PTR_ERR(viommu); + goto out_put_viommu; + } + + if (cmd->op =3D=3D IOMMU_VIOMMU_COMMAND_OP_SET) { + if (!viommu->ops->set_command) + rc =3D -EOPNOTSUPP; + rc =3D viommu->ops->set_command(viommu, cmd->index, cmd->val64); + } else if (cmd->op =3D=3D IOMMU_VIOMMU_COMMAND_OP_GET) { + if (!viommu->ops->get_command) + rc =3D -EOPNOTSUPP; + rc =3D viommu->ops->get_command(viommu, cmd->index, &cmd->val64); + } else { + rc =3D -EOPNOTSUPP; + } + + if (rc) + goto out_put_viommu; + + if (copy_to_user(&((struct iommu_viommu_command __user *)ucmd->ubuffer)->= val64, + &cmd->val64, sizeof(cmd->val64))) + rc =3D -EFAULT; +out_put_viommu: + iommufd_put_object(ucmd->ictx, &viommu->obj); + return rc; +} diff --git a/include/linux/iommufd.h b/include/linux/iommufd.h index c0030677e13c..ec3563f4c09c 100644 --- a/include/linux/iommufd.h +++ b/include/linux/iommufd.h @@ -183,6 +183,9 @@ struct iommufd_hw_queue { * @hw_queue_init: Similar to hw_queue_init_phys, but driver providing thi= s op * indicates that HW accesses the guest queue memory via * @hw_queue->baseaddr. + * @set_command: Set data on the specified index of the specified vIOMMU. + * @get_command: Get data on the specified index of the specified vIOMMU. + * On success, the value is returned via the provided value. */ struct iommufd_viommu_ops { void (*destroy)(struct iommufd_viommu *viommu); @@ -198,6 +201,8 @@ struct iommufd_viommu_ops { int (*hw_queue_init_phys)(struct iommufd_hw_queue *hw_queue, u32 index, phys_addr_t base_addr_pa); int (*hw_queue_init)(struct iommufd_hw_queue *hw_queue, u32 index); + int (*set_command)(struct iommufd_viommu *viommu, u16 index, u64 value); + int (*get_command)(struct iommufd_viommu *viommu, u16 index, u64 *value); }; =20 #if IS_ENABLED(CONFIG_IOMMUFD) diff --git a/include/uapi/linux/iommufd.h b/include/uapi/linux/iommufd.h index e08de6ab8209..a2195b1dfabe 100644 --- a/include/uapi/linux/iommufd.h +++ b/include/uapi/linux/iommufd.h @@ -57,6 +57,7 @@ enum { IOMMUFD_CMD_IOAS_CHANGE_PROCESS =3D 0x92, IOMMUFD_CMD_VEVENTQ_ALLOC =3D 0x93, IOMMUFD_CMD_HW_QUEUE_ALLOC =3D 0x94, + IOMMUFD_CMD_VIOMMU_COMMAND =3D 0x95, }; =20 /** @@ -1131,6 +1132,39 @@ struct iommu_viommu_alloc { }; #define IOMMU_VIOMMU_ALLOC _IO(IOMMUFD_TYPE, IOMMUFD_CMD_VIOMMU_ALLOC) =20 +/** + * enum viommu_command_ops - viommu command operations + * @IOMMU_VIOMMU_COMMAND_OP_SET: Set the command's data + * @IOMMU_VIOMMU_COMMAND_OP_GET: Get the command's data + */ +enum viommu_command_ops { + IOMMU_VIOMMU_COMMAND_OP_SET =3D 0, + IOMMU_VIOMMU_COMMAND_OP_GET =3D 1, +}; + +/** + * struct iommu_viommu_command - iommu viommu command multiplexer + * @size: sizeof(struct iommu_viommu_command) + * @object_id: ID of the vIOMMU if required + * @op: One of enum viommu_command_ops + * @index: Command index to match with the value + * @__reserved: Must be 0 + * @val64: Command data to set or data returned on get + * + * This multiplexer allows controlling commands on vIOMMU. + * IOMMU_VIOMMU_COMMAND_OP_SET will load a command and + * IOMMU_VIOMMU_COMMAND_OP_GET will return the current value. + */ +struct iommu_viommu_command { + __u32 size; + __u32 object_id; + __u16 op; + __u16 index; + __u32 __reserved; + __aligned_u64 val64; +}; +#define IOMMU_VIOMMU_COMMAND _IO(IOMMUFD_TYPE, IOMMUFD_CMD_VIOMMU_COMMAND) + /** * struct iommu_vdevice_alloc - ioctl(IOMMU_VDEVICE_ALLOC) * @size: sizeof(struct iommu_vdevice_alloc) --=20 2.34.1 From nobody Mon Jun 8 16:49:05 2026 Received: from CY3PR05CU001.outbound.protection.outlook.com (mail-westcentralusazon11013020.outbound.protection.outlook.com [40.93.201.20]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 0B06431F983 for ; Thu, 28 May 2026 05:20:07 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=40.93.201.20 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1779945610; cv=fail; b=gPDQv8NHIlocodH4f+BNmWgWSJTIqwssGpavN+9qtCzZySfFaipG9EK0oUwywETwG23DwkUA02QNEFRQk2ehL9e0SrEySiV11GcR9kvU84/HI592WFcZQL0BgidF/g463l4inln1HEBv5UmdQ6dRB/de7GmZ2DH/0FcYRC/0UOE= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1779945610; c=relaxed/simple; bh=b3lszFwUdThhNfhmXUopoMzs6TwbksDYeobMknMGhsk=; h=From:To:CC:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=WQnjt3F9dyPUlrtaRb3LYZ+5yTCR1RK7Zj29cXzuFSfiVDWRpiUZNEAgZz4PRjmbj01HWxcV7RwNzD3spwutE+MOs+Cp+4d6CeREXr4IJrPc0angVwzSFD4C+5Hpqa0IibWaHBU33CGONfLjBnBi5ut/E9q+VqFfXvJQGJB01aE= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=amd.com; spf=fail smtp.mailfrom=amd.com; dkim=pass (1024-bit key) header.d=amd.com header.i=@amd.com header.b=dIQAOai4; arc=fail smtp.client-ip=40.93.201.20 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=amd.com Authentication-Results: smtp.subspace.kernel.org; spf=fail smtp.mailfrom=amd.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=amd.com header.i=@amd.com header.b="dIQAOai4" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=rHuLXv3sBiqOJ0lGUenxkjgY6X3rMAh7iCebv95xEWPwBA6pZfIlacHGdvYkhT3+50LEkPs0Nxyid0Wla+5irl4YK7HPHyNtXpyGK1V9eziubrlr2v2mt7bu8AkBaK3aTrXYyX+WpvtSJhY8r3sG1JEXDpYEDUJcfu3xaGJzRqHXdneaBmMUokmZbbzyScHGLvIsxraX4E3ZKxyYCLV3w9n4Y5evFZYO+gLSmvhT6pXq+9sb7/OQoVCTiCuGLdytJI/mQjYYuzGWFOZOAZXN+taAVO55HFsIdRGOGXaZfD3QU4M2eZYHqyjLs2d0khdWYSfIObgthZhMvjAx60Ocyg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector10001; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=a7mV1ndQGR8lKDIDNF9bb6zMNGuwbVJrXxncSN1ezf0=; b=rEC84knn4oXW54nRCQe+fiYbEYhF/9RTDzNg+YgR6GMSQvfB7oV/Pt2QD5u9JMixd/65W1LDbGbWquawX2vswEsAFDZa4y9bfl/L5NWgIUo/h8pbIcBa4pGmfRVnOJGYCyEWAHdW9H55Kcpq3K9i7FTPuPDMzOsyMAEZGs+I6pqt+tf9hYpg5UjjDaNXskmMurO0LS88n3t3I2FoenK4jenPD9pBEn0u2JGnpIRHw5STDAej0j/MBNt25m8xiG5AzvR2EBgd53G+7jYf7MspMBVGMn/f8Jz1l+jxG5Tw4isPUjRVBApOY2BFNQfzL2S31ZJZ14gLCOm1yndV4PuRsQ== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass (sender ip is 165.204.84.17) smtp.rcpttodomain=vger.kernel.org smtp.mailfrom=amd.com; dmarc=pass (p=quarantine sp=quarantine pct=100) action=none header.from=amd.com; dkim=none (message not signed); arc=none (0) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=amd.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=a7mV1ndQGR8lKDIDNF9bb6zMNGuwbVJrXxncSN1ezf0=; b=dIQAOai44y1nibgmS9Q0LbU4QirC45Trz6Px3YDdMsCp2guyBecrVH8IQp3ItgBjj9ITf/EgDkZCad7W0vux5h4w62pTN9e1Z/ahkD8oaeaaaw6egYRFIi9qxou7UkITp75PYRhqqPFedRXhE31QjIl9ByEgUhmJGPYGuf5amfg= Received: from CH0PR04CA0003.namprd04.prod.outlook.com (2603:10b6:610:76::8) by DSSPR12MB999235.namprd12.prod.outlook.com (2603:10b6:8:377::13) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.21.71.13; Thu, 28 May 2026 05:20:03 +0000 Received: from CH3PEPF00000009.namprd04.prod.outlook.com (2603:10b6:610:76:cafe::5a) by CH0PR04CA0003.outlook.office365.com (2603:10b6:610:76::8) with Microsoft SMTP Server (version=TLS1_3, cipher=TLS_AES_256_GCM_SHA384) id 15.21.71.13 via Frontend Transport; Thu, 28 May 2026 05:20:03 +0000 X-MS-Exchange-Authentication-Results: spf=pass (sender IP is 165.204.84.17) smtp.mailfrom=amd.com; dkim=none (message not signed) header.d=none;dmarc=pass action=none header.from=amd.com; Received-SPF: Pass (protection.outlook.com: domain of amd.com designates 165.204.84.17 as permitted sender) receiver=protection.outlook.com; client-ip=165.204.84.17; helo=satlexmb07.amd.com; pr=C Received: from satlexmb07.amd.com (165.204.84.17) by CH3PEPF00000009.mail.protection.outlook.com (10.167.244.36) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.21.71.7 via Frontend Transport; Thu, 28 May 2026 05:20:03 +0000 Received: from purico-ed03host.amd.com (10.180.168.240) by satlexmb07.amd.com (10.181.42.216) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.2562.41; Thu, 28 May 2026 00:19:57 -0500 From: Suravee Suthikulpanit To: , , , CC: , , , , , , , , , , , , , Suravee Suthikulpanit Subject: [PATCH v2 25/26] iommu/amd: Handle set/get command for AMD vIOMMU Date: Thu, 28 May 2026 05:17:37 +0000 Message-ID: <20260528051738.596013-26-suravee.suthikulpanit@amd.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20260528051738.596013-1-suravee.suthikulpanit@amd.com> References: <20260528051738.596013-1-suravee.suthikulpanit@amd.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: satlexmb08.amd.com (10.181.42.217) To satlexmb07.amd.com (10.181.42.216) X-EOPAttributedMessage: 0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: CH3PEPF00000009:EE_|DSSPR12MB999235:EE_ X-MS-Office365-Filtering-Correlation-Id: 7aa1e24b-bc5e-484f-0fd2-08debc78c60b X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|376014|7416014|82310400026|36860700016|1800799024|22082099003|18002099003|11063799006|56012099006; X-Microsoft-Antispam-Message-Info: YK544KEe1dJzOWqJeW1CX/mvKJB+ICGtSXcjmMm37S2/4kI7pn7GSlpiPnaaJN3Ro4qDlG7U+a7oG6D75b6SdpR4caleyAALRgjZ8p6WmjpwEdTFOpxFCgVhCHGNNcTV9F5ygRUK0o9k5MPUdezDTYshRSJ4kGrJvc+YOv/Owr0/Lb6QmLHEq1LisEuMR4JnceajNANpJan0X4KrpYepUVBIpKsjQ8vQJGNG7RUL4Ga1Kut6tJzspV0J+hQmzyFk/p7WS/NVzCcIRNFv5WWTdXfEeP0WXb5XgBvWo6l0lpuN2oF6OtHYkE/UzaB/Tf0S5QQNnmgbAAKuQPpF88lS2DzFWGZBw7wQoJFaskX/jlh0yrfaUz6rmdHakZ6a4rmHzV2fwIpLDi9glGN+XFZtj5EDISmrAQB9pkruaL77lpmfjKS8mNDTQaUqN5Irb9ChbVrqZYO8Lb5ASP71ICjiGZXel9DomrXqa3dm3lBJY5TSuNmqjXUBdTWBSNmt48vHHTD1hEsY4nedFnPszSYUt9S0PpYkibmoULGKHyKtP+XyCFc9X5M7sgOK5VvUvXWKl4a4TbPikIsZyECn1tfUQOeEE9ioJif8YZftnYhrhOF37Mj6XeAmWWkJS6rkpt7U2fiJLcOmMT8Rqbp/kb6uJ60Nd3l/c4b4FGKsWICj/G8ff3OzS/CGc7JX4XGajb5mrjWAtLIHdWDs+X8Z7Pf9Ew8xQQYsFvzrbeYotyfhBoU= X-Forefront-Antispam-Report: CIP:165.204.84.17;CTRY:US;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:satlexmb07.amd.com;PTR:InfoDomainNonexistent;CAT:NONE;SFS:(13230040)(376014)(7416014)(82310400026)(36860700016)(1800799024)(22082099003)(18002099003)(11063799006)(56012099006);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: lLNj4fN+mWauJ0Rrrkmh126HqfLBQ4Yc88hCBJWVO1d6XHeUVyb8ByWK9YjNXnCT84RVvxtNIpH2dqEGhUOPEg2VC7RNSFlM8XdUvjdWRW0hc1pZN3QYvCGYWRXsZ23wW5Xi510Du53koHNfO9YJ+vBwznW+9/as+dZSVep36eKC0JekHF/bjojbUEGbB77VD/GLnnyMggzCtOomqnHeEIpOmGCzjtvyVcwMDkMoSP88ivPeDo+XWBiQKOGbQefoMF9ajLEOAU4LHTcQrV5iQVK0j+SCAPGP164EbVJHVL63+BPLM2NHQr7/8M7ifAd0A1XfgVUZhJmAcFFYn0ixNNfgk8ZQqVtNbLb4He/lUeIBlG91By8MUgm3opGoEpj76NGrWwbb2QTZjESTEmy9Ra74NjcdR5XpflFS/HGCtX/XINz1G0GJqYhNX4XDPEHd X-OriginatorOrg: amd.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 28 May 2026 05:20:03.7579 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: 7aa1e24b-bc5e-484f-0fd2-08debc78c60b X-MS-Exchange-CrossTenant-Id: 3dd8961f-e488-4e60-8e11-a82d994e183d X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp: TenantId=3dd8961f-e488-4e60-8e11-a82d994e183d;Ip=[165.204.84.17];Helo=[satlexmb07.amd.com] X-MS-Exchange-CrossTenant-AuthSource: CH3PEPF00000009.namprd04.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Anonymous X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: DSSPR12MB999235 Content-Type: text/plain; charset="utf-8" Guest kernel programs guest Command Buffer, Event Log, and PPR Log (a.k.a hardware queue) settings via guest control MMIO register (guest MMIO offset 0x18). Accesses to the register is trapped by VMM (QEMU) and information is passed as IOMMU_VIOMMU_OPTION to host IOMMU driver via struct iommufd_viommu_ops set_command() and get_command(). Provides AMD IOMMU driver hooks to handle set/get operations for the guest control MMIO register, which uses key parameter as AMD IOMMU MMIO offset. The value parameter contains the value of the corresponding guest MMIO register, which is converted to the format of AMD vIOMMU VF Control MMIO registers then programed onto the hardware. Signed-off-by: Suravee Suthikulpanit --- drivers/iommu/amd/Makefile | 2 +- drivers/iommu/amd/amd_iommu_types.h | 5 + drivers/iommu/amd/amd_viommu.h | 15 +++ drivers/iommu/amd/iommufd.c | 2 + drivers/iommu/amd/vfctrl_mmio.c | 146 ++++++++++++++++++++++++++++ 5 files changed, 169 insertions(+), 1 deletion(-) create mode 100644 drivers/iommu/amd/vfctrl_mmio.c diff --git a/drivers/iommu/amd/Makefile b/drivers/iommu/amd/Makefile index 12c3fe83e4ce..afbefda87f57 100644 --- a/drivers/iommu/amd/Makefile +++ b/drivers/iommu/amd/Makefile @@ -1,4 +1,4 @@ # SPDX-License-Identifier: GPL-2.0-only obj-y +=3D iommu.o init.o quirks.o ppr.o pasid.o -obj-$(CONFIG_AMD_IOMMU_IOMMUFD) +=3D iommufd.o nested.o viommu.o trans_dev= id.o +obj-$(CONFIG_AMD_IOMMU_IOMMUFD) +=3D iommufd.o nested.o viommu.o trans_dev= id.o vfctrl_mmio.o obj-$(CONFIG_AMD_IOMMU_DEBUGFS) +=3D debugfs.o diff --git a/drivers/iommu/amd/amd_iommu_types.h b/drivers/iommu/amd/amd_io= mmu_types.h index 70d060a85e66..44a185bfa39e 100644 --- a/drivers/iommu/amd/amd_iommu_types.h +++ b/drivers/iommu/amd/amd_iommu_types.h @@ -191,10 +191,15 @@ #define CONTROL_GAM_EN 25 #define CONTROL_GALOG_EN 28 #define CONTROL_GAINT_EN 29 +#define CONTROL_DUALPPRLOG_EN 30 +#define CONTROL_DUALEVTLOG_EN 32 +#define CONTROL_PPR_AUTO_RSP_EN 39 +#define CONTROL_BLKSTOPMRK_EN 41 #define CONTROL_NUM_INT_REMAP_MODE 43 #define CONTROL_NUM_INT_REMAP_MODE_MASK 0x03 #define CONTROL_NUM_INT_REMAP_MODE_2K 0x01 #define CONTROL_EPH_EN 45 +#define CONTROL_PPR_AUTO_RSP_AON 48 #define CONTROL_XT_EN 50 #define CONTROL_INTCAPXT_EN 51 #define CONTROL_GCR3TRPMODE 58 diff --git a/drivers/iommu/amd/amd_viommu.h b/drivers/iommu/amd/amd_viommu.h index 3a8f41baaab9..c4ef374b68ec 100644 --- a/drivers/iommu/amd/amd_viommu.h +++ b/drivers/iommu/amd/amd_viommu.h @@ -23,6 +23,11 @@ int amd_viommu_domain_id_update(struct amd_iommu *iommu,= u16 gid, =20 void amd_viommu_set_device_mapping(struct amd_iommu *iommu, u16 hDevId, u16 guestId, u16 gDevId); + +int amd_viommu_guest_mmio_write(struct iommufd_viommu *viommu, u16 offset,= u64 value); + +int amd_viommu_guest_mmio_read(struct iommufd_viommu *viommu, u16 offset, = u64 *value); + #else =20 static inline int amd_viommu_init(struct amd_iommu *iommu) @@ -53,6 +58,16 @@ static inline void amd_viommu_set_device_mapping(struct = amd_iommu *iommu, u16 hD { } =20 +static inline int amd_viommu_guest_mmio_write(struct iommufd_viommu *viomm= u, u16 offset, u64 value) +{ + return -EOPNOTSUPP; +} + +static inline int amd_viommu_guest_mmio_read(struct iommufd_viommu *viommu= , u16 offset, u64 *value) +{ + return -EOPNOTSUPP; +} + #endif /* CONFIG_AMD_IOMMU_IOMMUFD */ =20 #endif /* AMD_VIOMMU_H */ diff --git a/drivers/iommu/amd/iommufd.c b/drivers/iommu/amd/iommufd.c index 7e6381e5a06b..53dda68c5a0a 100644 --- a/drivers/iommu/amd/iommufd.c +++ b/drivers/iommu/amd/iommufd.c @@ -317,4 +317,6 @@ static const struct iommufd_viommu_ops amd_viommu_ops = =3D { .vdevice_init =3D _amd_viommu_vdevice_init, .get_hw_queue_size =3D _amd_viommu_get_hw_queue_size, .hw_queue_init =3D _amd_viommu_hw_queue_init, + .set_command =3D amd_viommu_guest_mmio_write, + .get_command =3D amd_viommu_guest_mmio_read, }; diff --git a/drivers/iommu/amd/vfctrl_mmio.c b/drivers/iommu/amd/vfctrl_mmi= o.c new file mode 100644 index 000000000000..ece94f2212ec --- /dev/null +++ b/drivers/iommu/amd/vfctrl_mmio.c @@ -0,0 +1,146 @@ +// SPDX-License-Identifier: GPL-2.0-only +/* + * Copyright (C) 2023 Advanced Micro Devices, Inc. + * Author: Suravee Suthikulpanit + */ + +#define pr_fmt(fmt) "AMD-Vi: " fmt +#define dev_fmt(fmt) pr_fmt(fmt) + +#include +#include + +#include +#include +#include +#include +#include +#include + +#include +#include + +#include "amd_iommu.h" +#include "amd_iommu_types.h" +#include "amd_viommu.h" +#include "../iommu-pages.h" + +#define GET_CTRL_BITS(reg, bit, msk) (((reg) >> (bit)) & (ULL(msk))) +#define SET_CTRL_BITS(reg, bit1, bit2, msk) \ + ((((reg) >> (bit1)) & (ULL(msk))) << (bit2)) + +int amd_viommu_guest_mmio_read(struct iommufd_viommu *viommu, u16 offset, = u64 *value) +{ + u8 __iomem *vfctrl, *vf; + u64 val, tmp =3D 0; + struct amd_iommu_viommu *aviommu =3D container_of(viommu, struct amd_iomm= u_viommu, core); + struct amd_iommu *iommu =3D container_of(viommu->iommu_dev, struct amd_io= mmu, iommu); + int gid =3D aviommu->gid; + + vf =3D VIOMMU_VF_MMIO_BASE(iommu, gid); + vfctrl =3D VIOMMU_VFCTRL_MMIO_BASE(iommu, gid); + + switch (offset) { + case MMIO_CONTROL_OFFSET: + { + /* VFCTRL offset 20h */ + val =3D readq(vfctrl + 0x20); + tmp |=3D SET_CTRL_BITS(val, 8, CONTROL_CMDBUF_EN, 1); // [12] + tmp |=3D SET_CTRL_BITS(val, 9, CONTROL_COMWAIT_EN, 1); // [4] + + /* VFCTRL offset 28h */ + val =3D readq(vfctrl + 0x28); + tmp |=3D SET_CTRL_BITS(val, 8, CONTROL_EVT_LOG_EN, 1); // [2] + tmp |=3D SET_CTRL_BITS(val, 9, CONTROL_EVT_INT_EN, 1); // [3] + tmp |=3D SET_CTRL_BITS(val, 10, CONTROL_DUALEVTLOG_EN, 3); // [33:32] + + /* VFCTRL offset 30h */ + val =3D readq(vfctrl + 0x30); + tmp |=3D SET_CTRL_BITS(val, 8, CONTROL_PPRLOG_EN, 1); // [13] + tmp |=3D SET_CTRL_BITS(val, 9, CONTROL_PPRINT_EN, 1); // [14] + tmp |=3D SET_CTRL_BITS(val, 10, CONTROL_PPR_EN, 1); // [15] + tmp |=3D SET_CTRL_BITS(val, 11, CONTROL_DUALPPRLOG_EN, 3); // [31:30] + tmp |=3D SET_CTRL_BITS(val, 13, CONTROL_PPR_AUTO_RSP_EN, 1); // [39] + tmp |=3D SET_CTRL_BITS(val, 14, CONTROL_BLKSTOPMRK_EN, 1); // [41] + tmp |=3D SET_CTRL_BITS(val, 15, CONTROL_PPR_AUTO_RSP_AON, 1); // [42] + + *value =3D tmp; + break; + } + default: + pr_err("%s: invalid offset=3D%#x\n", __func__, offset); + WARN_ON(1); + break; + } + + pr_debug("%s: iommu_devid=3D%#x, gid=3D%u, offset=3D%#x, value=3D%#llx\n", + __func__, iommu->devid, gid, offset, *value); + return 0; +} +EXPORT_SYMBOL(amd_viommu_guest_mmio_read); + +int amd_viommu_guest_mmio_write(struct iommufd_viommu *viommu, u16 offset,= u64 value) +{ + u8 __iomem *vfctrl, *vf; + u64 val, tmp, ctrl =3D value; + struct amd_iommu_viommu *aviommu =3D container_of(viommu, struct amd_iomm= u_viommu, core); + struct amd_iommu *iommu =3D container_of(viommu->iommu_dev, struct amd_io= mmu, iommu); + int gid =3D aviommu->gid; + + pr_debug("%s: iommu_devid=3D%#x, gid=3D%u, offset=3D%#x, value=3D%#llx\n", + __func__, iommu->devid, gid, offset, value); + + vf =3D VIOMMU_VF_MMIO_BASE(iommu, gid); + vfctrl =3D VIOMMU_VFCTRL_MMIO_BASE(iommu, gid); + + switch (offset) { + case MMIO_CONTROL_OFFSET: + { + /* VFCTRL offset 20h */ + val =3D readq(vfctrl + 0x20); + val &=3D ~(0x3ULL << 8); + tmp =3D GET_CTRL_BITS(ctrl, CONTROL_CMDBUF_EN, 1); // [12] + val |=3D (tmp << 8); + tmp =3D GET_CTRL_BITS(ctrl, CONTROL_COMWAIT_EN, 1); // [4] + val |=3D (tmp << 9); + writeq(val, vfctrl + 0x20); + + /* VFCTRL offset 28h */ + val =3D readq(vfctrl + 0x28); + val &=3D ~(0xFULL << 8); + tmp =3D GET_CTRL_BITS(ctrl, CONTROL_EVT_LOG_EN, 1); // [2] + val |=3D (tmp << 8); + tmp =3D GET_CTRL_BITS(ctrl, CONTROL_EVT_INT_EN, 1); // [3] + val |=3D (tmp << 9); + tmp =3D GET_CTRL_BITS(ctrl, CONTROL_DUALEVTLOG_EN, 3); // [33:32] + val |=3D (tmp << 10); + writeq(val, vfctrl + 0x28); + + /* VFCTRL offset 30h */ + val =3D readq(vfctrl + 0x30); + val &=3D ~(0xFFULL << 8); + tmp =3D GET_CTRL_BITS(ctrl, CONTROL_PPRLOG_EN, 1); // [13] + val |=3D (tmp << 8); + tmp =3D GET_CTRL_BITS(ctrl, CONTROL_PPRINT_EN, 1); // [14] + val |=3D (tmp << 9); + tmp =3D GET_CTRL_BITS(ctrl, CONTROL_PPR_EN, 1); // [15] + val |=3D (tmp << 10); + tmp =3D GET_CTRL_BITS(ctrl, CONTROL_DUALPPRLOG_EN, 3); // [31:30] + val |=3D (tmp << 11); + tmp =3D GET_CTRL_BITS(ctrl, CONTROL_PPR_AUTO_RSP_EN, 1); // [39] + val |=3D (tmp << 13); + tmp =3D GET_CTRL_BITS(ctrl, CONTROL_BLKSTOPMRK_EN, 1); // [41] + val |=3D (tmp << 14); + tmp =3D GET_CTRL_BITS(ctrl, CONTROL_PPR_AUTO_RSP_AON, 1); // [42] + val |=3D (tmp << 15); + writeq(val, vfctrl + 0x30); + break; + } + default: + WARN_ON(1); + break; + } + + return 0; +} +EXPORT_SYMBOL(amd_viommu_guest_mmio_write); --=20 2.34.1 From nobody Mon Jun 8 16:49:05 2026 Received: from SN4PR2101CU001.outbound.protection.outlook.com (mail-southcentralusazon11012048.outbound.protection.outlook.com [40.93.195.48]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 7206131C56D for ; Thu, 28 May 2026 05:20:15 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=40.93.195.48 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1779945616; cv=fail; b=lE7atn3Lgjjt4XuRvoQPyjbA4fMx7b6StPF47B4VC/XSZtAfIdpjyw/7Q4nscl29tFVhEx5v5fqt/TNPfLkOET5QR2S9vDzKR5gWwtzJfBnFopHZhQjv3PjKXkzYJWb9eddaAkQCPZE+yrMz78+foKhcQuj1BLNIGULGVC8o31g= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1779945616; c=relaxed/simple; bh=oaLgEEylO9d9QNvJ2Xbi0+ahvD9rVgeIJ3cv3TYC4jA=; h=From:To:CC:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=pszDovuPOnqBEYzSms0EzLWD69E131A9nZul685g+MN2BINL0ROI2oIE2JFQp7aFGsV4vttd7r43euegOsJeJjqiJugvHGwFZeNHc4TvzHv/NTk6EbqLjS/3zcFUnc9bDiXmkOsQYy69nWV4GUcHpl7gjO+3oL60GPDaYt0cliI= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=amd.com; spf=fail smtp.mailfrom=amd.com; dkim=pass (1024-bit key) header.d=amd.com header.i=@amd.com header.b=Wy7vu/aQ; arc=fail smtp.client-ip=40.93.195.48 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=amd.com Authentication-Results: smtp.subspace.kernel.org; spf=fail smtp.mailfrom=amd.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=amd.com header.i=@amd.com header.b="Wy7vu/aQ" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=QceeBE73BrFfkmK7uvdUv28ASgU1NRgGwLPX+pn/iqT9PdtPPD69Bl82a+/JX7Xqerq9XzEYd46GbPulJsMZrTxuiFULc8ucB82sEx680QEegvalmCa/kQfJMpgzmoAxGJRZBAnr3VKJpjA1FIiaJ4R29Uqnt6eyo74ta2XBE34FJpX2dTiIw5InMzfirBrudrf9E8mqEh+1l2M3fwNeaLR/ch8aaghN7KG8at7yA3Axp/0zf29tpF/T+wJ5jzhqFRqaKHgOUv3099Ce2FX6tk2MA5JSPtEMq+kgn+d5/mSIozGr6yCjWXD7SPwDcbCpFmvhDMlkPb8d1N3VQW0GpA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector10001; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=JFAh9xfHDv5mkuFe1tN7lG5a5llNPZodvcHon0cqLY0=; b=Tl0Ne34c0rdjrD0PGoCaOCo91VzT5gCQuoKBi2butcdqLuRpDerIn9irpUxWhffXdocUS0NPL6aPfSZjYEqt8bZVBSlqi5n/SMSyMRcASu7G0savfP3boHN1SLbNUIcMRygMAO56kmbCaKMvC2phKUVvDgFGrzk879BT9m+aOw22qaBULcmI9gvMAroUb03e+aoxgM0IjC6US449/nDclLdRYxBsSs/1xF1KPGBmQCGYf2+ZO5JeG/ZiYg33NzvLrJ4LiWioZnYkZlFGgnMRfLu1zchgDkuZSfUMmLcDAmYG0hn7qVz/1SmMGskGtdlt1wll6LCIsjjW5V92XcjuWQ== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass (sender ip is 165.204.84.17) smtp.rcpttodomain=vger.kernel.org smtp.mailfrom=amd.com; dmarc=pass (p=quarantine sp=quarantine pct=100) action=none header.from=amd.com; dkim=none (message not signed); arc=none (0) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=amd.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=JFAh9xfHDv5mkuFe1tN7lG5a5llNPZodvcHon0cqLY0=; b=Wy7vu/aQGBe+yIg0Z8BYjg/C3Nn6ur1zc4nATUhh4siQqvVDoW10JnDOR9SZU+1b2KCxSZLiUz8ZqPOtTbF0DfYpdIl0L4LCgjdI9RrqO7pRwNSQM+Mp6RvxBMQN/zdo5IrhhnGD9vlqntVvl2dUwJyhSIXn7IDtN/cpZ3csPvM= Received: from BN0PR04CA0184.namprd04.prod.outlook.com (2603:10b6:408:e9::9) by PH8PR12MB6795.namprd12.prod.outlook.com (2603:10b6:510:1c6::14) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.21.71.11; Thu, 28 May 2026 05:20:11 +0000 Received: from BN2PEPF00004FBB.namprd04.prod.outlook.com (2603:10b6:408:e9:cafe::2a) by BN0PR04CA0184.outlook.office365.com (2603:10b6:408:e9::9) with Microsoft SMTP Server (version=TLS1_3, cipher=TLS_AES_256_GCM_SHA384) id 15.21.71.13 via Frontend Transport; Thu, 28 May 2026 05:20:10 +0000 X-MS-Exchange-Authentication-Results: spf=pass (sender IP is 165.204.84.17) smtp.mailfrom=amd.com; dkim=none (message not signed) header.d=none;dmarc=pass action=none header.from=amd.com; Received-SPF: Pass (protection.outlook.com: domain of amd.com designates 165.204.84.17 as permitted sender) receiver=protection.outlook.com; client-ip=165.204.84.17; helo=satlexmb07.amd.com; pr=C Received: from satlexmb07.amd.com (165.204.84.17) by BN2PEPF00004FBB.mail.protection.outlook.com (10.167.243.181) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.21.71.7 via Frontend Transport; Thu, 28 May 2026 05:20:09 +0000 Received: from purico-ed03host.amd.com (10.180.168.240) by satlexmb07.amd.com (10.181.42.216) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.2562.41; Thu, 28 May 2026 00:20:02 -0500 From: Suravee Suthikulpanit To: , , , CC: , , , , , , , , , , , , , Suravee Suthikulpanit Subject: [PATCH v2 26/26] iommu/amd: Introduce logic to check and enable vIOMMU feature Date: Thu, 28 May 2026 05:17:38 +0000 Message-ID: <20260528051738.596013-27-suravee.suthikulpanit@amd.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20260528051738.596013-1-suravee.suthikulpanit@amd.com> References: <20260528051738.596013-1-suravee.suthikulpanit@amd.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: satlexmb08.amd.com (10.181.42.217) To satlexmb07.amd.com (10.181.42.216) X-EOPAttributedMessage: 0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: BN2PEPF00004FBB:EE_|PH8PR12MB6795:EE_ X-MS-Office365-Filtering-Correlation-Id: b7bdf4a9-c162-4579-ba99-08debc78c9b1 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|36860700016|82310400026|7416014|376014|1800799024|22082099003|18002099003|56012099006|11063799006; X-Microsoft-Antispam-Message-Info: yZZeciwUEl8vx6ppqaJXfIpb6awuQgyCYCKiHx0OetI6IgDn/JNwoXJHgmVQXG+fViBQVnru8LcK3zEu0ZPf5gRarafkiWHZPENXHOV8+WhB4SLqHqt7prbfKCj2dCdx/27npufSd9Oi+ZmbIfm/xS30kdc7yelS9Nx7mrAbyCRmTH7RyoeEG9qPHO4wXNDCx6bVI+JvVVv5fTjXSKQ69pbT8svvNiw3mkVD2HXMkQc7xZV1dDDzB5SW8SLHc/Cmqpv3RhUTu8lPiTZwZQGaFiyWTLXtZn09cSWQoUmuzkkERlVmL8OUiki2yfn/A1uzmo1mDzq5KCT3VMrDWtOWgwPPdf8L1mXBQcRJpGarQ2+nh60TpRaDd3Zi3yfeIAnvoPBvPDGCYYtsZ0TKD38xcY7VRmWZdQ055HPbXlQhRRuOFD0h9KH8xa1cPDh7/sxMCywwHjbtBlEZ7ha6jEXrgEfNv/o/u2l5ch7Gh/PVa05z/mmwFRfuRbvcNWt1Ix2NUrlWpqBHUWGt/RfAzeAdS/vxOwErNDg4PkhX66r0k8Dl/XqF4a8XwSc3NdDH2vj8lILbgfTgc8eH9IvlkdHBM/uk/8iPlFSAI8JiJVrhJncI25yeHMcgFgPMfpq0iqTqSfZ1B4UxJpvvmPFbZSR48YA70kAHvN4vhMwPwXK/kz/b3DpNSPvuv9HxMsPBw3WzSxSEzA/swdquRU/EW4ShZBsrboWZm0GIsI4aEUUp/mY= X-Forefront-Antispam-Report: CIP:165.204.84.17;CTRY:US;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:satlexmb07.amd.com;PTR:InfoDomainNonexistent;CAT:NONE;SFS:(13230040)(36860700016)(82310400026)(7416014)(376014)(1800799024)(22082099003)(18002099003)(56012099006)(11063799006);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: ykTKaPRPpPq4Io505IyIDMZk6WXguNItTOWV5lws/6SaLS1t4GT2b5USFQxZOVvYvFKtfVu7VBwsP4dLmPbCQrWolYWr40TtBl/Xs8rJ76MTX+qA9ELH00Q/dJzksAIcle1oZ8L5AmSUHXj5dMj6udbYXnvC12kWOPW6UZCkceUU30aLYivzkcrp743+pmN9JB8pwBE07smipy0dLsrS+5GWBGYTpE2A4au9nZ0EMNyBbmbKDRXaYAWzYWMcp2rPkLIl9kFXrfmzpmilSNQZ7UWKikGxsOi2ILvTIsBMNEMNrrp49SGB0pgdD1GOQXonph8y6TAZZ7TxXkKwdflV8xW2reopZGYt8kIcYg6RTU3oCBvqhHq9GjCYymxCh4DfyxQbBg4WBBwdDoqz2lB/aD9039rkfHg0xw/yOTINzf1zQKgjmYhbMuqQ65gsspnf X-OriginatorOrg: amd.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 28 May 2026 05:20:09.8766 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: b7bdf4a9-c162-4579-ba99-08debc78c9b1 X-MS-Exchange-CrossTenant-Id: 3dd8961f-e488-4e60-8e11-a82d994e183d X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp: TenantId=3dd8961f-e488-4e60-8e11-a82d994e183d;Ip=[165.204.84.17];Helo=[satlexmb07.amd.com] X-MS-Exchange-CrossTenant-AuthSource: BN2PEPF00004FBB.namprd04.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Anonymous X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: PH8PR12MB6795 Content-Type: text/plain; charset="utf-8" Also switch to enable vIOMMU by default. Signed-off-by: Suravee Suthikulpanit --- drivers/iommu/amd/amd_iommu.h | 1 + drivers/iommu/amd/amd_iommu_types.h | 3 +++ drivers/iommu/amd/init.c | 12 +++++++++++- drivers/iommu/amd/viommu.c | 24 +++++++++++++++++++++++- 4 files changed, 38 insertions(+), 2 deletions(-) diff --git a/drivers/iommu/amd/amd_iommu.h b/drivers/iommu/amd/amd_iommu.h index cf2b051948a3..e505c5420255 100644 --- a/drivers/iommu/amd/amd_iommu.h +++ b/drivers/iommu/amd/amd_iommu.h @@ -27,6 +27,7 @@ void amd_iommu_restart_ga_log(struct amd_iommu *iommu); void amd_iommu_restart_ppr_log(struct amd_iommu *iommu); void amd_iommu_set_rlookup_table(struct amd_iommu *iommu, u16 devid); void iommu_feature_enable(struct amd_iommu *iommu, u8 bit); +bool iommu_feature_enable_and_check(struct amd_iommu *iommu, u8 bit); void *__init iommu_alloc_4k_pages(struct amd_iommu *iommu, gfp_t gfp, size_t size); u8 __iomem * __init iommu_map_mmio_space(u64 address, u64 end); diff --git a/drivers/iommu/amd/amd_iommu_types.h b/drivers/iommu/amd/amd_io= mmu_types.h index 44a185bfa39e..7ff714ce79b8 100644 --- a/drivers/iommu/amd/amd_iommu_types.h +++ b/drivers/iommu/amd/amd_iommu_types.h @@ -201,9 +201,12 @@ #define CONTROL_EPH_EN 45 #define CONTROL_PPR_AUTO_RSP_AON 48 #define CONTROL_XT_EN 50 +#define CONTROL_VCMD_EN 52 +#define CONTROL_VIOMMU_EN 53 #define CONTROL_INTCAPXT_EN 51 #define CONTROL_GCR3TRPMODE 58 #define CONTROL_IRTCACHEDIS 59 +#define CONTROL_GSTBUFFERTRPMODE 60 #define CONTROL_SNPAVIC_EN 61 =20 #define CTRL_INV_TO_MASK 7 diff --git a/drivers/iommu/amd/init.c b/drivers/iommu/amd/init.c index 622bc0337eda..a66a5089bf91 100644 --- a/drivers/iommu/amd/init.c +++ b/drivers/iommu/amd/init.c @@ -198,7 +198,7 @@ bool amdr_ivrs_remap_support __read_mostly; bool amd_iommu_force_isolation __read_mostly; =20 /* VIOMMU enabling flag */ -bool amd_iommu_viommu; +bool amd_iommu_viommu =3D true; =20 unsigned long amd_iommu_pgsize_bitmap __ro_after_init =3D AMD_IOMMU_PGSIZE= S; =20 @@ -417,6 +417,16 @@ void iommu_feature_enable(struct amd_iommu *iommu, u8 = bit) iommu_feature_set(iommu, 1ULL, 1ULL, bit); } =20 +bool iommu_feature_enable_and_check(struct amd_iommu *iommu, u8 bit) +{ + u64 ctrl; + + iommu_feature_enable(iommu, bit); + + ctrl =3D readq(iommu->mmio_base + MMIO_CONTROL_OFFSET); + return (ctrl & (1ULL << bit)); +} + static void iommu_feature_disable(struct amd_iommu *iommu, u8 bit) { iommu_feature_set(iommu, 0ULL, 1ULL, bit); diff --git a/drivers/iommu/amd/viommu.c b/drivers/iommu/amd/viommu.c index d2c883e314f8..4dcd781bc35a 100644 --- a/drivers/iommu/amd/viommu.c +++ b/drivers/iommu/amd/viommu.c @@ -45,6 +45,18 @@ =20 LIST_HEAD(viommu_devid_map); =20 +static int viommu_enable(struct amd_iommu *iommu) +{ + /* The GstBufferTRPMode feature is checked by set and test */ + if (!iommu_feature_enable_and_check(iommu, CONTROL_GSTBUFFERTRPMODE)) + return -EINVAL; + + iommu_feature_enable(iommu, CONTROL_VCMD_EN); + iommu_feature_enable(iommu, CONTROL_VIOMMU_EN); + + return 0; +} + static int viommu_init_pci_vsc(struct amd_iommu *iommu) { iommu->vsc_offset =3D pci_find_capability(iommu->dev, PCI_CAP_ID_VNDR); @@ -308,11 +320,21 @@ int __init amd_viommu_init(struct amd_iommu *iommu) =20 ret =3D viommu_private_space_init(iommu); if (ret) - return ret; + goto err_unmap_vf; =20 set_iommu_dte(iommu); =20 + ret =3D viommu_enable(iommu); + if (ret) + goto err_private_space; + return 0; + +err_private_space: + viommu_private_space_uninit(iommu); +err_unmap_vf: + amd_viommu_uninit(iommu); + return ret; } =20 static int __maybe_unused alloc_private_vm_region(struct amd_iommu *iommu,= u64 **entry, --=20 2.34.1