* [PATCH] Allow acpi_osi="Winows XY" overrides
@ 2006-08-15 9:04 Thomas Renninger
2006-09-26 7:36 ` Len Brown
0 siblings, 1 reply; 2+ messages in thread
From: Thomas Renninger @ 2006-08-15 9:04 UTC (permalink / raw)
To: linux-acpi; +Cc: Brown, Len, Moore, Robert
[-- Attachment #1: Type: text/plain, Size: 6099 bytes --]
This is an ASL example from a HP nx9420.
The first part tries to evaluate the OS with the old
\_OS method (you can already fake the OS with acpi_os_name="Microsoft
Windows"). The second part makes use of the new _OSI function.
Overriding the _OSI provided string by OS was not yet implemented, that
is what the patch does.
For this BIOS it already was possible to fake the OS string for
"Microsoft Windows", "Microsoft WindowsME: Millennium Edition",
"Microsoft Windows NT" by e.g.:
acpi_osi="" acpi_os_name="Microsoft Windows"
now you also can (currently it would use "Windows 2001 SP2") also fake
e.g.:
acpi_osi="Windows 2006" (acpi_os_name="" -> not explicitly needed
here, maybe on other AML implementations)
------------------------------------------------------------
Name (C015, Package (0x03)
{
"Microsoft Windows",
"Microsoft WindowsME: Millennium Edition",
"Microsoft Windows NT"
})
...
Store (\_OS, Local0)
Store (SizeOf (C015), Local7)
Store (0x00, Local1)
While (LAnd (LLess (Local1, Local7), LEqual (C014, 0xFFFFFFFD)))
{
Store (\C011 (Local0, DerefOf (Index (C015, Local1))), Local2)
If (Local2)
{
Add (Local1, 0x01, C014)
}
Else
{
Increment (Local1)
}
}
If (LEqual (C014, 0xFFFFFFFD))
{
Store (0x00, C014)
}
If (LOr (LEqual (C014, 0x00), LEqual (C014, 0x03)))
{
If (CondRefOf (\_OSI, Local0))
{
If (\_OSI ("Windows 2001"))
{
Store (0x04, C014)
}
If (\_OSI ("Windows 2001 SP1"))
{
Store (0x04, C014)
}
If (\_OSI ("Windows 2001 SP2"))
{
Store (0x05, C014)
}
If (\_OSI ("Windows 2006"))
{
Store (0x06, C014)
}
}
}
------------------------------------------------------------
The patch is based on a SUSE 2.6.16.21 kernel. There shouldn't have
changed that much. It needs manual modifications as it touches ACPICA
code anyway.
Allow acpi_osi="Winows XY" overrides
Nearly all BIOSes have special code paths for special Windows
OS verions. This patch tells ACPI BIOS parts which OS it should
assume and might workaround BIOS issues.
Signed-off-by: Thomas Renninger <mail@renninger.de>
drivers/acpi/osl.c | 19 +++++++++++++------
drivers/acpi/utilities/uteval.c | 22 +++++++++++++++-------
include/acpi/acglobal.h | 3 +++
3 files changed, 31 insertions(+), 13 deletions(-)
Index: linux-2.6.16-SLES10_GA_BRANCH/drivers/acpi/osl.c
===================================================================
--- linux-2.6.16-SLES10_GA_BRANCH.orig/drivers/acpi/osl.c
+++ linux-2.6.16-SLES10_GA_BRANCH/drivers/acpi/osl.c
@@ -228,8 +228,6 @@ acpi_os_get_physical_address(void *virt,
}
#endif
-#define ACPI_MAX_OVERRIDE_LEN 100
-
static char acpi_os_name[ACPI_MAX_OVERRIDE_LEN];
acpi_status
@@ -1067,17 +1065,26 @@ __setup("acpi_os_name=", acpi_os_name_se
/*
* _OSI control
* empty string disables _OSI
- * TBD additional string adds to _OSI
*/
+char acpi_osi_override[ACPI_MAX_OVERRIDE_LEN] = "\0";
+
static int __init acpi_osi_setup(char *str)
{
+ int len;
+
if (str == NULL || *str == '\0') {
printk(KERN_INFO PREFIX "_OSI method disabled\n");
acpi_gbl_create_osi_method = FALSE;
} else {
- /* TBD */
- printk(KERN_ERR PREFIX "_OSI additional string ignored -- %s\n",
- str);
+ len = strlen(str);
+ if(len > ACPI_MAX_OVERRIDE_LEN)
+ printk(KERN_ERR PREFIX "acpi_osi_name too long"
+ "(%d, max: %d)\n", len, ACPI_MAX_OVERRIDE_LEN);
+ else{
+ strcpy(acpi_osi_override, str);
+ printk(KERN_INFO PREFIX "_OSI string set to: %s\n",
+ acpi_osi_override);
+ }
}
return 1;
Index: linux-2.6.16-SLES10_GA_BRANCH/drivers/acpi/utilities/uteval.c
===================================================================
--- linux-2.6.16-SLES10_GA_BRANCH.orig/drivers/acpi/utilities/uteval.c
+++ linux-2.6.16-SLES10_GA_BRANCH/drivers/acpi/utilities/uteval.c
@@ -93,17 +93,25 @@ acpi_status acpi_ut_osi_implementation(s
/* Compare input string to table of supported strings */
- for (i = 0; i < ACPI_NUM_OSI_STRINGS; i++) {
- if (!ACPI_STRCMP(string_desc->string.pointer,
- ACPI_CAST_PTR(char,
+ if (acpi_osi_override[0] == '\0'){
+ for (i = 0; i < ACPI_NUM_OSI_STRINGS; i++) {
+ if (!ACPI_STRCMP(string_desc->string.pointer,
+ ACPI_CAST_PTR(char,
acpi_gbl_valid_osi_strings[i])))
- {
- /* This string is supported */
+ {
+ /* This string is supported */
- return_desc->integer.value = 0xFFFFFFFF;
- break;
+ return_desc->integer.value = 0xFFFFFFFF;
+ break;
+ }
}
}
+ else{
+ if (!ACPI_STRCMP(string_desc->string.pointer,
+ acpi_osi_override))
+ /* This string is supported */
+ return_desc->integer.value = 0xFFFFFFFF;
+ }
walk_state->return_desc = return_desc;
return_ACPI_STATUS(AE_CTRL_TERMINATE);
Index: linux-2.6.16-SLES10_GA_BRANCH/include/acpi/acglobal.h
===================================================================
--- linux-2.6.16-SLES10_GA_BRANCH.orig/include/acpi/acglobal.h
+++ linux-2.6.16-SLES10_GA_BRANCH/include/acpi/acglobal.h
@@ -246,6 +246,9 @@ extern const struct acpi_opcode_info acp
extern const char *acpi_gbl_region_types[ACPI_NUM_PREDEFINED_REGIONS];
extern const char *acpi_gbl_valid_osi_strings[ACPI_NUM_OSI_STRINGS];
+#define ACPI_MAX_OVERRIDE_LEN 100
+extern char acpi_osi_override[ACPI_MAX_OVERRIDE_LEN];
+
/*****************************************************************************
*
* Namespace globals
[-- Attachment #2: acpi_osi_override.patch --]
[-- Type: text/x-patch, Size: 3576 bytes --]
Allow acpi_osi="Winows XY" overrides
Nearly all BIOSes have special code paths for special Windows
OS verions. This patch tells ACPI BIOS parts which OS it should
assume and might workaround BIOS issues.
Signed-off-by: Thomas Renninger <mail@renninger.de>
drivers/acpi/osl.c | 19 +++++++++++++------
drivers/acpi/utilities/uteval.c | 22 +++++++++++++++-------
include/acpi/acglobal.h | 3 +++
3 files changed, 31 insertions(+), 13 deletions(-)
Index: linux-2.6.16-SLES10_GA_BRANCH/drivers/acpi/osl.c
===================================================================
--- linux-2.6.16-SLES10_GA_BRANCH.orig/drivers/acpi/osl.c
+++ linux-2.6.16-SLES10_GA_BRANCH/drivers/acpi/osl.c
@@ -228,8 +228,6 @@ acpi_os_get_physical_address(void *virt,
}
#endif
-#define ACPI_MAX_OVERRIDE_LEN 100
-
static char acpi_os_name[ACPI_MAX_OVERRIDE_LEN];
acpi_status
@@ -1067,17 +1065,26 @@ __setup("acpi_os_name=", acpi_os_name_se
/*
* _OSI control
* empty string disables _OSI
- * TBD additional string adds to _OSI
*/
+char acpi_osi_override[ACPI_MAX_OVERRIDE_LEN] = "\0";
+
static int __init acpi_osi_setup(char *str)
{
+ int len;
+
if (str == NULL || *str == '\0') {
printk(KERN_INFO PREFIX "_OSI method disabled\n");
acpi_gbl_create_osi_method = FALSE;
} else {
- /* TBD */
- printk(KERN_ERR PREFIX "_OSI additional string ignored -- %s\n",
- str);
+ len = strlen(str);
+ if(len > ACPI_MAX_OVERRIDE_LEN)
+ printk(KERN_ERR PREFIX "acpi_osi_name too long"
+ "(%d, max: %d)\n", len, ACPI_MAX_OVERRIDE_LEN);
+ else{
+ strcpy(acpi_osi_override, str);
+ printk(KERN_INFO PREFIX "_OSI string set to: %s\n",
+ acpi_osi_override);
+ }
}
return 1;
Index: linux-2.6.16-SLES10_GA_BRANCH/drivers/acpi/utilities/uteval.c
===================================================================
--- linux-2.6.16-SLES10_GA_BRANCH.orig/drivers/acpi/utilities/uteval.c
+++ linux-2.6.16-SLES10_GA_BRANCH/drivers/acpi/utilities/uteval.c
@@ -93,17 +93,25 @@ acpi_status acpi_ut_osi_implementation(s
/* Compare input string to table of supported strings */
- for (i = 0; i < ACPI_NUM_OSI_STRINGS; i++) {
- if (!ACPI_STRCMP(string_desc->string.pointer,
- ACPI_CAST_PTR(char,
+ if (acpi_osi_override[0] == '\0'){
+ for (i = 0; i < ACPI_NUM_OSI_STRINGS; i++) {
+ if (!ACPI_STRCMP(string_desc->string.pointer,
+ ACPI_CAST_PTR(char,
acpi_gbl_valid_osi_strings[i])))
- {
- /* This string is supported */
+ {
+ /* This string is supported */
- return_desc->integer.value = 0xFFFFFFFF;
- break;
+ return_desc->integer.value = 0xFFFFFFFF;
+ break;
+ }
}
}
+ else{
+ if (!ACPI_STRCMP(string_desc->string.pointer,
+ acpi_osi_override))
+ /* This string is supported */
+ return_desc->integer.value = 0xFFFFFFFF;
+ }
walk_state->return_desc = return_desc;
return_ACPI_STATUS(AE_CTRL_TERMINATE);
Index: linux-2.6.16-SLES10_GA_BRANCH/include/acpi/acglobal.h
===================================================================
--- linux-2.6.16-SLES10_GA_BRANCH.orig/include/acpi/acglobal.h
+++ linux-2.6.16-SLES10_GA_BRANCH/include/acpi/acglobal.h
@@ -246,6 +246,9 @@ extern const struct acpi_opcode_info acp
extern const char *acpi_gbl_region_types[ACPI_NUM_PREDEFINED_REGIONS];
extern const char *acpi_gbl_valid_osi_strings[ACPI_NUM_OSI_STRINGS];
+#define ACPI_MAX_OVERRIDE_LEN 100
+extern char acpi_osi_override[ACPI_MAX_OVERRIDE_LEN];
+
/*****************************************************************************
*
* Namespace globals
^ permalink raw reply [flat|nested] 2+ messages in thread
* Re: [PATCH] Allow acpi_osi="Winows XY" overrides
2006-08-15 9:04 [PATCH] Allow acpi_osi="Winows XY" overrides Thomas Renninger
@ 2006-09-26 7:36 ` Len Brown
0 siblings, 0 replies; 2+ messages in thread
From: Len Brown @ 2006-09-26 7:36 UTC (permalink / raw)
To: trenn; +Cc: linux-acpi, Moore, Robert
Just to update the list on a conversation between Thomas and Bob....
I'm not going to apply this patch.
_OSI doesn't identify the OS that is running, it identifies the interfaces that the running
OS is compatible with -- and there can be a whole list of them.
Linux's ambition is to answer YES to this whenever the BIOS asks.
Today "acpi_osi=" disables _OSI support, but "acpi_osi=string" does
not augment the _OSI table as it should, and this patch doesn't make it do that.
In practice, I don't recall anybody needing acpi_osi= to augment the list,
as we've been quite prompt in simply updating acpi_interfaces_supported[].
However, if somebody wants to replace this patch with one that
effectively augments, rather than replaces acpi_interfaces_supported[],
somebody someday might find it useful when their old Linux binary
happens to support an interface that it doesn't know about yet.
thanks,
-Len
On Tuesday 15 August 2006 05:04, Thomas Renninger wrote:
> This is an ASL example from a HP nx9420.
> The first part tries to evaluate the OS with the old
> \_OS method (you can already fake the OS with acpi_os_name="Microsoft
> Windows"). The second part makes use of the new _OSI function.
> Overriding the _OSI provided string by OS was not yet implemented, that
> is what the patch does.
>
> For this BIOS it already was possible to fake the OS string for
> "Microsoft Windows", "Microsoft WindowsME: Millennium Edition",
> "Microsoft Windows NT" by e.g.:
> acpi_osi="" acpi_os_name="Microsoft Windows"
>
> now you also can (currently it would use "Windows 2001 SP2") also fake
> e.g.:
> acpi_osi="Windows 2006" (acpi_os_name="" -> not explicitly needed
> here, maybe on other AML implementations)
>
>
> ------------------------------------------------------------
> Name (C015, Package (0x03)
> {
> "Microsoft Windows",
> "Microsoft WindowsME: Millennium Edition",
> "Microsoft Windows NT"
> })
> ...
>
> Store (\_OS, Local0)
> Store (SizeOf (C015), Local7)
> Store (0x00, Local1)
> While (LAnd (LLess (Local1, Local7), LEqual (C014, 0xFFFFFFFD)))
> {
> Store (\C011 (Local0, DerefOf (Index (C015, Local1))), Local2)
> If (Local2)
> {
> Add (Local1, 0x01, C014)
> }
> Else
> {
> Increment (Local1)
> }
> }
>
> If (LEqual (C014, 0xFFFFFFFD))
> {
> Store (0x00, C014)
> }
>
> If (LOr (LEqual (C014, 0x00), LEqual (C014, 0x03)))
> {
> If (CondRefOf (\_OSI, Local0))
> {
> If (\_OSI ("Windows 2001"))
> {
> Store (0x04, C014)
> }
>
> If (\_OSI ("Windows 2001 SP1"))
> {
> Store (0x04, C014)
> }
>
> If (\_OSI ("Windows 2001 SP2"))
> {
> Store (0x05, C014)
> }
>
> If (\_OSI ("Windows 2006"))
> {
> Store (0x06, C014)
> }
> }
> }
> ------------------------------------------------------------
>
> The patch is based on a SUSE 2.6.16.21 kernel. There shouldn't have
> changed that much. It needs manual modifications as it touches ACPICA
> code anyway.
>
>
>
> Allow acpi_osi="Winows XY" overrides
>
> Nearly all BIOSes have special code paths for special Windows
> OS verions. This patch tells ACPI BIOS parts which OS it should
> assume and might workaround BIOS issues.
>
> Signed-off-by: Thomas Renninger <mail@renninger.de>
>
>
> drivers/acpi/osl.c | 19 +++++++++++++------
> drivers/acpi/utilities/uteval.c | 22 +++++++++++++++-------
> include/acpi/acglobal.h | 3 +++
> 3 files changed, 31 insertions(+), 13 deletions(-)
>
> Index: linux-2.6.16-SLES10_GA_BRANCH/drivers/acpi/osl.c
> ===================================================================
> --- linux-2.6.16-SLES10_GA_BRANCH.orig/drivers/acpi/osl.c
> +++ linux-2.6.16-SLES10_GA_BRANCH/drivers/acpi/osl.c
> @@ -228,8 +228,6 @@ acpi_os_get_physical_address(void *virt,
> }
> #endif
>
> -#define ACPI_MAX_OVERRIDE_LEN 100
> -
> static char acpi_os_name[ACPI_MAX_OVERRIDE_LEN];
>
> acpi_status
> @@ -1067,17 +1065,26 @@ __setup("acpi_os_name=", acpi_os_name_se
> /*
> * _OSI control
> * empty string disables _OSI
> - * TBD additional string adds to _OSI
> */
> +char acpi_osi_override[ACPI_MAX_OVERRIDE_LEN] = "\0";
> +
> static int __init acpi_osi_setup(char *str)
> {
> + int len;
> +
> if (str == NULL || *str == '\0') {
> printk(KERN_INFO PREFIX "_OSI method disabled\n");
> acpi_gbl_create_osi_method = FALSE;
> } else {
> - /* TBD */
> - printk(KERN_ERR PREFIX "_OSI additional string ignored -- %s\n",
> - str);
> + len = strlen(str);
> + if(len > ACPI_MAX_OVERRIDE_LEN)
> + printk(KERN_ERR PREFIX "acpi_osi_name too long"
> + "(%d, max: %d)\n", len, ACPI_MAX_OVERRIDE_LEN);
> + else{
> + strcpy(acpi_osi_override, str);
> + printk(KERN_INFO PREFIX "_OSI string set to: %s\n",
> + acpi_osi_override);
> + }
> }
>
> return 1;
> Index: linux-2.6.16-SLES10_GA_BRANCH/drivers/acpi/utilities/uteval.c
> ===================================================================
> --- linux-2.6.16-SLES10_GA_BRANCH.orig/drivers/acpi/utilities/uteval.c
> +++ linux-2.6.16-SLES10_GA_BRANCH/drivers/acpi/utilities/uteval.c
> @@ -93,17 +93,25 @@ acpi_status acpi_ut_osi_implementation(s
>
> /* Compare input string to table of supported strings */
>
> - for (i = 0; i < ACPI_NUM_OSI_STRINGS; i++) {
> - if (!ACPI_STRCMP(string_desc->string.pointer,
> - ACPI_CAST_PTR(char,
> + if (acpi_osi_override[0] == '\0'){
> + for (i = 0; i < ACPI_NUM_OSI_STRINGS; i++) {
> + if (!ACPI_STRCMP(string_desc->string.pointer,
> + ACPI_CAST_PTR(char,
> acpi_gbl_valid_osi_strings[i])))
> - {
> - /* This string is supported */
> + {
> + /* This string is supported */
>
> - return_desc->integer.value = 0xFFFFFFFF;
> - break;
> + return_desc->integer.value = 0xFFFFFFFF;
> + break;
> + }
> }
> }
> + else{
> + if (!ACPI_STRCMP(string_desc->string.pointer,
> + acpi_osi_override))
> + /* This string is supported */
> + return_desc->integer.value = 0xFFFFFFFF;
> + }
>
> walk_state->return_desc = return_desc;
> return_ACPI_STATUS(AE_CTRL_TERMINATE);
> Index: linux-2.6.16-SLES10_GA_BRANCH/include/acpi/acglobal.h
> ===================================================================
> --- linux-2.6.16-SLES10_GA_BRANCH.orig/include/acpi/acglobal.h
> +++ linux-2.6.16-SLES10_GA_BRANCH/include/acpi/acglobal.h
> @@ -246,6 +246,9 @@ extern const struct acpi_opcode_info acp
> extern const char *acpi_gbl_region_types[ACPI_NUM_PREDEFINED_REGIONS];
> extern const char *acpi_gbl_valid_osi_strings[ACPI_NUM_OSI_STRINGS];
>
> +#define ACPI_MAX_OVERRIDE_LEN 100
> +extern char acpi_osi_override[ACPI_MAX_OVERRIDE_LEN];
> +
> /*****************************************************************************
> *
> * Namespace globals
>
>
^ permalink raw reply [flat|nested] 2+ messages in thread
end of thread, other threads:[~2006-09-26 7:34 UTC | newest]
Thread overview: 2+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2006-08-15 9:04 [PATCH] Allow acpi_osi="Winows XY" overrides Thomas Renninger
2006-09-26 7:36 ` Len Brown
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).