From patchwork Mon Jul 25 09:32:07 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Suthikulpanit, Suravee" X-Patchwork-Id: 72697 Delivered-To: patch@linaro.org Received: by 10.140.29.52 with SMTP id a49csp1048876qga; Mon, 25 Jul 2016 02:35:42 -0700 (PDT) X-Received: by 10.98.60.217 with SMTP id b86mr28144292pfk.129.1469439342848; Mon, 25 Jul 2016 02:35:42 -0700 (PDT) Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id x20si32781064pal.165.2016.07.25.02.35.42; Mon, 25 Jul 2016 02:35:42 -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 S1753186AbcGYJfj (ORCPT + 29 others); Mon, 25 Jul 2016 05:35:39 -0400 Received: from mail-sn1nam01on0076.outbound.protection.outlook.com ([104.47.32.76]:16256 "EHLO NAM01-SN1-obe.outbound.protection.outlook.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1752951AbcGYJde (ORCPT ); Mon, 25 Jul 2016 05:33:34 -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=RVXa3RoeVumSLMuVl4V1YsM4xPxir69EPM62pWRk52g=; b=cJKsERrNP2+MH864GQ9DWXGcizk5krR6lV8cB2I2vkND/zGnOZ7kfudlXaB6Eu5W0x7TZ+ZrlHXLKBGDtAVeNCl7QqHFfzMukLA70gL0kP7scyNgC4v/IcWVKyAHpo1bPmv9wGoJlkFgi6yMYOHVQGS1V9QkN2GSh9/pOvLMR5U= 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:33:08 +0000 From: Suravee Suthikulpanit To: , , , CC: , , , Suravee Suthikulpanit Subject: [PART2 PATCH v5 08/12] iommu/amd: Implements irq_set_vcpu_affinity() hook to setup vapic mode for pass-through devices Date: Mon, 25 Jul 2016 04:32:07 -0500 Message-ID: <1469439131-11308-9-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: 41ee8197-76ee-4381-c454-08d3b46eb229 X-Microsoft-Exchange-Diagnostics: 1; BLUPR12MB0434; 2:55gKJRxFbNNCNg/CmQWh1MGtWaV8liuZ/Dc4oyItsoV7spMRPt2O+RWSRsJLroRDxS6lgwXbdSve+RXzc1aYILgDO26O1uRHPhHYFgTycneE/ZpFtTAH9zMlreeXS1m0KuHgAAbD6s/4D+a5vE2VmJLqkX8zy1+HmDbkeMrKYflWeyhDFIeEzXMIf28PXI7V; 3:mIMXOAl/q9XS/FJlwD+9yFtqSY/C2krPh2U4gHoTQwROSa9Rsa1eUB5LzlTYVETGtJs3D0jjxde5JZsLmjRxQTBEQHXsYFBT1fq1MQIF8jrzSB0s2E8/U3BdFyMQpmrl; 25:gmwF7AgpgI1z5w3YQhWg4jGJGN9gDLP3qkuk8JXcoLeXHqJYR/0sul/X3enri+zbCukEq0BqGgrfM9Vb2YOR3ibWOFLSWFaL95ubXGj082mgqjGl3J8SaCaIHvojhtrVXEmgUX+Ax4/2dp4qtMQ6yrw+gLUMr7wwynXLThDu58lwb65udfJTjvEATqm5FQhVrKt1f0MhtJay384oH6ybdztKGRXKDvQn/Siu+LsSoSgex2+VhLCvAYW9RzBKB43MOGzXJLOkll3mqtMLTQGO+OS1DaC1Mt2jPBqdXFqQJ1jwDDagbqO9u+X/7LhHjHBsVJeDeGY9FphF5p5WnptitZFGA2GMcMv84CMAYdHpnsSu6mSKLT9Y/a4ayj0ddiBZzgf2dZpb0ZC1dl93d/2V5oJRjFRgxQPNw9+GuucYd1I=; 31:uj0YJESoGR9+v7w+W+7qAFNFRBVUE9AawP/GgCJGAUswi8aZw4sSR/5CoOf99DimmM2KcWw4+lbpdF2S3c5Jzhv9ItyJPDX/wkFTm54Y1mJ03kO22OV92u3RWiPcGK5x0yH8LBqRs7/znf5WBD7cfWwchAEn8aoaT+rn3dI1PaudpK5xUpEsrofSvgoBl5eJoKq4Q4Kah20UvA/Wix+kyQ== X-Microsoft-Antispam: UriScan:;BCL:0;PCL:0;RULEID:;SRVR:BLUPR12MB0434; X-Microsoft-Exchange-Diagnostics: 1; BLUPR12MB0434; 20:bQ9HRJdAHov5k35XZrrDrAJGulIAsgB5VuGoT1taUmXoveYTuGD+2Y3BNB0sIuoD96Lz/rpWDNA3ORfzon100ofpMUPGPsAe2ZeVmTWhlYl2QvVQrL+7feouypwRKd1Ef8omM/O8LcDfAUXPIDnMJwgYztbzh2CN6LS3hvB+9Nhhxay+AeBcNRXrPuj4hhFHGIcpZTcdml/HO7MSzXzNOccD6BykjWOfDtqOeoZAvlEZyG02O77PYPDtsSoeEwxEhvZfb5PkD0WHwbOGzEC0GJVNM8ffrAgTbYbV55pQi4e5w/DYL2FJBFra1pVHtsFKHa0038UJwH0KOIIlE2WyYB61N1de6KhRAueusuzgFQK2e0saXFkLcSVzsR8Cq0sWs+DOWe7DvUT1w6rtU6a+DPT5u6AyoO+NPe8Kg92JRUhNyabB2aT3YZkoLKDbQdbaJZxdlukKZiEUzmZMoh0YvV2qssgUdpYhJpohiMQ+9KkomwwRJMjTxUPV4uC2k0Wh; 4:4fDBeo7S3ML/gIPrJURPjKUkdT/uxv82VUE7ncI6LDi+Gsk6wgeMLTS1VI12I0XTkrIR7LJutEbh7LTEEECpk8PEvRKZvnpbVPeei8kPvlI5jMV15JfNfSisY2rLVo3yStjPBIgANmD7VEnSDQgEUKJ+dOq8ne7KpngVowLpS0/w8YWZWEf/5NQB9m9LB0zJK88YTWHWCPWlFeoiyn1v7zQr37HHmy/QYBq4znV1pDRY57nH3mGaL3csnDd3vrqeTus9N6CWMf95XYQrJK4xquMZWNjLpYX9R8yBTkd+/y+NZyw7P3w8m6bBbD5li4V8lrNND2SmmC9/mLqBcmiP9yHxrk9yu0R7+Io0qf6dXc/L9Hr3t0bv/8oMMer5J6oWFOK98BvpSYmOu98zU16uTDrsKNDZIjStyU50MYx/cIOLecZjZrwKuCEltpT0aFLT X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:(767451399110); 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-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)(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:jzZb4/PIb0sVB4S+zHvbJ6yg9J5lGftSkiwKYfKzN?= =?us-ascii?Q?1SLU2ySLXZvb7ggsGFEEbMhW2WoNwONSLMpQRoIMIwyowTHLrPdaqw8gQSF/?= =?us-ascii?Q?iM17Er9Vg0XrFyHj3gb1mX5yHpy4u6ONUZjefQCDSSH/BzwgsRndVF9vRy1H?= =?us-ascii?Q?N9uJz15XhRELa+XHm3F+g7YMr0mHXVn5DtbBrH8LPneIwC2KIBItdnVhJbUt?= =?us-ascii?Q?w20RPNuKDXhm3ZHrWecfr/4R2aqlAXsi5M2RbeO1+0fbyGIrBhWPsVtDWdoc?= =?us-ascii?Q?6gCJguDV9N05SQ72yVva1c0pYRAbY+ZJ4OLP9z+hDnrAgsBJ2pP1uCiH4tPO?= =?us-ascii?Q?Fje99J7gdmpDzL/rzJx5SUBxaSYq0+9LrdYNbGJ+YoAFe9N8ARV/hha8JNB+?= =?us-ascii?Q?z6/dAKFs7/Og3x1Dko5kc4dhAXpQczYLLcrOamhm+f6KQN2OjBM+WQ1MVmWM?= =?us-ascii?Q?Hj4ZmbhOsaHuF9L0H4bSZxoRPR+a6LdR0pNRiAPYYu+aEIRAl13iGqyhWgOs?= =?us-ascii?Q?+vLf+SWFG6U6IRncFr+lVuMBb7ItuLD/nbnH4vA1TffZNcibBi+OMAF6mBBx?= =?us-ascii?Q?7Ted0UDFv2neM1G++xNfmf73OGPATk+ebqrZVkdS1y73+A61k9Jxze3EFrKq?= =?us-ascii?Q?a38UoLFwOs3l0LHe3hwLjw5e7oC5mrI01Mdl/uysGtRdyFqtt6Qwt5BSfLgX?= =?us-ascii?Q?6/X6dhgPj/0kvEolm0jyprqx9rohhX760zZMvLheAK76/x1npbu9gRvt2Zgk?= =?us-ascii?Q?z/2LqhbdesRShUPRl4W4DwusgKgJ13yp75dlteO3HNyca81QyZ02Dm8cNvnE?= =?us-ascii?Q?ZlYUajqC8Su4a2a4qTgPAb4wi1ouYotV8P7JP8ejtGbQqLXwNXmFGU+YyVG3?= =?us-ascii?Q?aWkp4GDMVj6qwJXlmC//SN+zJUkIf6lIMZ+WuK2P1lfWJXOLJsNAxk3Fv1gP?= =?us-ascii?Q?pzCimyqkbfqaeIx8fBxOri+5SDVTTtXkcinE+x3QOFXI2mWO1wVIYeyNxNXp?= =?us-ascii?Q?QNTMu9YzBNYzwpSFUgrmk+u2rXUA56PZfCUbBuR3HKCoJMzgoasz+km+e07s?= =?us-ascii?Q?PMyOcHZ8wIk6Ksi/5grLInncDVt7KoT9UFiuP9ZPHgfuoooyA=3D=3D?= X-Microsoft-Exchange-Diagnostics: 1; BLUPR12MB0434; 6:vHzM4FIUz5p+de545INsbjk9AfXD7mC5eMjHdStaVul8a6/FRLkJMwNwoCx56qqQn5RQI+26N4muBhavcewztcK3ZADs2y1SZzHWPXEqUJqhCWMiqbd+g4dnscjM5P895uyF+uLaq9jJfq1CzcirNdKG43qaj21NnQGDtbv80tOJgKDzrhHAt9l/CfpwYubn9zCZs7dfM0N+cGspT/5KG5IexnagVWv7lHJBI+IKAQN/Lphlq3zDM7N0T0GFxk8I2E630RMbqwx4mVJ95x3TZyO8uVtgUBDUS5QB+bes9aafVQ/Rn3f5nBFzk7okPIXSza/ymGIPF4xR0el9u2oT1w==; 5:9E8AFcgv7iFI58Bvb+uHXzFv76Dui5dWoEIhb2SO0jnZn0QmyB8TCZijEMMRs9tvgpqfyWXHcgG2rWpGqxO512d6x8wnYr5cuIbx+/adGQhiDUP2YYlNjgIMt/kToSUfq5qy2FR0HRgZVWljwFNGVQ==; 24:VWJhksMNqv0axFEw9gvwKVHdpp9omK4dmrUYmWo6GCgife3hTy9Tl+ai6pdB5EPbFHYvYQSQFOlw1hsgR4aN0VArw+E0EWYu9CLWC2oCHLs=; 7:wNSyeg3EWRUFRlS92swMhI9E3mCnS6+qeL41tywb0cW/4KIn3fGLDhkWmdvcv8xcFxzP9UKQpJwknH0CK4djp0XVZRgNY8Hjo9LYwxav0I1uEAIZjzr4N3zhKTyh/AwURgM9AG0NcNPYeVOV5BbA9HqZXpvt125QKVfs+2zRoavOlIpbPqCGdIUAK707QrQbC8NAAbzHMf1yFe4UxhJwrNAQp/qQUPxXPbzv1BQ/3pcvvAdlFuSfDRYu1wwTENOg SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-Microsoft-Exchange-Diagnostics: 1; BLUPR12MB0434; 20:+F0sFeCYrlzHnhUGaU1+ZcxegWgP9cLV7mIul5mjiOLaRCz95c0RLcxIZNgEB3G5AHxTLYqEOyh+M5B/RZ6Bajws7Sh0+VN8T7LU4Btul8aHCrqGGUjCOie+NPNJRmCj9AKCC8hcaMlocqTgslGlQgBzIUzwcKoP7qzj1lK4M9ANGSgdm8RrUxp+Nh6e5kesLyWK5pb1di+3vkaVHluAQZr/l0WEmfdOZRC2UCtO19IvP4Y84IbUEdUxI3130H42 X-OriginatorOrg: amd.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 25 Jul 2016 09:33:08.9412 (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 From: Suravee Suthikulpanit This patch implements irq_set_vcpu_affinity() function to set up interrupt remapping table entry with vapic mode for pass-through devices. In case requirements for vapic mode are not met, it falls back to set up the IRTE in legacy mode. Signed-off-by: Suravee Suthikulpanit --- drivers/iommu/amd_iommu.c | 67 ++++++++++++++++++++++++++++++++++++++--- drivers/iommu/amd_iommu_types.h | 1 + 2 files changed, 64 insertions(+), 4 deletions(-) -- 1.9.1 diff --git a/drivers/iommu/amd_iommu.c b/drivers/iommu/amd_iommu.c index e6a271c..a044ce4 100644 --- a/drivers/iommu/amd_iommu.c +++ b/drivers/iommu/amd_iommu.c @@ -3904,7 +3904,8 @@ out: return index; } -static int modify_irte_ga(u16 devid, int index, struct irte_ga *irte) +static int modify_irte_ga(u16 devid, int index, struct irte_ga *irte, + struct amd_ir_data *data) { struct irq_remap_table *table; struct amd_iommu *iommu; @@ -3930,6 +3931,8 @@ static int modify_irte_ga(u16 devid, int index, struct irte_ga *irte) entry->hi.fields.ga_root_ptr = tmp.hi.fields.ga_root_ptr; entry->lo.val = irte->lo.val; entry->lo.fields_remap.valid = 1; + if (data) + data->ref = entry; spin_unlock_irqrestore(&table->lock, flags); @@ -4028,7 +4031,7 @@ static void irte_ga_activate(void *entry, u16 devid, u16 index) struct irte_ga *irte = (struct irte_ga *) entry; irte->lo.fields_remap.valid = 1; - modify_irte_ga(devid, index, irte); + modify_irte_ga(devid, index, irte, NULL); } static void irte_deactivate(void *entry, u16 devid, u16 index) @@ -4044,7 +4047,7 @@ static void irte_ga_deactivate(void *entry, u16 devid, u16 index) struct irte_ga *irte = (struct irte_ga *) entry; irte->lo.fields_remap.valid = 0; - modify_irte_ga(devid, index, irte); + modify_irte_ga(devid, index, irte, NULL); } static void irte_set_affinity(void *entry, u16 devid, u16 index, @@ -4065,7 +4068,7 @@ static void irte_ga_set_affinity(void *entry, u16 devid, u16 index, irte->hi.fields.vector = vector; irte->lo.fields_remap.destination = dest_apicid; irte->lo.fields_remap.guest_mode = 0; - modify_irte_ga(devid, index, irte); + modify_irte_ga(devid, index, irte, NULL); } #define IRTE_ALLOCATED (~1U) @@ -4400,6 +4403,61 @@ static struct irq_domain_ops amd_ir_domain_ops = { .deactivate = irq_remapping_deactivate, }; +static int amd_ir_set_vcpu_affinity(struct irq_data *data, void *vcpu_info) +{ + struct amd_iommu *iommu; + struct amd_iommu_pi_data *pi_data = vcpu_info; + struct vcpu_data *vcpu_pi_info = pi_data->vcpu_data; + struct amd_ir_data *ir_data = data->chip_data; + struct irte_ga *irte = (struct irte_ga *) ir_data->entry; + struct irq_2_irte *irte_info = &ir_data->irq_2_irte; + + pi_data->ir_data = ir_data; + + /* Note: + * SVM tries to set up for VAPIC mode, but we are in + * legacy mode. So, we force legacy mode instead. + */ + if (!AMD_IOMMU_GUEST_IR_VAPIC(amd_iommu_guest_ir)) { + pr_debug("AMD-Vi: %s: Fall back to using intr legacy remap\n", + __func__); + pi_data->is_guest_mode = false; + } + + iommu = amd_iommu_rlookup_table[irte_info->devid]; + if (iommu == NULL) + return -EINVAL; + + if (pi_data->is_guest_mode) { + /* Setting */ + irte->hi.fields.vector = vcpu_pi_info->vector; + irte->lo.fields_vapic.guest_mode = 1; + irte->lo.fields_vapic.ga_tag = pi_data->ga_tag; + + ir_data->cached_ga_tag = pi_data->ga_tag; + } else { + /* Un-Setting */ + struct irq_cfg *cfg = irqd_cfg(data); + + irte->hi.val = 0; + irte->lo.val = 0; + irte->hi.fields.vector = cfg->vector; + irte->lo.fields_remap.guest_mode = 0; + irte->lo.fields_remap.destination = cfg->dest_apicid; + irte->lo.fields_remap.int_type = apic->irq_delivery_mode; + irte->lo.fields_remap.dm = apic->irq_dest_mode; + + /* + * This communicates the ga_tag back to the caller + * so that it can do all the necessary clean up. + */ + pi_data->ga_tag = ir_data->cached_ga_tag; + ir_data->cached_ga_tag = 0; + } + + return modify_irte_ga(irte_info->devid, irte_info->index, irte, ir_data); +} + static int amd_ir_set_affinity(struct irq_data *data, const struct cpumask *mask, bool force) { @@ -4444,6 +4502,7 @@ static void ir_compose_msi_msg(struct irq_data *irq_data, struct msi_msg *msg) static struct irq_chip amd_ir_chip = { .irq_ack = ir_ack_apic_edge, .irq_set_affinity = amd_ir_set_affinity, + .irq_set_vcpu_affinity = amd_ir_set_vcpu_affinity, .irq_compose_msi_msg = ir_compose_msi_msg, }; diff --git a/drivers/iommu/amd_iommu_types.h b/drivers/iommu/amd_iommu_types.h index 623ee9e..35dfe02 100644 --- a/drivers/iommu/amd_iommu_types.h +++ b/drivers/iommu/amd_iommu_types.h @@ -819,6 +819,7 @@ struct amd_irte_ops { }; struct amd_ir_data { + u32 cached_ga_tag; struct irq_2_irte irq_2_irte; void *entry; /* Pointer to union irte or struct irte_ga */ union {