ACPI: CPPC: Return error if _CPC is invalid on a CPU
authorHoan Tran <hotran@apm.com>
Fri, 17 Jun 2016 22:16:31 +0000 (15:16 -0700)
committerRafael J. Wysocki <rafael.j.wysocki@intel.com>
Thu, 23 Jun 2016 21:19:21 +0000 (23:19 +0200)
Based on 8.4.7.1 section of ACPI 6.1 specification, if the platform
supports CPPC, the _CPC object must exist under all processor objects.
If cpc_desc_ptr pointer is invalid on any CPUs, acpi_get_psd_map()
should return error and CPPC cpufreq driver can not be registered.

Signed-off-by: Hoan Tran <hotran@apm.com>
Reviewed-by: Prashanth Prakash <pprakash@codeaurora.org>
Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
drivers/acpi/cppc_acpi.c

index 8adac69dba3da52e5bd4ebb7f0780543fc17c51f..f9be3150017c7291a1a1f98e2b6524e1cb6fceae 100644 (file)
@@ -299,8 +299,10 @@ int acpi_get_psd_map(struct cpudata **all_cpu_data)
                        continue;
 
                cpc_ptr = per_cpu(cpc_desc_ptr, i);
-               if (!cpc_ptr)
-                       continue;
+               if (!cpc_ptr) {
+                       retval = -EFAULT;
+                       goto err_ret;
+               }
 
                pdomain = &(cpc_ptr->domain_info);
                cpumask_set_cpu(i, pr->shared_cpu_map);
@@ -322,8 +324,10 @@ int acpi_get_psd_map(struct cpudata **all_cpu_data)
                                continue;
 
                        match_cpc_ptr = per_cpu(cpc_desc_ptr, j);
-                       if (!match_cpc_ptr)
-                               continue;
+                       if (!match_cpc_ptr) {
+                               retval = -EFAULT;
+                               goto err_ret;
+                       }
 
                        match_pdomain = &(match_cpc_ptr->domain_info);
                        if (match_pdomain->domain != pdomain->domain)
@@ -353,8 +357,10 @@ int acpi_get_psd_map(struct cpudata **all_cpu_data)
                                continue;
 
                        match_cpc_ptr = per_cpu(cpc_desc_ptr, j);
-                       if (!match_cpc_ptr)
-                               continue;
+                       if (!match_cpc_ptr) {
+                               retval = -EFAULT;
+                               goto err_ret;
+                       }
 
                        match_pdomain = &(match_cpc_ptr->domain_info);
                        if (match_pdomain->domain != pdomain->domain)