Home | History | Annotate | Line # | Download | only in acpiexec
aeinstall.c revision 1.1.1.3
      1 /******************************************************************************
      2  *
      3  * Module Name: aeinstall - Installation of operation region handlers
      4  *
      5  *****************************************************************************/
      6 
      7 /*
      8  * Copyright (C) 2000 - 2019, Intel Corp.
      9  * All rights reserved.
     10  *
     11  * Redistribution and use in source and binary forms, with or without
     12  * modification, are permitted provided that the following conditions
     13  * are met:
     14  * 1. Redistributions of source code must retain the above copyright
     15  *    notice, this list of conditions, and the following disclaimer,
     16  *    without modification.
     17  * 2. Redistributions in binary form must reproduce at minimum a disclaimer
     18  *    substantially similar to the "NO WARRANTY" disclaimer below
     19  *    ("Disclaimer") and any redistribution must be conditioned upon
     20  *    including a substantially similar Disclaimer requirement for further
     21  *    binary redistribution.
     22  * 3. Neither the names of the above-listed copyright holders nor the names
     23  *    of any contributors may be used to endorse or promote products derived
     24  *    from this software without specific prior written permission.
     25  *
     26  * Alternatively, this software may be distributed under the terms of the
     27  * GNU General Public License ("GPL") version 2 as published by the Free
     28  * Software Foundation.
     29  *
     30  * NO WARRANTY
     31  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
     32  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
     33  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR
     34  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
     35  * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
     36  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
     37  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
     38  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
     39  * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
     40  * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
     41  * POSSIBILITY OF SUCH DAMAGES.
     42  */
     43 
     44 #include "aecommon.h"
     45 
     46 #define _COMPONENT          ACPI_TOOLS
     47         ACPI_MODULE_NAME    ("aeinstall")
     48 
     49 
     50 static ACPI_STATUS
     51 AeRegionInit (
     52     ACPI_HANDLE             RegionHandle,
     53     UINT32                  Function,
     54     void                    *HandlerContext,
     55     void                    **RegionContext);
     56 
     57 static ACPI_STATUS
     58 AeInstallEcHandler (
     59     ACPI_HANDLE             ObjHandle,
     60     UINT32                  Level,
     61     void                    *Context,
     62     void                    **ReturnValue);
     63 
     64 static ACPI_STATUS
     65 AeInstallPciHandler (
     66     ACPI_HANDLE             ObjHandle,
     67     UINT32                  Level,
     68     void                    *Context,
     69     void                    **ReturnValue);
     70 
     71 
     72 BOOLEAN                     AcpiGbl_DisplayRegionAccess = FALSE;
     73 ACPI_CONNECTION_INFO        AeMyContext;
     74 
     75 
     76 /*
     77  * We will override some of the default region handlers, especially
     78  * the SystemMemory handler, which must be implemented locally.
     79  * These handlers are installed "early" - before any _REG methods
     80  * are executed - since they are special in the sense that the ACPI spec
     81  * declares that they must "always be available". Cannot override the
     82  * DataTable region handler either -- needed for test execution.
     83  *
     84  * NOTE: The local region handler will simulate access to these address
     85  * spaces by creating a memory buffer behind each operation region.
     86  */
     87 static ACPI_ADR_SPACE_TYPE  DefaultSpaceIdList[] =
     88 {
     89     ACPI_ADR_SPACE_SYSTEM_MEMORY,
     90     ACPI_ADR_SPACE_SYSTEM_IO,
     91     ACPI_ADR_SPACE_PCI_CONFIG,
     92     ACPI_ADR_SPACE_EC
     93 };
     94 
     95 /*
     96  * We will install handlers for some of the various address space IDs.
     97  * Test one user-defined address space (used by aslts).
     98  */
     99 #define ACPI_ADR_SPACE_USER_DEFINED1        0x80
    100 #define ACPI_ADR_SPACE_USER_DEFINED2        0xE4
    101 
    102 static ACPI_ADR_SPACE_TYPE  SpaceIdList[] =
    103 {
    104     ACPI_ADR_SPACE_SMBUS,
    105     ACPI_ADR_SPACE_CMOS,
    106     ACPI_ADR_SPACE_PCI_BAR_TARGET,
    107     ACPI_ADR_SPACE_IPMI,
    108     ACPI_ADR_SPACE_GPIO,
    109     ACPI_ADR_SPACE_GSBUS,
    110     ACPI_ADR_SPACE_PLATFORM_COMM,
    111     ACPI_ADR_SPACE_FIXED_HARDWARE,
    112     ACPI_ADR_SPACE_USER_DEFINED1,
    113     ACPI_ADR_SPACE_USER_DEFINED2
    114 };
    115 
    116 
    117 /******************************************************************************
    118  *
    119  * FUNCTION:    AeRegionInit
    120  *
    121  * PARAMETERS:  Region init handler
    122  *
    123  * RETURN:      Status
    124  *
    125  * DESCRIPTION: Opregion init function.
    126  *
    127  *****************************************************************************/
    128 
    129 static ACPI_STATUS
    130 AeRegionInit (
    131     ACPI_HANDLE                 RegionHandle,
    132     UINT32                      Function,
    133     void                        *HandlerContext,
    134     void                        **RegionContext)
    135 {
    136 
    137     if (Function == ACPI_REGION_DEACTIVATE)
    138     {
    139         *RegionContext = NULL;
    140     }
    141     else
    142     {
    143         *RegionContext = RegionHandle;
    144     }
    145 
    146     return (AE_OK);
    147 }
    148 
    149 
    150 /******************************************************************************
    151  *
    152  * FUNCTION:    AeOverrideRegionHandlers
    153  *
    154  * PARAMETERS:  None
    155  *
    156  * RETURN:      None
    157  *
    158  * DESCRIPTION: Override the default region handlers for memory, i/o, and
    159  *              pci_config. Also install a handler for EC. This is part of
    160  *              the "install early handlers" functionality.
    161  *
    162  *****************************************************************************/
    163 
    164 void
    165 AeOverrideRegionHandlers (
    166     void)
    167 {
    168     UINT32                  i;
    169     ACPI_STATUS             Status;
    170 
    171     /*
    172      * Install handlers that will override the default handlers for some of
    173      * the space IDs.
    174      */
    175     for (i = 0; i < ACPI_ARRAY_LENGTH (DefaultSpaceIdList); i++)
    176     {
    177         /* Install handler at the root object */
    178 
    179         Status = AcpiInstallAddressSpaceHandler (ACPI_ROOT_OBJECT,
    180             DefaultSpaceIdList[i], AeRegionHandler, AeRegionInit,
    181             &AeMyContext);
    182 
    183         if (ACPI_FAILURE (Status))
    184         {
    185             ACPI_EXCEPTION ((AE_INFO, Status,
    186                 "Could not install an OpRegion handler for %s space(%u)",
    187                 AcpiUtGetRegionName ((UINT8) DefaultSpaceIdList[i]),
    188                 DefaultSpaceIdList[i]));
    189         }
    190     }
    191 }
    192 
    193 
    194 /******************************************************************************
    195  *
    196  * FUNCTION:    AeInstallRegionHandlers
    197  *
    198  * PARAMETERS:  None
    199  *
    200  * RETURN:      None
    201  *
    202  * DESCRIPTION: Install handlers for the address spaces other than
    203  *              SystemMemory, SystemIO, and PCI_CONFIG.
    204  *
    205  *****************************************************************************/
    206 
    207 void
    208 AeInstallRegionHandlers (
    209     void)
    210 {
    211     UINT32                  i;
    212     ACPI_STATUS             Status;
    213 
    214 
    215     /*
    216      * Install handlers for some of the "device driver" address spaces
    217      * such as SMBus, etc.
    218      */
    219     for (i = 0; i < ACPI_ARRAY_LENGTH (SpaceIdList); i++)
    220     {
    221         /* Install handler at the root object */
    222 
    223         Status = AcpiInstallAddressSpaceHandler (ACPI_ROOT_OBJECT,
    224             SpaceIdList[i], AeRegionHandler, AeRegionInit,
    225             &AeMyContext);
    226 
    227         if (ACPI_FAILURE (Status))
    228         {
    229             ACPI_EXCEPTION ((AE_INFO, Status,
    230                 "Could not install an OpRegion handler for %s space(%u)",
    231                 AcpiUtGetRegionName((UINT8) SpaceIdList[i]), SpaceIdList[i]));
    232             return;
    233         }
    234     }
    235 }
    236 
    237 
    238 /*******************************************************************************
    239  *
    240  * FUNCTION:    AeInstallDeviceHandlers
    241  *
    242  * PARAMETERS:  None
    243  *
    244  * RETURN:      Status
    245  *
    246  * DESCRIPTION: Install handlers for all EC and PCI devices in the namespace
    247  *
    248  ******************************************************************************/
    249 
    250 ACPI_STATUS
    251 AeInstallDeviceHandlers (
    252     void)
    253 {
    254 
    255     /* Find all Embedded Controller devices */
    256 
    257     AcpiGetDevices ("PNP0C09", AeInstallEcHandler, NULL, NULL);
    258 
    259     /* Install a PCI handler */
    260 
    261     AcpiGetDevices ("PNP0A08", AeInstallPciHandler, NULL, NULL);
    262     return (AE_OK);
    263 }
    264 
    265 
    266 /*******************************************************************************
    267  *
    268  * FUNCTION:    AeInstallEcHandler
    269  *
    270  * PARAMETERS:  ACPI_WALK_NAMESPACE callback
    271  *
    272  * RETURN:      Status
    273  *
    274  * DESCRIPTION: Walk entire namespace, install a handler for every EC
    275  *              device found.
    276  *
    277  ******************************************************************************/
    278 
    279 static ACPI_STATUS
    280 AeInstallEcHandler (
    281     ACPI_HANDLE             ObjHandle,
    282     UINT32                  Level,
    283     void                    *Context,
    284     void                    **ReturnValue)
    285 {
    286     ACPI_STATUS             Status;
    287 
    288 
    289     /* Install the handler for this EC device */
    290 
    291     Status = AcpiInstallAddressSpaceHandler (ObjHandle,
    292         ACPI_ADR_SPACE_EC, AeRegionHandler, AeRegionInit, &AeMyContext);
    293     if (ACPI_FAILURE (Status))
    294     {
    295         ACPI_EXCEPTION ((AE_INFO, Status,
    296             "Could not install an OpRegion handler for EC device (%p)",
    297             ObjHandle));
    298     }
    299 
    300     return (Status);
    301 }
    302 
    303 
    304 /*******************************************************************************
    305  *
    306  * FUNCTION:    AeInstallPciHandler
    307  *
    308  * PARAMETERS:  ACPI_WALK_NAMESPACE callback
    309  *
    310  * RETURN:      Status
    311  *
    312  * DESCRIPTION: Walk entire namespace, install a handler for every PCI
    313  *              device found.
    314  *
    315  ******************************************************************************/
    316 
    317 static ACPI_STATUS
    318 AeInstallPciHandler (
    319     ACPI_HANDLE             ObjHandle,
    320     UINT32                  Level,
    321     void                    *Context,
    322     void                    **ReturnValue)
    323 {
    324     ACPI_STATUS             Status;
    325 
    326 
    327     /* Install memory and I/O handlers for the PCI device */
    328 
    329     Status = AcpiInstallAddressSpaceHandler (ObjHandle,
    330         ACPI_ADR_SPACE_SYSTEM_IO, AeRegionHandler, AeRegionInit,
    331         &AeMyContext);
    332     if (ACPI_FAILURE (Status))
    333     {
    334         ACPI_EXCEPTION ((AE_INFO, Status,
    335             "Could not install an OpRegion handler for PCI device (%p)",
    336             ObjHandle));
    337     }
    338 
    339     Status = AcpiInstallAddressSpaceHandler (ObjHandle,
    340         ACPI_ADR_SPACE_SYSTEM_MEMORY, AeRegionHandler, AeRegionInit,
    341         &AeMyContext);
    342     if (ACPI_FAILURE (Status))
    343     {
    344         ACPI_EXCEPTION ((AE_INFO, Status,
    345             "Could not install an OpRegion handler for PCI device (%p)",
    346             ObjHandle));
    347     }
    348 
    349     return (AE_CTRL_TERMINATE);
    350 }
    351