linux-acpi.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH v4 0/3] arch_topology, ACPI: populate cpu capacity from CPPC
@ 2022-03-10 14:54 Ionela Voinescu
  2022-03-10 14:54 ` [PATCH v4 1/3] x86, ACPI: rename init_freq_invariance_cppc to arch_init_invariance_cppc Ionela Voinescu
                   ` (3 more replies)
  0 siblings, 4 replies; 5+ messages in thread
From: Ionela Voinescu @ 2022-03-10 14:54 UTC (permalink / raw)
  To: Sudeep Holla, Rafael J . Wysocki, Thomas Gleixner, Ingo Molnar,
	Giovanni Gherdovich, Catalin Marinas, Will Deacon,
	Valentin Schneider, Dietmar Eggemann, Sean Kelley
  Cc: Pierre Gondois, linux-kernel, linux-acpi, linux-arm-kernel

Hi all,

v3->v4:
 - v3 can be found at [3]
 - rebased on linux-next 20220310 which contains patches at [4]
   requested by Rafael
 - 2/3 fixed obsolete comment as reported by Yicong at [5]
 - Kept Acked-by,Tested-by as v4 has no code changes compared
   to v3, but only a comment fix.

v2->v3:
 - v2 can be found at [2]
 - Added sanity checking on perf_caps.highest_perf

v1->v2:
 - v1 can be found at [1]
 - Changed debug prints to the format used on the DT path
 - s/init_cpu_capacity_cppc/topology_init_cpu_capacity_cppc

Patches are based on linux next 20220310.

[1] https://lore.kernel.org/lkml/20210514095339.12979-1-ionela.voinescu@arm.com/
[2] https://lore.kernel.org/lkml/20210824105651.28660-1-ionela.voinescu@arm.com/
[3] https://lore.kernel.org/lkml/20220302180913.13229-1-ionela.voinescu@arm.com/
[4] https://lore.kernel.org/linux-acpi/20220214101450.356047-1-ray.huang@amd.com/
[5] https://lore.kernel.org/lkml/477748c7-ae9e-712b-90ad-b04a6767a996@huawei.com/


Thanks,
Ionela.

Ionela Voinescu (3):
  x86, ACPI: rename init_freq_invariance_cppc to
    arch_init_invariance_cppc
  arch_topology: obtain cpu capacity using information from CPPC
  arm64, topology: enable use of init_cpu_capacity_cppc()

 arch/arm64/include/asm/topology.h |  4 +++
 arch/x86/include/asm/topology.h   |  2 +-
 drivers/acpi/cppc_acpi.c          |  6 ++---
 drivers/base/arch_topology.c      | 45 ++++++++++++++++++++++++++++---
 include/linux/arch_topology.h     |  4 +++
 5 files changed, 54 insertions(+), 7 deletions(-)

-- 
2.25.1


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

* [PATCH v4 1/3] x86, ACPI: rename init_freq_invariance_cppc to arch_init_invariance_cppc
  2022-03-10 14:54 [PATCH v4 0/3] arch_topology, ACPI: populate cpu capacity from CPPC Ionela Voinescu
@ 2022-03-10 14:54 ` Ionela Voinescu
  2022-03-10 14:54 ` [PATCH v4 2/3] arch_topology: obtain cpu capacity using information from CPPC Ionela Voinescu
                   ` (2 subsequent siblings)
  3 siblings, 0 replies; 5+ messages in thread
From: Ionela Voinescu @ 2022-03-10 14:54 UTC (permalink / raw)
  To: Sudeep Holla, Rafael J . Wysocki, Thomas Gleixner, Ingo Molnar,
	Giovanni Gherdovich, Catalin Marinas, Will Deacon,
	Valentin Schneider, Dietmar Eggemann, Sean Kelley
  Cc: Pierre Gondois, linux-kernel, linux-acpi, linux-arm-kernel,
	Rafael J . Wysocki

init_freq_invariance_cppc() was called in acpi_cppc_processor_probe(),
after CPU performance information and controls were populated from the
per-cpu _CPC objects.

But these _CPC objects provide information that helps with both CPU
(u-arch) and frequency invariance. Therefore, change the function name
to a more generic one, while adding the arch_ prefix, as this function
is expected to be defined differently by different architectures.

Signed-off-by: Ionela Voinescu <ionela.voinescu@arm.com>
Acked-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
Tested-by: Valentin Schneider <valentin.schneider@arm.com>
Cc: Thomas Gleixner <tglx@linutronix.de>
Cc: Ingo Molnar <mingo@redhat.com>
Cc: Giovanni Gherdovich <ggherdovich@suse.cz>
Cc: "Rafael J. Wysocki" <rjw@rjwysocki.net>
---
 arch/x86/include/asm/topology.h | 2 +-
 drivers/acpi/cppc_acpi.c        | 6 +++---
 2 files changed, 4 insertions(+), 4 deletions(-)

diff --git a/arch/x86/include/asm/topology.h b/arch/x86/include/asm/topology.h
index 127b693273e3..9619385bf749 100644
--- a/arch/x86/include/asm/topology.h
+++ b/arch/x86/include/asm/topology.h
@@ -228,7 +228,7 @@ static inline void init_freq_invariance(bool secondary, bool cppc_ready)
 
 #ifdef CONFIG_ACPI_CPPC_LIB
 void init_freq_invariance_cppc(void);
-#define init_freq_invariance_cppc init_freq_invariance_cppc
+#define arch_init_invariance_cppc init_freq_invariance_cppc
 
 bool amd_set_max_freq_ratio(u64 *ratio);
 #else
diff --git a/drivers/acpi/cppc_acpi.c b/drivers/acpi/cppc_acpi.c
index 866560cbb082..bfd142ab4e07 100644
--- a/drivers/acpi/cppc_acpi.c
+++ b/drivers/acpi/cppc_acpi.c
@@ -633,8 +633,8 @@ static bool is_cppc_supported(int revision, int num_ent)
  *  )
  */
 
-#ifndef init_freq_invariance_cppc
-static inline void init_freq_invariance_cppc(void) { }
+#ifndef arch_init_invariance_cppc
+static inline void arch_init_invariance_cppc(void) { }
 #endif
 
 /**
@@ -816,7 +816,7 @@ int acpi_cppc_processor_probe(struct acpi_processor *pr)
 		goto out_free;
 	}
 
-	init_freq_invariance_cppc();
+	arch_init_invariance_cppc();
 
 	kfree(output.pointer);
 	return 0;
-- 
2.25.1


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

* [PATCH v4 2/3] arch_topology: obtain cpu capacity using information from CPPC
  2022-03-10 14:54 [PATCH v4 0/3] arch_topology, ACPI: populate cpu capacity from CPPC Ionela Voinescu
  2022-03-10 14:54 ` [PATCH v4 1/3] x86, ACPI: rename init_freq_invariance_cppc to arch_init_invariance_cppc Ionela Voinescu
@ 2022-03-10 14:54 ` Ionela Voinescu
  2022-03-10 14:54 ` [PATCH v4 3/3] arm64, topology: enable use of init_cpu_capacity_cppc() Ionela Voinescu
  2022-03-10 19:23 ` [PATCH v4 0/3] arch_topology, ACPI: populate cpu capacity from CPPC Rafael J. Wysocki
  3 siblings, 0 replies; 5+ messages in thread
From: Ionela Voinescu @ 2022-03-10 14:54 UTC (permalink / raw)
  To: Sudeep Holla, Rafael J . Wysocki, Thomas Gleixner, Ingo Molnar,
	Giovanni Gherdovich, Catalin Marinas, Will Deacon,
	Valentin Schneider, Dietmar Eggemann, Sean Kelley
  Cc: Pierre Gondois, linux-kernel, linux-acpi, linux-arm-kernel, Yicong Yang

Define topology_init_cpu_capacity_cppc() to use highest performance
values from _CPC objects to obtain and set maximum capacity information
for each CPU. acpi_cppc_processor_probe() is a good point at which to
trigger the initialization of CPU (u-arch) capacity values, as at this
point the highest performance values can be obtained from each CPU's
_CPC objects. Architectures can therefore use this functionality
through arch_init_invariance_cppc().

The performance scale used by CPPC is a unified scale for all CPUs in
the system. Therefore, by obtaining the raw highest performance values
from the _CPC objects, and normalizing them on the [0, 1024] capacity
scale, used by the task scheduler, we obtain the CPU capacity of each
CPU.

While an ACPI Notify(0x85) could alert about a change in the highest
performance value, which should in turn retrigger the CPU capacity
computations, this notification is not currently handled by the ACPI
processor driver. When supported, a call to arch_init_invariance_cppc()
would perform the update.

Signed-off-by: Ionela Voinescu <ionela.voinescu@arm.com>
Acked-by: Sudeep Holla <sudeep.holla@arm.com>
Tested-by: Valentin Schneider <valentin.schneider@arm.com>
Tested-by: Yicong Yang <yangyicong@hisilicon.com>
Cc: Sudeep Holla <sudeep.holla@arm.com>
---
 drivers/base/arch_topology.c  | 45 ++++++++++++++++++++++++++++++++---
 include/linux/arch_topology.h |  4 ++++
 2 files changed, 46 insertions(+), 3 deletions(-)

diff --git a/drivers/base/arch_topology.c b/drivers/base/arch_topology.c
index 976154140f0b..1d6636ebaac5 100644
--- a/drivers/base/arch_topology.c
+++ b/drivers/base/arch_topology.c
@@ -339,6 +339,46 @@ bool __init topology_parse_cpu_capacity(struct device_node *cpu_node, int cpu)
 	return !ret;
 }
 
+#ifdef CONFIG_ACPI_CPPC_LIB
+#include <acpi/cppc_acpi.h>
+
+void topology_init_cpu_capacity_cppc(void)
+{
+	struct cppc_perf_caps perf_caps;
+	int cpu;
+
+	if (likely(acpi_disabled || !acpi_cpc_valid()))
+		return;
+
+	raw_capacity = kcalloc(num_possible_cpus(), sizeof(*raw_capacity),
+			       GFP_KERNEL);
+	if (!raw_capacity)
+		return;
+
+	for_each_possible_cpu(cpu) {
+		if (!cppc_get_perf_caps(cpu, &perf_caps) &&
+		    (perf_caps.highest_perf >= perf_caps.nominal_perf) &&
+		    (perf_caps.highest_perf >= perf_caps.lowest_perf)) {
+			raw_capacity[cpu] = perf_caps.highest_perf;
+			pr_debug("cpu_capacity: CPU%d cpu_capacity=%u (raw).\n",
+				 cpu, raw_capacity[cpu]);
+			continue;
+		}
+
+		pr_err("cpu_capacity: CPU%d missing/invalid highest performance.\n", cpu);
+		pr_err("cpu_capacity: partial information: fallback to 1024 for all CPUs\n");
+		goto exit;
+	}
+
+	topology_normalize_cpu_scale();
+	schedule_work(&update_topology_flags_work);
+	pr_debug("cpu_capacity: cpu_capacity initialization done\n");
+
+exit:
+	free_raw_capacity();
+}
+#endif
+
 #ifdef CONFIG_CPU_FREQ
 static cpumask_var_t cpus_to_visit;
 static void parsing_done_workfn(struct work_struct *work);
@@ -387,9 +427,8 @@ static int __init register_cpufreq_notifier(void)
 	int ret;
 
 	/*
-	 * on ACPI-based systems we need to use the default cpu capacity
-	 * until we have the necessary code to parse the cpu capacity, so
-	 * skip registering cpufreq notifier.
+	 * On ACPI-based systems skip registering cpufreq notifier as cpufreq
+	 * information is not needed for cpu capacity initialization.
 	 */
 	if (!acpi_disabled || !raw_capacity)
 		return -EINVAL;
diff --git a/include/linux/arch_topology.h b/include/linux/arch_topology.h
index cce6136b300a..58cbe18d825c 100644
--- a/include/linux/arch_topology.h
+++ b/include/linux/arch_topology.h
@@ -11,6 +11,10 @@
 void topology_normalize_cpu_scale(void);
 int topology_update_cpu_topology(void);
 
+#ifdef CONFIG_ACPI_CPPC_LIB
+void topology_init_cpu_capacity_cppc(void);
+#endif
+
 struct device_node;
 bool topology_parse_cpu_capacity(struct device_node *cpu_node, int cpu);
 
-- 
2.25.1


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

* [PATCH v4 3/3] arm64, topology: enable use of init_cpu_capacity_cppc()
  2022-03-10 14:54 [PATCH v4 0/3] arch_topology, ACPI: populate cpu capacity from CPPC Ionela Voinescu
  2022-03-10 14:54 ` [PATCH v4 1/3] x86, ACPI: rename init_freq_invariance_cppc to arch_init_invariance_cppc Ionela Voinescu
  2022-03-10 14:54 ` [PATCH v4 2/3] arch_topology: obtain cpu capacity using information from CPPC Ionela Voinescu
@ 2022-03-10 14:54 ` Ionela Voinescu
  2022-03-10 19:23 ` [PATCH v4 0/3] arch_topology, ACPI: populate cpu capacity from CPPC Rafael J. Wysocki
  3 siblings, 0 replies; 5+ messages in thread
From: Ionela Voinescu @ 2022-03-10 14:54 UTC (permalink / raw)
  To: Sudeep Holla, Rafael J . Wysocki, Thomas Gleixner, Ingo Molnar,
	Giovanni Gherdovich, Catalin Marinas, Will Deacon,
	Valentin Schneider, Dietmar Eggemann, Sean Kelley
  Cc: Pierre Gondois, linux-kernel, linux-acpi, linux-arm-kernel, Yicong Yang

Now that the arch topology driver provides a method of setting CPU
capacity values based on information on highest performance from CPPC,
use this functionality on arm64 platforms.

Signed-off-by: Ionela Voinescu <ionela.voinescu@arm.com>
Acked-by: Catalin Marinas <catalin.marinas@arm.com>
Tested-by: Valentin Schneider <valentin.schneider@arm.com>
Tested-by: Yicong Yang <yangyicong@hisilicon.com>
Cc: Catalin Marinas <catalin.marinas@arm.com>
Cc: Will Deacon <will@kernel.org>
---
 arch/arm64/include/asm/topology.h | 4 ++++
 1 file changed, 4 insertions(+)

diff --git a/arch/arm64/include/asm/topology.h b/arch/arm64/include/asm/topology.h
index f386b90a79c8..9fab663dd2de 100644
--- a/arch/arm64/include/asm/topology.h
+++ b/arch/arm64/include/asm/topology.h
@@ -24,6 +24,10 @@ void update_freq_counters_refs(void);
 #define arch_scale_freq_capacity topology_get_freq_scale
 #define arch_scale_freq_invariant topology_scale_freq_invariant
 
+#ifdef CONFIG_ACPI_CPPC_LIB
+#define arch_init_invariance_cppc topology_init_cpu_capacity_cppc
+#endif
+
 /* Replace task scheduler's default cpu-invariant accounting */
 #define arch_scale_cpu_capacity topology_get_cpu_scale
 
-- 
2.25.1


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

* Re: [PATCH v4 0/3] arch_topology, ACPI: populate cpu capacity from CPPC
  2022-03-10 14:54 [PATCH v4 0/3] arch_topology, ACPI: populate cpu capacity from CPPC Ionela Voinescu
                   ` (2 preceding siblings ...)
  2022-03-10 14:54 ` [PATCH v4 3/3] arm64, topology: enable use of init_cpu_capacity_cppc() Ionela Voinescu
@ 2022-03-10 19:23 ` Rafael J. Wysocki
  3 siblings, 0 replies; 5+ messages in thread
From: Rafael J. Wysocki @ 2022-03-10 19:23 UTC (permalink / raw)
  To: Ionela Voinescu
  Cc: Sudeep Holla, Rafael J . Wysocki, Thomas Gleixner, Ingo Molnar,
	Giovanni Gherdovich, Catalin Marinas, Will Deacon,
	Valentin Schneider, Dietmar Eggemann, Sean Kelley,
	Pierre Gondois, Linux Kernel Mailing List,
	ACPI Devel Maling List, Linux ARM

On Thu, Mar 10, 2022 at 4:05 PM Ionela Voinescu <ionela.voinescu@arm.com> wrote:
>
> Hi all,
>
> v3->v4:
>  - v3 can be found at [3]
>  - rebased on linux-next 20220310 which contains patches at [4]
>    requested by Rafael
>  - 2/3 fixed obsolete comment as reported by Yicong at [5]
>  - Kept Acked-by,Tested-by as v4 has no code changes compared
>    to v3, but only a comment fix.

All patches in the series applied as 5.18 material, thanks!

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

end of thread, other threads:[~2022-03-10 19:24 UTC | newest]

Thread overview: 5+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2022-03-10 14:54 [PATCH v4 0/3] arch_topology, ACPI: populate cpu capacity from CPPC Ionela Voinescu
2022-03-10 14:54 ` [PATCH v4 1/3] x86, ACPI: rename init_freq_invariance_cppc to arch_init_invariance_cppc Ionela Voinescu
2022-03-10 14:54 ` [PATCH v4 2/3] arch_topology: obtain cpu capacity using information from CPPC Ionela Voinescu
2022-03-10 14:54 ` [PATCH v4 3/3] arm64, topology: enable use of init_cpu_capacity_cppc() Ionela Voinescu
2022-03-10 19:23 ` [PATCH v4 0/3] arch_topology, ACPI: populate cpu capacity from CPPC Rafael J. Wysocki

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).