Skip to content

Commit e5f660e

Browse files
Lv Zhengrafaeljw
authored andcommitted
ACPI / osi: Collect _OSI handling into one single file
_OSI handling code grows giant and it's time to move them into one file. This patch collects all _OSI handling code into one single file. So that we only have the following functions to be used externally: early_acpi_osi_init(): Used by DMI detections; acpi_osi_init(): Used to initialize OSI command line settings and install Linux specific _OSI handler; acpi_osi_setup(): The API that should be used by the external quirks. acpi_osi_is_win8(): The API is used by the external drivers to determine if BIOS supports Win8. CONFIG_DMI is not useful as stub dmi_check_system() can make everything stub because of strip. No functional changes. Tested-by: Lukas Wunner <[email protected]> Tested-by: Chen Yu <[email protected]> Signed-off-by: Lv Zheng <[email protected]> Signed-off-by: Rafael J. Wysocki <[email protected]>
1 parent d5a91d7 commit e5f660e

File tree

6 files changed

+531
-472
lines changed

6 files changed

+531
-472
lines changed

drivers/acpi/Makefile

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ obj-$(CONFIG_ACPI) += acpi.o \
1818
acpica/
1919

2020
# All the builtin files are in the "acpi." module_param namespace.
21-
acpi-y += osl.o utils.o reboot.o
21+
acpi-y += osi.o osl.o utils.o reboot.o
2222
acpi-y += nvs.o
2323

2424
# Power management related files

drivers/acpi/blacklist.c

Lines changed: 5 additions & 214 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
*
44
* Check to see if the given machine has a known bad ACPI BIOS
55
* or if the BIOS is too old.
6-
* Check given machine against acpi_osi_dmi_table[].
6+
* Check given machine against acpi_rev_dmi_table[].
77
*
88
* Copyright (C) 2004 Len Brown <[email protected]>
99
* Copyright (C) 2002 Andy Grover <[email protected]>
@@ -47,7 +47,7 @@ struct acpi_blacklist_item {
4747
u32 is_critical_error;
4848
};
4949

50-
static struct dmi_system_id acpi_osi_dmi_table[] __initdata;
50+
static struct dmi_system_id acpi_rev_dmi_table[] __initdata;
5151

5252
/*
5353
* POLICY: If *anything* doesn't work, put it on the blacklist.
@@ -128,41 +128,12 @@ int __init acpi_blacklisted(void)
128128
}
129129
}
130130

131-
dmi_check_system(acpi_osi_dmi_table);
131+
(void)early_acpi_osi_init();
132+
dmi_check_system(acpi_rev_dmi_table);
132133

133134
return blacklisted;
134135
}
135136
#ifdef CONFIG_DMI
136-
static int __init dmi_enable_osi_darwin(const struct dmi_system_id *d)
137-
{
138-
acpi_osi_dmi_darwin(true, d);
139-
return 0;
140-
}
141-
static int __init dmi_enable_osi_linux(const struct dmi_system_id *d)
142-
{
143-
acpi_osi_dmi_linux(true, d);
144-
return 0;
145-
}
146-
static int __init dmi_disable_osi_vista(const struct dmi_system_id *d)
147-
{
148-
pr_notice(PREFIX "DMI detected: %s\n", d->ident);
149-
acpi_osi_setup("!Windows 2006");
150-
acpi_osi_setup("!Windows 2006 SP1");
151-
acpi_osi_setup("!Windows 2006 SP2");
152-
return 0;
153-
}
154-
static int __init dmi_disable_osi_win7(const struct dmi_system_id *d)
155-
{
156-
pr_notice(PREFIX "DMI detected: %s\n", d->ident);
157-
acpi_osi_setup("!Windows 2009");
158-
return 0;
159-
}
160-
static int __init dmi_disable_osi_win8(const struct dmi_system_id *d)
161-
{
162-
pr_notice(PREFIX "DMI detected: %s\n", d->ident);
163-
acpi_osi_setup("!Windows 2012");
164-
return 0;
165-
}
166137
#ifdef CONFIG_ACPI_REV_OVERRIDE_POSSIBLE
167138
static int __init dmi_enable_rev_override(const struct dmi_system_id *d)
168139
{
@@ -173,187 +144,7 @@ static int __init dmi_enable_rev_override(const struct dmi_system_id *d)
173144
}
174145
#endif
175146

176-
static struct dmi_system_id acpi_osi_dmi_table[] __initdata = {
177-
{
178-
.callback = dmi_disable_osi_vista,
179-
.ident = "Fujitsu Siemens",
180-
.matches = {
181-
DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU SIEMENS"),
182-
DMI_MATCH(DMI_PRODUCT_NAME, "ESPRIMO Mobile V5505"),
183-
},
184-
},
185-
{
186-
/*
187-
* There have a NVIF method in MSI GX723 DSDT need call by Nvidia
188-
* driver (e.g. nouveau) when user press brightness hotkey.
189-
* Currently, nouveau driver didn't do the job and it causes there
190-
* have a infinite while loop in DSDT when user press hotkey.
191-
* We add MSI GX723's dmi information to this table for workaround
192-
* this issue.
193-
* Will remove MSI GX723 from the table after nouveau grows support.
194-
*/
195-
.callback = dmi_disable_osi_vista,
196-
.ident = "MSI GX723",
197-
.matches = {
198-
DMI_MATCH(DMI_SYS_VENDOR, "Micro-Star International"),
199-
DMI_MATCH(DMI_PRODUCT_NAME, "GX723"),
200-
},
201-
},
202-
{
203-
.callback = dmi_disable_osi_vista,
204-
.ident = "Sony VGN-NS10J_S",
205-
.matches = {
206-
DMI_MATCH(DMI_SYS_VENDOR, "Sony Corporation"),
207-
DMI_MATCH(DMI_PRODUCT_NAME, "VGN-NS10J_S"),
208-
},
209-
},
210-
{
211-
.callback = dmi_disable_osi_vista,
212-
.ident = "Sony VGN-SR290J",
213-
.matches = {
214-
DMI_MATCH(DMI_SYS_VENDOR, "Sony Corporation"),
215-
DMI_MATCH(DMI_PRODUCT_NAME, "VGN-SR290J"),
216-
},
217-
},
218-
{
219-
.callback = dmi_disable_osi_vista,
220-
.ident = "VGN-NS50B_L",
221-
.matches = {
222-
DMI_MATCH(DMI_SYS_VENDOR, "Sony Corporation"),
223-
DMI_MATCH(DMI_PRODUCT_NAME, "VGN-NS50B_L"),
224-
},
225-
},
226-
{
227-
.callback = dmi_disable_osi_vista,
228-
.ident = "VGN-SR19XN",
229-
.matches = {
230-
DMI_MATCH(DMI_SYS_VENDOR, "Sony Corporation"),
231-
DMI_MATCH(DMI_PRODUCT_NAME, "VGN-SR19XN"),
232-
},
233-
},
234-
{
235-
.callback = dmi_disable_osi_vista,
236-
.ident = "Toshiba Satellite L355",
237-
.matches = {
238-
DMI_MATCH(DMI_SYS_VENDOR, "TOSHIBA"),
239-
DMI_MATCH(DMI_PRODUCT_VERSION, "Satellite L355"),
240-
},
241-
},
242-
{
243-
.callback = dmi_disable_osi_win7,
244-
.ident = "ASUS K50IJ",
245-
.matches = {
246-
DMI_MATCH(DMI_SYS_VENDOR, "ASUSTeK Computer Inc."),
247-
DMI_MATCH(DMI_PRODUCT_NAME, "K50IJ"),
248-
},
249-
},
250-
{
251-
.callback = dmi_disable_osi_vista,
252-
.ident = "Toshiba P305D",
253-
.matches = {
254-
DMI_MATCH(DMI_SYS_VENDOR, "TOSHIBA"),
255-
DMI_MATCH(DMI_PRODUCT_NAME, "Satellite P305D"),
256-
},
257-
},
258-
{
259-
.callback = dmi_disable_osi_vista,
260-
.ident = "Toshiba NB100",
261-
.matches = {
262-
DMI_MATCH(DMI_SYS_VENDOR, "TOSHIBA"),
263-
DMI_MATCH(DMI_PRODUCT_NAME, "NB100"),
264-
},
265-
},
266-
267-
/*
268-
* The wireless hotkey does not work on those machines when
269-
* returning true for _OSI("Windows 2012")
270-
*/
271-
{
272-
.callback = dmi_disable_osi_win8,
273-
.ident = "Dell Inspiron 7737",
274-
.matches = {
275-
DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."),
276-
DMI_MATCH(DMI_PRODUCT_NAME, "Inspiron 7737"),
277-
},
278-
},
279-
{
280-
.callback = dmi_disable_osi_win8,
281-
.ident = "Dell Inspiron 7537",
282-
.matches = {
283-
DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."),
284-
DMI_MATCH(DMI_PRODUCT_NAME, "Inspiron 7537"),
285-
},
286-
},
287-
{
288-
.callback = dmi_disable_osi_win8,
289-
.ident = "Dell Inspiron 5437",
290-
.matches = {
291-
DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."),
292-
DMI_MATCH(DMI_PRODUCT_NAME, "Inspiron 5437"),
293-
},
294-
},
295-
{
296-
.callback = dmi_disable_osi_win8,
297-
.ident = "Dell Inspiron 3437",
298-
.matches = {
299-
DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."),
300-
DMI_MATCH(DMI_PRODUCT_NAME, "Inspiron 3437"),
301-
},
302-
},
303-
{
304-
.callback = dmi_disable_osi_win8,
305-
.ident = "Dell Vostro 3446",
306-
.matches = {
307-
DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."),
308-
DMI_MATCH(DMI_PRODUCT_NAME, "Vostro 3446"),
309-
},
310-
},
311-
{
312-
.callback = dmi_disable_osi_win8,
313-
.ident = "Dell Vostro 3546",
314-
.matches = {
315-
DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."),
316-
DMI_MATCH(DMI_PRODUCT_NAME, "Vostro 3546"),
317-
},
318-
},
319-
320-
/*
321-
* BIOS invocation of _OSI(Linux) is almost always a BIOS bug.
322-
* Linux ignores it, except for the machines enumerated below.
323-
*/
324-
325-
/*
326-
* Without this this EEEpc exports a non working WMI interface, with
327-
* this it exports a working "good old" eeepc_laptop interface, fixing
328-
* both brightness control, and rfkill not working.
329-
*/
330-
{
331-
.callback = dmi_enable_osi_linux,
332-
.ident = "Asus EEE PC 1015PX",
333-
.matches = {
334-
DMI_MATCH(DMI_SYS_VENDOR, "ASUSTeK Computer INC."),
335-
DMI_MATCH(DMI_PRODUCT_NAME, "1015PX"),
336-
},
337-
},
338-
339-
/*
340-
* Enable _OSI("Darwin") for all apple platforms.
341-
*/
342-
{
343-
.callback = dmi_enable_osi_darwin,
344-
.ident = "Apple hardware",
345-
.matches = {
346-
DMI_MATCH(DMI_SYS_VENDOR, "Apple Inc."),
347-
},
348-
},
349-
{
350-
.callback = dmi_enable_osi_darwin,
351-
.ident = "Apple hardware",
352-
.matches = {
353-
DMI_MATCH(DMI_SYS_VENDOR, "Apple Computer, Inc."),
354-
},
355-
},
356-
147+
static struct dmi_system_id acpi_rev_dmi_table[] __initdata = {
357148
#ifdef CONFIG_ACPI_REV_OVERRIDE_POSSIBLE
358149
/*
359150
* DELL XPS 13 (2015) switches sound between HDA and I2S

drivers/acpi/internal.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,8 @@
2020

2121
#define PREFIX "ACPI: "
2222

23+
int early_acpi_osi_init(void);
24+
int acpi_osi_init(void);
2325
void acpi_initrd_initialize_tables(void);
2426
acpi_status acpi_os_initialize1(void);
2527
void init_acpi_device_notify(void);

0 commit comments

Comments
 (0)