From nobody Wed Dec 17 05:51:00 2025 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id DFFC1C4167D for ; Tue, 12 Dec 2023 16:02:17 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1377096AbjLLQCJ (ORCPT ); Tue, 12 Dec 2023 11:02:09 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:42526 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1377012AbjLLQCG (ORCPT ); Tue, 12 Dec 2023 11:02:06 -0500 Received: from NAM02-SN1-obe.outbound.protection.outlook.com (mail-sn1nam02on2072.outbound.protection.outlook.com [40.107.96.72]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id C0079AD for ; Tue, 12 Dec 2023 08:02:09 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=eueI6ilIItTX3/4/hNGanLc4gMNwanCrWz4ZaDLukkkr245Uf1l78nAFjWce9/KbxpIBcSqWBLx8Ei4GENfrt8QYXcU26iUys7sC6LCd/fbCx0d5WSMlAhMm4FPr4VOhyXQxsd2Pqt4RcPwVsNrllvmODS5xafWPpluvpNLj1HWz4hnPl0QMK8ETGNDnF2+YWuI2s0Iwqi/PZgxPPGM8KHg5tj/tUwNM+FMs6JlsvM5yNQ1a19uZg6GoEpKMx5nkdpMu1DBU4JOVS4Dny10wE2oeDYOGhDBJcvGjFGhddTSRSPu39aw+U4BH1+ydPtvkaaY3KzWsNTApNQM0GfZdhg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; 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=zaJ6i7yqeoZpEAZ2MYKLsjJDAS2jqfRLLkob0r5ulcI=; b=LmIZdahltD5oxDZiBgcJuZyLXJyiC9gbpgIGIPEcbNKD5gBHWtZ4nKFzS90467B0PaAzIloBELuRzfWXp3jbRnItb1jpdBM/EfIjekwR0JHMySbDkaLK2QdOwVyWa+8+/20GzIPuuIBIBUPhvfnpkiBS8FwC3SjxC4RWInJuRJC4vAKUNuNc47ahQkhqYEBkLNbVlenZjLaYmpiLUry75PvTPB+FQsfySATYE4kpA140N+HSAtRDakAxFXSTBWK6LUftEDGuphBhsOxJwo2BCQSJVrbhwQ/IFJQcUNKOUj2lyvQKGIakzyLjCjh+UwKCCKjci+31S2ZcU8rrphpBLQ== 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=zaJ6i7yqeoZpEAZ2MYKLsjJDAS2jqfRLLkob0r5ulcI=; b=f414OM/7qTSAUjzMRDC73ZIYf/khtTTLgPGTSr5NrUIijvoOWVrwocswrNw8Bdy8p725gaerLcpBnOXGr5hpkFHL3t9wSdscqEBrlwf6U4IG2SUj+oTMkff3ZrcFsF8QXOlIMmR6tVvShHLSH91Bedb9B9HKAVvIa6qDaLYG+qk= Received: from BL0PR02CA0037.namprd02.prod.outlook.com (2603:10b6:207:3d::14) by LV8PR12MB9359.namprd12.prod.outlook.com (2603:10b6:408:1fe::10) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.7091.26; Tue, 12 Dec 2023 16:02:05 +0000 Received: from MN1PEPF0000ECDB.namprd02.prod.outlook.com (2603:10b6:207:3d:cafe::ee) by BL0PR02CA0037.outlook.office365.com (2603:10b6:207:3d::14) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.7068.32 via Frontend Transport; Tue, 12 Dec 2023 16:02: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=SATLEXMB04.amd.com; pr=C Received: from SATLEXMB04.amd.com (165.204.84.17) by MN1PEPF0000ECDB.mail.protection.outlook.com (10.167.242.139) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.20.7091.26 via Frontend Transport; Tue, 12 Dec 2023 16:02:05 +0000 Received: from ruby-95f9host.amd.com (10.180.168.240) by SATLEXMB04.amd.com (10.181.40.145) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2507.34; Tue, 12 Dec 2023 10:02:03 -0600 From: Suravee Suthikulpanit To: , , , CC: , , , , , , , , , , Suravee Suthikulpanit Subject: [RFC PATCH 1/6] iommu/amd: Update PASID, GATS, and GLX feature related macros Date: Tue, 12 Dec 2023 10:01:34 -0600 Message-ID: <20231212160139.174229-2-suravee.suthikulpanit@amd.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20231212160139.174229-1-suravee.suthikulpanit@amd.com> References: <20231212160139.174229-1-suravee.suthikulpanit@amd.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-Originating-IP: [10.180.168.240] X-ClientProxiedBy: SATLEXMB03.amd.com (10.181.40.144) To SATLEXMB04.amd.com (10.181.40.145) X-EOPAttributedMessage: 0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: MN1PEPF0000ECDB:EE_|LV8PR12MB9359:EE_ X-MS-Office365-Filtering-Correlation-Id: 96aeb359-6461-49b3-147d-08dbfb2bafe0 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: WHdhS27qTeKzis+U2tbplak2RUP2gAoNS3YLWomaFdYHWpzbitJJkWK602YniFfna/D0nYt0g7LKWpy59MnAN8bfRDtXnThw13K9tCNH+uiIcGKnB4gNyYpKGOwuXawmSVY33UdCnS9RClKsN+z9o/TZ5bx9lKkIvQHin9Gk8c8xrrgJp6Keab0WFaFcfyFDrgNCSIBtCP3D2kdspdxsrJ9hS+GRUSVT4RhNUT+xqPULwSUB+4kkUEMl8vC8atMvcqiJDknbhaBIWjxhIboNeUQmti6I1HezkEJL2CiBKIQEk/bWfwAH5LqdMCRzQ2e7CEUoLnN3iwitjRMUyDQ7Q/EW9LFTagb8TEpSbL4+Hc1aRiyXs/XadHxLSJMZgVNNwHj8kGCvyehOq6TVwytuaDiTajX454783sWHPGsmSadtw+mDay2nPnGBLkdhQ88712zBOplaZBWuwrO+F2xs94JY7gummRNAqkB/Si5YhBbAnYLHb1y1wQREx8U31C7J0bD16keJ/ElqLFRULmcAVC0OKehBymfB6x1fP7QUhIqu/SmZNLyn+xtBQQAzVqHXcvHzOmrwvQXan5RxbRXTXnqD619jeogs8JIqIs311MBDwJUoAf7fTRuKY64kfb5STzGCOemwdXZHyuDeUKdAjR4oCoSx3qH4Zjl5tTGFCIusAN03kCG3QKtOxpJZW6rbSFteCEbJljjlfdhUvsNeNUYurqy3SG+7ZMM6h9DBRjX46DiY5BC3Z69G4H8+qvTc6q2+xGv1kyGsuMu1fJf312i6lps0Krj25rLJWz3eOBE= X-Forefront-Antispam-Report: CIP:165.204.84.17;CTRY:US;LANG:en;SCL:1;SRV:;IPV:CAL;SFV:NSPM;H:SATLEXMB04.amd.com;PTR:InfoDomainNonexistent;CAT:NONE;SFS:(13230031)(4636009)(376002)(136003)(346002)(396003)(39860400002)(230922051799003)(82310400011)(186009)(1800799012)(64100799003)(451199024)(40470700004)(36840700001)(46966006)(8676002)(8936002)(4326008)(2906002)(44832011)(40480700001)(316002)(40460700003)(7416002)(5660300002)(110136005)(70206006)(70586007)(54906003)(478600001)(36860700001)(26005)(336012)(426003)(36756003)(1076003)(7696005)(6666004)(41300700001)(2616005)(16526019)(81166007)(82740400003)(356005)(83380400001)(47076005)(86362001)(36900700001)(2101003);DIR:OUT;SFP:1101; X-OriginatorOrg: amd.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 12 Dec 2023 16:02:05.5452 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: 96aeb359-6461-49b3-147d-08dbfb2bafe0 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=[SATLEXMB04.amd.com] X-MS-Exchange-CrossTenant-AuthSource: MN1PEPF0000ECDB.namprd02.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Anonymous X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: LV8PR12MB9359 Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" Clean up and reorder them according to the bit index. There is no functional change. Signed-off-by: Suravee Suthikulpanit --- drivers/iommu/amd/amd_iommu.h | 2 +- drivers/iommu/amd/amd_iommu_types.h | 13 +++++++------ drivers/iommu/amd/init.c | 8 ++++---- 3 files changed, 12 insertions(+), 11 deletions(-) diff --git a/drivers/iommu/amd/amd_iommu.h b/drivers/iommu/amd/amd_iommu.h index bbed268e8abc..108253edbeb0 100644 --- a/drivers/iommu/amd/amd_iommu.h +++ b/drivers/iommu/amd/amd_iommu.h @@ -106,7 +106,7 @@ static inline bool check_feature2(u64 mask) =20 static inline int check_feature_gpt_level(void) { - return ((amd_iommu_efr >> FEATURE_GATS_SHIFT) & FEATURE_GATS_MASK); + return ((amd_iommu_efr & FEATURE_GATS_MASK) >> FEATURE_GATS_SHIFT); } =20 static inline bool amd_iommu_gt_ppr_supported(void) diff --git a/drivers/iommu/amd/amd_iommu_types.h b/drivers/iommu/amd/amd_io= mmu_types.h index 3dc39bbc05fc..14f67a8cf755 100644 --- a/drivers/iommu/amd/amd_iommu_types.h +++ b/drivers/iommu/amd/amd_iommu_types.h @@ -93,8 +93,6 @@ #define FEATURE_GA BIT_ULL(7) #define FEATURE_HE BIT_ULL(8) #define FEATURE_PC BIT_ULL(9) -#define FEATURE_GATS_SHIFT (12) -#define FEATURE_GATS_MASK (3ULL) #define FEATURE_GAM_VAPIC BIT_ULL(21) #define FEATURE_GIOSUP BIT_ULL(48) #define FEATURE_HASUP BIT_ULL(49) @@ -102,11 +100,14 @@ #define FEATURE_HDSUP BIT_ULL(52) #define FEATURE_SNP BIT_ULL(63) =20 -#define FEATURE_PASID_SHIFT 32 -#define FEATURE_PASID_MASK (0x1fULL << FEATURE_PASID_SHIFT) +#define FEATURE_GATS_SHIFT 12 +#define FEATURE_GATS_MASK (0x03ULL << FEATURE_GATS_SHIFT) =20 -#define FEATURE_GLXVAL_SHIFT 14 -#define FEATURE_GLXVAL_MASK (0x03ULL << FEATURE_GLXVAL_SHIFT) +#define FEATURE_GLX_SHIFT 14 +#define FEATURE_GLX_MASK (0x03ULL << FEATURE_GLX_SHIFT) + +#define FEATURE_PASMAX_SHIFT 32 +#define FEATURE_PASMAX_MASK (0x1FULL << FEATURE_PASMAX_SHIFT) =20 /* Extended Feature 2 Bits */ #define FEATURE_SNPAVICSUP_SHIFT 5 diff --git a/drivers/iommu/amd/init.c b/drivers/iommu/amd/init.c index 959820ccfbcc..e84c69fe13d4 100644 --- a/drivers/iommu/amd/init.c +++ b/drivers/iommu/amd/init.c @@ -2080,14 +2080,14 @@ static int __init iommu_init_pci(struct amd_iommu *= iommu) int glxval; u64 pasmax; =20 - pasmax =3D amd_iommu_efr & FEATURE_PASID_MASK; - pasmax >>=3D FEATURE_PASID_SHIFT; + pasmax =3D amd_iommu_efr & FEATURE_PASMAX_MASK; + pasmax >>=3D FEATURE_PASMAX_SHIFT; iommu->iommu.max_pasids =3D (1 << (pasmax + 1)) - 1; =20 BUG_ON(iommu->iommu.max_pasids & ~PASID_MASK); =20 - glxval =3D amd_iommu_efr & FEATURE_GLXVAL_MASK; - glxval >>=3D FEATURE_GLXVAL_SHIFT; + glxval =3D amd_iommu_efr & FEATURE_GLX_MASK; + glxval >>=3D FEATURE_GLX_SHIFT; =20 if (amd_iommu_max_glx_val =3D=3D -1) amd_iommu_max_glx_val =3D glxval; --=20 2.34.1 From nobody Wed Dec 17 05:51:00 2025 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id B04A9C4332F for ; Tue, 12 Dec 2023 16:02:15 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1377035AbjLLQCH (ORCPT ); Tue, 12 Dec 2023 11:02:07 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:42510 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1376736AbjLLQCG (ORCPT ); Tue, 12 Dec 2023 11:02:06 -0500 Received: from NAM12-DM6-obe.outbound.protection.outlook.com (mail-dm6nam12on2087.outbound.protection.outlook.com [40.107.243.87]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id A26B4AA for ; Tue, 12 Dec 2023 08:02:09 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=oA9GwVNGwrQUhaeUG9X527WDsCF1Ce/6RcwJ0vDDk3TZXv1aDPfKSzlH26CsGdHv7b8EU9Bcdjr/zzOQV9cssI6BEWAD39TpWlZecoZ4P+mkvTX8rbQfSXwEXKk7p+tKLVTsIE6agP33t88GArZzE1BUX/N/gkXSLLRe6py8AvjzY+tSLb982xKr6ldSGZMIFTLBrtDzirpNSyYPksSfhoLkjVWY1d1MlLi6GCax+n/FJvI9xhTkvEz8kTR20HbBvoacJxtceCwkCVDdcSNLzA+uJRwb5ozlRfO8/xnig3CwD/KAWP9Az04A1qJBjEueJOn05+n0duwnmsL0L/mjxg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; 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=gvVFgIcnPdCeXk70+pGgRUBYR91xAlnGJLYJHydkBZY=; b=LUAa80ug3bgNnOrY2JFh/4c9IC2Eu2Dhg3ZV5q0SlkfD1pEgM4mVBTdn+BMxREjglg5wnl9LosrVf5XHWk/DO3PevunpBPaArbSM6e+bnlFQPmiiVBWbcIL9vpZXWBYvo89zPyZX01nqE+k3eEK/YjZ4UsYA2oRx8uWP93LuX9pdyymjBgRQO9kauVU68aulDQhVs+MASprcA5oGka/6ig2CW01JuUdjrRSK4ww4mWBU/VkG2WwpR0Htm9pllwP2n+k8t+K0AmRPuoarTXNQP00PqYtQK0/tsa42Hr19zjO/Kux/3DXmyAC+l0rnXS32bcquiOgUpkuRVHiQUUDYVA== 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=gvVFgIcnPdCeXk70+pGgRUBYR91xAlnGJLYJHydkBZY=; b=OZqKLKYsOGK4tOdS2EAmgVHseULY/U8Q8AZdXXPfiJXHObhAHRWNz71f6eAqA40Jyvd8J09p7Gf8YEW6lB3kOJfFkWpA+fm87o0x9UA3yIapbNghN/WSJzjmLDOYGmHwvaPgN/difcKoQoabiTZcNhgVNgLVKARat3kIX3zWWuU= Received: from BL0PR02CA0062.namprd02.prod.outlook.com (2603:10b6:207:3d::39) by IA0PR12MB7776.namprd12.prod.outlook.com (2603:10b6:208:430::15) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.7091.26; Tue, 12 Dec 2023 16:02:06 +0000 Received: from MN1PEPF0000ECDB.namprd02.prod.outlook.com (2603:10b6:207:3d:cafe::f8) by BL0PR02CA0062.outlook.office365.com (2603:10b6:207:3d::39) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.7068.32 via Frontend Transport; Tue, 12 Dec 2023 16:02:06 +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=SATLEXMB04.amd.com; pr=C Received: from SATLEXMB04.amd.com (165.204.84.17) by MN1PEPF0000ECDB.mail.protection.outlook.com (10.167.242.139) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.20.7091.26 via Frontend Transport; Tue, 12 Dec 2023 16:02:06 +0000 Received: from ruby-95f9host.amd.com (10.180.168.240) by SATLEXMB04.amd.com (10.181.40.145) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2507.34; Tue, 12 Dec 2023 10:02:04 -0600 From: Suravee Suthikulpanit To: , , , CC: , , , , , , , , , , Suravee Suthikulpanit Subject: [RFC PATCH 2/6] iommu/amd: Add support for hw_info for iommu capability query Date: Tue, 12 Dec 2023 10:01:35 -0600 Message-ID: <20231212160139.174229-3-suravee.suthikulpanit@amd.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20231212160139.174229-1-suravee.suthikulpanit@amd.com> References: <20231212160139.174229-1-suravee.suthikulpanit@amd.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-Originating-IP: [10.180.168.240] X-ClientProxiedBy: SATLEXMB03.amd.com (10.181.40.144) To SATLEXMB04.amd.com (10.181.40.145) X-EOPAttributedMessage: 0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: MN1PEPF0000ECDB:EE_|IA0PR12MB7776:EE_ X-MS-Office365-Filtering-Correlation-Id: 259eb8e3-a038-46eb-9818-08dbfb2bb065 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: Im8qmPCVYBG1LslKXJYq8Q3JF8o1FEdmxh0byLzDXyb3t4tHg8olT6loEGWEdVT9NV15nBN7logvrKLJq2IaFuw1yTq2vmtw0WEGlSsYIUX6XtXVGT/pDF9K3Cu2AZv4IU7Dj/SPzcOTzbzgqg9cHx/qeOGcdmqrwbA6pOXbOkLBKns52kQbH/T1hKLV9VO7lwDkAEkDG/hoXg/RmymL9Q778nhW8wKuNdZJ+Bv6NArcPg+0Oz+VUIMcQjjpQFEidy1SNTMI8bAW5Ff64o7aY2ppuD5cAeFTpSvBmlrIfNmlk7DpktLePUXlSd2nENa6TbRuzlrESwv6rPLjAoZz3LmfhkuVcG/RvBDlo/0yJAMkxkXj4Yz2mLTG9imri8Y7+A+b2bQmIVtzj6TqTKp5Sm7No6e22NOUZxxu1EZGO6G/R4BFk7epKpKWKovT3ysHsNQ1VxWqMk8Jottv+Au1RgfXG2KvNZBS3SPCKKPToCqRzA0Tbsd4/uPlTXnsZaT6tJN9rJTlMXF6jtTW4HA+rR0aNmRp8honj39SszNX/mC+rUE8BxAsKrvMUjI/YYcQsUK1YLrDKyKBW9zVR8WTzgnc5mVTlIHruWuHvEL3eRuGo8tjegyNc30ghFhJjBIb/4QhHrsWvk5RXFbjnSnFAdBcTp6mg203hNoXTdnYhLzybx0AjiOsvg6N2Kw9l4xHz4aWG7c0GG/tTDtocHZQ/kI5hRiNGCrYTvV5Uc0/GWUqloYZgtwRiIy/X51cL6rqDd1ORn4vhB9Q36mTyD2qd649KjXnZYbSaOYPiNjw+jA= X-Forefront-Antispam-Report: CIP:165.204.84.17;CTRY:US;LANG:en;SCL:1;SRV:;IPV:CAL;SFV:NSPM;H:SATLEXMB04.amd.com;PTR:InfoDomainNonexistent;CAT:NONE;SFS:(13230031)(4636009)(39860400002)(346002)(376002)(396003)(136003)(230922051799003)(451199024)(1800799012)(64100799003)(186009)(82310400011)(40470700004)(46966006)(36840700001)(40460700003)(26005)(336012)(426003)(7696005)(1076003)(2616005)(47076005)(36860700001)(44832011)(5660300002)(8676002)(8936002)(16526019)(41300700001)(7416002)(316002)(2906002)(6666004)(4326008)(478600001)(54906003)(70206006)(110136005)(82740400003)(36756003)(70586007)(86362001)(356005)(81166007)(40480700001)(2101003)(36900700001);DIR:OUT;SFP:1101; X-OriginatorOrg: amd.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 12 Dec 2023 16:02:06.3733 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: 259eb8e3-a038-46eb-9818-08dbfb2bb065 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=[SATLEXMB04.amd.com] X-MS-Exchange-CrossTenant-AuthSource: MN1PEPF0000ECDB.namprd02.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Anonymous X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: IA0PR12MB7776 Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" AMD IOMMU Extended Feature (EFR) and Extended Feature 2 (EFR2) registers specify features supported by each IOMMU hardware instance. The IOMMU driver checks each feature-specific bits before enabling each feature at run time. For IOMMUFD, the hypervisor determines which IOMMU features to support in the guest, and communicates this information to user-space (e.g. QEMU) via iommufd IOMMU_DEVICE_GET_HW_INFO ioctl. Signed-off-by: Suravee Suthikulpanit --- drivers/iommu/amd/amd_iommu.h | 2 ++ drivers/iommu/amd/amd_iommu_types.h | 3 +++ drivers/iommu/amd/iommu.c | 38 +++++++++++++++++++++++++++++ include/uapi/linux/iommufd.h | 13 ++++++++++ 4 files changed, 56 insertions(+) diff --git a/drivers/iommu/amd/amd_iommu.h b/drivers/iommu/amd/amd_iommu.h index 108253edbeb0..4118129f4a24 100644 --- a/drivers/iommu/amd/amd_iommu.h +++ b/drivers/iommu/amd/amd_iommu.h @@ -72,6 +72,8 @@ void amd_iommu_dev_flush_pasid_pages(struct iommu_dev_dat= a *dev_data, void amd_iommu_dev_flush_pasid_all(struct iommu_dev_data *dev_data, ioasid_t pasid); =20 +void amd_iommu_build_efr(u64 *efr, u64 *efr2); + #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 14f67a8cf755..956fd4658a4a 100644 --- a/drivers/iommu/amd/amd_iommu_types.h +++ b/drivers/iommu/amd/amd_iommu_types.h @@ -100,12 +100,15 @@ #define FEATURE_HDSUP BIT_ULL(52) #define FEATURE_SNP BIT_ULL(63) =20 +#define FEATURE_GATS_5LEVEL 1ULL #define FEATURE_GATS_SHIFT 12 #define FEATURE_GATS_MASK (0x03ULL << FEATURE_GATS_SHIFT) =20 +#define FEATURE_GLX_3LEVEL 0ULL #define FEATURE_GLX_SHIFT 14 #define FEATURE_GLX_MASK (0x03ULL << FEATURE_GLX_SHIFT) =20 +#define FEATURE_PASMAX_16 0xFULL #define FEATURE_PASMAX_SHIFT 32 #define FEATURE_PASMAX_MASK (0x1FULL << FEATURE_PASMAX_SHIFT) =20 diff --git a/drivers/iommu/amd/iommu.c b/drivers/iommu/amd/iommu.c index 4e4ff1550cf3..c41932e9f16a 100644 --- a/drivers/iommu/amd/iommu.c +++ b/drivers/iommu/amd/iommu.c @@ -2822,8 +2822,46 @@ static const struct iommu_dirty_ops amd_dirty_ops = =3D { .read_and_clear_dirty =3D amd_iommu_read_and_clear_dirty, }; =20 +void amd_iommu_build_efr(u64 *efr, u64 *efr2) +{ + if (efr) { + *efr =3D (FEATURE_GT | FEATURE_GIOSUP | FEATURE_PPR); + + /* 5-level v2 page table support */ + *efr |=3D ((FEATURE_GATS_5LEVEL << FEATURE_GATS_SHIFT) & + FEATURE_GATS_MASK); + + /* 3-level GCR3 table support */ + *efr |=3D ((FEATURE_GLX_3LEVEL << FEATURE_GLX_SHIFT) & + FEATURE_GLX_MASK); + + /* 16-bit PASMAX support */ + *efr |=3D ((FEATURE_PASMAX_16 << FEATURE_PASMAX_SHIFT) & + FEATURE_PASMAX_MASK); + } + + if (efr2) + *efr2 =3D 0; +} + +static void *amd_iommu_hw_info(struct device *dev, u32 *length, u32 *type) +{ + struct iommu_hw_info_amd *hwinfo; + + hwinfo =3D kzalloc(sizeof(*hwinfo), GFP_KERNEL); + if (!hwinfo) + return ERR_PTR(-ENOMEM); + + *length =3D sizeof(*hwinfo); + *type =3D IOMMU_HW_INFO_TYPE_AMD; + + amd_iommu_build_efr(&hwinfo->efr, &hwinfo->efr2); + return hwinfo; +} + const struct iommu_ops amd_iommu_ops =3D { .capable =3D amd_iommu_capable, + .hw_info =3D amd_iommu_hw_info, .domain_alloc =3D amd_iommu_domain_alloc, .domain_alloc_user =3D amd_iommu_domain_alloc_user, .probe_device =3D amd_iommu_probe_device, diff --git a/include/uapi/linux/iommufd.h b/include/uapi/linux/iommufd.h index 0b2bc6252e2c..bf4a1f8ab748 100644 --- a/include/uapi/linux/iommufd.h +++ b/include/uapi/linux/iommufd.h @@ -474,15 +474,28 @@ struct iommu_hw_info_vtd { __aligned_u64 ecap_reg; }; =20 +/** + * struct iommu_hw_info_amd - AMD IOMMU device info + * + * @efr : Value of AMD IOMMU Extended Feature Register (EFR) + * @efr2: Value of AMD IOMMU Extended Feature 2 Register (EFR2) + */ +struct iommu_hw_info_amd { + __u64 efr; + __u64 efr2; +}; + /** * enum iommu_hw_info_type - IOMMU Hardware Info Types * @IOMMU_HW_INFO_TYPE_NONE: Used by the drivers that do not report hardwa= re * info * @IOMMU_HW_INFO_TYPE_INTEL_VTD: Intel VT-d iommu info type + * @IOMMU_HW_INFO_TYPE_AMD: AMD IOMMU info type */ enum iommu_hw_info_type { IOMMU_HW_INFO_TYPE_NONE, IOMMU_HW_INFO_TYPE_INTEL_VTD, + IOMMU_HW_INFO_TYPE_AMD, }; =20 /** --=20 2.34.1 From nobody Wed Dec 17 05:51:00 2025 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id EBEE0C4332F for ; Tue, 12 Dec 2023 16:02:28 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1377105AbjLLQCU (ORCPT ); Tue, 12 Dec 2023 11:02:20 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:42576 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1377081AbjLLQCI (ORCPT ); Tue, 12 Dec 2023 11:02:08 -0500 Received: from NAM11-DM6-obe.outbound.protection.outlook.com (mail-dm6nam11on2046.outbound.protection.outlook.com [40.107.223.46]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id E1C35B4 for ; Tue, 12 Dec 2023 08:02:10 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=DMjSB+L+2kF39oUPpRwMn7W6/jsvecGRqGh6wELiUsPscEYSOmT8qCaYnzHl2OXxF8lbHVDyoqiePuPShGdW1rboXXuUrTkWUqo6GeJhL8E7H+hwomcroYENJ5t2iEeSsmCLK2VbX+UmEuTH2pLn9u5mVmO/tow/DSXeC3/Slp5yTCqamtltzI9k28GIBqGLef20klhRl/FhKH9b36E12zU20XNCjciLfHb2/OHZGV7lu3JYfU3OPCXbSSDO6JUztv2EmrZGH9MR3Emwn3nFmKAOR6X3C/HBKpCQGK+k5+0HNPsvYJdVGRr+N0WDnWnRZc5t3Az/LkvrAokZ1wMz1A== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; 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=6cUejR/Qm0+2o+nSpuo39RgV/FP9KIqGrUvNqw4vhYs=; b=a/H65hjC988BLaxtYxwPmUTjLHbXGTdd/nOMUHSz0CsfZcdRJHTyfGQA+PTmSONW4IYWGoJd2Jff/LNlNmHC1RwjzlPZ0k2aG2HDmV9+Kn3kS7s/4ocJLDeyUn4vwfM7EUmX3cpGRiWElxy4P1wUdzV9Zq0jeTxbVkQUxW2ABoB5mV8mfoiqdzb438E8pgg4zNrsu3vK3B+FHISyhWxZZgn7hMlXKQ83mYcZcf6vFZnMarHxmefKtAz92/GMSiuPMroiwZBaWZBCgiKsPayh2Bcfd4I+y+kXZ5jnuzG4wqxOJDynkgWwIKz9OrhBvz15cQoPvIOni1lWRkF0yoXaGQ== 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=6cUejR/Qm0+2o+nSpuo39RgV/FP9KIqGrUvNqw4vhYs=; b=BEusraJChieOiuaJZXmbvY84IFGhmk8R1jT+rYZgQhJbDZhjmFXIXRIOtw/QC53lunJ4xiw/b/RK6Yjocmx9DqGiHyiflTAr6AN2X5P5w0hwqm/CbBaWC3GZhTJMYqKtIhpt6D3CDbjOvvyZmCblgE+VELK+bneVzUYGYltiPHY= Received: from BL0PR02CA0106.namprd02.prod.outlook.com (2603:10b6:208:51::47) by MW6PR12MB8662.namprd12.prod.outlook.com (2603:10b6:303:243::6) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.7068.32; Tue, 12 Dec 2023 16:02:07 +0000 Received: from MN1PEPF0000ECD6.namprd02.prod.outlook.com (2603:10b6:208:51:cafe::38) by BL0PR02CA0106.outlook.office365.com (2603:10b6:208:51::47) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.7091.26 via Frontend Transport; Tue, 12 Dec 2023 16:02:07 +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=SATLEXMB04.amd.com; pr=C Received: from SATLEXMB04.amd.com (165.204.84.17) by MN1PEPF0000ECD6.mail.protection.outlook.com (10.167.242.135) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.20.7091.18 via Frontend Transport; Tue, 12 Dec 2023 16:02:07 +0000 Received: from ruby-95f9host.amd.com (10.180.168.240) by SATLEXMB04.amd.com (10.181.40.145) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2507.34; Tue, 12 Dec 2023 10:02:05 -0600 From: Suravee Suthikulpanit To: , , , CC: , , , , , , , , , , Suravee Suthikulpanit Subject: [RFC PATCH 3/6] iommu/amd: Introduce Guest-ID struct amd_iommu_vminfo Date: Tue, 12 Dec 2023 10:01:36 -0600 Message-ID: <20231212160139.174229-4-suravee.suthikulpanit@amd.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20231212160139.174229-1-suravee.suthikulpanit@amd.com> References: <20231212160139.174229-1-suravee.suthikulpanit@amd.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-Originating-IP: [10.180.168.240] X-ClientProxiedBy: SATLEXMB03.amd.com (10.181.40.144) To SATLEXMB04.amd.com (10.181.40.145) X-EOPAttributedMessage: 0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: MN1PEPF0000ECD6:EE_|MW6PR12MB8662:EE_ X-MS-Office365-Filtering-Correlation-Id: e1541d59-45b8-40a6-8f22-08dbfb2bb0d9 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: Hvjr6FCa9F4gN9M+5eJ1wGvQbb6Gc+pD9oSaLxH8TWOryheMoaCgFXUWzlckelbykC8sHOs7gVBckvkw97zwomEqNgYE6fsWpAfkJYCRrRf0H40Vrw5dIA6RRAFUu6atmLI5cMpYe9DYuErDBFGHUULawZE1IY+GWtV1hRMXDZflqPhBCNHnaWlwADnp72ZV0FvxXTWbe+4yN8XgQwCACkpRdjkmzrC4X85X0j9SnD0TL8xsaGbquHte6MiOmRltlhXY5xSpraJt2ApolCC9M/dd2GlUxeaow5quPFQK9Ojdw+ZolRjX9Td3OMyE6RjNuDYHlwoG6T1oFX8MpjtWUw7d1MSvBL166fG0j4EIiOwuJroXw30OkjEX8sW/+ebwd05gn/afKLOE+5npysNPhuu4EWjkQt8DHtY0TQ/8LUNyno3s9RQwP9BWC+hWrwkEV6WzAKRNogpDVvB7W+wz2rgHarAX8IBsCFpMFVZi5/jhe3oTxS5323qtezrm/Sk7REqD0lvDn1z9At8Byej+VXMADmUROEpdEz69aTtWilBBTKfZ4uS73BQ9L+UOG7bVz6JiA0R9Lk8xoBBZLhFtnJj6uw3n7MfE5Ft70zaGh/XwbvtC8RLSYGOdPmqSsMkz0Qbt/AQIkU53oQHz7bFv4UcNxhq0xOAooQdKtoHc26F8F/azG85JO/o77AP5hCdAS1aq3luJJrgLaPENsi60arQr9k+prnJgNhhXbMyV9SipKTuuroAV+EltqL6HFpzNFWZsRBUb9BnHfgo+5gulVhnR4Q1o3GgUZj4y2UVce3g= X-Forefront-Antispam-Report: CIP:165.204.84.17;CTRY:US;LANG:en;SCL:1;SRV:;IPV:CAL;SFV:NSPM;H:SATLEXMB04.amd.com;PTR:InfoDomainNonexistent;CAT:NONE;SFS:(13230031)(4636009)(396003)(376002)(39860400002)(136003)(346002)(230922051799003)(1800799012)(82310400011)(186009)(451199024)(64100799003)(40470700004)(46966006)(36840700001)(16526019)(1076003)(47076005)(6666004)(7696005)(336012)(478600001)(26005)(2616005)(36860700001)(83380400001)(41300700001)(7416002)(5660300002)(54906003)(2906002)(426003)(44832011)(70206006)(8676002)(316002)(8936002)(4326008)(81166007)(110136005)(70586007)(86362001)(356005)(82740400003)(36756003)(40480700001)(40460700003)(2101003)(36900700001);DIR:OUT;SFP:1101; X-OriginatorOrg: amd.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 12 Dec 2023 16:02:07.1801 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: e1541d59-45b8-40a6-8f22-08dbfb2bb0d9 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=[SATLEXMB04.amd.com] X-MS-Exchange-CrossTenant-AuthSource: MN1PEPF0000ECD6.namprd02.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Anonymous X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: MW6PR12MB8662 Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" AMD HW-vIOMMU feature requires IOMMU driver to specify a unique 16-bit Guest ID (GID) for each VM. This ID is used to index into various data structures for configuring the hardware. Introduce amd_iommu_vminfo_hash hashtable to store per-vm configuration, which uses 16-bit GID as a hash key along with helper functions. Signed-off-by: Suravee Suthikulpanit --- drivers/iommu/amd/amd_iommu.h | 6 +++ drivers/iommu/amd/amd_iommu_types.h | 6 +++ drivers/iommu/amd/iommu.c | 66 +++++++++++++++++++++++++++++ 3 files changed, 78 insertions(+) diff --git a/drivers/iommu/amd/amd_iommu.h b/drivers/iommu/amd/amd_iommu.h index 4118129f4a24..7783a933ad14 100644 --- a/drivers/iommu/amd/amd_iommu.h +++ b/drivers/iommu/amd/amd_iommu.h @@ -182,4 +182,10 @@ void amd_iommu_domain_set_pgtable(struct protection_do= main *domain, struct dev_table_entry *get_dev_table(struct amd_iommu *iommu); =20 extern bool amd_iommu_snp_en; + +/* AMD IOMMU GID */ +int amd_iommu_vminfo_alloc(struct amd_iommu *iommu, struct amd_iommu_vminf= o *vminfo); +void amd_iommu_vminfo_free(struct amd_iommu *iommu, struct amd_iommu_vminf= o *vminfo); +struct amd_iommu_vminfo *amd_iommu_get_vminfo(int gid); + #endif diff --git a/drivers/iommu/amd/amd_iommu_types.h b/drivers/iommu/amd/amd_io= mmu_types.h index 956fd4658a4a..a00731673c50 100644 --- a/drivers/iommu/amd/amd_iommu_types.h +++ b/drivers/iommu/amd/amd_iommu_types.h @@ -16,6 +16,7 @@ #include #include #include +#include =20 /* * Maximum number of IOMMUs supported @@ -1053,6 +1054,11 @@ struct amd_irte_ops { void (*clear_allocated)(struct irq_remap_table *, int); }; =20 +struct amd_iommu_vminfo { + u16 gid; + struct hlist_node hnode; +}; + #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/iommu.c b/drivers/iommu/amd/iommu.c index c41932e9f16a..d18b23ac6357 100644 --- a/drivers/iommu/amd/iommu.c +++ b/drivers/iommu/amd/iommu.c @@ -23,6 +23,7 @@ #include #include #include +#include #include #include #include @@ -66,6 +67,16 @@ LIST_HEAD(acpihid_map); const struct iommu_ops amd_iommu_ops; static const struct iommu_dirty_ops amd_dirty_ops; =20 +/* VMInfo Hashtable */ +#define AMD_IOMMU_VMINFO_HASH_BITS 16 +DEFINE_HASHTABLE(amd_iommu_vminfo_hash, AMD_IOMMU_VMINFO_HASH_BITS); +DEFINE_SPINLOCK(amd_iommu_vminfo_hash_lock); + +/* Global VMID */ +#define AMD_IOMMU_VMID_INVALID (-1U) +static DEFINE_IDA(amd_iommu_global_vmid_ida); +static u32 amd_iommu_latest_gid; + int amd_iommu_max_glx_val =3D -1; =20 /* @@ -101,6 +112,61 @@ static inline bool domain_id_is_per_dev(struct protect= ion_domain *pdom) return (pdom && pdom->pd_mode !=3D PD_MODE_V1); } =20 +int get_vmid(void) +{ + int ret; + + ret =3D ida_alloc_range(&amd_iommu_global_vmid_ida, 1, 0xFFFF, GFP_KERNEL= ); + return ret < 0 ? AMD_IOMMU_VMID_INVALID : ret; +} + +int amd_iommu_vminfo_alloc(struct amd_iommu *iommu, struct amd_iommu_vminf= o *vminfo) +{ + u32 gid; + unsigned long flags; + + spin_lock_irqsave(&amd_iommu_vminfo_hash_lock, flags); + gid =3D amd_iommu_latest_gid =3D get_vmid(); + if (gid =3D=3D AMD_IOMMU_VMID_INVALID) + return -EINVAL; + + pr_debug("%s: gid=3D%u\n", __func__, gid); + vminfo->gid =3D gid; + hash_add(amd_iommu_vminfo_hash, &vminfo->hnode, vminfo->gid); + spin_unlock_irqrestore(&amd_iommu_vminfo_hash_lock, flags); + return 0; +} + +void amd_iommu_vminfo_free(struct amd_iommu *iommu, + struct amd_iommu_vminfo *vminfo) +{ + unsigned long flags; + + pr_debug("%s: gid=3D%u\n", __func__, vminfo->gid); + spin_lock_irqsave(&amd_iommu_vminfo_hash_lock, flags); + hash_del(&vminfo->hnode); + ida_free(&amd_iommu_global_vmid_ida, vminfo->gid); + spin_unlock_irqrestore(&amd_iommu_vminfo_hash_lock, flags); +} + +struct amd_iommu_vminfo *amd_iommu_get_vminfo(int gid) +{ + unsigned long flags; + struct amd_iommu_vminfo *tmp, *ptr =3D NULL; + + spin_lock_irqsave(&amd_iommu_vminfo_hash_lock, flags); + hash_for_each_possible(amd_iommu_vminfo_hash, tmp, hnode, gid) { + if (tmp->gid =3D=3D gid) { + ptr =3D tmp; + break; + } + } + if (!ptr) + pr_debug("%s : gid=3D%u not found\n", __func__, gid); + spin_unlock_irqrestore(&amd_iommu_vminfo_hash_lock, flags); + return ptr; +} + static inline int get_acpihid_device_id(struct device *dev, struct acpihid_map_entry **entry) { --=20 2.34.1 From nobody Wed Dec 17 05:51:00 2025 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 62913C4332F for ; Tue, 12 Dec 2023 16:02:21 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1377122AbjLLQCM (ORCPT ); Tue, 12 Dec 2023 11:02:12 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:42580 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1377067AbjLLQCI (ORCPT ); Tue, 12 Dec 2023 11:02:08 -0500 Received: from NAM04-MW2-obe.outbound.protection.outlook.com (mail-mw2nam04on2061.outbound.protection.outlook.com [40.107.101.61]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 86A6FE4 for ; Tue, 12 Dec 2023 08:02:12 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=AtvayVBtQe4rq+EChi/gUPv75tgAgmNv57FV6SqvJ4XUJhdCGs1a2bVurBGc3YIUMmuHRk2Ts1Ik8r260nmHN7cRIkTKPmcm5FdAWIRYShy84r/Y8kzvM6Nsku076/tw93kickb94BAE1O9+nQH6uSmTbsTWBIuj6nMPlUF/qB39mX3x/b0Rnl4qgXM8CT8+lFlSqy20XL/Gawp+lDkdwuK9p9kxguO8Gu/at7O5u5fUTJnrqC69Z6h/jQYSM+yGXF2WQ04dnuJVrDM0IIOkcodA5YV/gx7rABa0mr1RAsZcK8J821HZpsA0tQ6hvcIsORtYQGvZFZMtmuAK86K++w== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; 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=MUFLSNQg7aQQMVuKUbAGPiamZbXRs4qJEBIyaa8j4mw=; b=LOE4WYgwnOb4N3In/RIxbV/fYw9ULxpsTcOF4a90GMzwvbjDmXJoRC5+lbSgVHV+yB6GJMAFrOvvdRCO+ho80VJcGFwnWrn1ULBseeyFqAd9yLJqnNPiSChAZdkuD/W67WyJdUPArGU6dt1KE7bo8xUPTK9MA+b6UBsCayS4HrLCD14cg+Ob5YotKlVjvx6Uf+hFkP2A23/HEUAwtWlSc58YNhMRbM2iSFHKt5oMarh4uVoiXC4FroIpv0KBF6ND+d55ZBTu8kecDxo0rbXw80yMnKP87rIAiuKrovsZmsShDoZ26KzcvbsnrLykrUAFsZaHHONJZPpgTfjonOI6Vw== 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=MUFLSNQg7aQQMVuKUbAGPiamZbXRs4qJEBIyaa8j4mw=; b=KQU2+yPJhZaDTB0VJvfjp/1dnpC1VM57GdY0WCeXsVgr0OuHAIt1EfYfXJ90sDKYm5VtTajFeqiADwGi89eN/BPhr8S7R/D4QpBb9kO5EEQV6qMhiSU+DSiWZd0yba9rtPlPxRZacSgsMdv9cg+6C8M8i2OfT8seflZerwGOFlY= Received: from BL0PR02CA0082.namprd02.prod.outlook.com (2603:10b6:208:51::23) by IA0PR12MB8837.namprd12.prod.outlook.com (2603:10b6:208:491::18) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.7068.32; Tue, 12 Dec 2023 16:02:08 +0000 Received: from MN1PEPF0000ECD6.namprd02.prod.outlook.com (2603:10b6:208:51:cafe::82) by BL0PR02CA0082.outlook.office365.com (2603:10b6:208:51::23) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.7068.33 via Frontend Transport; Tue, 12 Dec 2023 16:02:08 +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=SATLEXMB04.amd.com; pr=C Received: from SATLEXMB04.amd.com (165.204.84.17) by MN1PEPF0000ECD6.mail.protection.outlook.com (10.167.242.135) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.20.7091.18 via Frontend Transport; Tue, 12 Dec 2023 16:02:08 +0000 Received: from ruby-95f9host.amd.com (10.180.168.240) by SATLEXMB04.amd.com (10.181.40.145) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2507.34; Tue, 12 Dec 2023 10:02:06 -0600 From: Suravee Suthikulpanit To: , , , CC: , , , , , , , , , , Suravee Suthikulpanit Subject: [RFC PATCH 4/6] iommufd: Introduce data struct for AMD nested domain allocation Date: Tue, 12 Dec 2023 10:01:37 -0600 Message-ID: <20231212160139.174229-5-suravee.suthikulpanit@amd.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20231212160139.174229-1-suravee.suthikulpanit@amd.com> References: <20231212160139.174229-1-suravee.suthikulpanit@amd.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-Originating-IP: [10.180.168.240] X-ClientProxiedBy: SATLEXMB03.amd.com (10.181.40.144) To SATLEXMB04.amd.com (10.181.40.145) X-EOPAttributedMessage: 0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: MN1PEPF0000ECD6:EE_|IA0PR12MB8837:EE_ X-MS-Office365-Filtering-Correlation-Id: 458474e1-6094-4236-e91e-08dbfb2bb195 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: RbGD6Q1vdGQqPY420R6ynfKrCU3INPasRH1yRpgs1Yh5NeFNiOEw4K2H2gmqRGqUxlLYD/uZnxe/2KLgzjBji1azdXtL7Yi/bIgHCSdbxPc0i8MG8O3A/Wqo0WAHgD3TG6uqWBMtGEbmdOUxIxm3IzZl0KujzGRKlmLto7UxQdHbP9FwJ7yCpy7xunDN+YRiTt3FHyPFQRQMUv66vS1UUEWk46U0CDJpSsbU4ROFu7ZUcG+Xkg66Q/7qwF0pGPQ0PVC9YccIfRRD317vCtSxffMvL7ufhxAN4BGChnjgmduH1Vp57Ah4j6WCq8bbezkk7gHm3tEdxhajsEbRJHKL+Y8NpR8sOjMck3265kHvON4X2HM4yFMOTpmLj+C9MZ4GU1Vua0o9Mlxm2l77W/tBReeGWWPNNtveJ+t/RV4i2dyz4wB3xDtLBNafUUsaCqBgp2H8SK2YLl3d+xasDmNlTTxtu2w0UYNOeFrsJR4PyYrLIVeVl1p4LjKMt8x/7kmyHvuzBKfFukbbhKo/yoz2dUhhKmZB3cmdEPDTGa6gBva33PLfzuHcbhbNqAwgvfzPGCVbm/q2N5gJSYwD1phoohU+Fr2YIKhsdS4q9grPrGRhWfeaGybpI9/IA3juRYIABFHNC/kPxNLuUzKWDT+5e7SWla6WJJEpfJ8AjijOKKPj8POZeKRmWSq3zcQxpcBPOGDCFbXp8W0nMLhMzW1cFxugINBeOB0SW6H4ns1yse7zvbh2x3juhxQcHEC6X+ZKB6Q+GA1WFjkB/VfCPEy51zPTTXNwp8GUzyGOTgTJub8= X-Forefront-Antispam-Report: CIP:165.204.84.17;CTRY:US;LANG:en;SCL:1;SRV:;IPV:CAL;SFV:NSPM;H:SATLEXMB04.amd.com;PTR:InfoDomainNonexistent;CAT:NONE;SFS:(13230031)(4636009)(39860400002)(396003)(136003)(346002)(376002)(230922051799003)(1800799012)(451199024)(64100799003)(186009)(82310400011)(40470700004)(36840700001)(46966006)(40460700003)(336012)(26005)(7696005)(2616005)(426003)(16526019)(1076003)(6666004)(36860700001)(5660300002)(47076005)(44832011)(7416002)(2906002)(4326008)(41300700001)(478600001)(8936002)(8676002)(110136005)(54906003)(70586007)(70206006)(316002)(81166007)(86362001)(82740400003)(356005)(36756003)(40480700001)(36900700001)(2101003);DIR:OUT;SFP:1101; X-OriginatorOrg: amd.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 12 Dec 2023 16:02:08.4145 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: 458474e1-6094-4236-e91e-08dbfb2bb195 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=[SATLEXMB04.amd.com] X-MS-Exchange-CrossTenant-AuthSource: MN1PEPF0000ECD6.namprd02.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Anonymous X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: IA0PR12MB8837 Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" Introduce IOMMU_HWPT_DATA_AMD_V2 data type for AMD IOMMU v2 page table, which is used for stage-1 in nested translation. The data structure contains information necessary for setting up the AMD HW-vIOMMU support. Signed-off-by: Suravee Suthikulpanit --- include/uapi/linux/iommufd.h | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/include/uapi/linux/iommufd.h b/include/uapi/linux/iommufd.h index bf4a1f8ab748..e2240d430dd1 100644 --- a/include/uapi/linux/iommufd.h +++ b/include/uapi/linux/iommufd.h @@ -389,14 +389,37 @@ struct iommu_hwpt_vtd_s1 { __u32 __reserved; }; =20 +/** + * struct iommu_hwpt_amd_v2 - AMD IOMMU specific user-managed + * v2 I/O page table data + * @gcr3: GCR3 guest physical ddress + * @gid: Guest ID + * @iommu_id: IOMMU host device ID + * @gdev_id: Guest device ID + * @gdom_id: Guest domain ID + * @glx: GCR3 table levels + * @guest_paging_mode: Guest v2 page table paging mode + */ +struct iommu_hwpt_amd_v2 { + __aligned_u64 gcr3; + __u32 gid; + __u32 iommu_id; + __u16 gdev_id; + __u16 gdom_id; + __u16 glx; + __u16 guest_paging_mode; +}; + /** * enum iommu_hwpt_data_type - IOMMU HWPT Data Type * @IOMMU_HWPT_DATA_NONE: no data * @IOMMU_HWPT_DATA_VTD_S1: Intel VT-d stage-1 page table + * @IOMMU_HWPT_DATA_AMD_V2: AMD IOMMUv2 page table */ enum iommu_hwpt_data_type { IOMMU_HWPT_DATA_NONE, IOMMU_HWPT_DATA_VTD_S1, + IOMMU_HWPT_DATA_AMD_V2, }; =20 /** --=20 2.34.1 From nobody Wed Dec 17 05:51:00 2025 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 5F486C4332F for ; Tue, 12 Dec 2023 16:02:24 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1377252AbjLLQCP (ORCPT ); Tue, 12 Dec 2023 11:02:15 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:42590 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1377028AbjLLQCI (ORCPT ); Tue, 12 Dec 2023 11:02:08 -0500 Received: from NAM11-CO1-obe.outbound.protection.outlook.com (mail-co1nam11on2065.outbound.protection.outlook.com [40.107.220.65]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id EC70DEA for ; Tue, 12 Dec 2023 08:02:12 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=ODyB3yoTLO7HFpVpOQekAseDqNapDXug3cgox1QeVV9Pbec4seP3X/xDipGhMRHBd2XaTAsGbjAZRCnYgcWPHdBmIEvApKEtbTdJU+qd4yAEKxJAo/CGnWFekTsOsFAEu156GNUvaMz1/EXHzYXNZaF+zpV81pSgbUPtPmiRDvbjnqkDOVAfj3fXpGGA27hlJZDXNhTR35FguuK4DD6L22/e2pVEoNLEsmioQQs6Htc8cjHTicX/PxijfbbaB4mdPBlDGZbOpCoRsdKQhfXDOVW4gOfm1XDMvZ2swc86eD/fg2P5itOrTuYcKw4QS36INnfDjs9Nx/0Gr+5gOaoFHA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; 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=k0t1O6PS4HQZxDRacCxVotWwYGVY0VRDxpdj2PXvXsI=; b=YhKPuBpA5aTYz1H513wX84XXkNjd6p3k9iA7zXXXEBw3gWtYGNAP7E6MjMMPzPv1JjwdWhrl2gxt4o3WpSMX/uBGa9d3xiSj1SO4I+yM/ApZFGfvwIng5fJBaZsfI6srJmad0nqCf6TGqk/5nS1KySozHZqtFPQGy3TzwtWCJkUzPvosxwFnk+Wi2waUgSByaMIGw4Tk5mi+aZV2RLGnKRuPJbz2ErUfYK3kxLijwc0THioRFgWJkQWjgxcT3S50SVFN8pJurcC2V1COdrZkM3Z4CAg2UtWInmhklVPF8z2GUE58fbnuCHVhFZVm5GF60VgC/zxFbrttkZEhnhTWDA== 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=k0t1O6PS4HQZxDRacCxVotWwYGVY0VRDxpdj2PXvXsI=; b=B/ts5wjyzCSsJ+spfjm3I8/zWMeBpl+97Ej69ERuiRjpDrRDT9RGpUJDLoo0P+7p9vgmBx8UcYx2LKRUChg+4sTo1J1wzfN/Knuhl8kBUt3o3Lc4ysSlcGVQoJOrMym6mRF/fazwKrgVJqYnAoDK5q4RoRmmYbvUGeHRgLkBv/A= Received: from BL0PR02CA0078.namprd02.prod.outlook.com (2603:10b6:208:51::19) by DS0PR12MB7608.namprd12.prod.outlook.com (2603:10b6:8:13b::11) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.7068.32; Tue, 12 Dec 2023 16:02:10 +0000 Received: from MN1PEPF0000ECD6.namprd02.prod.outlook.com (2603:10b6:208:51:cafe::f) by BL0PR02CA0078.outlook.office365.com (2603:10b6:208:51::19) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.7068.33 via Frontend Transport; Tue, 12 Dec 2023 16:02: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=SATLEXMB04.amd.com; pr=C Received: from SATLEXMB04.amd.com (165.204.84.17) by MN1PEPF0000ECD6.mail.protection.outlook.com (10.167.242.135) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.20.7091.18 via Frontend Transport; Tue, 12 Dec 2023 16:02:10 +0000 Received: from ruby-95f9host.amd.com (10.180.168.240) by SATLEXMB04.amd.com (10.181.40.145) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2507.34; Tue, 12 Dec 2023 10:02:07 -0600 From: Suravee Suthikulpanit To: , , , CC: , , , , , , , , , , Suravee Suthikulpanit Subject: [RFC PATCH 5/6] iommu/amd: Introduce helper functions to setup GCR3TRPMode Date: Tue, 12 Dec 2023 10:01:38 -0600 Message-ID: <20231212160139.174229-6-suravee.suthikulpanit@amd.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20231212160139.174229-1-suravee.suthikulpanit@amd.com> References: <20231212160139.174229-1-suravee.suthikulpanit@amd.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-Originating-IP: [10.180.168.240] X-ClientProxiedBy: SATLEXMB03.amd.com (10.181.40.144) To SATLEXMB04.amd.com (10.181.40.145) X-EOPAttributedMessage: 0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: MN1PEPF0000ECD6:EE_|DS0PR12MB7608:EE_ X-MS-Office365-Filtering-Correlation-Id: e439176e-317f-47ca-4043-08dbfb2bb290 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: Fnh6WCFqm1X3IWub83d5d7QVKKTWUsaP/ARE0ywaml+i84X+B3j/ou8zKoqKpNzWjrVTuv5TjRLdF8uim2NsY6iibp5n842GUUoTTDUGW47PHlzfGs9uymnjTEtvcD+vPaFZA9Csa9n7SaV1nf0peipl/ZmX85RvMuZXX2jze1ggDO646vq9kpZugIqGIKXTOVhyU9909G6gquCUyXLNN06UJ5hmjxNBgKnKj2vXmfUWvIotEpEvSZXYQPnQ4SQGIURbUdFQe5QD0o5o2bGxax792xY8lHoRrPpOoUEor2/oraAqszdGnwMxM/wtNTDBliPGhOUHHMUh+q5+pM8QN+SWUKSOz/pEJJTOtIYuxkX2k+lyuZIyHuzFYQvqsoWckJCeF5dnB8ZfmfbUxjdkcKzE2YENaJvab/RQ+dcsKfdfQroJ79E5f4txSYUMgIlBxELrqewl2s+n9IorXivsbzOwBi2TGrJX8upqrioHU9hsA30WGsCgel0yzUAac2gt1/NO5oeNCIT6XIpT2AnGKD1mOhUPfJYzZTRfoGQCcmmD0nv7MvMwlB3gCNP281SsfKJxH0In8R7GuM3cAZnWOz/doxLP0pJ58lNK3yR0cZIfRh4WQHzjTJchXXPUZSLsMeLsGyGyMqZunTcgRUPAp6p4xYVtAW4jPIFV9lSax+Ou0BQ78JBwb8Gj/tNgncJwNIwPYRgxDlmO5hZQ7idQC6f0oYH3Mk1er/o3lAXqcYwhY4EWlZoLVmI6E+aNUTebgaNIKLg7Dxn8XHxxVpph3VPkVwo8e+0jYGp/6dI2mco/6LqyR3Sx2+F75Xkit68n+RnNn+aoLAJNzoCj9wF3wg== X-Forefront-Antispam-Report: CIP:165.204.84.17;CTRY:US;LANG:en;SCL:1;SRV:;IPV:CAL;SFV:NSPM;H:SATLEXMB04.amd.com;PTR:InfoDomainNonexistent;CAT:NONE;SFS:(13230031)(4636009)(346002)(39860400002)(396003)(376002)(136003)(230922051799003)(64100799003)(1800799012)(451199024)(186009)(82310400011)(36840700001)(40470700004)(46966006)(40460700003)(36860700001)(1076003)(47076005)(5660300002)(336012)(26005)(2616005)(16526019)(44832011)(36756003)(40480700001)(426003)(54906003)(70586007)(70206006)(7416002)(2906002)(83380400001)(82740400003)(86362001)(81166007)(478600001)(41300700001)(356005)(4326008)(7696005)(8936002)(8676002)(6666004)(110136005)(316002)(71600200004)(32563001)(36900700001)(2101003);DIR:OUT;SFP:1101; X-OriginatorOrg: amd.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 12 Dec 2023 16:02:10.0552 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: e439176e-317f-47ca-4043-08dbfb2bb290 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=[SATLEXMB04.amd.com] X-MS-Exchange-CrossTenant-AuthSource: MN1PEPF0000ECD6.namprd02.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Anonymous X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: DS0PR12MB7608 Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" The GCR3TRPMode allows IOMMU hardware to use GPA when programming the GCR3 table root pointer (GCR3TRP) in the DTE. The GPA will be translated by the IOMMU using the v1 page table referenced by the DTE[Host Page Table Root Pointer]. Please see the AMD IOMMU Specification for more detail. (https://www.amd.com/content/dam/amd/en/documents/processor-tech-docs/speci= fications/48882_IOMMU.pdf) Signed-off-by: Suravee Suthikulpanit --- drivers/iommu/amd/amd_iommu.h | 2 + drivers/iommu/amd/amd_iommu_types.h | 1 + drivers/iommu/amd/iommu.c | 132 +++++++++++++++++++++++++++- 3 files changed, 131 insertions(+), 4 deletions(-) diff --git a/drivers/iommu/amd/amd_iommu.h b/drivers/iommu/amd/amd_iommu.h index 7783a933ad14..55479a6efaae 100644 --- a/drivers/iommu/amd/amd_iommu.h +++ b/drivers/iommu/amd/amd_iommu.h @@ -56,6 +56,8 @@ void amd_iommu_pdev_disable_cap_pri(struct pci_dev *pdev); int amd_iommu_set_gcr3(struct iommu_dev_data *dev_data, ioasid_t pasid, unsigned long gcr3); int amd_iommu_clear_gcr3(struct iommu_dev_data *dev_data, ioasid_t pasid); +int amd_iommu_set_gcr3tbl_trp(struct amd_iommu *iommu, struct pci_dev *pde= v, + u64 gcr3_tbl, u16 glx, u16 guest_paging_mode); =20 /* * This function flushes all internal caches of diff --git a/drivers/iommu/amd/amd_iommu_types.h b/drivers/iommu/amd/amd_io= mmu_types.h index a00731673c50..1b150e0cb689 100644 --- a/drivers/iommu/amd/amd_iommu_types.h +++ b/drivers/iommu/amd/amd_iommu_types.h @@ -541,6 +541,7 @@ struct gcr3_tbl_info { u64 *gcr3_tbl; /* Guest CR3 table */ int glx; /* Number of levels for GCR3 table */ u32 pasid_cnt; /* Track attached PASIDs */ + bool trp; /* TRP support */ }; =20 struct amd_io_pgtable { diff --git a/drivers/iommu/amd/iommu.c b/drivers/iommu/amd/iommu.c index d18b23ac6357..8bf12674dc84 100644 --- a/drivers/iommu/amd/iommu.c +++ b/drivers/iommu/amd/iommu.c @@ -93,6 +93,9 @@ static void detach_device(struct device *dev); static void set_dte_entry(struct amd_iommu *iommu, struct iommu_dev_data *dev_data); =20 +static void amd_iommu_clear_gcr3tbl_trp(struct amd_iommu *iommu, + struct iommu_dev_data *dev_data); + /*************************************************************************= *** * * Helper functions @@ -2146,15 +2149,25 @@ static int do_attach(struct iommu_dev_data *dev_dat= a, =20 static void do_detach(struct iommu_dev_data *dev_data) { + struct gcr3_tbl_info *gcr3_info =3D &dev_data->gcr3_info; struct protection_domain *domain =3D dev_data->domain; struct amd_iommu *iommu; =20 iommu =3D get_amd_iommu_from_dev(dev_data->dev); =20 - /* Clear GCR3 table */ - if (domain->pd_mode =3D=3D PD_MODE_V2) { - __clear_gcr3(dev_data, 0); - free_gcr3_table(dev_data); + if (gcr3_info->gcr3_tbl) { + if (gcr3_info->trp) { + /* + * In GCR3TRPMode, the GCR3 table contains GPA, + * which is setup by guest kernel. Therefore, we just + * need to clean up the DTE settings for guest translation. + */ + amd_iommu_clear_gcr3tbl_trp(iommu, dev_data); + } else { + /* Clear GCR3 table */ + __clear_gcr3(dev_data, 0); + free_gcr3_table(dev_data); + } } =20 /* Update data structures */ @@ -2951,6 +2964,117 @@ const struct iommu_ops amd_iommu_ops =3D { } }; =20 +/* + * For GCR3TRPMode, user-space provides GPA for the GCR3 Root Pointer Tabl= e. + */ +int amd_iommu_set_gcr3tbl_trp(struct amd_iommu *iommu, struct pci_dev *pde= v, + u64 gcr3_tbl, u16 glx, u16 guest_paging_mode) +{ + struct iommu_dev_data *dev_data =3D dev_iommu_priv_get(&pdev->dev); + struct dev_table_entry *dev_table =3D get_dev_table(iommu); + struct gcr3_tbl_info *gcr3_info =3D &dev_data->gcr3_info; + int devid =3D pci_dev_id(pdev); + u64 data0 =3D dev_table[devid].data[0]; + u64 data1 =3D dev_table[devid].data[1]; + u64 data2 =3D dev_table[devid].data[2]; + u64 tmp; + + pr_debug("%s: devid=3D%d, glx=3D%#x, gcr3_tbl=3D%#llx\n", + __func__, devid, glx, gcr3_tbl); + + WARN_ON(gcr3_info->trp); + + gcr3_info->trp =3D true; + gcr3_info->gcr3_tbl =3D (u64 *)gcr3_tbl; + + data0 |=3D DTE_FLAG_GV | DTE_FLAG_GIOV; + tmp =3D glx; + data0 |=3D (tmp & DTE_GLX_MASK) << DTE_GLX_SHIFT; + + /* First mask out possible old values for GCR3 table */ + tmp =3D DTE_GCR3_VAL_A(~0ULL) << DTE_GCR3_SHIFT_A; + data0 &=3D ~tmp; + + tmp =3D DTE_GCR3_VAL_B(~0ULL) << DTE_GCR3_SHIFT_B; + data1 &=3D ~tmp; + + tmp =3D DTE_GCR3_VAL_C(~0ULL) << DTE_GCR3_SHIFT_C; + data1 &=3D ~tmp; + + /* Encode GCR3 table into DTE */ + tmp =3D DTE_GCR3_VAL_A(gcr3_tbl) << DTE_GCR3_SHIFT_A; + data0 |=3D tmp; + + tmp =3D DTE_GCR3_VAL_B(gcr3_tbl) << DTE_GCR3_SHIFT_B; + data1 |=3D tmp; + + tmp =3D DTE_GCR3_VAL_C(gcr3_tbl) << DTE_GCR3_SHIFT_C; + data1 |=3D tmp; + + /* Mask out old values for GuestPagingMode */ + data2 &=3D ~(0x3ULL << DTE_GPT_LEVEL_SHIFT); + + /* Check 5-level support for the host before enabling on behalf of the gu= est */ + tmp =3D (u64)guest_paging_mode; + if ((tmp =3D=3D GUEST_PGTABLE_5_LEVEL) && + (check_feature_gpt_level() < GUEST_PGTABLE_5_LEVEL)) { + pr_err("Cannot support 5-level v2 page table.\n"); + return -EINVAL; + } + data2 |=3D (tmp << DTE_GPT_LEVEL_SHIFT); + + dev_table[devid].data[2] =3D data2; + dev_table[devid].data[1] =3D data1; + dev_table[devid].data[0] =3D data0; + + device_flush_dte(dev_data); + iommu_completion_wait(iommu); + + return 0; +} + +void amd_iommu_clear_gcr3tbl_trp(struct amd_iommu *iommu, + struct iommu_dev_data *dev_data) +{ + int devid =3D dev_data->devid; + struct gcr3_tbl_info *gcr3_info =3D &dev_data->gcr3_info; + struct dev_table_entry *dev_table =3D get_dev_table(iommu); + u64 data0 =3D dev_table[devid].data[0]; + u64 data1 =3D dev_table[devid].data[1]; + u64 data2 =3D dev_table[devid].data[2]; + u64 tmp; + + if (!gcr3_info->trp) + return; + + pr_debug("%s: devid=3D%#x, gcr3_tbl=3D%#llx\n", __func__, devid, + (unsigned long long)gcr3_info->gcr3_tbl); + + tmp =3D DTE_GLX_MASK; + data0 &=3D ~(tmp << DTE_GLX_SHIFT); + data0 &=3D ~(DTE_FLAG_GV | DTE_FLAG_GIOV); + + /* Mask out possible old values for GCR3 table */ + tmp =3D DTE_GCR3_VAL_A(~0ULL) << DTE_GCR3_SHIFT_A; + data0 &=3D ~tmp; + + tmp =3D DTE_GCR3_VAL_B(~0ULL) << DTE_GCR3_SHIFT_B; + data1 &=3D ~tmp; + + tmp =3D DTE_GCR3_VAL_C(~0ULL) << DTE_GCR3_SHIFT_C; + data1 &=3D ~tmp; + + /* Mask out old values for GuestPagingMode */ + data2 &=3D ~(0x3ULL << DTE_GPT_LEVEL_SHIFT); + + dev_table[devid].data[2] =3D data2; + dev_table[devid].data[1] =3D data1; + dev_table[devid].data[0] =3D data0; + + gcr3_info->trp =3D false; + gcr3_info->gcr3_tbl =3D NULL; +} + #ifdef CONFIG_IRQ_REMAP =20 /*************************************************************************= **** --=20 2.34.1 From nobody Wed Dec 17 05:51:00 2025 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 64A0EC4332F for ; Tue, 12 Dec 2023 16:02:38 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1377260AbjLLQCa (ORCPT ); Tue, 12 Dec 2023 11:02:30 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:42634 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1377226AbjLLQCO (ORCPT ); Tue, 12 Dec 2023 11:02:14 -0500 Received: from NAM02-BN1-obe.outbound.protection.outlook.com (mail-bn1nam02on2088.outbound.protection.outlook.com [40.107.212.88]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 0FC39F2 for ; Tue, 12 Dec 2023 08:02:16 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=Ly+bXBlxvin74UKo+TAby8MQ60q+a4yKE2KccX0czfEoOhgvkwxW1w/JNPZXq0Dx/dWvK12estfIp+EPuuKtRCUP6jKf7zLQgvl91NMOLxPggg0R3ZTvN1STQ4sMQ+IOCWNus33NYsk4m8FSURX6CZXWQPHFLkijIwnCMRzT39jDYjWVVL/RfSBC36uaVu0qVYWM0ZnRlRzqbdyoFK7jHem6gUMjN/+jaBivbggHCQqt04uzVaK9oiCxqbb9z7sefDOgR7+Ej8suGGMGLIOxJrZjjluhGbxghccOGrxm3s7SGyQLlztI6MRdzUc1GOX8rO8FoTcMjyTxHa8TiV+4pA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; 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=N6VDxnUGupzhSbze1Gx+uztUEK1it5dGt3r44BSI1wk=; b=F8PNm4+kQ44RwbtfGWRPLMWNpU+C/LSiEzvtrYykcCtMEqtc5z4qiPPuvqWz40Hnn2HVta0VFUhNG5TwOvm4AH4YfsRejDoOgOT7WaCo9TPL06xhdpbm9E5E7pX6Ovo1jYi4RmYShnwJOxwtSgVTc9noBSsfsgBrguDDoqrPWqbojko+6PJwdjVblBYgvcIt29uQPYuUExUAGgWoL13xzASqtTLQUQjptsWMD4Bolr25OEsRvJcnka81B0EO3u1SJC/6RJDOFXc+RNIAevuRbgeoZRqf73dQJGCeXgLADimFtywmkf2L0vwrxrL3oE/6LFlXAPk0PjBGxcoKP7IN2Q== 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=N6VDxnUGupzhSbze1Gx+uztUEK1it5dGt3r44BSI1wk=; b=EO3CP/o3wMCxT/TYaG9vFB9EoAzBEbmQAeFjf6Vnd8rXMU1AffAQc78hh4Xf+ZjZStCTlU86ac8gte2wPqB0UWsG/D+w9bcwimmmQ4IlzBLRegX7V/HyKH8hMcf155l5zM2w35XntI7FK4qDMxhE8crggnZFhu0hkyH+x/oTCaE= Received: from BL0PR02CA0087.namprd02.prod.outlook.com (2603:10b6:208:51::28) by BY5PR12MB5512.namprd12.prod.outlook.com (2603:10b6:a03:1df::16) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.7068.33; Tue, 12 Dec 2023 16:02:12 +0000 Received: from MN1PEPF0000ECD6.namprd02.prod.outlook.com (2603:10b6:208:51:cafe::31) by BL0PR02CA0087.outlook.office365.com (2603:10b6:208:51::28) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.7068.33 via Frontend Transport; Tue, 12 Dec 2023 16:02: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=SATLEXMB04.amd.com; pr=C Received: from SATLEXMB04.amd.com (165.204.84.17) by MN1PEPF0000ECD6.mail.protection.outlook.com (10.167.242.135) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.20.7091.18 via Frontend Transport; Tue, 12 Dec 2023 16:02:10 +0000 Received: from ruby-95f9host.amd.com (10.180.168.240) by SATLEXMB04.amd.com (10.181.40.145) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2507.34; Tue, 12 Dec 2023 10:02:08 -0600 From: Suravee Suthikulpanit To: , , , CC: , , , , , , , , , , Suravee Suthikulpanit Subject: [RFC PATCH 6/6] iommu/amd: Introduce nested translation support Date: Tue, 12 Dec 2023 10:01:39 -0600 Message-ID: <20231212160139.174229-7-suravee.suthikulpanit@amd.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20231212160139.174229-1-suravee.suthikulpanit@amd.com> References: <20231212160139.174229-1-suravee.suthikulpanit@amd.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-Originating-IP: [10.180.168.240] X-ClientProxiedBy: SATLEXMB03.amd.com (10.181.40.144) To SATLEXMB04.amd.com (10.181.40.145) X-EOPAttributedMessage: 0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: MN1PEPF0000ECD6:EE_|BY5PR12MB5512:EE_ X-MS-Office365-Filtering-Correlation-Id: 8f8c8c74-9d1e-40b6-db34-08dbfb2bb2cb X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: q7qpAN8pj4XMARlKXO5PhCvN5sboiPFRptC6Y2dEKegqDHCBcA/XjUBkGDV7Rubk7asP8GLQEpumbQQP54ncakv/8SS6zBDRtUZrfgKXDtWNMQLPDjHPWFVmyA3N8LLzlX1X4dVDwc8wR5QHif5WR7KyrSqP0hjJlWf6/VDTv8G+AmblycZH/pGYDE4C7++ElPkGjLUhL4kwzPQMamAo/+0hDfQjCfJZhD21BOuJif7oWIE6aZBTJPNyjNuHjzyaqa0/ts6OJsCxW1UKrrE54inGHD3+2hvmmAYww4fHczCX19jOLhDNbwMjvqy8rm7F7nHyycNTZISbEadSWdWN84HKNuSZjzRAaolsev3BDy+lUJWKUjqC3blu8bBhN5zwbVOyzDtR9jAG8BkdB3UTSQ+cTuVy9e9jslF39N5iU9Vy76O5qwkEExXjx55GObkEA91CujCzJp3Lb0p2AH8+NoagOfy/6KNvsfazWTKck3l7amUyrzHiPDjMu3IUtx+HnKtxXBKARHQGocsiMUNmXE8obBRl2XzaR67c/lsL03CwQVvpGPaFGjl2E+/hChD1Pl02VZXTOzVUEJg+Vx4sR+MZHPhomcgQiXXxfNDDrU8Uffey/7Dc1ZL7TKwSTfAjgOgxvLebXNqRqYXHVMfI0t742PKQTXTFBCyPGK/utZNzhmSZQmviKN5Wkl0YE0nYS1JMG1rkcKPWu6bXgHLtgFJ9vbBXn72KM1FF8OkeBk0yp6eBQAg60Ws8/Jdiv4PLcW9hBNkjzOs4zSIOkWDEi3iMSGflQJy2Z2oKQO86Lyg= X-Forefront-Antispam-Report: CIP:165.204.84.17;CTRY:US;LANG:en;SCL:1;SRV:;IPV:CAL;SFV:NSPM;H:SATLEXMB04.amd.com;PTR:InfoDomainNonexistent;CAT:NONE;SFS:(13230031)(4636009)(39860400002)(376002)(346002)(136003)(396003)(230922051799003)(451199024)(82310400011)(1800799012)(186009)(64100799003)(36840700001)(46966006)(40470700004)(41300700001)(5660300002)(7416002)(2906002)(2616005)(1076003)(6666004)(478600001)(36756003)(7696005)(47076005)(82740400003)(81166007)(426003)(83380400001)(16526019)(336012)(8936002)(26005)(40480700001)(4326008)(70206006)(54906003)(40460700003)(36860700001)(356005)(316002)(110136005)(8676002)(70586007)(44832011)(86362001)(2101003)(36900700001);DIR:OUT;SFP:1101; X-OriginatorOrg: amd.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 12 Dec 2023 16:02:10.4458 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: 8f8c8c74-9d1e-40b6-db34-08dbfb2bb2cb 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=[SATLEXMB04.amd.com] X-MS-Exchange-CrossTenant-AuthSource: MN1PEPF0000ECD6.namprd02.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Anonymous X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: BY5PR12MB5512 Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" To support nested translation on AMD IOMMU, the driver needs to program DTE[GCR3 Table Root Pointer] with the address provided by the guest via struct iommu_hwpt_amd_v2, which is passed as a parameter of the struct iommu_ops.domain_alloc_user() with the flag IOMMU_HWPT_ALLOC_NEST_PARENT. Note that current implementation only support GCR3TRPMode for nested translation, which uses GPA to program GCR3 Table Root Pointer. Signed-off-by: Suravee Suthikulpanit --- drivers/iommu/amd/Makefile | 2 +- drivers/iommu/amd/amd_iommu.h | 8 +++ drivers/iommu/amd/amd_iommu_types.h | 3 + drivers/iommu/amd/iommu.c | 63 ++++++++++++++-- drivers/iommu/amd/nested.c | 107 ++++++++++++++++++++++++++++ 5 files changed, 175 insertions(+), 8 deletions(-) create mode 100644 drivers/iommu/amd/nested.c diff --git a/drivers/iommu/amd/Makefile b/drivers/iommu/amd/Makefile index f454fbb1569e..447cb6bb48eb 100644 --- a/drivers/iommu/amd/Makefile +++ b/drivers/iommu/amd/Makefile @@ -1,3 +1,3 @@ # SPDX-License-Identifier: GPL-2.0-only -obj-$(CONFIG_AMD_IOMMU) +=3D iommu.o init.o quirks.o io_pgtable.o io_pgtab= le_v2.o +obj-$(CONFIG_AMD_IOMMU) +=3D iommu.o init.o quirks.o io_pgtable.o io_pgtab= le_v2.o nested.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 55479a6efaae..6ea146a964df 100644 --- a/drivers/iommu/amd/amd_iommu.h +++ b/drivers/iommu/amd/amd_iommu.h @@ -7,6 +7,7 @@ #ifndef AMD_IOMMU_H #define AMD_IOMMU_H =20 +#include #include =20 #include "amd_iommu_types.h" @@ -75,6 +76,8 @@ void amd_iommu_dev_flush_pasid_all(struct iommu_dev_data = *dev_data, ioasid_t pasid); =20 void amd_iommu_build_efr(u64 *efr, u64 *efr2); +int amd_iommu_attach_device(struct iommu_domain *dom, struct device *dev); +void amd_iommu_domain_free(struct iommu_domain *dom); =20 #ifdef CONFIG_IRQ_REMAP int amd_iommu_create_irq_domain(struct amd_iommu *iommu); @@ -190,4 +193,9 @@ int amd_iommu_vminfo_alloc(struct amd_iommu *iommu, str= uct amd_iommu_vminfo *vmi void amd_iommu_vminfo_free(struct amd_iommu *iommu, struct amd_iommu_vminf= o *vminfo); struct amd_iommu_vminfo *amd_iommu_get_vminfo(int gid); =20 +/* NESTED */ +struct protection_domain *to_pdomain(struct iommu_domain *dom); +struct iommu_domain *amd_iommu_nested_domain_alloc(struct device *dev, + struct iommu_hwpt_amd_v2 *hwpt); + #endif diff --git a/drivers/iommu/amd/amd_iommu_types.h b/drivers/iommu/amd/amd_io= mmu_types.h index 1b150e0cb689..c2055b476a97 100644 --- a/drivers/iommu/amd/amd_iommu_types.h +++ b/drivers/iommu/amd/amd_iommu_types.h @@ -114,6 +114,8 @@ #define FEATURE_PASMAX_MASK (0x1FULL << FEATURE_PASMAX_SHIFT) =20 /* Extended Feature 2 Bits */ +#define FEATURE_GCR3TRPMODE BIT_ULL(3) + #define FEATURE_SNPAVICSUP_SHIFT 5 #define FEATURE_SNPAVICSUP_MASK (0x07ULL << FEATURE_SNPAVICSUP_SHIFT) #define FEATURE_SNPAVICSUP_GAM(x) \ @@ -1058,6 +1060,7 @@ struct amd_irte_ops { struct amd_iommu_vminfo { u16 gid; struct hlist_node hnode; + u64 *devid_table; }; =20 #ifdef CONFIG_IRQ_REMAP diff --git a/drivers/iommu/amd/iommu.c b/drivers/iommu/amd/iommu.c index 8bf12674dc84..2a7e29e8c112 100644 --- a/drivers/iommu/amd/iommu.c +++ b/drivers/iommu/amd/iommu.c @@ -260,7 +260,7 @@ static struct amd_iommu *rlookup_amd_iommu(struct devic= e *dev) return __rlookup_amd_iommu(seg, PCI_SBDF_TO_DEVID(devid)); } =20 -static struct protection_domain *to_pdomain(struct iommu_domain *dom) +struct protection_domain *to_pdomain(struct iommu_domain *dom) { return container_of(dom, struct protection_domain, domain); } @@ -2526,21 +2526,70 @@ static struct iommu_domain *amd_iommu_domain_alloc(= unsigned int type) return domain; } =20 +static int udata_to_iommu_hwpt_amd_v2(const struct iommu_user_data *user_d= ata, + struct iommu_hwpt_amd_v2 *hwpt) +{ + if (!user_data) + return -EINVAL; + + if (user_data->type !=3D IOMMU_HWPT_DATA_AMD_V2) + return -EOPNOTSUPP; + + return iommu_copy_struct_from_user(hwpt, user_data, + IOMMU_HWPT_DATA_AMD_V2, + guest_paging_mode); +} + +static bool check_nested_support(u32 flags) +{ + if (!(flags & IOMMU_HWPT_ALLOC_NEST_PARENT)) + return true; + + if (!check_feature(FEATURE_GT) || + !check_feature(FEATURE_GIOSUP) || + !check_feature2(FEATURE_GCR3TRPMODE)) + return false; + + return true; +} + static struct iommu_domain * amd_iommu_domain_alloc_user(struct device *dev, u32 flags, struct iommu_domain *parent, const struct iommu_user_data *user_data) - { - unsigned int type =3D IOMMU_DOMAIN_UNMANAGED; + struct iommu_domain *dom; + + if (parent) { + int ret; + struct iommu_hwpt_amd_v2 hwpt; + + if (parent->ops !=3D amd_iommu_ops.default_domain_ops) + return ERR_PTR(-EINVAL); =20 - if ((flags & ~IOMMU_HWPT_ALLOC_DIRTY_TRACKING) || parent || user_data) + ret =3D udata_to_iommu_hwpt_amd_v2(user_data, &hwpt); + if (ret) + return ERR_PTR(ret); + + return amd_iommu_nested_domain_alloc(dev, &hwpt); + } + + /* Check supported flags */ + if (flags & (~(IOMMU_HWPT_ALLOC_NEST_PARENT | + IOMMU_HWPT_ALLOC_DIRTY_TRACKING))) + return ERR_PTR(-EOPNOTSUPP); + + if (!check_nested_support(flags)) return ERR_PTR(-EOPNOTSUPP); =20 - return do_iommu_domain_alloc(type, dev, flags); + dom =3D iommu_domain_alloc(dev->bus); + if (!dom) + return ERR_PTR(-ENOMEM); + + return dom; } =20 -static void amd_iommu_domain_free(struct iommu_domain *dom) +void amd_iommu_domain_free(struct iommu_domain *dom) { struct protection_domain *domain; unsigned long flags; @@ -2559,7 +2608,7 @@ static void amd_iommu_domain_free(struct iommu_domain= *dom) protection_domain_free(domain); } =20 -static int amd_iommu_attach_device(struct iommu_domain *dom, +int amd_iommu_attach_device(struct iommu_domain *dom, struct device *dev) { struct iommu_dev_data *dev_data =3D dev_iommu_priv_get(dev); diff --git a/drivers/iommu/amd/nested.c b/drivers/iommu/amd/nested.c new file mode 100644 index 000000000000..332f7efcdc92 --- /dev/null +++ b/drivers/iommu/amd/nested.c @@ -0,0 +1,107 @@ +// 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 "amd_iommu.h" + +static struct amd_iommu *get_amd_iommu_from_devid(u16 devid) +{ + struct amd_iommu *iommu; + + for_each_iommu(iommu) + if (iommu->devid =3D=3D devid) + return iommu; + return NULL; +} + +/* + * Note: + * Host-DevID is stored in the per-VM DevID mapping table, + * which is indexed by the Guest-DevID. + */ +static u16 get_hdev_id(struct amd_iommu *iommu, u16 guestId, u16 gdev_id) +{ + struct amd_iommu_vminfo *vminfo; + void *addr; + u64 offset; + + vminfo =3D amd_iommu_get_vminfo(guestId); + if (!vminfo) + return -1; + + addr =3D vminfo->devid_table; + offset =3D gdev_id << 4; + return (*((u64 *)(addr + offset)) >> 24) & 0xFFFF; +} + +static int nested_gcr3_update(struct iommu_hwpt_amd_v2 *hwpt, struct iommu= _domain *udom) +{ + int ret; + u16 hdev_id; + struct pci_dev *pdev; + struct amd_iommu *iommu; + + iommu =3D get_amd_iommu_from_devid(hwpt->iommu_id); + hdev_id =3D get_hdev_id(iommu, hwpt->gid, hwpt->gdev_id); + + pr_debug("%s: gid=3D%u, hdev_id=3D%#x, gcr3=3D%#llx\n", + __func__, hwpt->gid, hdev_id, + (unsigned long long) hwpt->gcr3); + + pdev =3D pci_get_domain_bus_and_slot(0, PCI_BUS_NUM(hdev_id), + hdev_id & 0xff); + if (!pdev) + return -EINVAL; + + /* Note: Currently only support GCR3TRPMode with nested translation */ + if (!check_feature2(FEATURE_GCR3TRPMODE)) + return -EOPNOTSUPP; + + ret =3D amd_iommu_set_gcr3tbl_trp(iommu, pdev, hwpt->gcr3, hwpt->glx, + hwpt->guest_paging_mode); + if (ret) { + pr_err("%s: Fail to enable gcr3 (devid=3D%#x)\n", __func__, + pci_dev_id(pdev)); + } + + return ret; +} + +static const struct iommu_domain_ops nested_domain_ops =3D { + .attach_dev =3D amd_iommu_attach_device, + .free =3D amd_iommu_domain_free, +}; + +struct iommu_domain *amd_iommu_nested_domain_alloc(struct device *dev, + struct iommu_hwpt_amd_v2 *hwpt) +{ + int ret; + struct iommu_domain *dom; + struct protection_domain *pdom; + + dom =3D iommu_domain_alloc(dev->bus); + if (!dom) + return ERR_PTR(-ENOMEM); + + pdom =3D to_pdomain(dom); + dom->type =3D IOMMU_DOMAIN_NESTED; + dom->ops =3D &nested_domain_ops; + + ret =3D nested_gcr3_update(hwpt, dom); + if (ret) + goto err_out; + + return dom; + +err_out: + iommu_domain_free(dom); + return ERR_PTR(-EINVAL); +} --=20 2.34.1