acpi: allow to add/remove multiple _OSI strings
PATCH 2/2 acpi: allow to add/remove multiple _OSI strings
commit b0ed7a91(ACPICA/ACPI: Add new host interfaces for _OSI suppor) introduced another regression that only one _OSI string can be added or removed.
Now multiple _OSI strings can be added or removed, for example
acpi_osi=Linux acpi_osi=FreeBSD acpi_osi="!Windows 2006"
--- drivers/acpi/osl.c | 66 +++++++++++++++++++++++++++++++++++++++------------ 1 files changed, 50 insertions(+), 16 deletions(-)
drivers/acpi/osl.c +50 -16
@@ -110,9 +110,6 @@ struct acpi_ioremap {static LIST_HEAD (acpi_ioremaps);static DEFINE_SPINLOCK (acpi_ioremap_lock); -#define OSI_STRING_LENGTH_MAX 64/* arbitrary */ -static char osi_setup_string[OSI_STRING_LENGTH_MAX ]; -static void __init acpi_osi_setup_late (void );/*
@@ -1054,16 +1051,47 @@ static int __init acpi_os_name_setup(char *str)__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 ]; +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; - }else -strncpy (osi_setup_string, str,OSI_STRING_LENGTH_MAX ); +return ; + } + +if (*str =='!' ) { + str++; + 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)
@@ -1110,22 +1138,28 @@ void __init acpi_dmi_osi_linux(int enable, const struct dmi_system_id *d)*/ static void __init acpi_osi_setup_late (void ) { -char *str = osi_setup_string; +struct osi_setup_entry *osi; +char *str; +int i;acpi_status status; -if (*str =='\0' ) -return ; +for (i =0 ; i <OSI_STRING_ENTRIES_MAX ; i++) { + osi = &osi_setup_entries[i]; + str = osi->string; -if (*str =='!' ) { - status =acpi_remove_interface (++str); +if (*str =='\0' ) +break ; +if (osi->enable) { + status =acpi_install_interface (str); -if (ACPI_SUCCESS (status)) - printk(KERN_INFO PREFIX "Deleted _OSI(%s)\n", str); - }else { - 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 "Added _OSI(%s)\n", str); +if (ACPI_SUCCESS (status)) + printk(KERN_INFO PREFIX "Deleted _OSI(%s)\n", str); + } } }
Signature · 1 line
1.5.3
A message that is not in the archive (sent off-list or not yet received): [email protected]
Quoted 39 lines · Lin Ming
---------- Forwarded message ----------
From: Lin Ming <[email protected]>
Date: Thu, Dec 9, 2010 at 4:51 PM
Subject: [PATCH 2/2] acpi: allow to add/remove multiple_OSIstrings
To: lenb <[email protected]>, Lukas Hejtmanek <[email protected]>
Cc: "Moore, Robert" <[email protected]>, linux-acpi <[email protected]>commit
b0ed7a91(ACPICA/ACPI: Add new host interfaces for _OSI suppor)introduced another regression that only one_OSIstring can be added or removed.Now multiple
_OSIstrings can be added or removed, for exampleacpi_osi=Linux acpi_osi=FreeBSD acpi_osi="!Windows 2006"
Signed-off-by Lin Ming <[email protected]>--- drivers/acpi/osl.c | 66 +++++++++++++++++++++++++++++++++++++++------------ 1 files changed, 50 insertions(+), 16 deletions(-)drivers/acpi/osl.c +0
-3@@ -110,9 +110,6 @@ struct acpi_ioremap {static LIST_HEAD (acpi_ioremaps);static DEFINE_SPINLOCK (acpi_ioremap_lock); -#define OSI_STRING_LENGTH_MAX 64/* arbitrary */ -static char osi_setup_string[OSI_STRING_LENGTH_MAX ]; -static void __init acpi_osi_setup_late (void );/* @@ -1054,16 +1051,47 @@ static int __init acpi_os_name_setup(char *str)__setup ("acpi_os_name=" , acpi_os_name_setup);
drivers/acpi/osl.c static int __init acpi_os_name_setup(char *str) · line 1062
Quoted 10 lines
drivers/acpi/osl.c +9
-0+#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 ];
Len,
A small update, mark osi_setup_entries as __initdata. Would you consider merging this for 2.6.37-rc6?
drivers/acpi/osl.c +1 -1
@@ -1059,7 +1059,7 @@ struct osi_setup_entry {bool enable; }; -static struct osi_setup_entry osi_setup_entries[OSI_STRING_ENTRIES_MAX ]; +static struct osi_setup_entry __initdata osi_setup_entries[OSI_STRING_ENTRIES_MAX ];void __init acpi_osi_setup (char *str) {
applied
thanks,
Len Brown, Intel Open Source Technology Center