From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1754902AbcHSBUb (ORCPT ); Thu, 18 Aug 2016 21:20:31 -0400 Received: from mail-bl2nam02on0082.outbound.protection.outlook.com ([104.47.38.82]:22589 "EHLO NAM02-BL2-obe.outbound.protection.outlook.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1754185AbcHSBTx (ORCPT ); Thu, 18 Aug 2016 21:19:53 -0400 Authentication-Results: spf=none (sender IP is ) smtp.mailfrom=Suravee.Suthikulpanit@amd.com; From: Suravee Suthikulpanit To: , , , CC: , , , Suravee Suthikulpanit Subject: [PART2 PATCH v6 08/12] iommu/amd: Implements irq_set_vcpu_affinity() hook to setup vapic mode for pass-through devices Date: Thu, 18 Aug 2016 14:42:40 -0500 Message-ID: <1471549364-6672-9-git-send-email-Suravee.Suthikulpanit@amd.com> X-Mailer: git-send-email 1.9.1 In-Reply-To: <1471549364-6672-1-git-send-email-Suravee.Suthikulpanit@amd.com> References: <1471549364-6672-1-git-send-email-Suravee.Suthikulpanit@amd.com> MIME-Version: 1.0 Content-Type: text/plain X-Originating-IP: [114.109.128.54] X-ClientProxiedBy: KL1PR0201CA0016.apcprd02.prod.outlook.com (10.167.53.154) To MWHPR12MB1453.namprd12.prod.outlook.com (10.172.55.22) X-MS-Office365-Filtering-Correlation-Id: 3cc41bb2-4825-46a9-6b51-08d3c79ffb36 X-Microsoft-Exchange-Diagnostics: 1;MWHPR12MB1453;2:NliPPqa8hi57c+qNL9H6KOZxQBW3r9JPvyvQzoY8JLXa1any4CCweuxdVaFXL3ZOTNlBkllWFXJIs8fx8PX7Sv9LKGsTy0GdNEX8xk20HbVJtwVaKM98AxVZrj+5g/JqbP9htAbY2POGFxM+h8PyU/zgcZExU1SEUTPWvp95+1fOOTRmCdrdwbPo2K9cd4ol;3:badngNWcAXEy7uoaw34O70SjxNKSA1wFVcNwkhOLzdSibi9JZKkqD0IXtmsclP8sMT8WLQlUHadiojG+hgjvfekVxQ5X6zlwHGoNFiK6Y80kDsqkt1fL0s0KiyGC+i3m X-Microsoft-Antispam: UriScan:;BCL:0;PCL:0;RULEID:;SRVR:MWHPR12MB1453; X-Microsoft-Exchange-Diagnostics: 1;MWHPR12MB1453;25:/j+ODeN1NA8VKvp8wP6RgPyi9i/9C848f0OIDjXL7Pgz3P9Lkndl0yCE6RO83GgHIz3+J8NqOIQc5an4N30PmpsaVz6B66R2+rp3LW2ITYDzABCQv/AQOlW0SHqGh+/hfUZrt4gJsVL+Q4w7tVaPbtiwofama648nwPmJBIEbiEApkzWxsJuYnmFtPtBbZCJNEVp3roRr5FEeNXYK387kFOWxWW1W744WDQD0iRyg5vmxJu7T2L17dX3HhjkGOv29EM3T2ALt/TgOe5Y1UuV1+0sZ3cUUiPbOjyjD/Ypf5/ICROG6KvtmFh80WrPidCHkz2reE+9NE0a3967XV/Lfyckq11uzKta/5h53cYuJnZl0NVlaYe7Jl+KmEXnv/w0IvhmL17AhlYb2OM9Y+AXrvT3dsvgjHDnDayL4Ffi6oVunAZwRfyAyVKa9s0CtFCGwMDqXFTZRxnF4GXKCfEXlkcAFoWg+FrUT2J1TzlZAi+2Ww/AHOa4G7i8clrdOpxM9jZJua8kgbpvhhlQAwoNOfOKPIE6Di+3F/5euiELhcIYrLpADwOtT2iPMvxOcaQbVZHAVRg5xWzO6K5GptdfsEOjeHbMX7QgFSn1J1OPxqKFF2py/BoVvzDT2dG79kipGqUAzJ1rX44ZY4hgGxAeLC02jg6eY0p7zhpEdzI6isVsJ1QlAPbg9oNd1lAUnlFXWVebjcINnEIi8WyGYAa7q3ezcFQbW71iaQJwqtApPfc= X-Microsoft-Exchange-Diagnostics: 1;MWHPR12MB1453;31:QwtJZYJgo4gUHYGGx8puLgN8xK+SFjF/8PWN9MUbnLt/rWe+ZT+Uk5xlXu4uP+xjotEVW4MMUtDOvf6SkKvizsKESJmQa/SiEpYYqr+l/aoyvlubaST1L0CwdZEZe+hUXP3we3dvGoou7PWXUw/jHQdDo7kckQ7uCwfEQLv4Y+BnpSvWm7Xk23oH6zteT0KiFPuViolik+eZlUidAcmqGU0Y+YW0A6K3awGjr+XOk60=;20:WNYE/2VYOzvCCtIlpCQ8eBoD4s4KejnCUGHB26eXvJfO7YlInLrC9r1yG4VvWgOaG5Z/g+Mrpn3XbX/Y6b2leYJ8Y70ofoHX/l3Fjtv7yBd0CYKgiQJU0SPP3fctJrEmduePsQ+7DdRi5a1bAt+uVuK8cHpna4Aq8lvAr8tfPlyD9ZNKwkasos/pQ9CDeNq/kFKCUsHaSsAdFqiUw06azNoeMnTnoIzuOBv2lnjwOa3i0kH19SztxFWyCW70M+jGdYyTbRuxd2Wk249k5Uy2hzdc32puFi4N5YlGfSICQ5kj9UfrIVhLInRf53hXkByAO3WgIPCdaHcpAcCA5iOBhkV4CsZ3kRRCUPKsWn53Btq+XE6HLXbKHOoc0Z5cJ94Q4t+afoeZlNmoLCOyDjPbjonYiHc8oSrjCOfsEDXnmUtOZ20FCJeFqWOX3svxnaX5HknYja+I1Gpn8bXdCKB9bkr+LDWaBH9QP5gxO3P5va7/zhi3DJeL/O1/My8+GD2F X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:(767451399110); X-Exchange-Antispam-Report-CFA-Test: BCL:0;PCL:0;RULEID:(6040176)(601004)(2401047)(8121501046)(5005006)(10201501046)(3002001)(6055026);SRVR:MWHPR12MB1453;BCL:0;PCL:0;RULEID:;SRVR:MWHPR12MB1453; X-Microsoft-Exchange-Diagnostics: 1;MWHPR12MB1453;4:KUabwG/jLbL7ufqU+eqlsb6M2z1wSpqmWdeE6Ogmxh7Yx2rLvGJSm+KUAE92c3zFQMKZjfITXaHsTgON96hWt1ae6QG9dWc56/BNZwFTcdHtGdZO+tNeAR2Zt28OMAZXMaVnak3rjTquD6OpmVHQVDNlkf4+X1ximX06Jl6567wDznlfCtL9SQIBChtrvkhBf6T7Syxo6Rg19UCls1x1RXbyc3YgNT14Nei+v9qFwQKmz00vaqHiCVKmvyAp1rmjd6BL82AwApJraa+yLtMawUj/LnKoQWZ1M/cyjpNhgdPfGDH8670WZnsRmYVeKtgkjzG7G8wVnCcW4CkLfRmKEYUnJAQV5lEqQlPEBcUiK9wkQTwtbD2xvsM36++rL/1Yb21k564/eKElDa5JNZksBaVxGWdJmWt0XNhv1yUXuHDZQPqmOaSa0XNMRRQuws2M X-Forefront-PRVS: 0038DE95A2 X-Forefront-Antispam-Report: SFV:NSPM;SFS:(10009020)(4630300001)(6069001)(6009001)(7916002)(189002)(199003)(86362001)(42186005)(50226002)(19580395003)(586003)(68736007)(92566002)(3846002)(6116002)(189998001)(105586002)(8676002)(81156014)(81166006)(5003940100001)(47776003)(5001770100001)(2950100001)(97736004)(48376002)(77096005)(50986999)(50466002)(106356001)(36756003)(2201001)(305945005)(19580405001)(76176999)(7846002)(7736002)(4326007)(2906002)(66066001)(229853001)(101416001);DIR:OUT;SFP:1101;SCL:1;SRVR:MWHPR12MB1453;H:localhost.localdomain;FPR:;SPF:None;PTR:InfoNoRecords;MX:1;A:1;LANG:en; X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1;MWHPR12MB1453;23:huffkfPkqh3tgQq2QUCdJfdc9LJSKhg6znZNK43t8?= =?us-ascii?Q?3AsI5BM3fcwEB5g1AMyVs6O0On5wXZFsb6Hzfb9jiXPMfs5YkFjtKc5M6ROY?= =?us-ascii?Q?xjEnkl8KK0Acw3J51nwlHKN3+op9BzqwuSPBDHOQp7SQeIy/ZS0O34s4cSsk?= =?us-ascii?Q?HS6ecOd+u0jIAgxIupnnHlSyQg2wwvGQyDCkafUQamRBwdFMzwwzUGQCVs0u?= =?us-ascii?Q?mVmf0IIqcDCeisOC83jRsR+UykQXk/Gj0ndG2ADojJzdjxZh4mSBg6jR3g7g?= =?us-ascii?Q?2Ah6le8RJqeH26LgabirOwSzrnx0JpX06GhcKVPek/CZ8Qk3dUcfnUCiHY/8?= =?us-ascii?Q?jomPCgQ+P+szo3I5KxaXx/iFeMhOX8CmCakedGaA81olUgkUckKV2GYGdEjZ?= =?us-ascii?Q?f0u1Rv14rN+5RUglXfH2X5XkHCsZA+/MrigL+Uj535UCACWT4K689ez0gCFo?= =?us-ascii?Q?5pYYGxgzH4/9EqiVfpD0xyi/5Y+XXXF82zTr0VQfx2ur98p+ue4Dc3Cgy53n?= =?us-ascii?Q?0JImbSz2Ij+0/rroywBEndWR1J0kRgykFen0SwXlOkYUh2icyyIEMAoGWH8D?= =?us-ascii?Q?nS2kGGX94bZmsGIu386aOMzZv6YdI4ZX/x31yPN8Ls3fxo/NH5SLh8emwXHS?= =?us-ascii?Q?g7ixp2ZHfHFV7OX7ngHKJRmSEXJUmz9ZcVkjcX4fQDPveIGTHjwglwPcbR7z?= =?us-ascii?Q?cb0reDRBihe6dqZ89mHkw4ZIg+OoAt350cIlk43Bqur0puixQBO6Z173ZZ7v?= =?us-ascii?Q?yC+NM3hjVwUl/dw/p8UxmJ6f2rfaaGCwrEXq3DHf0GGl90DqSq4t/+n3mPiA?= =?us-ascii?Q?W/FjIytqvaavE2QBI4Xw9KHnQZUoAx0bFzj7vIKeAP0/nMWHWs3lR55lIcnK?= =?us-ascii?Q?6vdVbdrqWyKiT6SCGstiDcKyCcrjNZQ08DrU94fxKBmkN3TvOiE4YKWLE3ua?= =?us-ascii?Q?Fm4vaEPnTYnUfb3bDryS4Z3G1v3VgKG80aDjjeL6aWZJQ7h4404L5SzokhXH?= =?us-ascii?Q?p/09fm4lds1r1hwLoy+Y+DIB+GPRS5VKruMjERvWb7jnkxBeofJ4YEzPvxBx?= =?us-ascii?Q?YM3LZLiRh5ttPdCBVRuKNMip7Qn?= X-Microsoft-Exchange-Diagnostics: 1;MWHPR12MB1453;6:J36VgWAfEyNeU9hQERdnMriWpyIOojMjTSq0SsA5Ztqcz0Pc/sDucodZpOAR5g8KSFvTZarx6kUnBNshofp4xKCV6UIwgfYlCubRsamlENyq24Gkq2wHDX4018C1jepvA6EAMhXZhVmYi+ZpvAbdsrZrckn+nsyU5XvtsIULYAArfoYCWjhyD/RmsziS15fw5pYOXsMZH/RvznG2PvO9WG08P0oN6MJHJG1WmygKh7YdmE4LENHCl1KwiIzsbxhsbKoItN/VKg0ZkEHMM6GUJuKuL3oEQ/9OTevEFREm6Dmm6Y/8ik00wxjxvdyDzMbQUlJ/gTTe/Trvd/owPePSsg==;5:VliFHsefSdNxvRlY+lSLGpF0kbfn+/uyKPJuCLf4N5K6uzzcU5Md6COQRpdc29CWVFEXpFjAEgqi4lTInyNm5SHKtHlf1oc1zHog7TYqkDg/6ZLEB1gknR/xUD/Lv+GLijBVnvuSwMuQVMygWXS+vQ==;24:Al9bskQnWlJpbOYbojjebUjDNgy8YEZlCh3sGrZxlz6hFCyKHoF8m/O+m4tWXKP67HQK/ztr2uMd+30cRIUk9rIzyXkDaZGw7uUMsZp709I=;7:IKbHY7vBBuRlKLWK48KtFpzwHns8s0/mbVAluWlSAYLUnflTXJlfQ5wzmgfqyJmcb74DDwCS1+qGkIgsO4Ds01/FOdMaJvbFBalB5RSZI99XiDQScuxduFTWIBXNxtsQeu4i5p7C3ZtHpIQVIguLmnUv2HZTtqQo8dftTiVA+SDe5eSWQiovqNpFwzANGP5m4LR5O+hPI+n/9dJYZJULN2aoogxHkyGt5GtLgCKHJxveZrq7z5kYP5Ce6TtHH5pm SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-Microsoft-Exchange-Diagnostics: 1;MWHPR12MB1453;20:six1wzkEsmAt7Iu/tYvHk0UTzOUsCK9fhR9khqkwSpztMmHmazoAWjdzqUXx/GsQHJZ6i/+FI7o/QWbehb+iZGqA0dX0x3oeQBcPhYAvyQTW0DazzSuocZ3nmGja+iZQ99TnDUrUAlOD7/48VPNMi5YafUzf1nNsTYajQ5mf4h2BbpxvqyizUurN9vFZnbC/MdMJgHydqPh/tQKTW9oVagbFB2OrVlUWYJ/kiYZrwE4qAykVG8LDSlq3sRUw7Clm X-OriginatorOrg: amd.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 18 Aug 2016 19:43:49.2966 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-Transport-CrossTenantHeadersStamped: MWHPR12MB1453 Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org 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 ++++++++++++++++++++++++++++++++++++++++++++--- include/linux/amd-iommu.h | 13 +++++++++ 2 files changed, 76 insertions(+), 4 deletions(-) diff --git a/drivers/iommu/amd_iommu.c b/drivers/iommu/amd_iommu.c index 8bb85ca..65cdfcd 100644 --- a/drivers/iommu/amd_iommu.c +++ b/drivers/iommu/amd_iommu.c @@ -3900,7 +3900,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; @@ -3926,6 +3927,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); @@ -4024,7 +4027,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) @@ -4040,7 +4043,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, @@ -4061,7 +4064,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) @@ -4396,6 +4399,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) { @@ -4440,6 +4498,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 dfd3bc4..7b2e802 100644 --- a/include/linux/amd-iommu.h +++ b/include/linux/amd-iommu.h @@ -29,12 +29,25 @@ struct irq_2_irte { }; struct amd_ir_data { + u32 cached_ga_tag; struct irq_2_irte irq_2_irte; struct msi_msg msi_entry; void *entry; /* Pointer to union irte or struct irte_ga */ void *ref; /* Pointer to the actual irte */ }; +/* + * This is mainly used to communicate information back-and-forth + * between SVM and IOMMU for setting up and tearing down posted + * interrupt + */ +struct amd_iommu_pi_data { + u32 ga_tag; + bool is_guest_mode; + struct vcpu_data *vcpu_data; + struct amd_ir_data *ir_data; +}; + #ifdef CONFIG_AMD_IOMMU struct task_struct; -- 1.9.1