Orange Pi5 kernel

Deprecated Linux kernel 5.10.110 for OrangePi 5/5B/5+ boards

3 Commits   0 Branches   0 Tags
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   1) // SPDX-License-Identifier: BSD-3-Clause OR GPL-2.0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   2) /******************************************************************************
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   3)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   4)  * Module Name: tbxfroot - Find the root ACPI table (RSDT)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   5)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   6)  * Copyright (C) 2000 - 2020, Intel Corp.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   7)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   8)  *****************************************************************************/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   9) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  10) #include <acpi/acpi.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  11) #include "accommon.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  12) #include "actables.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  13) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  14) #define _COMPONENT          ACPI_TABLES
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  15) ACPI_MODULE_NAME("tbxfroot")
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  16) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  17) /*******************************************************************************
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  18)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  19)  * FUNCTION:    acpi_tb_get_rsdp_length
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  20)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  21)  * PARAMETERS:  rsdp                - Pointer to RSDP
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  22)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  23)  * RETURN:      Table length
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  24)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  25)  * DESCRIPTION: Get the length of the RSDP
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  26)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  27)  ******************************************************************************/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  28) u32 acpi_tb_get_rsdp_length(struct acpi_table_rsdp *rsdp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  29) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  30) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  31) 	if (!ACPI_VALIDATE_RSDP_SIG(rsdp->signature)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  32) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  33) 		/* BAD Signature */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  34) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  35) 		return (0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  36) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  37) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  38) 	/* "Length" field is available if table version >= 2 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  39) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  40) 	if (rsdp->revision >= 2) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  41) 		return (rsdp->length);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  42) 	} else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  43) 		return (ACPI_RSDP_CHECKSUM_LENGTH);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  44) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  45) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  46) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  47) /*******************************************************************************
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  48)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  49)  * FUNCTION:    acpi_tb_validate_rsdp
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  50)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  51)  * PARAMETERS:  rsdp                - Pointer to unvalidated RSDP
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  52)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  53)  * RETURN:      Status
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  54)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  55)  * DESCRIPTION: Validate the RSDP (ptr)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  56)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  57)  ******************************************************************************/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  58) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  59) acpi_status acpi_tb_validate_rsdp(struct acpi_table_rsdp *rsdp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  60) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  61) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  62) 	/*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  63) 	 * The signature and checksum must both be correct
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  64) 	 *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  65) 	 * Note: Sometimes there exists more than one RSDP in memory; the valid
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  66) 	 * RSDP has a valid checksum, all others have an invalid checksum.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  67) 	 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  68) 	if (!ACPI_VALIDATE_RSDP_SIG(rsdp->signature)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  69) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  70) 		/* Nope, BAD Signature */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  71) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  72) 		return (AE_BAD_SIGNATURE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  73) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  74) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  75) 	/* Check the standard checksum */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  76) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  77) 	if (acpi_tb_checksum((u8 *) rsdp, ACPI_RSDP_CHECKSUM_LENGTH) != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  78) 		return (AE_BAD_CHECKSUM);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  79) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  80) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  81) 	/* Check extended checksum if table version >= 2 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  82) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  83) 	if ((rsdp->revision >= 2) &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  84) 	    (acpi_tb_checksum((u8 *) rsdp, ACPI_RSDP_XCHECKSUM_LENGTH) != 0)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  85) 		return (AE_BAD_CHECKSUM);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  86) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  87) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  88) 	return (AE_OK);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  89) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  90) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  91) /*******************************************************************************
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  92)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  93)  * FUNCTION:    acpi_find_root_pointer
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  94)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  95)  * PARAMETERS:  table_address           - Where the table pointer is returned
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  96)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  97)  * RETURN:      Status, RSDP physical address
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  98)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  99)  * DESCRIPTION: Search lower 1Mbyte of memory for the root system descriptor
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 100)  *              pointer structure. If it is found, set *RSDP to point to it.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 101)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 102)  * NOTE1:       The RSDP must be either in the first 1K of the Extended
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 103)  *              BIOS Data Area or between E0000 and FFFFF (From ACPI Spec.)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 104)  *              Only a 32-bit physical address is necessary.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 105)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 106)  * NOTE2:       This function is always available, regardless of the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 107)  *              initialization state of the rest of ACPI.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 108)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 109)  ******************************************************************************/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 110) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 111) acpi_status ACPI_INIT_FUNCTION
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 112) acpi_find_root_pointer(acpi_physical_address *table_address)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 113) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 114) 	u8 *table_ptr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 115) 	u8 *mem_rover;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 116) 	u32 physical_address;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 117) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 118) 	ACPI_FUNCTION_TRACE(acpi_find_root_pointer);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 119) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 120) 	/* 1a) Get the location of the Extended BIOS Data Area (EBDA) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 121) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 122) 	table_ptr = acpi_os_map_memory((acpi_physical_address)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 123) 				       ACPI_EBDA_PTR_LOCATION,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 124) 				       ACPI_EBDA_PTR_LENGTH);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 125) 	if (!table_ptr) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 126) 		ACPI_ERROR((AE_INFO,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 127) 			    "Could not map memory at 0x%8.8X for length %u",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 128) 			    ACPI_EBDA_PTR_LOCATION, ACPI_EBDA_PTR_LENGTH));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 129) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 130) 		return_ACPI_STATUS(AE_NO_MEMORY);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 131) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 132) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 133) 	ACPI_MOVE_16_TO_32(&physical_address, table_ptr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 134) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 135) 	/* Convert segment part to physical address */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 136) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 137) 	physical_address <<= 4;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 138) 	acpi_os_unmap_memory(table_ptr, ACPI_EBDA_PTR_LENGTH);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 139) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 140) 	/* EBDA present? */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 141) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 142) 	if (physical_address > 0x400) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 143) 		/*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 144) 		 * 1b) Search EBDA paragraphs (EBDA is required to be a
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 145) 		 *     minimum of 1K length)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 146) 		 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 147) 		table_ptr = acpi_os_map_memory((acpi_physical_address)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 148) 					       physical_address,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 149) 					       ACPI_EBDA_WINDOW_SIZE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 150) 		if (!table_ptr) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 151) 			ACPI_ERROR((AE_INFO,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 152) 				    "Could not map memory at 0x%8.8X for length %u",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 153) 				    physical_address, ACPI_EBDA_WINDOW_SIZE));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 154) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 155) 			return_ACPI_STATUS(AE_NO_MEMORY);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 156) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 157) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 158) 		mem_rover =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 159) 		    acpi_tb_scan_memory_for_rsdp(table_ptr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 160) 						 ACPI_EBDA_WINDOW_SIZE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 161) 		acpi_os_unmap_memory(table_ptr, ACPI_EBDA_WINDOW_SIZE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 162) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 163) 		if (mem_rover) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 164) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 165) 			/* Return the physical address */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 166) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 167) 			physical_address +=
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 168) 			    (u32) ACPI_PTR_DIFF(mem_rover, table_ptr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 169) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 170) 			*table_address =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 171) 			    (acpi_physical_address)physical_address;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 172) 			return_ACPI_STATUS(AE_OK);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 173) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 174) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 175) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 176) 	/*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 177) 	 * 2) Search upper memory: 16-byte boundaries in E0000h-FFFFFh
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 178) 	 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 179) 	table_ptr = acpi_os_map_memory((acpi_physical_address)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 180) 				       ACPI_HI_RSDP_WINDOW_BASE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 181) 				       ACPI_HI_RSDP_WINDOW_SIZE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 182) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 183) 	if (!table_ptr) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 184) 		ACPI_ERROR((AE_INFO,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 185) 			    "Could not map memory at 0x%8.8X for length %u",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 186) 			    ACPI_HI_RSDP_WINDOW_BASE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 187) 			    ACPI_HI_RSDP_WINDOW_SIZE));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 188) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 189) 		return_ACPI_STATUS(AE_NO_MEMORY);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 190) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 191) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 192) 	mem_rover =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 193) 	    acpi_tb_scan_memory_for_rsdp(table_ptr, ACPI_HI_RSDP_WINDOW_SIZE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 194) 	acpi_os_unmap_memory(table_ptr, ACPI_HI_RSDP_WINDOW_SIZE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 195) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 196) 	if (mem_rover) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 197) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 198) 		/* Return the physical address */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 199) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 200) 		physical_address = (u32)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 201) 		    (ACPI_HI_RSDP_WINDOW_BASE +
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 202) 		     ACPI_PTR_DIFF(mem_rover, table_ptr));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 203) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 204) 		*table_address = (acpi_physical_address)physical_address;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 205) 		return_ACPI_STATUS(AE_OK);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 206) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 207) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 208) 	/* A valid RSDP was not found */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 209) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 210) 	ACPI_BIOS_ERROR((AE_INFO, "A valid RSDP was not found"));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 211) 	return_ACPI_STATUS(AE_NOT_FOUND);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 212) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 213) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 214) ACPI_EXPORT_SYMBOL_INIT(acpi_find_root_pointer)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 215) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 216) /*******************************************************************************
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 217)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 218)  * FUNCTION:    acpi_tb_scan_memory_for_rsdp
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 219)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 220)  * PARAMETERS:  start_address       - Starting pointer for search
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 221)  *              length              - Maximum length to search
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 222)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 223)  * RETURN:      Pointer to the RSDP if found, otherwise NULL.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 224)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 225)  * DESCRIPTION: Search a block of memory for the RSDP signature
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 226)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 227)  ******************************************************************************/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 228) u8 *acpi_tb_scan_memory_for_rsdp(u8 *start_address, u32 length)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 229) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 230) 	acpi_status status;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 231) 	u8 *mem_rover;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 232) 	u8 *end_address;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 233) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 234) 	ACPI_FUNCTION_TRACE(tb_scan_memory_for_rsdp);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 235) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 236) 	end_address = start_address + length;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 237) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 238) 	/* Search from given start address for the requested length */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 239) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 240) 	for (mem_rover = start_address; mem_rover < end_address;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 241) 	     mem_rover += ACPI_RSDP_SCAN_STEP) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 242) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 243) 		/* The RSDP signature and checksum must both be correct */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 244) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 245) 		status =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 246) 		    acpi_tb_validate_rsdp(ACPI_CAST_PTR
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 247) 					  (struct acpi_table_rsdp, mem_rover));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 248) 		if (ACPI_SUCCESS(status)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 249) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 250) 			/* Sig and checksum valid, we have found a real RSDP */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 251) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 252) 			ACPI_DEBUG_PRINT((ACPI_DB_INFO,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 253) 					  "RSDP located at physical address %p\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 254) 					  mem_rover));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 255) 			return_PTR(mem_rover);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 256) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 257) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 258) 		/* No sig match or bad checksum, keep searching */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 259) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 260) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 261) 	/* Searched entire block, no RSDP was found */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 262) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 263) 	ACPI_DEBUG_PRINT((ACPI_DB_INFO,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 264) 			  "Searched entire block from %p, valid RSDP was not found\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 265) 			  start_address));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 266) 	return_PTR(NULL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 267) }