/* * The story of _OSI(Linux) * * From pre-history through Linux-2.6.22, Linux responded TRUE upon a BIOS * OSI(Linux) query. * * Unfortunately, reference BIOS writers got wind of this and put * OSI(Linux) in their example code, quickly exposing this string as * ill-conceived and opening the door to an un-bounded number of BIOS * incompatibilities. * * For example, OSI(Linux) was used on resume to re-POST a video card on * one system, because Linux at that time could not do a speedy restore in * its native driver. But then upon gaining quick native restore * capability, Linux has no way to tell the BIOS to skip the time-consuming * POST -- putting Linux at a permanent performance disadvantage. On * another system, the BIOS writer used OSI(Linux) to infer native OS * support for IPMI! On other systems, OSI(Linux) simply got in the way of * Linux claiming to be compatible with other operating systems, exposing * BIOS issues such as skipped device initialization. * * So "Linux" turned out to be a really poor chose of OSI string, and from * Linux-2.6.23 onward we respond FALSE. * * BIOS writers should NOT query _OSI(Linux) on future systems. Linux will * complain on the console when it sees it, and return FALSE. To get Linux * to return TRUE for your system will require a kernel source update to * add a DMI entry, or boot with "acpi_osi=Linux"
*/ staticvoid __init __acpi_osi_setup_linux(bool enable)
{
osi_config.linux_enable = !!enable; if (enable)
acpi_osi_setup("Linux"); else
acpi_osi_setup("!Linux");
}
/* * Modify the list of "OS Interfaces" reported to BIOS via _OSI * * empty string disables _OSI * string starting with '!' disables that string * otherwise string is added to list, augmenting built-in strings
*/ staticvoid __init acpi_osi_setup_late(void)
{ struct acpi_osi_entry *osi; char *str; int i;
acpi_status status;
if (osi_config.default_disabling) {
status = acpi_update_interfaces(osi_config.default_disabling); if (ACPI_SUCCESS(status))
pr_info("Disabled all _OSI OS vendors%s\n",
osi_config.default_disabling ==
ACPI_DISABLE_ALL_STRINGS ? " and feature groups" : "");
}
for (i = 0; i < OSI_STRING_ENTRIES_MAX; i++) {
osi = &osi_setup_entries[i];
str = osi->string; if (*str == '\0') break; if (osi->enable) {
status = acpi_install_interface(str); if (ACPI_SUCCESS(status))
pr_info("Added _OSI(%s)\n", str);
} else {
status = acpi_remove_interface(str); if (ACPI_SUCCESS(status))
pr_info("Deleted _OSI(%s)\n", str);
}
}
}
/* * BIOS invocation of _OSI(Linux) is almost always a BIOS bug. * Linux ignores it, except for the machines enumerated below.
*/
/* * Without this EEEpc exports a non working WMI interface, with * this it exports a working "good old" eeepc_laptop interface, * fixing both brightness control, and rfkill not working.
*/
{
.callback = dmi_enable_osi_linux,
.ident = "Asus EEE PC 1015PX",
.matches = {
DMI_MATCH(DMI_SYS_VENDOR, "ASUSTeK Computer INC."),
DMI_MATCH(DMI_PRODUCT_NAME, "1015PX"),
},
},
{}
};
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.