When cpufreq driver in cppc passive mode, it has both cppc and governor
info. We need to invoke two sysctl sub-ops ("get-cpufreq-cppc" and
"get-cpufreq-para") to produce both info.

A new helper cpufreq_in_cppc_passive_mode() is introduced to tell whether
cpufreq driver supports cppc passive mode.

Signed-off-by: Penny Zheng <penny.zh...@amd.com>
---
v5 -> v6
- new commit
---
 xen/drivers/acpi/pm-op.c           | 10 +++++++++-
 xen/drivers/cpufreq/cpufreq.c      |  6 ++++++
 xen/include/acpi/cpufreq/cpufreq.h |  2 ++
 3 files changed, 17 insertions(+), 1 deletion(-)

diff --git a/xen/drivers/acpi/pm-op.c b/xen/drivers/acpi/pm-op.c
index 0723cea34c..077efdfc5c 100644
--- a/xen/drivers/acpi/pm-op.c
+++ b/xen/drivers/acpi/pm-op.c
@@ -152,7 +152,15 @@ static int get_cpufreq_para(struct xen_sysctl_pm_op *op)
     else
         strlcpy(op->u.get_para.scaling_driver, "Unknown", CPUFREQ_NAME_LEN);
 
-    ret = get_cpufreq_cppc(op->cpuid, &op->u.get_para.u.cppc_para);
+    /*
+     * When cpufreq driver in cppc passive mode, it has both cppc and governor
+     * info. Users could only rely on "get-cpufreq-cppc" to acquire CPPC info.
+     * And it returns governor info in "get-cpufreq-para"
+     */
+    if ( cpufreq_in_cppc_passive_mode(op->cpuid) )
+        ret = -ENODEV;
+    else
+        ret = get_cpufreq_cppc(op->cpuid, &op->u.get_para.u.cppc_para);
     if ( ret == -ENODEV )
     {
         if ( !(scaling_available_governors =
diff --git a/xen/drivers/cpufreq/cpufreq.c b/xen/drivers/cpufreq/cpufreq.c
index cf1fcf1d22..431f2903f8 100644
--- a/xen/drivers/cpufreq/cpufreq.c
+++ b/xen/drivers/cpufreq/cpufreq.c
@@ -962,3 +962,9 @@ int __init cpufreq_register_driver(const struct 
cpufreq_driver *driver_data)
 
     return 0;
 }
+
+bool cpufreq_in_cppc_passive_mode(unsigned int cpuid)
+{
+    return processor_pminfo[cpuid]->init & XEN_CPPC_INIT &&
+           cpufreq_driver.target;
+}
diff --git a/xen/include/acpi/cpufreq/cpufreq.h 
b/xen/include/acpi/cpufreq/cpufreq.h
index b0b22d1c9c..dd55d268c0 100644
--- a/xen/include/acpi/cpufreq/cpufreq.h
+++ b/xen/include/acpi/cpufreq/cpufreq.h
@@ -295,4 +295,6 @@ int acpi_cpufreq_register(void);
 int amd_cppc_cmdline_parse(const char *s, const char *e);
 int amd_cppc_register_driver(void);
 
+bool cpufreq_in_cppc_passive_mode(unsigned int cpuid);
+
 #endif /* __XEN_CPUFREQ_PM_H__ */
-- 
2.34.1


Reply via email to