From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752421AbdBOU5t (ORCPT ); Wed, 15 Feb 2017 15:57:49 -0500 Received: from mail-sn1nam01on0084.outbound.protection.outlook.com ([104.47.32.84]:13151 "EHLO NAM01-SN1-obe.outbound.protection.outlook.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1752105AbdBOU5p (ORCPT ); Wed, 15 Feb 2017 15:57:45 -0500 Authentication-Results: spf=none (sender IP is ) smtp.mailfrom=Suravee.Suthikulpanit@amd.com; From: Suravee Suthikulpanit To: , CC: , , , , Suravee Suthikulpanit , Suravee Suthikulpanit Subject: [PATCH v10 7/9] perf/amd/iommu: Modify amd_iommu_pc_get_set_reg_val() to allow specifying IOMMU Date: Wed, 15 Feb 2017 14:56:23 -0600 Message-ID: <1487192185-31272-8-git-send-email-Suravee.Suthikulpanit@amd.com> X-Mailer: git-send-email 1.8.3.1 In-Reply-To: <1487192185-31272-1-git-send-email-Suravee.Suthikulpanit@amd.com> References: <1487192185-31272-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: SG2PR01CA0102.apcprd01.prod.exchangelabs.com (10.170.138.156) To BN6PR12MB1444.namprd12.prod.outlook.com (10.172.24.21) X-MS-Office365-Filtering-Correlation-Id: bfef9f81-e903-4ffc-b7fc-08d455e53fc8 X-MS-Office365-Filtering-HT: Tenant X-Microsoft-Antispam: UriScan:;BCL:0;PCL:0;RULEID:(22001)(48565401081);SRVR:BN6PR12MB1444; X-Microsoft-Exchange-Diagnostics: 1;BN6PR12MB1444;3:Y0MYRC7CVY7x1DnB8z3L4enha6HDu+oI1/sW1PgBclkFmI1H39lqZbBlH1Wht2h1Ic/40cbOg4S5XIfLjXbNRVb+5NGMV7F406RdNPFpc+6regAE++kYW5McPrNMUhCa8fwDr7+vydGxQP3CwgKkw0vC5w9g5zpXjuwJFMrUtcRCxMnEgIhCHSFfAIypbAfJdxsWPaOBvF/UNXRv6DvwD82oRSq4Mgi+FOgYYXpXXE4rRBd+fwuZPfyBxXETJe256lukgD9+6EPnEgSB5Svs1gf7+vK321O7bIDMqKOaoyY=;25:plYNPInGbM/PIrdR//082wMiwRK+3h9adyf48X7QX9e6Jwec8Ug1pLMAF4ewJ+VFcGmHXxmaFamsDNbfjdogAg+l20+3jWRYxL00A4id7pnJjY2aVoSfJ/h5hAvCd5jh6rjAWSBRx33jvhgej+6KBMu1y4vSnbQB5B80w0spKdl4n91AvMT0IuqmrXnoz/88n+QhqSz6If5U+BICC5ocLtNmGuHex7QlcxWu6OHcAsg1yKfM1qtD07qmnm/XqECll57mIzHxlbxLsHULr6mXDRiBmGV0GM899kYHp9W0bPiyQ5ftd1eThDrOeytRwdN4xHLXqlQHfBanKx/iPX1d0TK7kCNXJvAd6aqV1SwnyS3YddHlo1Xh5pWnhIsWe0dvKXQXA8/MK/n9Wt7Ctfh2I0C9dCSXFX0RaW3g4dNxDUgjfUpii7tOChO+WJDtffSkg131sW0qj7AokNF0VXM8Kw== X-Microsoft-Exchange-Diagnostics: 1;BN6PR12MB1444;31:3CWrFz05r4rlmn73v480yIkyDv3gvoaRaHoZrj9UFGlaPvo/MalvhhT0EYpVjTfll9KzWgnEI1cPyr+YTczshxfhc4iZkdsJfhn+PDtmjpVt/9f5JPfz5H6LHxuE6WlAUM88R1h3kla8Mrs6q2whWC4QNIWhqso8e3z8A9EDS0W75InjdLVO5GcWmhGlsbJ7fQAn6KPQ1827DdaCM0/KPf2DUpJoUqQCN5AKiR2pILija0IM3cjTc21/wZe5dJxL;20:gXUZDZ7wsvTSlX5/pkzeEB/1SX7dCA7VCaze7+JDekEwsVN9VgMnULEBlJntaMzFBqTadAJ3f2V3nxI59a4COaCq7BVAuNVDfYtgLcDKBeg9Dmntl6T+zTI/CZEuqkoAqAi8jDYTqzmBlYpTyYLqY4O+wg4CjLk5lUN/IUEwQj0A8O4un25eXhWoSM+eaO8OycuYTkNs+lo45bEnke+DYIQ738SQgq6HQppkQw9XUv8p5I/Fu+Jf/DMVQxpfSbGKS3LwVMSeZUHXgHrVxtjX+alDEr6dybhdpcwf6VRF8Fa7Fd7oQfzeSLwuQ0Rp4tTaAZhrhizyeH6lzx7nFQqFK4wkX/3GnZhAZY3dVWwrlh122iU6dYvqzPL6yP6UcAKKjeMhJ8ABMlWVX5mUp0dtmh7lfARxctufUjG01MO313wflSn3yV6v9EXZlSa4rcBCqp5JTSogly00jySCf7HpSNdmUqcYpf0wZgyIj5RLMtKXY1o/iME8w2d7zZN89OWx X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:(767451399110); X-Exchange-Antispam-Report-CFA-Test: BCL:0;PCL:0;RULEID:(6040375)(601004)(2401047)(5005006)(8121501046)(3002001)(10201501046)(6055026)(6041248)(20161123564025)(20161123562025)(20161123558025)(20161123560025)(20161123555025)(6072148);SRVR:BN6PR12MB1444;BCL:0;PCL:0;RULEID:;SRVR:BN6PR12MB1444; X-Microsoft-Exchange-Diagnostics: 1;BN6PR12MB1444;4:U1j1SL/Qvpfju1wgFxKSVWFMDcpxBfNEHNUgs+ai/fjCRR2YXqXGJETP5lliexheknEC72HfAKNjfyLP66ouAdcTSIgWHoqp7HGX3G6MC7vrJRPfBzSjEle8/3szblKP4vtrxod0Bs95fZu4RhMSUrNSfBU+oAijX2t76Uc4BkEUI1f9W3HdmKa9CXjHZmGymexg46E3q/KBD3i7maLYFf7/nNi/I7D4d7yHvnP2cRufRj5J3jSGxs/nd9ESpjWFphdzmQe0uxWGzmYqo0/dQd/tln3NZ8YOYUaLK3eaMMKXl/Mvea4JC/NjI5j/UF6zfJkFjbdyoTz1zB2J6ivq7jeRSkFcA0eDdL5IAwgLPCSdm85ve3pe/DOTEPm/sHxxytyQyY4VhSwwblsQBuzNv/cRA0ngK0ujlbp8BWqFrgtue5NsFu5upu9JJ8aGSeADog7HUFojHgnzLIj4TIV9YCY7HUt+OtRA71hJgIAG+TZXm7ENbqluv/KV7J6Ba1El+T1u11xXcI8Ot5XcMctZGmGe462ei6ME+3YsUtqjHROqdSRC3eFoqGq3sprNqBg7iRjhtAIXtrwCm9dfq3ieBlHjkiUDTu0HpyWdMgvYScYjpPRXCzaSsgrouqeR0Wb1uJoM3d4vWlb8rmPxm42/LXR/l+wwRdBGg1Q89VvePHw= X-Forefront-PRVS: 021975AE46 X-Forefront-Antispam-Report: SFV:NSPM;SFS:(10009020)(4630300001)(6009001)(7916002)(39840400002)(39450400003)(39860400002)(39850400002)(39410400002)(189002)(199003)(6486002)(50986999)(54906002)(38730400002)(53936002)(86362001)(305945005)(48376002)(25786008)(5003940100001)(7736002)(389900002)(42186005)(106356001)(2950100002)(4720700003)(5660300001)(76176999)(105586002)(6666003)(6512007)(189998001)(68736007)(47776003)(50226002)(97736004)(101416001)(50466002)(81166006)(66066001)(81156014)(8676002)(36756003)(6506006)(2906002)(3846002)(4326007)(92566002)(6116002);DIR:OUT;SFP:1101;SCL:1;SRVR:BN6PR12MB1444;H:ssuthiku-rhel73.localdomain;FPR:;SPF:None;PTR:InfoNoRecords;MX:1;A:1;LANG:en; X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1;BN6PR12MB1444;23:b1zZQELjHeY7n70agxebHHeccwhvSm8sAWVB8Xn1D?= =?us-ascii?Q?icNR+ZYqfUPc7mAdxFXwwMKISJfvPJCr4VtlEMi8FP+ZJYl7Gcb7v47m90n5?= =?us-ascii?Q?prdy3apMuhDJqdNz6vAHUEU3PLuN1xFP2dFHcn/c545Ui90huoA35qnyuCbH?= =?us-ascii?Q?deZ1WJoPj+Yo+WxngEeNnhHG1iI6vEbTZkw4SDqS8nAtM0rXqoh89yL1DYbx?= =?us-ascii?Q?uAU6E2oOfX9t1oAjD9jH/52CoYQPzKuC4SkmA/h4/isxm4XMnB9IPRkBbws6?= =?us-ascii?Q?gU9YlyfRR99KPcnlps0CKKkL43XK0t7bXiVySDy9Rs3l4K+ZR0E3EtwIoYfo?= =?us-ascii?Q?Dtqnnvp3k9o3CnnQMCofDMNzTB5mKWtuFVidvkW+nkzLmUcI1Po5b4ayb8QQ?= =?us-ascii?Q?IFm4At3GnKCUgPvFX6wGC6akFXBEAkYRn5i8DAmpjQeTWxdmfbKQDt2OBNQP?= =?us-ascii?Q?j/BMHhqBhHhpiHZvvMz4TOBRJG48CZBCO4+L+dE1DDuuFYnjs/DsK+JcbbNf?= =?us-ascii?Q?82MuFYHQOjqWk9mEpo9fjgb4VO6Mlpe+G031bq7Kegsca8lBcBbggGYIi/aA?= =?us-ascii?Q?ekDDoi2d2jQOO3JKg521cKWTCmj0PDT18Vh4BXz3I7vUM6tfxuK8LqktQQif?= =?us-ascii?Q?hXTWB6OwW7LLRKyejkhLQwaj556H2GvXX+//YVYZ0dtn9U8Ebz1t3j4Dej2r?= =?us-ascii?Q?oXQpUPKdVRLsY24FwJo1bjxbdUCKgTDMcu0FyHV4WlmNmPp7xJ7CnqSkDlih?= =?us-ascii?Q?hncSWyGrln6Qcfq9lA37Li+URUTRcLhMcKAZzZLgWiLE6+KeGP43ysnaMT19?= =?us-ascii?Q?ob6owA7exSlEz4CBhU+4J1VYTdUxzZRjP1F1ERvGD9HWgeOKfYNpJNxsWWlM?= =?us-ascii?Q?MBnNDc6v/Y+saq7Gi17Wu5/ZbTmGwxm9Ezuj+b6KXmqc6F0IOuKDU+gmMHSc?= =?us-ascii?Q?n9kajmTiSjnGV4mldqIzHJn5cCHdbNruILhuc1mZUtSRMr8MHm2YvhRjdujK?= =?us-ascii?Q?f+/vWXFRrjRo9aGtKy9VFnSFTkX2nqsZzc1AwbHgk6BGgCbIGFql2J7W1moN?= =?us-ascii?Q?yh0xiXHgtSlsBztTqIK9Ad7gjz3RbvHptqMJfnaj51EeHi1F/5aKbRHPEvMi?= =?us-ascii?Q?hLsaFf8GoxYEx2CYxFMhYX1Eq6/vzC9WFnyof28zzQ9U5+jzKdIrDUJfp6AX?= =?us-ascii?Q?YhIG7RhDA7/yR67Jft8gH1sb4dLqaBYZe5L?= X-Microsoft-Exchange-Diagnostics: 1;BN6PR12MB1444;6:fds0sMPCh4ij4qc5GJA/r4VEx6WzFnnWewc01cglwlQ85dtDcL3BUENu/LbIih6HUYu+A3JWizJ95qbY5F7ff/1v9hW2qv+lavJ+4o9GodbbAoSu8tQeQBV5N8beoWL0XpyWqGsJM4yQ1sJjYHwd3x0QD1XYIXG/McdNmIpxONu7mmSSd5vAfyT9L3sYdRnNr0IBrWIhXZPxDPB03Iij/poCIYXsYwfYmlxFwgMLujwFps5yH85ZqY31x7BOVc4VHr5wg07je+udEZzN8V+HQ9CNmiDozfSYORdp5VElh0mgh9EqTDJ+ald45IfB9iA+2oB2RrkCa6MK2HRWXF46hSx7K+O3OGwMRc/skepIs6G5zfeoHnXAYq0ltXu49jTWkxBHGbjbNlT7ryu37Svuqoo8/uqYChFMii3wKyNuQs4=;5:k2crjE2dNaAH0cGe4V1nkXb0UA1pPmuKOXBM2oma1wDS3kyphPNwlcXDcPmt636Dh++5WSbx504Ao8R8g5F2Hjw5JuK4duh/th4VBgmqOoGG0E35MCrvlJNiPVjhU/Ma/jnZZ65c9IDLpL6i2S/JEw==;24:knlhCkag4yCysh75IYpioo2NJ4mMuYiRvkQUmAc1bWshqAIiLz+15X8MHl15YTqzS8SlkZpicR7vpmRQzYhGUutH2nv/fQdRKeRVSP0X6c8= SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-Microsoft-Exchange-Diagnostics: 1;BN6PR12MB1444;7:GFs73GVCAk3lkUq3C2lyETqG/sl4jDSvcDebCrn1d5EXIiHl2w6Chcis+xhY2YeLnxAG3uNP1W/umm0CJUVUf8C4BBW6docGq7D1m5Y9dtr0EWt9wd1HWUirsd9o8HIxF1JwnfD57ChWEY4znXKTJ+/eAf/P0bhToLP6SNJlkDZAdDVQvvxkTRAFVMOrGRqQuiMeAH9tn9YS2rJ8zuXcGoZ4Njb9t73rHJdrJvmFcIL4llzKHmb6kzhjAY+tWxOnDSks3qGSQifrdbE5fMv+jxg3sOxbymXprjO68pCvVGzQtcBVSG1U+2WmF2tQnEr4pbPKP6+vw8tPa7lQ/RJGjw==;20:B08BhgjwUP/UJ1mTCRzG/ncC3zk7ty+W+jIQ8uwWfQ9rHnHDOTCTt5UV5TXVQ8CI4Oo3gZ0LTOapDmFBkeic7RuWYoU9hFsJWpyes1jHD0RqfjeBR06pkk7ej6JLE/s5Hh3PV7vaytkFXI150nDRaOSo2Z2r6FrzoOxfO+9/19XmqOIv7d4f6GnE1Fy+0R/15VCVSoXQwL3BqpGjtYQGQTWdqA8x8KQV5E7CW3p+/23B3pPnhki9j4bULnCymm5u X-OriginatorOrg: amd.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 15 Feb 2017 20:57:19.3898 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-Transport-CrossTenantHeadersStamped: BN6PR12MB1444 Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Suravee Suthikulpanit The current amd_iommu_pc_get_set_reg_val() cannot support multiple IOMMUs. So, modify it to allow callers to specify IOMMU. This prepares the driver for supporting multi-IOMMU in subsequent patch. Cc: Peter Zijlstra Cc: Borislav Petkov Cc: Joerg Roedel Signed-off-by: Suravee Suthikulpanit --- arch/x86/events/amd/iommu.c | 38 ++++++++++++++++-------------------- arch/x86/events/amd/iommu.h | 9 +++++++-- drivers/iommu/amd_iommu_init.c | 43 +++++++++++++++++++++++------------------ drivers/iommu/amd_iommu_proto.h | 5 ----- 4 files changed, 48 insertions(+), 47 deletions(-) diff --git a/arch/x86/events/amd/iommu.c b/arch/x86/events/amd/iommu.c index 2394950..b771914 100644 --- a/arch/x86/events/amd/iommu.c +++ b/arch/x86/events/amd/iommu.c @@ -248,49 +248,45 @@ static int perf_iommu_event_init(struct perf_event *event) static void perf_iommu_enable_event(struct perf_event *ev) { + struct amd_iommu *iommu = get_amd_iommu(0); u8 csource = _GET_CSOURCE(ev); u16 devid = _GET_DEVID(ev); + u8 bank = _GET_BANK(ev); + u8 cntr = _GET_CNTR(ev); u64 reg = 0ULL; reg = csource; - amd_iommu_pc_get_set_reg_val(devid, - _GET_BANK(ev), _GET_CNTR(ev) , - IOMMU_PC_COUNTER_SRC_REG, ®, true); + amd_iommu_pc_set_reg(iommu, bank, cntr, IOMMU_PC_COUNTER_SRC_REG, ®); reg = devid | (_GET_DEVID_MASK(ev) << 32); if (reg) reg |= BIT(31); - amd_iommu_pc_get_set_reg_val(devid, - _GET_BANK(ev), _GET_CNTR(ev) , - IOMMU_PC_DEVID_MATCH_REG, ®, true); + amd_iommu_pc_set_reg(iommu, bank, cntr, IOMMU_PC_DEVID_MATCH_REG, ®); reg = _GET_PASID(ev) | (_GET_PASID_MASK(ev) << 32); if (reg) reg |= BIT(31); - amd_iommu_pc_get_set_reg_val(devid, - _GET_BANK(ev), _GET_CNTR(ev) , - IOMMU_PC_PASID_MATCH_REG, ®, true); + amd_iommu_pc_set_reg(iommu, bank, cntr, IOMMU_PC_PASID_MATCH_REG, ®); reg = _GET_DOMID(ev) | (_GET_DOMID_MASK(ev) << 32); if (reg) reg |= BIT(31); - amd_iommu_pc_get_set_reg_val(devid, - _GET_BANK(ev), _GET_CNTR(ev) , - IOMMU_PC_DOMID_MATCH_REG, ®, true); + amd_iommu_pc_set_reg(iommu, bank, cntr, IOMMU_PC_DOMID_MATCH_REG, ®); } static void perf_iommu_disable_event(struct perf_event *event) { + struct amd_iommu *iommu = get_amd_iommu(0); u64 reg = 0ULL; - amd_iommu_pc_get_set_reg_val(_GET_DEVID(event), - _GET_BANK(event), _GET_CNTR(event), - IOMMU_PC_COUNTER_SRC_REG, ®, true); + amd_iommu_pc_set_reg(iommu, _GET_BANK(event), _GET_CNTR(event), + IOMMU_PC_COUNTER_SRC_REG, ®); } static void perf_iommu_start(struct perf_event *event, int flags) { struct hw_perf_event *hwc = &event->hw; + struct amd_iommu *iommu = get_amd_iommu(0); if (WARN_ON_ONCE(!(hwc->state & PERF_HES_STOPPED))) return; @@ -300,9 +296,8 @@ static void perf_iommu_start(struct perf_event *event, int flags) if (flags & PERF_EF_RELOAD) { u64 prev_raw_count = local64_read(&hwc->prev_count); - amd_iommu_pc_get_set_reg_val(_GET_DEVID(event), - _GET_BANK(event), _GET_CNTR(event), - IOMMU_PC_COUNTER_REG, &prev_raw_count, true); + amd_iommu_pc_set_reg(iommu, _GET_BANK(event), _GET_CNTR(event), + IOMMU_PC_COUNTER_REG, &prev_raw_count); } perf_iommu_enable_event(event); @@ -314,10 +309,11 @@ static void perf_iommu_read(struct perf_event *event) { u64 count, prev, delta; struct hw_perf_event *hwc = &event->hw; + struct amd_iommu *iommu = get_amd_iommu(0); - amd_iommu_pc_get_set_reg_val(_GET_DEVID(event), - _GET_BANK(event), _GET_CNTR(event), - IOMMU_PC_COUNTER_REG, &count, false); + if (amd_iommu_pc_get_reg(iommu, _GET_BANK(event), _GET_CNTR(event), + IOMMU_PC_COUNTER_REG, &count)) + return; /* IOMMU pc counter register is only 48 bits */ count &= GENMASK_ULL(47, 0); diff --git a/arch/x86/events/amd/iommu.h b/arch/x86/events/amd/iommu.h index b775107..62e0702 100644 --- a/arch/x86/events/amd/iommu.h +++ b/arch/x86/events/amd/iommu.h @@ -24,6 +24,8 @@ #define PC_MAX_SPEC_BNKS 64 #define PC_MAX_SPEC_CNTRS 16 +struct amd_iommu; + /* amd_iommu_init.c external support functions */ extern int amd_iommu_get_num_iommus(void); @@ -33,8 +35,11 @@ extern u8 amd_iommu_pc_get_max_counters(unsigned int idx); -extern int amd_iommu_pc_get_set_reg_val(u16 devid, u8 bank, u8 cntr, - u8 fxn, u64 *value, bool is_write); +extern int amd_iommu_pc_set_reg(struct amd_iommu *iommu, u8 bank, u8 cntr, + u8 fxn, u64 *value); + +extern int amd_iommu_pc_get_reg(struct amd_iommu *iommu, u8 bank, u8 cntr, + u8 fxn, u64 *value); extern struct amd_iommu *get_amd_iommu(int idx); diff --git a/drivers/iommu/amd_iommu_init.c b/drivers/iommu/amd_iommu_init.c index d5ee17f2..8104d2c 100644 --- a/drivers/iommu/amd_iommu_init.c +++ b/drivers/iommu/amd_iommu_init.c @@ -254,10 +254,6 @@ enum iommu_init_state { static int __init iommu_go_to_state(enum iommu_init_state state); static void init_device_table_dma(void); -static int iommu_pc_get_set_reg_val(struct amd_iommu *iommu, - u8 bank, u8 cntr, u8 fxn, - u64 *value, bool is_write); - static inline void update_last_devid(u16 devid) { if (devid > amd_iommu_last_bdf) @@ -1482,6 +1478,8 @@ static int __init init_iommu_all(struct acpi_table_header *table) return 0; } +static int iommu_pc_get_set_reg(struct amd_iommu *iommu, u8 bank, u8 cntr, + u8 fxn, u64 *value, bool is_write); static void init_iommu_perf_ctr(struct amd_iommu *iommu) { @@ -1493,8 +1491,8 @@ static void init_iommu_perf_ctr(struct amd_iommu *iommu) amd_iommu_pc_present = true; /* Check if the performance counters can be written to */ - if ((0 != iommu_pc_get_set_reg_val(iommu, 0, 0, 0, &val, true)) || - (0 != iommu_pc_get_set_reg_val(iommu, 0, 0, 0, &val2, false)) || + if ((iommu_pc_get_set_reg(iommu, 0, 0, 0, &val, true)) || + (iommu_pc_get_set_reg(iommu, 0, 0, 0, &val2, false)) || (val != val2)) { pr_err("AMD-Vi: Unable to write to IOMMU perf counter.\n"); amd_iommu_pc_present = false; @@ -2762,15 +2760,18 @@ u8 amd_iommu_pc_get_max_counters(unsigned int idx) } EXPORT_SYMBOL(amd_iommu_pc_get_max_counters); -static int iommu_pc_get_set_reg_val(struct amd_iommu *iommu, - u8 bank, u8 cntr, u8 fxn, - u64 *value, bool is_write) +static int iommu_pc_get_set_reg(struct amd_iommu *iommu, u8 bank, u8 cntr, + u8 fxn, u64 *value, bool is_write) { u32 offset; u32 max_offset_lim; + /* Make sure the IOMMU PC resource is available */ + if (!amd_iommu_pc_present) + return -ENODEV; + /* Check for valid iommu and pc register indexing */ - if (WARN_ON((fxn > 0x28) || (fxn & 7))) + if (WARN_ON(!iommu || (fxn > 0x28) || (fxn & 7))) return -ENODEV; offset = (u32)(((0x40 | bank) << 12) | (cntr << 8) | fxn); @@ -2796,17 +2797,21 @@ static int iommu_pc_get_set_reg_val(struct amd_iommu *iommu, return 0; } -EXPORT_SYMBOL(amd_iommu_pc_get_set_reg_val); -int amd_iommu_pc_get_set_reg_val(u16 devid, u8 bank, u8 cntr, u8 fxn, - u64 *value, bool is_write) +int amd_iommu_pc_get_reg(struct amd_iommu *iommu, u8 bank, u8 cntr, u8 fxn, u64 *value) { - struct amd_iommu *iommu = amd_iommu_rlookup_table[devid]; + if (!iommu) + return -EINVAL; - /* Make sure the IOMMU PC resource is available */ - if (!amd_iommu_pc_present || iommu == NULL) - return -ENODEV; + return iommu_pc_get_set_reg(iommu, bank, cntr, fxn, value, false); +} +EXPORT_SYMBOL(amd_iommu_pc_get_reg); + +int amd_iommu_pc_set_reg(struct amd_iommu *iommu, u8 bank, u8 cntr, u8 fxn, u64 *value) +{ + if (!iommu) + return -EINVAL; - return iommu_pc_get_set_reg_val(iommu, bank, cntr, fxn, - value, is_write); + return iommu_pc_get_set_reg(iommu, bank, cntr, fxn, value, true); } +EXPORT_SYMBOL(amd_iommu_pc_set_reg); diff --git a/drivers/iommu/amd_iommu_proto.h b/drivers/iommu/amd_iommu_proto.h index cd2257e..466260f 100644 --- a/drivers/iommu/amd_iommu_proto.h +++ b/drivers/iommu/amd_iommu_proto.h @@ -57,11 +57,6 @@ extern int amd_iommu_domain_set_gcr3(struct iommu_domain *dom, int pasid, extern int amd_iommu_domain_clear_gcr3(struct iommu_domain *dom, int pasid); extern struct iommu_domain *amd_iommu_get_v2_domain(struct pci_dev *pdev); -/* IOMMU Performance Counter functions */ -extern bool amd_iommu_pc_supported(void); -extern int amd_iommu_pc_get_set_reg_val(u16 devid, u8 bank, u8 cntr, u8 fxn, - u64 *value, bool is_write); - #ifdef CONFIG_IRQ_REMAP extern int amd_iommu_create_irq_domain(struct amd_iommu *iommu); #else -- 1.8.3.1