~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

TOMOYO Linux Cross Reference
Linux/Documentation/firmware-guide/acpi/osi.rst

Version: ~ [ linux-6.12-rc7 ] ~ [ linux-6.11.7 ] ~ [ linux-6.10.14 ] ~ [ linux-6.9.12 ] ~ [ linux-6.8.12 ] ~ [ linux-6.7.12 ] ~ [ linux-6.6.60 ] ~ [ linux-6.5.13 ] ~ [ linux-6.4.16 ] ~ [ linux-6.3.13 ] ~ [ linux-6.2.16 ] ~ [ linux-6.1.116 ] ~ [ linux-6.0.19 ] ~ [ linux-5.19.17 ] ~ [ linux-5.18.19 ] ~ [ linux-5.17.15 ] ~ [ linux-5.16.20 ] ~ [ linux-5.15.171 ] ~ [ linux-5.14.21 ] ~ [ linux-5.13.19 ] ~ [ linux-5.12.19 ] ~ [ linux-5.11.22 ] ~ [ linux-5.10.229 ] ~ [ linux-5.9.16 ] ~ [ linux-5.8.18 ] ~ [ linux-5.7.19 ] ~ [ linux-5.6.19 ] ~ [ linux-5.5.19 ] ~ [ linux-5.4.285 ] ~ [ linux-5.3.18 ] ~ [ linux-5.2.21 ] ~ [ linux-5.1.21 ] ~ [ linux-5.0.21 ] ~ [ linux-4.20.17 ] ~ [ linux-4.19.323 ] ~ [ linux-4.18.20 ] ~ [ linux-4.17.19 ] ~ [ linux-4.16.18 ] ~ [ linux-4.15.18 ] ~ [ linux-4.14.336 ] ~ [ linux-4.13.16 ] ~ [ linux-4.12.14 ] ~ [ linux-4.11.12 ] ~ [ linux-4.10.17 ] ~ [ linux-4.9.337 ] ~ [ linux-4.4.302 ] ~ [ linux-3.10.108 ] ~ [ linux-2.6.32.71 ] ~ [ linux-2.6.0 ] ~ [ linux-2.4.37.11 ] ~ [ unix-v6-master ] ~ [ ccs-tools-1.8.12 ] ~ [ policy-sample ] ~
Architecture: ~ [ i386 ] ~ [ alpha ] ~ [ m68k ] ~ [ mips ] ~ [ ppc ] ~ [ sparc ] ~ [ sparc64 ] ~

Diff markup

Differences between /Documentation/firmware-guide/acpi/osi.rst (Version linux-6.12-rc7) and /Documentation/firmware-guide/acpi/osi.rst (Version linux-5.16.20)


  1 .. SPDX-License-Identifier: GPL-2.0                 1 .. SPDX-License-Identifier: GPL-2.0
  2                                                     2 
  3 ==========================                          3 ==========================
  4 ACPI _OSI and _REV methods                          4 ACPI _OSI and _REV methods
  5 ==========================                          5 ==========================
  6                                                     6 
  7 An ACPI BIOS can use the "Operating System Int      7 An ACPI BIOS can use the "Operating System Interfaces" method (_OSI)
  8 to find out what the operating system supports      8 to find out what the operating system supports. Eg. If BIOS
  9 AML code includes _OSI("XYZ"), the kernel's AM      9 AML code includes _OSI("XYZ"), the kernel's AML interpreter
 10 can evaluate that method, look to see if it su     10 can evaluate that method, look to see if it supports 'XYZ'
 11 and answer YES or NO to the BIOS.                  11 and answer YES or NO to the BIOS.
 12                                                    12 
 13 The ACPI _REV method returns the "Revision of      13 The ACPI _REV method returns the "Revision of the ACPI specification
 14 that OSPM supports"                                14 that OSPM supports"
 15                                                    15 
 16 This document explains how and why the BIOS an     16 This document explains how and why the BIOS and Linux should use these methods.
 17 It also explains how and why they are widely m     17 It also explains how and why they are widely misused.
 18                                                    18 
 19 How to use _OSI                                    19 How to use _OSI
 20 ===============                                    20 ===============
 21                                                    21 
 22 Linux runs on two groups of machines -- those      22 Linux runs on two groups of machines -- those that are tested by the OEM
 23 to be compatible with Linux, and those that we     23 to be compatible with Linux, and those that were never tested with Linux,
 24 but where Linux was installed to replace the o     24 but where Linux was installed to replace the original OS (Windows or OSX).
 25                                                    25 
 26 The larger group is the systems tested to run      26 The larger group is the systems tested to run only Windows.  Not only that,
 27 but many were tested to run with just one spec     27 but many were tested to run with just one specific version of Windows.
 28 So even though the BIOS may use _OSI to query      28 So even though the BIOS may use _OSI to query what version of Windows is running,
 29 only a single path through the BIOS has actual     29 only a single path through the BIOS has actually been tested.
 30 Experience shows that taking untested paths th     30 Experience shows that taking untested paths through the BIOS
 31 exposes Linux to an entire category of BIOS bu     31 exposes Linux to an entire category of BIOS bugs.
 32 For this reason, Linux _OSI defaults must cont     32 For this reason, Linux _OSI defaults must continue to claim compatibility
 33 with all versions of Windows.                      33 with all versions of Windows.
 34                                                    34 
 35 But Linux isn't actually compatible with Windo     35 But Linux isn't actually compatible with Windows, and the Linux community
 36 has also been hurt with regressions when Linux     36 has also been hurt with regressions when Linux adds the latest version of
 37 Windows to its list of _OSI strings.  So it is     37 Windows to its list of _OSI strings.  So it is possible that additional strings
 38 will be more thoroughly vetted before shipping     38 will be more thoroughly vetted before shipping upstream in the future.
 39 But it is likely that they will all eventually     39 But it is likely that they will all eventually be added.
 40                                                    40 
 41 What should an OEM do if they want to support      41 What should an OEM do if they want to support Linux and Windows
 42 using the same BIOS image?  Often they need to     42 using the same BIOS image?  Often they need to do something different
 43 for Linux to deal with how Linux is different      43 for Linux to deal with how Linux is different from Windows.
                                                   >>  44 Here the BIOS should ask exactly what it wants to know:
 44                                                    45 
 45 In this case, the OEM should create custom ASL << 
 46 Linux kernel and changes to Linux kernel drive << 
 47 ASL.  The easiest way to accomplish this is to << 
 48 method (_DSM) that is called from the Linux ke << 
 49                                                << 
 50 In the past the kernel used to support somethi << 
 51 _OSI("Linux-OEM-my_interface_name")                46 _OSI("Linux-OEM-my_interface_name")
 52 where 'OEM' is needed if this is an OEM-specif     47 where 'OEM' is needed if this is an OEM-specific hook,
 53 and 'my_interface_name' describes the hook, wh     48 and 'my_interface_name' describes the hook, which could be a
 54 quirk, a bug, or a bug-fix.                        49 quirk, a bug, or a bug-fix.
 55                                                    50 
 56 However this was discovered to be abused by ot !!  51 In addition, the OEM should send a patch to upstream Linux
 57 completely unrelated code on completely unrela !!  52 via the linux-acpi@vger.kernel.org mailing list.  When that patch
 58 an evaluation of all of its uses. This uncover !!  53 is checked into Linux, the OS will answer "YES" when the BIOS
 59 for any of the original reasons. As such, the  !!  54 on the OEM's system uses _OSI to ask if the interface is supported
 60 any custom Linux-* strings by default.         !!  55 by the OS.  Linux distributors can back-port that patch for Linux
                                                   >>  56 pre-installs, and it will be included by all distributions that
                                                   >>  57 re-base to upstream.  If the distribution can not update the kernel binary,
                                                   >>  58 they can also add an acpi_osi=Linux-OEM-my_interface_name
                                                   >>  59 cmdline parameter to the boot loader, as needed.
                                                   >>  60 
                                                   >>  61 If the string refers to a feature where the upstream kernel
                                                   >>  62 eventually grows support, a patch should be sent to remove
                                                   >>  63 the string when that support is added to the kernel.
 61                                                    64 
 62 That was easy.  Read on, to find out how to do     65 That was easy.  Read on, to find out how to do it wrong.
 63                                                    66 
 64 Before _OSI, there was _OS                         67 Before _OSI, there was _OS
 65 ==========================                         68 ==========================
 66                                                    69 
 67 ACPI 1.0 specified "_OS" as an                     70 ACPI 1.0 specified "_OS" as an
 68 "object that evaluates to a string that identi     71 "object that evaluates to a string that identifies the operating system."
 69                                                    72 
 70 The ACPI BIOS flow would include an evaluation     73 The ACPI BIOS flow would include an evaluation of _OS, and the AML
 71 interpreter in the kernel would return to it a     74 interpreter in the kernel would return to it a string identifying the OS:
 72                                                    75 
 73 Windows 98, SE: "Microsoft Windows"                76 Windows 98, SE: "Microsoft Windows"
 74 Windows ME: "Microsoft WindowsME:Millennium Ed     77 Windows ME: "Microsoft WindowsME:Millennium Edition"
 75 Windows NT: "Microsoft Windows NT"                 78 Windows NT: "Microsoft Windows NT"
 76                                                    79 
 77 The idea was on a platform tasked with running     80 The idea was on a platform tasked with running multiple OS's,
 78 the BIOS could use _OS to enable devices that      81 the BIOS could use _OS to enable devices that an OS
 79 might support, or enable quirks or bug workaro     82 might support, or enable quirks or bug workarounds
 80 necessary to make the platform compatible with     83 necessary to make the platform compatible with that pre-existing OS.
 81                                                    84 
 82 But _OS had fundamental problems.  First, the      85 But _OS had fundamental problems.  First, the BIOS needed to know the name
 83 of every possible version of the OS that would     86 of every possible version of the OS that would run on it, and needed to know
 84 all the quirks of those OS's.  Certainly it wo     87 all the quirks of those OS's.  Certainly it would make more sense
 85 for the BIOS to ask *specific* things of the O     88 for the BIOS to ask *specific* things of the OS, such
 86 "do you support a specific interface", and thu     89 "do you support a specific interface", and thus in ACPI 3.0,
 87 _OSI was born to replace _OS.                      90 _OSI was born to replace _OS.
 88                                                    91 
 89 _OS was abandoned, though even today, many BIO     92 _OS was abandoned, though even today, many BIOS look for
 90 _OS "Microsoft Windows NT", though it seems so     93 _OS "Microsoft Windows NT", though it seems somewhat far-fetched
 91 that anybody would install those old operating     94 that anybody would install those old operating systems
 92 over what came with the machine.                   95 over what came with the machine.
 93                                                    96 
 94 Linux answers "Microsoft Windows NT" to please     97 Linux answers "Microsoft Windows NT" to please that BIOS idiom.
 95 That is the *only* viable strategy, as that is     98 That is the *only* viable strategy, as that is what modern Windows does,
 96 and so doing otherwise could steer the BIOS do     99 and so doing otherwise could steer the BIOS down an untested path.
 97                                                   100 
 98 _OSI is born, and immediately misused             101 _OSI is born, and immediately misused
 99 =====================================             102 =====================================
100                                                   103 
101 With _OSI, the *BIOS* provides the string desc    104 With _OSI, the *BIOS* provides the string describing an interface,
102 and asks the OS: "YES/NO, are you compatible w    105 and asks the OS: "YES/NO, are you compatible with this interface?"
103                                                   106 
104 eg. _OSI("3.0 Thermal Model") would return TRU    107 eg. _OSI("3.0 Thermal Model") would return TRUE if the OS knows how
105 to deal with the thermal extensions made to th    108 to deal with the thermal extensions made to the ACPI 3.0 specification.
106 An old OS that doesn't know about those extens    109 An old OS that doesn't know about those extensions would answer FALSE,
107 and a new OS may be able to return TRUE.          110 and a new OS may be able to return TRUE.
108                                                   111 
109 For an OS-specific interface, the ACPI spec sa    112 For an OS-specific interface, the ACPI spec said that the BIOS and the OS
110 were to agree on a string of the form such as     113 were to agree on a string of the form such as "Windows-interface_name".
111                                                   114 
112 But two bad things happened.  First, the Windo    115 But two bad things happened.  First, the Windows ecosystem used _OSI
113 not as designed, but as a direct replacement f    116 not as designed, but as a direct replacement for _OS -- identifying
114 the OS version, rather than an OS supported in    117 the OS version, rather than an OS supported interface.  Indeed, right
115 from the start, the ACPI 3.0 spec itself codif    118 from the start, the ACPI 3.0 spec itself codified this misuse
116 in example code using _OSI("Windows 2001").       119 in example code using _OSI("Windows 2001").
117                                                   120 
118 This misuse was adopted and continues today.      121 This misuse was adopted and continues today.
119                                                   122 
120 Linux had no choice but to also return TRUE to    123 Linux had no choice but to also return TRUE to _OSI("Windows 2001")
121 and its successors.  To do otherwise would vir    124 and its successors.  To do otherwise would virtually guarantee breaking
122 a BIOS that has been tested only with that _OS    125 a BIOS that has been tested only with that _OSI returning TRUE.
123                                                   126 
124 This strategy is problematic, as Linux is neve    127 This strategy is problematic, as Linux is never completely compatible with
125 the latest version of Windows, and sometimes i    128 the latest version of Windows, and sometimes it takes more than a year
126 to iron out incompatibilities.                    129 to iron out incompatibilities.
127                                                   130 
128 Not to be out-done, the Linux community made t    131 Not to be out-done, the Linux community made things worse by returning TRUE
129 to _OSI("Linux").  Doing so is even worse than    132 to _OSI("Linux").  Doing so is even worse than the Windows misuse
130 of _OSI, as "Linux" does not even contain any     133 of _OSI, as "Linux" does not even contain any version information.
131 _OSI("Linux") led to some BIOS' malfunctioning    134 _OSI("Linux") led to some BIOS' malfunctioning due to BIOS writer's
132 using it in untested BIOS flows.  But some OEM    135 using it in untested BIOS flows.  But some OEM's used _OSI("Linux")
133 in tested flows to support real Linux features    136 in tested flows to support real Linux features.  In 2009, Linux
134 removed _OSI("Linux"), and added a cmdline par    137 removed _OSI("Linux"), and added a cmdline parameter to restore it
135 for legacy systems still needed it.  Further a    138 for legacy systems still needed it.  Further a BIOS_BUG warning prints
136 for all BIOS's that invoke it.                    139 for all BIOS's that invoke it.
137                                                   140 
138 No BIOS should use _OSI("Linux").                 141 No BIOS should use _OSI("Linux").
139                                                   142 
140 The result is a strategy for Linux to maximize    143 The result is a strategy for Linux to maximize compatibility with
141 ACPI BIOS that are tested on Windows machines.    144 ACPI BIOS that are tested on Windows machines.  There is a real risk
142 of over-stating that compatibility; but the al    145 of over-stating that compatibility; but the alternative has often been
143 catastrophic failure resulting from the BIOS t    146 catastrophic failure resulting from the BIOS taking paths that
144 were never validated under *any* OS.              147 were never validated under *any* OS.
145                                                   148 
146 Do not use _REV                                   149 Do not use _REV
147 ===============                                   150 ===============
148                                                   151 
149 Since _OSI("Linux") went away, some BIOS write    152 Since _OSI("Linux") went away, some BIOS writers used _REV
150 to support Linux and Windows differences in th    153 to support Linux and Windows differences in the same BIOS.
151                                                   154 
152 _REV was defined in ACPI 1.0 to return the ver    155 _REV was defined in ACPI 1.0 to return the version of ACPI
153 supported by the OS and the OS AML interpreter    156 supported by the OS and the OS AML interpreter.
154                                                   157 
155 Modern Windows returns _REV = 2.  Linux used A    158 Modern Windows returns _REV = 2.  Linux used ACPI_CA_SUPPORT_LEVEL,
156 which would increment, based on the version of    159 which would increment, based on the version of the spec supported.
157                                                   160 
158 Unfortunately, _REV was also misused.  eg. som    161 Unfortunately, _REV was also misused.  eg. some BIOS would check
159 for _REV = 3, and do something for Linux, but     162 for _REV = 3, and do something for Linux, but when Linux returned
160 _REV = 4, that support broke.                     163 _REV = 4, that support broke.
161                                                   164 
162 In response to this problem, Linux returns _RE    165 In response to this problem, Linux returns _REV = 2 always,
163 from mid-2015 onward.  The ACPI specification     166 from mid-2015 onward.  The ACPI specification will also be updated
164 to reflect that _REV is deprecated, and always    167 to reflect that _REV is deprecated, and always returns 2.
165                                                   168 
166 Apple Mac and _OSI("Darwin")                      169 Apple Mac and _OSI("Darwin")
167 ============================                      170 ============================
168                                                   171 
169 On Apple's Mac platforms, the ACPI BIOS invoke    172 On Apple's Mac platforms, the ACPI BIOS invokes _OSI("Darwin")
170 to determine if the machine is running Apple O    173 to determine if the machine is running Apple OSX.
171                                                   174 
172 Like Linux's _OSI("*Windows*") strategy, Linux    175 Like Linux's _OSI("*Windows*") strategy, Linux defaults to
173 answering YES to _OSI("Darwin") to enable full    176 answering YES to _OSI("Darwin") to enable full access
174 to the hardware and validated BIOS paths seen     177 to the hardware and validated BIOS paths seen by OSX.
175 Just like on Windows-tested platforms, this st    178 Just like on Windows-tested platforms, this strategy has risks.
176                                                   179 
177 Starting in Linux-3.18, the kernel answered YE    180 Starting in Linux-3.18, the kernel answered YES to _OSI("Darwin")
178 for the purpose of enabling Mac Thunderbolt su    181 for the purpose of enabling Mac Thunderbolt support.  Further,
179 if the kernel noticed _OSI("Darwin") being inv    182 if the kernel noticed _OSI("Darwin") being invoked, it additionally
180 disabled all _OSI("*Windows*") to keep poorly     183 disabled all _OSI("*Windows*") to keep poorly written Mac BIOS
181 from going down untested combinations of paths    184 from going down untested combinations of paths.
182                                                   185 
183 The Linux-3.18 change in default caused power     186 The Linux-3.18 change in default caused power regressions on Mac
184 laptops, and the 3.18 implementation did not a    187 laptops, and the 3.18 implementation did not allow changing
185 the default via cmdline "acpi_osi=!Darwin".  L    188 the default via cmdline "acpi_osi=!Darwin".  Linux-4.7 fixed
186 the ability to use acpi_osi=!Darwin as a worka    189 the ability to use acpi_osi=!Darwin as a workaround, and
187 we hope to see Mac Thunderbolt power managemen    190 we hope to see Mac Thunderbolt power management support in Linux-4.11.
                                                      

~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

kernel.org | git.kernel.org | LWN.net | Project Home | SVN repository | Mail admin

Linux® is a registered trademark of Linus Torvalds in the United States and other countries.
TOMOYO® is a registered trademark of NTT DATA CORPORATION.

sflogo.php