LCOV - code coverage report
Current view: top level - drivers/acpi/acpica - utosi.c (source / functions) Hit Total Coverage
Test: combined.info Lines: 32 112 28.6 %
Date: 2022-04-01 13:59:58 Functions: 3 7 42.9 %
Branches: 9 60 15.0 %

           Branch data     Line data    Source code
       1                 :            : // SPDX-License-Identifier: BSD-3-Clause OR GPL-2.0
       2                 :            : /******************************************************************************
       3                 :            :  *
       4                 :            :  * Module Name: utosi - Support for the _OSI predefined control method
       5                 :            :  *
       6                 :            :  * Copyright (C) 2000 - 2020, Intel Corp.
       7                 :            :  *
       8                 :            :  *****************************************************************************/
       9                 :            : 
      10                 :            : #include <acpi/acpi.h>
      11                 :            : #include "accommon.h"
      12                 :            : 
      13                 :            : #define _COMPONENT          ACPI_UTILITIES
      14                 :            : ACPI_MODULE_NAME("utosi")
      15                 :            : 
      16                 :            : /******************************************************************************
      17                 :            :  *
      18                 :            :  * ACPICA policy for new _OSI strings:
      19                 :            :  *
      20                 :            :  * It is the stated policy of ACPICA that new _OSI strings will be integrated
      21                 :            :  * into this module as soon as possible after they are defined. It is strongly
      22                 :            :  * recommended that all ACPICA hosts mirror this policy and integrate any
      23                 :            :  * changes to this module as soon as possible. There are several historical
      24                 :            :  * reasons behind this policy:
      25                 :            :  *
      26                 :            :  * 1) New BIOSs tend to test only the case where the host responds TRUE to
      27                 :            :  *    the latest version of Windows, which would respond to the latest/newest
      28                 :            :  *    _OSI string. Not responding TRUE to the latest version of Windows will
      29                 :            :  *    risk executing untested code paths throughout the DSDT and SSDTs.
      30                 :            :  *
      31                 :            :  * 2) If a new _OSI string is recognized only after a significant delay, this
      32                 :            :  *    has the potential to cause problems on existing working machines because
      33                 :            :  *    of the possibility that a new and different path through the ASL code
      34                 :            :  *    will be executed.
      35                 :            :  *
      36                 :            :  * 3) New _OSI strings are tending to come out about once per year. A delay
      37                 :            :  *    in recognizing a new string for a significant amount of time risks the
      38                 :            :  *    release of another string which only compounds the initial problem.
      39                 :            :  *
      40                 :            :  *****************************************************************************/
      41                 :            : /*
      42                 :            :  * Strings supported by the _OSI predefined control method (which is
      43                 :            :  * implemented internally within this module.)
      44                 :            :  *
      45                 :            :  * March 2009: Removed "Linux" as this host no longer wants to respond true
      46                 :            :  * for this string. Basically, the only safe OS strings are windows-related
      47                 :            :  * and in many or most cases represent the only test path within the
      48                 :            :  * BIOS-provided ASL code.
      49                 :            :  *
      50                 :            :  * The last element of each entry is used to track the newest version of
      51                 :            :  * Windows that the BIOS has requested.
      52                 :            :  */
      53                 :            : static struct acpi_interface_info acpi_default_supported_interfaces[] = {
      54                 :            :         /* Operating System Vendor Strings */
      55                 :            : 
      56                 :            :         {"Windows 2000", NULL, 0, ACPI_OSI_WIN_2000}, /* Windows 2000 */
      57                 :            :         {"Windows 2001", NULL, 0, ACPI_OSI_WIN_XP},   /* Windows XP */
      58                 :            :         {"Windows 2001 SP1", NULL, 0, ACPI_OSI_WIN_XP_SP1},   /* Windows XP SP1 */
      59                 :            :         {"Windows 2001.1", NULL, 0, ACPI_OSI_WINSRV_2003},    /* Windows Server 2003 */
      60                 :            :         {"Windows 2001 SP2", NULL, 0, ACPI_OSI_WIN_XP_SP2},   /* Windows XP SP2 */
      61                 :            :         {"Windows 2001.1 SP1", NULL, 0, ACPI_OSI_WINSRV_2003_SP1},    /* Windows Server 2003 SP1 - Added 03/2006 */
      62                 :            :         {"Windows 2006", NULL, 0, ACPI_OSI_WIN_VISTA},        /* Windows vista - Added 03/2006 */
      63                 :            :         {"Windows 2006.1", NULL, 0, ACPI_OSI_WINSRV_2008},    /* Windows Server 2008 - Added 09/2009 */
      64                 :            :         {"Windows 2006 SP1", NULL, 0, ACPI_OSI_WIN_VISTA_SP1},        /* Windows Vista SP1 - Added 09/2009 */
      65                 :            :         {"Windows 2006 SP2", NULL, 0, ACPI_OSI_WIN_VISTA_SP2},        /* Windows Vista SP2 - Added 09/2010 */
      66                 :            :         {"Windows 2009", NULL, 0, ACPI_OSI_WIN_7},    /* Windows 7 and Server 2008 R2 - Added 09/2009 */
      67                 :            :         {"Windows 2012", NULL, 0, ACPI_OSI_WIN_8},    /* Windows 8 and Server 2012 - Added 08/2012 */
      68                 :            :         {"Windows 2013", NULL, 0, ACPI_OSI_WIN_8_1},  /* Windows 8.1 and Server 2012 R2 - Added 01/2014 */
      69                 :            :         {"Windows 2015", NULL, 0, ACPI_OSI_WIN_10},   /* Windows 10 - Added 03/2015 */
      70                 :            :         {"Windows 2016", NULL, 0, ACPI_OSI_WIN_10_RS1},       /* Windows 10 version 1607 - Added 12/2017 */
      71                 :            :         {"Windows 2017", NULL, 0, ACPI_OSI_WIN_10_RS2},       /* Windows 10 version 1703 - Added 12/2017 */
      72                 :            :         {"Windows 2017.2", NULL, 0, ACPI_OSI_WIN_10_RS3},     /* Windows 10 version 1709 - Added 02/2018 */
      73                 :            :         {"Windows 2018", NULL, 0, ACPI_OSI_WIN_10_RS4},       /* Windows 10 version 1803 - Added 11/2018 */
      74                 :            :         {"Windows 2018.2", NULL, 0, ACPI_OSI_WIN_10_RS5},     /* Windows 10 version 1809 - Added 11/2018 */
      75                 :            :         {"Windows 2019", NULL, 0, ACPI_OSI_WIN_10_19H1},      /* Windows 10 version 1903 - Added 08/2019 */
      76                 :            : 
      77                 :            :         /* Feature Group Strings */
      78                 :            : 
      79                 :            :         {"Extended Address Space Descriptor", NULL, ACPI_OSI_FEATURE, 0},
      80                 :            : 
      81                 :            :         /*
      82                 :            :          * All "optional" feature group strings (features that are implemented
      83                 :            :          * by the host) should be dynamically modified to VALID by the host via
      84                 :            :          * acpi_install_interface or acpi_update_interfaces. Such optional feature
      85                 :            :          * group strings are set as INVALID by default here.
      86                 :            :          */
      87                 :            : 
      88                 :            :         {"Module Device", NULL, ACPI_OSI_OPTIONAL_FEATURE, 0},
      89                 :            :         {"Processor Device", NULL, ACPI_OSI_OPTIONAL_FEATURE, 0},
      90                 :            :         {"3.0 Thermal Model", NULL, ACPI_OSI_OPTIONAL_FEATURE, 0},
      91                 :            :         {"3.0 _SCP Extensions", NULL, ACPI_OSI_OPTIONAL_FEATURE, 0},
      92                 :            :         {"Processor Aggregator Device", NULL, ACPI_OSI_OPTIONAL_FEATURE, 0}
      93                 :            : };
      94                 :            : 
      95                 :            : /*******************************************************************************
      96                 :            :  *
      97                 :            :  * FUNCTION:    acpi_ut_initialize_interfaces
      98                 :            :  *
      99                 :            :  * PARAMETERS:  None
     100                 :            :  *
     101                 :            :  * RETURN:      Status
     102                 :            :  *
     103                 :            :  * DESCRIPTION: Initialize the global _OSI supported interfaces list
     104                 :            :  *
     105                 :            :  ******************************************************************************/
     106                 :            : 
     107                 :         78 : acpi_status acpi_ut_initialize_interfaces(void)
     108                 :            : {
     109                 :         78 :         acpi_status status;
     110                 :         78 :         u32 i;
     111                 :            : 
     112                 :         78 :         status = acpi_os_acquire_mutex(acpi_gbl_osi_mutex, ACPI_WAIT_FOREVER);
     113         [ +  - ]:         78 :         if (ACPI_FAILURE(status)) {
     114                 :            :                 return (status);
     115                 :            :         }
     116                 :            : 
     117                 :         78 :         acpi_gbl_supported_interfaces = acpi_default_supported_interfaces;
     118                 :            : 
     119                 :            :         /* Link the static list of supported interfaces */
     120                 :            : 
     121                 :         78 :         for (i = 0;
     122         [ +  + ]:       2028 :              i < (ACPI_ARRAY_LENGTH(acpi_default_supported_interfaces) - 1);
     123                 :       1950 :              i++) {
     124                 :       1950 :                 acpi_default_supported_interfaces[i].next =
     125                 :       1950 :                     &acpi_default_supported_interfaces[(acpi_size)i + 1];
     126                 :            :         }
     127                 :            : 
     128                 :         78 :         acpi_os_release_mutex(acpi_gbl_osi_mutex);
     129                 :         78 :         return (AE_OK);
     130                 :            : }
     131                 :            : 
     132                 :            : /*******************************************************************************
     133                 :            :  *
     134                 :            :  * FUNCTION:    acpi_ut_interface_terminate
     135                 :            :  *
     136                 :            :  * PARAMETERS:  None
     137                 :            :  *
     138                 :            :  * RETURN:      Status
     139                 :            :  *
     140                 :            :  * DESCRIPTION: Delete all interfaces in the global list. Sets
     141                 :            :  *              acpi_gbl_supported_interfaces to NULL.
     142                 :            :  *
     143                 :            :  ******************************************************************************/
     144                 :            : 
     145                 :          0 : acpi_status acpi_ut_interface_terminate(void)
     146                 :            : {
     147                 :          0 :         acpi_status status;
     148                 :          0 :         struct acpi_interface_info *next_interface;
     149                 :            : 
     150                 :          0 :         status = acpi_os_acquire_mutex(acpi_gbl_osi_mutex, ACPI_WAIT_FOREVER);
     151         [ #  # ]:          0 :         if (ACPI_FAILURE(status)) {
     152                 :            :                 return (status);
     153                 :            :         }
     154                 :            : 
     155                 :          0 :         next_interface = acpi_gbl_supported_interfaces;
     156         [ #  # ]:          0 :         while (next_interface) {
     157                 :          0 :                 acpi_gbl_supported_interfaces = next_interface->next;
     158                 :            : 
     159         [ #  # ]:          0 :                 if (next_interface->flags & ACPI_OSI_DYNAMIC) {
     160                 :            : 
     161                 :            :                         /* Only interfaces added at runtime can be freed */
     162                 :            : 
     163                 :          0 :                         ACPI_FREE(next_interface->name);
     164                 :          0 :                         ACPI_FREE(next_interface);
     165                 :            :                 } else {
     166                 :            :                         /* Interface is in static list. Reset it to invalid or valid. */
     167                 :            : 
     168         [ #  # ]:          0 :                         if (next_interface->flags & ACPI_OSI_DEFAULT_INVALID) {
     169                 :          0 :                                 next_interface->flags |= ACPI_OSI_INVALID;
     170                 :            :                         } else {
     171                 :          0 :                                 next_interface->flags &= ~ACPI_OSI_INVALID;
     172                 :            :                         }
     173                 :            :                 }
     174                 :            : 
     175                 :          0 :                 next_interface = acpi_gbl_supported_interfaces;
     176                 :            :         }
     177                 :            : 
     178                 :          0 :         acpi_os_release_mutex(acpi_gbl_osi_mutex);
     179                 :          0 :         return (AE_OK);
     180                 :            : }
     181                 :            : 
     182                 :            : /*******************************************************************************
     183                 :            :  *
     184                 :            :  * FUNCTION:    acpi_ut_install_interface
     185                 :            :  *
     186                 :            :  * PARAMETERS:  interface_name      - The interface to install
     187                 :            :  *
     188                 :            :  * RETURN:      Status
     189                 :            :  *
     190                 :            :  * DESCRIPTION: Install the interface into the global interface list.
     191                 :            :  *              Caller MUST hold acpi_gbl_osi_mutex
     192                 :            :  *
     193                 :            :  ******************************************************************************/
     194                 :            : 
     195                 :        234 : acpi_status acpi_ut_install_interface(acpi_string interface_name)
     196                 :            : {
     197                 :        234 :         struct acpi_interface_info *interface_info;
     198                 :            : 
     199                 :            :         /* Allocate info block and space for the name string */
     200                 :            : 
     201                 :        234 :         interface_info =
     202                 :        234 :             ACPI_ALLOCATE_ZEROED(sizeof(struct acpi_interface_info));
     203         [ +  - ]:        234 :         if (!interface_info) {
     204                 :            :                 return (AE_NO_MEMORY);
     205                 :            :         }
     206                 :            : 
     207                 :        234 :         interface_info->name = ACPI_ALLOCATE_ZEROED(strlen(interface_name) + 1);
     208         [ -  + ]:        234 :         if (!interface_info->name) {
     209                 :          0 :                 ACPI_FREE(interface_info);
     210                 :          0 :                 return (AE_NO_MEMORY);
     211                 :            :         }
     212                 :            : 
     213                 :            :         /* Initialize new info and insert at the head of the global list */
     214                 :            : 
     215                 :        234 :         strcpy(interface_info->name, interface_name);
     216                 :        234 :         interface_info->flags = ACPI_OSI_DYNAMIC;
     217                 :        234 :         interface_info->next = acpi_gbl_supported_interfaces;
     218                 :            : 
     219                 :        234 :         acpi_gbl_supported_interfaces = interface_info;
     220                 :        234 :         return (AE_OK);
     221                 :            : }
     222                 :            : 
     223                 :            : /*******************************************************************************
     224                 :            :  *
     225                 :            :  * FUNCTION:    acpi_ut_remove_interface
     226                 :            :  *
     227                 :            :  * PARAMETERS:  interface_name      - The interface to remove
     228                 :            :  *
     229                 :            :  * RETURN:      Status
     230                 :            :  *
     231                 :            :  * DESCRIPTION: Remove the interface from the global interface list.
     232                 :            :  *              Caller MUST hold acpi_gbl_osi_mutex
     233                 :            :  *
     234                 :            :  ******************************************************************************/
     235                 :            : 
     236                 :          0 : acpi_status acpi_ut_remove_interface(acpi_string interface_name)
     237                 :            : {
     238                 :          0 :         struct acpi_interface_info *previous_interface;
     239                 :          0 :         struct acpi_interface_info *next_interface;
     240                 :            : 
     241                 :          0 :         previous_interface = next_interface = acpi_gbl_supported_interfaces;
     242         [ #  # ]:          0 :         while (next_interface) {
     243         [ #  # ]:          0 :                 if (!strcmp(interface_name, next_interface->name)) {
     244                 :            :                         /*
     245                 :            :                          * Found: name is in either the static list
     246                 :            :                          * or was added at runtime
     247                 :            :                          */
     248         [ #  # ]:          0 :                         if (next_interface->flags & ACPI_OSI_DYNAMIC) {
     249                 :            : 
     250                 :            :                                 /* Interface was added dynamically, remove and free it */
     251                 :            : 
     252         [ #  # ]:          0 :                                 if (previous_interface == next_interface) {
     253                 :          0 :                                         acpi_gbl_supported_interfaces =
     254                 :          0 :                                             next_interface->next;
     255                 :            :                                 } else {
     256                 :          0 :                                         previous_interface->next =
     257                 :          0 :                                             next_interface->next;
     258                 :            :                                 }
     259                 :            : 
     260                 :          0 :                                 ACPI_FREE(next_interface->name);
     261                 :          0 :                                 ACPI_FREE(next_interface);
     262                 :            :                         } else {
     263                 :            :                                 /*
     264                 :            :                                  * Interface is in static list. If marked invalid, then
     265                 :            :                                  * it does not actually exist. Else, mark it invalid.
     266                 :            :                                  */
     267         [ #  # ]:          0 :                                 if (next_interface->flags & ACPI_OSI_INVALID) {
     268                 :            :                                         return (AE_NOT_EXIST);
     269                 :            :                                 }
     270                 :            : 
     271                 :          0 :                                 next_interface->flags |= ACPI_OSI_INVALID;
     272                 :            :                         }
     273                 :            : 
     274                 :          0 :                         return (AE_OK);
     275                 :            :                 }
     276                 :            : 
     277                 :          0 :                 previous_interface = next_interface;
     278                 :          0 :                 next_interface = next_interface->next;
     279                 :            :         }
     280                 :            : 
     281                 :            :         /* Interface was not found */
     282                 :            : 
     283                 :            :         return (AE_NOT_EXIST);
     284                 :            : }
     285                 :            : 
     286                 :            : /*******************************************************************************
     287                 :            :  *
     288                 :            :  * FUNCTION:    acpi_ut_update_interfaces
     289                 :            :  *
     290                 :            :  * PARAMETERS:  action              - Actions to be performed during the
     291                 :            :  *                                    update
     292                 :            :  *
     293                 :            :  * RETURN:      Status
     294                 :            :  *
     295                 :            :  * DESCRIPTION: Update _OSI interface strings, disabling or enabling OS vendor
     296                 :            :  *              strings or/and feature group strings.
     297                 :            :  *              Caller MUST hold acpi_gbl_osi_mutex
     298                 :            :  *
     299                 :            :  ******************************************************************************/
     300                 :            : 
     301                 :          0 : acpi_status acpi_ut_update_interfaces(u8 action)
     302                 :            : {
     303                 :          0 :         struct acpi_interface_info *next_interface;
     304                 :            : 
     305                 :          0 :         next_interface = acpi_gbl_supported_interfaces;
     306         [ #  # ]:          0 :         while (next_interface) {
     307   [ #  #  #  # ]:          0 :                 if (((next_interface->flags & ACPI_OSI_FEATURE) &&
     308         [ #  # ]:          0 :                      (action & ACPI_FEATURE_STRINGS)) ||
     309         [ #  # ]:          0 :                     (!(next_interface->flags & ACPI_OSI_FEATURE) &&
     310                 :            :                      (action & ACPI_VENDOR_STRINGS))) {
     311         [ #  # ]:          0 :                         if (action & ACPI_DISABLE_INTERFACES) {
     312                 :            : 
     313                 :            :                                 /* Mark the interfaces as invalid */
     314                 :            : 
     315                 :          0 :                                 next_interface->flags |= ACPI_OSI_INVALID;
     316                 :            :                         } else {
     317                 :            :                                 /* Mark the interfaces as valid */
     318                 :            : 
     319                 :          0 :                                 next_interface->flags &= ~ACPI_OSI_INVALID;
     320                 :            :                         }
     321                 :            :                 }
     322                 :            : 
     323                 :          0 :                 next_interface = next_interface->next;
     324                 :            :         }
     325                 :            : 
     326                 :          0 :         return (AE_OK);
     327                 :            : }
     328                 :            : 
     329                 :            : /*******************************************************************************
     330                 :            :  *
     331                 :            :  * FUNCTION:    acpi_ut_get_interface
     332                 :            :  *
     333                 :            :  * PARAMETERS:  interface_name      - The interface to find
     334                 :            :  *
     335                 :            :  * RETURN:      struct acpi_interface_info if found. NULL if not found.
     336                 :            :  *
     337                 :            :  * DESCRIPTION: Search for the specified interface name in the global list.
     338                 :            :  *              Caller MUST hold acpi_gbl_osi_mutex
     339                 :            :  *
     340                 :            :  ******************************************************************************/
     341                 :            : 
     342                 :        546 : struct acpi_interface_info *acpi_ut_get_interface(acpi_string interface_name)
     343                 :            : {
     344                 :        546 :         struct acpi_interface_info *next_interface;
     345                 :            : 
     346                 :        546 :         next_interface = acpi_gbl_supported_interfaces;
     347         [ +  + ]:      14040 :         while (next_interface) {
     348         [ +  + ]:      13806 :                 if (!strcmp(interface_name, next_interface->name)) {
     349                 :        312 :                         return (next_interface);
     350                 :            :                 }
     351                 :            : 
     352                 :      13494 :                 next_interface = next_interface->next;
     353                 :            :         }
     354                 :            : 
     355                 :            :         return (NULL);
     356                 :            : }
     357                 :            : 
     358                 :            : /*******************************************************************************
     359                 :            :  *
     360                 :            :  * FUNCTION:    acpi_ut_osi_implementation
     361                 :            :  *
     362                 :            :  * PARAMETERS:  walk_state          - Current walk state
     363                 :            :  *
     364                 :            :  * RETURN:      Status
     365                 :            :  *              Integer: TRUE (0) if input string is matched
     366                 :            :  *                       FALSE (-1) if string is not matched
     367                 :            :  *
     368                 :            :  * DESCRIPTION: Implementation of the _OSI predefined control method. When
     369                 :            :  *              an invocation of _OSI is encountered in the system AML,
     370                 :            :  *              control is transferred to this function.
     371                 :            :  *
     372                 :            :  * (August 2016)
     373                 :            :  * Note:  _OSI is now defined to return "Ones" to indicate a match, for
     374                 :            :  * compatibility with other ACPI implementations. On a 32-bit DSDT, Ones
     375                 :            :  * is 0xFFFFFFFF. On a 64-bit DSDT, Ones is 0xFFFFFFFFFFFFFFFF
     376                 :            :  * (ACPI_UINT64_MAX).
     377                 :            :  *
     378                 :            :  * This function always returns ACPI_UINT64_MAX for TRUE, and later code
     379                 :            :  * will truncate this to 32 bits if necessary.
     380                 :            :  *
     381                 :            :  ******************************************************************************/
     382                 :            : 
     383                 :          0 : acpi_status acpi_ut_osi_implementation(struct acpi_walk_state *walk_state)
     384                 :            : {
     385                 :          0 :         union acpi_operand_object *string_desc;
     386                 :          0 :         union acpi_operand_object *return_desc;
     387                 :          0 :         struct acpi_interface_info *interface_info;
     388                 :          0 :         acpi_interface_handler interface_handler;
     389                 :          0 :         acpi_status status;
     390                 :          0 :         u64 return_value;
     391                 :            : 
     392                 :          0 :         ACPI_FUNCTION_TRACE(ut_osi_implementation);
     393                 :            : 
     394                 :            :         /* Validate the string input argument (from the AML caller) */
     395                 :            : 
     396                 :          0 :         string_desc = walk_state->arguments[0].object;
     397   [ #  #  #  # ]:          0 :         if (!string_desc || (string_desc->common.type != ACPI_TYPE_STRING)) {
     398                 :            :                 return_ACPI_STATUS(AE_TYPE);
     399                 :            :         }
     400                 :            : 
     401                 :            :         /* Create a return object */
     402                 :            : 
     403                 :          0 :         return_desc = acpi_ut_create_internal_object(ACPI_TYPE_INTEGER);
     404         [ #  # ]:          0 :         if (!return_desc) {
     405                 :            :                 return_ACPI_STATUS(AE_NO_MEMORY);
     406                 :            :         }
     407                 :            : 
     408                 :            :         /* Default return value is 0, NOT SUPPORTED */
     409                 :            : 
     410                 :          0 :         return_value = 0;
     411                 :          0 :         status = acpi_os_acquire_mutex(acpi_gbl_osi_mutex, ACPI_WAIT_FOREVER);
     412         [ #  # ]:          0 :         if (ACPI_FAILURE(status)) {
     413                 :          0 :                 acpi_ut_remove_reference(return_desc);
     414                 :          0 :                 return_ACPI_STATUS(status);
     415                 :            :         }
     416                 :            : 
     417                 :            :         /* Lookup the interface in the global _OSI list */
     418                 :            : 
     419                 :          0 :         interface_info = acpi_ut_get_interface(string_desc->string.pointer);
     420   [ #  #  #  # ]:          0 :         if (interface_info && !(interface_info->flags & ACPI_OSI_INVALID)) {
     421                 :            :                 /*
     422                 :            :                  * The interface is supported.
     423                 :            :                  * Update the osi_data if necessary. We keep track of the latest
     424                 :            :                  * version of Windows that has been requested by the BIOS.
     425                 :            :                  */
     426         [ #  # ]:          0 :                 if (interface_info->value > acpi_gbl_osi_data) {
     427                 :          0 :                         acpi_gbl_osi_data = interface_info->value;
     428                 :            :                 }
     429                 :            : 
     430                 :            :                 return_value = ACPI_UINT64_MAX;
     431                 :            :         }
     432                 :            : 
     433                 :          0 :         acpi_os_release_mutex(acpi_gbl_osi_mutex);
     434                 :            : 
     435                 :            :         /*
     436                 :            :          * Invoke an optional _OSI interface handler. The host OS may wish
     437                 :            :          * to do some interface-specific handling. For example, warn about
     438                 :            :          * certain interfaces or override the true/false support value.
     439                 :            :          */
     440                 :          0 :         interface_handler = acpi_gbl_interface_handler;
     441         [ #  # ]:          0 :         if (interface_handler) {
     442         [ #  # ]:          0 :                 if (interface_handler
     443                 :            :                     (string_desc->string.pointer, (u32)return_value)) {
     444                 :          0 :                         return_value = ACPI_UINT64_MAX;
     445                 :            :                 }
     446                 :            :         }
     447                 :            : 
     448                 :            :         ACPI_DEBUG_PRINT_RAW((ACPI_DB_INFO,
     449                 :            :                               "ACPI: BIOS _OSI(\"%s\") is %ssupported\n",
     450                 :            :                               string_desc->string.pointer,
     451                 :          0 :                               return_value == 0 ? "not " : ""));
     452                 :            : 
     453                 :            :         /* Complete the return object */
     454                 :            : 
     455                 :          0 :         return_desc->integer.value = return_value;
     456                 :          0 :         walk_state->return_desc = return_desc;
     457                 :          0 :         return_ACPI_STATUS(AE_OK);
     458                 :            : }

Generated by: LCOV version 1.14