|
@@ -56,10 +56,6 @@ struct acpi_os_dpc {
|
|
struct work_struct work;
|
|
struct work_struct work;
|
|
};
|
|
};
|
|
|
|
|
|
-#ifdef CONFIG_ACPI_CUSTOM_DSDT
|
|
|
|
-#include CONFIG_ACPI_CUSTOM_DSDT_FILE
|
|
|
|
-#endif
|
|
|
|
-
|
|
|
|
#ifdef ENABLE_DEBUGGER
|
|
#ifdef ENABLE_DEBUGGER
|
|
#include <linux/kdb.h>
|
|
#include <linux/kdb.h>
|
|
|
|
|
|
@@ -96,72 +92,6 @@ struct acpi_ioremap {
|
|
static LIST_HEAD(acpi_ioremaps);
|
|
static LIST_HEAD(acpi_ioremaps);
|
|
static DEFINE_MUTEX(acpi_ioremap_lock);
|
|
static DEFINE_MUTEX(acpi_ioremap_lock);
|
|
|
|
|
|
-static void __init acpi_osi_setup_late(void);
|
|
|
|
-
|
|
|
|
-/*
|
|
|
|
- * 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"
|
|
|
|
- */
|
|
|
|
-
|
|
|
|
-static struct osi_linux {
|
|
|
|
- unsigned int enable:1;
|
|
|
|
- unsigned int dmi:1;
|
|
|
|
- unsigned int cmdline:1;
|
|
|
|
- unsigned int default_disabling:1;
|
|
|
|
-} osi_linux = {0, 0, 0, 0};
|
|
|
|
-
|
|
|
|
-static u32 acpi_osi_handler(acpi_string interface, u32 supported)
|
|
|
|
-{
|
|
|
|
- if (!strcmp("Linux", interface)) {
|
|
|
|
-
|
|
|
|
- printk_once(KERN_NOTICE FW_BUG PREFIX
|
|
|
|
- "BIOS _OSI(Linux) query %s%s\n",
|
|
|
|
- osi_linux.enable ? "honored" : "ignored",
|
|
|
|
- osi_linux.cmdline ? " via cmdline" :
|
|
|
|
- osi_linux.dmi ? " via DMI" : "");
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- if (!strcmp("Darwin", interface)) {
|
|
|
|
- /*
|
|
|
|
- * Apple firmware will behave poorly if it receives positive
|
|
|
|
- * answers to "Darwin" and any other OS. Respond positively
|
|
|
|
- * to Darwin and then disable all other vendor strings.
|
|
|
|
- */
|
|
|
|
- acpi_update_interfaces(ACPI_DISABLE_ALL_VENDOR_STRINGS);
|
|
|
|
- supported = ACPI_UINT32_MAX;
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- return supported;
|
|
|
|
-}
|
|
|
|
-
|
|
|
|
static void __init acpi_request_region (struct acpi_generic_address *gas,
|
|
static void __init acpi_request_region (struct acpi_generic_address *gas,
|
|
unsigned int length, char *desc)
|
|
unsigned int length, char *desc)
|
|
{
|
|
{
|
|
@@ -602,280 +532,6 @@ acpi_os_predefined_override(const struct acpi_predefined_names *init_val,
|
|
return AE_OK;
|
|
return AE_OK;
|
|
}
|
|
}
|
|
|
|
|
|
-static void acpi_table_taint(struct acpi_table_header *table)
|
|
|
|
-{
|
|
|
|
- pr_warn(PREFIX
|
|
|
|
- "Override [%4.4s-%8.8s], this is unsafe: tainting kernel\n",
|
|
|
|
- table->signature, table->oem_table_id);
|
|
|
|
- add_taint(TAINT_OVERRIDDEN_ACPI_TABLE, LOCKDEP_NOW_UNRELIABLE);
|
|
|
|
-}
|
|
|
|
-
|
|
|
|
-#ifdef CONFIG_ACPI_INITRD_TABLE_OVERRIDE
|
|
|
|
-#include <linux/earlycpio.h>
|
|
|
|
-#include <linux/memblock.h>
|
|
|
|
-
|
|
|
|
-static u64 acpi_tables_addr;
|
|
|
|
-static int all_tables_size;
|
|
|
|
-
|
|
|
|
-/* Copied from acpica/tbutils.c:acpi_tb_checksum() */
|
|
|
|
-static u8 __init acpi_table_checksum(u8 *buffer, u32 length)
|
|
|
|
-{
|
|
|
|
- u8 sum = 0;
|
|
|
|
- u8 *end = buffer + length;
|
|
|
|
-
|
|
|
|
- while (buffer < end)
|
|
|
|
- sum = (u8) (sum + *(buffer++));
|
|
|
|
- return sum;
|
|
|
|
-}
|
|
|
|
-
|
|
|
|
-/* All but ACPI_SIG_RSDP and ACPI_SIG_FACS: */
|
|
|
|
-static const char * const table_sigs[] = {
|
|
|
|
- ACPI_SIG_BERT, ACPI_SIG_CPEP, ACPI_SIG_ECDT, ACPI_SIG_EINJ,
|
|
|
|
- ACPI_SIG_ERST, ACPI_SIG_HEST, ACPI_SIG_MADT, ACPI_SIG_MSCT,
|
|
|
|
- ACPI_SIG_SBST, ACPI_SIG_SLIT, ACPI_SIG_SRAT, ACPI_SIG_ASF,
|
|
|
|
- ACPI_SIG_BOOT, ACPI_SIG_DBGP, ACPI_SIG_DMAR, ACPI_SIG_HPET,
|
|
|
|
- ACPI_SIG_IBFT, ACPI_SIG_IVRS, ACPI_SIG_MCFG, ACPI_SIG_MCHI,
|
|
|
|
- ACPI_SIG_SLIC, ACPI_SIG_SPCR, ACPI_SIG_SPMI, ACPI_SIG_TCPA,
|
|
|
|
- ACPI_SIG_UEFI, ACPI_SIG_WAET, ACPI_SIG_WDAT, ACPI_SIG_WDDT,
|
|
|
|
- ACPI_SIG_WDRT, ACPI_SIG_DSDT, ACPI_SIG_FADT, ACPI_SIG_PSDT,
|
|
|
|
- ACPI_SIG_RSDT, ACPI_SIG_XSDT, ACPI_SIG_SSDT, NULL };
|
|
|
|
-
|
|
|
|
-#define ACPI_HEADER_SIZE sizeof(struct acpi_table_header)
|
|
|
|
-
|
|
|
|
-#define ACPI_OVERRIDE_TABLES 64
|
|
|
|
-static struct cpio_data __initdata acpi_initrd_files[ACPI_OVERRIDE_TABLES];
|
|
|
|
-static DECLARE_BITMAP(acpi_initrd_installed, ACPI_OVERRIDE_TABLES);
|
|
|
|
-
|
|
|
|
-#define MAP_CHUNK_SIZE (NR_FIX_BTMAPS << PAGE_SHIFT)
|
|
|
|
-
|
|
|
|
-void __init acpi_initrd_override(void *data, size_t size)
|
|
|
|
-{
|
|
|
|
- int sig, no, table_nr = 0, total_offset = 0;
|
|
|
|
- long offset = 0;
|
|
|
|
- struct acpi_table_header *table;
|
|
|
|
- char cpio_path[32] = "kernel/firmware/acpi/";
|
|
|
|
- struct cpio_data file;
|
|
|
|
-
|
|
|
|
- if (data == NULL || size == 0)
|
|
|
|
- return;
|
|
|
|
-
|
|
|
|
- for (no = 0; no < ACPI_OVERRIDE_TABLES; no++) {
|
|
|
|
- file = find_cpio_data(cpio_path, data, size, &offset);
|
|
|
|
- if (!file.data)
|
|
|
|
- break;
|
|
|
|
-
|
|
|
|
- data += offset;
|
|
|
|
- size -= offset;
|
|
|
|
-
|
|
|
|
- if (file.size < sizeof(struct acpi_table_header)) {
|
|
|
|
- pr_err("ACPI OVERRIDE: Table smaller than ACPI header [%s%s]\n",
|
|
|
|
- cpio_path, file.name);
|
|
|
|
- continue;
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- table = file.data;
|
|
|
|
-
|
|
|
|
- for (sig = 0; table_sigs[sig]; sig++)
|
|
|
|
- if (!memcmp(table->signature, table_sigs[sig], 4))
|
|
|
|
- break;
|
|
|
|
-
|
|
|
|
- if (!table_sigs[sig]) {
|
|
|
|
- pr_err("ACPI OVERRIDE: Unknown signature [%s%s]\n",
|
|
|
|
- cpio_path, file.name);
|
|
|
|
- continue;
|
|
|
|
- }
|
|
|
|
- if (file.size != table->length) {
|
|
|
|
- pr_err("ACPI OVERRIDE: File length does not match table length [%s%s]\n",
|
|
|
|
- cpio_path, file.name);
|
|
|
|
- continue;
|
|
|
|
- }
|
|
|
|
- if (acpi_table_checksum(file.data, table->length)) {
|
|
|
|
- pr_err("ACPI OVERRIDE: Bad table checksum [%s%s]\n",
|
|
|
|
- cpio_path, file.name);
|
|
|
|
- continue;
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- pr_info("%4.4s ACPI table found in initrd [%s%s][0x%x]\n",
|
|
|
|
- table->signature, cpio_path, file.name, table->length);
|
|
|
|
-
|
|
|
|
- all_tables_size += table->length;
|
|
|
|
- acpi_initrd_files[table_nr].data = file.data;
|
|
|
|
- acpi_initrd_files[table_nr].size = file.size;
|
|
|
|
- table_nr++;
|
|
|
|
- }
|
|
|
|
- if (table_nr == 0)
|
|
|
|
- return;
|
|
|
|
-
|
|
|
|
- acpi_tables_addr =
|
|
|
|
- memblock_find_in_range(0, max_low_pfn_mapped << PAGE_SHIFT,
|
|
|
|
- all_tables_size, PAGE_SIZE);
|
|
|
|
- if (!acpi_tables_addr) {
|
|
|
|
- WARN_ON(1);
|
|
|
|
- return;
|
|
|
|
- }
|
|
|
|
- /*
|
|
|
|
- * Only calling e820_add_reserve does not work and the
|
|
|
|
- * tables are invalid (memory got used) later.
|
|
|
|
- * memblock_reserve works as expected and the tables won't get modified.
|
|
|
|
- * But it's not enough on X86 because ioremap will
|
|
|
|
- * complain later (used by acpi_os_map_memory) that the pages
|
|
|
|
- * that should get mapped are not marked "reserved".
|
|
|
|
- * Both memblock_reserve and e820_add_region (via arch_reserve_mem_area)
|
|
|
|
- * works fine.
|
|
|
|
- */
|
|
|
|
- memblock_reserve(acpi_tables_addr, all_tables_size);
|
|
|
|
- arch_reserve_mem_area(acpi_tables_addr, all_tables_size);
|
|
|
|
-
|
|
|
|
- /*
|
|
|
|
- * early_ioremap only can remap 256k one time. If we map all
|
|
|
|
- * tables one time, we will hit the limit. Need to map chunks
|
|
|
|
- * one by one during copying the same as that in relocate_initrd().
|
|
|
|
- */
|
|
|
|
- for (no = 0; no < table_nr; no++) {
|
|
|
|
- unsigned char *src_p = acpi_initrd_files[no].data;
|
|
|
|
- phys_addr_t size = acpi_initrd_files[no].size;
|
|
|
|
- phys_addr_t dest_addr = acpi_tables_addr + total_offset;
|
|
|
|
- phys_addr_t slop, clen;
|
|
|
|
- char *dest_p;
|
|
|
|
-
|
|
|
|
- total_offset += size;
|
|
|
|
-
|
|
|
|
- while (size) {
|
|
|
|
- slop = dest_addr & ~PAGE_MASK;
|
|
|
|
- clen = size;
|
|
|
|
- if (clen > MAP_CHUNK_SIZE - slop)
|
|
|
|
- clen = MAP_CHUNK_SIZE - slop;
|
|
|
|
- dest_p = early_ioremap(dest_addr & PAGE_MASK,
|
|
|
|
- clen + slop);
|
|
|
|
- memcpy(dest_p + slop, src_p, clen);
|
|
|
|
- early_iounmap(dest_p, clen + slop);
|
|
|
|
- src_p += clen;
|
|
|
|
- dest_addr += clen;
|
|
|
|
- size -= clen;
|
|
|
|
- }
|
|
|
|
- }
|
|
|
|
-}
|
|
|
|
-
|
|
|
|
-acpi_status
|
|
|
|
-acpi_os_physical_table_override(struct acpi_table_header *existing_table,
|
|
|
|
- acpi_physical_address *address, u32 *length)
|
|
|
|
-{
|
|
|
|
- int table_offset = 0;
|
|
|
|
- int table_index = 0;
|
|
|
|
- struct acpi_table_header *table;
|
|
|
|
- u32 table_length;
|
|
|
|
-
|
|
|
|
- *length = 0;
|
|
|
|
- *address = 0;
|
|
|
|
- if (!acpi_tables_addr)
|
|
|
|
- return AE_OK;
|
|
|
|
-
|
|
|
|
- while (table_offset + ACPI_HEADER_SIZE <= all_tables_size) {
|
|
|
|
- table = acpi_os_map_memory(acpi_tables_addr + table_offset,
|
|
|
|
- ACPI_HEADER_SIZE);
|
|
|
|
- if (table_offset + table->length > all_tables_size) {
|
|
|
|
- acpi_os_unmap_memory(table, ACPI_HEADER_SIZE);
|
|
|
|
- WARN_ON(1);
|
|
|
|
- return AE_OK;
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- table_length = table->length;
|
|
|
|
-
|
|
|
|
- /* Only override tables matched */
|
|
|
|
- if (test_bit(table_index, acpi_initrd_installed) ||
|
|
|
|
- memcmp(existing_table->signature, table->signature, 4) ||
|
|
|
|
- memcmp(table->oem_table_id, existing_table->oem_table_id,
|
|
|
|
- ACPI_OEM_TABLE_ID_SIZE)) {
|
|
|
|
- acpi_os_unmap_memory(table, ACPI_HEADER_SIZE);
|
|
|
|
- goto next_table;
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- *length = table_length;
|
|
|
|
- *address = acpi_tables_addr + table_offset;
|
|
|
|
- acpi_table_taint(existing_table);
|
|
|
|
- acpi_os_unmap_memory(table, ACPI_HEADER_SIZE);
|
|
|
|
- set_bit(table_index, acpi_initrd_installed);
|
|
|
|
- break;
|
|
|
|
-
|
|
|
|
-next_table:
|
|
|
|
- table_offset += table_length;
|
|
|
|
- table_index++;
|
|
|
|
- }
|
|
|
|
- return AE_OK;
|
|
|
|
-}
|
|
|
|
-
|
|
|
|
-void __init acpi_initrd_initialize_tables(void)
|
|
|
|
-{
|
|
|
|
- int table_offset = 0;
|
|
|
|
- int table_index = 0;
|
|
|
|
- u32 table_length;
|
|
|
|
- struct acpi_table_header *table;
|
|
|
|
-
|
|
|
|
- if (!acpi_tables_addr)
|
|
|
|
- return;
|
|
|
|
-
|
|
|
|
- while (table_offset + ACPI_HEADER_SIZE <= all_tables_size) {
|
|
|
|
- table = acpi_os_map_memory(acpi_tables_addr + table_offset,
|
|
|
|
- ACPI_HEADER_SIZE);
|
|
|
|
- if (table_offset + table->length > all_tables_size) {
|
|
|
|
- acpi_os_unmap_memory(table, ACPI_HEADER_SIZE);
|
|
|
|
- WARN_ON(1);
|
|
|
|
- return;
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- table_length = table->length;
|
|
|
|
-
|
|
|
|
- /* Skip RSDT/XSDT which should only be used for override */
|
|
|
|
- if (test_bit(table_index, acpi_initrd_installed) ||
|
|
|
|
- ACPI_COMPARE_NAME(table->signature, ACPI_SIG_RSDT) ||
|
|
|
|
- ACPI_COMPARE_NAME(table->signature, ACPI_SIG_XSDT)) {
|
|
|
|
- acpi_os_unmap_memory(table, ACPI_HEADER_SIZE);
|
|
|
|
- goto next_table;
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- acpi_table_taint(table);
|
|
|
|
- acpi_os_unmap_memory(table, ACPI_HEADER_SIZE);
|
|
|
|
- acpi_install_table(acpi_tables_addr + table_offset, TRUE);
|
|
|
|
- set_bit(table_index, acpi_initrd_installed);
|
|
|
|
-next_table:
|
|
|
|
- table_offset += table_length;
|
|
|
|
- table_index++;
|
|
|
|
- }
|
|
|
|
-}
|
|
|
|
-#else
|
|
|
|
-acpi_status
|
|
|
|
-acpi_os_physical_table_override(struct acpi_table_header *existing_table,
|
|
|
|
- acpi_physical_address *address,
|
|
|
|
- u32 *table_length)
|
|
|
|
-{
|
|
|
|
- *table_length = 0;
|
|
|
|
- *address = 0;
|
|
|
|
- return AE_OK;
|
|
|
|
-}
|
|
|
|
-
|
|
|
|
-void __init acpi_initrd_initialize_tables(void)
|
|
|
|
-{
|
|
|
|
-}
|
|
|
|
-#endif /* CONFIG_ACPI_INITRD_TABLE_OVERRIDE */
|
|
|
|
-
|
|
|
|
-acpi_status
|
|
|
|
-acpi_os_table_override(struct acpi_table_header *existing_table,
|
|
|
|
- struct acpi_table_header **new_table)
|
|
|
|
-{
|
|
|
|
- if (!existing_table || !new_table)
|
|
|
|
- return AE_BAD_PARAMETER;
|
|
|
|
-
|
|
|
|
- *new_table = NULL;
|
|
|
|
-
|
|
|
|
-#ifdef CONFIG_ACPI_CUSTOM_DSDT
|
|
|
|
- if (strncmp(existing_table->signature, "DSDT", 4) == 0)
|
|
|
|
- *new_table = (struct acpi_table_header *)AmlCode;
|
|
|
|
-#endif
|
|
|
|
- if (*new_table != NULL)
|
|
|
|
- acpi_table_taint(existing_table);
|
|
|
|
- return AE_OK;
|
|
|
|
-}
|
|
|
|
-
|
|
|
|
static irqreturn_t acpi_irq(int irq, void *dev_id)
|
|
static irqreturn_t acpi_irq(int irq, void *dev_id)
|
|
{
|
|
{
|
|
u32 handled;
|
|
u32 handled;
|
|
@@ -1717,156 +1373,6 @@ static int __init acpi_os_name_setup(char *str)
|
|
|
|
|
|
__setup("acpi_os_name=", acpi_os_name_setup);
|
|
__setup("acpi_os_name=", acpi_os_name_setup);
|
|
|
|
|
|
-#define OSI_STRING_LENGTH_MAX 64 /* arbitrary */
|
|
|
|
-#define OSI_STRING_ENTRIES_MAX 16 /* arbitrary */
|
|
|
|
-
|
|
|
|
-struct osi_setup_entry {
|
|
|
|
- char string[OSI_STRING_LENGTH_MAX];
|
|
|
|
- bool enable;
|
|
|
|
-};
|
|
|
|
-
|
|
|
|
-static struct osi_setup_entry
|
|
|
|
- osi_setup_entries[OSI_STRING_ENTRIES_MAX] __initdata = {
|
|
|
|
- {"Module Device", true},
|
|
|
|
- {"Processor Device", true},
|
|
|
|
- {"3.0 _SCP Extensions", true},
|
|
|
|
- {"Processor Aggregator Device", true},
|
|
|
|
-};
|
|
|
|
-
|
|
|
|
-void __init acpi_osi_setup(char *str)
|
|
|
|
-{
|
|
|
|
- struct osi_setup_entry *osi;
|
|
|
|
- bool enable = true;
|
|
|
|
- int i;
|
|
|
|
-
|
|
|
|
- if (!acpi_gbl_create_osi_method)
|
|
|
|
- return;
|
|
|
|
-
|
|
|
|
- if (str == NULL || *str == '\0') {
|
|
|
|
- printk(KERN_INFO PREFIX "_OSI method disabled\n");
|
|
|
|
- acpi_gbl_create_osi_method = FALSE;
|
|
|
|
- return;
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- if (*str == '!') {
|
|
|
|
- str++;
|
|
|
|
- if (*str == '\0') {
|
|
|
|
- osi_linux.default_disabling = 1;
|
|
|
|
- return;
|
|
|
|
- } else if (*str == '*') {
|
|
|
|
- acpi_update_interfaces(ACPI_DISABLE_ALL_STRINGS);
|
|
|
|
- for (i = 0; i < OSI_STRING_ENTRIES_MAX; i++) {
|
|
|
|
- osi = &osi_setup_entries[i];
|
|
|
|
- osi->enable = false;
|
|
|
|
- }
|
|
|
|
- return;
|
|
|
|
- }
|
|
|
|
- enable = false;
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- for (i = 0; i < OSI_STRING_ENTRIES_MAX; i++) {
|
|
|
|
- osi = &osi_setup_entries[i];
|
|
|
|
- if (!strcmp(osi->string, str)) {
|
|
|
|
- osi->enable = enable;
|
|
|
|
- break;
|
|
|
|
- } else if (osi->string[0] == '\0') {
|
|
|
|
- osi->enable = enable;
|
|
|
|
- strncpy(osi->string, str, OSI_STRING_LENGTH_MAX);
|
|
|
|
- break;
|
|
|
|
- }
|
|
|
|
- }
|
|
|
|
-}
|
|
|
|
-
|
|
|
|
-static void __init set_osi_linux(unsigned int enable)
|
|
|
|
-{
|
|
|
|
- if (osi_linux.enable != enable)
|
|
|
|
- osi_linux.enable = enable;
|
|
|
|
-
|
|
|
|
- if (osi_linux.enable)
|
|
|
|
- acpi_osi_setup("Linux");
|
|
|
|
- else
|
|
|
|
- acpi_osi_setup("!Linux");
|
|
|
|
-
|
|
|
|
- return;
|
|
|
|
-}
|
|
|
|
-
|
|
|
|
-static void __init acpi_cmdline_osi_linux(unsigned int enable)
|
|
|
|
-{
|
|
|
|
- osi_linux.cmdline = 1; /* cmdline set the default and override DMI */
|
|
|
|
- osi_linux.dmi = 0;
|
|
|
|
- set_osi_linux(enable);
|
|
|
|
-
|
|
|
|
- return;
|
|
|
|
-}
|
|
|
|
-
|
|
|
|
-void __init acpi_dmi_osi_linux(int enable, const struct dmi_system_id *d)
|
|
|
|
-{
|
|
|
|
- printk(KERN_NOTICE PREFIX "DMI detected: %s\n", d->ident);
|
|
|
|
-
|
|
|
|
- if (enable == -1)
|
|
|
|
- return;
|
|
|
|
-
|
|
|
|
- osi_linux.dmi = 1; /* DMI knows that this box asks OSI(Linux) */
|
|
|
|
- set_osi_linux(enable);
|
|
|
|
-
|
|
|
|
- return;
|
|
|
|
-}
|
|
|
|
-
|
|
|
|
-/*
|
|
|
|
- * 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
|
|
|
|
- */
|
|
|
|
-static void __init acpi_osi_setup_late(void)
|
|
|
|
-{
|
|
|
|
- struct osi_setup_entry *osi;
|
|
|
|
- char *str;
|
|
|
|
- int i;
|
|
|
|
- acpi_status status;
|
|
|
|
-
|
|
|
|
- if (osi_linux.default_disabling) {
|
|
|
|
- status = acpi_update_interfaces(ACPI_DISABLE_ALL_VENDOR_STRINGS);
|
|
|
|
-
|
|
|
|
- if (ACPI_SUCCESS(status))
|
|
|
|
- printk(KERN_INFO PREFIX "Disabled all _OSI OS vendors\n");
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- 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))
|
|
|
|
- printk(KERN_INFO PREFIX "Added _OSI(%s)\n", str);
|
|
|
|
- } else {
|
|
|
|
- status = acpi_remove_interface(str);
|
|
|
|
-
|
|
|
|
- if (ACPI_SUCCESS(status))
|
|
|
|
- printk(KERN_INFO PREFIX "Deleted _OSI(%s)\n", str);
|
|
|
|
- }
|
|
|
|
- }
|
|
|
|
-}
|
|
|
|
-
|
|
|
|
-static int __init osi_setup(char *str)
|
|
|
|
-{
|
|
|
|
- if (str && !strcmp("Linux", str))
|
|
|
|
- acpi_cmdline_osi_linux(1);
|
|
|
|
- else if (str && !strcmp("!Linux", str))
|
|
|
|
- acpi_cmdline_osi_linux(0);
|
|
|
|
- else
|
|
|
|
- acpi_osi_setup(str);
|
|
|
|
-
|
|
|
|
- return 1;
|
|
|
|
-}
|
|
|
|
-
|
|
|
|
-__setup("acpi_osi=", osi_setup);
|
|
|
|
-
|
|
|
|
/*
|
|
/*
|
|
* Disable the auto-serialization of named objects creation methods.
|
|
* Disable the auto-serialization of named objects creation methods.
|
|
*
|
|
*
|
|
@@ -1986,12 +1492,6 @@ int acpi_resources_are_enforced(void)
|
|
}
|
|
}
|
|
EXPORT_SYMBOL(acpi_resources_are_enforced);
|
|
EXPORT_SYMBOL(acpi_resources_are_enforced);
|
|
|
|
|
|
-bool acpi_osi_is_win8(void)
|
|
|
|
-{
|
|
|
|
- return acpi_gbl_osi_data >= ACPI_OSI_WIN_8;
|
|
|
|
-}
|
|
|
|
-EXPORT_SYMBOL(acpi_osi_is_win8);
|
|
|
|
-
|
|
|
|
/*
|
|
/*
|
|
* Deallocate the memory for a spinlock.
|
|
* Deallocate the memory for a spinlock.
|
|
*/
|
|
*/
|
|
@@ -2157,8 +1657,7 @@ acpi_status __init acpi_os_initialize1(void)
|
|
BUG_ON(!kacpid_wq);
|
|
BUG_ON(!kacpid_wq);
|
|
BUG_ON(!kacpi_notify_wq);
|
|
BUG_ON(!kacpi_notify_wq);
|
|
BUG_ON(!kacpi_hotplug_wq);
|
|
BUG_ON(!kacpi_hotplug_wq);
|
|
- acpi_install_interface_handler(acpi_osi_handler);
|
|
|
|
- acpi_osi_setup_late();
|
|
|
|
|
|
+ acpi_osi_init();
|
|
return AE_OK;
|
|
return AE_OK;
|
|
}
|
|
}
|
|
|
|
|