From patchwork Tue Dec 22 19:19:13 2015 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Suthikulpanit, Suravee" X-Patchwork-Id: 58958 Delivered-To: patch@linaro.org Received: by 10.112.89.199 with SMTP id bq7csp3434548lbb; Tue, 22 Dec 2015 11:31:43 -0800 (PST) X-Received: by 10.98.80.144 with SMTP id g16mr38012234pfj.68.1450812703781; Tue, 22 Dec 2015 11:31:43 -0800 (PST) Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id h75si11937026pfj.104.2015.12.22.11.31.43; Tue, 22 Dec 2015 11:31:43 -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 S933602AbbLVTbk (ORCPT + 29 others); Tue, 22 Dec 2015 14:31:40 -0500 Received: from mail-bn1on0087.outbound.protection.outlook.com ([157.56.110.87]:41604 "EHLO na01-bn1-obe.outbound.protection.outlook.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S933508AbbLVTaW (ORCPT ); Tue, 22 Dec 2015 14:30:22 -0500 Received: from CY1PR12MB0444.namprd12.prod.outlook.com (10.163.91.22) by CY1PR12MB0853.namprd12.prod.outlook.com (10.164.70.11) with Microsoft SMTP Server (TLS) id 15.1.361.13; Tue, 22 Dec 2015 19:30:19 +0000 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 CY1PR12MB0444.namprd12.prod.outlook.com (10.163.91.22) with Microsoft SMTP Server (TLS) id 15.1.361.13; Tue, 22 Dec 2015 19:30:16 +0000 From: Suravee Suthikulpanit To: , , , , CC: , , Suravee Suthikulpanit Subject: [PATCH 2/6] perf/amd/iommu: Modify functions to query max banks and counters Date: Tue, 22 Dec 2015 13:19:13 -0600 Message-ID: <1450811957-1511-3-git-send-email-Suravee.Suthikulpanit@amd.com> X-Mailer: git-send-email 1.9.1 In-Reply-To: <1450811957-1511-1-git-send-email-Suravee.Suthikulpanit@amd.com> References: <1450811957-1511-1-git-send-email-Suravee.Suthikulpanit@amd.com> MIME-Version: 1.0 X-Originating-IP: [165.204.77.1] X-ClientProxiedBy: BY2PR04CA0009.namprd04.prod.outlook.com (10.255.247.19) To CY1PR12MB0444.namprd12.prod.outlook.com (25.163.91.22) X-Microsoft-Exchange-Diagnostics: 1; CY1PR12MB0444; 2:PRR6KKJnHxljfEU0/Vm33PeiKSeaL7U09Z/CeAskjYo42I4j2agCUVAhj7pcUDnwLb/FRFZaUrpAIs40sIxnNedV55CWOTxvFbaIvQZ6zb6Vx+PDQK68f044+lT3RcUkMa79PDOsxVwtxbfFpDt9hA==; 3:ozK7vgeLvRkm6ZjscFMPkVP7cl4+fw9eNBEcuvZEkkcG5HqvL3ozmLWPqkfQhFGA1Qz7kKCXw0xEJ4Lu7zbtitk6vqpkeBePcDB2iW4qyKoKik4xOaXj3m/9ByGKjMjp; 25:7erY3XUHpR4t225AMeNRJkT+AyTYIuh/G5g0rhMpnYn0mLb7LKVG75mOHtN3VN64tobpx09tFhUiWDcFpF15FhW5Nu1adztl4s1eeSZ8G3TuESrhizlJZ+sjn4CYO4n/R/mv/NNTkdd3zWcwqQw4M2COE3YBr/emb1ZpkACqrQc8Mpkj2OFYnwItjeipVjVH4zk/yttVM21DO6wQBXSa33tas8desV7qs1BgWFCTEG77cKg+LYH9sMv5oOndhFUY+d4vARF+BbyoyRiTSR9F0g== X-Microsoft-Antispam: UriScan:;BCL:0;PCL:0;RULEID:;SRVR:CY1PR12MB0444; X-Microsoft-Exchange-Diagnostics: 1; CY1PR12MB0444; 20:sLfKJLCCx6yUdrwNA5QSS+3ODnm5kxzJroCSdxJCuzTLZ+TblbUTcAXIhWuQA3ZWi7BboKlImjwvgIXqSIMcubgT/B8VRgw7BBz/hJnU9m0zs2kpNWy5n3NTF73ocR94U5lEWLtvmKTBB7MymY1pAuIFmTC8T7RXIBlPtxM1mqqSwQpcQvvv4bVt2au26nr/emYaV1w8HVxtf9Yh23h6E4MsFz729ut5ujj0+WBFDTbeBU0YCYdAzGzXW5+sin1fXZQLg5tcHYYtYCvfEk0JpNzEE6Jt4gWgDSCBo6dy3EQZXgCPkAske7HlBfYL5LyPBa4bhIU1kCFjskUeWUBCRvK+69ltuWSDMOPGtPR4kt/vaJJfCXfiNaTqS8LhnzitrPSQIdE28v+gOjgKe0o+2QVZygSzbSGu47hi4wJCZMf12QtnO18ELCfUXpY/VRYR9NcER/quyYpVyEd4Y5R9s2yUwM/+oJ21QU2kGW8xliY2G6JxmJlayB5J8FdlNawn; 4:hCT2j37/pIUyXIwWrHgsMtqNmJILMbrFMBZvGRqOzH5lqWWpQZDCA1wgWNf/lWT139tYaQsf7Py8w1+QM4j7GY5TBaxxbDINn8s4IQRmavQ5zs3mR0vQXVls8p5hkP15v2G+K62TnOPPc7ufI8fQAT74LeXKoq3rWEB6qfAPK1BmpeyFlzznCK7a1eEcZomM4eJgjA0XgVv6Ni3rjwDo/hqdWqS2e+XvLyUKq+aIWY52QwuEO+/fOINHJB3NSE5eNyhLxYf2CGosZ+ghHwwLT3PYbAUi1X7YmYUXzSk+5mjvEfOQxhU8TOsIYtn+H05UOQ7+djEcwPLYrw6XvACsIinXsj7UHYMieJt4dnsHKiR0EIVzhRKovpCucJVpcbPNwQOiuV/ABCh2U7sxfqDn4C5naneA01Gv5Lgs1BN/a2w= 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:CY1PR12MB0444; BCL:0; PCL:0; RULEID:; SRVR:CY1PR12MB0444; X-Forefront-PRVS: 0798146F16 X-Forefront-Antispam-Report: SFV:NSPM; SFS:(10009020)(6009001)(189002)(199003)(105586002)(101416001)(53416004)(19580395003)(50466002)(40100003)(19580405001)(106356001)(5001770100001)(42186005)(97736004)(575784001)(47776003)(50986999)(87976001)(2201001)(3846002)(48376002)(5003940100001)(76176999)(229853001)(66066001)(86362001)(189998001)(2950100001)(6116002)(36756003)(5004730100002)(50226001)(77096005)(586003)(5008740100001)(1096002)(92566002)(122386002); DIR:OUT; SFP:1101; SCL:1; SRVR:CY1PR12MB0444; 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; CY1PR12MB0444; 23:1txGaeFnubFi3bN/95+da1Kbd+nfs7ZShGDdyBU5+?= =?us-ascii?Q?NtxzFP+Tnu27HRkmJyAcKsh1b+prqPfoI/l67vphnpNgm8VFYMwWTYXSXTk3?= =?us-ascii?Q?BXPBDKJqEys5E/Sm5H9bEDT0+N7Ut18toyt/YgUUTcQ+3s6PrYyxf484o5/w?= =?us-ascii?Q?gc9tVdRiXhKreb8F7RWO1SLalORK/yoOf0FOuREngoEgI/+Eqpydqwmq8teb?= =?us-ascii?Q?sqMpAWanBPaoOdVycT6kM8cLfrD8d4gZP6Y6zi2r8YjZcyGQ4A3VHAtS8s56?= =?us-ascii?Q?QFGD0cbzPWnYMbv17oxS7DmACwByVMFx/NWegovxQLTS1er3PUiAd/7vo1Qo?= =?us-ascii?Q?5FSoYuUBItEuVSZ2OUd/3oKmtz16wLwTtIP3gWzHaJ9De1zch30GoQ9Qgupq?= =?us-ascii?Q?FEhD8PlMhRAkUGAaT5WagSqEFK4FlmOUuK4wADUHP09cJKg1xunLDQU0DDZ0?= =?us-ascii?Q?FjEULCq5vScF6XobWhbXz6uSChxOfPDskJomEtMqPbxEyNxlGzMmG2omH9M0?= =?us-ascii?Q?nOQDbwelkkFvd+QbAHLkpZQmSxIyuKPJoSQh3vAp76ilS1cc8zpdpLXI6pZl?= =?us-ascii?Q?gGWb+M41P0/YFckyc2FroN+0MDfSBKr+xKP2fURenO7nadOU2VGkDmhGOGct?= =?us-ascii?Q?JqEv1H3iiNVIBo76jQrJ09KSjsPPDyt/IB2tTyO8JprDXzgMBq+Y3tUeNgkf?= =?us-ascii?Q?GyZSVj9CdOnZSnAnOumm4Z3und+2Fe4LPbPdVuZRZ4wZbwAAA8Kv/91/Ho0/?= =?us-ascii?Q?41zvlr0IaMkVPNBvtjXSX0cF66d2GIlwn6GiA/M7845tu0MZ/e3C7TXQ6goQ?= =?us-ascii?Q?FfH6YCECXMbzGwpMIp/NRp/T/Ut/PhChmMYFS9lpXTt1UI4/iJVrpFGx+sKS?= =?us-ascii?Q?Jr+6mVTQmA8o3oZE1WyDJMGKVq+R8QxkQC5BhbiGwS7uH1LCO6+1FWsmsvGK?= =?us-ascii?Q?MpbcdMgRWCcB9WyW7s4AK+oPGNE4w8UEyrEj/KR9HxXe3YmcVuENF2cJ1ZtW?= =?us-ascii?Q?MKX5f7wmlw1j/KT0boXTGrR?= X-Microsoft-Exchange-Diagnostics: 1; CY1PR12MB0444; 5:FAWJuQTFU+N03nBM1JKboHBdxIXpZmhgVIpkcKDoWk1z6W+cL5UkbnYCYEkk/jDG3glEo4lp3yBtpCjI4igZVDCrk3uTiehC1QeLjmVD7sc3ZK31fFBc9gzVkXYlVVlu3Cj5MaUir13kq/g8e8IL2g==; 24:iNcyCNxZGj7ttmGQJHbR3rMZQ/gN8pCAogQPgJ4dOFJqzHDT4SfYwniJlqZJpCr0F5oUsWE2U25qGzoc4oulQD3xwk8wejriERditxbmegw=; 20:U6lEzr5PiKYzQj+B1MBhg2CIiicfTBMAoWt2fSb0JQehvpu+1KGazNmnzlxb0yUExWvw4u07Pw4+toDZiTHys7S2NCGbTiAa6HnlIaaz7qEwaLAyHtn8XdCRJFcEEZy4BLCdjYjjX94roie43n6BxfhBXSNdl0GvS/j4eNRDjMGz2Vva6ra5/8T/yw2otvcund+9HBil61/3EBLoAhrQQB9GXjI72eWEWV+y/t2NAGHvEQupujGnoysNjcVC7MwA X-MS-Exchange-CrossTenant-OriginalArrivalTime: 22 Dec 2015 19:30:16.9071 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-Transport-CrossTenantHeadersStamped: CY1PR12MB0444 X-Microsoft-Exchange-Diagnostics: 1; CY1PR12MB0853; 2:fJr0ZPsca8NNKDcPrL69VRmURC9G0ZJprKzTxItWiQHLx3UEossFWl8eXPWjpnUWEH7nM/9T7popD9X7jDjRBW5zJ/GTzcdF5AfFF0Wb2xFBOm5NRW/XIChq4+mWJV+qXh5Dv4WEMyOqAWzT/9+3IA==; 23:yRynvNZJcDb4uIzuGMRDYHC8gF2VKXgdNbxncbeUE+eymdEfXy8ufNMtzJjJ+rkJWWibNUiPWtd8ddOoe56sZ6SFzxTPTqylmT9lGHOhGmaZkoO/m5aLakc+cROESkHSQ9BDxcLmYFbM1L1OcNhqZQ0ElTlj90KJY7HrmNekbiEU/ZalImk5p+xy6jqoEqBq X-OriginatorOrg: amd.com Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Currently, amd_iommu_pc_get_max_[banks|counters]() require devid, which should not be the case. Also, these don't properly support multi-IOMMU system. Current and future AMD systems with IOMMU that support perf counter would likely contain homogeneous IOMMUs where multiple IOMMUs are availalbe. So, this patch modifies these function to iterate all IOMMU to check the max banks and counters reported by the hardware. Signed-off-by: Suravee Suthikulpanit --- arch/x86/kernel/cpu/perf_event_amd_iommu.c | 17 +++++++---------- drivers/iommu/amd_iommu_init.c | 20 ++++++++++++-------- include/linux/perf/perf_event_amd_iommu.h | 7 ++----- 3 files changed, 21 insertions(+), 23 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 1192f1d..e6d2485 100644 --- a/arch/x86/kernel/cpu/perf_event_amd_iommu.c +++ b/arch/x86/kernel/cpu/perf_event_amd_iommu.c @@ -237,14 +237,6 @@ static int perf_iommu_event_init(struct perf_event *event) return -EINVAL; } - /* integrate with iommu base devid (0000), assume one iommu */ - perf_iommu->max_banks = - amd_iommu_pc_get_max_banks(IOMMU_BASE_DEVID); - perf_iommu->max_counters = - amd_iommu_pc_get_max_counters(IOMMU_BASE_DEVID); - if ((perf_iommu->max_banks == 0) || (perf_iommu->max_counters == 0)) - return -EINVAL; - /* update the hw_perf_event struct with the iommu config data */ hwc->config = config; hwc->extra_reg.config = config1; @@ -455,6 +447,11 @@ static __init int _init_perf_amd_iommu( if (_init_events_attrs(perf_iommu) != 0) pr_err("perf: amd_iommu: Only support raw events.\n"); + perf_iommu->max_banks = amd_iommu_pc_get_max_banks(); + perf_iommu->max_counters = amd_iommu_pc_get_max_counters(); + if ((perf_iommu->max_banks == 0) || (perf_iommu->max_counters == 0)) + return -EINVAL; + /* Init null attributes */ perf_iommu->null_group = NULL; perf_iommu->pmu.attr_groups = perf_iommu->attr_groups; @@ -465,8 +462,8 @@ static __init int _init_perf_amd_iommu( amd_iommu_pc_exit(); } else { pr_info("perf: amd_iommu: Detected. (%d banks, %d counters/bank)\n", - amd_iommu_pc_get_max_banks(IOMMU_BASE_DEVID), - amd_iommu_pc_get_max_counters(IOMMU_BASE_DEVID)); + amd_iommu_pc_get_max_banks(), + amd_iommu_pc_get_max_counters()); } return ret; diff --git a/drivers/iommu/amd_iommu_init.c b/drivers/iommu/amd_iommu_init.c index b6d684c..275c0f5 100644 --- a/drivers/iommu/amd_iommu_init.c +++ b/drivers/iommu/amd_iommu_init.c @@ -2251,15 +2251,17 @@ EXPORT_SYMBOL(amd_iommu_v2_supported); * ****************************************************************************/ -u8 amd_iommu_pc_get_max_banks(u16 devid) +u8 amd_iommu_pc_get_max_banks(void) { struct amd_iommu *iommu; u8 ret = 0; - /* locate the iommu governing the devid */ - iommu = amd_iommu_rlookup_table[devid]; - if (iommu) + for_each_iommu(iommu) { + if (!iommu->max_banks || + (ret && (iommu->max_banks != ret))) + return 0; ret = iommu->max_banks; + } return ret; } @@ -2271,15 +2273,17 @@ bool amd_iommu_pc_supported(void) } EXPORT_SYMBOL(amd_iommu_pc_supported); -u8 amd_iommu_pc_get_max_counters(u16 devid) +u8 amd_iommu_pc_get_max_counters(void) { struct amd_iommu *iommu; u8 ret = 0; - /* locate the iommu governing the devid */ - iommu = amd_iommu_rlookup_table[devid]; - if (iommu) + for_each_iommu(iommu) { + if (!iommu->max_counters || + (ret && (iommu->max_counters != ret))) + return 0; ret = iommu->max_counters; + } return ret; } diff --git a/include/linux/perf/perf_event_amd_iommu.h b/include/linux/perf/perf_event_amd_iommu.h index 845d173..815eabb 100644 --- a/include/linux/perf/perf_event_amd_iommu.h +++ b/include/linux/perf/perf_event_amd_iommu.h @@ -24,15 +24,12 @@ #define PC_MAX_SPEC_BNKS 64 #define PC_MAX_SPEC_CNTRS 16 -/* iommu pc reg masks*/ -#define IOMMU_BASE_DEVID 0x0000 - /* amd_iommu_init.c external support functions */ extern bool amd_iommu_pc_supported(void); -extern u8 amd_iommu_pc_get_max_banks(u16 devid); +extern u8 amd_iommu_pc_get_max_banks(void); -extern u8 amd_iommu_pc_get_max_counters(u16 devid); +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);