acpi-lid.rst 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114
  1. .. SPDX-License-Identifier: GPL-2.0
  2. .. include:: <isonum.txt>
  3. =========================================================
  4. Special Usage Model of the ACPI Control Method Lid Device
  5. =========================================================
  6. :Copyright: |copy| 2016, Intel Corporation
  7. :Author: Lv Zheng <[email protected]>
  8. Abstract
  9. ========
  10. Platforms containing lids convey lid state (open/close) to OSPMs
  11. using a control method lid device. To implement this, the AML tables issue
  12. Notify(lid_device, 0x80) to notify the OSPMs whenever the lid state has
  13. changed. The _LID control method for the lid device must be implemented to
  14. report the "current" state of the lid as either "opened" or "closed".
  15. For most platforms, both the _LID method and the lid notifications are
  16. reliable. However, there are exceptions. In order to work with these
  17. exceptional buggy platforms, special restrictions and exceptions should be
  18. taken into account. This document describes the restrictions and the
  19. exceptions of the Linux ACPI lid device driver.
  20. Restrictions of the returning value of the _LID control method
  21. ==============================================================
  22. The _LID control method is described to return the "current" lid state.
  23. However the word of "current" has ambiguity, some buggy AML tables return
  24. the lid state upon the last lid notification instead of returning the lid
  25. state upon the last _LID evaluation. There won't be difference when the
  26. _LID control method is evaluated during the runtime, the problem is its
  27. initial returning value. When the AML tables implement this control method
  28. with cached value, the initial returning value is likely not reliable.
  29. There are platforms always retun "closed" as initial lid state.
  30. Restrictions of the lid state change notifications
  31. ==================================================
  32. There are buggy AML tables never notifying when the lid device state is
  33. changed to "opened". Thus the "opened" notification is not guaranteed. But
  34. it is guaranteed that the AML tables always notify "closed" when the lid
  35. state is changed to "closed". The "closed" notification is normally used to
  36. trigger some system power saving operations on Windows. Since it is fully
  37. tested, it is reliable from all AML tables.
  38. Exceptions for the userspace users of the ACPI lid device driver
  39. ================================================================
  40. The ACPI button driver exports the lid state to the userspace via the
  41. following file::
  42. /proc/acpi/button/lid/LID0/state
  43. This file actually calls the _LID control method described above. And given
  44. the previous explanation, it is not reliable enough on some platforms. So
  45. it is advised for the userspace program to not to solely rely on this file
  46. to determine the actual lid state.
  47. The ACPI button driver emits the following input event to the userspace:
  48. * SW_LID
  49. The ACPI lid device driver is implemented to try to deliver the platform
  50. triggered events to the userspace. However, given the fact that the buggy
  51. firmware cannot make sure "opened"/"closed" events are paired, the ACPI
  52. button driver uses the following 3 modes in order not to trigger issues.
  53. If the userspace hasn't been prepared to ignore the unreliable "opened"
  54. events and the unreliable initial state notification, Linux users can use
  55. the following kernel parameters to handle the possible issues:
  56. A. button.lid_init_state=method:
  57. When this option is specified, the ACPI button driver reports the
  58. initial lid state using the returning value of the _LID control method
  59. and whether the "opened"/"closed" events are paired fully relies on the
  60. firmware implementation.
  61. This option can be used to fix some platforms where the returning value
  62. of the _LID control method is reliable but the initial lid state
  63. notification is missing.
  64. This option is the default behavior during the period the userspace
  65. isn't ready to handle the buggy AML tables.
  66. B. button.lid_init_state=open:
  67. When this option is specified, the ACPI button driver always reports the
  68. initial lid state as "opened" and whether the "opened"/"closed" events
  69. are paired fully relies on the firmware implementation.
  70. This may fix some platforms where the returning value of the _LID
  71. control method is not reliable and the initial lid state notification is
  72. missing.
  73. If the userspace has been prepared to ignore the unreliable "opened" events
  74. and the unreliable initial state notification, Linux users should always
  75. use the following kernel parameter:
  76. C. button.lid_init_state=ignore:
  77. When this option is specified, the ACPI button driver never reports the
  78. initial lid state and there is a compensation mechanism implemented to
  79. ensure that the reliable "closed" notifications can always be delivered
  80. to the userspace by always pairing "closed" input events with complement
  81. "opened" input events. But there is still no guarantee that the "opened"
  82. notifications can be delivered to the userspace when the lid is actually
  83. opens given that some AML tables do not send "opened" notifications
  84. reliably.
  85. In this mode, if everything is correctly implemented by the platform
  86. firmware, the old userspace programs should still work. Otherwise, the
  87. new userspace programs are required to work with the ACPI button driver.
  88. This option will be the default behavior after the userspace is ready to
  89. handle the buggy AML tables.