From patchwork Tue Aug 23 18:52:34 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Suthikulpanit, Suravee" X-Patchwork-Id: 74511 Delivered-To: patch@linaro.org Received: by 10.140.29.52 with SMTP id a49csp2246236qga; Tue, 23 Aug 2016 11:55:21 -0700 (PDT) X-Received: by 10.98.36.134 with SMTP id k6mr55598470pfk.116.1471978520958; Tue, 23 Aug 2016 11:55:20 -0700 (PDT) Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id 18si5095476pfk.163.2016.08.23.11.55.19; Tue, 23 Aug 2016 11:55:20 -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 S1754334AbcHWSyn (ORCPT + 27 others); Tue, 23 Aug 2016 14:54:43 -0400 Received: from mail-cys01nam02on0077.outbound.protection.outlook.com ([104.47.37.77]:42336 "EHLO NAM02-CY1-obe.outbound.protection.outlook.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1752296AbcHWSyV (ORCPT ); Tue, 23 Aug 2016 14:54: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=v1jUV/Xnc7ZpZyTV3uquNms3DZrofLszoptigkzUGHY=; b=GvHXcHjcE0nXtK68c0C2rYAIU2/PSqC+gQvUfc0ARcwN/QaPFo0FiK19PlKgtrnl5IMCmd1vf8lyQlJtffiD34jipysNhhF4yqO2NDaD0+6JEWI/Kd28aPNtd/D77AdkbxNUsNUJ+GLEt8gNeD6hDYnwdEg7RrkhgOMZnGgXeLk= Authentication-Results: spf=none (sender IP is ) smtp.mailfrom=Suravee.Suthikulpanit@amd.com; Received: from localhost.localdomain (114.109.128.54) by DM5PR12MB1452.namprd12.prod.outlook.com (10.172.38.141) with Microsoft SMTP Server (version=TLS1_0, cipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA_P384) id 15.1.557.21; Tue, 23 Aug 2016 18:53:16 +0000 From: Suravee Suthikulpanit To: , , , CC: , , , Suravee Suthikulpanit Subject: [PART2 PATCH v7 03/12] iommu/amd: Introduce interrupt remapping ops structure Date: Tue, 23 Aug 2016 13:52:34 -0500 Message-ID: <1471978363-13756-4-git-send-email-Suravee.Suthikulpanit@amd.com> X-Mailer: git-send-email 1.9.1 In-Reply-To: <1471978363-13756-1-git-send-email-Suravee.Suthikulpanit@amd.com> References: <1471978363-13756-1-git-send-email-Suravee.Suthikulpanit@amd.com> MIME-Version: 1.0 X-Originating-IP: [114.109.128.54] X-ClientProxiedBy: KL1PR02CA0053.apcprd02.prod.outlook.com (10.167.54.21) To DM5PR12MB1452.namprd12.prod.outlook.com (10.172.38.141) X-MS-Office365-Filtering-Correlation-Id: 193a1a64-28dc-40bb-5965-08d3cb86bf90 X-Microsoft-Exchange-Diagnostics: 1; DM5PR12MB1452; 2:cwXBCvMg3RL3FPu4wFHeeeehux/wBLgESdGYJwgFSHCuM6H3lQz/NCGE/cmdy8Ue+PKs+pghEx4QFtVA+jsy95UljrNo+8IVaofHzrcrx7Pmevp8nQDM+1rEgmQ6xmABfBPiLJwV4rxGCQ8ruTALG/ztgicPpvX6x0UsjU5eGxszEOODjwm1icFH02qMuAWD; 3:kNnxx+CU6XJNwgY8WcykLy5AOufPh/16MttcqYx9BaV0EJZEQi8AwqayeK9WNU/EbkOU1I0BS1yohIHHfLNpab9q50MQkPPUF5QHblJDzu0zTJRnW58QQLMdy1aO+l3+; 25:AE+xkyKvldKveaKOvp5yS10fwm1gptM4VcTuA96ptsXcsA+8jGeB5fdQpIclME/cfICNJwBKct/gAihVPpObHcDliUEHknaVoHKgalC2CaBZCLMMnFVYjTD0h3YZJ06aY6oeUhg2tcOjE9RQtDSecb99jIU4kbbxYRFjeP2n/d211iIi56jtRrD8BubiTpc5icbCj6NSjQLqy/WE3DJiv6XU1TlxlyRuoecO7iQTJxBKaZgaNQEzliW9AtkZOMbzoCwBJ7C0PtyQ0jEKOLM8lh5+zaJLccfuZryqy9jQFYTTs7S1JOMbDpTZHbJGSofX9fXeGWCFF18VA41jiMh1qV5tkZHveWBx0ylEFYQh4+CjfL1qmMnqWQieg4kW1B5tkQy3Ac2WHkJb2IAof1ToJIdnhs6zv4F/fY0oEsPNQWY= X-Microsoft-Antispam: UriScan:;BCL:0;PCL:0;RULEID:;SRVR:DM5PR12MB1452; X-Microsoft-Exchange-Diagnostics: 1; DM5PR12MB1452; 31:8YmrsrLS9/84Z2MeqebgjTUqEHt7j2/p9RYpYYd8LhYv4UiyqE0oe2GaDModujEeczTRzAd9QEbqBO565SKT1Xw3UpQK4o1aLn5iBBRCIQLqtazgAu8KS3jEC5kyZpeBnfdzETIRNbAQpV7h6kM0NA49P5rj/6MowN+aEXMzlTG8Zp/mmvbsMXuBCZ7zPjsEjeII1lVv2y56qDJR0OcSNgD2zjy6sN9OrqrLDeEGhJk=; 20:MEs/Y6YNjcjrF+qWEnfhG8HRsZ+T/DyWNYLGBGJafvX9EMd1SzSer40anrNpxyIUiTUg2wA36Lg9KRo5AVYI+SUQRDvPD7g+55E94CqnxZRaw4TzPif+BDt+051iMzXFMafzCEP5rbyCgQqQSAJhFFPE+rtmM0iJtrKxIVZMlDzcLCbWJMCRwXPYmAuSg4Q3NOiaywJGtMhFFIkUT0k2Vu0TGBZx2f7M46dkepMgqujqJD3Idk/7RJre5SmEmh+a/4xmgiMMdgCFj/2BNDxQY5m16ENGk/8cG6wPvlwVfn3FW7QByji4P7SxCQyCpf8Pskt2jd8/aSk7ZaoBfDp0imAlML8LBROKQ5NgTsVYLAHbox4bBHQNvYw1OOxii0d+b1qJ7mkEUJhKRZBVPiAqtkIVaCloVOgm25fme/qrs7NF8cx53J9qLsr+P/drySV3avZk0zoC8OlBYUIj0rAq2SRfzeees+a3KAW6HVT7L0awSLTP4KLfmS38z0fMcRyR 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)(5005006)(8121501046)(3002001)(10201501046)(6055026); SRVR:DM5PR12MB1452; BCL:0; PCL:0; RULEID:; SRVR:DM5PR12MB1452; X-Microsoft-Exchange-Diagnostics: 1; DM5PR12MB1452; 4:r+CUtcSwAmOZ7JnnHBlf8WHUzY6Hh+CugIbtAX46wCW2n41tXeDRC/iFoelLVRvtM6OTbE7RsEj+LC8M6Aq3H0z++6dEUfIAZw/ku7ZBQAgK7qAcO9hdzWspZUaK51ATFszbQIgJkekg7TguPwOlLch4CH0QzCr/rzL2GA+EIrTCHIn5GPe17zdnhnUm+/RZOZGjOkXdZI6wQntKRH+XjvcHte6hFQgsD93/czQJTa/iuvJqa3I2JQ5zJ9gK7NN5NYJqlbaVP9dXXGfhTp55QuwgGCYckCg6e595PxSWG4UJt081GMvx4xPLakGD3lYu3HEZlppNmw9TU76vyjJjYDMTI4Uk7McLVse+XB4lnQNwgy2sCBAXo2iNv8ZME98O17hm5zyf3EximRpwcJeVkacqdmFjOlSpiDjStScaqKwTOAkRdc1xLM3fjVjJcChO X-Forefront-PRVS: 004395A01C X-Forefront-Antispam-Report: SFV:NSPM; SFS:(10009020)(4630300001)(6069001)(6009001)(7916002)(199003)(189002)(42186005)(76176999)(101416001)(48376002)(50466002)(77096005)(5660300001)(92566002)(105586002)(5003940100001)(36756003)(86362001)(106356001)(66066001)(50986999)(5001770100001)(19580395003)(19580405001)(50226002)(97736004)(189998001)(229853001)(3846002)(2950100001)(47776003)(8676002)(7736002)(6116002)(586003)(81156014)(68736007)(4326007)(2201001)(81166006)(305945005)(7846002)(2906002); DIR:OUT; SFP:1101; SCL:1; SRVR:DM5PR12MB1452; H:localhost.localdomain; FPR:; SPF:None; PTR:InfoNoRecords; A:1; MX: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; DM5PR12MB1452; 23:XLb+g1lyQwBM1spOXMEqHFsETSZSIBggTAT/uHL0/?= =?us-ascii?Q?8C7zJRL9bp8RUQAecn4A3DfPMlR1i6hOVTP1E9bDw5A5M6aUpT0BCPLpSG8D?= =?us-ascii?Q?gFhOmomnzfM9WH0QxI3UmSShAsRMI+mchPP14Uj3spzgcMi6am9yg/Njgpp+?= =?us-ascii?Q?Wqrp+LZN7DJM38rnrmq04OU+BWlbEvlc5zk1tjnFdMt/ilTuL+/M1cJz2c/Z?= =?us-ascii?Q?8FXb1ZhxODfrJcnxdQkTGMrG0j4c/QvqCN0VTpvVwwyaoYeiQS7HtTbM1oWu?= =?us-ascii?Q?JeBfBWfLvij1fpBAUA/CRhzpIzyhTHFPyN3eUZgrsoasI4X2hJPtgjezhnbB?= =?us-ascii?Q?mdPHP3J5cWG0u/uMi9gxbK8c0m3WimB/LJlofoKcJlNYRGU//lWlp788bg1k?= =?us-ascii?Q?v2HAWZx1NAFFF3zqknY5H6/mdoaZn4R8LfHQrO3QH1hkuKt2+ugZn0Zv+jPW?= =?us-ascii?Q?8NXss98bgYvbIiAwdOm7zUGRkoP55K0DMyUCpb8FArmJQEsAuat3LrfPJ/Rg?= =?us-ascii?Q?0FUX1ZgHQ3D+U7YBuSDYqrtlVJEs56i5IFqWlrscRazWrc9ERV8xamWu+8vv?= =?us-ascii?Q?+opcjvG8kfYYfx+nd91+dw8i+I/frex3WXXTodM9fC4y5VR3z+tjroaEbTRj?= =?us-ascii?Q?fRQrW8eeCx1FXYQTd8d5mJwAO1QaqBHS+z7Iv2LZytQyuW4S+q5hTyntHu4H?= =?us-ascii?Q?zwEFuw8a2Gk2UOySW61OLaZIUTFYjQDxzGtWoLL7RIiqY92j7hE6cmeXpiZr?= =?us-ascii?Q?b5W1fz8Th02nDhef6OIusahA2qIBhctn0NGAL+5sCl9aX+Oerk3GwlnVSrBo?= =?us-ascii?Q?LwP3KZSkINg+C2/YOX1Z6DeskoaRoTKJmI++SeKzSm9BNvK6NZhVfVUi8LY9?= =?us-ascii?Q?pEQg8/iedVITf09hz9RbUDsCtGCPd5xWApA3bjlZDhQS2zCP46/+9iG/Voa3?= =?us-ascii?Q?K/VGTwGmrr+ZZgQ+OaW8jAzK80PYdlXdgpnnNQ3kSmyHHdHd74rrPUXRmQB1?= =?us-ascii?Q?nyF9ql9TadwNACIP0Qf+tFo9VDSyDZV8e6Um4xtKWlgxdmH1PcGtCUXrURit?= =?us-ascii?Q?s7amCdr1D1kdkcTP5CCfTXeCjl28ELc0DqQQlQ0N/fRYuzD+Q=3D=3D?= X-Microsoft-Exchange-Diagnostics: 1; DM5PR12MB1452; 6:z01zDfxe/mOPLcHuuvA7GaggNhISTW5AZENQL20q9iRjwn/exg6MRL2rSdS0QTYJnpgvWkkaYBD07y5gEsUzPrqrCcSHUoF93ZcgHlDlvFSkoxXQg58+c3e0RtSYeStEPHkKj7QUJ7dunvu/NEWoLn+7u62Sw4ziYlgzxHcnufq23Ob+EeljJktVtOUVaeEPMXLml54zAO12Jz38UkrsjoCLn4mpjBNf1ZK/g2QvN76YmPNeG11VYZtPogYt6bOMcf57b5Wun7146hpLkkKfR82h/CQJH8nYwRpWV24XObT3prowbuxvsHZGGJqZnhM4Oad1GdCLI/g80fn2HxKhbQ==; 5:HtafHN7HmFAUy7ioheJMM4HrQ9z/Db0v8WojUYqzWU/sG3E8SL1Ad66VvtEP3V6AWa8AjZXZ+8A3YsqHfaaPcjbDjNXKnhkp5GeBgH5BUQOJiPguEB+K9c+hNEMQDizVn9DsnC1fMAkrMg/bzGfsyg==; 24:5z+oTMVSHBV5d9regNcdGUFOibN8okeenjk5Ix+7aASqwhDvEXcV/RTo9sgd7oZ6zVdIMN8akczuaVqU6f7UsPAvGj56QjirlQiSOl/ja0U=; 7:Ig18EuK4zxRGXHMUT+Ql3h2AwM5l+7qhsRODdgfEr9GG5BKGJMbgaHYPmOL8u7x0yMv10cy1KJb+LpskbrfKACnQhvShi3odoRSP1+N98uHsVF24rda4UqFki7Rmbb+3lg0xBtgnIpL2N9s1eOaJc2fpMK6oqW68DBWWCr6rey0k7k1wjG8KGsUDg0Fs/nrbyMrMD+6wOTqbzGr4dTSAhoDjFiZTjjC7haFDF3sdP1dH0TozER651HiohpMVu2sK SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-Microsoft-Exchange-Diagnostics: 1; DM5PR12MB1452; 20:Unn07fVa6POVxuWruTP+k2SQ8Q3YbhMiX/VKhhuxG0EujXAGWwoVtC/4r8w/L+iUy7IOeAALgKZmG+GtJcorNCdPBs9LvplodquJATlDSTNmnnGoNOkidZSjrfU7aHGOhxdLol0HLV7Js3VCOIQvQqLXRVguOI3BdLrEd1VJuewEretyrCiqOo2ehhR9zdFXUOwQJMOtiiM13Y4dhPX+Z7M1i6o/4nK0GI9/MDB988skyarpccEMrlRvPo8cOoUs X-OriginatorOrg: amd.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 23 Aug 2016 18:53:16.0322 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-Transport-CrossTenantHeadersStamped: DM5PR12MB1452 Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Suravee Suthikulpanit Currently, IOMMU support two interrupt remapping table entry formats, 32-bit (legacy) and 128-bit (GA). The spec also implies that it might support additional modes/formats in the future. So, this patch introduces the new struct amd_irte_ops, which allows the same code to work with different irte formats by providing hooks for various operations on an interrupt remapping table entry. Suggested-by: Joerg Roedel Signed-off-by: Suravee Suthikulpanit --- drivers/iommu/amd_iommu.c | 190 ++++++++++++++++++++++++++++++++++++++-- drivers/iommu/amd_iommu_types.h | 20 +++++ 2 files changed, 205 insertions(+), 5 deletions(-) -- 1.9.1 diff --git a/drivers/iommu/amd_iommu.c b/drivers/iommu/amd_iommu.c index ac2962f..5260b42 100644 --- a/drivers/iommu/amd_iommu.c +++ b/drivers/iommu/amd_iommu.c @@ -3826,11 +3826,12 @@ out: return index; } -static int modify_irte(u16 devid, int index, union irte irte) +static int modify_irte_ga(u16 devid, int index, struct irte_ga *irte) { struct irq_remap_table *table; struct amd_iommu *iommu; unsigned long flags; + struct irte_ga *entry; iommu = amd_iommu_rlookup_table[devid]; if (iommu == NULL) @@ -3841,7 +3842,38 @@ static int modify_irte(u16 devid, int index, union irte irte) return -ENOMEM; spin_lock_irqsave(&table->lock, flags); - table->table[index] = irte.val; + + entry = (struct irte_ga *)table->table; + entry = &entry[index]; + entry->lo.fields_remap.valid = 0; + entry->hi.val = irte->hi.val; + entry->lo.val = irte->lo.val; + entry->lo.fields_remap.valid = 1; + + spin_unlock_irqrestore(&table->lock, flags); + + iommu_flush_irt(iommu, devid); + iommu_completion_wait(iommu); + + return 0; +} + +static int modify_irte(u16 devid, int index, union irte *irte) +{ + struct irq_remap_table *table; + struct amd_iommu *iommu; + unsigned long flags; + + iommu = amd_iommu_rlookup_table[devid]; + if (iommu == NULL) + return -EINVAL; + + table = get_irq_table(devid, false); + if (!table) + return -ENOMEM; + + spin_lock_irqsave(&table->lock, flags); + table->table[index] = irte->val; spin_unlock_irqrestore(&table->lock, flags); iommu_flush_irt(iommu, devid); @@ -3872,6 +3904,134 @@ static void free_irte(u16 devid, int index) iommu_completion_wait(iommu); } +static void irte_prepare(void *entry, + u32 delivery_mode, u32 dest_mode, + u8 vector, u32 dest_apicid) +{ + union irte *irte = (union irte *) entry; + + irte->val = 0; + irte->fields.vector = vector; + irte->fields.int_type = delivery_mode; + irte->fields.destination = dest_apicid; + irte->fields.dm = dest_mode; + irte->fields.valid = 1; +} + +static void irte_ga_prepare(void *entry, + u32 delivery_mode, u32 dest_mode, + u8 vector, u32 dest_apicid) +{ + struct irte_ga *irte = (struct irte_ga *) entry; + + irte->lo.val = 0; + irte->hi.val = 0; + irte->lo.fields_remap.guest_mode = 0; + irte->lo.fields_remap.int_type = delivery_mode; + irte->lo.fields_remap.dm = dest_mode; + irte->hi.fields.vector = vector; + irte->lo.fields_remap.destination = dest_apicid; + irte->lo.fields_remap.valid = 1; +} + +static void irte_activate(void *entry, u16 devid, u16 index) +{ + union irte *irte = (union irte *) entry; + + irte->fields.valid = 1; + modify_irte(devid, index, irte); +} + +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); +} + +static void irte_deactivate(void *entry, u16 devid, u16 index) +{ + union irte *irte = (union irte *) entry; + + irte->fields.valid = 0; + modify_irte(devid, index, irte); +} + +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); +} + +static void irte_set_affinity(void *entry, u16 devid, u16 index, + u8 vector, u32 dest_apicid) +{ + union irte *irte = (union irte *) entry; + + irte->fields.vector = vector; + irte->fields.destination = dest_apicid; + modify_irte(devid, index, irte); +} + +static void irte_ga_set_affinity(void *entry, u16 devid, u16 index, + u8 vector, u32 dest_apicid) +{ + struct irte_ga *irte = (struct irte_ga *) entry; + + 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); +} + +static void irte_set_allocated(struct irq_remap_table *table, int index) +{ + table->table[index] = IRTE_ALLOCATED; +} + +static void irte_ga_set_allocated(struct irq_remap_table *table, int index) +{ + struct irte_ga *ptr = (struct irte_ga *)table->table; + struct irte_ga *irte = &ptr[index]; + + memset(&irte->lo.val, 0, sizeof(u64)); + memset(&irte->hi.val, 0, sizeof(u64)); + irte->hi.fields.vector = 0xff; +} + +static bool irte_is_allocated(struct irq_remap_table *table, int index) +{ + union irte *ptr = (union irte *)table->table; + union irte *irte = &ptr[index]; + + return irte->val != 0; +} + +static bool irte_ga_is_allocated(struct irq_remap_table *table, int index) +{ + struct irte_ga *ptr = (struct irte_ga *)table->table; + struct irte_ga *irte = &ptr[index]; + + return irte->hi.fields.vector != 0; +} + +static void irte_clear_allocated(struct irq_remap_table *table, int index) +{ + table->table[index] = 0; +} + +static void irte_ga_clear_allocated(struct irq_remap_table *table, int index) +{ + struct irte_ga *ptr = (struct irte_ga *)table->table; + struct irte_ga *irte = &ptr[index]; + + memset(&irte->lo.val, 0, sizeof(u64)); + memset(&irte->hi.val, 0, sizeof(u64)); +} + static int get_devid(struct irq_alloc_info *info) { int devid = -1; @@ -3999,6 +4159,26 @@ static void irq_remapping_prepare_irte(struct amd_ir_data *data, } } +struct amd_irte_ops irte_32_ops = { + .prepare = irte_prepare, + .activate = irte_activate, + .deactivate = irte_deactivate, + .set_affinity = irte_set_affinity, + .set_allocated = irte_set_allocated, + .is_allocated = irte_is_allocated, + .clear_allocated = irte_clear_allocated, +}; + +struct amd_irte_ops irte_128_ops = { + .prepare = irte_ga_prepare, + .activate = irte_ga_activate, + .deactivate = irte_ga_deactivate, + .set_affinity = irte_ga_set_affinity, + .set_allocated = irte_ga_set_allocated, + .is_allocated = irte_ga_is_allocated, + .clear_allocated = irte_ga_clear_allocated, +}; + static int irq_remapping_alloc(struct irq_domain *domain, unsigned int virq, unsigned int nr_irqs, void *arg) { @@ -4104,7 +4284,7 @@ static void irq_remapping_activate(struct irq_domain *domain, struct amd_ir_data *data = irq_data->chip_data; struct irq_2_irte *irte_info = &data->irq_2_irte; - modify_irte(irte_info->devid, irte_info->index, data->irte_entry); + modify_irte(irte_info->devid, irte_info->index, &data->irte_entry); } static void irq_remapping_deactivate(struct irq_domain *domain, @@ -4115,7 +4295,7 @@ static void irq_remapping_deactivate(struct irq_domain *domain, union irte entry; entry.val = 0; - modify_irte(irte_info->devid, irte_info->index, data->irte_entry); + modify_irte(irte_info->devid, irte_info->index, &data->irte_entry); } static struct irq_domain_ops amd_ir_domain_ops = { @@ -4144,7 +4324,7 @@ static int amd_ir_set_affinity(struct irq_data *data, */ ir_data->irte_entry.fields.vector = cfg->vector; ir_data->irte_entry.fields.destination = cfg->dest_apicid; - modify_irte(irte_info->devid, irte_info->index, ir_data->irte_entry); + modify_irte(irte_info->devid, irte_info->index, &ir_data->irte_entry); /* * After this point, all the interrupts will start arriving diff --git a/drivers/iommu/amd_iommu_types.h b/drivers/iommu/amd_iommu_types.h index c37c5c4..d57c56d 100644 --- a/drivers/iommu/amd_iommu_types.h +++ b/drivers/iommu/amd_iommu_types.h @@ -410,6 +410,7 @@ struct amd_iommu_fault { struct iommu_domain; struct irq_domain; +struct amd_irte_ops; /* * This structure contains generic data for IOMMU protection domains @@ -534,6 +535,8 @@ struct amd_iommu { #ifdef CONFIG_IRQ_REMAP struct irq_domain *ir_domain; struct irq_domain *msi_domain; + + struct amd_irte_ops *irte_ops; #endif }; @@ -780,6 +783,23 @@ struct amd_ir_data { struct irq_2_irte irq_2_irte; union irte irte_entry; struct msi_msg msi_entry; + void *entry; /* Pointer to union irte or struct irte_ga */ +}; + +struct amd_irte_ops { + void (*prepare)(void *, u32, u32, u8, u32); + void (*activate)(void *, u16, u16); + void (*deactivate)(void *, u16, u16); + void (*set_affinity)(void *, u16, u16, u8, u32); + void *(*get)(struct irq_remap_table *, int); + void (*set_allocated)(struct irq_remap_table *, int); + bool (*is_allocated)(struct irq_remap_table *, int); + void (*clear_allocated)(struct irq_remap_table *, int); }; +#ifdef CONFIG_IRQ_REMAP +extern struct amd_irte_ops irte_32_ops; +extern struct amd_irte_ops irte_128_ops; +#endif + #endif /* _ASM_X86_AMD_IOMMU_TYPES_H */