From patchwork Mon Jul 11 10:11:36 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Suthikulpanit, Suravee" X-Patchwork-Id: 71719 Delivered-To: patch@linaro.org Received: by 10.140.29.52 with SMTP id a49csp527978qga; Mon, 11 Jul 2016 03:13:17 -0700 (PDT) X-Received: by 10.66.79.2 with SMTP id f2mr33477511pax.14.1468231997837; Mon, 11 Jul 2016 03:13:17 -0700 (PDT) Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id z128si3188003pfb.226.2016.07.11.03.13.17; Mon, 11 Jul 2016 03:13:17 -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 S1758253AbcGKKM4 (ORCPT + 30 others); Mon, 11 Jul 2016 06:12:56 -0400 Received: from mail-dm3nam03on0051.outbound.protection.outlook.com ([104.47.41.51]:22752 "EHLO NAM03-DM3-obe.outbound.protection.outlook.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1758221AbcGKKMw (ORCPT ); Mon, 11 Jul 2016 06:12:52 -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=kSKQeRK9GIiV21IKZUbj2io8fiW7PwU4p/0Yv+nTWSw=; b=vO0oza7QmawMjxOGGwpSR5FEnSjVr1M9qhsVdu7PHASx9XatjXOCzafiRZWRdf+T4kXYNazw+pJWK5/mbKSwK+VXcVY8+IzXaQUYxSFruB3RkH6qMG8NrOSq+pdMAgm0E7b0LDIN3WAPCo5MpKmB6FWerr7JriAy4SlSRhjPpHE= Authentication-Results: spf=none (sender IP is ) smtp.mailfrom=Suravee.Suthikulpanit@amd.com; Received: from localhost.localdomain (124.121.8.20) by CY1PR12MB0444.namprd12.prod.outlook.com (10.163.91.22) with Microsoft SMTP Server (TLS) id 15.1.534.14; Mon, 11 Jul 2016 10:12:46 +0000 From: Suravee Suthikulpanit To: , , , CC: , , , Suravee Suthikulpanit Subject: [PART2 PATCH v3 08/11] iommu/amd: Implements irq_set_vcpu_affinity() hook to setup vapic mode for pass-through devices Date: Mon, 11 Jul 2016 05:11:36 -0500 Message-ID: <1468231899-6987-9-git-send-email-suravee.suthikulpanit@amd.com> X-Mailer: git-send-email 1.9.1 In-Reply-To: <1468231899-6987-1-git-send-email-suravee.suthikulpanit@amd.com> References: <1468231899-6987-1-git-send-email-suravee.suthikulpanit@amd.com> MIME-Version: 1.0 X-Originating-IP: [124.121.8.20] X-ClientProxiedBy: SG2PR03CA0026.apcprd03.prod.outlook.com (10.160.233.36) To CY1PR12MB0444.namprd12.prod.outlook.com (10.163.91.22) X-MS-Office365-Filtering-Correlation-Id: 54829ee9-e109-4226-538b-08d3a973e91c X-Microsoft-Exchange-Diagnostics: 1; CY1PR12MB0444; 2:p8jXeJybiC/9dbxz0sMHDtksDom7bvGtzXTfqE6u6rjN+yraI+dKVVPcSG8aWHVSS7tGxgEGVeFLOLPPoKIx3miRgXfz2D9+Pc9JyC5A0/BhH2GDP814aFe5Bf9ZyHn/ni9xDtmhBxzGNG00w9b83pJ1BDVVJ1lzESufZZAyVkEmPycw9Agt0jst39DQWhh7; 3:kj3WspLr3tQS/tENKGKfMRLSTKjTL2HtysGY9i1J2ZmYAxk7Ban+xLeiZvptycD0b6i2xGEU+lr74guEgh+TZWzIv0Prf7hwz7r7fiElzWSGX3xcfarb0QU5VVTinZin; 25:VR3pTKt9kWJCujffsoG0OIGrZsTDd+JxNzSCSNhVciWURE7e059OJ3DN6qCGpAUZ3pgnDE1z1OsPlgticJuI1KSvpeFpRXZi+1XBUOgMIldIT6d9GoYnVZ1vVKw+3iHe2CX/bgA7Q25+OQUmVy039WWJ2OJVgz4eDeHbSe+FkPH01F31U+7Ei66Th5oFh02P6D4D143CLj2XhEhukswojnqyn6MPE5vWrAcCaHH1zyObLLgX9d3f3S2dJS1VAx869PSOfeF3Qa89NH+RyuRM22kzXFdolnlNwlsHtmPe9x1KkclD5cqVB6xdvoWPtpebI4NjxlIsJZmpq6otZ4AS9vLDcYW0ncVM14TeFMTQWlmyJEryDfUmgKSoSNqPAl6KGbqH9m4t03VnrQmM01+g6nTyP3U4lbqXsr7hmzMvKZM=; 31:5zNglITnLwUVwSaUd2yLbM4kFXIkUU3oDJ1JWS3fqUWoJTqE+JZzW/P5gB607duTOHnSOGIJ3DZmoSESd8cc9wyXssaBOBZvX/c5Mgl+5jI5XuQ+6eueo6CLklSBAkY6DWybkxzPGFCc6f51jsuqU24IuN4hVjVxEOmE8KxQWgiDK4QVxbhqeNpnvXmvGoTEoqFUbjl0DV8rFULl8XaPGg== X-Microsoft-Antispam: UriScan:;BCL:0;PCL:0;RULEID:;SRVR:CY1PR12MB0444; X-Microsoft-Exchange-Diagnostics: 1; CY1PR12MB0444; 20:TcRH7aNP+HyREGQmyhInPg+R5WjItFw3u/jw7IGy9Fo5raN68+XagLHS83r6ZNzyvL0WDxfHLS9Hp4ZU6iHVG74taTR+lUqr6cjsgM4Pp8l/PfiJ8pMd+Znov6gHgh+rFCnhLmQmoAqPcne6YO+DAgSvED+1ibOPHbnqQBwW3fS6So1AHt/1hvszypVYgesYi+FEJ78kkwq3ykY52DFBRXJmmEnE5tUlM7DriF6wZ+g2oXMuSQ+T6V0ktqdkl6m5AT5jh42GskNq1+92ajs92lw+4PU0bCLGJPP6XH7dVELn49AKwWAvv8OLal201j5yerZE0nMIFMAVIuDDedqBq6OQwsSaMyg8ci43Y3wYU6mD+wgxs6Pw7jRkSeGxNQGILtMbYGPhRtjVirBm8MEQ7VID83hvhP49YtutDOMCxJWWyEkRibqmT3Y0TIr8OMPJ7gsVDNCJvHZjOpKMSY70+U/QHdeXn2c1OoefP13ZknOcfwvT9pKTasQz7qnVuVGI; 4:2PWb7eZtE/AgcLwAEfwiUzK5/1Cz7Z6uE96tcHAOSE+rod4zJaqqf0cEZU9ufC4zxMWK363IZM3YxsiopH0H/Ckc8TEOB6HtYyt5JahWD29lz3YVfua8IjKGxalEslGwa0nwW2NofD/kpUvOAn8DoJy+nYt6LAD1IirLf90zb0NJ8AmcQ0G4vUWVyh5c4pJbOyIlmzyEKLtJD1jDLai51BX9wr7lO2SW2NEDLCddQ416nXXbjtXvXHB6FL2oSYbw9d9DRPEEbDtosId8DnYkRXCzeFwO/6k/9fD0TrxkWoGbQuomz0oglWxrcFxuYd2js9vcxvWktkqFi4vtHG4Sys5aSwBxVJHfbPwlS5J4TVn7ZJ+iQ7MrkOnr9Wd0mjdMREJym91s569IH+PihRQ2n93drEUGrtWWZIkYWMTvgH4= 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:CY1PR12MB0444; BCL:0; PCL:0; RULEID:; SRVR:CY1PR12MB0444; X-Forefront-PRVS: 00003DBFE7 X-Forefront-Antispam-Report: SFV:NSPM; SFS:(10009020)(4630300001)(6009001)(6069001)(7916002)(189002)(199003)(3846002)(6116002)(2201001)(101416001)(81166006)(86362001)(5003940100001)(47776003)(586003)(189998001)(106356001)(66066001)(7736002)(77096005)(5001770100001)(36756003)(97736004)(50466002)(33646002)(50986999)(19580405001)(81156014)(305945005)(68736007)(4326007)(50226002)(19580395003)(48376002)(8676002)(105586002)(76176999)(7846002)(92566002)(42186005)(2906002)(2950100001)(229853001); DIR:OUT; SFP:1101; SCL:1; SRVR:CY1PR12MB0444; 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; CY1PR12MB0444; 23:ild/g5I8M4HTshIWBDS7InDJfD2Q1mrRbMeV5FxCw?= =?us-ascii?Q?j9LRGktZ9KX27AEzs1VBQVveuYAuvcqVvwuSgIgBv/pwst7RatJhGJwuJ1vT?= =?us-ascii?Q?UActnET8hnsuIqWJSib9aTbUp+9uXbdDlxoJ7bjkszoGqG8xqCGS3zoJOuaD?= =?us-ascii?Q?VLpLzslOR4ZnJbFez/QUuSUIK3xRNNooec1mL7BQCAN852o+5mEKTPVsoxbE?= =?us-ascii?Q?0TXPs+tzJGYX+H3wlvYbVFcrlv+O5/8ZWqrQjKQd9wCBYYle3HpOzMt6rsPi?= =?us-ascii?Q?QjQ3JsW2nSeyv47gdClhJU4wxxwiFpFMvEm9N9+TCXHjzwrkeVhqC2BAu3EZ?= =?us-ascii?Q?pKF7PRbwRKGH4hWXxkniH4sHqg1CBUU1bEn5cSiOyzViGJb1zQfRYl83sf78?= =?us-ascii?Q?Jmu+BKSHVqymiOvPjiCWzr4uH7fEHNwg3EAq+Cv7nG2LLpMU3PkbLc8LpVUa?= =?us-ascii?Q?3rG/yudMbEhOYIeYphhLnXB7eGUvi3otVVyBRayfZNis9VyumDZC+Z7Eh4YP?= =?us-ascii?Q?Mhbz9SDvjgMey0hWdeUl+PaDb7ucSoU0xzq0u9EhUu7O7Rnj5jbVA/tNqDWA?= =?us-ascii?Q?jLyAftQKrprWezM3SoFTQ+866OAp4DULd52a8dLLJ8V6L52KGdHXn2XZmFhe?= =?us-ascii?Q?UKG8X9qocs9Cwemjqb+qgmu4J9MmldpPVminoiGnjxu4Ugt43/BjEz+MR3Po?= =?us-ascii?Q?INJLMJY2rAvq8REMBRagy0r/kLa7Yho5rn9pOUmZOLw3R8WvD5HKImlY+FI9?= =?us-ascii?Q?83okTRqAupCaHlh8Cp9R+dwb2M6PkI9x04pD/7dKXEmsJvCLRqZPxE0KCZSg?= =?us-ascii?Q?Ocz0ehCYc54MyiCcH2s7MmAVo50C+XgjTdJmjI3NRN/L++tHcaq6ifhc63Ab?= =?us-ascii?Q?mJx+9IVBbIuD7rJnLYvBXPb5E/JUbgLVdMDd1+5VK0PH7s8+xMgXvPRZbHVT?= =?us-ascii?Q?AoWQM1GBQWoTtQHKEP1CwDw88Kw9/tkhiZwyUwWA7sGfDuxrV8V1DQLpcDTF?= =?us-ascii?Q?R5bTJ9RJY09H4gsa4Ych9NQ17ySITEXfkWK3cLbItnrwNcKUf1WjsI0iYA9o?= =?us-ascii?Q?W/vc9FhhO4kAbQFrN8yprMMSMyLfHAMjlM5omtvIHAZoIGSqw=3D=3D?= X-Microsoft-Exchange-Diagnostics: 1; CY1PR12MB0444; 6:LEZ3Ps0t+0himvZX4q5FC+/OlzEJ3aRIDeRLBSmG/IEGPUZVMalG9zvxV1vOm7A9YiKYuoFQ/U3YtmEb2N6Hser29Vgn85rjJQq1xQAZM0cMOhRoE2dstGLXchGhJfJ65SrQuO9MyU1kGGOFcn1P4z1+13Dot/KFU3PkrTrVkzJ3P9X7fd3EvDhCOeld+vcIlaCzrlzxbUbEOdiZE3sc6pUH811899/McPpwPsLj/bCvZH4/EuFrrvZTPuNBw/o4qYapLTvICcAntZoQuBbwbt3ombMbDiG68ZeGS22nKXCYIjOmBqD1wLduN1DqX9JbwGCTFbYrlzFYkdTojzKmnQ==; 5:Nu4ytsKPgi/4j8x4Vl3IeBWVJA64XDUQSjhN2Mm8AWmZ4ARJAfB/Q+xZ/KuuRvnI7Jn2JN6rDWG1/d33tfdzLdYAyE6Ky2fLXwxswKEsdEt3mHMTepiGnIrPpNlzLd7liAJq/6nmM++5DQqu5wONrA==; 24:JUAc4Dw3Ppxd5xzfEWzO4P2c1OhHJQPukEJljhiXeiuFTSpFqfVEA4EVzWxCMDda/DXWZuBMJv8HaQzjzSvGm74r6c61x0A2yyZZX87AzO8=; 7:0Zow2/rKhn/UOOjp+lpWerxh8WNXIlehrkbA9ELq0dcRZOvXrvvWHZsyNRRHIhZTBl+qX3fqRYYX0NmK7MtvXjphDdo5rcZgS+Bi3oge+KrYXy00j7rQoraMfgq47S2kTfpd4pVlaj7Mf9cTcDl/iRBE43ZeciLPkpAzHImu0ML0plAvgRDjBWPfyzxNZkJHkBVyBQHMt4l9yQtUVqOKS/r7FpektrXe8xL5HwPNF/DtQb2Y98PVhmjEc+hJ3oS6 SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-Microsoft-Exchange-Diagnostics: 1; CY1PR12MB0444; 20:4I9/HeHU8pzKQCSxX5J09bvqYy4w7/Gn33pyNEI1x2eC19HBa3lQniaORolMup4dvZy+9LNfgcSyrryO18QJ7W4lUAIvUODDjDMhDDL5XPxDsbJcqeofs9A7HHnhlEooHY8Q7fiAf2c7SXA46va+o8hUdl5bT+6LrguETuG2rk40mWmGcEYg+wXSr2RhUZwpstQnB5sYej1HScdWGtH9dc8e2KylM9SP+uxiaya2pCfhM6fuuadh3q4LgB33BcAa X-OriginatorOrg: amd.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 11 Jul 2016 10:12:46.0709 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-Transport-CrossTenantHeadersStamped: CY1PR12MB0444 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 | 68 ++++++++++++++++++++++++++++++++++++++++++++--- include/linux/amd-iommu.h | 6 +++++ 2 files changed, 70 insertions(+), 4 deletions(-) -- 1.9.1 diff --git a/drivers/iommu/amd_iommu.c b/drivers/iommu/amd_iommu.c index 95f106a..4abced5 100644 --- a/drivers/iommu/amd_iommu.c +++ b/drivers/iommu/amd_iommu.c @@ -3927,7 +3927,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; @@ -3953,6 +3954,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); @@ -4051,7 +4054,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) @@ -4067,7 +4070,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, @@ -4088,7 +4091,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) @@ -4423,6 +4426,62 @@ 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) +{ + unsigned long flags; + 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; + + /* 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__); + vcpu_pi_info = NULL; + } + + iommu = amd_iommu_rlookup_table[irte_info->devid]; + if (iommu == NULL) + return -EINVAL; + + spin_lock_irqsave(&iommu->ga_hash_lock, flags); + + if (vcpu_pi_info) { + /* Setting */ + irte->hi.fields.vector = vcpu_pi_info->vector; + irte->lo.fields_vapic.guest_mode = 1; + irte->lo.fields_vapic.ga_tag = + AMD_IOMMU_GATAG(pi_data->avic_tag, pi_data->vcpu_id); + + if (!hash_hashed(&ir_data->hnode)) + hash_add(iommu->ga_hash, &ir_data->hnode, + (u16)(irte->lo.fields_vapic.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; + + hash_del(&ir_data->hnode); + } + + spin_unlock_irqrestore(&iommu->ga_hash_lock, flags); + + 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) { @@ -4467,6 +4526,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/include/linux/amd-iommu.h b/include/linux/amd-iommu.h index 9897da8..46a893e 100644 --- a/include/linux/amd-iommu.h +++ b/include/linux/amd-iommu.h @@ -22,6 +22,12 @@ #include +struct amd_iommu_pi_data { + u32 vcpu_id; + u32 avic_tag; + struct vcpu_data *vcpu_data; +}; + #ifdef CONFIG_AMD_IOMMU struct task_struct;