From patchwork Mon Jun 13 22:06:41 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Suthikulpanit, Suravee" X-Patchwork-Id: 69952 Delivered-To: patch@linaro.org Received: by 10.140.106.246 with SMTP id e109csp1759455qgf; Mon, 13 Jun 2016 15:23:41 -0700 (PDT) X-Received: by 10.98.93.65 with SMTP id r62mr14073263pfb.114.1465856621002; Mon, 13 Jun 2016 15:23:41 -0700 (PDT) Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id y4si20070740pav.171.2016.06.13.15.23.40; Mon, 13 Jun 2016 15:23:40 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; dkim=pass header.i=@amdcloud.onmicrosoft.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1424252AbcFMWXg (ORCPT + 30 others); Mon, 13 Jun 2016 18:23:36 -0400 Received: from mail-bn1on0061.outbound.protection.outlook.com ([157.56.110.61]:14821 "EHLO na01-bn1-obe.outbound.protection.outlook.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1423054AbcFMWWV (ORCPT ); Mon, 13 Jun 2016 18:22:21 -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=2g/BUmZFdimkYa3M2ms3CK3UjJPtQJbPQQNhdt1oi5U=; b=jqgyCQckDbkaXXcRi8t0rZu7cU09Rz/k2VYjQmAfXQY4Tn3OHKnuM9EmuNROD3Cy5akYq7CtiaRoTVR5AGj71ZQK1yw8v8vgPhxOFRmMyOtGCCrFSaOWH48Ds+OUogZlh6gJg0v1RFbKgn5DwJjMFsu4wqq0PNngCkFnxfYA0Vk= Authentication-Results: spf=none (sender IP is ) smtp.mailfrom=Suravee.Suthikulpanit@amd.com; Received: from ssuthiku-cz-dev.amd.com (165.204.77.1) by BLUPR12MB0434.namprd12.prod.outlook.com (10.162.92.14) with Microsoft SMTP Server (TLS) id 15.1.517.8; Mon, 13 Jun 2016 22:07:00 +0000 From: Suravee Suthikulpanit To: , , , CC: , , , Suravee Suthikulpanit Subject: [PART2 RFC v2 01/10] iommu/amd: Detect and enable guest vAPIC support Date: Mon, 13 Jun 2016 17:06:41 -0500 Message-ID: <1465855611-10092-2-git-send-email-suravee.suthikulpanit@amd.com> X-Mailer: git-send-email 1.9.1 In-Reply-To: <1465855611-10092-1-git-send-email-suravee.suthikulpanit@amd.com> References: <1465855611-10092-1-git-send-email-suravee.suthikulpanit@amd.com> MIME-Version: 1.0 X-Originating-IP: [165.204.77.1] X-ClientProxiedBy: SN1PR0701CA0005.namprd07.prod.outlook.com (10.162.96.15) To BLUPR12MB0434.namprd12.prod.outlook.com (10.162.92.14) X-MS-Office365-Filtering-Correlation-Id: 169e168b-7c1f-4fd4-1b52-08d393d70bb4 X-Microsoft-Exchange-Diagnostics: 1; BLUPR12MB0434; 2:Kh7IAfkGb4SIC8ZSkY6WruoQRARfhDpCPJh76FSGDjSpttFfm3rn9Ju0CAfCG1GxWFBIwju6HU6HTq1OCt7oaQyFjJpGAa1tqeOTUzlOtFUcZXfisQzo2Bi3KWCrR+WQe8/pQcFR8+FrjdThS/LCwCrc50sBMV1PPBxoMNlkNjhuHOOa8pMxEcD6VgKDZpTD; 3:pdflHznyL9YI+ZvyZkuwiNx5R/fsSdfv5PP7NOmMuTrJ2yDll6LD3UHv7koeWa/G0+VQHNiZIqCFxHCv5IppRBvdEH4Rs/HeSJBtKfyiExeR+qX2LxcI4tfIoUThp2MY X-Microsoft-Antispam: UriScan:;BCL:0;PCL:0;RULEID:;SRVR:BLUPR12MB0434; X-Microsoft-Exchange-Diagnostics: 1; BLUPR12MB0434; 25:TkVA3Bvx7rXjeCwdSn64/9UDlrpqvD46vkTnGppxK1PCrkVgNJ1h+LK9t3yjqgHHw9W17ckG5jgiyz8oBoe2IUsc6AvZtmnV9mUR0nWozOH/kFAqP4QFmr9TYYfWzdi6gJV8TgG9sZ2ac5WV5W7N1VbKb/uJfYdyrUj+XBw9VzG7//Sa5KBiru5EEUSPUHMr2KoVl42Q0A9waXWcALN99hwSswmgNm5bjX0IebG8CYqch4E90/GxcNb2/I+3BDNQTvy+U0c+9Y2k0waGzHEvftGsgWmC6OItBhvMy/+rvTiLwps6y5ouz3HcZtTX/cRwybRjr8r50JMfizxTXKwAAUfKk0g+uzSdpey99yDNfaY+avm2xHUavlFWXYZwhUDdYyIVSiQ+zoZwQF9qIExPIyGOlhbefFWh2gCfOAUR78NAzAezjY6GPgrzHxtGvBVyOsv1IFw5rRzY2v5luvKL2BIdlSKVFJ5NvcVLHKqzWFQ92FvFrnueg3mPCMk+KZLldVKEgYqgv9tFTuH1fggmJrcI2r+k1VfMFvWDEuUYaC48Paezf+xQltH+AYA2ejhupGUrCODZYQaGdBpQRpP1lmMKO6fO7xTWJBadK1nCnV2Ubv1hhVFpFx8NF3wo3TLvzZQpliCuEMt2MZLHDfcPmLHEQN2L7FPLaURM4er1MTkPJWnGUrnrwXkfr4zJP/46ENT8D1mhx6QM6VBPVgImXwSmCLQ3INLFdJgUEnVwsHA= X-Microsoft-Exchange-Diagnostics: 1; BLUPR12MB0434; 20:KOzpFEWVgm4omeIEqy+UB9RqiyQZdL0DSCRRMa+tETtwxbKAeoc8EfaehdBSmOzGIuR+gyg/+2Ki0f8k7MjBc2lNy9IG8AwFi3dgxlJIGpysk/hq50i4MIrpYQj3sKtMYhxS4wpFS4V8WSrE+VdM3/XDx289crCuljmLZPtqmhvOPTSma9HLLmIr6lYhvI6nUvUdkU66MkNApnnVaiGX9z1mkdpc9FaAWgwmHfnF9E2lZbxANcyKq7DPx+AGVfwDVgPcPhHyzPa2L8W6JAxgIU63XuYBQTalMu0xgp69VlXIz06Dzwbb0Ww0REgiWxSQLwvOK7dFG4AfTBboLjYlFFgzPH/E9JFPFvsDwlMC+MNGXuXdzJ5QHX0l9+i5zQe0r4zuZ0ImuKvBu6vmdFOkXxmSdiOjYtxDBypGagWu+NL+ZJ2KZs4ZjtueV/6OHSfB5lt29iWgcN/RP8fIPSy/l0TsbJLAhOKInkuTYYns3MHZ01yoNTSGUZZLEKxu0pLk; 4:zIu/zDIEQqh7ijd7q6Cz8stEvcnNoFUgH81hYT5vaZqzOa0G71Q/EbZ5tgI9Vwmzos7V5YLzHY9yI5qSn+Fm5yOnP00yI1vBWCAuTb0x6z9DmF0dX5JwNmdPTfmiqbIaLblAO9HXVXLmgg6RH9MqTdxirt0GFrrSsipWNDhd/TZe5J5L2/xMaPiu5Y18G6Vhb8/oIVnkF2UpqH6FEcciyAJk9VgN0jiW6w2Z6hhW2nCdL0sEIvsLbo0Je9ZzvWz17S6HbteWXj7e3upRLn3DgyTnFrlweWvxuyaN+dYww8LrfNTIzNmB3BKaCth0BwXfwhvyHiVYx0IMYwFj/LQK4ShZyHHm191Pz3dHkv8l2RjmbUKJ/fZiVaZVYt/rgXtjJb2X42NCdJSKJtC418KkvEsYfXzbhBnKKUcCClkRNds4Ug2xomvo+wkWF9UXPzLl X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:(767451399110); X-Exchange-Antispam-Report-CFA-Test: BCL:0; PCL:0; RULEID:(601004)(2401047)(8121501046)(5005006)(3002001)(10201501046)(6055026); SRVR:BLUPR12MB0434; BCL:0; PCL:0; RULEID:; SRVR:BLUPR12MB0434; X-Forefront-PRVS: 0972DEC1D9 X-Forefront-Antispam-Report: SFV:NSPM; SFS:(10009020)(4630300001)(6009001)(7916002)(189002)(199003)(53416004)(50226002)(5008740100001)(50466002)(36756003)(19580405001)(19580395003)(106356001)(189998001)(68736007)(105586002)(42186005)(2906002)(586003)(5001770100001)(101416001)(50986999)(4326007)(8676002)(81156014)(2950100001)(3846002)(6116002)(76176999)(77096005)(81166006)(97736004)(5003940100001)(5004730100002)(47776003)(86362001)(575784001)(48376002)(92566002)(229853001)(33646002)(2201001)(66066001); DIR:OUT; SFP:1101; SCL:1; SRVR:BLUPR12MB0434; H:ssuthiku-cz-dev.amd.com; FPR:; SPF:None; PTR:InfoNoRecords; MX:1; A:1; CAT:NONE; LANG:en; CAT:NONE; Received-SPF: None (protection.outlook.com: amd.com does not designate permitted sender hosts) X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1; BLUPR12MB0434; 23:Flfm3yRROo7vut0ZGmDGj67QSb3lCJpPmM+QzMGKw?= =?us-ascii?Q?zn28zdowhfEPCb7+KG6uYJ9i8bLa6VcjgJGrTYtRMftmXODEq5PnEd7/c6lx?= =?us-ascii?Q?jmmuF7zGycofhqrZPEVHRqmeh4FhRZZIQqVo1la+Z3KWvE/iA9apFtoGXRiL?= =?us-ascii?Q?Yeg45cfA86DrvtYnj4DNeb7hN94PTCigLWUuf8OdYIPdrAHc9hBPaTkzQT+m?= =?us-ascii?Q?JI05KTpUd6lQVtm8zfpL4/6WIWKg8wfPUgVvocZMRGDz+8BKBlUMiJm/1nsX?= =?us-ascii?Q?VVij5OipW9u0/CN9nBxgPErlF2WFpMgAYOkdgtr77A6kP2KXlSDp9Whu5iD+?= =?us-ascii?Q?acfp+oiM7w3Y1XxVUFnMz6o75OfftQdGpLt+KlI29NOCkf5pZfjuwOf4v3Jr?= =?us-ascii?Q?l3QIgaXDVFNoxeYWwEFuwikB1RgeYtWUFp1oO5CRWzcFrHBvkvshgqCOYrm9?= =?us-ascii?Q?Lm4y24x4Z6nC0AK2PM4yulIEOlo8hlTAPSiikwxiJFpjVlZb5OI/eeHzpezW?= =?us-ascii?Q?qnIEaCMRfaxgdeiQnJniR6yRFYhSLM2tLNstN18vR6JQIVFDgYCAqXrw0qSD?= =?us-ascii?Q?poG1lhr0A64sQ3hEOHNoysKRkmkELBU18aHmlQyCuVYtWu8wqWMluXlHK9Og?= =?us-ascii?Q?M/iB8uRK2QEROAsWwzN2lI4GYkLUiJM1NnuYYOzW3Mfa2+ESFh5Cs1JMabH3?= =?us-ascii?Q?xlQ2+N7+u1p4YIknRt0+EQ+8DgGSSE69r8+I/9bTVxDnLvp3sb2nThXLtvql?= =?us-ascii?Q?2seoza+Z0I8rcgXFHpM1M2lRYaHKKYtCaHggb+Q5oOGMPimFUBRfOynEk+8A?= =?us-ascii?Q?ZE51noEkkF19zKYeV90Djzcq/ayuQc0zy/BSvlZbICKvxERNMSTFMOihCway?= =?us-ascii?Q?3vIUHtF8Vi4MfNJQrRgAM9twdgOZBhjhRrrwenPTxru61EzRGRgUTrRu3KBy?= =?us-ascii?Q?TS0AXXdm9A/o8RXF1YN1oCrzPrT5isbsTxBJqaNb6w9JO2s0+jQ/qvFLeupf?= =?us-ascii?Q?/nTBolVw83/DDI3dvV9FL9REid/2rqNzCnyISSvFocQJXWuWz5QhM6aCL6/3?= =?us-ascii?Q?OAohiFUorERB99ZzKyWJP8M1bnCFa0Wrl8adOAkYWIzpZo+0kyOqye1ynsMp?= =?us-ascii?Q?z/1Hho1/JU=3D?= X-Microsoft-Exchange-Diagnostics: 1; BLUPR12MB0434; 6:NjW8E+a4enqudIfk43vtEv7FjSRKXQA4QIab2T/DzoMdUHHvU+6uEftyUeAGWmzWUzms8A2SZoamFSmA4/A0UDRWJn3prp2Hzu+/Ht5UDCLztNMxmsyx9l69dL3bdNHVYvkw/14TSExzADmptlD2tFUn4MXAgeSnbdHT3uiOb/jHEhkBUJF7/k4k1SOG0X3c/ziioFjp24zN1g5iyaNpUjYv2M0YUnK8bWP0w3Bw2nb0L+MyeLgKsw/A1lkfJS5tfWQFdeXoCGvmcy6WVQjcMF8G5xSi5hmuf4j5sMrvpIoFVSeCyabmv2SLZ5dXSBkF; 5:HDPVYGiejqwahuHxV2kGhkMa0T8GLE984YaJQvU+1E+6DrpGQ3Ic81bpB5gM+0pBdKmOoa6iWFSi+PidMZO7UiIeiKc2Q1OhXOvej36qVJJCn1gWjF1A7Obuh4eEuZPO32QMcn6MCGGm658XTSwAaQ==; 24:TfbaVoSvjhIKbtz5rymGyRD8KIZzMuwsN6o1GrklQmvYlMtNuvDgRoRc5Y7fgy0tEphV7YYGjsxOrqZMHXtmr8NITcajXbMhKz6nX0fHTl8=; 7:rV0uK/9oDEIQVhtcKbYbjBfrN0m0WprLr2ZqtkrqwRVClir8grTGIbjOJ28znwtUXDPfUGXaVuRvuI7tOQOHVOPqYD02P5geuilRTawToKyH6gIjPd8kekKv3fx6XkHgzMpKrnkJEsfVZF7sRwM1GDM/hYNU8qQ2Y+1O9G98Rw//WmT4433pVcNGzKZ3zdYIWPSN4EvXwDJwSLPJLXgc2w== SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-Microsoft-Exchange-Diagnostics: 1; BLUPR12MB0434; 20:IU3DyUD8kkFABaXJH9O/1tmaUFHie+rzFmbvvAWhuZ1hCpnQFGdRDjzCbYiSat08yMa58Moih+16sKW/IbrLl1DRAqYrHbprvmoqLXJFgqfDV10QbN30vcq6AiyVNryHSRkYorh0lpOKQ+WqHTFulgMNNiBLySwQmDKZJLadNl6IqvrCuMtYzfSsi3vI0n1utXrK3jeYNLstpz3OmmDaElnztI+hrLLkGOjjAC/MsZPU1aaQUBbGNSezNngGpHsY X-OriginatorOrg: amd.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 13 Jun 2016 22:07:00.7976 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-Transport-CrossTenantHeadersStamped: BLUPR12MB0434 Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org 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 | 77 +++++++++++++++++++++++++++++++++++++---- drivers/iommu/amd_iommu_proto.h | 1 + drivers/iommu/amd_iommu_types.h | 18 ++++++++++ 3 files changed, 90 insertions(+), 6 deletions(-) -- 1.9.1 diff --git a/drivers/iommu/amd_iommu_init.c b/drivers/iommu/amd_iommu_init.c index 9e00341..57c1dca 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 << 6)) == 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 << 7)) == 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,20 @@ static void iommu_apply_resume_quirks(struct amd_iommu *iommu) iommu->stored_addr_lo | 1); } +static void iommu_enable_ga(struct amd_iommu *iommu) +{ + 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; + } +} + /* * This function finally enables all IOMMUs found in the system after * they have been initialized @@ -1867,9 +1903,13 @@ 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); } + + if (AMD_IOMMU_GUEST_IR_VAPIC(amd_iommu_guest_ir)) + amd_iommu_irq_ops.capability |= (1 << IRQ_POSTING_CAP); } static void enable_iommus_v2(void) @@ -1895,6 +1935,9 @@ static void disable_iommus(void) for_each_iommu(iommu) iommu_disable(iommu); + + if (AMD_IOMMU_GUEST_IR_VAPIC(amd_iommu_guest_ir)) + amd_iommu_irq_ops.capability &= ~(1 << IRQ_POSTING_CAP); } /* @@ -2147,10 +2190,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 +2452,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", 2) == 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 +2575,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..5884a1e 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 @@ -682,4 +685,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 */