OSDN Git Service

ACPI: processor: Export function to claim _CST control
authorRafael J. Wysocki <rafael.j.wysocki@intel.com>
Fri, 13 Dec 2019 08:55:14 +0000 (09:55 +0100)
committerRafael J. Wysocki <rafael.j.wysocki@intel.com>
Mon, 16 Dec 2019 11:06:18 +0000 (12:06 +0100)
The intel_idle driver will be modified to use ACPI _CST subsequently
and it will need to notify the platform firmware of that if
acpi_gbl_FADT.cst_control is set, so add a routine for this purpose,
acpi_processor_claim_cst_control(), to acpi_processor.c (so that it
is always present which is required by intel_idle) and export it
to allow the ACPI processor driver (which is modular) to call it.

No intentional functional impact.

Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
drivers/acpi/acpi_processor.c
drivers/acpi/processor_idle.c
include/linux/acpi.h

index 2c4dda0..8a53f3c 100644 (file)
@@ -705,3 +705,28 @@ void __init acpi_processor_init(void)
        acpi_scan_add_handler_with_hotplug(&processor_handler, "processor");
        acpi_scan_add_handler(&processor_container_handler);
 }
+
+#ifdef CONFIG_ACPI_PROCESSOR_CSTATE
+/**
+ * acpi_processor_claim_cst_control - Request _CST control from the platform.
+ */
+bool acpi_processor_claim_cst_control(void)
+{
+       static bool cst_control_claimed;
+       acpi_status status;
+
+       if (!acpi_gbl_FADT.cst_control || cst_control_claimed)
+               return true;
+
+       status = acpi_os_write_port(acpi_gbl_FADT.smi_command,
+                                   acpi_gbl_FADT.cst_control, 8);
+       if (ACPI_FAILURE(status)) {
+               pr_warn("ACPI: Failed to claim processor _CST control\n");
+               return false;
+       }
+
+       cst_control_claimed = true;
+       return true;
+}
+EXPORT_SYMBOL_GPL(acpi_processor_claim_cst_control);
+#endif /* CONFIG_ACPI_PROCESSOR_CSTATE */
index 2ae95df..dd737d8 100644 (file)
@@ -909,7 +909,6 @@ static int acpi_processor_setup_cstates(struct acpi_processor *pr)
 
 static inline void acpi_processor_cstate_first_run_checks(void)
 {
-       acpi_status status;
        static int first_run;
 
        if (first_run)
@@ -921,13 +920,10 @@ static inline void acpi_processor_cstate_first_run_checks(void)
                          max_cstate);
        first_run++;
 
-       if (acpi_gbl_FADT.cst_control && !nocst) {
-               status = acpi_os_write_port(acpi_gbl_FADT.smi_command,
-                                           acpi_gbl_FADT.cst_control, 8);
-               if (ACPI_FAILURE(status))
-                       ACPI_EXCEPTION((AE_INFO, status,
-                                       "Notifying BIOS of _CST ability failed"));
-       }
+       if (nocst)
+               return;
+
+       acpi_processor_claim_cst_control();
 }
 #else
 
index 0f37a7d..ee39b05 100644 (file)
@@ -279,6 +279,12 @@ static inline bool invalid_phys_cpuid(phys_cpuid_t phys_id)
 
 /* Validate the processor object's proc_id */
 bool acpi_duplicate_processor_id(int proc_id);
+/* Processor _CTS control */
+#ifdef CONFIG_ACPI_PROCESSOR_CSTATE
+bool acpi_processor_claim_cst_control(void);
+#else
+static inline bool acpi_processor_claim_cst_control(void) { return false; }
+#endif
 
 #ifdef CONFIG_ACPI_HOTPLUG_CPU
 /* Arch dependent functions for cpu hotplug support */