cpufreq: amd-pstate: optimize driver working mode selection in amd_pstate_param()
authorWyes Karny <wyes.karny@amd.com>
Tue, 31 Jan 2023 09:00:08 +0000 (17:00 +0800)
committerRafael J. Wysocki <rafael.j.wysocki@intel.com>
Fri, 3 Feb 2023 20:59:41 +0000 (21:59 +0100)
The amd-pstate driver may support multiple working modes.
Introduce a variable to keep track of which mode is currently enabled.
Here we use cppc_state var to indicate which mode is enabled.
This change will help to simplify the the amd_pstate_param() to choose
which mode used for the following driver registration.

Acked-by: Huang Rui <ray.huang@amd.com>
Reviewed-by: Mario Limonciello <mario.limonciello@amd.com>
Tested-by: Wyes Karny <wyes.karny@amd.com>
Signed-off-by: Perry Yuan <perry.yuan@amd.com>
Signed-off-by: Wyes Karny <wyes.karny@amd.com>
Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
drivers/cpufreq/amd-pstate.c
include/linux/amd-pstate.h

index c17bd84..65c16ed 100644 (file)
  * module parameter to be able to enable it manually for debugging.
  */
 static struct cpufreq_driver amd_pstate_driver;
-static int cppc_load __initdata;
+static int cppc_state = AMD_PSTATE_DISABLE;
+
+static inline int get_mode_idx_from_str(const char *str, size_t size)
+{
+       int i;
+
+       for (i=0; i < AMD_PSTATE_MAX; i++) {
+               if (!strncmp(str, amd_pstate_mode_string[i], size))
+                       return i;
+       }
+       return -EINVAL;
+}
 
 static inline int pstate_enable(bool enable)
 {
@@ -626,10 +637,10 @@ static int __init amd_pstate_init(void)
        /*
         * by default the pstate driver is disabled to load
         * enable the amd_pstate passive mode driver explicitly
-        * with amd_pstate=passive in kernel command line
+        * with amd_pstate=passive or other modes in kernel command line
         */
-       if (!cppc_load) {
-               pr_debug("driver load is disabled, boot with amd_pstate=passive to enable this\n");
+       if (cppc_state == AMD_PSTATE_DISABLE) {
+               pr_debug("driver load is disabled, boot with specific mode to enable this\n");
                return -ENODEV;
        }
 
@@ -671,16 +682,24 @@ device_initcall(amd_pstate_init);
 
 static int __init amd_pstate_param(char *str)
 {
+       size_t size;
+       int mode_idx;
+
        if (!str)
                return -EINVAL;
 
-       if (!strcmp(str, "disable")) {
-               cppc_load = 0;
-               pr_info("driver is explicitly disabled\n");
-       } else if (!strcmp(str, "passive"))
-               cppc_load = 1;
+       size = strlen(str);
+       mode_idx = get_mode_idx_from_str(str, size);
 
-       return 0;
+       if (mode_idx >= AMD_PSTATE_DISABLE && mode_idx < AMD_PSTATE_MAX) {
+               cppc_state = mode_idx;
+               if (cppc_state == AMD_PSTATE_DISABLE)
+                       pr_info("driver is explicitly disabled\n");
+
+               return 0;
+       }
+
+       return -EINVAL;
 }
 early_param("amd_pstate", amd_pstate_param);
 
index 1c4b865..dae2ce0 100644 (file)
@@ -74,4 +74,21 @@ struct amd_cpudata {
        bool    boost_supported;
 };
 
+/*
+ * enum amd_pstate_mode - driver working mode of amd pstate
+ */
+enum amd_pstate_mode {
+       AMD_PSTATE_DISABLE = 0,
+       AMD_PSTATE_PASSIVE,
+       AMD_PSTATE_ACTIVE,
+       AMD_PSTATE_MAX,
+};
+
+static const char * const amd_pstate_mode_string[] = {
+       [AMD_PSTATE_DISABLE]     = "disable",
+       [AMD_PSTATE_PASSIVE]     = "passive",
+       [AMD_PSTATE_ACTIVE]      = "active",
+       NULL,
+};
+
 #endif /* _LINUX_AMD_PSTATE_H */