Subversion Repositories Kolibri OS

Rev

Go to most recent revision | Blame | Last modification | View Log | Download | RSS feed

  1. /******************************************************************************
  2.  *
  3.  * Module Name: utinit - Common ACPI subsystem 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. #include <acpi/acpi.h>
  45. #include "accommon.h"
  46. #include "acnamesp.h"
  47. #include "acevents.h"
  48. #include "actables.h"
  49.  
  50. #define _COMPONENT          ACPI_UTILITIES
  51. ACPI_MODULE_NAME("utinit")
  52.  
  53. /* Local prototypes */
  54. static void acpi_ut_terminate(void);
  55.  
  56. #if (!ACPI_REDUCED_HARDWARE)
  57.  
  58. static void acpi_ut_free_gpe_lists(void);
  59.  
  60. #else
  61.  
  62. #define acpi_ut_free_gpe_lists()
  63. #endif                          /* !ACPI_REDUCED_HARDWARE */
  64.  
  65. #if (!ACPI_REDUCED_HARDWARE)
  66. /******************************************************************************
  67.  *
  68.  * FUNCTION:    acpi_ut_free_gpe_lists
  69.  *
  70.  * PARAMETERS:  none
  71.  *
  72.  * RETURN:      none
  73.  *
  74.  * DESCRIPTION: Free global GPE lists
  75.  *
  76.  ******************************************************************************/
  77.  
  78. static void acpi_ut_free_gpe_lists(void)
  79. {
  80.         struct acpi_gpe_block_info *gpe_block;
  81.         struct acpi_gpe_block_info *next_gpe_block;
  82.         struct acpi_gpe_xrupt_info *gpe_xrupt_info;
  83.         struct acpi_gpe_xrupt_info *next_gpe_xrupt_info;
  84.  
  85.         /* Free global GPE blocks and related info structures */
  86.  
  87.         gpe_xrupt_info = acpi_gbl_gpe_xrupt_list_head;
  88.         while (gpe_xrupt_info) {
  89.                 gpe_block = gpe_xrupt_info->gpe_block_list_head;
  90.                 while (gpe_block) {
  91.                         next_gpe_block = gpe_block->next;
  92.                         ACPI_FREE(gpe_block->event_info);
  93.                         ACPI_FREE(gpe_block->register_info);
  94.                         ACPI_FREE(gpe_block);
  95.  
  96.                         gpe_block = next_gpe_block;
  97.                 }
  98.                 next_gpe_xrupt_info = gpe_xrupt_info->next;
  99.                 ACPI_FREE(gpe_xrupt_info);
  100.                 gpe_xrupt_info = next_gpe_xrupt_info;
  101.         }
  102. }
  103. #endif                          /* !ACPI_REDUCED_HARDWARE */
  104.  
  105. /*******************************************************************************
  106.  *
  107.  * FUNCTION:    acpi_ut_init_globals
  108.  *
  109.  * PARAMETERS:  None
  110.  *
  111.  * RETURN:      Status
  112.  *
  113.  * DESCRIPTION: Initialize ACPICA globals. All globals that require specific
  114.  *              initialization should be initialized here. This allows for
  115.  *              a warm restart.
  116.  *
  117.  ******************************************************************************/
  118.  
  119. acpi_status acpi_ut_init_globals(void)
  120. {
  121.         acpi_status status;
  122.         u32 i;
  123.  
  124.         ACPI_FUNCTION_TRACE(ut_init_globals);
  125.  
  126.         /* Create all memory caches */
  127.  
  128.         status = acpi_ut_create_caches();
  129.         if (ACPI_FAILURE(status)) {
  130.                 return_ACPI_STATUS(status);
  131.         }
  132.  
  133.         /* Address Range lists */
  134.  
  135.         for (i = 0; i < ACPI_ADDRESS_RANGE_MAX; i++) {
  136.                 acpi_gbl_address_range_list[i] = NULL;
  137.         }
  138.  
  139.         /* Mutex locked flags */
  140.  
  141.         for (i = 0; i < ACPI_NUM_MUTEX; i++) {
  142.                 acpi_gbl_mutex_info[i].mutex = NULL;
  143.                 acpi_gbl_mutex_info[i].thread_id = ACPI_MUTEX_NOT_ACQUIRED;
  144.                 acpi_gbl_mutex_info[i].use_count = 0;
  145.         }
  146.  
  147.         for (i = 0; i < ACPI_NUM_OWNERID_MASKS; i++) {
  148.                 acpi_gbl_owner_id_mask[i] = 0;
  149.         }
  150.  
  151.         /* Last owner_ID is never valid */
  152.  
  153.         acpi_gbl_owner_id_mask[ACPI_NUM_OWNERID_MASKS - 1] = 0x80000000;
  154.  
  155.         /* Event counters */
  156.  
  157.         acpi_method_count = 0;
  158.         acpi_sci_count = 0;
  159.         acpi_gpe_count = 0;
  160.  
  161.         for (i = 0; i < ACPI_NUM_FIXED_EVENTS; i++) {
  162.                 acpi_fixed_event_count[i] = 0;
  163.         }
  164.  
  165. #if (!ACPI_REDUCED_HARDWARE)
  166.  
  167.         /* GPE/SCI support */
  168.  
  169.         acpi_gbl_all_gpes_initialized = FALSE;
  170.         acpi_gbl_gpe_xrupt_list_head = NULL;
  171.         acpi_gbl_gpe_fadt_blocks[0] = NULL;
  172.         acpi_gbl_gpe_fadt_blocks[1] = NULL;
  173.         acpi_current_gpe_count = 0;
  174.  
  175.         acpi_gbl_global_event_handler = NULL;
  176.         acpi_gbl_sci_handler_list = NULL;
  177.  
  178. #endif                          /* !ACPI_REDUCED_HARDWARE */
  179.  
  180.         /* Global handlers */
  181.  
  182.         acpi_gbl_global_notify[0].handler = NULL;
  183.         acpi_gbl_global_notify[1].handler = NULL;
  184.         acpi_gbl_exception_handler = NULL;
  185.         acpi_gbl_init_handler = NULL;
  186.         acpi_gbl_table_handler = NULL;
  187.         acpi_gbl_interface_handler = NULL;
  188.  
  189.         /* Global Lock support */
  190.  
  191.         acpi_gbl_global_lock_semaphore = NULL;
  192.         acpi_gbl_global_lock_mutex = NULL;
  193.         acpi_gbl_global_lock_acquired = FALSE;
  194.         acpi_gbl_global_lock_handle = 0;
  195.         acpi_gbl_global_lock_present = FALSE;
  196.  
  197.         /* Miscellaneous variables */
  198.  
  199.         acpi_gbl_DSDT = NULL;
  200.         acpi_gbl_cm_single_step = FALSE;
  201.         acpi_gbl_shutdown = FALSE;
  202.         acpi_gbl_ns_lookup_count = 0;
  203.         acpi_gbl_ps_find_count = 0;
  204.         acpi_gbl_acpi_hardware_present = TRUE;
  205.         acpi_gbl_last_owner_id_index = 0;
  206.         acpi_gbl_next_owner_id_offset = 0;
  207.         acpi_gbl_debugger_configuration = DEBUGGER_THREADING;
  208.         acpi_gbl_osi_mutex = NULL;
  209.         acpi_gbl_reg_methods_executed = FALSE;
  210.         acpi_gbl_max_loop_iterations = 0xFFFF;
  211.  
  212.         /* Hardware oriented */
  213.  
  214.         acpi_gbl_events_initialized = FALSE;
  215.         acpi_gbl_system_awake_and_running = TRUE;
  216.  
  217.         /* Namespace */
  218.  
  219.         acpi_gbl_module_code_list = NULL;
  220.         acpi_gbl_root_node = NULL;
  221.         acpi_gbl_root_node_struct.name.integer = ACPI_ROOT_NAME;
  222.         acpi_gbl_root_node_struct.descriptor_type = ACPI_DESC_TYPE_NAMED;
  223.         acpi_gbl_root_node_struct.type = ACPI_TYPE_DEVICE;
  224.         acpi_gbl_root_node_struct.parent = NULL;
  225.         acpi_gbl_root_node_struct.child = NULL;
  226.         acpi_gbl_root_node_struct.peer = NULL;
  227.         acpi_gbl_root_node_struct.object = NULL;
  228.  
  229. #ifdef ACPI_DISASSEMBLER
  230.         acpi_gbl_external_list = NULL;
  231.         acpi_gbl_num_external_methods = 0;
  232.         acpi_gbl_resolved_external_methods = 0;
  233. #endif
  234.  
  235. #ifdef ACPI_DEBUG_OUTPUT
  236.         acpi_gbl_lowest_stack_pointer = ACPI_CAST_PTR(acpi_size, ACPI_SIZE_MAX);
  237. #endif
  238.  
  239. #ifdef ACPI_DBG_TRACK_ALLOCATIONS
  240.         acpi_gbl_display_final_mem_stats = FALSE;
  241.         acpi_gbl_disable_mem_tracking = FALSE;
  242. #endif
  243.  
  244.         return_ACPI_STATUS(AE_OK);
  245. }
  246.  
  247. /******************************************************************************
  248.  *
  249.  * FUNCTION:    acpi_ut_terminate
  250.  *
  251.  * PARAMETERS:  none
  252.  *
  253.  * RETURN:      none
  254.  *
  255.  * DESCRIPTION: Free global memory
  256.  *
  257.  ******************************************************************************/
  258.  
  259. static void acpi_ut_terminate(void)
  260. {
  261.         ACPI_FUNCTION_TRACE(ut_terminate);
  262.  
  263.         acpi_ut_free_gpe_lists();
  264.         acpi_ut_delete_address_lists();
  265.         return_VOID;
  266. }
  267.  
  268. /*******************************************************************************
  269.  *
  270.  * FUNCTION:    acpi_ut_subsystem_shutdown
  271.  *
  272.  * PARAMETERS:  None
  273.  *
  274.  * RETURN:      None
  275.  *
  276.  * DESCRIPTION: Shutdown the various components. Do not delete the mutex
  277.  *              objects here, because the AML debugger may be still running.
  278.  *
  279.  ******************************************************************************/
  280.  
  281. void acpi_ut_subsystem_shutdown(void)
  282. {
  283.         ACPI_FUNCTION_TRACE(ut_subsystem_shutdown);
  284.  
  285.         /* Just exit if subsystem is already shutdown */
  286.  
  287.         if (acpi_gbl_shutdown) {
  288.                 ACPI_ERROR((AE_INFO, "ACPI Subsystem is already terminated"));
  289.                 return_VOID;
  290.         }
  291.  
  292.         /* Subsystem appears active, go ahead and shut it down */
  293.  
  294.         acpi_gbl_shutdown = TRUE;
  295.         acpi_gbl_startup_flags = 0;
  296.         ACPI_DEBUG_PRINT((ACPI_DB_INFO, "Shutting down ACPI Subsystem\n"));
  297.  
  298. #ifndef ACPI_ASL_COMPILER
  299.  
  300.         /* Close the acpi_event Handling */
  301.  
  302.         acpi_ev_terminate();
  303.  
  304.         /* Delete any dynamic _OSI interfaces */
  305.  
  306.         acpi_ut_interface_terminate();
  307. #endif
  308.  
  309.         /* Close the Namespace */
  310.  
  311.         acpi_ns_terminate();
  312.  
  313.         /* Delete the ACPI tables */
  314.  
  315.         acpi_tb_terminate();
  316.  
  317.         /* Close the globals */
  318.  
  319.         acpi_ut_terminate();
  320.  
  321.         /* Purge the local caches */
  322.  
  323.         (void)acpi_ut_delete_caches();
  324.         return_VOID;
  325. }
  326.