1ff4a156dSchristos /****************************************************************************** 2ff4a156dSchristos * 3ff4a156dSchristos * Module Name: utxfinit - External interfaces for ACPICA initialization 4ff4a156dSchristos * 5ff4a156dSchristos *****************************************************************************/ 6ff4a156dSchristos 7ff4a156dSchristos /* 8046a2985Schristos * Copyright (C) 2000 - 2023, Intel Corp. 9ff4a156dSchristos * All rights reserved. 10ff4a156dSchristos * 11ff4a156dSchristos * Redistribution and use in source and binary forms, with or without 12ff4a156dSchristos * modification, are permitted provided that the following conditions 13ff4a156dSchristos * are met: 14ff4a156dSchristos * 1. Redistributions of source code must retain the above copyright 15ff4a156dSchristos * notice, this list of conditions, and the following disclaimer, 16ff4a156dSchristos * without modification. 17ff4a156dSchristos * 2. Redistributions in binary form must reproduce at minimum a disclaimer 18ff4a156dSchristos * substantially similar to the "NO WARRANTY" disclaimer below 19ff4a156dSchristos * ("Disclaimer") and any redistribution must be conditioned upon 20ff4a156dSchristos * including a substantially similar Disclaimer requirement for further 21ff4a156dSchristos * binary redistribution. 22ff4a156dSchristos * 3. Neither the names of the above-listed copyright holders nor the names 23ff4a156dSchristos * of any contributors may be used to endorse or promote products derived 24ff4a156dSchristos * from this software without specific prior written permission. 25ff4a156dSchristos * 26ff4a156dSchristos * Alternatively, this software may be distributed under the terms of the 27ff4a156dSchristos * GNU General Public License ("GPL") version 2 as published by the Free 28ff4a156dSchristos * Software Foundation. 29ff4a156dSchristos * 30ff4a156dSchristos * NO WARRANTY 31ff4a156dSchristos * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 32ff4a156dSchristos * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 3346a330b4Schristos * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 34ff4a156dSchristos * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 35ff4a156dSchristos * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 36ff4a156dSchristos * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 37ff4a156dSchristos * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 38ff4a156dSchristos * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, 39ff4a156dSchristos * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING 40ff4a156dSchristos * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 41ff4a156dSchristos * POSSIBILITY OF SUCH DAMAGES. 42ff4a156dSchristos */ 43ff4a156dSchristos 44ff4a156dSchristos #define EXPORT_ACPI_INTERFACES 45ff4a156dSchristos 46ff4a156dSchristos #include "acpi.h" 47ff4a156dSchristos #include "accommon.h" 48ff4a156dSchristos #include "acevents.h" 49ff4a156dSchristos #include "acnamesp.h" 50ff4a156dSchristos #include "acdebug.h" 51ff4a156dSchristos #include "actables.h" 52ff4a156dSchristos 53ff4a156dSchristos #define _COMPONENT ACPI_UTILITIES 54ff4a156dSchristos ACPI_MODULE_NAME ("utxfinit") 55ff4a156dSchristos 56679c17fdSchristos /* For AcpiExec only */ 57679c17fdSchristos void 58679c17fdSchristos AeDoObjectOverrides ( 59679c17fdSchristos void); 60679c17fdSchristos 61ff4a156dSchristos 62ff4a156dSchristos /******************************************************************************* 63ff4a156dSchristos * 64ff4a156dSchristos * FUNCTION: AcpiInitializeSubsystem 65ff4a156dSchristos * 66ff4a156dSchristos * PARAMETERS: None 67ff4a156dSchristos * 68ff4a156dSchristos * RETURN: Status 69ff4a156dSchristos * 70ff4a156dSchristos * DESCRIPTION: Initializes all global variables. This is the first function 71ff4a156dSchristos * called, so any early initialization belongs here. 72ff4a156dSchristos * 73ff4a156dSchristos ******************************************************************************/ 74ff4a156dSchristos 75d4ca3bd6Schristos ACPI_STATUS ACPI_INIT_FUNCTION 76ff4a156dSchristos AcpiInitializeSubsystem ( 77ff4a156dSchristos void) 78ff4a156dSchristos { 79ff4a156dSchristos ACPI_STATUS Status; 80ff4a156dSchristos 81ff4a156dSchristos 82ff4a156dSchristos ACPI_FUNCTION_TRACE (AcpiInitializeSubsystem); 83ff4a156dSchristos 84ff4a156dSchristos 85ff4a156dSchristos AcpiGbl_StartupFlags = ACPI_SUBSYSTEM_INITIALIZE; 86ff4a156dSchristos ACPI_DEBUG_EXEC (AcpiUtInitStackPtrTrace ()); 87ff4a156dSchristos 88ff4a156dSchristos /* Initialize the OS-Dependent layer */ 89ff4a156dSchristos 90ff4a156dSchristos Status = AcpiOsInitialize (); 91ff4a156dSchristos if (ACPI_FAILURE (Status)) 92ff4a156dSchristos { 93ff4a156dSchristos ACPI_EXCEPTION ((AE_INFO, Status, "During OSL initialization")); 94ff4a156dSchristos return_ACPI_STATUS (Status); 95ff4a156dSchristos } 96ff4a156dSchristos 97ff4a156dSchristos /* Initialize all globals used by the subsystem */ 98ff4a156dSchristos 99ff4a156dSchristos Status = AcpiUtInitGlobals (); 100ff4a156dSchristos if (ACPI_FAILURE (Status)) 101ff4a156dSchristos { 102ff4a156dSchristos ACPI_EXCEPTION ((AE_INFO, Status, "During initialization of globals")); 103ff4a156dSchristos return_ACPI_STATUS (Status); 104ff4a156dSchristos } 105ff4a156dSchristos 106ff4a156dSchristos /* Create the default mutex objects */ 107ff4a156dSchristos 108ff4a156dSchristos Status = AcpiUtMutexInitialize (); 109ff4a156dSchristos if (ACPI_FAILURE (Status)) 110ff4a156dSchristos { 111ff4a156dSchristos ACPI_EXCEPTION ((AE_INFO, Status, "During Global Mutex creation")); 112ff4a156dSchristos return_ACPI_STATUS (Status); 113ff4a156dSchristos } 114ff4a156dSchristos 115ff4a156dSchristos /* 116ff4a156dSchristos * Initialize the namespace manager and 117ff4a156dSchristos * the root of the namespace tree 118ff4a156dSchristos */ 119ff4a156dSchristos Status = AcpiNsRootInitialize (); 120ff4a156dSchristos if (ACPI_FAILURE (Status)) 121ff4a156dSchristos { 122ff4a156dSchristos ACPI_EXCEPTION ((AE_INFO, Status, "During Namespace initialization")); 123ff4a156dSchristos return_ACPI_STATUS (Status); 124ff4a156dSchristos } 125ff4a156dSchristos 126ff4a156dSchristos /* Initialize the global OSI interfaces list with the static names */ 127ff4a156dSchristos 128ff4a156dSchristos Status = AcpiUtInitializeInterfaces (); 129ff4a156dSchristos if (ACPI_FAILURE (Status)) 130ff4a156dSchristos { 131ff4a156dSchristos ACPI_EXCEPTION ((AE_INFO, Status, "During OSI interfaces initialization")); 132ff4a156dSchristos return_ACPI_STATUS (Status); 133ff4a156dSchristos } 134ff4a156dSchristos 135ff4a156dSchristos return_ACPI_STATUS (AE_OK); 136ff4a156dSchristos } 137ff4a156dSchristos 138ff4a156dSchristos ACPI_EXPORT_SYMBOL_INIT (AcpiInitializeSubsystem) 139ff4a156dSchristos 140ff4a156dSchristos 141ff4a156dSchristos /******************************************************************************* 142ff4a156dSchristos * 143ff4a156dSchristos * FUNCTION: AcpiEnableSubsystem 144ff4a156dSchristos * 145ff4a156dSchristos * PARAMETERS: Flags - Init/enable Options 146ff4a156dSchristos * 147ff4a156dSchristos * RETURN: Status 148ff4a156dSchristos * 149ff4a156dSchristos * DESCRIPTION: Completes the subsystem initialization including hardware. 150ff4a156dSchristos * Puts system into ACPI mode if it isn't already. 151ff4a156dSchristos * 152ff4a156dSchristos ******************************************************************************/ 153ff4a156dSchristos 154d4ca3bd6Schristos ACPI_STATUS ACPI_INIT_FUNCTION 155ff4a156dSchristos AcpiEnableSubsystem ( 156ff4a156dSchristos UINT32 Flags) 157ff4a156dSchristos { 158ff4a156dSchristos ACPI_STATUS Status = AE_OK; 159ff4a156dSchristos 160ff4a156dSchristos 161ff4a156dSchristos ACPI_FUNCTION_TRACE (AcpiEnableSubsystem); 162ff4a156dSchristos 163ff4a156dSchristos 16471e38f1dSchristos /* 16571e38f1dSchristos * The early initialization phase is complete. The namespace is loaded, 16671e38f1dSchristos * and we can now support address spaces other than Memory, I/O, and 16771e38f1dSchristos * PCI_Config. 16871e38f1dSchristos */ 16971e38f1dSchristos AcpiGbl_EarlyInitialization = FALSE; 17071e38f1dSchristos 171*c7960b37Schristos /* 172*c7960b37Schristos * Obtain a permanent mapping for the FACS. This is required for the 173*c7960b37Schristos * Global Lock and the Firmware Waking Vector 174*c7960b37Schristos */ 175*c7960b37Schristos if (!(Flags & ACPI_NO_FACS_INIT)) 176*c7960b37Schristos { 177*c7960b37Schristos Status = AcpiTbInitializeFacs (); 178*c7960b37Schristos if (ACPI_FAILURE (Status)) 179*c7960b37Schristos { 180*c7960b37Schristos ACPI_WARNING ((AE_INFO, "Could not map the FACS table")); 181*c7960b37Schristos return_ACPI_STATUS (Status); 182*c7960b37Schristos } 183*c7960b37Schristos } 184*c7960b37Schristos 185ff4a156dSchristos #if (!ACPI_REDUCED_HARDWARE) 186ff4a156dSchristos 187ff4a156dSchristos /* Enable ACPI mode */ 188ff4a156dSchristos 189ff4a156dSchristos if (!(Flags & ACPI_NO_ACPI_ENABLE)) 190ff4a156dSchristos { 191ff4a156dSchristos ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "[Init] Going into ACPI mode\n")); 192ff4a156dSchristos 193ff4a156dSchristos AcpiGbl_OriginalMode = AcpiHwGetMode(); 194ff4a156dSchristos 195ff4a156dSchristos Status = AcpiEnable (); 196ff4a156dSchristos if (ACPI_FAILURE (Status)) 197ff4a156dSchristos { 198ff4a156dSchristos ACPI_WARNING ((AE_INFO, "AcpiEnable failed")); 199ff4a156dSchristos return_ACPI_STATUS (Status); 200ff4a156dSchristos } 201ff4a156dSchristos } 202ff4a156dSchristos 203ff4a156dSchristos /* 204ff4a156dSchristos * Initialize ACPI Event handling (Fixed and General Purpose) 205ff4a156dSchristos * 206ff4a156dSchristos * Note1: We must have the hardware and events initialized before we can 207ff4a156dSchristos * execute any control methods safely. Any control method can require 208ff4a156dSchristos * ACPI hardware support, so the hardware must be fully initialized before 209ff4a156dSchristos * any method execution! 210ff4a156dSchristos * 211ff4a156dSchristos * Note2: Fixed events are initialized and enabled here. GPEs are 212ff4a156dSchristos * initialized, but cannot be enabled until after the hardware is 213ff4a156dSchristos * completely initialized (SCI and GlobalLock activated) and the various 214ff4a156dSchristos * initialization control methods are run (_REG, _STA, _INI) on the 215ff4a156dSchristos * entire namespace. 216ff4a156dSchristos */ 217ff4a156dSchristos if (!(Flags & ACPI_NO_EVENT_INIT)) 218ff4a156dSchristos { 219ff4a156dSchristos ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, 220ff4a156dSchristos "[Init] Initializing ACPI events\n")); 221ff4a156dSchristos 222ff4a156dSchristos Status = AcpiEvInitializeEvents (); 223ff4a156dSchristos if (ACPI_FAILURE (Status)) 224ff4a156dSchristos { 225ff4a156dSchristos return_ACPI_STATUS (Status); 226ff4a156dSchristos } 227ff4a156dSchristos } 228ff4a156dSchristos 229ff4a156dSchristos /* 230ff4a156dSchristos * Install the SCI handler and Global Lock handler. This completes the 231ff4a156dSchristos * hardware initialization. 232ff4a156dSchristos */ 233ff4a156dSchristos if (!(Flags & ACPI_NO_HANDLER_INIT)) 234ff4a156dSchristos { 235ff4a156dSchristos ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, 236ff4a156dSchristos "[Init] Installing SCI/GL handlers\n")); 237ff4a156dSchristos 238ff4a156dSchristos Status = AcpiEvInstallXruptHandlers (); 239ff4a156dSchristos if (ACPI_FAILURE (Status)) 240ff4a156dSchristos { 241ff4a156dSchristos return_ACPI_STATUS (Status); 242ff4a156dSchristos } 243ff4a156dSchristos } 244ff4a156dSchristos 245ff4a156dSchristos #endif /* !ACPI_REDUCED_HARDWARE */ 246ff4a156dSchristos 247ff4a156dSchristos return_ACPI_STATUS (Status); 248ff4a156dSchristos } 249ff4a156dSchristos 250ff4a156dSchristos ACPI_EXPORT_SYMBOL_INIT (AcpiEnableSubsystem) 251ff4a156dSchristos 252ff4a156dSchristos 253ff4a156dSchristos /******************************************************************************* 254ff4a156dSchristos * 255ff4a156dSchristos * FUNCTION: AcpiInitializeObjects 256ff4a156dSchristos * 257ff4a156dSchristos * PARAMETERS: Flags - Init/enable Options 258ff4a156dSchristos * 259ff4a156dSchristos * RETURN: Status 260ff4a156dSchristos * 261ff4a156dSchristos * DESCRIPTION: Completes namespace initialization by initializing device 262ff4a156dSchristos * objects and executing AML code for Regions, buffers, etc. 263ff4a156dSchristos * 264ff4a156dSchristos ******************************************************************************/ 265ff4a156dSchristos 266d4ca3bd6Schristos ACPI_STATUS ACPI_INIT_FUNCTION 267ff4a156dSchristos AcpiInitializeObjects ( 268ff4a156dSchristos UINT32 Flags) 269ff4a156dSchristos { 270ff4a156dSchristos ACPI_STATUS Status = AE_OK; 271ff4a156dSchristos 272ff4a156dSchristos 273ff4a156dSchristos ACPI_FUNCTION_TRACE (AcpiInitializeObjects); 274ff4a156dSchristos 275ff4a156dSchristos 276783af925Schristos #ifdef ACPI_OBSOLETE_BEHAVIOR 277679c17fdSchristos /* 278783af925Schristos * 05/2019: Removed, initialization now happens at both object 279783af925Schristos * creation and table load time 280ff4a156dSchristos */ 281ff4a156dSchristos 282ff4a156dSchristos /* 283cfbb7280Schristos * Initialize the objects that remain uninitialized. This 284cfbb7280Schristos * runs the executable AML that may be part of the 285783af925Schristos * declaration of these objects: OperationRegions, BufferFields, 286783af925Schristos * BankFields, Buffers, and Packages. 287ff4a156dSchristos */ 288ff4a156dSchristos if (!(Flags & ACPI_NO_OBJECT_INIT)) 289ff4a156dSchristos { 290ff4a156dSchristos Status = AcpiNsInitializeObjects (); 291ff4a156dSchristos if (ACPI_FAILURE (Status)) 292ff4a156dSchristos { 293ff4a156dSchristos return_ACPI_STATUS (Status); 294ff4a156dSchristos } 295ff4a156dSchristos } 296783af925Schristos #endif 297ff4a156dSchristos 298ff4a156dSchristos /* 299cfbb7280Schristos * Initialize all device/region objects in the namespace. This runs 300cfbb7280Schristos * the device _STA and _INI methods and region _REG methods. 301ff4a156dSchristos */ 302cfbb7280Schristos if (!(Flags & (ACPI_NO_DEVICE_INIT | ACPI_NO_ADDRESS_SPACE_INIT))) 303ff4a156dSchristos { 304cfbb7280Schristos Status = AcpiNsInitializeDevices (Flags); 305ff4a156dSchristos if (ACPI_FAILURE (Status)) 306ff4a156dSchristos { 307ff4a156dSchristos return_ACPI_STATUS (Status); 308ff4a156dSchristos } 309ff4a156dSchristos } 310ff4a156dSchristos 311ff4a156dSchristos /* 312ff4a156dSchristos * Empty the caches (delete the cached objects) on the assumption that 313ff4a156dSchristos * the table load filled them up more than they will be at runtime -- 314ff4a156dSchristos * thus wasting non-paged memory. 315ff4a156dSchristos */ 316ff4a156dSchristos Status = AcpiPurgeCachedObjects (); 317ff4a156dSchristos 318ff4a156dSchristos AcpiGbl_StartupFlags |= ACPI_INITIALIZED_OK; 319ff4a156dSchristos return_ACPI_STATUS (Status); 320ff4a156dSchristos } 321ff4a156dSchristos 322ff4a156dSchristos ACPI_EXPORT_SYMBOL_INIT (AcpiInitializeObjects) 323