All of lore.kernel.org
 help / color / mirror / Atom feed
From: "Rafael J. Wysocki" <rjw@sisk.pl>
To: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Cc: ACPI Devel Maling List <linux-acpi@vger.kernel.org>,
	LKML <linux-kernel@vger.kernel.org>,
	"Kristen C. Accardi" <kristen.c.accardi@intel.com>,
	Len Brown <lenb@kernel.org>
Subject: [RFC][Update 2][PATCH 4/4] ACPI / PM: Expose lists of device power resources to user space
Date: Mon, 21 Jan 2013 14:08:16 +0100	[thread overview]
Message-ID: <75501802.qSzsX3NXGt@vostro.rjw.lan> (raw)
In-Reply-To: <4247313.2G7Z3nCgM0@vostro.rjw.lan>

From: Rafael J. Wysocki <rafael.j.wysocki@intel.com>

Since ACPI power resources are going to be used more extensively on
new hardware platforms, it is necessary to allow user space (powertop
in particular) to look at the lists of power resources corresponding
to different power states of devices for diagnostics and control
purposes.

For this reason, for each power state of an ACPI device node using
power resources create a special attribute group under the device
node's directory in sysfs containing links to sysfs directories
representing the power resources in that list.  The names of the
new attribute groups are "power_resources_<state>", where <state>
is the state name i.e. "D0", "D1", "D2", or "D3hot".

Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
---
 Documentation/ABI/testing/sysfs-devices-power_resources_D0    |   13 +
 Documentation/ABI/testing/sysfs-devices-power_resources_D1    |   14 +
 Documentation/ABI/testing/sysfs-devices-power_resources_D2    |   14 +
 Documentation/ABI/testing/sysfs-devices-power_resources_D3hot |   14 +
 drivers/acpi/power.c                                          |   96 ++++++++--
 5 files changed, 138 insertions(+), 13 deletions(-)

Index: linux-pm/drivers/acpi/power.c
===================================================================
--- linux-pm.orig/drivers/acpi/power.c
+++ linux-pm/drivers/acpi/power.c
@@ -417,24 +417,94 @@ static void acpi_power_remove_dependent(
 	}
 }
 
-void acpi_power_add_remove_device(struct acpi_device *adev, bool add)
+static struct attribute *attrs[] = {
+	NULL,
+};
+
+static void acpi_power_hide_list(struct acpi_device *adev,
+				 struct acpi_device_power_state *ps,
+				 const char *group_name)
 {
-	if (adev->power.flags.power_resources) {
-		struct acpi_device_power_state *ps;
-		struct acpi_power_resource_entry *entry;
-
-		ps = &adev->power.states[ACPI_STATE_D0];
-		list_for_each_entry(entry, &ps->resources, node) {
-			struct acpi_power_resource *resource = entry->resource;
-
-			if (add)
-				acpi_power_add_dependent(resource, adev);
-			else
-				acpi_power_remove_dependent(resource, adev);
+	struct attribute_group attr_group = {
+		.name	= group_name,
+		.attrs	= attrs,
+	};
+	struct acpi_power_resource_entry *entry;
+
+	list_for_each_entry_reverse(entry, &ps->resources, node) {
+		struct acpi_device *res_dev = &entry->resource->device;
+
+		sysfs_remove_link_from_group(&adev->dev.kobj, group_name,
+					     dev_name(&res_dev->dev));
+	}
+	sysfs_remove_group(&adev->dev.kobj, &attr_group);
+}
+
+static void acpi_power_expose_list(struct acpi_device *adev,
+				   struct acpi_device_power_state *ps,
+				   const char *group_name)
+{
+	struct attribute_group attr_group = {
+		.name	= group_name,
+		.attrs	= attrs,
+	};
+	struct acpi_power_resource_entry *entry;
+	int ret;
+
+	ret = sysfs_create_group(&adev->dev.kobj, &attr_group);
+	if (ret)
+		return;
+
+	list_for_each_entry(entry, &ps->resources, node) {
+		struct acpi_device *res_dev = &entry->resource->device;
+
+		ret = sysfs_add_link_to_group(&adev->dev.kobj, group_name,
+					      &res_dev->dev.kobj,
+					      dev_name(&res_dev->dev));
+		if (ret) {
+			acpi_power_hide_list(adev, ps, group_name);
+			break;
 		}
 	}
 }
 
+void acpi_power_add_remove_device(struct acpi_device *adev, bool add)
+{
+	static const char *group_names[ACPI_D_STATE_COUNT] = {
+		[ACPI_STATE_D0] = "power_resources_D0",
+		[ACPI_STATE_D1] = "power_resources_D1",
+		[ACPI_STATE_D2] = "power_resources_D2",
+		[ACPI_STATE_D3_HOT] = "power_resources_D3hot",
+	};
+	struct acpi_device_power_state *ps;
+	struct acpi_power_resource_entry *entry;
+	int state;
+
+	if (!adev->power.flags.power_resources)
+		return;
+
+	ps = &adev->power.states[ACPI_STATE_D0];
+	list_for_each_entry(entry, &ps->resources, node) {
+		struct acpi_power_resource *resource = entry->resource;
+
+		if (add)
+			acpi_power_add_dependent(resource, adev);
+		else
+			acpi_power_remove_dependent(resource, adev);
+	}
+
+	for (state = ACPI_STATE_D0; state <= ACPI_STATE_D3_HOT; state++) {
+		ps = &adev->power.states[state];
+		if (list_empty(&ps->resources))
+			continue;
+
+		if (add)
+			acpi_power_expose_list(adev, ps, group_names[state]);
+		else
+			acpi_power_hide_list(adev, ps, group_names[state]);
+	}
+}
+
 int acpi_power_min_system_level(struct list_head *list)
 {
 	struct acpi_power_resource_entry *entry;
Index: linux-pm/Documentation/ABI/testing/sysfs-devices-power_resources_D0
===================================================================
--- /dev/null
+++ linux-pm/Documentation/ABI/testing/sysfs-devices-power_resources_D0
@@ -0,0 +1,13 @@
+What:		/sys/devices/.../power_resources_D0/
+Date:		January 2013
+Contact:	Rafael J. Wysocki <rafael.j.wysocki@intel.com>
+Description:
+		The /sys/devices/.../power_resources_D0/ directory is only
+		present for device objects representing ACPI device nodes that
+		use ACPI power resources for power management.
+
+		If present, it contains symbolic links to device directories
+		representing ACPI power resources that need to be turned on for
+		the given device node to be in ACPI power state D0.  The names
+		of the links are the same as the names of the directories they
+		point to.
Index: linux-pm/Documentation/ABI/testing/sysfs-devices-power_resources_D1
===================================================================
--- /dev/null
+++ linux-pm/Documentation/ABI/testing/sysfs-devices-power_resources_D1
@@ -0,0 +1,14 @@
+What:		/sys/devices/.../power_resources_D1/
+Date:		January 2013
+Contact:	Rafael J. Wysocki <rafael.j.wysocki@intel.com>
+Description:
+		The /sys/devices/.../power_resources_D1/ directory is only
+		present for device objects representing ACPI device nodes that
+		use ACPI power resources for power management and support ACPI
+		power state D1.
+
+		If present, it contains symbolic links to device directories
+		representing ACPI power resources that need to be turned on for
+		the given device node to be in ACPI power state D1.  The names
+		of the links are the same as the names of the directories they
+		point to.
Index: linux-pm/Documentation/ABI/testing/sysfs-devices-power_resources_D2
===================================================================
--- /dev/null
+++ linux-pm/Documentation/ABI/testing/sysfs-devices-power_resources_D2
@@ -0,0 +1,14 @@
+What:		/sys/devices/.../power_resources_D2/
+Date:		January 2013
+Contact:	Rafael J. Wysocki <rafael.j.wysocki@intel.com>
+Description:
+		The /sys/devices/.../power_resources_D2/ directory is only
+		present for device objects representing ACPI device nodes that
+		use ACPI power resources for power management and support ACPI
+		power state D2.
+
+		If present, it contains symbolic links to device directories
+		representing ACPI power resources that need to be turned on for
+		the given device node to be in ACPI power state D2.  The names
+		of the links are the same as the names of the directories they
+		point to.
Index: linux-pm/Documentation/ABI/testing/sysfs-devices-power_resources_D3hot
===================================================================
--- /dev/null
+++ linux-pm/Documentation/ABI/testing/sysfs-devices-power_resources_D3hot
@@ -0,0 +1,14 @@
+What:		/sys/devices/.../power_resources_D3hot/
+Date:		January 2013
+Contact:	Rafael J. Wysocki <rafael.j.wysocki@intel.com>
+Description:
+		The /sys/devices/.../power_resources_D3hot/ directory is only
+		present for device objects representing ACPI device nodes that
+		use ACPI power resources for power management and support ACPI
+		power state D3hot.
+
+		If present, it contains symbolic links to device directories
+		representing ACPI power resources that need to be turned on for
+		the given device node to be in ACPI power state D3hot.  The
+		names of the links are the same as the names of the directories
+		they point to.


  parent reply	other threads:[~2013-01-21 13:02 UTC|newest]

Thread overview: 65+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2013-01-20 14:51 [RFC][PATCH 0/3] ACPI / PM: Export power resources information to user space Rafael J. Wysocki
2013-01-20 14:53 ` [RFC][PATCH 1/3] ACPI / PM: Expose reference count values of ACPI power resources Rafael J. Wysocki
2013-01-20 14:54 ` [RFC][PATCH 2/3] sysfs: Functions for adding/removing symlinks to/from attribute groups Rafael J. Wysocki
2013-01-20 14:57 ` [RFC][PATCH 3/3] ACPI / PM: Expose lists of device power resources to user space Rafael J. Wysocki
2013-01-20 23:37 ` [RFC][PATCH 0/3] ACPI / PM: Export power resources information " Greg Kroah-Hartman
2013-01-21  0:11   ` Rafael J. Wysocki
2013-01-21  0:48 ` [RFC][Update][PATCH " Rafael J. Wysocki
2013-01-21  0:50   ` [RFC][Update][PATCH 1/3] ACPI / PM: Expose reference count values of ACPI power resources Rafael J. Wysocki
2013-01-21  0:51   ` [RFC][Update][PATCH 2/3] sysfs: Functions for adding/removing symlinks to/from attribute groups Rafael J. Wysocki
2013-01-21  0:53   ` [RFC][Update][PATCH 3/3] ACPI / PM: Expose lists of device power resources to user space Rafael J. Wysocki
2013-01-21 13:03   ` [RFC][Update 2][PATCH 0/4] ACPI / PM: Export power information " Rafael J. Wysocki
2013-01-21 13:04     ` [RFC][Update 2][PATCH 1/4] ACPI / PM: Export power states of ACPI devices via sysfs Rafael J. Wysocki
2013-01-21 20:53       ` Greg Kroah-Hartman
2013-01-21 22:27         ` Rafael J. Wysocki
2013-01-21 22:26           ` Greg Kroah-Hartman
2013-01-21 22:59             ` Rafael J. Wysocki
2013-01-21 23:08               ` Greg Kroah-Hartman
2013-01-22  0:48                 ` Rafael J. Wysocki
2013-01-21 13:05     ` [RFC][Update 2][PATCH 2/4] ACPI / PM: Expose reference count values of ACPI power resources Rafael J. Wysocki
2013-01-21 20:53       ` Greg Kroah-Hartman
2013-01-21 22:35         ` Rafael J. Wysocki
2013-01-21 22:33           ` Greg Kroah-Hartman
2013-01-21 13:06     ` [RFC][Update 2][PATCH 3/4] sysfs: Functions for adding/removing symlinks to/from attribute groups Rafael J. Wysocki
2013-01-21 20:58       ` Greg Kroah-Hartman
2013-01-21 22:41         ` Rafael J. Wysocki
2013-01-21 22:38           ` Greg Kroah-Hartman
2013-01-21 13:08     ` Rafael J. Wysocki [this message]
2013-01-21 20:58       ` [RFC][Update 2][PATCH 4/4] ACPI / PM: Expose lists of device power resources to user space Greg Kroah-Hartman
2013-01-21 22:42         ` Rafael J. Wysocki
2013-01-22  2:15     ` [PATCH 0/4] ACPI / PM: Export power information " Rafael J. Wysocki
2013-01-22  2:25       ` [PATCH 1/4] ACPI / PM: Expose power states of ACPI devices " Rafael J. Wysocki
2013-01-22 23:42         ` Greg Kroah-Hartman
2013-01-22 23:47         ` Greg Kroah-Hartman
2013-01-23  0:01           ` Rafael J. Wysocki
2013-01-22 23:58             ` Greg Kroah-Hartman
2013-01-22  2:26       ` [PATCH 2/4] ACPI / PM: Expose current status of ACPI power resources Rafael J. Wysocki
2013-01-22 23:49         ` Greg Kroah-Hartman
2013-01-22  2:27       ` [PATCH 3/4] sysfs: Functions for adding/removing symlinks to/from attribute groups Rafael J. Wysocki
2013-01-22 23:51         ` Greg Kroah-Hartman
2013-01-23  0:03           ` Rafael J. Wysocki
2013-01-22  2:28       ` [PATCH 4/4] ACPI / PM: Expose lists of device power resources to user space Rafael J. Wysocki
2013-01-22 23:56         ` Greg Kroah-Hartman
2013-01-23  0:08           ` Rafael J. Wysocki
2013-01-23  0:17             ` Rafael J. Wysocki
2013-01-23  0:28               ` Rafael J. Wysocki
2013-01-23  1:05                 ` Greg Kroah-Hartman
2013-01-23 14:01                   ` Rafael J. Wysocki
2013-01-23  1:03               ` Greg Kroah-Hartman
2013-01-23 14:00                 ` Rafael J. Wysocki
2013-01-23 17:56       ` [Update][PATCH 0/5] ACPI / PM: Export power information " Rafael J. Wysocki
2013-01-23 17:58         ` [Update][PATCH 1/5] ACPI / scan: Prevent device add uevents from racing with " Rafael J. Wysocki
2013-01-24  0:33           ` Greg Kroah-Hartman
2013-01-23 17:59         ` [Update][PATCH 2/5] ACPI / PM: Expose power states of ACPI devices to " Rafael J. Wysocki
2013-01-23 18:00         ` [Update][PATCH 3/5] ACPI / PM: Expose current status of ACPI power resources Rafael J. Wysocki
2013-01-23 18:00         ` [Update][PATCH 4/5] sysfs: Functions for adding/removing symlinks to/from attribute groups Rafael J. Wysocki
2013-01-24  0:33           ` Greg Kroah-Hartman
2013-01-25 20:13           ` [patch] sysfs: Fix build when sysfs is disabled David Rientjes
2013-01-25 20:42             ` Greg Kroah-Hartman
2013-01-25 20:53               ` Rafael J. Wysocki
2013-01-25 20:52             ` Rafael J. Wysocki
2013-01-25 21:34               ` David Rientjes
2013-01-23 18:01         ` [Update][PATCH 5/5] ACPI / PM: Expose lists of device power resources to user space Rafael J. Wysocki
2013-01-24  0:34           ` Greg Kroah-Hartman
2013-01-24  0:34         ` [Update][PATCH 0/5] ACPI / PM: Export power information " Greg Kroah-Hartman
2013-01-24 12:34           ` Rafael J. Wysocki

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=75501802.qSzsX3NXGt@vostro.rjw.lan \
    --to=rjw@sisk.pl \
    --cc=gregkh@linuxfoundation.org \
    --cc=kristen.c.accardi@intel.com \
    --cc=lenb@kernel.org \
    --cc=linux-acpi@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.