From patchwork Fri Jan 1 18:13:40 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Suthikulpanit, Suravee" X-Patchwork-Id: 59101 Delivered-To: patch@linaro.org Received: by 10.112.130.2 with SMTP id oa2csp4081488lbb; Fri, 1 Jan 2016 10:25:55 -0800 (PST) X-Received: by 10.98.10.137 with SMTP id 9mr92309276pfk.37.1451672755657; Fri, 01 Jan 2016 10:25:55 -0800 (PST) Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id tq1si35426533pac.125.2016.01.01.10.25.55; Fri, 01 Jan 2016 10:25:55 -0800 (PST) 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; 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 S1752545AbcAASZx (ORCPT + 29 others); Fri, 1 Jan 2016 13:25:53 -0500 Received: from mail-by2on0075.outbound.protection.outlook.com ([207.46.100.75]:54991 "EHLO na01-by2-obe.outbound.protection.outlook.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1752393AbcAASYj (ORCPT ); Fri, 1 Jan 2016 13:24:39 -0500 Authentication-Results: spf=none (sender IP is ) smtp.mailfrom=Suravee.Suthikulpanit@amd.com; Received: from ssuthiku-cz-dev.amd.com (165.204.77.1) by SN1PR12MB0446.namprd12.prod.outlook.com (10.162.105.14) with Microsoft SMTP Server (TLS) id 15.1.361.13; Fri, 1 Jan 2016 18:24:34 +0000 From: Suravee Suthikulpanit To: , , , , CC: , , Suravee Suthikulpanit Subject: [PATCH v2 6/6] perf/amd/iommu: Enable support for multiple IOMMUs Date: Fri, 1 Jan 2016 12:13:40 -0600 Message-ID: <1451672020-2150-7-git-send-email-Suravee.Suthikulpanit@amd.com> X-Mailer: git-send-email 1.9.1 In-Reply-To: <1451672020-2150-1-git-send-email-Suravee.Suthikulpanit@amd.com> References: <1451672020-2150-1-git-send-email-Suravee.Suthikulpanit@amd.com> MIME-Version: 1.0 X-Originating-IP: [165.204.77.1] X-ClientProxiedBy: BLUPR01CA041.prod.exchangelabs.com (25.160.23.31) To SN1PR12MB0446.namprd12.prod.outlook.com (25.162.105.14) X-Microsoft-Exchange-Diagnostics: 1; SN1PR12MB0446; 2:vk8iE6DLMqAqmx5o7yJkzfXrGWtVzhzcTU3C9l9TzBPeV6x0SoOSQ5G002REvqGD7WpsSRWwkl6zEKITS7BM892zc6fGiwCRGVkAMThyn/AvIZAGMgsUP+mJOM03du9rj0Hl+FqteewgiCoEl1C5Og==; 3:1wfWPKba2QLM1it6/GP5vBIYiCRK+EIc9Z2TAQeqXhEFF8nESwS/Q7AOf8+sDOvtvRuMUrs7XUahO9A/zCfIQAfEBM/Fom7yDNmRKgUO8J+Z5QtGTY0a1B98HRcNSmlU; 25:roqwM7YrRHyeIEiEwv6qab2j0UNWGe1VAX5JI82ppf5iuzWEX8ISrU9dmMfP/yTVbpnMxQpYpFct4AYmxVGihSBJVrPTagkcx+u+8MCUtzT9eHjzjKXyKBL3roT2UupCmSPePkItLkw/fi3hAr8gKiNDA63z0Abu4jWTMSoJJ1oMymCwG/tPrt/kAAaJiAaBuIJA2uFR5fifcvHj7I5eLhAxFOCsgcgGi5STLAanPyVXFXD9A540o0GvMAnSyS+B X-Microsoft-Antispam: UriScan:;BCL:0;PCL:0;RULEID:;SRVR:SN1PR12MB0446; X-Microsoft-Exchange-Diagnostics: 1; SN1PR12MB0446; 20:j8GcON5D2W+mDx/Q6P6h6qz5RE9d1Xe929eFZKJAPe3nIfonq68foP2gN7wu0m7twhFSVpqV8ait21/XQ5PPqy1wtHhYR2u9yaT/92y/grOBbDy+L3nLCiWvxkFkNzuAkFWJz5KzkXYzYxRBSEBSGM8duphOrxS1FojaOW90exSf4xo+9IfwFAQv2vcR+bzaT+idJwU/PQ/ugQWAPILYp1OvrGxRgZb+5Kde/aw6IMOeNjtmNaJLu6rWobzqJaNS9LVRMRNyv/B6APhfMty0xWvAmsL9bB6WmWP19IQDi/Bzi0+8zPs9JiKeSJKJ8kiAe5I/s5FP5j4v5FelxOoSvntx/CiCC7eIoJZX7lQ8ov0nkGZaL35kGX2Y8DMzas46yL3y/LfNBuCF/jbf3pn4FFleXhTlVVScl+/g0yOCH5RhxNYNw66V44A/B3OyFo3iyQVBqaKDBlLWvGugQTNd+vIhoBgkd0Zus2XEXUU3T/PNGsMS+7c060BtyWJOBzxD; 4:4PmocgvWxddeRiFgeubm+CCSTPrzQDtRaR4ASKEU0ZS1rs0NZQTDr4M7jIlwaxtHmk9tlbIOugbSJ5wyTQP8S/7m3WZyimRCFxALNTZK4eXdCCrEcCtBQumeAE5pQwytgsfU+KI8bI5VnlF4zbhAx9q2cRGgTQAtNGdfeb7y1IuW+SIi4Qs+GyCjlO3UCdLVYVVun9DsW8PWp8jRCbdkS816CTPaf1MrhieROqLX6AsgvjQEXeat/Hn8sYKq47xeUDMPdtMLzpFvjIMagZdyMDygJj2ZJ4fbz/Sb+WyHAN/AeLLP5ozN8eefJgF29uetRgOwcBZvxj1u1V08Mfumna6ea8HxsCyrv7+HEMijT5AXaSQMHOu5IBrXHlrI/n3PxMppzi7YNeVcvi+wDRnL5E+NRkFuzcPSTslPBjMLnq0= 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)(520078)(5005006)(3002001)(10201501046); SRVR:SN1PR12MB0446; BCL:0; PCL:0; RULEID:; SRVR:SN1PR12MB0446; X-Forefront-PRVS: 0808323E97 X-Forefront-Antispam-Report: SFV:NSPM; SFS:(10009020)(6009001)(189002)(199003)(5008740100001)(19580405001)(97736004)(36756003)(66066001)(50986999)(3846002)(50466002)(586003)(6116002)(40100003)(19580395003)(229853001)(1096002)(122386002)(189998001)(47776003)(2201001)(77096005)(2950100001)(50226001)(76176999)(92566002)(86362001)(5001770100001)(42186005)(48376002)(53416004)(106356001)(101416001)(4326007)(105586002)(5003940100001)(87976001)(5004730100002); DIR:OUT; SFP:1101; SCL:1; SRVR:SN1PR12MB0446; H:ssuthiku-cz-dev.amd.com; FPR:; SPF:None; PTR:InfoNoRecords; MX:1; A: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; SN1PR12MB0446; 23:eU585PxtyaJkbS1FPdc2jDo2Pm1ecnEaKbpDjWczq?= =?us-ascii?Q?rUaGWcvnP+p3zOvSBEZvwwknxTv6wHs+1O659EU+jntUIZ0ur6YOMM/P9muc?= =?us-ascii?Q?FRIeiMKqWHzDn7XkOrdTafWGsoIuBfEPJIKdkYBtZa3WTmYRfcxzrIxiMR6r?= =?us-ascii?Q?ovNIpTHkEaIUGY0dz4TAxvxyABaWYDKs8CIkGgwYcaU3QNKI+qfvhdU6miJd?= =?us-ascii?Q?kzilojpd4G2mNZU/o44aEEufyUGP1lP+X7+BXvaUzscK8b5jAI4uSuT+q2NW?= =?us-ascii?Q?8wb2wcYIyL2mM5zuLC1vIQ7iKdlMxO563nWKwMb1xS0ZJX6UqCy3UxCPZHa6?= =?us-ascii?Q?BNm0ZQqEYzvGvZKXLlfcZwpcQ1sTc3bImp06axHKULd23S7dV+pY4pXHRXRR?= =?us-ascii?Q?6Jg+jJFOPx17fGL23bsaE1VmIOAuRk3CfIre2kuDAuixLdJ+SSXUYpJLIcV1?= =?us-ascii?Q?cEzgxHwS0I8M3KRIIk9VQToXwsUMv6pPBQdHh++Mx3/s5Ej0KzG8sJMNRf7/?= =?us-ascii?Q?5BmmpJXdoCj0joqJrHWDdWriac1jifAke5a3vjARfOjGo7L7bHW1vWk9QU3x?= =?us-ascii?Q?62dYCEMNG0aoplL37z4HDyRjvISdpIPVAGmPc1Tx3C5Rt9CRU5BaJwxHmfIx?= =?us-ascii?Q?Pl60i4SeI3+7yr103/53VvGb70W/yHZKuJ5pwu/V689SrnfYsbBjEQHz09kL?= =?us-ascii?Q?C4lqzNQ0e9GUA7QB1DLaa0iWNO8VIDmrWcGepiP34MVOSRyEWu8b8FQiwWxD?= =?us-ascii?Q?W9Lz5C+TFSN1s+4dlVZ2YQLIdyrWvc2MLuZb1W3fQlBORNQSwJ4hKNH7P3tI?= =?us-ascii?Q?R2OJTJBjglPXIjWffLVy+EQLX8saLvXxTfM81YVemQKzSyODC/VIrzwBHFyK?= =?us-ascii?Q?744MRoqME8EjFh+B5CLmU/1c2/lfKN9qB7K5YsAFxgOA0DdVbQBqq20h/dt6?= =?us-ascii?Q?szFsR/O715fdPkH/Z/6boTNjSOBPxyEZagGjVpfxxnnBu2ZSp+0kUeX7O2UG?= =?us-ascii?Q?TsQbhGzrKAqqhM5WcI+K/kB?= X-Microsoft-Exchange-Diagnostics: 1; SN1PR12MB0446; 5:f35lcwKJ8fi/hhS53Zd0Mv3bwgfHeuKjpL48bCFeu+eyFxaOPlrO/gkuZyymj8cLMNaMgVfsiZt5UL3cfJf4hBQJLBsGwsVfisC5uxom3TB3tQiqNx03IZj1I9AC306YHImMDfWUXl5r3dXwwC9/Zw==; 24:zUta3fjC4BpfQqRl6nj+zRVZBj9Z2JU57CUPUp0b0kWcNmwhlPzzxXObfJDK69a1xFNvJl/Xm/0iVBmpuK3jenXFMyKMxo72+IMgw4dP3W0=; 20:iM2E5eGcv8criaNiqO+xjorr/hKelpxe9xehibo9jIli4UpTXa2pDlL8M0OOoxrFaTz/aco0qwXa7FCR+GhdA/RDCBHsWSk+K9V4AZ83F5R592G8I/G5Rq4k5lSJmWgDiSUtlqFhM/s9mvMpYk3/tJ2SyKlJGy708J8rRMG1SwqH6HZCtINvtMP03ZnNzxNtrMz3Nhe4HKlhRSH/EiespqN62PZV9kHzA9XNH+UAvMvkMXjC2OrEzeBpJqTy6l4M X-OriginatorOrg: amd.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 01 Jan 2016 18:24:34.4558 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-Transport-CrossTenantHeadersStamped: SN1PR12MB0446 Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org The current amd_iommu_pc_get_set_reg_val() does not support muli-IOMMU system. This patch replace amd_iommu_pc_get_set_reg_val() with amd_iommu_pc_set_reg_val() and amd_iommu_pc_[set|get]_cnt_vals(). This implementation makes an assumption that the counters on all IOMMUs will be programmed the same way (i.e with the same events). Signed-off-by: Suravee Suthikulpanit --- arch/x86/kernel/cpu/perf_event_amd_iommu.c | 80 +++++++++++++++++---------- drivers/iommu/amd_iommu_init.c | 87 ++++++++++++++++++++++++++---- include/linux/perf/perf_event_amd_iommu.h | 8 ++- 3 files changed, 136 insertions(+), 39 deletions(-) -- 1.9.1 -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/ diff --git a/arch/x86/kernel/cpu/perf_event_amd_iommu.c b/arch/x86/kernel/cpu/perf_event_amd_iommu.c index 8af7149..9c60eb3 100644 --- a/arch/x86/kernel/cpu/perf_event_amd_iommu.c +++ b/arch/x86/kernel/cpu/perf_event_amd_iommu.c @@ -264,44 +264,46 @@ static void perf_iommu_enable_event(struct perf_event *ev) u64 reg = 0ULL; reg = csource; - amd_iommu_pc_get_set_reg_val(devid, + amd_iommu_pc_set_reg_val(devid, _GET_BANK(ev), _GET_CNTR(ev) , - IOMMU_PC_COUNTER_SRC_REG, ®, true); + IOMMU_PC_COUNTER_SRC_REG, ®); reg = 0ULL | devid | (_GET_DEVID_MASK(ev) << 32); if (reg) reg |= (1UL << 31); - amd_iommu_pc_get_set_reg_val(devid, + amd_iommu_pc_set_reg_val(devid, _GET_BANK(ev), _GET_CNTR(ev) , - IOMMU_PC_DEVID_MATCH_REG, ®, true); + IOMMU_PC_DEVID_MATCH_REG, ®); reg = 0ULL | _GET_PASID(ev) | (_GET_PASID_MASK(ev) << 32); if (reg) reg |= (1UL << 31); - amd_iommu_pc_get_set_reg_val(devid, + amd_iommu_pc_set_reg_val(devid, _GET_BANK(ev), _GET_CNTR(ev) , - IOMMU_PC_PASID_MATCH_REG, ®, true); + IOMMU_PC_PASID_MATCH_REG, ®); reg = 0ULL | _GET_DOMID(ev) | (_GET_DOMID_MASK(ev) << 32); if (reg) reg |= (1UL << 31); - amd_iommu_pc_get_set_reg_val(devid, + amd_iommu_pc_set_reg_val(devid, _GET_BANK(ev), _GET_CNTR(ev) , - IOMMU_PC_DOMID_MATCH_REG, ®, true); + 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), + amd_iommu_pc_set_reg_val(_GET_DEVID(event), _GET_BANK(event), _GET_CNTR(event), - IOMMU_PC_COUNTER_SRC_REG, ®, true); + IOMMU_PC_COUNTER_SRC_REG, ®); } static void perf_iommu_start(struct perf_event *event, int flags) { struct hw_perf_event *hwc = &event->hw; + struct perf_amd_iommu *perf_iommu = + container_of(event->pmu, struct perf_amd_iommu, pmu); pr_debug("perf: amd_iommu:perf_iommu_start\n"); if (WARN_ON_ONCE(!(hwc->state & PERF_HES_STOPPED))) @@ -311,10 +313,19 @@ static void perf_iommu_start(struct perf_event *event, int flags) hwc->state = 0; 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); + int i; + + for (i = 0; i < amd_iommu_get_num_iommus(); i++) { + int index = get_iommu_bnk_cnt_evt_idx(perf_iommu, i, + _GET_BANK(event), _GET_CNTR(event)); + + perf_iommu_cnts[i] = local64_read( + &perf_iommu->prev_cnts[index]); + } + + amd_iommu_pc_set_cnt_vals(_GET_BANK(event), _GET_CNTR(event), + amd_iommu_get_num_iommus(), + perf_iommu_cnts); } perf_iommu_enable_event(event); @@ -324,29 +335,42 @@ static void perf_iommu_start(struct perf_event *event, int flags) static void perf_iommu_read(struct perf_event *event) { - u64 count = 0ULL; + int i; u64 prev_raw_count = 0ULL; u64 delta = 0ULL; struct hw_perf_event *hwc = &event->hw; + struct perf_amd_iommu *perf_iommu = + container_of(event->pmu, struct perf_amd_iommu, pmu); + pr_debug("perf: amd_iommu:perf_iommu_read\n"); - 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_cnt_vals(_GET_BANK(event), _GET_CNTR(event), + amd_iommu_get_num_iommus(), + perf_iommu_cnts)) + return; + + local64_set(&hwc->prev_count, 0); + for (i = 0; i < amd_iommu_get_num_iommus(); i++) { + int index = get_iommu_bnk_cnt_evt_idx(perf_iommu, i, + _GET_BANK(event), _GET_CNTR(event)); - /* IOMMU pc counter register is only 48 bits */ - count &= 0xFFFFFFFFFFFFULL; + /* IOMMU pc counter register is only 48 bits */ + perf_iommu_cnts[i] &= 0xFFFFFFFFFFFFULL; - prev_raw_count = local64_read(&hwc->prev_count); - if (local64_cmpxchg(&hwc->prev_count, prev_raw_count, - count) != prev_raw_count) - return; + prev_raw_count = local64_read(&perf_iommu->prev_cnts[index]); + if (prev_raw_count != local64_cmpxchg( + &perf_iommu->prev_cnts[index], + prev_raw_count, perf_iommu_cnts[i])) + return; - /* Handling 48-bit counter overflowing */ - delta = (count << COUNTER_SHIFT) - (prev_raw_count << COUNTER_SHIFT); - delta >>= COUNTER_SHIFT; - local64_add(delta, &event->count); + local64_add(prev_raw_count, &hwc->prev_count); + /* Handling 48-bit counter overflowing */ + delta = (perf_iommu_cnts[i] << COUNTER_SHIFT) - + (prev_raw_count << COUNTER_SHIFT); + delta >>= COUNTER_SHIFT; + local64_add(delta, &event->count); + } } static void perf_iommu_stop(struct perf_event *event, int flags) diff --git a/drivers/iommu/amd_iommu_init.c b/drivers/iommu/amd_iommu_init.c index 33dbf3f..6691ac9 100644 --- a/drivers/iommu/amd_iommu_init.c +++ b/drivers/iommu/amd_iommu_init.c @@ -1133,6 +1133,9 @@ static int __init init_iommu_all(struct acpi_table_header *table) return 0; } +static int _amd_iommu_pc_get_set_reg_val(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) { @@ -1144,8 +1147,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 != amd_iommu_pc_get_set_reg_val(0, 0, 0, 0, &val, true)) || - (0 != amd_iommu_pc_get_set_reg_val(0, 0, 0, 0, &val2, false)) || + if ((_amd_iommu_pc_get_set_reg_val(iommu, 0, 0, 0, &val, true)) || + (_amd_iommu_pc_get_set_reg_val(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; @@ -2295,10 +2298,10 @@ u8 amd_iommu_pc_get_max_counters(void) } EXPORT_SYMBOL(amd_iommu_pc_get_max_counters); -int amd_iommu_pc_get_set_reg_val(u16 devid, u8 bank, u8 cntr, u8 fxn, - u64 *value, bool is_write) +static int _amd_iommu_pc_get_set_reg_val(struct amd_iommu *iommu, + u8 bank, u8 cntr, u8 fxn, + u64 *value, bool is_write) { - struct amd_iommu *iommu; u32 offset; u32 max_offset_lim; @@ -2306,9 +2309,6 @@ int amd_iommu_pc_get_set_reg_val(u16 devid, u8 bank, u8 cntr, u8 fxn, if (!amd_iommu_pc_present) return -ENODEV; - /* Locate the iommu associated with the device ID */ - iommu = amd_iommu_rlookup_table[devid]; - /* Check for valid iommu and pc register indexing */ if (WARN_ON((iommu == NULL) || (fxn > 0x28) || (fxn & 7))) return -ENODEV; @@ -2333,4 +2333,73 @@ int amd_iommu_pc_get_set_reg_val(u16 devid, u8 bank, u8 cntr, u8 fxn, return 0; } -EXPORT_SYMBOL(amd_iommu_pc_get_set_reg_val); + +int amd_iommu_pc_set_reg_val(u16 devid, u8 bank, u8 cntr, u8 fxn, u64 *value) +{ + struct amd_iommu *iommu; + + for_each_iommu(iommu) { + int ret = _amd_iommu_pc_get_set_reg_val(iommu, bank, cntr, + fxn, value, true); + if (ret) + return ret; + } + + return 0; +} +EXPORT_SYMBOL(amd_iommu_pc_set_reg_val); + +int amd_iommu_pc_set_cnt_vals(u8 bank, u8 cntr, int num, u64 *value) +{ + struct amd_iommu *iommu; + int i = 0; + + if (num > amd_iommus_present) + return -EINVAL; + + for_each_iommu(iommu) { + int ret = _amd_iommu_pc_get_set_reg_val(iommu, bank, cntr, + IOMMU_PC_COUNTER_REG, + &value[i], true); + if (ret) + return ret; + if (i++ == amd_iommus_present) + break; + } + + return 0; +} +EXPORT_SYMBOL(amd_iommu_pc_set_cnt_vals); + +int amd_iommu_pc_get_cnt_vals(u8 bank, u8 cntr, int num, u64 *value) +{ + struct amd_iommu *iommu; + int i = 0, ret; + + if (!num) + return -EINVAL; + + /* + * Here, we read the specified counters on all IOMMU, + * which should have been programmed the same way. + * and aggregate the counter values. + */ + for_each_iommu(iommu) { + u64 tmp; + + if (i >= num) + return -EINVAL; + + ret = _amd_iommu_pc_get_set_reg_val(iommu, bank, cntr, + IOMMU_PC_COUNTER_REG, + &tmp, false); + if (ret) + return ret; + + /* IOMMU pc counter register is only 48 bits */ + value[i] = tmp & 0xFFFFFFFFFFFFULL; + } + + return 0; +} +EXPORT_SYMBOL(amd_iommu_pc_get_cnt_vals); diff --git a/include/linux/perf/perf_event_amd_iommu.h b/include/linux/perf/perf_event_amd_iommu.h index cb820c2..be1a17d 100644 --- a/include/linux/perf/perf_event_amd_iommu.h +++ b/include/linux/perf/perf_event_amd_iommu.h @@ -33,7 +33,11 @@ extern u8 amd_iommu_pc_get_max_banks(void); extern u8 amd_iommu_pc_get_max_counters(void); -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_val(u16 devid, u8 bank, u8 cntr, u8 fxn, + u64 *value); + +extern int amd_iommu_pc_set_cnt_vals(u8 bank, u8 cntr, int num, u64 *value); + +extern int amd_iommu_pc_get_cnt_vals(u8 bank, u8 cntr, int num, u64 *value); #endif /*_PERF_EVENT_AMD_IOMMU_H_*/