linux-pm.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH v2 0/3]  intel_idle: Add C1 demotion on/off sysfs knob
@ 2025-02-20 15:16 Artem Bityutskiy
  2025-02-20 15:17 ` [PATCH v2 1/3] " Artem Bityutskiy
                   ` (2 more replies)
  0 siblings, 3 replies; 5+ messages in thread
From: Artem Bityutskiy @ 2025-02-20 15:16 UTC (permalink / raw)
  To: Rafael J. Wysocki; +Cc: Linux PM Mailing List

From: Artem Bityutskiy <artem.bityutskiy@linux.intel.com>

Version 2 of the patch. Find version 1 here:
https://patches.linaro.org/project/linux-pm/list/?series=260892

I believe I addressed all the comments except for this one from Rafael
Wysocki:

"This is not the only place where MSR_PKG_CST_CONFIG_CONTROL gets updated.
The other one is drivers/platform/x86/intel/pmc/cnp.c

There is no real conflict because the PMC core thing happens during system
suspend/resume on client platforms, but this is kind of duplicated code.
Any chance to consolidate this?"

This comment I am trying to address in a separate RFC patch that I am going
to send very soon.

Changelog

v1->v2:
  * Address comments from Rafael Wysocki:
    1. Rename the sysfs file from 'c1_demotion' to 'intel_c1_demotion'
    2. Add a commentary about reading the feature only for 1 CPU.
    3. Update Documentation/API (new patch 3/3).


Artem Bityutskiy (3):
  intel_idle: Add C1 demotion on/off sysfs knob
  Documentation: admin-guide: pm: document intel_idle C1 demotion
  Documentation: ABI: testing: document the new cpuidle sysfs file

 .../ABI/testing/sysfs-devices-system-cpu      |   7 +-
 Documentation/admin-guide/pm/intel_idle.rst   |  21 ++++
 drivers/idle/intel_idle.c                     | 103 ++++++++++++++++++
 3 files changed, 130 insertions(+), 1 deletion(-)

-- 
2.47.1


^ permalink raw reply	[flat|nested] 5+ messages in thread

* [PATCH v2 1/3] intel_idle: Add C1 demotion on/off sysfs knob
  2025-02-20 15:16 [PATCH v2 0/3] intel_idle: Add C1 demotion on/off sysfs knob Artem Bityutskiy
@ 2025-02-20 15:17 ` Artem Bityutskiy
  2025-02-27 20:06   ` Rafael J. Wysocki
  2025-02-20 15:17 ` [PATCH v2 2/3] Documentation: admin-guide: pm: document intel_idle C1 demotion Artem Bityutskiy
  2025-02-20 15:17 ` [PATCH v2 3/3] Documentation: ABI: testing: document the new cpuidle sysfs file Artem Bityutskiy
  2 siblings, 1 reply; 5+ messages in thread
From: Artem Bityutskiy @ 2025-02-20 15:17 UTC (permalink / raw)
  To: Rafael J. Wysocki; +Cc: Linux PM Mailing List

From: Artem Bityutskiy <artem.bityutskiy@linux.intel.com>

Add a sysfs knob to enable/disable C1 demotion for the following Intel
platforms: Sapphire Rapids Xeon, Emerald Rapids Xeon, Granite Rapids Xeon,
Sierra Forest Xeon, and Grand Ridge SoC.

This sysfs file shows up as
"/sys/devices/system/cpu/cpuidle/intel_c1_demotion".

The C1 demotion feature involves the platform firmware demoting deep
C-state requests from the OS (e.g., C6 requests) to C1. The idea is
that firmware monitors CPU wake-up rate, and if it is higher than a
platform-specific threshold, the firmware demotes deep C-state
requests to C1. For example, Linux requests C6, but firmware noticed
too many wake-ups per second, and it keeps the CPU in C1. When the
CPU stays in C1 long enough, the platform promotes it back to C6.

The default value for C1 demotion is whatever is configured by BIOS.

Signed-off-by: Artem Bityutskiy <artem.bityutskiy@linux.intel.com>
---
 drivers/idle/intel_idle.c | 103 ++++++++++++++++++++++++++++++++++++++
 1 file changed, 103 insertions(+)

diff --git a/drivers/idle/intel_idle.c b/drivers/idle/intel_idle.c
index 118fe1d37c22..8d2095078469 100644
--- a/drivers/idle/intel_idle.c
+++ b/drivers/idle/intel_idle.c
@@ -48,9 +48,11 @@
 #include <trace/events/power.h>
 #include <linux/sched.h>
 #include <linux/sched/smt.h>
+#include <linux/mutex.h>
 #include <linux/notifier.h>
 #include <linux/cpu.h>
 #include <linux/moduleparam.h>
+#include <linux/sysfs.h>
 #include <asm/cpuid.h>
 #include <asm/cpu_device_id.h>
 #include <asm/intel-family.h>
@@ -91,9 +93,15 @@ struct idle_cpu {
 	unsigned long auto_demotion_disable_flags;
 	bool byt_auto_demotion_disable_flag;
 	bool disable_promotion_to_c1e;
+	bool c1_demotion_supported;
 	bool use_acpi;
 };
 
+static bool c1_demotion_supported;
+static DEFINE_MUTEX(c1_demotion_mutex);
+
+static struct device *sysfs_root __initdata;
+
 static const struct idle_cpu *icpu __initdata;
 static struct cpuidle_state *cpuidle_state_table __initdata;
 
@@ -1541,18 +1549,21 @@ static const struct idle_cpu idle_cpu_gmt __initconst = {
 static const struct idle_cpu idle_cpu_spr __initconst = {
 	.state_table = spr_cstates,
 	.disable_promotion_to_c1e = true,
+	.c1_demotion_supported = true,
 	.use_acpi = true,
 };
 
 static const struct idle_cpu idle_cpu_gnr __initconst = {
 	.state_table = gnr_cstates,
 	.disable_promotion_to_c1e = true,
+	.c1_demotion_supported = true,
 	.use_acpi = true,
 };
 
 static const struct idle_cpu idle_cpu_gnrd __initconst = {
 	.state_table = gnrd_cstates,
 	.disable_promotion_to_c1e = true,
+	.c1_demotion_supported = true,
 	.use_acpi = true,
 };
 
@@ -1591,12 +1602,14 @@ static const struct idle_cpu idle_cpu_snr __initconst = {
 static const struct idle_cpu idle_cpu_grr __initconst = {
 	.state_table = grr_cstates,
 	.disable_promotion_to_c1e = true,
+	.c1_demotion_supported = true,
 	.use_acpi = true,
 };
 
 static const struct idle_cpu idle_cpu_srf __initconst = {
 	.state_table = srf_cstates,
 	.disable_promotion_to_c1e = true,
+	.c1_demotion_supported = true,
 	.use_acpi = true,
 };
 
@@ -2291,6 +2304,89 @@ static void __init intel_idle_cpuidle_devices_uninit(void)
 		cpuidle_unregister_device(per_cpu_ptr(intel_idle_cpuidle_devices, i));
 }
 
+static void intel_c1_demotion_toggle(void *info)
+{
+	unsigned long long msr_val;
+	bool enable = *(bool *)info;
+
+	rdmsrl(MSR_PKG_CST_CONFIG_CONTROL, msr_val);
+	/*
+	 * Enable/disable C1 undemotion along with C1 demotion, as this is the
+	 * most sensible configuration in general.
+	 */
+	if (enable)
+		msr_val |= NHM_C1_AUTO_DEMOTE | SNB_C1_AUTO_UNDEMOTE;
+	else
+		msr_val &= ~(NHM_C1_AUTO_DEMOTE | SNB_C1_AUTO_UNDEMOTE);
+	wrmsrl(MSR_PKG_CST_CONFIG_CONTROL, msr_val);
+}
+
+static ssize_t intel_c1_demotion_store(struct device *dev,
+				       struct device_attribute *attr,
+				       const char *buf, size_t count)
+{
+	int err;
+	bool enable;
+
+	err = kstrtobool(buf, &enable);
+	if (err)
+		return err;
+
+	mutex_lock(&c1_demotion_mutex);
+	/* Enable/disable C1 demotion on all CPUs */
+	on_each_cpu(intel_c1_demotion_toggle, &enable, 1);
+	mutex_unlock(&c1_demotion_mutex);
+
+	return count;
+}
+
+static ssize_t intel_c1_demotion_show(struct device *dev,
+				      struct device_attribute *attr, char *buf)
+{
+	unsigned long long msr_val;
+
+	/*
+	 * Read the MSR value for a CPU and assume it is the same for all CPUs. Any other
+	 * configureation would be a BIOS bug.
+	 */
+	rdmsrl(MSR_PKG_CST_CONFIG_CONTROL, msr_val);
+	return sysfs_emit(buf, "%d\n", !!(msr_val & NHM_C1_AUTO_DEMOTE));
+}
+static DEVICE_ATTR_RW(intel_c1_demotion);
+
+static int __init intel_idle_sysfs_init(void)
+{
+	int err;
+
+	if (!c1_demotion_supported)
+		return 0;
+
+	sysfs_root = bus_get_dev_root(&cpu_subsys);
+	if (!sysfs_root)
+		return 0;
+
+	err = sysfs_add_file_to_group(&sysfs_root->kobj,
+				      &dev_attr_intel_c1_demotion.attr,
+				      "cpuidle");
+	if (err) {
+		put_device(sysfs_root);
+		return err;
+	}
+
+	return 0;
+}
+
+static void __init intel_idle_sysfs_uninit(void)
+{
+	if (!sysfs_root)
+		return;
+
+	sysfs_remove_file_from_group(&sysfs_root->kobj,
+				     &dev_attr_intel_c1_demotion.attr,
+				     "cpuidle");
+	put_device(sysfs_root);
+}
+
 static int __init intel_idle_init(void)
 {
 	const struct x86_cpu_id *id;
@@ -2337,6 +2433,8 @@ static int __init intel_idle_init(void)
 		auto_demotion_disable_flags = icpu->auto_demotion_disable_flags;
 		if (icpu->disable_promotion_to_c1e)
 			c1e_promotion = C1E_PROMOTION_DISABLE;
+		if (icpu->c1_demotion_supported)
+			c1_demotion_supported = true;
 		if (icpu->use_acpi || force_use_acpi)
 			intel_idle_acpi_cst_extract();
 	} else if (!intel_idle_acpi_cst_extract()) {
@@ -2350,6 +2448,10 @@ static int __init intel_idle_init(void)
 	if (!intel_idle_cpuidle_devices)
 		return -ENOMEM;
 
+	retval = intel_idle_sysfs_init();
+	if (retval)
+		pr_warn("failed to initialized sysfs");
+
 	intel_idle_cpuidle_driver_init(&intel_idle_driver);
 
 	retval = cpuidle_register_driver(&intel_idle_driver);
@@ -2374,6 +2476,7 @@ static int __init intel_idle_init(void)
 	intel_idle_cpuidle_devices_uninit();
 	cpuidle_unregister_driver(&intel_idle_driver);
 init_driver_fail:
+	intel_idle_sysfs_uninit();
 	free_percpu(intel_idle_cpuidle_devices);
 	return retval;
 
-- 
2.47.1


^ permalink raw reply related	[flat|nested] 5+ messages in thread

* [PATCH v2 2/3] Documentation: admin-guide: pm: document intel_idle C1 demotion
  2025-02-20 15:16 [PATCH v2 0/3] intel_idle: Add C1 demotion on/off sysfs knob Artem Bityutskiy
  2025-02-20 15:17 ` [PATCH v2 1/3] " Artem Bityutskiy
@ 2025-02-20 15:17 ` Artem Bityutskiy
  2025-02-20 15:17 ` [PATCH v2 3/3] Documentation: ABI: testing: document the new cpuidle sysfs file Artem Bityutskiy
  2 siblings, 0 replies; 5+ messages in thread
From: Artem Bityutskiy @ 2025-02-20 15:17 UTC (permalink / raw)
  To: Rafael J. Wysocki; +Cc: Linux PM Mailing List

From: Artem Bityutskiy <artem.bityutskiy@linux.intel.com>

Document the intel_idle driver sysfs file for enabling/disabling C1
demotion.

Signed-off-by: Artem Bityutskiy <artem.bityutskiy@linux.intel.com>
---
 Documentation/admin-guide/pm/intel_idle.rst | 21 +++++++++++++++++++++
 1 file changed, 21 insertions(+)

diff --git a/Documentation/admin-guide/pm/intel_idle.rst b/Documentation/admin-guide/pm/intel_idle.rst
index 39bd6ecce7de..30a3ed1e38fa 100644
--- a/Documentation/admin-guide/pm/intel_idle.rst
+++ b/Documentation/admin-guide/pm/intel_idle.rst
@@ -38,6 +38,27 @@ instruction at all.
 only way to pass early-configuration-time parameters to it is via the kernel
 command line.
 
+Sysfs Interface
+===============
+
+The ``intel_idle`` driver exposes the following ``sysfs`` attributes in
+``/sys/devices/system/cpu/cpuidle/``:
+
+``intel_c1_demotion``
+	Enable or disable C1 demotion for all CPUs in the system. This file is
+	only exposed on platforms that support the C1 demotion feature and where
+	it was tested. Value 0 means that C1 demotion is disabled, value 1 means
+	that it is enabled. Write 0 or 1 to disable or enable C1 demotion for
+	all CPUs.
+
+	The C1 demotion feature involves the platform firmware demoting deep
+	C-state requests from the OS (e.g., C6 requests) to C1. The idea is that
+	firmware monitors CPU wake-up rate, and if it is higher than a
+	platform-specific threshold, the firmware demotes deep C-state requests
+	to C1. For example, Linux requests C6, but firmware noticed too many
+	wake-ups per second, and it keeps the CPU in C1. When the CPU stays in
+	C1 long enough, the platform promotes it back to C6. This may improve
+	some workloads' performance, but it may also increase power consumption.
 
 .. _intel-idle-enumeration-of-states:
 
-- 
2.47.1


^ permalink raw reply related	[flat|nested] 5+ messages in thread

* [PATCH v2 3/3] Documentation: ABI: testing: document the new cpuidle sysfs file
  2025-02-20 15:16 [PATCH v2 0/3] intel_idle: Add C1 demotion on/off sysfs knob Artem Bityutskiy
  2025-02-20 15:17 ` [PATCH v2 1/3] " Artem Bityutskiy
  2025-02-20 15:17 ` [PATCH v2 2/3] Documentation: admin-guide: pm: document intel_idle C1 demotion Artem Bityutskiy
@ 2025-02-20 15:17 ` Artem Bityutskiy
  2 siblings, 0 replies; 5+ messages in thread
From: Artem Bityutskiy @ 2025-02-20 15:17 UTC (permalink / raw)
  To: Rafael J. Wysocki; +Cc: Linux PM Mailing List

From: Artem Bityutskiy <artem.bityutskiy@linux.intel.com>

Mention the new 'intel_c1_demotion' sysfs file in the "cpuidle" section
and refer to "Documentation/admin-guide/pm/intel_idle.rst" for more
information.

Signed-off-by: Artem Bityutskiy <artem.bityutskiy@linux.intel.com>
---
 Documentation/ABI/testing/sysfs-devices-system-cpu | 7 ++++++-
 1 file changed, 6 insertions(+), 1 deletion(-)

diff --git a/Documentation/ABI/testing/sysfs-devices-system-cpu b/Documentation/ABI/testing/sysfs-devices-system-cpu
index 206079d3bd5b..6c4934d3f4db 100644
--- a/Documentation/ABI/testing/sysfs-devices-system-cpu
+++ b/Documentation/ABI/testing/sysfs-devices-system-cpu
@@ -111,6 +111,7 @@ What:		/sys/devices/system/cpu/cpuidle/available_governors
 		/sys/devices/system/cpu/cpuidle/current_driver
 		/sys/devices/system/cpu/cpuidle/current_governor
 		/sys/devices/system/cpu/cpuidle/current_governer_ro
+		/sys/devices/system/cpu/cpuidle/intel_c1_demotion
 Date:		September 2007
 Contact:	Linux kernel mailing list <linux-kernel@vger.kernel.org>
 Description:	Discover cpuidle policy and mechanism
@@ -132,7 +133,11 @@ Description:	Discover cpuidle policy and mechanism
 
 		current_governor_ro: (RO) displays current idle policy.
 
-		See Documentation/admin-guide/pm/cpuidle.rst and
+		intel_c1_demotion: (RW) enables/disables the C1 demotion
+		feature on Intel CPUs.
+
+		See Documentation/admin-guide/pm/cpuidle.rst,
+		Documentation/admin-guide/pm/intel_idle.rst, and
 		Documentation/driver-api/pm/cpuidle.rst for more information.
 
 
-- 
2.47.1


^ permalink raw reply related	[flat|nested] 5+ messages in thread

* Re: [PATCH v2 1/3] intel_idle: Add C1 demotion on/off sysfs knob
  2025-02-20 15:17 ` [PATCH v2 1/3] " Artem Bityutskiy
@ 2025-02-27 20:06   ` Rafael J. Wysocki
  0 siblings, 0 replies; 5+ messages in thread
From: Rafael J. Wysocki @ 2025-02-27 20:06 UTC (permalink / raw)
  To: Artem Bityutskiy; +Cc: Rafael J. Wysocki, Linux PM Mailing List

On Thu, Feb 20, 2025 at 4:17 PM Artem Bityutskiy <dedekind1@gmail.com> wrote:
>
> From: Artem Bityutskiy <artem.bityutskiy@linux.intel.com>
>
> Add a sysfs knob to enable/disable C1 demotion for the following Intel
> platforms: Sapphire Rapids Xeon, Emerald Rapids Xeon, Granite Rapids Xeon,
> Sierra Forest Xeon, and Grand Ridge SoC.
>
> This sysfs file shows up as
> "/sys/devices/system/cpu/cpuidle/intel_c1_demotion".
>
> The C1 demotion feature involves the platform firmware demoting deep
> C-state requests from the OS (e.g., C6 requests) to C1. The idea is
> that firmware monitors CPU wake-up rate, and if it is higher than a
> platform-specific threshold, the firmware demotes deep C-state
> requests to C1. For example, Linux requests C6, but firmware noticed
> too many wake-ups per second, and it keeps the CPU in C1. When the
> CPU stays in C1 long enough, the platform promotes it back to C6.
>
> The default value for C1 demotion is whatever is configured by BIOS.
>
> Signed-off-by: Artem Bityutskiy <artem.bityutskiy@linux.intel.com>
> ---
>  drivers/idle/intel_idle.c | 103 ++++++++++++++++++++++++++++++++++++++
>  1 file changed, 103 insertions(+)
>
> diff --git a/drivers/idle/intel_idle.c b/drivers/idle/intel_idle.c
> index 118fe1d37c22..8d2095078469 100644
> --- a/drivers/idle/intel_idle.c
> +++ b/drivers/idle/intel_idle.c
> @@ -48,9 +48,11 @@
>  #include <trace/events/power.h>
>  #include <linux/sched.h>
>  #include <linux/sched/smt.h>
> +#include <linux/mutex.h>
>  #include <linux/notifier.h>
>  #include <linux/cpu.h>
>  #include <linux/moduleparam.h>
> +#include <linux/sysfs.h>
>  #include <asm/cpuid.h>
>  #include <asm/cpu_device_id.h>
>  #include <asm/intel-family.h>
> @@ -91,9 +93,15 @@ struct idle_cpu {
>         unsigned long auto_demotion_disable_flags;
>         bool byt_auto_demotion_disable_flag;
>         bool disable_promotion_to_c1e;
> +       bool c1_demotion_supported;
>         bool use_acpi;
>  };
>
> +static bool c1_demotion_supported;
> +static DEFINE_MUTEX(c1_demotion_mutex);
> +
> +static struct device *sysfs_root __initdata;
> +
>  static const struct idle_cpu *icpu __initdata;
>  static struct cpuidle_state *cpuidle_state_table __initdata;
>
> @@ -1541,18 +1549,21 @@ static const struct idle_cpu idle_cpu_gmt __initconst = {
>  static const struct idle_cpu idle_cpu_spr __initconst = {
>         .state_table = spr_cstates,
>         .disable_promotion_to_c1e = true,
> +       .c1_demotion_supported = true,
>         .use_acpi = true,
>  };
>
>  static const struct idle_cpu idle_cpu_gnr __initconst = {
>         .state_table = gnr_cstates,
>         .disable_promotion_to_c1e = true,
> +       .c1_demotion_supported = true,
>         .use_acpi = true,
>  };
>
>  static const struct idle_cpu idle_cpu_gnrd __initconst = {
>         .state_table = gnrd_cstates,
>         .disable_promotion_to_c1e = true,
> +       .c1_demotion_supported = true,
>         .use_acpi = true,
>  };
>
> @@ -1591,12 +1602,14 @@ static const struct idle_cpu idle_cpu_snr __initconst = {
>  static const struct idle_cpu idle_cpu_grr __initconst = {
>         .state_table = grr_cstates,
>         .disable_promotion_to_c1e = true,
> +       .c1_demotion_supported = true,
>         .use_acpi = true,
>  };
>
>  static const struct idle_cpu idle_cpu_srf __initconst = {
>         .state_table = srf_cstates,
>         .disable_promotion_to_c1e = true,
> +       .c1_demotion_supported = true,
>         .use_acpi = true,
>  };
>
> @@ -2291,6 +2304,89 @@ static void __init intel_idle_cpuidle_devices_uninit(void)
>                 cpuidle_unregister_device(per_cpu_ptr(intel_idle_cpuidle_devices, i));
>  }
>
> +static void intel_c1_demotion_toggle(void *info)
> +{
> +       unsigned long long msr_val;
> +       bool enable = *(bool *)info;

Instead of doing this here, you can cast the enable value to (void *)
in the caller, so you can do

> +
> +       rdmsrl(MSR_PKG_CST_CONFIG_CONTROL, msr_val);
> +       /*
> +        * Enable/disable C1 undemotion along with C1 demotion, as this is the
> +        * most sensible configuration in general.
> +        */
> +       if (enable)

if (info)  // and maybe rename info to enable?

> +               msr_val |= NHM_C1_AUTO_DEMOTE | SNB_C1_AUTO_UNDEMOTE;
> +       else
> +               msr_val &= ~(NHM_C1_AUTO_DEMOTE | SNB_C1_AUTO_UNDEMOTE);
> +       wrmsrl(MSR_PKG_CST_CONFIG_CONTROL, msr_val);
> +}
> +
> +static ssize_t intel_c1_demotion_store(struct device *dev,
> +                                      struct device_attribute *attr,
> +                                      const char *buf, size_t count)
> +{
> +       int err;
> +       bool enable;

Reverse X-mas tree ordering, please.

> +
> +       err = kstrtobool(buf, &enable);
> +       if (err)
> +               return err;
> +
> +       mutex_lock(&c1_demotion_mutex);
> +       /* Enable/disable C1 demotion on all CPUs */
> +       on_each_cpu(intel_c1_demotion_toggle, &enable, 1);

I mean

      on_each_cpu(intel_c1_demotion_toggle, (void *)enable, 1);

> +       mutex_unlock(&c1_demotion_mutex);
> +
> +       return count;
> +}
> +
> +static ssize_t intel_c1_demotion_show(struct device *dev,
> +                                     struct device_attribute *attr, char *buf)
> +{
> +       unsigned long long msr_val;
> +
> +       /*
> +        * Read the MSR value for a CPU and assume it is the same for all CPUs. Any other
> +        * configureation would be a BIOS bug.

configuration

> +        */
> +       rdmsrl(MSR_PKG_CST_CONFIG_CONTROL, msr_val);
> +       return sysfs_emit(buf, "%d\n", !!(msr_val & NHM_C1_AUTO_DEMOTE));
> +}
> +static DEVICE_ATTR_RW(intel_c1_demotion);
> +
> +static int __init intel_idle_sysfs_init(void)
> +{
> +       int err;
> +
> +       if (!c1_demotion_supported)
> +               return 0;
> +
> +       sysfs_root = bus_get_dev_root(&cpu_subsys);
> +       if (!sysfs_root)
> +               return 0;
> +
> +       err = sysfs_add_file_to_group(&sysfs_root->kobj,
> +                                     &dev_attr_intel_c1_demotion.attr,
> +                                     "cpuidle");
> +       if (err) {
> +               put_device(sysfs_root);
> +               return err;
> +       }
> +
> +       return 0;
> +}
> +
> +static void __init intel_idle_sysfs_uninit(void)
> +{
> +       if (!sysfs_root)
> +               return;
> +
> +       sysfs_remove_file_from_group(&sysfs_root->kobj,
> +                                    &dev_attr_intel_c1_demotion.attr,
> +                                    "cpuidle");
> +       put_device(sysfs_root);
> +}
> +
>  static int __init intel_idle_init(void)
>  {
>         const struct x86_cpu_id *id;
> @@ -2337,6 +2433,8 @@ static int __init intel_idle_init(void)
>                 auto_demotion_disable_flags = icpu->auto_demotion_disable_flags;
>                 if (icpu->disable_promotion_to_c1e)
>                         c1e_promotion = C1E_PROMOTION_DISABLE;
> +               if (icpu->c1_demotion_supported)
> +                       c1_demotion_supported = true;
>                 if (icpu->use_acpi || force_use_acpi)
>                         intel_idle_acpi_cst_extract();
>         } else if (!intel_idle_acpi_cst_extract()) {
> @@ -2350,6 +2448,10 @@ static int __init intel_idle_init(void)
>         if (!intel_idle_cpuidle_devices)
>                 return -ENOMEM;
>
> +       retval = intel_idle_sysfs_init();
> +       if (retval)
> +               pr_warn("failed to initialized sysfs");
> +
>         intel_idle_cpuidle_driver_init(&intel_idle_driver);
>
>         retval = cpuidle_register_driver(&intel_idle_driver);
> @@ -2374,6 +2476,7 @@ static int __init intel_idle_init(void)
>         intel_idle_cpuidle_devices_uninit();
>         cpuidle_unregister_driver(&intel_idle_driver);
>  init_driver_fail:
> +       intel_idle_sysfs_uninit();
>         free_percpu(intel_idle_cpuidle_devices);
>         return retval;
>
> --

^ permalink raw reply	[flat|nested] 5+ messages in thread

end of thread, other threads:[~2025-02-27 20:06 UTC | newest]

Thread overview: 5+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2025-02-20 15:16 [PATCH v2 0/3] intel_idle: Add C1 demotion on/off sysfs knob Artem Bityutskiy
2025-02-20 15:17 ` [PATCH v2 1/3] " Artem Bityutskiy
2025-02-27 20:06   ` Rafael J. Wysocki
2025-02-20 15:17 ` [PATCH v2 2/3] Documentation: admin-guide: pm: document intel_idle C1 demotion Artem Bityutskiy
2025-02-20 15:17 ` [PATCH v2 3/3] Documentation: ABI: testing: document the new cpuidle sysfs file Artem Bityutskiy

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).