xref: /openbmc/linux/drivers/acpi/acpica/uthex.c (revision 612c2932)
195857638SErik Schmauss // SPDX-License-Identifier: BSD-3-Clause OR GPL-2.0
273bbca04SBob Moore /******************************************************************************
373bbca04SBob Moore  *
473bbca04SBob Moore  * Module Name: uthex -- Hex/ASCII 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("uthex")
1573bbca04SBob Moore 
1673bbca04SBob Moore /* Hex to ASCII conversion table */
17c118abc5SLABBE Corentin static const char acpi_gbl_hex_to_ascii[] = {
1873bbca04SBob Moore 	'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D',
1973bbca04SBob Moore 	    'E', 'F'
2073bbca04SBob Moore };
2173bbca04SBob Moore 
2273bbca04SBob Moore /*******************************************************************************
2373bbca04SBob Moore  *
2473bbca04SBob Moore  * FUNCTION:    acpi_ut_hex_to_ascii_char
2573bbca04SBob Moore  *
2673bbca04SBob Moore  * PARAMETERS:  integer             - Contains the hex digit
2773bbca04SBob Moore  *              position            - bit position of the digit within the
2873bbca04SBob Moore  *                                    integer (multiple of 4)
2973bbca04SBob Moore  *
3073bbca04SBob Moore  * RETURN:      The converted Ascii character
3173bbca04SBob Moore  *
3273bbca04SBob Moore  * DESCRIPTION: Convert a hex digit to an Ascii character
3373bbca04SBob Moore  *
3473bbca04SBob Moore  ******************************************************************************/
3573bbca04SBob Moore 
acpi_ut_hex_to_ascii_char(u64 integer,u32 position)3673bbca04SBob Moore char acpi_ut_hex_to_ascii_char(u64 integer, u32 position)
3773bbca04SBob Moore {
3865082bfcSLv Zheng 	u64 index;
3973bbca04SBob Moore 
4065082bfcSLv Zheng 	acpi_ut_short_shift_right(integer, position, &index);
4165082bfcSLv Zheng 	return (acpi_gbl_hex_to_ascii[index & 0xF]);
4273bbca04SBob Moore }
4373bbca04SBob Moore 
4473bbca04SBob Moore /*******************************************************************************
4573bbca04SBob Moore  *
465ebd2eaaSBob Moore  * FUNCTION:    acpi_ut_ascii_to_hex_byte
475ebd2eaaSBob Moore  *
485ebd2eaaSBob Moore  * PARAMETERS:  two_ascii_chars             - Pointer to two ASCII characters
495ebd2eaaSBob Moore  *              return_byte                 - Where converted byte is returned
505ebd2eaaSBob Moore  *
515ebd2eaaSBob Moore  * RETURN:      Status and converted hex byte
525ebd2eaaSBob Moore  *
535ebd2eaaSBob Moore  * DESCRIPTION: Perform ascii-to-hex translation, exactly two ASCII characters
545ebd2eaaSBob Moore  *              to a single converted byte value.
555ebd2eaaSBob Moore  *
565ebd2eaaSBob Moore  ******************************************************************************/
575ebd2eaaSBob Moore 
acpi_ut_ascii_to_hex_byte(char * two_ascii_chars,u8 * return_byte)585ebd2eaaSBob Moore acpi_status acpi_ut_ascii_to_hex_byte(char *two_ascii_chars, u8 *return_byte)
595ebd2eaaSBob Moore {
605ebd2eaaSBob Moore 
615ebd2eaaSBob Moore 	/* Both ASCII characters must be valid hex digits */
625ebd2eaaSBob Moore 
63eacce4b6SBob Moore 	if (!isxdigit((int)two_ascii_chars[0]) ||
64eacce4b6SBob Moore 	    !isxdigit((int)two_ascii_chars[1])) {
655ebd2eaaSBob Moore 		return (AE_BAD_HEX_CONSTANT);
665ebd2eaaSBob Moore 	}
675ebd2eaaSBob Moore 
685ebd2eaaSBob Moore 	*return_byte =
695ebd2eaaSBob Moore 	    acpi_ut_ascii_char_to_hex(two_ascii_chars[1]) |
705ebd2eaaSBob Moore 	    (acpi_ut_ascii_char_to_hex(two_ascii_chars[0]) << 4);
715ebd2eaaSBob Moore 
725ebd2eaaSBob Moore 	return (AE_OK);
735ebd2eaaSBob Moore }
745ebd2eaaSBob Moore 
755ebd2eaaSBob Moore /*******************************************************************************
765ebd2eaaSBob Moore  *
7704f8e384SBob Moore  * FUNCTION:    acpi_ut_ascii_char_to_hex
7873bbca04SBob Moore  *
795ebd2eaaSBob Moore  * PARAMETERS:  hex_char                - Hex character in Ascii. Must be:
805ebd2eaaSBob Moore  *                                        0-9 or A-F or a-f
8173bbca04SBob Moore  *
8273bbca04SBob Moore  * RETURN:      The binary value of the ascii/hex character
8373bbca04SBob Moore  *
8473bbca04SBob Moore  * DESCRIPTION: Perform ascii-to-hex translation
8573bbca04SBob Moore  *
8673bbca04SBob Moore  ******************************************************************************/
8773bbca04SBob Moore 
acpi_ut_ascii_char_to_hex(int hex_char)8873bbca04SBob Moore u8 acpi_ut_ascii_char_to_hex(int hex_char)
8973bbca04SBob Moore {
9073bbca04SBob Moore 
915ebd2eaaSBob Moore 	/* Values 0-9 */
925ebd2eaaSBob Moore 
935ebd2eaaSBob Moore 	if (hex_char <= '9') {
945ebd2eaaSBob Moore 		return ((u8)(hex_char - '0'));
9573bbca04SBob Moore 	}
9673bbca04SBob Moore 
975ebd2eaaSBob Moore 	/* Upper case A-F */
985ebd2eaaSBob Moore 
995ebd2eaaSBob Moore 	if (hex_char <= 'F') {
10073bbca04SBob Moore 		return ((u8)(hex_char - 0x37));
10173bbca04SBob Moore 	}
10273bbca04SBob Moore 
1035ebd2eaaSBob Moore 	/* Lower case a-f */
1045ebd2eaaSBob Moore 
10573bbca04SBob Moore 	return ((u8)(hex_char - 0x57));
10673bbca04SBob Moore }
107