Branch data Line data Source code
1 : : // SPDX-License-Identifier: BSD-3-Clause OR GPL-2.0 2 : : /****************************************************************************** 3 : : * 4 : : * Module Name: tbfind - find table 5 : : * 6 : : * Copyright (C) 2000 - 2020, Intel Corp. 7 : : * 8 : : *****************************************************************************/ 9 : : 10 : : #include <acpi/acpi.h> 11 : : #include "accommon.h" 12 : : #include "actables.h" 13 : : 14 : : #define _COMPONENT ACPI_TABLES 15 : : ACPI_MODULE_NAME("tbfind") 16 : : 17 : : /******************************************************************************* 18 : : * 19 : : * FUNCTION: acpi_tb_find_table 20 : : * 21 : : * PARAMETERS: signature - String with ACPI table signature 22 : : * oem_id - String with the table OEM ID 23 : : * oem_table_id - String with the OEM Table ID 24 : : * table_index - Where the table index is returned 25 : : * 26 : : * RETURN: Status and table index 27 : : * 28 : : * DESCRIPTION: Find an ACPI table (in the RSDT/XSDT) that matches the 29 : : * Signature, OEM ID and OEM Table ID. Returns an index that can 30 : : * be used to get the table header or entire table. 31 : : * 32 : : ******************************************************************************/ 33 : : acpi_status 34 : 0 : acpi_tb_find_table(char *signature, 35 : : char *oem_id, char *oem_table_id, u32 *table_index) 36 : : { 37 : 0 : acpi_status status = AE_OK; 38 : 0 : struct acpi_table_header header; 39 : 0 : u32 i; 40 : : 41 : 0 : ACPI_FUNCTION_TRACE(tb_find_table); 42 : : 43 : : /* Validate the input table signature */ 44 : : 45 [ # # ]: 0 : if (!acpi_ut_valid_nameseg(signature)) { 46 : : return_ACPI_STATUS(AE_BAD_SIGNATURE); 47 : : } 48 : : 49 : : /* Don't allow the OEM strings to be too long */ 50 : : 51 [ # # ]: 0 : if ((strlen(oem_id) > ACPI_OEM_ID_SIZE) || 52 [ # # ]: 0 : (strlen(oem_table_id) > ACPI_OEM_TABLE_ID_SIZE)) { 53 : : return_ACPI_STATUS(AE_AML_STRING_LIMIT); 54 : : } 55 : : 56 : : /* Normalize the input strings */ 57 : : 58 : 0 : memset(&header, 0, sizeof(struct acpi_table_header)); 59 : 0 : ACPI_COPY_NAMESEG(header.signature, signature); 60 : 0 : strncpy(header.oem_id, oem_id, ACPI_OEM_ID_SIZE); 61 : 0 : strncpy(header.oem_table_id, oem_table_id, ACPI_OEM_TABLE_ID_SIZE); 62 : : 63 : : /* Search for the table */ 64 : : 65 : 0 : (void)acpi_ut_acquire_mutex(ACPI_MTX_TABLES); 66 [ # # ]: 0 : for (i = 0; i < acpi_gbl_root_table_list.current_table_count; ++i) { 67 [ # # ]: 0 : if (memcmp(&(acpi_gbl_root_table_list.tables[i].signature), 68 : : header.signature, ACPI_NAMESEG_SIZE)) { 69 : : 70 : : /* Not the requested table */ 71 : : 72 : 0 : continue; 73 : : } 74 : : 75 : : /* Table with matching signature has been found */ 76 : : 77 [ # # ]: 0 : if (!acpi_gbl_root_table_list.tables[i].pointer) { 78 : : 79 : : /* Table is not currently mapped, map it */ 80 : : 81 : 0 : status = 82 : 0 : acpi_tb_validate_table(&acpi_gbl_root_table_list. 83 : : tables[i]); 84 [ # # ]: 0 : if (ACPI_FAILURE(status)) { 85 : 0 : goto unlock_and_exit; 86 : : } 87 : : 88 [ # # ]: 0 : if (!acpi_gbl_root_table_list.tables[i].pointer) { 89 : 0 : continue; 90 : : } 91 : : } 92 : : 93 : : /* Check for table match on all IDs */ 94 : : 95 : 0 : if (!memcmp 96 [ # # ]: 0 : (acpi_gbl_root_table_list.tables[i].pointer->signature, 97 [ # # ]: 0 : header.signature, ACPI_NAMESEG_SIZE) && (!oem_id[0] 98 : 0 : || 99 : 0 : !memcmp 100 : : (acpi_gbl_root_table_list. 101 : : tables[i]. 102 [ # # ]: 0 : pointer->oem_id, 103 : : header.oem_id, 104 : : ACPI_OEM_ID_SIZE)) 105 [ # # ]: 0 : && (!oem_table_id[0] 106 [ # # ]: 0 : || !memcmp(acpi_gbl_root_table_list.tables[i].pointer-> 107 : : oem_table_id, header.oem_table_id, 108 : : ACPI_OEM_TABLE_ID_SIZE))) { 109 : 0 : *table_index = i; 110 : : 111 : : ACPI_DEBUG_PRINT((ACPI_DB_TABLES, 112 : : "Found table [%4.4s]\n", 113 : 0 : header.signature)); 114 : 0 : goto unlock_and_exit; 115 : : } 116 : : } 117 : : status = AE_NOT_FOUND; 118 : : 119 : 0 : unlock_and_exit: 120 : 0 : (void)acpi_ut_release_mutex(ACPI_MTX_TABLES); 121 : 0 : return_ACPI_STATUS(status); 122 : : }