HWP and amd-cppc-epp are both governor-less driver, so we introduce "is_goverless" flag and cpufreq_is_governorless() to help bypass governor-related info on dealing with cpufreq para.
Signed-off-by: Penny Zheng <penny.zh...@amd.com> --- v3 -> v4: - Include validation check fix here --- v4 -> v5: - validation check has beem moved to where XEN_PROCESSOR_PM_CPPC and XEN_CPPC_INIT have been firstly introduced - adding "cpufreq_driver.setpolicy == NULL" check to exclude governor-related para for amd-cppc-epp driver in get/set_cpufreq_para() --- v5 -> v6: - add helper cpufreq_is_governorless() to tell whether cpufreq driver is governor-less --- v6 -> v7: - change "hw_auto" to "is_goverless" - complement comment - wrap around with PM_OP to avoid violating Misra rule 2.1 --- tools/misc/xenpm.c | 10 +++++++--- xen/drivers/acpi/pm-op.c | 4 ++-- xen/drivers/cpufreq/cpufreq.c | 14 ++++++++++++++ xen/include/acpi/cpufreq/cpufreq.h | 2 ++ 4 files changed, 25 insertions(+), 5 deletions(-) diff --git a/tools/misc/xenpm.c b/tools/misc/xenpm.c index 8fc1d7cc65..02981c4583 100644 --- a/tools/misc/xenpm.c +++ b/tools/misc/xenpm.c @@ -832,9 +832,13 @@ static void print_cppc_para(unsigned int cpuid, /* print out parameters about cpu frequency */ static void print_cpufreq_para(int cpuid, struct xc_get_cpufreq_para *p_cpufreq) { - bool hwp = strcmp(p_cpufreq->scaling_driver, XEN_HWP_DRIVER_NAME) == 0; + bool is_goverless = false; int i; + if ( !strcmp(p_cpufreq->scaling_driver, XEN_HWP_DRIVER_NAME) || + !strcmp(p_cpufreq->scaling_driver, XEN_AMD_CPPC_EPP_DRIVER_NAME) ) + is_goverless = true; + printf("cpu id : %d\n", cpuid); printf("affected_cpus :"); @@ -842,7 +846,7 @@ static void print_cpufreq_para(int cpuid, struct xc_get_cpufreq_para *p_cpufreq) printf(" %d", p_cpufreq->affected_cpus[i]); printf("\n"); - if ( hwp ) + if ( is_goverless ) printf("cpuinfo frequency : base [%"PRIu32"] max [%"PRIu32"]\n", p_cpufreq->cpuinfo_min_freq, p_cpufreq->cpuinfo_max_freq); @@ -854,7 +858,7 @@ static void print_cpufreq_para(int cpuid, struct xc_get_cpufreq_para *p_cpufreq) printf("scaling_driver : %s\n", p_cpufreq->scaling_driver); - if ( !hwp ) + if ( !is_goverless ) { if ( p_cpufreq->gov_num ) printf("scaling_avail_gov : %s\n", diff --git a/xen/drivers/acpi/pm-op.c b/xen/drivers/acpi/pm-op.c index bf4638927f..2b4c8070aa 100644 --- a/xen/drivers/acpi/pm-op.c +++ b/xen/drivers/acpi/pm-op.c @@ -153,7 +153,7 @@ static int get_cpufreq_para(struct xen_sysctl_pm_op *op) else strlcpy(op->u.get_para.scaling_driver, "Unknown", CPUFREQ_NAME_LEN); - if ( !hwp_active() ) + if ( !cpufreq_is_governorless(op->cpuid) ) { if ( !(scaling_available_governors = xzalloc_array(char, gov_num * CPUFREQ_NAME_LEN)) ) @@ -236,7 +236,7 @@ static int set_cpufreq_para(struct xen_sysctl_pm_op *op) if ( !policy || !policy->governor ) return -EINVAL; - if ( hwp_active() ) + if ( cpufreq_is_governorless(op->cpuid) ) return -EOPNOTSUPP; switch( op->u.set_para.ctrl_type ) diff --git a/xen/drivers/cpufreq/cpufreq.c b/xen/drivers/cpufreq/cpufreq.c index 41e0da3b77..871fe33681 100644 --- a/xen/drivers/cpufreq/cpufreq.c +++ b/xen/drivers/cpufreq/cpufreq.c @@ -956,3 +956,17 @@ int __init cpufreq_register_driver(const struct cpufreq_driver *driver_data) return 0; } + +#ifdef CONFIG_PM_OP +/* + * Governor-less cpufreq driver indicates the driver doesn't rely on Xen + * governor to do performance tuning, mostly it has hardware built-in + * algorithm to calculate runtime workload and adjust cores frequency + * automatically. like Intel HWP, or CPPC in AMD. + */ +bool cpufreq_is_governorless(unsigned int cpuid) +{ + return processor_pminfo[cpuid]->init && (hwp_active() || + cpufreq_driver.setpolicy); +} +#endif /* CONFIG_PM_OP */ diff --git a/xen/include/acpi/cpufreq/cpufreq.h b/xen/include/acpi/cpufreq/cpufreq.h index 9ef7c4683a..babc4a1a2c 100644 --- a/xen/include/acpi/cpufreq/cpufreq.h +++ b/xen/include/acpi/cpufreq/cpufreq.h @@ -294,4 +294,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_is_governorless(unsigned int cpuid); + #endif /* __XEN_CPUFREQ_PM_H__ */ -- 2.34.1