aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSrinivas Pandruvada <srinivas.pandruvada@linux.intel.com>2018-10-15 13:37:19 -0400
committerRafael J. Wysocki <rafael.j.wysocki@intel.com>2018-10-16 04:33:38 -0400
commit29523f095397637edca60c627bc3e5c25a02c40f (patch)
tree29b953565ea9b0d7b9bb904950d53a4734fcd017
parent2733fb0d0699246711cf622e0e2faf02a05b69dc (diff)
ACPI / CPPC: Add support for guaranteed performance
The Continuous Performance Control package may contain an optional guaranteed performance field. Add support to read guaranteed performance from _CPC. Signed-off-by: Srinivas Pandruvada <srinivas.pandruvada@linux.intel.com> Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
-rw-r--r--drivers/acpi/cppc_acpi.c8
-rw-r--r--include/acpi/cppc_acpi.h1
2 files changed, 7 insertions, 2 deletions
diff --git a/drivers/acpi/cppc_acpi.c b/drivers/acpi/cppc_acpi.c
index d9ce4b162e2c..217a782c3e55 100644
--- a/drivers/acpi/cppc_acpi.c
+++ b/drivers/acpi/cppc_acpi.c
@@ -1061,9 +1061,9 @@ int cppc_get_perf_caps(int cpunum, struct cppc_perf_caps *perf_caps)
1061{ 1061{
1062 struct cpc_desc *cpc_desc = per_cpu(cpc_desc_ptr, cpunum); 1062 struct cpc_desc *cpc_desc = per_cpu(cpc_desc_ptr, cpunum);
1063 struct cpc_register_resource *highest_reg, *lowest_reg, 1063 struct cpc_register_resource *highest_reg, *lowest_reg,
1064 *lowest_non_linear_reg, *nominal_reg, 1064 *lowest_non_linear_reg, *nominal_reg, *guaranteed_reg,
1065 *low_freq_reg = NULL, *nom_freq_reg = NULL; 1065 *low_freq_reg = NULL, *nom_freq_reg = NULL;
1066 u64 high, low, nom, min_nonlinear, low_f = 0, nom_f = 0; 1066 u64 high, low, guaranteed, nom, min_nonlinear, low_f = 0, nom_f = 0;
1067 int pcc_ss_id = per_cpu(cpu_pcc_subspace_idx, cpunum); 1067 int pcc_ss_id = per_cpu(cpu_pcc_subspace_idx, cpunum);
1068 struct cppc_pcc_data *pcc_ss_data = NULL; 1068 struct cppc_pcc_data *pcc_ss_data = NULL;
1069 int ret = 0, regs_in_pcc = 0; 1069 int ret = 0, regs_in_pcc = 0;
@@ -1079,6 +1079,7 @@ int cppc_get_perf_caps(int cpunum, struct cppc_perf_caps *perf_caps)
1079 nominal_reg = &cpc_desc->cpc_regs[NOMINAL_PERF]; 1079 nominal_reg = &cpc_desc->cpc_regs[NOMINAL_PERF];
1080 low_freq_reg = &cpc_desc->cpc_regs[LOWEST_FREQ]; 1080 low_freq_reg = &cpc_desc->cpc_regs[LOWEST_FREQ];
1081 nom_freq_reg = &cpc_desc->cpc_regs[NOMINAL_FREQ]; 1081 nom_freq_reg = &cpc_desc->cpc_regs[NOMINAL_FREQ];
1082 guaranteed_reg = &cpc_desc->cpc_regs[GUARANTEED_PERF];
1082 1083
1083 /* Are any of the regs PCC ?*/ 1084 /* Are any of the regs PCC ?*/
1084 if (CPC_IN_PCC(highest_reg) || CPC_IN_PCC(lowest_reg) || 1085 if (CPC_IN_PCC(highest_reg) || CPC_IN_PCC(lowest_reg) ||
@@ -1107,6 +1108,9 @@ int cppc_get_perf_caps(int cpunum, struct cppc_perf_caps *perf_caps)
1107 cpc_read(cpunum, nominal_reg, &nom); 1108 cpc_read(cpunum, nominal_reg, &nom);
1108 perf_caps->nominal_perf = nom; 1109 perf_caps->nominal_perf = nom;
1109 1110
1111 cpc_read(cpunum, guaranteed_reg, &guaranteed);
1112 perf_caps->guaranteed_perf = guaranteed;
1113
1110 cpc_read(cpunum, lowest_non_linear_reg, &min_nonlinear); 1114 cpc_read(cpunum, lowest_non_linear_reg, &min_nonlinear);
1111 perf_caps->lowest_nonlinear_perf = min_nonlinear; 1115 perf_caps->lowest_nonlinear_perf = min_nonlinear;
1112 1116
diff --git a/include/acpi/cppc_acpi.h b/include/acpi/cppc_acpi.h
index 8e0b8250a139..cf59e6210d27 100644
--- a/include/acpi/cppc_acpi.h
+++ b/include/acpi/cppc_acpi.h
@@ -104,6 +104,7 @@ enum cppc_regs {
104 * today. 104 * today.
105 */ 105 */
106struct cppc_perf_caps { 106struct cppc_perf_caps {
107 u32 guaranteed_perf;
107 u32 highest_perf; 108 u32 highest_perf;
108 u32 nominal_perf; 109 u32 nominal_perf;
109 u32 lowest_perf; 110 u32 lowest_perf;