public inbox for linux-acpi@vger.kernel.org
 help / color / mirror / Atom feed
From: Alex Williamson <alex.williamson@hp.com>
To: Pavel Machek <pavel@ucw.cz>
Cc: acpi-devel <acpi-devel@lists.sourceforge.net>,
	linux-kernel <linux-kernel@vger.kernel.org>
Subject: Re: [PATCH/RFC] exposing ACPI objects in sysfs
Date: Tue, 21 Sep 2004 10:48:35 -0600	[thread overview]
Message-ID: <1095785315.6307.6.camel@tdi> (raw)
In-Reply-To: <20040921122428.GB2383@elf.ucw.cz>

On Tue, 2004-09-21 at 14:24 +0200, Pavel Machek wrote:
> Hi!
> 
> >    I've lost track of how many of these patches I've done, but here's
> > the much anticipated next revision ;^)  The purpose of this patch is to
> > expose ACPI objects in the already existing namespace in sysfs
> > (/sys/firmware/acpi/namespace/ACPI).  There's a lot of information
> 
> Perhaps this needs some description in Documentation/ ?
> 

   Here's a start.  I'll add this to the next revision of the patch, but
for now, I'll send it alone for comment.  Thanks,

	Alex

--- /dev/null	2004-09-21 08:04:45.000000000 -0600
+++ linux-2.5/Documentation/acpi/acpi_sysfs	2004-09-21 10:41:45.000000000 -0600
@@ -0,0 +1,182 @@
+                  The ACPI sysfs object interface
+                  ===============================
+
+
+Revision History
+----------------
+2004-09-21: Alex Williamson <alex.williamson@hp.com> - Initial revision
+
+
+Overview
+--------
+
+   The ACPI sysfs interface attempts to solve the problem of providing
+an interface to ACPI namespace to user level programs.  ACPI objects
+are exposed as files under the /sys/firmware/acpi/namespace/ACPI/
+directory hierarchy.  For example, on an hp rx2600 system, the following
+objects are available:
+
+/sys/firmware/acpi/namespace/ACPI/_OSI
+/sys/firmware/acpi/namespace/ACPI/_OS_
+/sys/firmware/acpi/namespace/ACPI/_REV
+/sys/firmware/acpi/namespace/ACPI/_TZ/THM0/_TMP
+/sys/firmware/acpi/namespace/ACPI/_TZ/THM0/_CRT
+/sys/firmware/acpi/namespace/ACPI/_SB/CPU1/_SUN
+/sys/firmware/acpi/namespace/ACPI/_SB/CPU1/_UID
+/sys/firmware/acpi/namespace/ACPI/_SB/CPU0/_SUN
+/sys/firmware/acpi/namespace/ACPI/_SB/CPU0/_UID
+/sys/firmware/acpi/namespace/ACPI/_SB/SBA0/_UID
+/sys/firmware/acpi/namespace/ACPI/_SB/SBA0/_CRS
+/sys/firmware/acpi/namespace/ACPI/_SB/SBA0/_CID
+/sys/firmware/acpi/namespace/ACPI/_SB/SBA0/_HID
+/sys/firmware/acpi/namespace/ACPI/_SB/SBA0/PCI7/_HPP
+/sys/firmware/acpi/namespace/ACPI/_SB/SBA0/PCI7/_CRS
+/sys/firmware/acpi/namespace/ACPI/_SB/SBA0/PCI7/_PRT
+/sys/firmware/acpi/namespace/ACPI/_SB/SBA0/PCI7/_CID
+/sys/firmware/acpi/namespace/ACPI/_SB/SBA0/PCI7/_HID
+/sys/firmware/acpi/namespace/ACPI/_SB/SBA0/PCI7/_BBN
+/sys/firmware/acpi/namespace/ACPI/_SB/SBA0/PCI7/_STA
+/sys/firmware/acpi/namespace/ACPI/_SB/SBA0/PCI7/_UID
+...
+
+User space utilities can search ACPI namespace and call into the acpi_sysfs
+driver to evaluate objects.  The interface uses simple write and read
+operations to pass method arguments or commands and return the evaluated
+object value or attributes.  Simple objects (those that don't require
+method arguments) can be evaluated by simply reading the file:
+
+# xxd /sys/firmware/acpi/namespace/ACPI/_OS_    
+0000000: 0200 0000 1400 0000 1800 0000 0000 0000  ................
+0000010: 0000 0000 0000 0000 4d69 6372 6f73 6f66  ........Microsof
+0000020: 7420 5769 6e64 6f77 7320 4e54 0000 0000  t Windows NT....
+
+Standard ACPI objects are used for return values, allowing the interface
+to easily return ACPI packages, buffers, strings, etc...
+
+Todo: This interface really needs a libacpi and lsacpi type tools to
+      make it more readily available.
+
+Theory of Operation
+-------------------
+
+   The ACPI sysfs interface provides a per-open file backing store for
+ACPI object files.  Reads and writes to the file are consistent only
+within an open/close session (ie. closing the file clears all read and
+write data).  Object evaluation and special command processing only
+occurs when the object file is read.  This allows commands and arguments
+to be built up with multiple writes, but nothing occurs until the file
+is read.
+
+   Reading the object file at offset zero re-evaluates the object or
+command and clears current read/write buffers.  Reading from a non-zero
+offset returns the requested section of the current read buffer without
+re-evaluating the object or modifying the write buffer (should we clear
+the write buffer here?).
+
+   The ACPI sysfs interface uses standard ACPI data structures with the
+exception that all pointers in the structure are replaced by offsets
+into the read/write buffer.  Using the _OS_ object return value as an
+example, evaluating an object always returns a union acpi_object struct:
+
+union acpi_object
+{
+  acpi_object_type  type; /* See definition of acpi_ns_type for values */
+  struct
+  {
+    acpi_object_type  type;
+    acpi_integer      value; /* The actual number */
+  } integer;
+
+  struct
+  {
+    acpi_object_type  type;
+    u32               length;/* # of bytes in string, excluding trailing null */
+    char              *pointer;  /* points to the string value */
+  } string;
+...
+
+
+   Evaluating the first 4 bytes of the return buffer shows this is an
+ACPI_TYPE_STRING structure.  Using the string entry from the union, the
+next 4 bytes provides the length of the string (0x14 = 20 bytes).  Finally,
+this data type uses a pointer to a buffer to provide the actual data.  As
+seen in the output, the 8 byte pointer value (ia64 system) has been replaced
+by a buffer offset.  Therefore, the 20 byte char array starts at offset
+0x18 in the buffer.
+
+   The return value for commands is dependent on the command issued.
+The version command returns an acpi_object to facilitate synchronizing
+the size of a union acpi_object between kernel and user space.  The type
+commands simple return an acpi_object_type value.  Current available
+commands include:
+
+/* Get version, returned in union acpi_object (integer) struct */
+#define VERSION                 0x0
+/* Get the type of the object (Integer, String, Method, etc...) */
+#define GET_TYPE                0x1
+/* Get the type of the parent to the object (Device, Processor, etc...) */
+#define GET_PTYPE               0x2
+
+   Commands are issued by writing the following data structure to the ACPI
+object file:
+
+struct special_cmd {
+        u32                     magic;
+        unsigned int            cmd;
+        char                    *args;
+};
+
+The "magic" value is used to distinguish commands from method arguments
+and should always be set to ACPI_UINT32_MAX.  The cmd value is one of the
+operations to preform, such as GET_TYPE.  The args value is currently
+unused, but allows for data to be passed in for future commands.
+
+   Method arguments are always written to the ACPI object file as struct
+acpi_object_list:
+
+struct acpi_object_list
+{
+        u32                                 count;
+        union acpi_object                   *pointer;
+};
+
+Much like the return data, the pointer is replaced by an offset into the
+buffer (except this time, it's the caller's responsibility to make this
+conversion).  For example, If we wanted to take the string acpi_object
+above and convert it into an acpi_object_list, we'd end up with this:
+
+0000000: 0100 0000 0000 0000 1000 0000 0000 0000  ................
+0000010: 0200 0000 1400 0000 2800 0000 0000 0000  ................
+0000020: 0000 0000 0000 0000 4d69 6372 6f73 6f66  ........Microsof
+0000030: 7420 5769 6e64 6f77 7320 4e54 0000 0000  t Windows NT....
+
+Note that since this structure is for a 64 bit system, the pointer
+will be naturally aligned on a 8 byte boundary.  If we wanted to pass
+two arguments to the method, a string and a buffer, the structure we need
+to write would look like this:
+
+00000000  02 00 00 00 00 00 00 00 18 00 00 00 00 00 00 00 ................
+00000010  48 00 00 00 00 00 00 00 02 00 00 00 14 00 00 00 H...............
+00000020  30 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0...............
+00000030  4D 69 63 72 6F 73 6F 66 74 20 57 69 6E 64 6F 77 Microsoft Window
+00000040  73 20 4E 54 00 00 00 00 01 00 00 00 00 00 00 00 s NT............
+00000050  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
+
+   This structure shows 2 arguments, the first starts at offset 0x18.  The
+second argument starts at offset 0x48.  Using the same procedure above,
+the second argument is an ACPI_TYPE_INTEGER with a value of 0x0.  In this
+example, the string data come before the second argument, but it could
+just as easily be at the end of the buffer.  Maintaining proper data
+alignment is recommended.
+
+   On the kernel side, offsets are range checked to ensure they fall within
+the buffer before being converted to kernel pointers for the ACPI interpreter.
+
+   NOTE: ACPI methods have a purpose.  Randomly calling methods without
+knowing their side-effects will undoubtedly cause problems.  ACPI objects
+like _HID, _CID, _ADR, _SUN, _UID, _STA, _BBN should always be safe to
+evaluate.  These simply return data about the object.  Methods like
+_ON_, _OFF_, _S5_, etc... are meant to cause a change in the system and
+can cause problems.  The ACPI sysfs module makes an attempt to hide some
+of the more dangerous interfaces, but it not fool-proof.  DO NOT randomly
+read files in the ACPI namespace unless you know what they do.

  parent reply	other threads:[~2004-09-21 16:48 UTC|newest]

Thread overview: 17+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2004-09-20 21:41 [PATCH/RFC] exposing ACPI objects in sysfs Alex Williamson
2004-09-21 12:24 ` Pavel Machek
2004-09-21 14:18   ` Alex Williamson
2004-09-21 16:48   ` Alex Williamson [this message]
2004-09-21 17:26     ` Pavel Machek
2004-09-21 18:00       ` Alex Williamson
2004-09-21 19:31         ` Pavel Machek
2004-09-21 19:06       ` [ACPI] " Andi Kleen
2004-09-21 19:13         ` Alex Williamson
2004-09-21 19:18           ` Andi Kleen
2004-09-21 19:45             ` Alex Williamson
2004-09-21 19:58               ` Pavel Machek
2004-09-21 20:40                 ` Alex Williamson
2004-09-21 21:02                   ` Pavel Machek
     [not found]                     ` <20040921210218.GJ30425-I/5MKhXcvmPrBKCeMvbIDA@public.gmane.org>
2004-10-15 22:39                       ` Alex Williamson
2004-10-26 20:55                         ` [RFC] dev_acpi: support for userspace access to acpi Alex Williamson
2004-09-21 19:21           ` [ACPI] Re: [PATCH/RFC] exposing ACPI objects in sysfs Arjan van de Ven

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=1095785315.6307.6.camel@tdi \
    --to=alex.williamson@hp.com \
    --cc=acpi-devel@lists.sourceforge.net \
    --cc=linux-kernel@vger.kernel.org \
    --cc=pavel@ucw.cz \
    /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