From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1753606AbdBGIlr (ORCPT ); Tue, 7 Feb 2017 03:41:47 -0500 Received: from mail-sn1nam02on0051.outbound.protection.outlook.com ([104.47.36.51]:41176 "EHLO NAM02-SN1-obe.outbound.protection.outlook.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1753577AbdBGIln (ORCPT ); Tue, 7 Feb 2017 03:41:43 -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 v9 6/8] perf/amd/iommu: Modify amd_iommu_pc_get_set_reg_val() to allow specifying IOMMU Date: Tue, 7 Feb 2017 02:40:34 -0600 Message-ID: <1486456836-17428-7-git-send-email-Suravee.Suthikulpanit@amd.com> X-Mailer: git-send-email 1.8.3.1 In-Reply-To: <1486456836-17428-1-git-send-email-Suravee.Suthikulpanit@amd.com> References: <1486456836-17428-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: SIXPR04CA0023.apcprd04.prod.outlook.com (10.162.171.13) To MWHPR12MB1455.namprd12.prod.outlook.com (10.172.55.136) X-MS-Office365-Filtering-Correlation-Id: 36bbe9d9-e2c5-4a02-0eaa-08d44f352272 X-MS-Office365-Filtering-HT: Tenant X-Microsoft-Antispam: UriScan:;BCL:0;PCL:0;RULEID:(22001)(48565401081);SRVR:MWHPR12MB1455; X-Microsoft-Exchange-Diagnostics: 1;MWHPR12MB1455;3:tACSFEjXe9xyD+rkDOPPxBZCJreQ4Iax/cpwbf9SAgS4QXw5jIb10Y4UBZpU7/Q4CijZVHQCHvElAGe0KicNpuX2A/K7TFFOe7AsptXkEuzR8VB6ySRxxw8HmlL79W/DvFTQddfqsE9uG2v3BlMEzuA2IqIKF42lTkw0+cHSZncCrP2tJxjqIJ8Q1n7XJT4j1hTy0mnTnXUQDlBoG182D6smp0ib3g3M3vprpw/XTyTGG0AQE1bJLKuveZf40er5O9cFsBek4lZ74UGDJKUsN5lZK1QUJGO0c7TSKDjZDnM=;25:jp5sRXD3CNI69x+fqJW9HiB/GHLy2YpXiPRIqEG1uC48xftcrV6T4FLkQNvUv7tWaRelyNZXH/GjtpnkuortSbuVYrlAOlLPdppOL/0Tu6IMCD6OZGWmohdXd0Usv5mRss1GqsdJl6J2YduDWYsX4wi0PYM+l41b1dOrErt9ObgRhje1cN5vHp9ntM0NebMYXPNMapdrHENvmm59kerXk9+NjfqT6cgRP9re747vinUIc+H0Nf62OpDwUDXdOJyYT27yufCPpo14xdU7Z2ZayLe852TGTm+Wsa0c084KK8DMRcHKxSi9do/5FzT+X/uWKXiufJkMtzvhlIJuo7pL+XPGeKpRJdLnhbD9mzq1lsR0Nc9E2poGHzJ0W48tYjvfqXf5XxkHDaWRVMfw2o9cyzFhTFdhnI1su+W1BZ5d7tDEzQA1xQQ62+dJGO3DnldU7qlSW4xuvMzuCm1EQLbImQ== X-Microsoft-Exchange-Diagnostics: 1;MWHPR12MB1455;31:SNXTrEgr6TTCoEjjH6B2xnVDIkwXaHVtsBo/8+lTeRmHif3N4bQpiobN/Sa3Gv8AOsMVVCJLO6SiHFddl7kq1iXFfbAcBfFMvq44uxPG7wjuFUYX04I9RiDurbLVxFRJ6hO0CGfkIeD+9Vy1aOsNjAE0CwWYQACb2H7dtkqihCTHZgT5+GA6ZxzFy2TAH8oARPmmrrfOHT9AiHrOVyxck9wy+kJtkBXtiL156H3SkBxUYXHFLMsmhnuZBanKoT0R;20:QkfdBbkvAfqNozcqkzcvD32c/E+u0SYUvJ28RAjR3nlkEqAmBh1v9/Bmkg2RzqJSXu1WX3KhuQENWKgmi0pd5XdH41lhEsH9gl/+Nga7/PdngDAEqoQcLUiDLaNAkXenw0s9epVdtulqTOL2y5aeR1eTWok7Vk1pu9y75oqt+TFlZ4DPm6XEsSNEuwFD/0u3GeH1y0npuIMvR3C2UAAqDe6+RPTMfc4gQ/aGOu9ZrMLm4nv7bckyrpxjAsiVEO1OtSixc0TLdbF+/kn0bz5okablVyvIgMLv/tm16+RbTPAr7vnPYGrT0KAkKToB2gH3JsY7jvJTZvfGIbo8ne1g0QaOTeoUaoWlFZsPp9rqHFHvKCOcZPKXzUNzAHFpAUHQMd4igi7rrBw13m4VwmXNS/re340lHWD/PY+6D2Aay+nH5DlWi9ZnOCYhaIuz71sYlP8v5QEaY6lTqr/kpx/XZul0h0Yv8OgQYGRk09xTK9rv6XIZaf9GeiYZ7aPWYn0K 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)(2017020603029)(8121501046)(5005006)(20170203043)(3002001)(10201501046)(6055026)(6041248)(20161123558025)(20161123562025)(20161123560025)(20161123555025)(20161123564025)(6072148);SRVR:MWHPR12MB1455;BCL:0;PCL:0;RULEID:;SRVR:MWHPR12MB1455; X-Microsoft-Exchange-Diagnostics: 1;MWHPR12MB1455;4:OC5ObYQXPQCgjTGd/7GRQt83FPEVYsBI2M/wPu3HsF8QPn2lHp+5i3zCJKWEuxiJSoRZZCbhxZE3uQ141pmolZ+Grts0edyI+9QkL/F84yk3rUn/6aEZwSKx+fyKj9dSqfJauMQo52le3G0dqUDsaGLN4qRotyN4nwYsDsP3xcfUFumdSXQHMO9wAyTSJetPgwZQsUV2KrdXe2rdAwlClynSZARRDGTldL+5DlZR+9itWjcyGBdJGPIOoJfFfd4i6+ZdjdaSjYK+gON6/b34ohfCY6kyua4FM/Nb7Ty7WOAKVgDC1uP/q1+qReuWyveFVKDhG2qkLSAFPNie7iTwp2JjJXDl8lw65x/6YNIbMSGMLSs6rlkUUKKtXBrFWATJglDp7+j5QsBBZZJu/45eCIg24NYrp9gT3OxSkIhVb+N8gWrYv+Q1k4gZwz9jovUu0WwkKgHduKdbEe/RrHGxayb1YuZ3xEx2H/zKfRmgkAAvpLaNzNBItrsV+FEOpkYoF9FvCan1NTdwEcIBU6BaJ/kq058UzRyCKfcUVpJuFZ5bvhFT74H626UrYa5RbQCG7ajNDou+wnZeID8h/IR8sD2lm9QIb8LXv20t30QLObb8qPt9PbDrXy7YI6XiouLeAySXChecPjnawwIy4V16/8VRyG3YFJJZiEFnuCzeZ8l6uMYglXZwVvQhBZGVBYstPUkKKaJ7qEd2hhfnuZGlOMpklr7Jz5hs18G3enmcZRU= X-Forefront-PRVS: 0211965D06 X-Forefront-Antispam-Report: SFV:NSPM;SFS:(10009020)(4630300001)(6009001)(7916002)(39850400002)(39840400002)(39860400002)(39450400003)(39410400002)(189002)(199003)(25786008)(38730400002)(5003940100001)(4326007)(6486002)(305945005)(105586002)(6506006)(7736002)(81156014)(92566002)(68736007)(2906002)(6512007)(54906002)(53936002)(8676002)(50466002)(81166006)(36756003)(42186005)(106356001)(47776003)(6116002)(66066001)(48376002)(3846002)(101416001)(4720700003)(2950100002)(86362001)(97736004)(5660300001)(50986999)(76176999)(189998001)(50226002);DIR:OUT;SFP:1101;SCL:1;SRVR:MWHPR12MB1455;H:ssuthiku-rhel73.localdomain;FPR:;SPF:None;PTR:InfoNoRecords;MX:1;A:1;LANG:en; X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1;MWHPR12MB1455;23:oRkve6q5VsRf6y5Ka3HuOEDTxxOvZBO5gJanwUF9w?= =?us-ascii?Q?y6GYsCp1KedR/iCNe6zyBiDyhRJYll7kZHHZYlpYXXE5p8qZvZgmiQcKCG45?= =?us-ascii?Q?c/DUVoHLivYkv9sIETTtNIdlF7RX4eSK0kn4bVITFWLIPMiLXiZC0NZjezJ7?= =?us-ascii?Q?/JmHdK0gUD7oHfEKPdIHdQbVN5YUL15eWCsiYzvQ2avtqnLzmCMcsc3L7Wnn?= =?us-ascii?Q?V36NcIemDCsNY+ov0dmyKYNCBiWvTcPgK+Grxiu5RAV7M0RhTKRROAldJuT4?= =?us-ascii?Q?QFG5N3OgFl3TEVOfZ/KN8A5mzA9ts9DBeS2h0TCLIlT+fbdDNK3xtx5D7VJZ?= =?us-ascii?Q?pz5H51Wn8tA1ADD8BbljaVBm4NnBNZiSWLlzTCw12tuWOZNcGyPxmH/dd2h1?= =?us-ascii?Q?sdnIDNWUmVKRhyM3Ivb6UXgaNrLBZu2OfTd5vMkgDx/J7ASGUMbs+tWTXUIr?= =?us-ascii?Q?8ztTmQtZ3tHlhD1LQmUbHbB4kR4a3t8a0qcnfo5jWv2QwUk6r7Kb5aZpjSgd?= =?us-ascii?Q?NikW0i89bhC+kSwiMfPnapevT/lfG4fcgRtwvyOLAdAzvJxRECar9Y6GKnVT?= =?us-ascii?Q?ACHTFfVNJCRaDlHZOCzfZFu9wcpcOqWDxWVVP0XNZJ0FzCXUqFSXz/fhWCFJ?= =?us-ascii?Q?ahvl8KRNpcKz6Nc3mJ96gJ2SjtcR3mOmZ9pNhhTWRz4zxtYIbgqmWFGz4NKo?= =?us-ascii?Q?0v3jzMdXGJ33w05MbNdi5PD+rX6y5BoGOlhKa00EFMG0qgn0U407dMS0wsGK?= =?us-ascii?Q?aLAoIP6mEW4ytb7CDHxgb7M+E/6Bezjiy+qNKUxqlmKyMaGnv5eydwt3L21x?= =?us-ascii?Q?7yZADuCmS9upyoVygNr7VHP8jU7ANzNN5AVOWvtvcIK+oJczurJZtgK6vjrT?= =?us-ascii?Q?iDrCrt0lZniZFy7JJqwyvP09myLCmOvMb7PJMgDroBRA0XH4oUtq8ZrcGuZw?= =?us-ascii?Q?uGLAeASrUhnzHrPeR/eo59sQnaYS5X6c3U0S4MflIspu7GN3eXFSLgOMiWiD?= =?us-ascii?Q?j+csSGdBuK5cAlPlgW77cUIfcKOlSlpUsFw7Hma+b+0OYAcki4MO/9enntsj?= =?us-ascii?Q?TyKBOEB3E/+CXbwxLgDq903q99NXGY00JQYlHM8ztwCEDNAGr3Tj2huWRU9F?= =?us-ascii?Q?Ek4m8OefmpTbfddtQ8Kj4A2NJJUQxpilpIHU3/qvAQoPuJhIgtgGA=3D=3D?= X-Microsoft-Exchange-Diagnostics: 1;MWHPR12MB1455;6:md8W02bIHSl8fyEUpJ0IcURa/WxOmTjdvNpOBx5QF/7mMMbd5olYLg7WOlBDUNk2HuANNB003sBorSweQ+r+Mmn6kU5M75bwJLKNhoj0l0boQG9d3F8rrE4jRMB8TMN+/VuleOZYQHh4hXw2dnJMs1joDGCos4iJfx9wIrBTEggzM/YqWUqoIpB/QBVQqW/gi+9mWKQOJXEY2Is6GIPa0H9+QCaoSqd1Ox2fHlx1++OlkTR9pCXZ2eBJJFh9ESD8Z6ZKzywQoe/mHJmVZx6s1h6B/2RwLcpxzeIAvfpepgQv4024BBjiSoRdvlJbBgBM4zoAGfuF01dtEMuYT7nJC7JAL4C+vZniFX3WjpNrb6YUJqGhZgFK8GPuDSrEKIxBpXm/3eBv+sedgJSJ4c5RwtC574Vz36AJuaFgt3fKVuk=;5:spLyDk+FLDvWCWj7FNGfESTz60w+sAhcyWNkbJRTvIAx6mDfFivp2kNuo1l+Mu3sqHzNf63msdtmoI1kG48OKxOskb/B5bSH34XfNpqKegGqW32L7RhXBFHfu6KjCh+RNte/eQOVyARbemDv9UHix6fQGwHeZUYxwomJN0XfD2k=;24:WcYv9KYu030xG3fgufmcozWUje42IfYNE73DHDjDRPpkMMVNeJhhH8nOuZAZ8gG80KRYrcV+jT/xVcreG75VrvIc2u8UIOB+YpSfWtA5/Sw= SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-Microsoft-Exchange-Diagnostics: 1;MWHPR12MB1455;7:bk4tyCkNw51t7yPtqcZjXnsFlbeF2TH7XS6gNe6Fs76vmMFa+cydByHN+HGkxc8hRcKAL6jh11xClb6KaRBcYEklMJyXrDp7DBCqamofKT4v9xyyNOkFcUt2/lFDxMu+4KBKY0yhFLXZ7Vaa6Z7csLpBcalpgm57Re2tD6XfmmbcOGe8dx+g9qfirEwIgoRC86xoaTR1GNPTLPDOlPhTccnwJZ9pHBepSnNCZhqxO+xHM2o8IMPB2FKrmvHWCE8i+vJ03cumqZIZKC5seG7aAStCRH60mS2ycWXV9AGbKrkarH3ae3cGsQw66z4K3hSSd5ZxzC6oz8Y4QcA6YugGle7tF2Jg3GV00ODtubgCUAjR+mzkuUzF6+FxlKcRWP9G117SSEQ79bj2QqUaacrMaGN0SnuiKsIfgtVCS5tPILJCT0K0cCUDS4VT0EijWvtnqQkCot091nGAIAMPHdJ5kWXscT1ZukMRKLE8mLAPHYMYcgANiqZSyQO2jp31/W3sKLu+YuTgT4A7R+hmdFqKDQ==;20:wG7VxhugxmMHTEYw4oK5vFetzBO7gL4/98jqSeLn6iu5sluUVIUN9gZBmNxxeN8C++IcXsFtOylK5i5JT4cwldW2fwp5/YiI0dZW6p0a9+GBUk4roLrcxwdcESNqiYEozhJ7mv8igD57bJ0wuixovWP2/V533PIluOaXq0rFHHxb76Wauc/4ZKOGDt23nVCafH0fI9sOlfV3341KEbyeY8LmJAqHoeOnrJrb2V+tp1nrN6Ic87TESAJ2lt8rreNJ X-OriginatorOrg: amd.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 07 Feb 2017 08:41:32.2652 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-Transport-CrossTenantHeadersStamped: MWHPR12MB1455 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 | 56 +++++++++++++++++++++++------------------ drivers/iommu/amd_iommu_proto.h | 5 ---- 4 files changed, 56 insertions(+), 52 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 eb654e7..a50ad65 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; @@ -2765,48 +2763,58 @@ 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); + offset = (u32)(((0x40 | bank) << 12) | (cntr << 8) | fxn); /* Limit the offset to the hw defined mmio region aperture */ - max_offset_lim = (u32)(((0x40|iommu->max_banks) << 12) | + max_offset_lim = (u32)(((0x40 | iommu->max_banks) << 12) | (iommu->max_counters << 8) | 0x28); if ((offset < MMIO_CNTR_REG_OFFSET) || (offset > max_offset_lim)) return -EINVAL; if (is_write) { - writel((u32)*value, iommu->mmio_base + offset); - writel((*value >> 32), iommu->mmio_base + offset + 4); + u64 val = *value & GENMASK_ULL(47, 0); + + writel((u32)val, iommu->mmio_base + offset); + writel((val >> 32), iommu->mmio_base + offset + 4); } else { *value = readl(iommu->mmio_base + offset + 4); *value <<= 32; - *value = readl(iommu->mmio_base + offset); + *value |= readl(iommu->mmio_base + offset); + *value &= GENMASK_ULL(47, 0); } 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