From: Naveen Krishna Chatradhi <nchatrad@amd.com>
To: linux-hwmon@vger.kernel.org
Cc: linux@roeck-us.net, Naveen Krishna Chatradhi <nchatrad@amd.com>
Subject: [PATCH 4/6] hwmon: amd_energy: let user enable/disable the sw accumulation
Date: Sat, 5 Sep 2020 20:02:28 +0530 [thread overview]
Message-ID: <20200905143230.195049-5-nchatrad@amd.com> (raw)
In-Reply-To: <20200905143230.195049-1-nchatrad@amd.com>
Provide an option "accumulator_status" via sysfs to enable/disable
the software accumulation of energy counters.
Signed-off-by: Naveen Krishna Chatradhi <nchatrad@amd.com>
---
drivers/hwmon/amd_energy.c | 104 ++++++++++++++++++++++++++++++-------
1 file changed, 86 insertions(+), 18 deletions(-)
diff --git a/drivers/hwmon/amd_energy.c b/drivers/hwmon/amd_energy.c
index 96c61784d05c..c294bea56c02 100644
--- a/drivers/hwmon/amd_energy.c
+++ b/drivers/hwmon/amd_energy.c
@@ -32,6 +32,8 @@
#define AMD_ENERGY_UNIT_MASK 0x01F00
#define AMD_ENERGY_MASK 0xFFFFFFFF
+static struct device_attribute accumulate_attr;
+
struct sensor_accumulator {
u64 energy_ctr;
u64 prev_value;
@@ -42,10 +44,12 @@ struct amd_energy_data {
const struct hwmon_channel_info *info[2];
struct hwmon_chip_info chip;
struct task_struct *wrap_accumulate;
+ struct device *hwmon_dev;
/* Lock around the accumulator */
struct mutex lock;
/* An accumulator for each core and socket */
struct sensor_accumulator *accums;
+ bool accumulator_status;
/* Energy Status Units */
u64 energy_units;
unsigned int timeout;
@@ -128,13 +132,15 @@ static void amd_add_delta(struct amd_energy_data *data, int ch,
rdmsrl_safe_on_cpu(cpu, reg, &input);
input &= AMD_ENERGY_MASK;
- accum = &data->accums[ch];
- if (input >= accum->prev_value)
- input += accum->energy_ctr -
- accum->prev_value;
- else
- input += UINT_MAX - accum->prev_value +
- accum->energy_ctr;
+ if (data->accumulator_status) {
+ accum = &data->accums[ch];
+ if (input >= accum->prev_value)
+ input += accum->energy_ctr -
+ accum->prev_value;
+ else
+ input += UINT_MAX - accum->prev_value +
+ accum->energy_ctr;
+ }
/* Energy consumed = (1/(2^ESU) * RAW * 1000000UL) μJoules */
*val = div64_ul(input * 1000000UL, BIT(data->energy_units));
@@ -264,9 +270,67 @@ static int amd_create_sensor(struct device *dev,
return 0;
}
+static ssize_t amd_energy_accumulate_show(struct device *dev,
+ struct device_attribute *dev_attr,
+ char *buf)
+{
+ struct amd_energy_data *data = dev_get_drvdata(dev);
+
+ return sprintf(buf, "%d\n", data->accumulator_status);
+}
+
+static ssize_t amd_energy_accumulate_store(struct device *dev,
+ struct device_attribute *dev_attr,
+ const char *buf, size_t count)
+{
+ struct amd_energy_data *data = dev_get_drvdata(dev);
+ bool input;
+ int ret;
+
+ ret = kstrtobool(buf, &input);
+ if (ret)
+ return ret;
+
+ if (data->accumulator_status == input)
+ return count;
+
+ if (input) {
+ memset(data->accums, 0, (data->nr_cpus + data->nr_socks) *
+ sizeof(struct sensor_accumulator));
+
+ if (!data->wrap_accumulate) {
+ data->wrap_accumulate =
+ kthread_run(energy_accumulator,
+ data, "%s", dev_name(dev));
+ if (IS_ERR(data->wrap_accumulate))
+ return PTR_ERR(data->wrap_accumulate);
+ }
+ } else {
+ if (data && data->wrap_accumulate) {
+ ret = kthread_stop(data->wrap_accumulate);
+ if (ret)
+ return ret;
+ data->wrap_accumulate = NULL;
+ }
+ }
+ data->accumulator_status = input;
+
+ return count;
+}
+
+static int create_accumulate_status_file(struct amd_energy_data *data)
+{
+ accumulate_attr.attr.name = "accumulator_status";
+ accumulate_attr.attr.mode = 0664;
+ accumulate_attr.show = amd_energy_accumulate_show;
+ accumulate_attr.store = amd_energy_accumulate_store;
+
+ return sysfs_create_file(&data->hwmon_dev->kobj,
+ &accumulate_attr.attr);
+}
+
static int amd_energy_probe(struct platform_device *pdev)
{
- struct device *hwmon_dev;
struct amd_energy_data *data;
struct device *dev = &pdev->dev;
int ret;
@@ -290,12 +354,12 @@ static int amd_energy_probe(struct platform_device *pdev)
mutex_init(&data->lock);
get_energy_units(data);
- hwmon_dev = devm_hwmon_device_register_with_info(dev, DRVNAME,
- data,
- &data->chip,
- NULL);
- if (IS_ERR(hwmon_dev))
- return PTR_ERR(hwmon_dev);
+ data->hwmon_dev = devm_hwmon_device_register_with_info(dev, DRVNAME,
+ data,
+ &data->chip,
+ NULL);
+ if (IS_ERR(data->hwmon_dev))
+ return PTR_ERR(data->hwmon_dev);
/* Once in 3 minutes for a resolution of 1/2*16 */
if (data->energy_units == 0x10)
@@ -305,10 +369,12 @@ static int amd_energy_probe(struct platform_device *pdev)
if (data->energy_units == 0x6)
data->timeout = 3 * 24 * 60 * 60;
- data->wrap_accumulate = kthread_run(energy_accumulator, data,
- "%s", dev_name(hwmon_dev));
- if (IS_ERR(data->wrap_accumulate))
- return PTR_ERR(data->wrap_accumulate);
+ /* Disabling the energy accumulation by default */
+ data->accumulator_status = 0;
+
+ ret = create_accumulate_status_file(data);
+ if (ret)
+ return ret;
return 0;
}
@@ -317,6 +383,8 @@ static int amd_energy_remove(struct platform_device *pdev)
{
struct amd_energy_data *data = dev_get_drvdata(&pdev->dev);
+ sysfs_remove_file(&data->hwmon_dev->kobj, &accumulate_attr.attr);
+
if (data && data->wrap_accumulate)
kthread_stop(data->wrap_accumulate);
--
2.26.2
next prev parent reply other threads:[~2020-09-05 14:33 UTC|newest]
Thread overview: 24+ messages / expand[flat|nested] mbox.gz Atom feed top
2020-09-05 14:32 [PATCH 0/6] RFC: hwmon: few improvements to amd_energy driver Naveen Krishna Chatradhi
2020-09-05 14:32 ` [PATCH 1/6] hwmon: amd_energy: Move label out of accumulation structure Naveen Krishna Chatradhi
2020-09-05 14:32 ` [PATCH 2/6] hwmon: amd_energy: optimize accumulation interval Naveen Krishna Chatradhi
2020-09-05 15:11 ` Guenter Roeck
[not found] ` <DM6PR12MB4388DCF9B42BA0093774606FE82A0@DM6PR12MB4388.namprd12.prod.outlook.com>
2020-09-05 16:27 ` Naveen Krishna Ch
2020-09-05 14:32 ` [PATCH 3/6] hwmon: amd_energy: Improve the accumulation logic Naveen Krishna Chatradhi
2020-09-05 15:14 ` Guenter Roeck
[not found] ` <DM6PR12MB438850F9DFD14163F11AA946E82A0@DM6PR12MB4388.namprd12.prod.outlook.com>
2020-09-05 16:31 ` FW: " Naveen Krishna Ch
2020-09-05 14:32 ` Naveen Krishna Chatradhi [this message]
2020-09-05 15:17 ` [PATCH 4/6] hwmon: amd_energy: let user enable/disable the sw accumulation Guenter Roeck
2020-09-05 15:33 ` Guenter Roeck
[not found] ` <DM6PR12MB4388A21B749811BBE1309AA3E8290@DM6PR12MB4388.namprd12.prod.outlook.com>
2020-09-08 16:21 ` FW: " Naveen Krishna Ch
2020-09-08 16:36 ` Guenter Roeck
2020-09-05 14:32 ` [PATCH 5/6] hwmon: amd_energy: dump energy counters via debugfs Naveen Krishna Chatradhi
2020-09-05 15:19 ` Guenter Roeck
[not found] ` <DM6PR12MB4388C77E35BD61F4DC2EAEC9E82A0@DM6PR12MB4388.namprd12.prod.outlook.com>
2020-09-05 16:41 ` FW: " Naveen Krishna Ch
2020-09-05 16:58 ` Guenter Roeck
2020-09-08 16:10 ` Naveen Krishna Ch
2020-09-08 16:34 ` Guenter Roeck
2020-09-08 16:46 ` Naveen Krishna Ch
2020-09-08 17:11 ` Guenter Roeck
2020-09-25 7:23 ` Chatradhi, Naveen Krishna
2020-09-05 14:32 ` [PATCH 6/6] hwmon: (amd_energy) Update driver documentation Naveen Krishna Chatradhi
2020-09-25 7:26 ` [PATCH 0/6] RFC: hwmon: few improvements to amd_energy driver Chatradhi, Naveen Krishna
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20200905143230.195049-5-nchatrad@amd.com \
--to=nchatrad@amd.com \
--cc=linux-hwmon@vger.kernel.org \
--cc=linux@roeck-us.net \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.