All of lore.kernel.org
 help / color / mirror / Atom feed
From: Guenter Roeck <linux@roeck-us.net>
To: "Huang Rui" <ray.huang@amd.com>, "Borislav Petkov" <bp@suse.de>,
	"Peter Zijlstra" <peterz@infradead.org>,
	"Jean Delvare" <jdelvare@suse.de>,
	"Andy Lutomirski" <luto@amacapital.net>,
	"Andreas Herrmann" <herrmann.der.user@gmail.com>,
	"Thomas Gleixner" <tglx@linutronix.de>,
	"Ingo Molnar" <mingo@kernel.org>,
	"Rafael J. Wysocki" <rjw@rjwysocki.net>,
	"Len Brown" <lenb@kernel.org>,
	"John Stultz" <john.stultz@linaro.org>,
	"Frédéric Weisbecker" <fweisbec@gmail.com>
Cc: lm-sensors@lm-sensors.org, linux-kernel@vger.kernel.org,
	x86@kernel.org,
	Andreas Herrmann <herrmann.der.user@googlemail.com>,
	Aravind Gopalakrishnan <Aravind.Gopalakrishnan@amd.com>,
	Borislav Petkov <bp@alien8.de>,
	Fengguang Wu <fengguang.wu@intel.com>,
	Aaron Lu <aaron.lu@intel.com>, Tony Li <tony.li@amd.com>
Subject: Re: [PATCH v2 01/10] hwmon: (fam15h_power) Refactor attributes for dynamically added
Date: Fri, 23 Oct 2015 06:42:20 -0700	[thread overview]
Message-ID: <562A393C.3000707@roeck-us.net> (raw)
In-Reply-To: <1445308109-17970-2-git-send-email-ray.huang@amd.com>

On 10/19/2015 07:28 PM, Huang Rui wrote:
> Attributes depend on the CPU model the driver gets loaded on.
> Therefore, add those attributes dynamically at init time. This is more
> flexible to control the different attributes on different platforms.
>
> Suggestedy-by: Borislav Petkov <bp@alien8.de>
> Signed-off-by: Huang Rui <ray.huang@amd.com>
> Cc: Guenter Roeck <linux@roeck-us.net>
> Cc: Peter Zijlstra <peterz@infradead.org>
> Cc: Ingo Molnar <mingo@kernel.org>
> ---
>   drivers/hwmon/fam15h_power.c | 70 ++++++++++++++++++++++++++++----------------
>   1 file changed, 45 insertions(+), 25 deletions(-)
>
> diff --git a/drivers/hwmon/fam15h_power.c b/drivers/hwmon/fam15h_power.c
> index e80ee23..41d022e 100644
> --- a/drivers/hwmon/fam15h_power.c
> +++ b/drivers/hwmon/fam15h_power.c
> @@ -41,12 +41,17 @@ MODULE_LICENSE("GPL");
>   #define REG_TDP_RUNNING_AVERAGE		0xe0
>   #define REG_TDP_LIMIT3			0xe8
>
> +#define FAM15H_MIN_NUM_ATTRS		2
> +#define FAM15H_NUM_GROUPS		2
> +
>   struct fam15h_power_data {
>   	struct pci_dev *pdev;
>   	unsigned int tdp_to_watts;
>   	unsigned int base_tdp;
>   	unsigned int processor_pwr_watts;
>   	unsigned int cpu_pwr_sample_ratio;
> +	const struct attribute_group *fam15h_power_groups[FAM15H_NUM_GROUPS];
> +	struct attribute_group fam15h_power_group;
>   };
>
>   static ssize_t show_power(struct device *dev,
> @@ -105,29 +110,31 @@ static ssize_t show_power_crit(struct device *dev,
>   }
>   static DEVICE_ATTR(power1_crit, S_IRUGO, show_power_crit, NULL);
>
> -static umode_t fam15h_power_is_visible(struct kobject *kobj,
> -				       struct attribute *attr,
> -				       int index)
> +static int fam15h_power_init_attrs(struct pci_dev *pdev,
> +				   struct fam15h_power_data *data)
>   {
> -	/* power1_input is only reported for Fam15h, Models 00h-0fh */
> -	if (attr == &dev_attr_power1_input.attr &&
> -	   (boot_cpu_data.x86 != 0x15 || boot_cpu_data.x86_model > 0xf))
> -		return 0;
> +	int n = FAM15H_MIN_NUM_ATTRS;
> +	struct attribute **fam15h_power_attrs;
>
> -	return attr->mode;
> -}
> +	if (boot_cpu_data.x86 == 0x15 && boot_cpu_data.x86_model <= 0xf)
> +		n += 1;
>
> -static struct attribute *fam15h_power_attrs[] = {
> -	&dev_attr_power1_input.attr,
> -	&dev_attr_power1_crit.attr,
> -	NULL
> -};
> +	fam15h_power_attrs = devm_kcalloc(&pdev->dev, n,
> +					  sizeof(*fam15h_power_attrs),
> +					  GFP_KERNEL);
>
> -static const struct attribute_group fam15h_power_group = {
> -	.attrs = fam15h_power_attrs,
> -	.is_visible = fam15h_power_is_visible,
> -};
> -__ATTRIBUTE_GROUPS(fam15h_power);
> +	if (!fam15h_power_attrs)
> +		return -ENOMEM;
> +
> +	n = 0;
> +	fam15h_power_attrs[n++] = &dev_attr_power1_crit.attr;
> +	if (boot_cpu_data.x86 == 0x15 && boot_cpu_data.x86_model <= 0xf)
> +		fam15h_power_attrs[n++] = &dev_attr_power1_input.attr;
> +
> +	data->fam15h_power_group.attrs = fam15h_power_attrs;
> +
> +	return 0;
> +}
>
>   static bool should_load_on_this_node(struct pci_dev *f4)
>   {
> @@ -186,11 +193,12 @@ static int fam15h_power_resume(struct pci_dev *pdev)
>   #define fam15h_power_resume NULL
>   #endif
>
> -static void fam15h_power_init_data(struct pci_dev *f4,
> -					     struct fam15h_power_data *data)
> +static int fam15h_power_init_data(struct pci_dev *f4,
> +				  struct fam15h_power_data *data)
>   {
>   	u32 val, eax, ebx, ecx, edx;
>   	u64 tmp;
> +	int ret;
>
>   	pci_read_config_dword(f4, REG_PROCESSOR_TDP, &val);
>   	data->base_tdp = val >> 16;
> @@ -211,11 +219,15 @@ static void fam15h_power_init_data(struct pci_dev *f4,
>   	/* convert to microWatt */
>   	data->processor_pwr_watts = (tmp * 15625) >> 10;
>
> +	ret = fam15h_power_init_attrs(f4, data);
> +	if (ret)
> +		return ret;
> +
>   	cpuid(0x80000007, &eax, &ebx, &ecx, &edx);
>
>   	/* CPUID Fn8000_0007:EDX[12] indicates to support accumulated power */
>   	if (!(edx & BIT(12)))
> -		return;
> +		return 0;
>
>   	/*
>   	 * determine the ratio of the compute unit power accumulator
> @@ -223,14 +235,17 @@ static void fam15h_power_init_data(struct pci_dev *f4,
>   	 * Fn8000_0007:ECX
>   	 */
>   	data->cpu_pwr_sample_ratio = ecx;
> +
> +	return 0;
>   }
>
>   static int fam15h_power_probe(struct pci_dev *pdev,
> -					const struct pci_device_id *id)
> +			      const struct pci_device_id *id)
>   {
>   	struct fam15h_power_data *data;
>   	struct device *dev = &pdev->dev;
>   	struct device *hwmon_dev;
> +	int ret;
>
>   	/*
>   	 * though we ignore every other northbridge, we still have to
> @@ -246,12 +261,17 @@ static int fam15h_power_probe(struct pci_dev *pdev,
>   	if (!data)
>   		return -ENOMEM;
>
> -	fam15h_power_init_data(pdev, data);
> +	ret = fam15h_power_init_data(pdev, data);
> +	if (ret)
> +		return ret;
> +
>   	data->pdev = pdev;
>
> +	data->fam15h_power_groups[0] = &data->fam15h_power_group;
> +
>   	hwmon_dev = devm_hwmon_device_register_with_groups(dev, "fam15h_power",
>   							   data,
> -							   fam15h_power_groups);
> +							   (const struct attribute_group **)&data->fam15h_power_groups);

Why this typecast ? It should not be needed.

Guenter


  reply	other threads:[~2015-10-23 13:42 UTC|newest]

Thread overview: 39+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2015-10-20  2:28 [PATCH v2 00/10] hwmon: (fam15h_power) Introduce an accumulated power reporting algorithm Huang Rui
2015-10-20  2:28 ` [PATCH v2 01/10] hwmon: (fam15h_power) Refactor attributes for dynamically added Huang Rui
2015-10-23 13:42   ` Guenter Roeck [this message]
2015-10-26  1:58     ` Huang Rui
2015-10-26  2:14       ` Guenter Roeck
2015-10-26  2:25         ` Huang Rui
2015-10-20  2:28 ` [PATCH v2 02/10] hwmon: (fam15h_power) Enable power1_input on AMD Carrizo Huang Rui
2015-10-23 13:45   ` Guenter Roeck
2015-10-26  2:19     ` Huang Rui
2015-10-20  2:28 ` [PATCH v2 03/10] hwmon: (fam15h_power) Add max compute unit accumulated power Huang Rui
2015-10-20  2:28 ` [PATCH v2 04/10] x86, amd: add accessor for number of cores per compute unit Huang Rui
2015-10-20  2:28 ` [PATCH v2 05/10] hwmon: (fam15h_power) Add compute unit accumulated power Huang Rui
2015-10-20  7:24   ` kbuild test robot
2015-10-21  1:42     ` Huang Rui
2015-10-21  2:15       ` Guenter Roeck
2015-10-21  2:40         ` Huang Rui
2015-10-21  2:49           ` Guenter Roeck
2015-10-21  3:04             ` Huang Rui
2015-10-21  6:05               ` Jean Delvare
2015-10-21  6:28                 ` Huang Rui
2015-10-23 13:27   ` Borislav Petkov
2015-10-23 13:37     ` Guenter Roeck
2015-10-27  2:53     ` Huang Rui
2015-10-28  0:34       ` Borislav Petkov
2015-10-28  5:06         ` Huang Rui
2015-10-20  2:28 ` [PATCH v2 06/10] hwmon: (fam15h_power) Add ptsc counter value for " Huang Rui
2015-10-23 13:59   ` Guenter Roeck
2015-10-26  3:37     ` Huang Rui
2015-10-26  4:36       ` Borislav Petkov
2015-10-20  2:28 ` [PATCH v2 07/10] hwmon: (fam15h_power) Introduce a cpu accumulated power reporting algorithm Huang Rui
2015-10-23 13:28   ` Borislav Petkov
2015-10-26  3:46     ` Huang Rui
2015-10-26  4:41       ` Borislav Petkov
2015-10-23 14:20   ` Guenter Roeck
2015-10-27  3:36     ` Huang Rui
2015-10-20  2:28 ` [PATCH v2 08/10] hwmon: (fam15h_power) Add documentation for previous TDP reporting Huang Rui
2015-10-20  2:28 ` [PATCH v2 09/10] hwmon: (fam15h_power) Add documentation for accumulated power algorithm Huang Rui
2015-10-23 10:22   ` Borislav Petkov
2015-10-20  2:28 ` [PATCH v2 10/10] MAINTAINERS: change the maintainer of fam15h_power driver Huang Rui

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=562A393C.3000707@roeck-us.net \
    --to=linux@roeck-us.net \
    --cc=Aravind.Gopalakrishnan@amd.com \
    --cc=aaron.lu@intel.com \
    --cc=bp@alien8.de \
    --cc=bp@suse.de \
    --cc=fengguang.wu@intel.com \
    --cc=fweisbec@gmail.com \
    --cc=herrmann.der.user@gmail.com \
    --cc=herrmann.der.user@googlemail.com \
    --cc=jdelvare@suse.de \
    --cc=john.stultz@linaro.org \
    --cc=lenb@kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=lm-sensors@lm-sensors.org \
    --cc=luto@amacapital.net \
    --cc=mingo@kernel.org \
    --cc=peterz@infradead.org \
    --cc=ray.huang@amd.com \
    --cc=rjw@rjwysocki.net \
    --cc=tglx@linutronix.de \
    --cc=tony.li@amd.com \
    --cc=x86@kernel.org \
    /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.