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 <[EMAIL PROTECTED]>
> 
> 
>  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
> 
> 
-
To unsubscribe from this list: send the line "unsubscribe linux-acpi" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to