Introduce two macros to help with checking the support for optional CPPC registers. CPC_SUP_BUFFER_ONLY ensures that an expected BUFFER only register has a register type of ACPI_TYPE_BUFFER and is not NULL. REG_SUPPORTED decides which check to perform based the expected type of the CPPC register. Signed-off-by: Janakarajan Natarajan <Janakarajan.Natarajan@xxxxxxx> --- drivers/acpi/cppc_acpi.c | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/drivers/acpi/cppc_acpi.c b/drivers/acpi/cppc_acpi.c index 15f103d7532b..c43de65531ae 100644 --- a/drivers/acpi/cppc_acpi.c +++ b/drivers/acpi/cppc_acpi.c @@ -111,6 +111,14 @@ static DEFINE_PER_CPU(struct cpc_desc *, cpc_desc_ptr); #define CPC_SUPPORTED(cpc) ((cpc)->type == ACPI_TYPE_INTEGER ? \ !!(cpc)->cpc_entry.int_value : \ !IS_NULL_REG(&(cpc)->cpc_entry.reg)) + +/* + * Evaluates to True if an optional cpc field is supported and is + * BUFFER only + */ +#define CPC_SUP_BUFFER_ONLY(cpc) ((cpc)->type == ACPI_TYPE_BUFFER && \ + !IS_NULL_REG(&(cpc)->cpc_entry.reg)) + /* * Arbitrary Retries in case the remote processor is slow to respond * to PCC commands. Keeping it high enough to cover emulators where @@ -705,6 +713,26 @@ static bool is_cppc_supported(int revision, int num_ent) * } */ +static bool is_buf_only(int reg_idx) +{ + switch (reg_idx) { + case HIGHEST_PERF: + case NOMINAL_PERF: + case LOW_NON_LINEAR_PERF: + case LOWEST_PERF: + case CTR_WRAP_TIME: + case AUTO_SEL_ENABLE: + case REFERENCE_PERF: + return false; + default: + return true; + } +} + +#define REG_SUPPORTED(cpc, idx) (is_buf_only(idx) ? \ + CPC_SUP_BUFFER_ONLY(&cpc->cpc_regs[idx]) : \ + CPC_SUPPORTED(&cpc->cpc_regs[idx])) + /** * acpi_cppc_processor_probe - Search for per CPU _CPC objects. * @pr: Ptr to acpi_processor containing this CPU's logical ID. -- 2.17.1