platform-driver-x86.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH v2] platform/x86/intel/pmc: core: Add support to show LTR-ignored components
@ 2023-01-25 12:43 Rajat Khandelwal
  2023-01-30 13:07 ` Hans de Goede
  0 siblings, 1 reply; 2+ messages in thread
From: Rajat Khandelwal @ 2023-01-25 12:43 UTC (permalink / raw)
  To: irenic.rajneesh, david.e.box, hdegoede, markgross
  Cc: platform-driver-x86, linux-kernel, rajat.khandelwal, Rajat Khandelwal

From: Rajat Khandelwal <rajat.khandelwal@linux.intel.com>

Currently, 'ltr_ignore' sysfs attribute, when read, returns nothing, even
if there are components whose LTR values have been ignored.

This patch adds the feature to print out such components, if they exist.

Signed-off-by: Rajat Khandelwal <rajat.khandelwal@linux.intel.com>
---

v2: kmalloc -> devm_kmalloc

 drivers/platform/x86/intel/pmc/core.c | 47 ++++++++++++++++++++-------
 drivers/platform/x86/intel/pmc/core.h |  2 +-
 2 files changed, 36 insertions(+), 13 deletions(-)

diff --git a/drivers/platform/x86/intel/pmc/core.c b/drivers/platform/x86/intel/pmc/core.c
index 3a15d32d7644..d4196b10b8af 100644
--- a/drivers/platform/x86/intel/pmc/core.c
+++ b/drivers/platform/x86/intel/pmc/core.c
@@ -53,6 +53,14 @@ const struct pmc_bit_map msr_map[] = {
 	{}
 };
 
+struct ltr_entry {
+	u32 comp_index;
+	const char *comp_name;
+	struct list_head node;
+};
+
+static LIST_HEAD(ltr_ignore_list);
+
 static inline u32 pmc_core_reg_read(struct pmc_dev *pmcdev, int reg_offset)
 {
 	return readl(pmcdev->regbase + reg_offset);
@@ -435,27 +443,18 @@ static int pmc_core_pll_show(struct seq_file *s, void *unused)
 }
 DEFINE_SHOW_ATTRIBUTE(pmc_core_pll);
 
-int pmc_core_send_ltr_ignore(struct pmc_dev *pmcdev, u32 value)
+void pmc_core_send_ltr_ignore(struct pmc_dev *pmcdev, u32 value)
 {
 	const struct pmc_reg_map *map = pmcdev->map;
 	u32 reg;
-	int err = 0;
 
 	mutex_lock(&pmcdev->lock);
 
-	if (value > map->ltr_ignore_max) {
-		err = -EINVAL;
-		goto out_unlock;
-	}
-
 	reg = pmc_core_reg_read(pmcdev, map->ltr_ignore_offset);
 	reg |= BIT(value);
 	pmc_core_reg_write(pmcdev, map->ltr_ignore_offset, reg);
 
-out_unlock:
 	mutex_unlock(&pmcdev->lock);
-
-	return err;
 }
 
 static ssize_t pmc_core_ltr_ignore_write(struct file *file,
@@ -464,6 +463,8 @@ static ssize_t pmc_core_ltr_ignore_write(struct file *file,
 {
 	struct seq_file *s = file->private_data;
 	struct pmc_dev *pmcdev = s->private;
+	const struct pmc_reg_map *map = pmcdev->map;
+	struct ltr_entry *entry;
 	u32 buf_size, value;
 	int err;
 
@@ -473,13 +474,35 @@ static ssize_t pmc_core_ltr_ignore_write(struct file *file,
 	if (err)
 		return err;
 
-	err = pmc_core_send_ltr_ignore(pmcdev, value);
+	if (value > map->ltr_ignore_max)
+		return -EINVAL;
 
-	return err == 0 ? count : err;
+	list_for_each_entry(entry, &ltr_ignore_list, node) {
+		if (entry->comp_index == value)
+			return -EEXIST;
+	}
+
+	entry = devm_kmalloc(&pmcdev->pdev->dev, sizeof(*entry), GFP_KERNEL);
+	if (!entry)
+		return -ENOMEM;
+
+	entry->comp_name = map->ltr_show_sts[value].name;
+	entry->comp_index = value;
+	list_add_tail(&entry->node, &ltr_ignore_list);
+
+	pmc_core_send_ltr_ignore(pmcdev, value);
+
+	return count;
 }
 
 static int pmc_core_ltr_ignore_show(struct seq_file *s, void *unused)
 {
+	struct ltr_entry *entry;
+
+	list_for_each_entry(entry, &ltr_ignore_list, node) {
+		seq_printf(s, "%s\n", entry->comp_name);
+	}
+
 	return 0;
 }
 
diff --git a/drivers/platform/x86/intel/pmc/core.h b/drivers/platform/x86/intel/pmc/core.h
index 810204d758ab..da35b0fcbe6e 100644
--- a/drivers/platform/x86/intel/pmc/core.h
+++ b/drivers/platform/x86/intel/pmc/core.h
@@ -396,7 +396,7 @@ extern const struct pmc_reg_map adl_reg_map;
 extern const struct pmc_reg_map mtl_reg_map;
 
 extern void pmc_core_get_tgl_lpm_reqs(struct platform_device *pdev);
-extern int pmc_core_send_ltr_ignore(struct pmc_dev *pmcdev, u32 value);
+extern void pmc_core_send_ltr_ignore(struct pmc_dev *pmcdev, u32 value);
 
 void spt_core_init(struct pmc_dev *pmcdev);
 void cnp_core_init(struct pmc_dev *pmcdev);
-- 
2.34.1


^ permalink raw reply related	[flat|nested] 2+ messages in thread

* Re: [PATCH v2] platform/x86/intel/pmc: core: Add support to show LTR-ignored components
  2023-01-25 12:43 [PATCH v2] platform/x86/intel/pmc: core: Add support to show LTR-ignored components Rajat Khandelwal
@ 2023-01-30 13:07 ` Hans de Goede
  0 siblings, 0 replies; 2+ messages in thread
From: Hans de Goede @ 2023-01-30 13:07 UTC (permalink / raw)
  To: Rajat Khandelwal, irenic.rajneesh, david.e.box, markgross
  Cc: platform-driver-x86, linux-kernel, Rajat Khandelwal

Hi,

On 1/25/23 13:43, Rajat Khandelwal wrote:
> From: Rajat Khandelwal <rajat.khandelwal@linux.intel.com>
> 
> Currently, 'ltr_ignore' sysfs attribute, when read, returns nothing, even
> if there are components whose LTR values have been ignored.
> 
> This patch adds the feature to print out such components, if they exist.
> 
> Signed-off-by: Rajat Khandelwal <rajat.khandelwal@linux.intel.com>
> ---
> 
> v2: kmalloc -> devm_kmalloc
> 
>  drivers/platform/x86/intel/pmc/core.c | 47 ++++++++++++++++++++-------
>  drivers/platform/x86/intel/pmc/core.h |  2 +-
>  2 files changed, 36 insertions(+), 13 deletions(-)
> 
> diff --git a/drivers/platform/x86/intel/pmc/core.c b/drivers/platform/x86/intel/pmc/core.c
> index 3a15d32d7644..d4196b10b8af 100644
> --- a/drivers/platform/x86/intel/pmc/core.c
> +++ b/drivers/platform/x86/intel/pmc/core.c
> @@ -53,6 +53,14 @@ const struct pmc_bit_map msr_map[] = {
>  	{}
>  };
>  
> +struct ltr_entry {
> +	u32 comp_index;
> +	const char *comp_name;
> +	struct list_head node;
> +};
> +
> +static LIST_HEAD(ltr_ignore_list);

You need to add a static mutex here to protect this list and then take
that mutex in places where you modify or read the list.

Regards,

Hans



> +
>  static inline u32 pmc_core_reg_read(struct pmc_dev *pmcdev, int reg_offset)
>  {
>  	return readl(pmcdev->regbase + reg_offset);
> @@ -435,27 +443,18 @@ static int pmc_core_pll_show(struct seq_file *s, void *unused)
>  }
>  DEFINE_SHOW_ATTRIBUTE(pmc_core_pll);
>  
> -int pmc_core_send_ltr_ignore(struct pmc_dev *pmcdev, u32 value)
> +void pmc_core_send_ltr_ignore(struct pmc_dev *pmcdev, u32 value)
>  {
>  	const struct pmc_reg_map *map = pmcdev->map;
>  	u32 reg;
> -	int err = 0;
>  
>  	mutex_lock(&pmcdev->lock);
>  
> -	if (value > map->ltr_ignore_max) {
> -		err = -EINVAL;
> -		goto out_unlock;
> -	}
> -
>  	reg = pmc_core_reg_read(pmcdev, map->ltr_ignore_offset);
>  	reg |= BIT(value);
>  	pmc_core_reg_write(pmcdev, map->ltr_ignore_offset, reg);
>  
> -out_unlock:
>  	mutex_unlock(&pmcdev->lock);
> -
> -	return err;
>  }
>  
>  static ssize_t pmc_core_ltr_ignore_write(struct file *file,
> @@ -464,6 +463,8 @@ static ssize_t pmc_core_ltr_ignore_write(struct file *file,
>  {
>  	struct seq_file *s = file->private_data;
>  	struct pmc_dev *pmcdev = s->private;
> +	const struct pmc_reg_map *map = pmcdev->map;
> +	struct ltr_entry *entry;
>  	u32 buf_size, value;
>  	int err;
>  
> @@ -473,13 +474,35 @@ static ssize_t pmc_core_ltr_ignore_write(struct file *file,
>  	if (err)
>  		return err;
>  
> -	err = pmc_core_send_ltr_ignore(pmcdev, value);
> +	if (value > map->ltr_ignore_max)
> +		return -EINVAL;
>  
> -	return err == 0 ? count : err;
> +	list_for_each_entry(entry, &ltr_ignore_list, node) {
> +		if (entry->comp_index == value)
> +			return -EEXIST;
> +	}
> +
> +	entry = devm_kmalloc(&pmcdev->pdev->dev, sizeof(*entry), GFP_KERNEL);
> +	if (!entry)
> +		return -ENOMEM;
> +
> +	entry->comp_name = map->ltr_show_sts[value].name;
> +	entry->comp_index = value;
> +	list_add_tail(&entry->node, &ltr_ignore_list);
> +
> +	pmc_core_send_ltr_ignore(pmcdev, value);
> +
> +	return count;
>  }
>  
>  static int pmc_core_ltr_ignore_show(struct seq_file *s, void *unused)
>  {
> +	struct ltr_entry *entry;
> +
> +	list_for_each_entry(entry, &ltr_ignore_list, node) {
> +		seq_printf(s, "%s\n", entry->comp_name);
> +	}
> +
>  	return 0;
>  }
>  
> diff --git a/drivers/platform/x86/intel/pmc/core.h b/drivers/platform/x86/intel/pmc/core.h
> index 810204d758ab..da35b0fcbe6e 100644
> --- a/drivers/platform/x86/intel/pmc/core.h
> +++ b/drivers/platform/x86/intel/pmc/core.h
> @@ -396,7 +396,7 @@ extern const struct pmc_reg_map adl_reg_map;
>  extern const struct pmc_reg_map mtl_reg_map;
>  
>  extern void pmc_core_get_tgl_lpm_reqs(struct platform_device *pdev);
> -extern int pmc_core_send_ltr_ignore(struct pmc_dev *pmcdev, u32 value);
> +extern void pmc_core_send_ltr_ignore(struct pmc_dev *pmcdev, u32 value);
>  
>  void spt_core_init(struct pmc_dev *pmcdev);
>  void cnp_core_init(struct pmc_dev *pmcdev);


^ permalink raw reply	[flat|nested] 2+ messages in thread

end of thread, other threads:[~2023-01-30 13:08 UTC | newest]

Thread overview: 2+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2023-01-25 12:43 [PATCH v2] platform/x86/intel/pmc: core: Add support to show LTR-ignored components Rajat Khandelwal
2023-01-30 13:07 ` Hans de Goede

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).