public inbox for linux-kernel@vger.kernel.org
 help / color / mirror / Atom feed
From: Keshavamurthy Anil S <anil.s.keshavamurthy@intel.com>
To: Dmitry Torokhov <dtor_core@ameritech.net>,
	Len Brown <len.brown@intel.com>
Cc: acpi-devel@lists.sourceforge.net,
	Keshavamurthy Anil S <anil.s.keshavamurthy@intel.com>,
	"Brown, Len" <len.brown@intel.com>,
	LHNS list <lhns-devel@lists.sourceforge.net>,
	Linux IA64 <linux-ia64@vger.kernel.org>,
	Linux Kernel <linux-kernel@vger.kernel.org>
Subject: Re: [ACPI] PATCH-ACPI based CPU hotplug[2/6]-ACPI Eject interface support
Date: Fri, 24 Sep 2004 16:28:23 -0700	[thread overview]
Message-ID: <20040924162823.B27778@unix-os.sc.intel.com> (raw)
In-Reply-To: <200409201812.45933.dtor_core@ameritech.net>; from dtor_core@ameritech.net on Mon, Sep 20, 2004 at 06:12:45PM -0500

On Mon, Sep 20, 2004 at 06:12:45PM -0500, Dmitry Torokhov wrote:
> Hi Anil,
> 
> I obviously failed to deliver my idea :) I meant that I would like add eject
> attribute (along with maybe status, hid and some others) to kobjects in
> /sys/firmware/acpi tree.

Here the modified patch based on the your feedback. Now I am creating eject attribute
to the acpi kobjects in /sys/firmware/acpi.


---
Name:acpi_core_eject.patch
Status: Tested on 2.6.9-rc2
Signed-off-by: Anil S Keshavamurthy <anil.s.keshavamurthy@intel.com>
Depends:acpi_core
Version: applies on 2.6.9-rc2

The kernel when it receives an hardware sci eject request it simply passes this
to user mode agent and the agent in turn will offline all the child devices and
then echo's 1 onto the eject file for that acpi device.

This patch provides the sysfs "eject" interface for the user mode agent
to notify the core acpi so that the core acpi can trim its bus which 
causes .remove function to be called for all child devices.

For example for LSB0 which is an ejectable device, we will see
/sys/firmware/acpi/namespace/ACPI/_SB/LSB/eject.

---

 linux-2.6.9-rc2-askeshav/drivers/acpi/scan.c |  153 +++++++++++++++++++++++++++
 1 files changed, 153 insertions(+)

diff -puN drivers/acpi/scan.c~acpi_core_eject drivers/acpi/scan.c
--- linux-2.6.9-rc2/drivers/acpi/scan.c~acpi_core_eject	2004-09-24 15:26:20.348278419 -0700
+++ linux-2.6.9-rc2-askeshav/drivers/acpi/scan.c	2004-09-24 15:26:20.441051855 -0700
@@ -2,6 +2,7 @@
  * scan.c - support for transforming the ACPI namespace into individual objects
  */
 
+#include <linux/module.h>
 #include <linux/init.h>
 #include <linux/acpi.h>
 
@@ -34,7 +35,49 @@ static void acpi_device_release(struct k
 	kfree(dev);
 }
 
+struct acpi_device_attribute {
+	struct attribute attr;
+	ssize_t (*show)(struct acpi_device *, char *);
+	ssize_t (*store)(struct acpi_device *, const char *, size_t);
+};
+
+typedef void acpi_device_sysfs_files(struct kobject *,
+				const struct attribute *);
+
+static void setup_sys_fs_device_files(struct acpi_device *dev,
+		acpi_device_sysfs_files *func);
+
+#define create_sysfs_device_files(dev)	\
+	setup_sys_fs_device_files(dev, (acpi_device_sysfs_files *)&sysfs_create_file)
+#define remove_sysfs_device_files(dev)	\
+	setup_sys_fs_device_files(dev, (acpi_device_sysfs_files *)&sysfs_remove_file)
+
+
+#define to_acpi_device(n) container_of(n, struct acpi_device, kobj)
+#define to_handle_attr(n) container_of(n, struct acpi_device_attribute, attr);
+
+static ssize_t acpi_device_attr_show(struct kobject *kobj,
+		struct attribute *attr, char *buf)
+{
+	struct acpi_device *device = to_acpi_device(kobj);
+	struct acpi_device_attribute *attribute = to_handle_attr(attr);
+	return attribute->show ? attribute->show(device, buf) : 0;
+}
+static ssize_t acpi_device_attr_store(struct kobject *kobj,
+		struct attribute *attr, const char *buf, size_t len)
+{
+	struct acpi_device *device = to_acpi_device(kobj);
+	struct acpi_device_attribute *attribute = to_handle_attr(attr);
+	return attribute->store ? attribute->store(device, buf, len) : len;
+}
+
+static struct sysfs_ops acpi_device_sysfs_ops = {
+	.show	= acpi_device_attr_show,
+	.store	= acpi_device_attr_store,
+};
+
 static struct kobj_type ktype_acpi_ns = {
+	.sysfs_ops	= &acpi_device_sysfs_ops,
 	.release	= acpi_device_release,
 };
 
@@ -76,6 +119,7 @@ static void acpi_device_register(struct 
 	device->kobj.ktype = &ktype_acpi_ns;
 	device->kobj.kset = &acpi_namespace_kset;
 	kobject_add(&device->kobj);
+	create_sysfs_device_files(device);
 }
 
 static int
@@ -95,6 +139,7 @@ acpi_device_unregister (
 	spin_unlock(&acpi_device_lock);
 
 	acpi_detach_data(device->handle, acpi_bus_data_handler);
+	remove_sysfs_device_files(device);
 	kobject_unregister(&device->kobj);
 	return 0;
 }
@@ -291,6 +336,114 @@ end:
 }
 
 /* --------------------------------------------------------------------------
+		ACPI hotplug sysfs device file support
+   -------------------------------------------------------------------------- */
+static ssize_t acpi_eject_store(struct acpi_device *device, 
+		const char *buf, size_t count);
+
+#define ACPI_DEVICE_ATTR(_name,_mode,_show,_store) \
+static struct acpi_device_attribute acpi_device_attr_##_name = \
+		__ATTR(_name, _mode, _show, _store)
+
+ACPI_DEVICE_ATTR(eject, 0200, NULL, acpi_eject_store);
+
+/**
+ * setup_sys_fs_device_files - sets up the device files under device namespace
+ * @@dev:	acpi_device object
+ * @@func:	function pointer to create or destroy the device file
+ */
+static void
+setup_sys_fs_device_files (
+	struct acpi_device *dev,
+	acpi_device_sysfs_files *func)
+{
+	if (dev->flags.ejectable == 1)
+		(*(func))(&dev->kobj,&acpi_device_attr_eject.attr);
+}
+
+static int
+acpi_eject_operation(acpi_handle handle, int lockable)
+{
+	struct acpi_object_list arg_list;
+	union acpi_object arg;
+	acpi_status status = AE_OK;
+
+	/*
+	 * TBD: evaluate _PS3?
+	 */
+
+	if (lockable) {
+		arg_list.count = 1;
+		arg_list.pointer = &arg;
+		arg.type = ACPI_TYPE_INTEGER;
+		arg.integer.value = 0;
+		acpi_evaluate_object(handle, "_LCK", &arg_list, NULL);
+	}
+
+	arg_list.count = 1;
+	arg_list.pointer = &arg;
+	arg.type = ACPI_TYPE_INTEGER;
+	arg.integer.value = 1;
+
+	/*
+	 * TBD: _EJD support.
+	 */
+
+	status = acpi_evaluate_object(handle, "_EJ0", &arg_list, NULL);
+	if (ACPI_FAILURE(status)) {
+		return(-ENODEV);
+	}
+
+	return(0);
+}
+
+
+static ssize_t
+acpi_eject_store(struct acpi_device *device, const char *buf, size_t count)
+{
+	int	result;
+	int	ret = count;
+	int	islockable;
+	acpi_status	status;
+	acpi_handle	handle;
+	acpi_object_type	type = 0;
+
+	if ((!count) || (buf[0] != '1')) {
+		return -EINVAL;
+	}
+
+#ifndef FORCE_EJECT
+	if (device->driver == NULL) {
+		ret = -ENODEV;
+		goto err;
+	}
+#endif
+	status = acpi_get_type(device->handle, &type);
+	if (ACPI_FAILURE(status) || (!device->flags.ejectable) ) {
+		ret = -ENODEV;
+		goto err;
+	}
+
+	islockable = device->flags.lockable;
+	handle = device->handle;
+
+	if (type == ACPI_TYPE_PROCESSOR)
+		result = acpi_bus_trim(device, 0);
+	else
+		result = acpi_bus_trim(device, 1);
+
+	if (!result)
+		result = acpi_eject_operation(handle, islockable);
+
+	if (result) {
+		ret = -EBUSY;
+	}
+err:
+	return ret;
+}
+
+
+/* --------------------------------------------------------------------------
                               Performance Management
    -------------------------------------------------------------------------- */
 
_


  parent reply	other threads:[~2004-09-24 23:29 UTC|newest]

Thread overview: 63+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2004-09-20 16:25 PATCH-ACPI based CPU hotplug[0/6] Keshavamurthy Anil S
2004-09-20 16:29 ` PATCH-ACPI based CPU hotplug[0/6]-Core ACPI enhancement support Keshavamurthy Anil S
2004-09-20 16:34 ` PATCH-ACPI based CPU hotplug[1/6]-ACPI core " Keshavamurthy Anil S
     [not found]   ` <200409201326.44946.dtor_core@ameritech.net>
2004-09-20 19:01     ` [ACPI] " Keshavamurthy Anil S
2004-09-20 20:26       ` Bjorn Helgaas
2004-09-20 20:44         ` Keshavamurthy Anil S
2004-09-24 23:22           ` Keshavamurthy Anil S
2004-09-20 16:35 ` PATCH-ACPI based CPU hotplug[2/6]-ACPI Eject interface support Keshavamurthy Anil S
2004-09-20 18:33   ` [ACPI] " Dmitry Torokhov
2004-09-20 19:24     ` Keshavamurthy Anil S
2004-09-20 23:12       ` Dmitry Torokhov
2004-09-21  0:52         ` Alex Williamson
2004-09-21  1:20           ` Dmitry Torokhov
2004-09-21  1:25             ` Keshavamurthy Anil S
2004-09-21  1:41             ` Alex Williamson
2004-09-21  5:34               ` Dmitry Torokhov
2004-09-21  1:38         ` Keshavamurthy Anil S
2004-09-21  5:51           ` Dmitry Torokhov
2004-09-21 21:51             ` Keshavamurthy Anil S
2004-09-21 22:23               ` [Lhns-devel] " Russ Anderson
2004-09-22  3:10               ` Dmitry Torokhov
2004-09-24 23:28         ` Keshavamurthy Anil S [this message]
2004-09-27  6:12           ` Dmitry Torokhov
2004-09-27 16:53             ` Keshavamurthy Anil S
2004-09-27 18:09               ` Dmitry Torokhov
2004-09-22  4:17   ` Keiichiro Tokunaga
2004-09-22 16:59     ` Keshavamurthy Anil S
2004-09-20 16:38 ` PATCH-ACPI based CPU hotplug[3/6]-Mapping lsapic to cpu Keshavamurthy Anil S
2004-09-22  2:10   ` [ACPI] " Keiichiro Tokunaga
2004-09-23  6:55     ` Keshavamurthy Anil S
2004-09-22 13:15   ` Keiichiro Tokunaga
2004-09-22 13:23     ` Keiichiro Tokunaga
2004-09-22 14:52     ` Alex Williamson
2004-09-22 17:10       ` Keiichiro Tokunaga
2004-09-22 17:54         ` Keshavamurthy Anil S
2004-09-24 23:36         ` Keshavamurthy Anil S
2004-09-27 11:47           ` Keiichiro Tokunaga
2004-09-27 12:50           ` Keiichiro Tokunaga
2004-09-27 20:44             ` Keshavamurthy Anil S
2004-09-20 16:41 ` PATCH-ACPI based CPU hotplug[4/6]-Dynamic cpu register/unregister support Keshavamurthy Anil S
2004-09-22  8:34   ` [ACPI] " Keiichiro Tokunaga
2004-09-22 17:10     ` Keshavamurthy Anil S
2004-09-24 23:40     ` Keshavamurthy Anil S
2004-09-20 16:43 ` PATCH-ACPI based CPU hotplug[5/6]-ACPI processor driver extension Keshavamurthy Anil S
2004-09-22  9:57   ` [ACPI] " Keiichiro Tokunaga
2004-09-24 23:48   ` Keshavamurthy Anil S
2004-09-20 16:47 ` PATCH-ACPI based CPU hotplug[6/6]-ACPI Container driver Keshavamurthy Anil S
2004-09-23 16:23   ` [PATCH][0/4] NUMA node handling support for ACPI container driver Keiichiro Tokunaga
2004-09-23 16:31     ` [PATCH][1/4] Add unregister_node() to drivers/base/node.c Keiichiro Tokunaga
2004-09-23 16:43       ` [Lhns-devel] " Dave Hansen
2004-09-24  3:12         ` Keiichiro Tokunaga
2004-09-27 18:52       ` Keshavamurthy Anil S
2004-09-28 10:19         ` Keiichiro Tokunaga
2004-09-23 16:32     ` [PATCH][2/4] Add arch_register_node() for ia64 Keiichiro Tokunaga
2004-09-23 16:32     ` [PATCH][3/4] Add hotplug support to drivers/acpi/numa.c Keiichiro Tokunaga
2004-09-27 12:58       ` Keiichiro Tokunaga
2004-09-27 20:06       ` Keshavamurthy Anil S
2004-09-29  6:26         ` Keiichiro Tokunaga
2004-09-23 16:36     ` [PATCH][4/4] Add NUMA node handling to the container driver Keiichiro Tokunaga
2004-09-23 22:09       ` Mika Penttilä
2004-09-24  4:44         ` Keiichiro Tokunaga
2004-09-23 16:38     ` [PATCH][0/4] NUMA node handling support for ACPI " Keshavamurthy Anil S
2004-09-24 23:51   ` PATCH-ACPI based CPU hotplug[6/6]-ACPI Container driver Keshavamurthy Anil S

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=20040924162823.B27778@unix-os.sc.intel.com \
    --to=anil.s.keshavamurthy@intel.com \
    --cc=acpi-devel@lists.sourceforge.net \
    --cc=dtor_core@ameritech.net \
    --cc=len.brown@intel.com \
    --cc=lhns-devel@lists.sourceforge.net \
    --cc=linux-ia64@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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox