From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1423331AbcFMWZF (ORCPT ); Mon, 13 Jun 2016 18:25:05 -0400 Received: from mail-bn1on0062.outbound.protection.outlook.com ([157.56.110.62]:8544 "EHLO na01-bn1-obe.outbound.protection.outlook.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1161289AbcFMWWN (ORCPT ); Mon, 13 Jun 2016 18:22:13 -0400 Authentication-Results: spf=none (sender IP is ) smtp.mailfrom=Suravee.Suthikulpanit@amd.com; From: Suravee Suthikulpanit To: , , , CC: , , , Suravee Suthikulpanit Subject: [PART2 RFC v2 06/10] iommu/amd: Implements irq_set_vcpu_affinity() hook to setup vapic mode for pass-through devices Date: Mon, 13 Jun 2016 17:06:46 -0500 Message-ID: <1465855611-10092-7-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 Content-Type: text/plain 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: 247b7e48-b296-4c6b-a091-08d393d70e3c X-Microsoft-Exchange-Diagnostics: 1;BLUPR12MB0434;2:f3OPwi58VwryjFeou0YBcYrPhpDnQ1j7Nz+EjpTjqxku6EGC1/bCHI8fjGMLt2Zkt4bFQ0jdecLW+ZqJNChwnElIK1h+ATpVcPlPi8fb4Rk9zGyowfdVnkAcVSCpfGN++kN6bTF1bLMZcsX/+yEHCKS/G5pvJKEmVy2uQlsgTjZtp2eCe6PkmZQ7cOikpGr6;3:szBnDnEjONMkJiDIykH8tLcIXMQSmhwbmKMb29w1CQMKd9QoVTorbowWhlFW3JPkXSaU9hIfoCXXPbF86tlaBi0Xy5ERdNroYzFS9YI1wqIwUYHRx0Jvy+u+X8ro0oSi;25:r2/3orG2NmBLgSCwjV29PmfqwNAmqMwXp+C7WKrkKKr2TuLEDMZXmaGTTpQf4EBOpzuGO9CSzSOaHLKCl5vuZcA+9cxG5zzd4HbdduJIcf9OJ8msZvdu/L06RIYGjJZl2J7+f/W1KcoobXC5NgtkrQ4ytFE5hJoz8APmVQGdOl481wnYrkgcvb6/4GDlD8xC9il/5zFSNprXG3WaopSs7ELJp7xGHEKAwO+ib3+8VXLMgTMBSbqCaQI3qAA+3bm6PxECptcpWoyZW/khqX9IsVy7iG7bdZI5dN0Mehw4ff0cYkCjlDMJYj+107YJX8KGPgCscIduZryZjhZ3lSLgzMF2B5p5+170x6gU2D9ODqAf2xwmcmxxOEpXj7ASHkmq+e2XCSxUnFxqB5rCggQgkZPm0b7pJMxZQcf897iiQcE= X-Microsoft-Antispam: UriScan:;BCL:0;PCL:0;RULEID:;SRVR:BLUPR12MB0434; X-Microsoft-Exchange-Diagnostics: 1;BLUPR12MB0434;20:sKAuKGFhzZRbPkfgXidWS0a05iInMX7fQn4cFNg8P3+DDyOBfQNogqw0Za9H6CWV5KvcT0qpH9FwKhtYdTmWporOjHgmM0BU2UTaWd2tpWyOCwm9Uo7zFNm6dxndMreKotnx3CiOHh6eCa9j+QyL9PcNRyMR2sRMBuYTVH4IYGT0h+ZpTuJFOms2M8qXuRxQ6HiJk8vb/On74vmCIWs0FBdkS6Kj81noO09a0a0oxupYu7HKwPGXZfujv5HlJc+hLLBOhbFCJzi51pkc1vgcm4pCb/LskVcFFCkoPHPIe2y2Iwq0avJ3SZt8iran3ZhvQzGmu9f3W9YFE/1TWlYkkSCF2240Euwrk+b6hmaGJnv9Eghii1GnwrxTMOaoGNEydqaEcBlC7rtcaU7XZAOLKU8NQpYsjREGs2VAi/vQ+BDT1gEOrMPbPTZoNkO520IbwInrH4UqfJhzls2jHSHqBn5+QLYQ1ERJ/wrFEDgFR2FLymC7blYRPTDN7S0zRXiX;4:1al/MdqqHW4K+BwoeAnpTKlYl8elWU309IiVKp1xGUEoP4mlCCNIsRGRL+QXy0zczCd0Bq7Envcv1fkYeaGsVjbSr2RPi5KW2ENBaldwzVPVR+uLmrT0kTmmQ3W68ZkaTvhYwQQvtflx7ezRvCny7JEBBMsMm7fhIyB7t/c82Ksv93KNQHRvJWTKYNnAyDK3GCWVR/EQhuNni04yFGi/DMu5hXuAgf0ZCtXqszc/04YfViDGSxjLI27NfcF5f4dl1jlFQFpHgxbEZ4H4Y0C2oYDA5lTUtIcoRIL57HSQWR5SK3vGhDYSbd8MyYabqIn8F199PUPk2nnvW+zCdwERigw6a+UfeTTrGY9DSharSjwOzKaOZ8i4GyecH7IfTmT1b4YuTeS7iV7yoAyzlFPZwtHtje8R5MtOWmt/ZQIeLeRxbNjRbpfEgeMeBGVBwv6K 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)(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; X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1;BLUPR12MB0434;23:7VaFL2wxHhhNUJSCt/cEa9Njpshmo7X8psYu51MhS?= =?us-ascii?Q?2E+5d3xosXbERuB1A0AiVEsZ1c0mkGjc0cY3IYCNeYWl1uArUvY2zzlgSdWD?= =?us-ascii?Q?Ha7TIhsLbJW/NooV37v8IJVsi7p7WAm5YMwhdCADnYeXIXGSDYG5SRTBTSxE?= =?us-ascii?Q?pBSEnY4rxUS/VpnV6p41UqOAHokmJOGln1+KZAp+aC+Wo+hg3hkMIaR3YZkF?= =?us-ascii?Q?qT4/FqpsvkYT8mt1Qq0rSlTRpjnywCjxOIS/pogkssxEw2rzUM162M8PkOco?= =?us-ascii?Q?YgcrvLYoaBjz4elnYSGZbywzswkaeSbOojLwX18NlcF6L0Uhqlay7gwBZyMS?= =?us-ascii?Q?4sV3Sq7GsEUYhEpAT3JpJ4t9wB6PIsPG1XiPr5oM7CmlPLwTjWFGsaSy9d2a?= =?us-ascii?Q?zsg8PTsUA2frF7s7Ko+Rue0O6Rj9buvrJCk+dzc/Nwj2pHH1IG6gghwkojcW?= =?us-ascii?Q?93CISoGkHLNwhiP+91KI0bfzBjGah7XvWJHuFtBcMJeIXkTmhktrGUF6HmfI?= =?us-ascii?Q?CCyf8nReuDykgp45yiyAy1GXRPmg9cY/TEx3Amly0079W6tqQ7V0SKO47Gro?= =?us-ascii?Q?DgUgUC4c5XgwfRXtKNOE3QcQ247VXF66KPz0ZRUMfXXMZ/8SzxdRYOIx+I9X?= =?us-ascii?Q?o3snKH/dowUltV8ZE4ZDYK4ga7QRWTt9zSWZ6DFkX6tsVCaPMA2u+oWIq8wj?= =?us-ascii?Q?hdtTwl3LUnaukqJNZN00IVeXrAxzMtwfgqgc8Q7ND9UXpzKdR7n5NjiWm4Io?= =?us-ascii?Q?KgBHAPjZsy2UXvl7D15epyLWvSOTUVVZiW7ejIzeB6Fw5mzP4BrVCrv0FTUO?= =?us-ascii?Q?uIDVovcVNqOw8mkBUTpFmRTxd7iE6HDd3kzjz+DZfKZJPwYxxW84EFjCQyZp?= =?us-ascii?Q?sNrB53aF9F3L7TPc3UkMVPHbJl47YeeCPv8Amt5CF8ZuPez8ITq2wu9HmwwU?= =?us-ascii?Q?m1qSqgTeTI9A2n16grKUDzrL2ub7sJdqX+ZgS9k5DFZap8ejgeH4VDnf/+Js?= =?us-ascii?Q?s2mElZA5kLAKzCrNlKKK1mwcwB0hIhXqBtjdQVAmxiasjwO2UNr+5aHit/Wr?= =?us-ascii?Q?wz5i6g/Jkxt+tNf3ncJFFSn1JQiBTw+9GUT5W+SvCYnqv7GZg=3D=3D?= X-Microsoft-Exchange-Diagnostics: 1;BLUPR12MB0434;6:RgGtYGI6IYmGQfOOtgrl127GEF8vdOPF5wK1kE3nDvqUwJajFfP5itZF86tVQ9Sl6Qs5oiP/AXx0jo9WZMxIbaG9pkNX6MXHRwRk1Pdb9nm6uohBoP7C2mdg/M0N0aQNWlpAnEihwOUw1HANRR+uh8ak35EBBmghz+p3mW9GmOWIYfFyNKP0TUrigjiJbXrVk9aa1P56t2s3swPE4ZEHgsAOvPdkCPAH7MmcptP5TFYgsWc+UJ3Klaba8DwNQM7VIacdHkKB9Yzcgk6i2ipJGNoPpEX6XAFwvAYm7XUPwqhQkv531nHa87m46nbBybps;5:KREVIRjCNvpg7HSVSJykhVQaBT1v4IH+RtTLfSyNU+GpWJPU9JjFEFouxBweW5Dgq5INYl0sczMJOhGaALNYH4fCen67OuaTNTXwuuP9kwSuGqcoHX5AE6u/cxpP8aO27BEkSeDJw8nKgQO66+WDeg==;24:a8Vu2C3Zts9SUnHpE79RWTxbtQVvL84koAZw/Ho+g7UGnOXxvI1ZygCXAQdHyi0SXkzG+eRGYLTDy8Q6fpFjPX7BDtSf/TC/JETiWqK957o=;7:1198kyXwqHNZoZ4HSQtWONcvcvopBBN5svbzZYbTEgG8K36YyhCPfJuvQ6j0kFtH3vHlGYsdHlYBkMWOaHAeJKM+g+a7pM+1EUtUFzq1X+kMJKM0Lw/EJEfZYxmwJn7T9fKUBMOhHMtDrBzdAjN3dn33pc6i+SusjzvroCs7pKGwES7hFS4YrYf0dXLtSGXw4msVd7gJa7OGv/6LYhMJQA== SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-Microsoft-Exchange-Diagnostics: 1;BLUPR12MB0434;20:qml96etqmsXYg8+KJw5vOnm6bmwjgLcA785pIRcBDgsaVj0ZS0HtmHES1jxzDzmqdJupz1yYd1a2vJjiy0BcGSJrYPhKZCGgGqzXsfNeLNIONb8F5gQKj4wleL6y3bZOayyuLVfxa40qI1Zyd87hsEs7gp5cVXLh7pzwvjRkqczQAE16uKbH4WltvSVEnaD0t2K02l2zpPRjZbampOROqa5Vk9nxFfNb45QNfjm3KNkE9ZsPmUvICYtDkISz2zSr X-OriginatorOrg: amd.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 13 Jun 2016 22:07:05.0321 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-Transport-CrossTenantHeadersStamped: BLUPR12MB0434 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 | 65 +++++++++++++++++++++++++++++++++++++++++++++++ include/linux/amd-iommu.h | 6 +++++ 2 files changed, 71 insertions(+) diff --git a/drivers/iommu/amd_iommu.c b/drivers/iommu/amd_iommu.c index d6a56ac..7176c94 100644 --- a/drivers/iommu/amd_iommu.c +++ b/drivers/iommu/amd_iommu.c @@ -4334,6 +4334,70 @@ 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 = &ir_data->irte_ga_entry; + struct irq_2_irte *irte_info = &ir_data->irq_2_irte; + struct iommu_dev_data *dev_data = search_dev_data(irte_info->devid); + + /* Note: + * This device has never been set up for guest mode. + * we should not modify the IRTE + */ + if (!dev_data || !dev_data->use_vapic) + return 0; + + /* Note: + * SVM tries to set up for GA 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); +} + static int amd_ir_set_affinity(struct irq_data *data, const struct cpumask *mask, bool force) { @@ -4385,6 +4449,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 e52cee5..f698900 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; -- 1.9.1