From patchwork Mon Jul 25 09:32:00 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Suthikulpanit, Suravee" X-Patchwork-Id: 9245453 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork.web.codeaurora.org (Postfix) with ESMTP id 94E50607FD for ; Mon, 25 Jul 2016 09:32:53 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 82D6B26E5D for ; Mon, 25 Jul 2016 09:32:53 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 76F462711E; Mon, 25 Jul 2016 09:32:53 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-6.8 required=2.0 tests=BAYES_00,DKIM_SIGNED, RCVD_IN_DNSWL_HI,T_DKIM_INVALID autolearn=ham version=3.3.1 Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 40EF526E5D for ; Mon, 25 Jul 2016 09:32:52 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752726AbcGYJcs (ORCPT ); Mon, 25 Jul 2016 05:32:48 -0400 Received: from mail-sn1nam01on0055.outbound.protection.outlook.com ([104.47.32.55]:8544 "EHLO NAM01-SN1-obe.outbound.protection.outlook.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1752323AbcGYJcl (ORCPT ); Mon, 25 Jul 2016 05:32:41 -0400 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=amdcloud.onmicrosoft.com; s=selector1-amd-com; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version; bh=/Wi1V53zmSSD3wkk9NhFeC+3DvxpBkM7lbFfaDgBnNM=; b=y98EhKk8abpaQlD2Dq2GGZBZvXwx9BrM5hXmRJlw1VesWC6DCyOe8HcEfXasEy/BCIXOhWLiVIroiEem8dgGRkBkUEWAcqgpjrl2a7NqjaZ17qQFPNzEPTqweV4h9Ixgc7QyG48xkiz9eH5DbBqTf4F6KOlY2cyaFTP3Aj/gLrE= Authentication-Results: spf=none (sender IP is ) smtp.mailfrom=Suravee.Suthikulpanit@amd.com; Received: from localhost.localdomain (114.109.128.54) by BLUPR12MB0434.namprd12.prod.outlook.com (10.162.92.14) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384_P384) id 15.1.549.15; Mon, 25 Jul 2016 09:32:34 +0000 From: Suravee Suthikulpanit To: , , , CC: , , , Suravee Suthikulpanit Subject: [PART2 PATCH v5 01/12] iommu/amd: Detect and enable guest vAPIC support Date: Mon, 25 Jul 2016 04:32:00 -0500 Message-ID: <1469439131-11308-2-git-send-email-suravee.suthikulpanit@amd.com> X-Mailer: git-send-email 1.9.1 In-Reply-To: <1469439131-11308-1-git-send-email-suravee.suthikulpanit@amd.com> References: <1469439131-11308-1-git-send-email-suravee.suthikulpanit@amd.com> MIME-Version: 1.0 X-Originating-IP: [114.109.128.54] X-ClientProxiedBy: SG2PR06CA0066.apcprd06.prod.outlook.com (10.167.73.162) To BLUPR12MB0434.namprd12.prod.outlook.com (10.162.92.14) X-MS-Office365-Filtering-Correlation-Id: 4a61b081-e5e3-40ff-2d26-08d3b46e9d8e X-Microsoft-Exchange-Diagnostics: 1; BLUPR12MB0434; 2:JkxIJ9JisWl44Za955McGTPILv65bPH2oVu1liy3K1v8lrJIwR5SRk7f7vKzpeSpcWGkP9l74lBRRVDplm8Yq049sOqyKgoHIlu1RI0DYshOcNZWfE7JzDGZ6PAGkUSBD9ilMGj9E209jf4RxZx8bWdBtcaOU0IY04hOdCNxJEHUXq+eqWvNGyP6xGw30UVR; 3:q/GFFTxMVPdZkLnHvN12K5oV0D4MuqElR1n34s0oXc9VvafRErlESgg7tgs+pUet0FyMMaI/VMwnPV8PihDY6lc44cdxfJBoep8+qiIq2bcrJzPz8cSdeXLb8N4txdro X-Microsoft-Antispam: UriScan:;BCL:0;PCL:0;RULEID:;SRVR:BLUPR12MB0434; X-Microsoft-Exchange-Diagnostics: 1; BLUPR12MB0434; 25:FpDo7wcaMMwFyrYmaN1n5WNoO42VNoe1p0iCn8fMoZ1mGet0CR4f3WaONHUyj3uYNmTtlzFC313b4RWHKjsm0rjDnGIGm7cfgyYyNqqTC+Hb/gMoFbanf3cURQtk1LjZw/qb/h4RkmZWIhClKhMvSnuZAPBb6JLoq1m13rNIqNw1PgsriX4T9gJdoA3FT0oGST/74bpYEICHqhhk2PI2bIWe3PKNKMVCqee+MUmJdFo7rIlgm3GZUKpitdwtWNdAjv6oWsuRk16WPrUv4MPOp8NyylYfQsWTcuC0Ml77LGS8KlAGRFcCGE31v+Fk7rxWQ8HAI35T6nWgsC3yXAf0zewkqkF8pXa1Az9Xl/e+DJy5eVWe1XVmlLV6fuZYH1elmHofv4QvQrbMa2U++ATxf1Wj1ai0ZvoE2NpiBbOjVEKKlbhwlUcwYJMGSUrepSt+f48OjNPZpymiDWx6Bkqnzy0JbD6lrN7tVgIJqt+oGrCntvZPmaM6qdN4IJGSUmep88e8r22nWenHohoHNiCGGnOyLwkdkSnsiDK3TmZuxwayLFNSzk8+uoP4AaM+1PRJL/m/pFCaX6Ivt1L/l0HD8M/Qz+o+78Nr4nuI6W1TMscSLSvvsj6w3u0LgPfvOd06ENje7tAV8ssavKWQ8J+xT3n3UOhtUtqClJxF1Sm25FFcq2OvEh/Plh3A4nbY9lRR8u0QWufmOMilHUhpwcYzWDkZKfDhp+JbRfaAD+wPhWo=; 31:a5orJ0RRKWsxEtorQW8x0UL59fN0KXY+GSF498FQ9pfzXTfLUi/de8JeVbWEukFsXDM4Si7HdTY9kPcvPryjkc2QlnEJYDeCvzq9x0diQiLHaaex624WaU5qBVRRQgI+5xj4Bgl3ACnbwAsY2vuSOucxe+1ss4vMmH/uNEg56CF+hLOH740lo4l3Y /VFfEuL086C7/bjUKYWfHZjzvQ3Ig== X-Microsoft-Exchange-Diagnostics: 1; BLUPR12MB0434; 20:ngOaZvUcgAzc57ZOZw2iyHq2+PdoszPdn1Ae5Qs7NYkSGH6xUJb3J/rCmHWgD+SRXqZ56DhPKkUu0xndxzBEb2LslOmPnhM0RCbLhr+1JdYfsep9d1ShIE7ZPddGupBlcMu/xM34IKeuW4faVk44pssttrJnj0pcULJk3OmvLd8d3DCXD/00tMykm1V9BFH9wdd5qLEePekHp1Ir0I4z/nsgStV0/9lYZlGcKBJAk3sSmn84aivS1/dyx3DIhfhmaMhZqitTEC4Do8WkSyZb0+GtszC2MrU5hcPOawwu55P9DxdlfG4reIE4RsN/CP5ezMvld5RwczBcXYJoctKtO1+hXF47cZ3ZOy62+0Ca+pbzXV0VHh+Xe7kJZ5gL2xA4NPMdn/mPC+Dytuo11ztJJ+RxOJ0EjbXG9wIHKc8R3DYHjog6nRl7hM/1KvQHhdCNqFt7L/ZUB++8ioMNYb65bdSnU09YXb2nm8ou3TCDSIGf1v4UXZBP1DzgmjcMEn/P X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:(767451399110)(211171220733660); X-Exchange-Antispam-Report-CFA-Test: BCL:0; PCL:0; RULEID:(601004)(2401047)(5005006)(8121501046)(3002001)(10201501046)(6055026); SRVR:BLUPR12MB0434; BCL:0; PCL:0; RULEID:; SRVR:BLUPR12MB0434; X-Microsoft-Exchange-Diagnostics: 1; BLUPR12MB0434; 4:BZLAbnm/ybRVArlkU6g1H4iEH/5AxmSktrTrcMBk0KwUn0kyVrmtTmhu4RyL7qPjA1pVkPQWouqb2CLApUBSqYslCtdUETDXIlgPBgZEWGVvnh51h+Xr2nJEhFo2QTjGnnhZbDga3sYwHrN0lBwWmBi85T8RwaAb+JvcnXoH1ialxre5khyBCkfxdV6cdSTuT7G9jqXX5P4PfzlZda1+xc9KniTQh9dx5r42FgCOV2165fDOmr78Rrc8lxsFfQVDMCR320N93d/6O4n5WDnonnbvsYTLbJDW6s/zKE+PnnNI8P3sKluByenlyUX9nqF8dU3E2SkW6JNEncZ/MczcJeDC5yylHYBry74ZzHSONNLi5yRmj1EHDvgWGwwIHy2HRR9Qbn7oOjSyV/OfEZI1W93nj73W5ETOBIZPGbt1nUDtartfYzS1MRG76hpa9ginCGnzf1PBeZp+PmKCyigtHA== X-Forefront-PRVS: 0014E2CF50 X-Forefront-Antispam-Report: SFV:NSPM; SFS:(10009020)(4630300001)(6069001)(6009001)(7916002)(189002)(199003)(77096005)(229853001)(50986999)(76176999)(586003)(48376002)(105586002)(19580405001)(81156014)(81166006)(8676002)(97736004)(4326007)(42186005)(5001770100001)(189998001)(2906002)(50226002)(19580395003)(50466002)(7846002)(66066001)(5003940100001)(68736007)(92566002)(86362001)(575784001)(101416001)(7736002)(305945005)(3846002)(6116002)(2950100001)(106356001)(47776003)(36756003)(33646002)(2201001); DIR:OUT; SFP:1101; SCL:1; SRVR:BLUPR12MB0434; H:localhost.localdomain; FPR:; SPF:None; PTR:InfoNoRecords; MX:1; A:1; LANG:en; Received-SPF: None (protection.outlook.com: amd.com does not designate permitted sender hosts) X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1; BLUPR12MB0434; 23:yCJ6mLuymaamyOxIryQGPuS1OAR7pMVaeNL2/XyQy?= =?us-ascii?Q?uV8THv/PPBIP6KDPUPQsgVYK46A7j5y9lsWw+mvoXSAbY6rI0TeW7PrH6RAl?= =?us-ascii?Q?/f/lMJIuYDlK3mS2u/JOWxeFUd3WIZdgJWps8zQkJDxWDdadr1YOEsYbIlq7?= =?us-ascii?Q?8vwbUgBrdKctZ8/lsfQ6fu8JEF7+UidDAjpgPU/5RUR37xol3yLkJK6X1va8?= =?us-ascii?Q?jzUFO7KtZATGZXbU6bhIDenxOw3JAs87KOIr5actsh/CXzTq+8nbthgnE3hN?= =?us-ascii?Q?7aubmqjsmHAT9wAkwXiw6LBZj0cDI/3tIzdke0puIfN/qcjcycTqDwrH4MQ6?= =?us-ascii?Q?uinZhywwwOCCp/+sbsSUxblb0ucCMOR3jh0xAg12GqNX0jNuYJPuD2Zyw7mD?= =?us-ascii?Q?x9yKjT2nCeE3sYd5VICQdk9siUBMmHvBT/hKibR+EubuVEwg/SykPjyNVdKP?= =?us-ascii?Q?UzFIj9R6pVnhUTUqsyGI4vOTZbzB5YiLlb5xfaMprt3Z1PLn95Nk0YLngbjj?= =?us-ascii?Q?ugq02TZURtgZbtBTRmKUM9RrzaR80jH0cUISJCCT2Ort/jUhXPamU/N5RQ62?= =?us-ascii?Q?XgLYhWxKHTgiz0sIW5YzyoI9yv6bQN2LnjHPRmFkvnVj24b+51cOrR/uMo9z?= =?us-ascii?Q?azwYRqXVEoU2vC0s46/bTeRPWusU6C59MJCTCSSIdF9X7AUx0MeH7iz5kiJ7?= =?us-ascii?Q?Li1hpBxoecHAlBIDiHoodqDaAvHO13gSM2sMDSJ83jvJ57Num+X3AUlwUq5z?= =?us-ascii?Q?IlTepdIyDtWeFGkc/fHydhpeC4ZLb92GMM1+UrVNJytQBlSWKYAKDsehXYTr?= =?us-ascii?Q?SVtiJthO8pIWT3yiTwCi2qcaFTc/5yU378Tgmtv2yfSb5IZZLaB4EuU23kZr?= =?us-ascii?Q?erC2bplpZwicI550N9fA1PYPmNbddcUviwulMiDhgbYtrZ/wleWAlDMcOEZh?= =?us-ascii?Q?57hfZYgpSy4Q29YFVXXm/X2zLz0R6VhLAnV0UIMuiYkdtjN5ZlAnG9BojOGQ?= =?us-ascii?Q?DocuSb+2sQ6TZZG2Jn06wWc5O6DuROtZscTgNF9RJ2RK2E9xLaNiMXvkCNsU?= =?us-ascii?Q?hsdYDd838ML207ZkJRlRmiqg6CA/D+O26Tf67qN2BIwyqIh73frVDEKAEnHI?= =?us-ascii?Q?sgZjkJIUJU=3D?= X-Microsoft-Exchange-Diagnostics: 1; BLUPR12MB0434; 6:bteHPyUdmnMDSF3J2pwciDvhhx5XDKf89J9oTUIklZSI9y8cx+6fKB0jTujOvYyCXLmoAjDWBRE+O372qcPopd9OXLBfNMd87RJ6gOilZ0BxhWXrNRL2RKuKZOyPDKt5Cy+XmR9tfIzmL/gn3ViznqB0wN9n3DkA3bNT8BsDDTWXKDdU4UtUpnAHtWqlObTM6GSsr0ZQ0zuivcMrdEI2H1jOfz5VIE0ajKOzN0x0BxTLNJQZ4l6abAjHwCmWkfbuDMmMXwCDUyATrIBZq1zO3Qd9bUI2zp06HSMMnffR4PeiZygD2OjF+R8MfyobFb3U/HT1s8Wb4V1tr6uM2LqS4Q==; 5:YaSP6z3eDcY8Ug9mAiO4OOgyoISw1i4a42SznnSEXnYAedtiV422qQzPNBn8oBusbs3zLxU09bI+suHEicK5Q15KFo+lu1qE/dCB/CvlwGMeWH3nEWxH7kYyYzAN2K+hfO7bU2BDnQ9VudTbsErTjA==; 24:Iwrs4UeexTZdF9V8JtFrymHmqCNf8W6mZjWkAp1s6TJJeHObVSSy8MoqlLy8leZisBW2JYp67Gn/Nt1OzA2rWjERcBakgZSeyrwy+4a6Muw=; 7:SGOJhchFaJnDfheCGBmT+u72o27zkMtUGfnGthwup5DTNSRQ7xJ27UCga+Qs8aDNfll69l2z4VTxmnOG9MY36slMiER3lMruE7+eRCJGdiBs2CpVSmeRtHdtY70PgvzNR0bhg+e4tO6YuIBCQ8lZpYEMDs/4jjs64SJRTu0HI55bpp1yEQu4UcVXSwxt/jceC4TCrVzFcI7Ri54NnBP7qAaFbGDEzvc3qFbTlmOEqhjXahF2YSYzTp9NwroYX8mt SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-Microsoft-Exchange-Diagnostics: 1; BLUPR12MB0434; 20:Qp4Jm1CowHaw/gBehikqXTWGAaymEXNs62O2yT3OYqK+1g39fBmKUxi/XB34QUGVyiYQ/SpMaPzpHAN72GwH6DHgwLw80e8Fw1o6zd75PfN2qFe71H1brmd0fvLUp3cFfSXZS3UzPW0OmkSMygRA9kbBBx5+r9oWGlmYVZlKzM7SP1otJMnKCgtQTmDQ+AnTZCBkqlbjKfHECvsYEVMSCI2gbp3I6/eQMi9yc/KiWsRNo3nQd+aZzxLsRSRHQsb0 X-OriginatorOrg: amd.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 25 Jul 2016 09:32:34.1509 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-Transport-CrossTenantHeadersStamped: BLUPR12MB0434 Sender: kvm-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: kvm@vger.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP From: Suravee Suthikulpanit This patch introduces a new IOMMU driver parameter, amd_iommu_guest_ir, which can be used to specify different interrupt remapping mode for passthrough devices to VM guest: * legacy: Legacy interrupt remapping (w/ 32-bit IRTE) * vapic : Guest vAPIC interrupt remapping (w/ GA mode 128-bit IRTE) Note that in vapic mode, it can also supports legacy interrupt remapping for non-passthrough devices with the 128-bit IRTE. Signed-off-by: Suravee Suthikulpanit --- drivers/iommu/amd_iommu_init.c | 73 +++++++++++++++++++++++++++++++++++++---- drivers/iommu/amd_iommu_proto.h | 1 + drivers/iommu/amd_iommu_types.h | 24 ++++++++++++++ 3 files changed, 92 insertions(+), 6 deletions(-) diff --git a/drivers/iommu/amd_iommu_init.c b/drivers/iommu/amd_iommu_init.c index d091def..d0930b1 100644 --- a/drivers/iommu/amd_iommu_init.c +++ b/drivers/iommu/amd_iommu_init.c @@ -145,6 +145,8 @@ struct ivmd_header { bool amd_iommu_dump; bool amd_iommu_irq_remap __read_mostly; +int amd_iommu_guest_ir; + static bool amd_iommu_detected; static bool __initdata amd_iommu_disabled; static int amd_iommu_target_ivhd_type; @@ -1258,6 +1260,8 @@ static int __init init_iommu_one(struct amd_iommu *iommu, struct ivhd_header *h) iommu->mmio_phys_end = MMIO_REG_END_OFFSET; else iommu->mmio_phys_end = MMIO_CNTR_CONF_OFFSET; + if (((h->efr_attr & (0x1 << IOMMU_FEAT_GASUP_SHIFT)) == 0)) + amd_iommu_guest_ir = AMD_IOMMU_GUEST_IR_LEGACY; break; case 0x11: case 0x40: @@ -1265,6 +1269,8 @@ static int __init init_iommu_one(struct amd_iommu *iommu, struct ivhd_header *h) iommu->mmio_phys_end = MMIO_REG_END_OFFSET; else iommu->mmio_phys_end = MMIO_CNTR_CONF_OFFSET; + if (((h->efr_reg & (0x1 << IOMMU_EFR_GASUP_SHIFT)) == 0)) + amd_iommu_guest_ir = AMD_IOMMU_GUEST_IR_LEGACY; break; default: return -EINVAL; @@ -1488,6 +1494,14 @@ static int iommu_init_pci(struct amd_iommu *iommu) if (iommu_feature(iommu, FEATURE_PPR) && alloc_ppr_log(iommu)) return -ENOMEM; + /* Note: We have already checked GASup from IVRS table. + * Now, we need to make sure that GAMSup is set. + */ + if (AMD_IOMMU_GUEST_IR_VAPIC(amd_iommu_guest_ir) && + !iommu_feature(iommu, FEATURE_GAM_VAPIC)) + amd_iommu_guest_ir = AMD_IOMMU_GUEST_IR_LEGACY_GA; + + if (iommu->cap & (1UL << IOMMU_CAP_NPCACHE)) amd_iommu_np_cache = true; @@ -1545,16 +1559,24 @@ static void print_iommu_info(void) dev_name(&iommu->dev->dev), iommu->cap_ptr); if (iommu->cap & (1 << IOMMU_CAP_EFR)) { - pr_info("AMD-Vi: Extended features: "); + pr_info("AMD-Vi: Extended features (%#llx):\n", + iommu->features); for (i = 0; i < ARRAY_SIZE(feat_str); ++i) { if (iommu_feature(iommu, (1ULL << i))) pr_cont(" %s", feat_str[i]); } + + if (iommu->features & FEATURE_GAM_VAPIC) + pr_cont(" GA_vAPIC"); + pr_cont("\n"); } } - if (irq_remapping_enabled) + if (irq_remapping_enabled) { pr_info("AMD-Vi: Interrupt remapping enabled\n"); + if (AMD_IOMMU_GUEST_IR_VAPIC(amd_iommu_guest_ir)) + pr_info("AMD-Vi: virtual APIC enabled\n"); + } } static int __init amd_iommu_init_pci(void) @@ -1852,6 +1874,22 @@ static void iommu_apply_resume_quirks(struct amd_iommu *iommu) iommu->stored_addr_lo | 1); } +static void iommu_enable_ga(struct amd_iommu *iommu) +{ +#ifdef CONFIG_IRQ_REMAP + switch (amd_iommu_guest_ir) { + case AMD_IOMMU_GUEST_IR_VAPIC: + iommu_feature_enable(iommu, CONTROL_GAM_EN); + /* Fall through */ + case AMD_IOMMU_GUEST_IR_LEGACY_GA: + iommu_feature_enable(iommu, CONTROL_GA_EN); + break; + default: + break; + } +#endif +} + /* * This function finally enables all IOMMUs found in the system after * they have been initialized @@ -1867,6 +1905,7 @@ static void early_enable_iommus(void) iommu_enable_command_buffer(iommu); iommu_enable_event_buffer(iommu); iommu_set_exclusion_range(iommu); + iommu_enable_ga(iommu); iommu_enable(iommu); iommu_flush_all_caches(iommu); } @@ -2147,10 +2186,16 @@ static int __init early_amd_iommu_init(void) * remapping tables. */ ret = -ENOMEM; - amd_iommu_irq_cache = kmem_cache_create("irq_remap_cache", - MAX_IRQS_PER_TABLE * sizeof(u32), - IRQ_TABLE_ALIGNMENT, - 0, NULL); + if (!AMD_IOMMU_GUEST_IR_GA(amd_iommu_guest_ir)) + amd_iommu_irq_cache = kmem_cache_create("irq_remap_cache", + MAX_IRQS_PER_TABLE * sizeof(u32), + IRQ_TABLE_ALIGNMENT, + 0, NULL); + else + amd_iommu_irq_cache = kmem_cache_create("irq_remap_cache", + MAX_IRQS_PER_TABLE * (sizeof(u64) * 2), + IRQ_TABLE_ALIGNMENT, + 0, NULL); if (!amd_iommu_irq_cache) goto out; @@ -2403,6 +2448,21 @@ static int __init parse_amd_iommu_dump(char *str) return 1; } +static int __init parse_amd_iommu_intr(char *str) +{ + for (; *str; ++str) { + if (strncmp(str, "legacy", 6) == 0) { + amd_iommu_guest_ir = AMD_IOMMU_GUEST_IR_LEGACY; + break; + } + if (strncmp(str, "vapic", 5) == 0) { + amd_iommu_guest_ir = AMD_IOMMU_GUEST_IR_VAPIC; + break; + } + } + return 1; +} + static int __init parse_amd_iommu_options(char *str) { for (; *str; ++str) { @@ -2511,6 +2571,7 @@ static int __init parse_ivrs_acpihid(char *str) __setup("amd_iommu_dump", parse_amd_iommu_dump); __setup("amd_iommu=", parse_amd_iommu_options); +__setup("amd_iommu_intr=", parse_amd_iommu_intr); __setup("ivrs_ioapic", parse_ivrs_ioapic); __setup("ivrs_hpet", parse_ivrs_hpet); __setup("ivrs_acpihid", parse_ivrs_acpihid); diff --git a/drivers/iommu/amd_iommu_proto.h b/drivers/iommu/amd_iommu_proto.h index 0bd9eb3..faa3b48 100644 --- a/drivers/iommu/amd_iommu_proto.h +++ b/drivers/iommu/amd_iommu_proto.h @@ -38,6 +38,7 @@ extern int amd_iommu_enable(void); extern void amd_iommu_disable(void); extern int amd_iommu_reenable(int); extern int amd_iommu_enable_faulting(void); +extern int amd_iommu_guest_ir; /* IOMMUv2 specific functions */ struct iommu_domain; diff --git a/drivers/iommu/amd_iommu_types.h b/drivers/iommu/amd_iommu_types.h index 590956a..25f939b 100644 --- a/drivers/iommu/amd_iommu_types.h +++ b/drivers/iommu/amd_iommu_types.h @@ -92,6 +92,7 @@ #define FEATURE_GA (1ULL<<7) #define FEATURE_HE (1ULL<<8) #define FEATURE_PC (1ULL<<9) +#define FEATURE_GAM_VAPIC (1ULL<<21) #define FEATURE_PASID_SHIFT 32 #define FEATURE_PASID_MASK (0x1fULL << FEATURE_PASID_SHIFT) @@ -146,6 +147,8 @@ #define CONTROL_PPFINT_EN 0x0eULL #define CONTROL_PPR_EN 0x0fULL #define CONTROL_GT_EN 0x10ULL +#define CONTROL_GA_EN 0x11ULL +#define CONTROL_GAM_EN 0x19ULL #define CTRL_INV_TO_MASK (7 << CONTROL_INV_TIMEOUT) #define CTRL_INV_TO_NONE 0 @@ -329,6 +332,12 @@ #define IOMMU_CAP_NPCACHE 26 #define IOMMU_CAP_EFR 27 +/* IOMMU Feature Reporting Field (for IVHD type 10h */ +#define IOMMU_FEAT_GASUP_SHIFT 6 + +/* IOMMU Extended Feature Register (EFR) */ +#define IOMMU_EFR_GASUP_SHIFT 7 + #define MAX_DOMAIN_ID 65536 /* Protection domain flags */ @@ -682,4 +691,19 @@ static inline int get_hpet_devid(int id) return -EINVAL; } +enum amd_iommu_intr_mode_type { + AMD_IOMMU_GUEST_IR_LEGACY, + + /* This mode is not visible to users. It is used when + * we cannot fully enable vAPIC and fallback to only support + * legacy interrupt remapping via 128-bit IRTE. + */ + AMD_IOMMU_GUEST_IR_LEGACY_GA, + AMD_IOMMU_GUEST_IR_VAPIC, +}; + +#define AMD_IOMMU_GUEST_IR_GA(x) (x == AMD_IOMMU_GUEST_IR_VAPIC || \ + x == AMD_IOMMU_GUEST_IR_LEGACY_GA) + +#define AMD_IOMMU_GUEST_IR_VAPIC(x) (x == AMD_IOMMU_GUEST_IR_VAPIC) #endif /* _ASM_X86_AMD_IOMMU_TYPES_H */