Subversion Repositories Kolibri OS

Rev

Blame | Last modification | View Log | Download | RSS feed

  1. /******************************************************************************
  2.  *
  3.  * Module Name: utxfinit - External interfaces for ACPICA initialization
  4.  *
  5.  *****************************************************************************/
  6.  
  7. /*
  8.  * Copyright (C) 2000 - 2015, 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. #define EXPORT_ACPI_INTERFACES
  45.  
  46. #include <acpi/acpi.h>
  47. #include "accommon.h"
  48. #include "acevents.h"
  49. #include "acnamesp.h"
  50. #include "acdebug.h"
  51. #include "actables.h"
  52.  
  53. #define _COMPONENT          ACPI_UTILITIES
  54. ACPI_MODULE_NAME("utxfinit")
  55.  
  56. /* For acpi_exec only */
  57. void ae_do_object_overrides(void);
  58.  
  59. /*******************************************************************************
  60.  *
  61.  * FUNCTION:    acpi_initialize_subsystem
  62.  *
  63.  * PARAMETERS:  None
  64.  *
  65.  * RETURN:      Status
  66.  *
  67.  * DESCRIPTION: Initializes all global variables. This is the first function
  68.  *              called, so any early initialization belongs here.
  69.  *
  70.  ******************************************************************************/
  71.  
  72. acpi_status __init acpi_initialize_subsystem(void)
  73. {
  74.         acpi_status status;
  75.  
  76.         ACPI_FUNCTION_TRACE(acpi_initialize_subsystem);
  77.  
  78.         acpi_gbl_startup_flags = ACPI_SUBSYSTEM_INITIALIZE;
  79.         ACPI_DEBUG_EXEC(acpi_ut_init_stack_ptr_trace());
  80.  
  81.         /* Initialize the OS-Dependent layer */
  82.  
  83.         status = acpi_os_initialize();
  84.         if (ACPI_FAILURE(status)) {
  85.                 ACPI_EXCEPTION((AE_INFO, status, "During OSL initialization"));
  86.                 return_ACPI_STATUS(status);
  87.         }
  88.  
  89.         /* Initialize all globals used by the subsystem */
  90.  
  91.         status = acpi_ut_init_globals();
  92.         if (ACPI_FAILURE(status)) {
  93.                 ACPI_EXCEPTION((AE_INFO, status,
  94.                                 "During initialization of globals"));
  95.                 return_ACPI_STATUS(status);
  96.         }
  97.  
  98.         /* Create the default mutex objects */
  99.  
  100.         status = acpi_ut_mutex_initialize();
  101.         if (ACPI_FAILURE(status)) {
  102.                 ACPI_EXCEPTION((AE_INFO, status,
  103.                                 "During Global Mutex creation"));
  104.                 return_ACPI_STATUS(status);
  105.         }
  106.  
  107.         /*
  108.          * Initialize the namespace manager and
  109.          * the root of the namespace tree
  110.          */
  111.         status = acpi_ns_root_initialize();
  112.         if (ACPI_FAILURE(status)) {
  113.                 ACPI_EXCEPTION((AE_INFO, status,
  114.                                 "During Namespace initialization"));
  115.                 return_ACPI_STATUS(status);
  116.         }
  117.  
  118.         /* Initialize the global OSI interfaces list with the static names */
  119.  
  120.         status = acpi_ut_initialize_interfaces();
  121.         if (ACPI_FAILURE(status)) {
  122.                 ACPI_EXCEPTION((AE_INFO, status,
  123.                                 "During OSI interfaces initialization"));
  124.                 return_ACPI_STATUS(status);
  125.         }
  126.  
  127.         return_ACPI_STATUS(AE_OK);
  128. }
  129.  
  130. ACPI_EXPORT_SYMBOL_INIT(acpi_initialize_subsystem)
  131.  
  132. /*******************************************************************************
  133.  *
  134.  * FUNCTION:    acpi_enable_subsystem
  135.  *
  136.  * PARAMETERS:  flags               - Init/enable Options
  137.  *
  138.  * RETURN:      Status
  139.  *
  140.  * DESCRIPTION: Completes the subsystem initialization including hardware.
  141.  *              Puts system into ACPI mode if it isn't already.
  142.  *
  143.  ******************************************************************************/
  144. acpi_status __init acpi_enable_subsystem(u32 flags)
  145. {
  146.         acpi_status status = AE_OK;
  147.  
  148.         ACPI_FUNCTION_TRACE(acpi_enable_subsystem);
  149.  
  150. #if (!ACPI_REDUCED_HARDWARE)
  151.  
  152.         /* Enable ACPI mode */
  153.  
  154.         if (!(flags & ACPI_NO_ACPI_ENABLE)) {
  155.                 ACPI_DEBUG_PRINT((ACPI_DB_EXEC,
  156.                                   "[Init] Going into ACPI mode\n"));
  157.  
  158.                 acpi_gbl_original_mode = acpi_hw_get_mode();
  159.  
  160.                 status = acpi_enable();
  161.                 if (ACPI_FAILURE(status)) {
  162.                         ACPI_WARNING((AE_INFO, "AcpiEnable failed"));
  163.                         return_ACPI_STATUS(status);
  164.                 }
  165.         }
  166.  
  167.         /*
  168.          * Obtain a permanent mapping for the FACS. This is required for the
  169.          * Global Lock and the Firmware Waking Vector
  170.          */
  171.         if (!(flags & ACPI_NO_FACS_INIT)) {
  172.                 status = acpi_tb_initialize_facs();
  173.                 if (ACPI_FAILURE(status)) {
  174.                         ACPI_WARNING((AE_INFO, "Could not map the FACS table"));
  175.                         return_ACPI_STATUS(status);
  176.                 }
  177.         }
  178. #endif                          /* !ACPI_REDUCED_HARDWARE */
  179.  
  180.         /*
  181.          * Install the default op_region handlers. These are installed unless
  182.          * other handlers have already been installed via the
  183.          * install_address_space_handler interface.
  184.          */
  185.         if (!(flags & ACPI_NO_ADDRESS_SPACE_INIT)) {
  186.                 ACPI_DEBUG_PRINT((ACPI_DB_EXEC,
  187.                                   "[Init] Installing default address space handlers\n"));
  188.  
  189.                 status = acpi_ev_install_region_handlers();
  190.                 if (ACPI_FAILURE(status)) {
  191.                         return_ACPI_STATUS(status);
  192.                 }
  193.         }
  194. #if (!ACPI_REDUCED_HARDWARE)
  195.         /*
  196.          * Initialize ACPI Event handling (Fixed and General Purpose)
  197.          *
  198.          * Note1: We must have the hardware and events initialized before we can
  199.          * execute any control methods safely. Any control method can require
  200.          * ACPI hardware support, so the hardware must be fully initialized before
  201.          * any method execution!
  202.          *
  203.          * Note2: Fixed events are initialized and enabled here. GPEs are
  204.          * initialized, but cannot be enabled until after the hardware is
  205.          * completely initialized (SCI and global_lock activated) and the various
  206.          * initialization control methods are run (_REG, _STA, _INI) on the
  207.          * entire namespace.
  208.          */
  209.         if (!(flags & ACPI_NO_EVENT_INIT)) {
  210.                 ACPI_DEBUG_PRINT((ACPI_DB_EXEC,
  211.                                   "[Init] Initializing ACPI events\n"));
  212.  
  213.                 status = acpi_ev_initialize_events();
  214.                 if (ACPI_FAILURE(status)) {
  215.                         return_ACPI_STATUS(status);
  216.                 }
  217.         }
  218.  
  219.         /*
  220.          * Install the SCI handler and Global Lock handler. This completes the
  221.          * hardware initialization.
  222.          */
  223.         if (!(flags & ACPI_NO_HANDLER_INIT)) {
  224.                 ACPI_DEBUG_PRINT((ACPI_DB_EXEC,
  225.                                   "[Init] Installing SCI/GL handlers\n"));
  226.  
  227.                 status = acpi_ev_install_xrupt_handlers();
  228.                 if (ACPI_FAILURE(status)) {
  229.                         return_ACPI_STATUS(status);
  230.                 }
  231.         }
  232. #endif                          /* !ACPI_REDUCED_HARDWARE */
  233.  
  234.         return_ACPI_STATUS(status);
  235. }
  236.  
  237. ACPI_EXPORT_SYMBOL_INIT(acpi_enable_subsystem)
  238.  
  239. /*******************************************************************************
  240.  *
  241.  * FUNCTION:    acpi_initialize_objects
  242.  *
  243.  * PARAMETERS:  flags               - Init/enable Options
  244.  *
  245.  * RETURN:      Status
  246.  *
  247.  * DESCRIPTION: Completes namespace initialization by initializing device
  248.  *              objects and executing AML code for Regions, buffers, etc.
  249.  *
  250.  ******************************************************************************/
  251. acpi_status __init acpi_initialize_objects(u32 flags)
  252. {
  253.         acpi_status status = AE_OK;
  254.  
  255.         ACPI_FUNCTION_TRACE(acpi_initialize_objects);
  256.  
  257.         /*
  258.          * Run all _REG methods
  259.          *
  260.          * Note: Any objects accessed by the _REG methods will be automatically
  261.          * initialized, even if they contain executable AML (see the call to
  262.          * acpi_ns_initialize_objects below).
  263.          */
  264.         if (!(flags & ACPI_NO_ADDRESS_SPACE_INIT)) {
  265.                 ACPI_DEBUG_PRINT((ACPI_DB_EXEC,
  266.                                   "[Init] Executing _REG OpRegion methods\n"));
  267.  
  268.                 status = acpi_ev_initialize_op_regions();
  269.                 if (ACPI_FAILURE(status)) {
  270.                         return_ACPI_STATUS(status);
  271.                 }
  272.         }
  273. #ifdef ACPI_EXEC_APP
  274.         /*
  275.          * This call implements the "initialization file" option for acpi_exec.
  276.          * This is the precise point that we want to perform the overrides.
  277.          */
  278.         ae_do_object_overrides();
  279. #endif
  280.  
  281.         /*
  282.          * Execute any module-level code that was detected during the table load
  283.          * phase. Although illegal since ACPI 2.0, there are many machines that
  284.          * contain this type of code. Each block of detected executable AML code
  285.          * outside of any control method is wrapped with a temporary control
  286.          * method object and placed on a global list. The methods on this list
  287.          * are executed below.
  288.          */
  289.         acpi_ns_exec_module_code_list();
  290.  
  291.         /*
  292.          * Initialize the objects that remain uninitialized. This runs the
  293.          * executable AML that may be part of the declaration of these objects:
  294.          * operation_regions, buffer_fields, Buffers, and Packages.
  295.          */
  296.         if (!(flags & ACPI_NO_OBJECT_INIT)) {
  297.                 ACPI_DEBUG_PRINT((ACPI_DB_EXEC,
  298.                                   "[Init] Completing Initialization of ACPI Objects\n"));
  299.  
  300.                 status = acpi_ns_initialize_objects();
  301.                 if (ACPI_FAILURE(status)) {
  302.                         return_ACPI_STATUS(status);
  303.                 }
  304.         }
  305.  
  306.         /*
  307.          * Initialize all device objects in the namespace. This runs the device
  308.          * _STA and _INI methods.
  309.          */
  310.         if (!(flags & ACPI_NO_DEVICE_INIT)) {
  311.                 ACPI_DEBUG_PRINT((ACPI_DB_EXEC,
  312.                                   "[Init] Initializing ACPI Devices\n"));
  313.  
  314.                 status = acpi_ns_initialize_devices();
  315.                 if (ACPI_FAILURE(status)) {
  316.                         return_ACPI_STATUS(status);
  317.                 }
  318.         }
  319.  
  320.         /*
  321.          * Empty the caches (delete the cached objects) on the assumption that
  322.          * the table load filled them up more than they will be at runtime --
  323.          * thus wasting non-paged memory.
  324.          */
  325.         status = acpi_purge_cached_objects();
  326.  
  327.         acpi_gbl_startup_flags |= ACPI_INITIALIZED_OK;
  328.         return_ACPI_STATUS(status);
  329. }
  330.  
  331. ACPI_EXPORT_SYMBOL_INIT(acpi_initialize_objects)
  332.