RE: [PATCH v2 4/4] ACPI / button: Add document for ACPI control method lid device restrictions
From: Zheng, Lv <hidden>
Date: 2016-07-20 03:22:12
Also in:
linux-acpi, lkml
Hi, Dmitry
From: Dmitry Torokhov [mailto:dmitry.torokhov@gmail.com] Subject: Re: [PATCH v2 4/4] ACPI / button: Add document for ACPI control method lid device restrictions On Mon, Jul 11, 2016 at 01:34:08PM +0200, Benjamin Tissoires wrote:quoted
On Fri, Jul 8, 2016 at 7:51 PM, Dmitry Torokhov [off-list ref] wrote:quoted
On Fri, Jul 08, 2016 at 11:17:39AM +0200, Benjamin Tissoires wrote:quoted
Hi, On Thu, Jul 7, 2016 at 9:11 AM, Lv Zheng [off-list ref]wrote:quoted
quoted
quoted
quoted
There are many AML tables reporting wrong initial lid state, andsome ofquoted
quoted
quoted
quoted
them never reports lid state. As a proxy layer acting between, ACPIbuttonquoted
quoted
quoted
quoted
driver is not able to handle all such cases, but need to re-define the usage model of the ACPI lid. That is: 1. It's initial state is not reliable; 2. There may not be open event; 3. Userspace should only take action against the close event whichisquoted
quoted
quoted
quoted
reliable, always sent after a real lid close. This patch adds documentation of the usage model. Link: https://lkml.org/2016/3/7/460 Link: https://github.com/systemd/systemd/issues/2087 Signed-off-by: Lv Zheng <redacted> Cc: Bastien Nocera: <hadess@hadess.net> Cc: Benjamin Tissoires <redacted> Cc: linux-input@vger.kernel.org --- Documentation/acpi/acpi-lid.txt | 62+++++++++++++++++++++++++++++++++++++++quoted
quoted
quoted
quoted
1 file changed, 62 insertions(+) create mode 100644 Documentation/acpi/acpi-lid.txtdiff --git a/Documentation/acpi/acpi-lid.txtb/Documentation/acpi/acpi-lid.txtquoted
quoted
quoted
quoted
new file mode 100644 index 0000000..7e4f7ed--- /dev/null +++ b/Documentation/acpi/acpi-lid.txt@@ -0,0 +1,62 @@ +Usage Model of the ACPI Control Method Lid Device + +Copyright (C) 2016, Intel Corporation +Author: Lv Zheng <lv.zheng@intel.com> + + +Abstract: + +Platforms containing lids convey lid state (open/close) to OSPMsusing aquoted
quoted
quoted
quoted
+control method lid device. To implement this, the AML tables issue +Notify(lid_device, 0x80) to notify the OSPMs whenever the lidstate hasquoted
quoted
quoted
quoted
+changed. The _LID control method for the lid device must beimplemented toquoted
quoted
quoted
quoted
+report the "current" state of the lid as either "opened" or "closed". + +This document describes the restrictions and the expections of theLinuxquoted
quoted
quoted
quoted
+ACPI lid device driver. + + +1. Restrictions of the returning value of the _LID control method + +The _LID control method is described to return the "current" lidstate.quoted
quoted
quoted
quoted
+However the word of "current" has ambiguity, many AML tablesreturn the lidquoted
quoted
quoted
quoted
+state upon the last lid notification instead of returning the lid state +upon the last _LID evaluation. There won't be difference when the_LIDquoted
quoted
quoted
quoted
+control method is evaluated during the runtime, the problem is itsinitialquoted
quoted
quoted
quoted
+returning value. When the AML tables implement this controlmethod withquoted
quoted
quoted
quoted
+cached value, the initial returning value is likely not reliable. Therearequoted
quoted
quoted
quoted
+simply so many examples always retuning "closed" as initial lidstate.quoted
quoted
quoted
quoted
+ +2. Restrictions of the lid state change notifications + +There are many AML tables never notifying when the lid devicestate isquoted
quoted
quoted
quoted
+changed to "opened". But it is ensured that the AML tables alwaysnotifyquoted
quoted
quoted
quoted
+"closed" when the lid state is changed to "closed". This is normallyusedquoted
quoted
quoted
quoted
+to trigger some system power saving operations on Windows.Since it isquoted
quoted
quoted
quoted
+fully tested, this notification is reliable for all AML tables. + +3. Expections for the userspace users of the ACPI lid device driver + +The userspace programs should stop relying on +/proc/acpi/button/lid/LID0/state to obtain the lid state. This file isonlyquoted
quoted
quoted
quoted
+used for the validation purpose.I'd say: this file actually calls the _LID method described above. And given the previous explanation, it is not reliable enough on some platforms. So it is strongly advised for user-space program to not solely rely on this file to determine the actual lid state.quoted
+ +New userspace programs should rely on the lid "closed"notification toquoted
quoted
quoted
quoted
+trigger some power saving operations and may stop taking actionsaccordingquoted
quoted
quoted
quoted
+to the lid "opened" notification. A new input switch event -SW_ACPI_LID isquoted
quoted
quoted
quoted
+prepared for the new userspace to implement this ACPI controlmethod lidquoted
quoted
quoted
quoted
+device specific logics.That's not entirely what we discussed before (to prevent regressions): - if the device doesn't have reliable LID switch state, then there would be the new input event, and so userspace should only rely on opened notifications. - if the device has reliable switch information, the new input event should not be exported and userspace knows that the current input switch event is reliable. Also, using a new "switch" event is a terrible idea. Switches have a state (open/close) and you are using this to forward a single open event. So using a switch just allows you to say to userspace you are using the "new" LID meaning, but you'll still have to manually reset the switch and you will have to document how this event is not a switch. Please use a simple KEY_LID_OPEN event you will send through [input_key_event(KEY_LID_OPEN, 1), input_sync(), input_key_event(KEY_LID_OPEN, 0), input_sync()], which userspaceknowsquoted
quoted
quoted
how to handle.quoted
+ +During the period the userspace hasn't been switched to use thenewquoted
quoted
quoted
quoted
+SW_ACPI_LID event, Linux users can use the following bootparameter toquoted
quoted
quoted
quoted
+handle possible issues: + button.lid_init_state=method: + This is the default behavior of the Linux ACPI lid driver, Linuxkernelquoted
quoted
quoted
quoted
+ reports the initial lid state using the returning value of the _LID + control method. + This can be used to fix some platforms if the _LID controlmethod'squoted
quoted
quoted
quoted
+ returning value is reliable. + button.lid_init_state=open: + Linux kernel always reports the initial lid state as "opened". + This may fix some platforms if the returning value of the _LIDcontrolquoted
quoted
quoted
quoted
+ method is not reliable.This worries me as there is no plan after "During the period the userspace hasn't been switched to use the new event". I really hope you'll keep sending SW_LID for reliable LID platforms, and not remove it entirely as you will break platforms.How about we leave the kernel alone and userspace (which would havetoquoted
quoted
cope with the new KEY_LID_OPEN anyway) would just have to knowthat ifquoted
quoted
switch's parent is PNP0C0D:00 (or phys is PNP0C0D/button/input0)then itquoted
quoted
can't trust the events and it needs additional heuristics.I really wished we could leave the kernel alone, but some platform need fixes: we are using an EV_SW, and on those platform, we only get the close event, which means it gets ignored by the input layer.OK. Can we then emit missing "open" if we get "close" and the state is already closed?
[Lv Zheng]
I've been considering this again.
I think you may mean we can improve SW_LID by reporting SW_LID(open) when a new close event is arrived.
So that we may be able to fix old programs.
Possibly the code should be looked like:
If (!!state != last_state && time_after(jiffies, last_jiffies)) {
input_report_switch(..., state);
}
input_report_switch(..., !state);
However, there are tables never reporting "open".
If we do things in this way, there will be a very long period between the last close and the next close.
Which means there will be a too long period between the close and the open switch events.
IMO, this cannot fix old user space programs.
Currently, logind has a timeout mechanism.
If it cannot receive "open" within this period, it will suspend the system again right after resuming.
Thus we can still see that suspending right after resuming could be resulted.
However the new key events allow the new user space to fix the issue without changing the timeout logic.
For the old user space programs, I have no idea how we can fix them on such platforms (no open events).
Thanks and best regards
-Lv