[v3,11/24] thermal: intel: hfi: Introduce Intel Thread Director classes

Message ID 20230207051105.11575-12-ricardo.neri-calderon@linux.intel.com
State New
Headers
Series sched: Introduce classes of tasks for load balance |

Commit Message

Ricardo Neri Feb. 7, 2023, 5:10 a.m. UTC
  On Intel hybrid parts, each type of CPU has specific performance and
energy efficiency capabilities. The Intel Thread Director technology
extends the Hardware Feedback Interface (HFI) to provide performance and
energy efficiency data for advanced classes of instructions.

Add support to parse per-class capabilities.

Cc: Ben Segall <bsegall@google.com>
Cc: Daniel Bristot de Oliveira <bristot@redhat.com>
Cc: Dietmar Eggemann <dietmar.eggemann@arm.com>
Cc: Ionela Voinescu <ionela.voinescu@arm.com>
Cc: Joel Fernandes (Google) <joel@joelfernandes.org>
Cc: Len Brown <len.brown@intel.com>
Cc: Lukasz Luba <lukasz.luba@arm.com>
Cc: Mel Gorman <mgorman@suse.de>
Cc: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
Cc: Srinivas Pandruvada <srinivas.pandruvada@linux.intel.com>
Cc: Steven Rostedt <rostedt@goodmis.org>
Cc: Tim C. Chen <tim.c.chen@intel.com>
Cc: Valentin Schneider <vschneid@redhat.com>
Cc: x86@kernel.org
Cc: linux-pm@vger.kernel.org
Cc: linux-kernel@vger.kernel.org
Signed-off-by: Ricardo Neri <ricardo.neri-calderon@linux.intel.com>
---
Changes since v2:
 * None

Changes since v1:
 * Removed a now obsolete comment.
---
 drivers/thermal/intel/intel_hfi.c | 30 ++++++++++++++++++++++++------
 1 file changed, 24 insertions(+), 6 deletions(-)
  

Comments

Rafael J. Wysocki March 27, 2023, 4:31 p.m. UTC | #1
On Tue, Feb 7, 2023 at 6:02 AM Ricardo Neri
<ricardo.neri-calderon@linux.intel.com> wrote:
>
> On Intel hybrid parts, each type of CPU has specific performance and
> energy efficiency capabilities. The Intel Thread Director technology
> extends the Hardware Feedback Interface (HFI) to provide performance and
> energy efficiency data for advanced classes of instructions.
>
> Add support to parse per-class capabilities.
>
> Cc: Ben Segall <bsegall@google.com>
> Cc: Daniel Bristot de Oliveira <bristot@redhat.com>
> Cc: Dietmar Eggemann <dietmar.eggemann@arm.com>
> Cc: Ionela Voinescu <ionela.voinescu@arm.com>
> Cc: Joel Fernandes (Google) <joel@joelfernandes.org>
> Cc: Len Brown <len.brown@intel.com>
> Cc: Lukasz Luba <lukasz.luba@arm.com>
> Cc: Mel Gorman <mgorman@suse.de>
> Cc: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
> Cc: Srinivas Pandruvada <srinivas.pandruvada@linux.intel.com>
> Cc: Steven Rostedt <rostedt@goodmis.org>
> Cc: Tim C. Chen <tim.c.chen@intel.com>
> Cc: Valentin Schneider <vschneid@redhat.com>
> Cc: x86@kernel.org
> Cc: linux-pm@vger.kernel.org
> Cc: linux-kernel@vger.kernel.org
> Signed-off-by: Ricardo Neri <ricardo.neri-calderon@linux.intel.com>

No objections to this patch, so

Acked-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>

> ---
> Changes since v2:
>  * None
>
> Changes since v1:
>  * Removed a now obsolete comment.
> ---
>  drivers/thermal/intel/intel_hfi.c | 30 ++++++++++++++++++++++++------
>  1 file changed, 24 insertions(+), 6 deletions(-)
>
> diff --git a/drivers/thermal/intel/intel_hfi.c b/drivers/thermal/intel/intel_hfi.c
> index 6e604bda2b93..2527ae3836c7 100644
> --- a/drivers/thermal/intel/intel_hfi.c
> +++ b/drivers/thermal/intel/intel_hfi.c
> @@ -77,7 +77,7 @@ union cpuid6_edx {
>   * @ee_cap:            Energy efficiency capability
>   *
>   * Capabilities of a logical processor in the HFI table. These capabilities are
> - * unitless.
> + * unitless and specific to each HFI class.
>   */
>  struct hfi_cpu_data {
>         u8      perf_cap;
> @@ -89,7 +89,8 @@ struct hfi_cpu_data {
>   * @perf_updated:      Hardware updated performance capabilities
>   * @ee_updated:                Hardware updated energy efficiency capabilities
>   *
> - * Properties of the data in an HFI table.
> + * Properties of the data in an HFI table. There exists one header per each
> + * HFI class.
>   */
>  struct hfi_hdr {
>         u8      perf_updated;
> @@ -127,16 +128,21 @@ struct hfi_instance {
>
>  /**
>   * struct hfi_features - Supported HFI features
> + * @nr_classes:                Number of classes supported
>   * @nr_table_pages:    Size of the HFI table in 4KB pages
>   * @cpu_stride:                Stride size to locate the capability data of a logical
>   *                     processor within the table (i.e., row stride)
> + * @class_stride:      Stride size to locate a class within the capability
> + *                     data of a logical processor or the HFI table header
>   * @hdr_size:          Size of the table header
>   *
>   * Parameters and supported features that are common to all HFI instances
>   */
>  struct hfi_features {
> +       unsigned int    nr_classes;
>         size_t          nr_table_pages;
>         unsigned int    cpu_stride;
> +       unsigned int    class_stride;
>         unsigned int    hdr_size;
>  };
>
> @@ -333,8 +339,8 @@ static void init_hfi_cpu_index(struct hfi_cpu_info *info)
>  }
>
>  /*
> - * The format of the HFI table depends on the number of capabilities that the
> - * hardware supports. Keep a data structure to navigate the table.
> + * The format of the HFI table depends on the number of capabilities and classes
> + * that the hardware supports. Keep a data structure to navigate the table.
>   */
>  static void init_hfi_instance(struct hfi_instance *hfi_instance)
>  {
> @@ -515,18 +521,30 @@ static __init int hfi_parse_features(void)
>         /* The number of 4KB pages required by the table */
>         hfi_features.nr_table_pages = edx.split.table_pages + 1;
>
> +       /*
> +        * Capability fields of an HFI class are grouped together. Classes are
> +        * contiguous in memory.  Hence, use the number of supported features to
> +        * locate a specific class.
> +        */
> +       hfi_features.class_stride = nr_capabilities;
> +
> +       /* For now, use only one class of the HFI table */
> +       hfi_features.nr_classes = 1;
> +
>         /*
>          * The header contains change indications for each supported feature.
>          * The size of the table header is rounded up to be a multiple of 8
>          * bytes.
>          */
> -       hfi_features.hdr_size = DIV_ROUND_UP(nr_capabilities, 8) * 8;
> +       hfi_features.hdr_size = DIV_ROUND_UP(nr_capabilities *
> +                                            hfi_features.nr_classes, 8) * 8;
>
>         /*
>          * Data of each logical processor is also rounded up to be a multiple
>          * of 8 bytes.
>          */
> -       hfi_features.cpu_stride = DIV_ROUND_UP(nr_capabilities, 8) * 8;
> +       hfi_features.cpu_stride = DIV_ROUND_UP(nr_capabilities *
> +                                              hfi_features.nr_classes, 8) * 8;
>
>         return 0;
>  }
> --
> 2.25.1
>
  
Ricardo Neri March 28, 2023, 11:42 p.m. UTC | #2
On Mon, Mar 27, 2023 at 06:31:03PM +0200, Rafael J. Wysocki wrote:
> On Tue, Feb 7, 2023 at 6:02 AM Ricardo Neri
> <ricardo.neri-calderon@linux.intel.com> wrote:
> >
> > On Intel hybrid parts, each type of CPU has specific performance and
> > energy efficiency capabilities. The Intel Thread Director technology
> > extends the Hardware Feedback Interface (HFI) to provide performance and
> > energy efficiency data for advanced classes of instructions.
> >
> > Add support to parse per-class capabilities.
> >
> > Cc: Ben Segall <bsegall@google.com>
> > Cc: Daniel Bristot de Oliveira <bristot@redhat.com>
> > Cc: Dietmar Eggemann <dietmar.eggemann@arm.com>
> > Cc: Ionela Voinescu <ionela.voinescu@arm.com>
> > Cc: Joel Fernandes (Google) <joel@joelfernandes.org>
> > Cc: Len Brown <len.brown@intel.com>
> > Cc: Lukasz Luba <lukasz.luba@arm.com>
> > Cc: Mel Gorman <mgorman@suse.de>
> > Cc: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
> > Cc: Srinivas Pandruvada <srinivas.pandruvada@linux.intel.com>
> > Cc: Steven Rostedt <rostedt@goodmis.org>
> > Cc: Tim C. Chen <tim.c.chen@intel.com>
> > Cc: Valentin Schneider <vschneid@redhat.com>
> > Cc: x86@kernel.org
> > Cc: linux-pm@vger.kernel.org
> > Cc: linux-kernel@vger.kernel.org
> > Signed-off-by: Ricardo Neri <ricardo.neri-calderon@linux.intel.com>
> 
> No objections to this patch, so
> 
> Acked-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>

Thank you Rafael!
  

Patch

diff --git a/drivers/thermal/intel/intel_hfi.c b/drivers/thermal/intel/intel_hfi.c
index 6e604bda2b93..2527ae3836c7 100644
--- a/drivers/thermal/intel/intel_hfi.c
+++ b/drivers/thermal/intel/intel_hfi.c
@@ -77,7 +77,7 @@  union cpuid6_edx {
  * @ee_cap:		Energy efficiency capability
  *
  * Capabilities of a logical processor in the HFI table. These capabilities are
- * unitless.
+ * unitless and specific to each HFI class.
  */
 struct hfi_cpu_data {
 	u8	perf_cap;
@@ -89,7 +89,8 @@  struct hfi_cpu_data {
  * @perf_updated:	Hardware updated performance capabilities
  * @ee_updated:		Hardware updated energy efficiency capabilities
  *
- * Properties of the data in an HFI table.
+ * Properties of the data in an HFI table. There exists one header per each
+ * HFI class.
  */
 struct hfi_hdr {
 	u8	perf_updated;
@@ -127,16 +128,21 @@  struct hfi_instance {
 
 /**
  * struct hfi_features - Supported HFI features
+ * @nr_classes:		Number of classes supported
  * @nr_table_pages:	Size of the HFI table in 4KB pages
  * @cpu_stride:		Stride size to locate the capability data of a logical
  *			processor within the table (i.e., row stride)
+ * @class_stride:	Stride size to locate a class within the capability
+ *			data of a logical processor or the HFI table header
  * @hdr_size:		Size of the table header
  *
  * Parameters and supported features that are common to all HFI instances
  */
 struct hfi_features {
+	unsigned int	nr_classes;
 	size_t		nr_table_pages;
 	unsigned int	cpu_stride;
+	unsigned int	class_stride;
 	unsigned int	hdr_size;
 };
 
@@ -333,8 +339,8 @@  static void init_hfi_cpu_index(struct hfi_cpu_info *info)
 }
 
 /*
- * The format of the HFI table depends on the number of capabilities that the
- * hardware supports. Keep a data structure to navigate the table.
+ * The format of the HFI table depends on the number of capabilities and classes
+ * that the hardware supports. Keep a data structure to navigate the table.
  */
 static void init_hfi_instance(struct hfi_instance *hfi_instance)
 {
@@ -515,18 +521,30 @@  static __init int hfi_parse_features(void)
 	/* The number of 4KB pages required by the table */
 	hfi_features.nr_table_pages = edx.split.table_pages + 1;
 
+	/*
+	 * Capability fields of an HFI class are grouped together. Classes are
+	 * contiguous in memory.  Hence, use the number of supported features to
+	 * locate a specific class.
+	 */
+	hfi_features.class_stride = nr_capabilities;
+
+	/* For now, use only one class of the HFI table */
+	hfi_features.nr_classes = 1;
+
 	/*
 	 * The header contains change indications for each supported feature.
 	 * The size of the table header is rounded up to be a multiple of 8
 	 * bytes.
 	 */
-	hfi_features.hdr_size = DIV_ROUND_UP(nr_capabilities, 8) * 8;
+	hfi_features.hdr_size = DIV_ROUND_UP(nr_capabilities *
+					     hfi_features.nr_classes, 8) * 8;
 
 	/*
 	 * Data of each logical processor is also rounded up to be a multiple
 	 * of 8 bytes.
 	 */
-	hfi_features.cpu_stride = DIV_ROUND_UP(nr_capabilities, 8) * 8;
+	hfi_features.cpu_stride = DIV_ROUND_UP(nr_capabilities *
+					       hfi_features.nr_classes, 8) * 8;
 
 	return 0;
 }