xref: /openbmc/linux/drivers/acpi/acpica/utuuid.c (revision 612c2932)
195857638SErik Schmauss // SPDX-License-Identifier: BSD-3-Clause OR GPL-2.0
273bbca04SBob Moore /******************************************************************************
373bbca04SBob Moore  *
473bbca04SBob Moore  * Module Name: utuuid -- UUID support functions
573bbca04SBob Moore  *
6*612c2932SBob Moore  * Copyright (C) 2000 - 2023, Intel Corp.
773bbca04SBob Moore  *
895857638SErik Schmauss  *****************************************************************************/
973bbca04SBob Moore 
1073bbca04SBob Moore #include <acpi/acpi.h>
1173bbca04SBob Moore #include "accommon.h"
1273bbca04SBob Moore 
1373bbca04SBob Moore #define _COMPONENT          ACPI_COMPILER
1473bbca04SBob Moore ACPI_MODULE_NAME("utuuid")
1573bbca04SBob Moore 
166306bf88SLv Zheng #if (defined ACPI_ASL_COMPILER || defined ACPI_EXEC_APP || defined ACPI_HELP_APP)
1773bbca04SBob Moore /*
1873bbca04SBob Moore  * UUID support functions.
1973bbca04SBob Moore  *
2073bbca04SBob Moore  * This table is used to convert an input UUID ascii string to a 16 byte
2173bbca04SBob Moore  * buffer and the reverse. The table maps a UUID buffer index 0-15 to
2273bbca04SBob Moore  * the index within the 36-byte UUID string where the associated 2-byte
2373bbca04SBob Moore  * hex value can be found.
2473bbca04SBob Moore  *
2573bbca04SBob Moore  * 36-byte UUID strings are of the form:
2673bbca04SBob Moore  *     aabbccdd-eeff-gghh-iijj-kkllmmnnoopp
2773bbca04SBob Moore  * Where aa-pp are one byte hex numbers, made up of two hex digits
2873bbca04SBob Moore  *
2973bbca04SBob Moore  * Note: This table is basically the inverse of the string-to-offset table
3073bbca04SBob Moore  * found in the ACPI spec in the description of the to_UUID macro.
3173bbca04SBob Moore  */
3273bbca04SBob Moore const u8 acpi_gbl_map_to_uuid_offset[UUID_BUFFER_LENGTH] = {
3373bbca04SBob Moore 	6, 4, 2, 0, 11, 9, 16, 14, 19, 21, 24, 26, 28, 30, 32, 34
3473bbca04SBob Moore };
3573bbca04SBob Moore 
3673bbca04SBob Moore /*******************************************************************************
3773bbca04SBob Moore  *
3873bbca04SBob Moore  * FUNCTION:    acpi_ut_convert_string_to_uuid
3973bbca04SBob Moore  *
4073bbca04SBob Moore  * PARAMETERS:  in_string           - 36-byte formatted UUID string
4173bbca04SBob Moore  *              uuid_buffer         - Where the 16-byte UUID buffer is returned
4273bbca04SBob Moore  *
4373bbca04SBob Moore  * RETURN:      None. Output data is returned in the uuid_buffer
4473bbca04SBob Moore  *
4573bbca04SBob Moore  * DESCRIPTION: Convert a 36-byte formatted UUID string to 16-byte UUID buffer
4673bbca04SBob Moore  *
4773bbca04SBob Moore  ******************************************************************************/
4873bbca04SBob Moore 
acpi_ut_convert_string_to_uuid(char * in_string,u8 * uuid_buffer)4973bbca04SBob Moore void acpi_ut_convert_string_to_uuid(char *in_string, u8 *uuid_buffer)
5073bbca04SBob Moore {
5173bbca04SBob Moore 	u32 i;
5273bbca04SBob Moore 
5373bbca04SBob Moore 	for (i = 0; i < UUID_BUFFER_LENGTH; i++) {
5473bbca04SBob Moore 		uuid_buffer[i] =
5573bbca04SBob Moore 		    (acpi_ut_ascii_char_to_hex
5673bbca04SBob Moore 		     (in_string[acpi_gbl_map_to_uuid_offset[i]]) << 4);
5773bbca04SBob Moore 
5873bbca04SBob Moore 		uuid_buffer[i] |=
5973bbca04SBob Moore 		    acpi_ut_ascii_char_to_hex(in_string
6073bbca04SBob Moore 					      [acpi_gbl_map_to_uuid_offset[i] +
6173bbca04SBob Moore 					       1]);
6273bbca04SBob Moore 	}
6373bbca04SBob Moore }
6404da290dSErik Kaneda 
6504da290dSErik Kaneda /*******************************************************************************
6604da290dSErik Kaneda  *
6704da290dSErik Kaneda  * FUNCTION:    acpi_ut_convert_uuid_to_string
6804da290dSErik Kaneda  *
6904da290dSErik Kaneda  * PARAMETERS:  uuid_buffer         - 16-byte UUID buffer
7004da290dSErik Kaneda  *              out_string          - 36-byte formatted UUID string
7104da290dSErik Kaneda  *
7204da290dSErik Kaneda  * RETURN:      Status
7304da290dSErik Kaneda  *
7404da290dSErik Kaneda  * DESCRIPTION: Convert 16-byte UUID buffer to 36-byte formatted UUID string
7504da290dSErik Kaneda  *              out_string must be 37 bytes to include null terminator.
7604da290dSErik Kaneda  *
7704da290dSErik Kaneda  ******************************************************************************/
7804da290dSErik Kaneda 
acpi_ut_convert_uuid_to_string(char * uuid_buffer,char * out_string)7904da290dSErik Kaneda acpi_status acpi_ut_convert_uuid_to_string(char *uuid_buffer, char *out_string)
8004da290dSErik Kaneda {
8104da290dSErik Kaneda 	u32 i;
8204da290dSErik Kaneda 
8304da290dSErik Kaneda 	if (!uuid_buffer || !out_string) {
8404da290dSErik Kaneda 		return (AE_BAD_PARAMETER);
8504da290dSErik Kaneda 	}
8604da290dSErik Kaneda 
8704da290dSErik Kaneda 	for (i = 0; i < UUID_BUFFER_LENGTH; i++) {
8804da290dSErik Kaneda 		out_string[acpi_gbl_map_to_uuid_offset[i]] =
8904da290dSErik Kaneda 		    acpi_ut_hex_to_ascii_char(uuid_buffer[i], 4);
9004da290dSErik Kaneda 
9104da290dSErik Kaneda 		out_string[acpi_gbl_map_to_uuid_offset[i] + 1] =
9204da290dSErik Kaneda 		    acpi_ut_hex_to_ascii_char(uuid_buffer[i], 0);
9304da290dSErik Kaneda 	}
9404da290dSErik Kaneda 
9504da290dSErik Kaneda 	/* Insert required hyphens (dashes) */
9604da290dSErik Kaneda 
9704da290dSErik Kaneda 	out_string[UUID_HYPHEN1_OFFSET] =
9804da290dSErik Kaneda 	    out_string[UUID_HYPHEN2_OFFSET] =
9904da290dSErik Kaneda 	    out_string[UUID_HYPHEN3_OFFSET] =
10004da290dSErik Kaneda 	    out_string[UUID_HYPHEN4_OFFSET] = '-';
10104da290dSErik Kaneda 
10204da290dSErik Kaneda 	out_string[UUID_STRING_LENGTH] = 0;	/* Null terminate */
10304da290dSErik Kaneda 	return (AE_OK);
10404da290dSErik Kaneda }
1056306bf88SLv Zheng #endif
106