Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1753723AbbH0I0m (ORCPT ); Thu, 27 Aug 2015 04:26:42 -0400 Received: from mail-bn1on0086.outbound.protection.outlook.com ([157.56.110.86]:51472 "EHLO na01-bn1-obe.outbound.protection.outlook.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1753601AbbH0I0f convert rfc822-to-8bit (ORCPT ); Thu, 27 Aug 2015 04:26:35 -0400 Authentication-Results: spf=none (sender IP is 165.204.84.222) smtp.mailfrom=amd.com; alien8.de; dkim=none (message not signed) header.d=none;alien8.de; dmarc=permerror action=none header.from=amd.com;alien8.de; dkim=none (message not signed) header.d=none;alien8.de; dmarc=permerror action=none header.from=amd.com; X-WSS-ID: 0NTQEQU-08-9OW-02 X-M-MSG: From: Huang Rui To: Borislav Petkov , Jean Delvare , "Guenter Roeck" , Andy Lutomirski , "Andreas Herrmann" , Thomas Gleixner , Peter Zijlstra , Ingo Molnar , "Rafael J. Wysocki" , Len Brown , John Stultz , =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20Weisbecker?= CC: , , , Andreas Herrmann , Aravind Gopalakrishnan , Borislav Petkov , Fengguang Wu , Aaron Lu , Tony Li , Huang Rui Subject: [PATCH 12/15] hwmon, fam15h_power: introduce a cpu accumulated power reporting algorithm Date: Thu, 27 Aug 2015 16:07:43 +0800 Message-ID: <1440662866-28716-13-git-send-email-ray.huang@amd.com> X-Mailer: git-send-email 1.9.1 In-Reply-To: <1440662866-28716-1-git-send-email-ray.huang@amd.com> References: <1440662866-28716-1-git-send-email-ray.huang@amd.com> MIME-Version: 1.0 Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: 8BIT X-EOPAttributedMessage: 0 X-Forefront-Antispam-Report: CIP:165.204.84.222;CTRY:US;IPV:NLI;EFV:NLI;SFV:NSPM;SFS:(10009020)(6009001)(2980300002)(428002)(3050300001)(189002)(199003)(50466002)(77096005)(68736005)(229853001)(5007970100001)(53416004)(97736004)(5003600100002)(5820100001)(77156002)(5001830100001)(105586002)(4001540100001)(106466001)(5001770100001)(36756003)(5001860100001)(62966003)(189998001)(2950100001)(23676002)(19580405001)(19580395003)(46102003)(33646002)(76176999)(50226001)(50986999)(101416001)(64706001)(86362001)(47776003)(87936001)(92566002)(921003)(1121003);DIR:OUT;SFP:1101;SCL:1;SRVR:SN1PR12MB0720;H:atltwp02.amd.com;FPR:;SPF:None;PTR:InfoDomainNonexistent;MX:1;A:1;LANG:en; X-Microsoft-Exchange-Diagnostics: 1;SN1PR12MB0720;2:ddRoyvm8He1ThASueS5X9jDUqYxUNqLveHyPo9i9CTjs7fgFV0J2YYBVA9wrnXW+e6snQet4WtrpY0qxyKymQZTH54DtBYGuElzyYJ6tsb0ldSl0WCGhptJe/uRWGpT+GMLY6s8n56UlDoRsY41R4HD4uWMGoklsBhs51SR/o7g=;3:+rb3yHVN/+ouBzze0Z+RKUwRnBfBEPDkH5eyTxNEk0KCYdMk6Ly2wlG7SeQgzSAAmUPBIU26XwlLPc+CX+aKOAARAJMDOmi0XvWvIABufckTSqSzX9XBKl/a2J2XK77CP+SsOd1XykxlCwix0sGZP9CG/SMQjHD5DQ9pIehPchQ/YZbQA31vgE7K5xaX/V3L+Fp4+OoJzNXNE9ngFKNE4XNcZIwO3K2ETDwDFhDv09EAZBx6NpwEEoiNdIAc/4fs;25:PgdnuxsTlcYdNj7nu7c/T7QyQq5ke2hhhnZZ1MzmsISIpuiQWZfRXkuGJP3+VdiX1c6SaOXbOCZlhchFA9N8XhcJSPVBtQ1yqVhrcBmzh3ukusibI8iIWJ3tBAqwje6OJOYCbpOivrEF1MV6+LQT1Doh8K1rYbQqhhJNqlcl51YjWylnL5QENF+JCMtKPcjM6IsVqTnt2SAydRlDwtcvZ8j9eaK9j1CIZiFRKbSfnJL9f82IePdDP8bvOgTablyaktdWZsS+65i0lsM4wnBw0g== X-Microsoft-Antispam: UriScan:;BCL:0;PCL:0;RULEID:;SRVR:SN1PR12MB0720;UriScan:;BCL:0;PCL:0;RULEID:;SRVR:SN1PR12MB0301; X-Microsoft-Exchange-Diagnostics: 1;SN1PR12MB0720;20:uk/Au0UXgAbIpAytIsxhmiqdqpfKKVK/qeqLzyU9sZhr0Fr1X1w4CAUxYfKgA2GYb1uTxTLiSPQaJii9H8n6cFemjfTyF9Yn/lCwOusfHqJLcgd4520VXesoAMQo+RqhVGhUEKz3v4UL+XdRt2N38gNjz2jYeS4PYSkXUTKWiEcrK4QWMItciQKOOeEFJMpMRDmH1TKCUEtcpA1nIHSIG+sJ78O55Lb0OQ3hq/5e9Z/YytcZI0cz39QZr4nKctjEudvqxNBiTGtN8TFJlBR1PkycFKa+fgwutURIokAPkAknWDV2FK8f/xJprj6wD6Km+3uQsGmSyDx2tVewpIDTShSMFsKthK20hc7Jugys5vZEvrFm56/7CciMlEVcvLBoYLwL20MxK6tibEk+Mjvm+XVoMc7U3hiA1ZrNURBXeBe62cA6PE03r1IT2YgMYoY5muaB6xuSPgfnjGsF2OcAOVjfPa2rEeswiXSMT3B1zAixoIJAgbMci8fJrp9CUgfm;4:KWQDbdLodHEu9iuWve++qDPJjmunjS9wF+PizExXZ4F7hJsk4g6bb3drkWRPScv2sUQcNty4XSMw51T3AJhwP4ui3Gdug8CZEMkmZtYFWOcO4AjxZjLADVbp639DUbpZT267a7cWyoNmul1KXOe4tlggC6ZS+6g1PzwTXfOkFbrzIqv4KgB65U/B2jX+AC4kHu2c+KItwHo1fq9VdrZQAn3/Rv3dLYxqln8F1VigzV1XWXEKlAfRuiuqo73xkVLHsqjMT40ROzw/55GzumdmrZk9mFqGZ+6D5v7cHdYbJVf7qqbqrVrmQAM79KmRI7yn X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:; X-Exchange-Antispam-Report-CFA-Test: BCL:0;PCL:0;RULEID:(601004)(5005006)(8121501046)(3002001);SRVR:SN1PR12MB0720;BCL:0;PCL:0;RULEID:;SRVR:SN1PR12MB0720; X-Forefront-PRVS: 06818431B9 X-Microsoft-Exchange-Diagnostics: =?utf-8?B?MTtTTjFQUjEyTUIwNzIwOzIzOkxLK3lDM1pUZVhXSzNvVHNqNFovV0U1NTdY?= =?utf-8?B?V2l4ZzMwNWZ1QjUxSjhIOXdsL3BxejlBbWR3c3dOc2p2b21vYTJHdEN4aG1p?= =?utf-8?B?ckpKMldiaWdOTm1BSjZXQzY3amRCRTMwcEVMY0xPSjR2RldMSjUvNlEvZW5C?= =?utf-8?B?TlZuTEk0QVl0cVdyWnJUdTdvajNPYkl3VlJyMmJtYy90ODd5NTR5L2pmTncr?= =?utf-8?B?TDdPaU9sbVdRRkU4WnJRSlcrQldPZElHeXp3VlcyUjZTdGd0N1ZpZmpibGR6?= =?utf-8?B?YVpyekpTbnVQRzBWUkZBRGdsY3YzaEhiQktxaFRGQU1nVldjek5MSzFESExO?= =?utf-8?B?d1lUWUpZcHpITUdlL2xPNENDOWU0c0crZW1mTGNkTXdTZ1RVQXBidHM3b2JJ?= =?utf-8?B?bUhyZmY1T0J5eUR2QmRXMkxpaSthQll1aTAzNGJUdFZlWnFGSG1YbHpRZGYv?= =?utf-8?B?RXNuR1F2WEEyd05jeFdGVFRCaXpYUnYzSmVFYVhXOGt6cUEwcjBxdXFFMitk?= =?utf-8?B?enlaTHJJcWI1d1pGekdXZnRCUzcrdm5yTWlabUVTeC95UjBFbllhY1pqQ2t0?= =?utf-8?B?dUxEQnFzeFlqVmFVcU1MWHVWM3lQVmI3dk5wQ1ZWck1MUWk0SVNScFZiaFJE?= =?utf-8?B?SVE1dUx1TStpZTRnVmlmKzV0Y2FaNC95SHBQdjgydTRSejVqT2R6RXNCNGtJ?= =?utf-8?B?UGRkemVjUG5OWHltNkQ2NHl4UGhLMk1BVHNQYk9xSmZYd0YrNlVxTGoySEx4?= =?utf-8?B?OTUzdlRvZTJ4WUVGZ21mbTVmekQ2RHZHM2wyRHh6ZUNwSHJSc2srdnM5cUFN?= =?utf-8?B?WWRFdS9Ha0ZYRmxXZDZIV0VvMk9udHBJZlNpeEJtS0s0cHhkeHR6Y1ZqMmVj?= =?utf-8?B?Wnl4eDFhU3VyV0JJWjFrSEZIbDJTaDRMb0VkY1FrRlF5UUF2aEVyb0VXQWlD?= =?utf-8?B?ZTZEWHdSTGxCSzI1ZjQwL1IzU0tRWHRqSkFqMlduZ1VOVlFvVmVMUzUrY3FC?= =?utf-8?B?YWhoa1lnRHczS1RkM0NWT2Zvc3NEKzFnczFkL3JhdS9GcG91TVl0U3B3TENF?= =?utf-8?B?a25Ta0RjT1BEYzBSTzM5OXFST29LM3drT0pVbGk3c0RYZC81bmc1eFMrdU02?= =?utf-8?B?VDZEQUhiQ3NJS3BRNWJ1cTNrTXNFMnBuc3lMSEhpUmZXM3VJOElITHFML1hL?= =?utf-8?B?enlYbnZFdkVSdW9GejA0ZXhocXo1TnEwZDNhU3Z3T3ZXa21NS2luMERJaDVL?= =?utf-8?B?MWYxK3RsUG8yQ2NDaU1SMGIzellPRmZxeWNDV2tlMFRmVW9IcUdWL0tydTBL?= =?utf-8?B?Zkp6ZlBqcEVBTkM2cjhJa3FXQUZBK2wxbm45T1RIZDZkUHZhdVdLbzU4bis5?= =?utf-8?B?aFJkOFUrQUIyV1F2c3pOVytuOEpiYmoyVEtLWXBTN3F4VUVER29UNXArN3A5?= =?utf-8?B?ckJJSUo4L2tPTkFYNkpZNVBhZWtsa21ZenFQdU9relh4amZYWGFydzJoMFc4?= =?utf-8?Q?BwuBPMSvmSk1kAg4PqVVnPWd9SqpJyhHfF5l2BmUvveI6Z?= X-Microsoft-Exchange-Diagnostics: 1;SN1PR12MB0720;5:02CKuu08XOn9L+y9GOTXzFjTelVA8RkUGl2qyjyBoQwe3ZZOqr1bKB+Qj1DTa6MUL92STql+GjQVLoSQhVums7UFoo25qrOltIMxoN4ew7+4SKRS38fnywVdCVvWXngJu0qjCl2OvGgX93hMtF6rvw==;24:jcQ4lo/GLNbLD8GMIgcmwXh9CEAUnD1JulqQiokicYEGtZNvIGX/G0MmwOQufpqJEys7WrBUF32QtK3UddRxLCmcm1LDB+DmiNSPk2ZPxFY=;20:d831r+PxFxxhntCx/V7ZQ3XRCbfEF/vl6qNnBtidwnC/0vrEg7Fj7xJsbakx+cAvBpqFNzqo4WTCtAwLFQeglA== SpamDiagnosticOutput: 1:23 SpamDiagnosticMetadata: NSPM X-MS-Exchange-CrossTenant-OriginalArrivalTime: 27 Aug 2015 08:11:22.6808 (UTC) X-MS-Exchange-CrossTenant-Id: 3dd8961f-e488-4e60-8e11-a82d994e183d X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp: TenantId=3dd8961f-e488-4e60-8e11-a82d994e183d;Ip=[165.204.84.222];Helo=[atltwp02.amd.com] X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: SN1PR12MB0720 X-Microsoft-Exchange-Diagnostics: 1;SN1PR12MB0301;2:r9YPIg8MgrMVQW4atY54q/NuygEu3eKd9fqFt4TfABG1zO7BcwjQPWq1HRGFon23mduvPt4sQT5uNoD+1miPJt12VJWLrohyvDVzaQ5hNEhAt7q2pCepGh1FJTf511qP+LX6qQOAytxibReM3Z2GowfETUSIDwyTnRJCC/8MGYk=;3:LMYUeV6YEEL+G27hUHZpT+GMJcZHdaPpO5xSW+u3ZlWVSvgFXfHqsvPVqcEoLLX5QhMbCxE0zXvQfwfbcknxPsRyYmb9lPaWZ2xZ72NUSh2SKWqg0x5Bxevs7iVD+Hivrq8PwoipWFcTmh7P8+DsOB6P6wKNHpgili5aJuJABWHVvm2v+Vpy8PsLWQThCw+rUSBW4FPMp+aJBfQ8RdsF5l7FCsj05ON1YdCPw0ifUtEJ4idbhoiM9qNgMlI3nWqM;25:RPGVfCGqF1P8FGRq19uLCaiccGdtbESVH7dZoaC3ONfUJjGEtgVXWiMOzlbYl5WTGbiSR88apliaBUJ4geiy8ugN/YTalekwFRya/LQtbBYWHwBNx7gXIo1XKol9KBq58hJ7SNRqQXPbChKl94EwZa3cwixfUzma9VA8n2pkmFtPGPqF4oAHP1NnAb7tGtmsxVQti6Me5aYlY+5+BlOWEKMkunxS7yZEguSob/IH1PgfuthPqcK8J/nWHu9J0FF/sNgKnSCUIxXwdJjQy/0A/g==;23:uW6M+5YzxHYXC31f7tEgtp2bnA48rPSDOscQahruRcEkAKL8MLPHETtD4Cp6PuaNaPemBDwAadsn/rE80Zd6rpyuEK4iYL42bSpAZzGIIcbqB73l5/FmOSGWcPw6QYN+fm/Cd/bep+5qo3B1DuLZImWxV8HS+VpaJWxOTceIF+tCyiPMqSbUn+209nu1+wnT X-OriginatorOrg: amd.com Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 4415 Lines: 136 This patch introduces an algorithm that computes the average power by reading a delta value of “core power accumulator” register during measurement interval, and then dividing delta value by the length of the time interval. User is able to use power1_acc entry to measure the processor power consumption and power1_acc just needs to be read twice with an needed interval in-between. A simple example: $ cat /sys/bus/pci/devices/0000\:00\:18.4/hwmon/hwmon0/power1_acc $ sleep 10000s $ cat /sys/bus/pci/devices/0000\:00\:18.4/hwmon/hwmon0/power1_acc The result is current average processor power consumption in 10000 seconds. The unit of the result is uWatt. Signed-off-by: Huang Rui --- drivers/hwmon/fam15h_power.c | 62 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 62 insertions(+) diff --git a/drivers/hwmon/fam15h_power.c b/drivers/hwmon/fam15h_power.c index d529e4b..3bab797 100644 --- a/drivers/hwmon/fam15h_power.c +++ b/drivers/hwmon/fam15h_power.c @@ -60,6 +60,7 @@ struct fam15h_power_data { u64 cu_acc_power[MAX_CUS]; /* performance timestamp counter */ u64 cpu_sw_pwr_ptsc[MAX_CUS]; + struct mutex acc_pwr_mutex; }; static ssize_t show_power(struct device *dev, @@ -121,17 +122,74 @@ static DEVICE_ATTR(power1_crit, S_IRUGO, show_power_crit, NULL); static struct attribute_group fam15h_power_group; __ATTRIBUTE_GROUPS(fam15h_power); +static ssize_t show_power_acc(struct device *dev, + struct device_attribute *attr, char *buf) +{ + int cpu, cu, cu_num, cores_per_cu; + u64 curr_cu_acc_power[MAX_CUS], + curr_ptsc[MAX_CUS], jdelta[MAX_CUS]; + u64 tdelta, avg_acc; + struct fam15h_power_data *data = dev_get_drvdata(dev); + + cores_per_cu = amd_get_cores_per_cu(); + cu_num = boot_cpu_data.x86_max_cores / cores_per_cu; + + for (cpu = 0, avg_acc = 0; cpu < cu_num * cores_per_cu; cpu += cores_per_cu) { + cu = cpu / cores_per_cu; + if (rdmsrl_safe_on_cpu(cpu, MSR_F15H_PTSC, &curr_ptsc[cu])) { + pr_err("Failed to read PTSC counter MSR on core%d\n", + cpu); + return 0; + } + + if (rdmsrl_safe_on_cpu(cpu, MSR_F15H_CU_PWR_ACCUMULATOR, + &curr_cu_acc_power[cu])) { + pr_err("Failed to read compute unit power accumulator MSR on core%d\n", + cpu); + return 0; + } + + if (curr_cu_acc_power[cu] < data->cu_acc_power[cu]) { + jdelta[cu] = data->max_cu_acc_power + curr_cu_acc_power[cu]; + jdelta[cu] -= data->cu_acc_power[cu]; + } else { + jdelta[cu] = curr_cu_acc_power[cu] - data->cu_acc_power[cu]; + } + tdelta = curr_ptsc[cu] - data->cpu_sw_pwr_ptsc[cu]; + jdelta[cu] *= data->cpu_pwr_sample_ratio * 1000; + do_div(jdelta[cu], tdelta); + + mutex_lock(&data->acc_pwr_mutex); + data->cu_acc_power[cu] = curr_cu_acc_power[cu]; + data->cpu_sw_pwr_ptsc[cu] = curr_ptsc[cu]; + mutex_unlock(&data->acc_pwr_mutex); + + /* the unit is microWatt */ + avg_acc += jdelta[cu]; + } + + return sprintf(buf, "%u\n", (unsigned int) avg_acc); +} +static DEVICE_ATTR(power1_acc, S_IRUGO, show_power_acc, NULL); + static int fam15h_power_init_attrs(struct pci_dev *pdev) { int n = FAM15H_MIN_POWER_GROUPS; struct attribute **fam15h_power_attrs; struct cpuinfo_x86 *c = &boot_cpu_data; + u32 cpuid; if (c->x86 == 0x15 && ((c->x86_model <= 0xf) || (c->x86_model >= 0x60 && c->x86_model <= 0x6f))) n += 1; + cpuid = cpuid_edx(0x80000007); + + /* check if processor supports accumulated power */ + if (cpuid & BIT(12)) + n += 1; + fam15h_power_attrs = devm_kcalloc(&pdev->dev, n, sizeof(*fam15h_power_attrs), GFP_KERNEL); @@ -148,6 +206,9 @@ static int fam15h_power_init_attrs(struct pci_dev *pdev) (c->x86_model >= 0x60 && c->x86_model <= 0x6f))) fam15h_power_attrs[n++] = &dev_attr_power1_input.attr; + if (cpuid & BIT(12)) + fam15h_power_attrs[n++] = &dev_attr_power1_acc.attr; + fam15h_power_group.attrs = fam15h_power_attrs; return 0; @@ -311,6 +372,7 @@ static int fam15h_power_probe(struct pci_dev *pdev, if (ret) return ret; + mutex_init(&data->acc_pwr_mutex); data->pdev = pdev; hwmon_dev = devm_hwmon_device_register_with_groups(dev, "fam15h_power", -- 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/