From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751560AbdAPHY4 (ORCPT ); Mon, 16 Jan 2017 02:24:56 -0500 Received: from mail-dm3nam03on0065.outbound.protection.outlook.com ([104.47.41.65]:26816 "EHLO NAM03-DM3-obe.outbound.protection.outlook.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1751522AbdAPHYu (ORCPT ); Mon, 16 Jan 2017 02:24:50 -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 v8 6/9] perf/amd/iommu: Modify amd_iommu_pc_get_set_reg_val() API to allow specifying IOMMU index Date: Mon, 16 Jan 2017 01:23:33 -0600 Message-ID: <1484551416-5440-7-git-send-email-Suravee.Suthikulpanit@amd.com> X-Mailer: git-send-email 1.8.3.1 In-Reply-To: <1484551416-5440-1-git-send-email-Suravee.Suthikulpanit@amd.com> References: <1484551416-5440-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: KL1PR0201CA0003.apcprd02.prod.outlook.com (10.167.53.141) To BN6PR12MB1443.namprd12.prod.outlook.com (10.172.24.20) X-MS-Office365-Filtering-Correlation-Id: 1b23b6ae-fc45-474c-a261-08d43de0bd79 X-Microsoft-Antispam: UriScan:;BCL:0;PCL:0;RULEID:(22001);SRVR:BN6PR12MB1443; X-Microsoft-Exchange-Diagnostics: 1;BN6PR12MB1443;3:iz4JuoIlqRCGxDoZ4hJzcsQ1B0A+Z/ntkBcrI0+hIoFPOmRLXxpn46ECU/p8+ztY7joHUmJa+TTEot7lUgj/jOzBi7YlCOTDVqVLDzqFUI9FyA9oHek6GNLvj+H45oDjHJFeNSBsTU7n0OFIJffXrNf8nJHdM9BSgDA1iNDQSQumal8RCR2LVd4avY7W2IaLxLIowoTdxd8pwdIGmaH0drl1ezl/2ieLB//eDRvKzh5s/gZ76o6YLEugRMPB+0Q0UY4s1h8C2nkOrM/bmIEH/w== X-Microsoft-Exchange-Diagnostics: 1;BN6PR12MB1443;25:+J180FvmE7yvM1+420/RwEtw4LZWN6cqdf2TUWFzU0I7hHcC86xhOoGLoXWkryfLpwVNvVdTTnf7HmYTh8aBdftpdAwWYB0dsxcd+vVe3Ul6vu0W3Bd0yjIqVYX1Ir8yPcaFwmbORrByxpAls23Abusgs//aHR53nD7vhS6zMOvne/0joHq6s7Sgu0A0SS7KyxgszBgscbSw4a28mroIPxcn/OSgW5FnOJx0zcI193fW6uHJZhr7XoVA2quNVZlpOP7twkTn9cQw2PZ+32D/PlIKKQ4vtSViWwa3D1wgvMOIru3iK0DuFsMNsdhaqzAh8CIAjxByN/vc8lhEyD19a7pcOv65qT5DpRHEaAqSysFAsUxqFoZLarWoo/cdCBO77loFmUV2wXrfgRfQAaTdIauelxbd1FvFlGUXh8jSJriqAhNFFPYPxPsdRBNR+3a/CwrJQXWr+c6UXRC9F0VKbFobmQJaX6hnTN748PFC3oEChLysPOZmLGO/2UDmy/ExvEF6rNJv3Ucps3Stn/ylbFSDAaK5YYK7hdfR3kYHA+cmZ005Oe9dv2WVlQJ3K0xtKZYUPhukvP6tDja4GcWcCnJLAzks0V4RBwTUUmW0YmsRilMpCPqfCWNHXkT1Z9pfDgyRSkmJFXF3Sa7BV41nOUQWmnm2fEBKWwRVZoBPewcMtlh4vPl2MmHpDj+Q6Pn8EmpeJNkdm+bbNsWAThCsthofCO33ehfEyoAuvIegK0Xe3RmxDtC27K/Luyhli4272rSWTSewOhpfgpKO+ZRFdg== X-Microsoft-Exchange-Diagnostics: 1;BN6PR12MB1443;31:3iivzDAJDi8xk9vP+p/tFEE/mx7+for33M5e1fPeHErWBXPMO34NDojr/1ch0TKO9sTEScIdx0YRQtjM4Dt/FfsLWRv8xajJGJqC5WNT6vidAT43TRRt4WB4o4valxXcUD+QM2VIOLocOwrcZuaXJCGM9vaLdzhgslXaCavMxR6QcfkIwzYth78Cdemj864NMutdBYWFncT4kTbGC7S7vUT+578sU70Bj+6z51LiX6vDiFii7I7n2DmDYZlj9u1ETPLR/pa0ucXZbT5pPmJoZA==;20:DbXBIM7zKTpdw7537sAmCZpm4V6MKv7TlxG5lFP1GrwBjXTZZZFJd4HnhTe+PQh4fV9xht1OiTVIulPVzG4ljOBKmlxQ7x2MPYKx7+nWR+TTOQXqULNxROrdBFRw+JXuZ+kxAWCsvkYf9hsJxmvspc+HdqJ8B2VwZlLseNFAfITQBJzZAUx9wCYtjPGguwLcMAWMB6RSUiDLYQ9w8F9ak0JU/ktMFy06wEBVOKjNMgLUNaFTiP6uoozzdFZmTyLTBSVl7b0J4O4axIiwhpG6+0hXMmfSz/A/CLnMRA0JXJW2u6xRneqkA/HIiuPhOoR/4Ia7Ju4tcLwE2pvQ3VIxPRPgbKyVoEdMB7jRbMmkBZs7uu8yaWL6cON8u54nyIJbQ4i6whzKequdJkt0VYD7Wn6qONX18HTXypFKYhLvWg1u+f6O61SfY+pORIwa8VEdZB6CAzsGQjSdpfWTep1F4OWvDc0ayQ1/nap8mIhNS80CajrqG5mlkBAvABOVEhe3 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)(8121501046)(5005006)(10201501046)(3002001)(6055026)(6041248)(20161123555025)(20161123564025)(20161123562025)(20161123560025)(6072148);SRVR:BN6PR12MB1443;BCL:0;PCL:0;RULEID:;SRVR:BN6PR12MB1443; X-Microsoft-Exchange-Diagnostics: 1;BN6PR12MB1443;4:HHId56xtW2GuRPemBhdbPUuhkEUr+GJ//u0JIOc2erhQ3DF+PNw8h5/EgIpWzJHMCM0artcRlQmUFMOrzmRMljf/zEZxMFQapX/WYuICGjQQRpelqCmukn5RhjnmtL4bnVGpoh6pVD62enueVLAu0XlmZUgCPTw9UmfGCUXwq4hsXySj9AxdjZmTiAYIbc48piLAB3kd09QoLvi0HcXWgAuIc/GFx3e42TQ1HP0LhmCT5evzOldHf/PLyjEhz3fp2flaQTdoCik6sedCbI821Lkfl4Ogkj68yoaJMiaS8yNAX96/6d595kUiUO8HDJBRD5iWqSKDbyy4pcNJ6Hlcs4RG+qHYhL8aIBT+oj/ruWSCpQAnpH0SaiR9rm3ssUOPgtGS3vjbaKltHblY15oN8CYo09L2gSPgvk0nhq89tug8j/JLrsiHykuCyoSmzpCt4s3dAskI94v+CK9HPDs1mnAI1vBefHGobO+PkGA56ZtnmmzxA/jkneNjn2XZIMVS+wleG+6iPN87XNrn+CwhxJldrTnUPbmF/KdtCaEKFs2uDhk6avu+v+JTI6VBPhfBUnU9OFxJAcKYkm36s9Xu5oN6m5D3On0MEcT4C3g8ofBzRWzw5U3JWS21FxgVH8pH X-Forefront-PRVS: 01894AD3B8 X-Forefront-Antispam-Report: SFV:NSPM;SFS:(10009020)(4630300001)(6009001)(7916002)(39840400002)(39860400002)(39410400002)(39850400002)(39450400003)(199003)(189002)(2906002)(6116002)(5001770100001)(86362001)(189998001)(92566002)(66066001)(68736007)(97736004)(3846002)(6512007)(305945005)(7736002)(4326007)(27001)(42186005)(8676002)(2950100002)(81156014)(81166006)(50226002)(106356001)(5003940100001)(105586002)(50986999)(48376002)(38730400001)(101416001)(25786008)(6486002)(5660300001)(6506006)(4720700003)(76176999)(47776003)(54906002)(36756003)(50466002);DIR:OUT;SFP:1101;SCL:1;SRVR:BN6PR12MB1443;H:ssuthiku-rhel73.localdomain;FPR:;SPF:None;PTR:InfoNoRecords;A:1;MX:1;LANG:en; X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1;BN6PR12MB1443;23:jvr7cv+v46WgORgs9noXTYvyJed3CFbzOcm0HGwtZ?= =?us-ascii?Q?odZnc2PGTlbpyrPrvuEoOCJBQc34HhDlsGvh8WABgOVottsgWWBVBnya+DUW?= =?us-ascii?Q?EVgzoIB5lRJBuoqf7bqXLmyR7XEdfxRxynfU9NJTrcrgnjfthcHYHue+psk/?= =?us-ascii?Q?bffW8S4WDzNLpDPhuM4+OFyuP1AVqutyjM/l4zRXiCXiUUg76gJXtS8QG86x?= =?us-ascii?Q?EwWqyGpiRtEjesOfXtWICus2SknfyMq1gnFmG2C/84dmGQLJGE7Arn40hTfm?= =?us-ascii?Q?nUlwlUOMsfTLGiRvluK3kC1qiSJK4jmXP3V9OwlZLlVuMkQIZuwvgvtsZQed?= =?us-ascii?Q?HVmwNd+FB8ngUOeSbO4SMVBZHCUXYQ0CA4SBePSUzvHDBWA6WPxcxiuHnwSo?= =?us-ascii?Q?6TXaKVGzF3UAAXpLy1Pu8GLgj4D7ORpGWPhSHgvS2obWor8njmfW1exuQ44o?= =?us-ascii?Q?ZYoPv7ySk2RvWCbO4UCNjiGOBFWenka08vuvQENUliwndPY1lB1490OdCTpy?= =?us-ascii?Q?XwWJapHi5iBU4itGsn5TN9y411QLQHZAZSEnjwWTJpOOCiiX11DjHy6nWqD+?= =?us-ascii?Q?5yCcBzHWVhEOjPYKB+V6WlJ44VAJMP5x+8onSvMuLyaArM0sigA30s6O2REF?= =?us-ascii?Q?uoWY3/dtuJx/gi9qROIVZKXlNd3FEeypCMrmPhr0UCecc2pQcrSDkMOR+V9X?= =?us-ascii?Q?vwgM3vkLl2r3LGiRBRzaqHur/u8MxHX3oQzn7cX9/xEuTsPc60IivRAAPnLA?= =?us-ascii?Q?P9evk1WWp1YOZ5KLDC/nsyHWw4Eb693Ixo8oggL1I8y5RRNfocLmNuZ7Y21R?= =?us-ascii?Q?kpJkyDAJykyc0wGZ36/Sw4QNVVthFlnI1CbNe6eS7bEiWO9TqIaryJ+XePaS?= =?us-ascii?Q?Lzz62nT8NPyb8+3OYNcQxYTg9puU4dhp+9bcNdoMEIKwZReD9GvxvBQrZSfJ?= =?us-ascii?Q?W9MeQE8jmcqjWZjA1GhIwIAIEcqJJzz1SecSIyZ29wfvKJPXFQ6cWK9xmgmX?= =?us-ascii?Q?e3wH4yK5Iwg2NDDWkF0mm6hDciqOLnHehe1wK45YRsB81Q5FdA3ihicMLebr?= =?us-ascii?Q?jPsGB6D7JxtMuenOLvDyIEIfgLptQ2IgC+auwbm5h6KuMvfF1UEKYnCm7uKX?= =?us-ascii?Q?1ZbvqsD9flnxHnNKWpaRu3L98Z4x7bvhcs/Nz7O4pAyCRxSG4pnv4j72+0ap?= =?us-ascii?Q?vXJ1yuQt9rxfpE+qxPUc9uiUyoZWkMdEXWJ?= X-Microsoft-Exchange-Diagnostics: 1;BN6PR12MB1443;6:fhYWktZ/Xo8TDP4ciX7a0UkIqWGixRMFzX1cpjqmd8+pdJqJc7+NK3orq3S/rSW/ZWr210QI18tT9C1xmZNABO/n1yPZC9NvRYusET/ArhZMNCxC0xRBEKBGtrPtsTBphfuMMNM6RiGXQVmoikAPBUig6agJZ374Cmr4tprmOx5Qh/J8U/zcCi2F6iT6X5cwDEbJDj1zCb3NgcYEMoXJUqS+6kZ7yhYWdePl7vILuYuI8CZDl8GyY+JD/9Pbilz8ut0WUxTQ903zGX9OffiisblhgtgDromDhFT4qeT7LkMmLAa93jMZJQ7pUtLUEA1pI5kMwwQXBriMCpfuvpUhbdcAzUBq4/Cwtfacqls+rV3f6fRrACUfYOUDBCep/84RKDE5Cgyzl9YZZB3m9scl+IpYZXIC9XsZrcPwgqP/ch4FQXoqqZTRCBJXGTZ3k7UN;5:nC5LWOEZKO9Am7vXxj8U2wkfw0kdRFrePiHRwvoZsBJUwVG81LwY9qLDur4x0+LUUJoQg04No/eiyB6ZEVmlscq0IM8i2tghD1QzXxMQ2+4INj9kaXk6+W7WX40ASXqKONvI3ZsJEcYHF0+abmdTIdJawFEuiM4FXvwYO+aOcMc=;24:RFQomcM8V9zQ/4sqCbDyfcDBXMdEw9lHfThR8JDTI2STo1LXZekN0+xTBKIRDUt5uaGKmCTs0jWWalp6SmDRSZ+ZbsL9yWM2KmzmbpsLyyY= SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-Microsoft-Exchange-Diagnostics: 1;BN6PR12MB1443;7:rGJEkVXkEZdAzR6ceuw9CpkXbVjCFQIbem0qTvMVDc4R3WeTX/W8HeJt6YtCBwH1fEwCnbee9hE9Pa5EmW/b5Y/xifuRtD6JHzbUdHQwvBbpZjFRfCLkcFzzLV0Zjau7CKlxeYylULUpR5LOCpnEna3mMYWEyVlgdGXYjNo/A6vA1X0fgoCiHF4BpEJBGvEfbfL8QwGnOoQpw3KHrw1ci62hGk1rHZBPGKWYV3PBiAvhLTIGU6uOJOEhEp4XR9zYu5hpuZ1jgURvq5BfmRxng08WonwmvdswmLgxMLjg5T0L6coCLnv6znod6QZNv+kWvd6K3g+thImlmwZ+l4U/vkzGi/DyAdiZW20u73mojWPDKcaS7DQm1pGEfIceD2O6viwj0VNHip7aBr4p4zXBILmi7jycKjVLP+a3GK2iICfvpayYR8fji6n1/UJz1aoEnxowPL3NzrtPaOg0vJLEkQ==;20:I38mdf4dQXEF+S+cHcwT3G0GaD96xoHnF4SEIDIvtHhjAEugq72bRaVotNHFAoj/kB4MgDrUokYbsWyzYQctd7DZnF+Fthduunfkof5AXtz2+xu/hhPtDtxj09oFIvzubwTwwLq+D+HibzqME19Yn5/3FNE8J3HBrhUfKvt9S9dZDOcMOrO9BJ9pnoMxrB53LHICKSIDlxHmnR94tPFINxPxNby+LM+hAPOMUc2xQiGXc75QXfj33S8DcBvocDB1 X-OriginatorOrg: amd.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 16 Jan 2017 07:24:34.7159 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-Transport-CrossTenantHeadersStamped: BN6PR12MB1443 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 It is also confusing since it is trying to support set and get in one function. So break it down to amd_iommu_pc_[get|set]_reg(), and modifies them to allow callers to specify IOMMU index. This prepares the driver for supporting multi-IOMMU in subsequent patch. Also remove unnecessary function declarations in amd_iommu_proto.h. Cc: Peter Zijlstra Cc: Borislav Petkov Cc: Joerg Roedel Signed-off-by: Suravee Suthikulpanit --- arch/x86/events/amd/iommu.c | 34 ++++++++++---------------- arch/x86/events/amd/iommu.h | 7 ++++-- drivers/iommu/amd_iommu_init.c | 53 ++++++++++++++++++++++++++--------------- drivers/iommu/amd_iommu_proto.h | 5 ---- 4 files changed, 52 insertions(+), 47 deletions(-) diff --git a/arch/x86/events/amd/iommu.c b/arch/x86/events/amd/iommu.c index ec7e873..200d2e8 100644 --- a/arch/x86/events/amd/iommu.c +++ b/arch/x86/events/amd/iommu.c @@ -250,42 +250,36 @@ static void perf_iommu_enable_event(struct perf_event *ev) { 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(0, 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(0, 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(0, 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(0, bank, cntr, IOMMU_PC_DOMID_MATCH_REG, ®); } static void perf_iommu_disable_event(struct perf_event *event) { 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(0, _GET_BANK(event), _GET_CNTR(event), + IOMMU_PC_COUNTER_SRC_REG, ®); } static void perf_iommu_start(struct perf_event *event, int flags) @@ -300,9 +294,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(0, _GET_BANK(event), _GET_CNTR(event), + IOMMU_PC_COUNTER_REG, &prev_raw_count); } perf_iommu_enable_event(event); @@ -316,9 +309,8 @@ static void perf_iommu_read(struct perf_event *event) s64 delta; struct hw_perf_event *hwc = &event->hw; - amd_iommu_pc_get_set_reg_val(_GET_DEVID(event), - _GET_BANK(event), _GET_CNTR(event), - IOMMU_PC_COUNTER_REG, &count, false); + amd_iommu_pc_get_reg(0, _GET_BANK(event), _GET_CNTR(event), + IOMMU_PC_COUNTER_REG, &count); /* IOMMU pc counter register is only 48 bits */ count &= GENMASK_ULL(48, 0); diff --git a/arch/x86/events/amd/iommu.h b/arch/x86/events/amd/iommu.h index cf3dd05..cd70921 100644 --- a/arch/x86/events/amd/iommu.h +++ b/arch/x86/events/amd/iommu.h @@ -33,7 +33,10 @@ 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(unsigned int idx, u8 bank, u8 cntr, + u8 fxn, u64 *value); + +extern int amd_iommu_pc_get_reg(unsigned int idx, u8 bank, u8 cntr, + u8 fxn, u64 *value); #endif /*_PERF_EVENT_AMD_IOMMU_H_*/ diff --git a/drivers/iommu/amd_iommu_init.c b/drivers/iommu/amd_iommu_init.c index ed21307d..5b7fb6c 100644 --- a/drivers/iommu/amd_iommu_init.c +++ b/drivers/iommu/amd_iommu_init.c @@ -253,10 +253,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) @@ -1481,6 +1477,14 @@ static int __init init_iommu_all(struct acpi_table_header *table) return 0; } +#define iommu_pc_get_reg(i, b, c, f, v) \ + iommu_pc_get_set_reg(i, b, c, f, v, false) + +#define iommu_pc_set_reg(i, b, c, f, v) \ + iommu_pc_get_set_reg(i, b, c, f, v, true) + +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) { @@ -1492,8 +1496,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_set_reg(iommu, 0, 0, 0, &val)) || + (iommu_pc_get_reg(iommu, 0, 0, 0, &val2)) || (val != val2)) { pr_err("AMD-Vi: Unable to write to IOMMU perf counter.\n"); amd_iommu_pc_present = false; @@ -2762,15 +2766,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); @@ -2793,17 +2800,25 @@ 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(unsigned int idx, u8 bank, u8 cntr, u8 fxn, u64 *value) { - struct amd_iommu *iommu = amd_iommu_rlookup_table[devid]; + struct amd_iommu *iommu = get_amd_iommu(idx); - /* Make sure the IOMMU PC resource is available */ - if (!amd_iommu_pc_present || iommu == NULL) - return -ENODEV; + if (!iommu) + return -EINVAL; + + return iommu_pc_get_reg(iommu, bank, cntr, fxn, value); +} +EXPORT_SYMBOL(amd_iommu_pc_get_reg); + +int amd_iommu_pc_set_reg(unsigned int idx, u8 bank, u8 cntr, u8 fxn, u64 *value) +{ + struct amd_iommu *iommu = get_amd_iommu(idx); + + if (!iommu) + return -EINVAL; - return iommu_pc_get_set_reg_val(iommu, bank, cntr, fxn, - value, is_write); + return iommu_pc_set_reg(iommu, bank, cntr, fxn, value); } +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