rockchip: rk3328: rock64 - fix gen3 SPL hang
[oweals/u-boot.git] / lib / uuid.c
index 1536c027da27c82df8953be81207296c979a1111..e62d5ca2643f60b1aedee970af95e353a5d10b73 100644 (file)
@@ -1,10 +1,14 @@
+// SPDX-License-Identifier: GPL-2.0+
 /*
  * Copyright 2011 Calxeda, Inc.
- *
- * SPDX-License-Identifier:    GPL-2.0+
  */
 
 #include <common.h>
+#include <command.h>
+#include <env.h>
+#include <rand.h>
+#include <time.h>
+#include <uuid.h>
 #include <linux/ctype.h>
 #include <errno.h>
 #include <common.h>
@@ -120,7 +124,7 @@ int uuid_guid_get_bin(const char *guid_str, unsigned char *guid_bin)
  * @param guid_bin - pointer to string with partition type guid [16B]
  * @param guid_str - pointer to allocated partition type string [7B]
  */
-int uuid_guid_get_str(unsigned char *guid_bin, char *guid_str)
+int uuid_guid_get_str(const unsigned char *guid_bin, char *guid_str)
 {
        int i;
 
@@ -142,7 +146,8 @@ int uuid_guid_get_str(unsigned char *guid_bin, char *guid_str)
  * @param uuid_bin - pointer to allocated array for big endian output [16B]
  * @str_format     - UUID string format: 0 - UUID; 1 - GUID
  */
-int uuid_str_to_bin(char *uuid_str, unsigned char *uuid_bin, int str_format)
+int uuid_str_to_bin(const char *uuid_str, unsigned char *uuid_bin,
+                   int str_format)
 {
        uint16_t tmp16;
        uint32_t tmp32;
@@ -188,17 +193,20 @@ int uuid_str_to_bin(char *uuid_str, unsigned char *uuid_bin, int str_format)
 /*
  * uuid_bin_to_str() - convert big endian binary data to string UUID or GUID.
  *
- * @param uuid_bin - pointer to binary data of UUID (big endian) [16B]
- * @param uuid_str - pointer to allocated array for output string [37B]
- * @str_format     - UUID string format: 0 - UUID; 1 - GUID
+ * @param uuid_bin:    pointer to binary data of UUID (big endian) [16B]
+ * @param uuid_str:    pointer to allocated array for output string [37B]
+ * @str_format:                bit 0: 0 - UUID; 1 - GUID
+ *                     bit 1: 0 - lower case; 2 - upper case
  */
-void uuid_bin_to_str(unsigned char *uuid_bin, char *uuid_str, int str_format)
+void uuid_bin_to_str(const unsigned char *uuid_bin, char *uuid_str,
+                    int str_format)
 {
        const u8 uuid_char_order[UUID_BIN_LEN] = {0, 1, 2, 3, 4, 5, 6, 7, 8,
                                                  9, 10, 11, 12, 13, 14, 15};
        const u8 guid_char_order[UUID_BIN_LEN] = {3, 2, 1, 0, 5, 4, 7, 6, 8,
                                                  9, 10, 11, 12, 13, 14, 15};
        const u8 *char_order;
+       const char *format;
        int i;
 
        /*
@@ -206,13 +214,17 @@ void uuid_bin_to_str(unsigned char *uuid_bin, char *uuid_str, int str_format)
         * 4B-2B-2B-2B-6B
         * be be be be be
         */
-       if (str_format == UUID_STR_FORMAT_STD)
+       if (str_format & UUID_STR_FORMAT_GUID)
+               char_order = guid_char_order;
+       else
                char_order = uuid_char_order;
+       if (str_format & UUID_STR_UPPER_CASE)
+               format = "%02X";
        else
-               char_order = guid_char_order;
+               format = "%02x";
 
        for (i = 0; i < 16; i++) {
-               sprintf(uuid_str, "%02x", uuid_bin[char_order[i]]);
+               sprintf(uuid_str, format, uuid_bin[char_order[i]]);
                uuid_str += 2;
                switch (i) {
                case 3:
@@ -235,23 +247,25 @@ void uuid_bin_to_str(unsigned char *uuid_bin, char *uuid_str, int str_format)
 #if defined(CONFIG_RANDOM_UUID) || defined(CONFIG_CMD_UUID)
 void gen_rand_uuid(unsigned char *uuid_bin)
 {
-       struct uuid uuid;
-       unsigned int *ptr = (unsigned int *)&uuid;
+       u32 ptr[4];
+       struct uuid *uuid = (struct uuid *)ptr;
        int i;
 
+       srand(get_ticks() + rand());
+
        /* Set all fields randomly */
-       for (i = 0; i < sizeof(struct uuid) / sizeof(*ptr); i++)
-               *(ptr + i) = cpu_to_be32(rand());
+       for (i = 0; i < 4; i++)
+               ptr[i] = rand();
 
-       clrsetbits_be16(&uuid.time_hi_and_version,
+       clrsetbits_be16(&uuid->time_hi_and_version,
                        UUID_VERSION_MASK,
                        UUID_VERSION << UUID_VERSION_SHIFT);
 
-       clrsetbits_8(&uuid.clock_seq_hi_and_reserved,
+       clrsetbits_8(&uuid->clock_seq_hi_and_reserved,
                     UUID_VARIANT_MASK,
                     UUID_VARIANT << UUID_VARIANT_SHIFT);
 
-       memcpy(uuid_bin, &uuid, sizeof(struct uuid));
+       memcpy(uuid_bin, uuid, 16);
 }
 
 /*
@@ -272,8 +286,8 @@ void gen_rand_uuid_str(char *uuid_str, int str_format)
        uuid_bin_to_str(uuid_bin, uuid_str, str_format);
 }
 
-#ifdef CONFIG_CMD_UUID
-int do_uuid(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
+#if !defined(CONFIG_SPL_BUILD) && defined(CONFIG_CMD_UUID)
+int do_uuid(struct cmd_tbl *cmdtp, int flag, int argc, char *const argv[])
 {
        char uuid[UUID_STR_LEN + 1];
        int str_format;