ACPI: Export FADT pm_profile integer value to userspace
Thomas Renninger [Fri, 4 Nov 2011 02:33:46 +0000 (03:33 +0100)]
There are a lot userspace approaches to detect the usage of the
platform (laptop, workstation, server, ...) and adjust kernel tunables
accordingly (io/process scheduler, power management, ...).

These approaches need constant maintaining and are ugly to implement
(detect PCMCIA controller -> laptop,
does not work on recent systems anymore, ...)
On ACPI systems there is an easy and reliable way (if implemented
in BIOS and most recent platforms have this value set).
-> export it to userspace.

Signed-off-by: Thomas Renninger <trenn@suse.de>
Acked-by: Rafael J. Wysocki <rjw@sisk.pl>
Signed-off-by: Len Brown <len.brown@intel.com>

Documentation/ABI/stable/sysfs-acpi-pmprofile [new file with mode: 0644]
drivers/acpi/sysfs.c

diff --git a/Documentation/ABI/stable/sysfs-acpi-pmprofile b/Documentation/ABI/stable/sysfs-acpi-pmprofile
new file mode 100644 (file)
index 0000000..964c7a8
--- /dev/null
@@ -0,0 +1,22 @@
+What:          /sys/firmware/acpi/pm_profile
+Date:          03-Nov-2011
+KernelVersion: v3.2
+Contact:       linux-acpi@vger.kernel.org
+Description:   The ACPI pm_profile sysfs interface exports the platform
+               power management (and performance) requirement expectations
+               as provided by BIOS. The integer value is directly passed as
+               retrieved from the FADT ACPI table.
+Values:         For possible values see ACPI specification:
+               5.2.9 Fixed ACPI Description Table (FADT)
+               Field: Preferred_PM_Profile
+
+               Currently these values are defined by spec:
+               0 Unspecified
+               1 Desktop
+               2 Mobile
+               3 Workstation
+               4 Enterprise Server
+               5 SOHO Server
+               6 Appliance PC
+               7 Performance Server
+               >7 Reserved
index c538d0e..9f66181 100644 (file)
@@ -706,11 +706,23 @@ static void __exit interrupt_stats_exit(void)
        return;
 }
 
+static ssize_t
+acpi_show_profile(struct device *dev, struct device_attribute *attr,
+                 char *buf)
+{
+       return sprintf(buf, "%d\n", acpi_gbl_FADT.preferred_profile);
+}
+
+static const struct device_attribute pm_profile_attr =
+       __ATTR(pm_profile, S_IRUGO, acpi_show_profile, NULL);
+
 int __init acpi_sysfs_init(void)
 {
        int result;
 
        result = acpi_tables_sysfs_init();
-
+       if (result)
+               return result;
+       result = sysfs_create_file(acpi_kobj, &pm_profile_attr.attr);
        return result;
 }