dm: spi: Change cs_info op to return -EINVAL for invalid cs num
[oweals/u-boot.git] / disk / part_efi.c
index d6bb53e6b5d89fc48dbb5c7012a728217b3cc215..51fa4a74ab25b3801400d9383641d110b62e5efb 100644 (file)
@@ -51,6 +51,8 @@ static int is_gpt_valid(struct blk_desc *dev_desc, u64 lba,
 static gpt_entry *alloc_read_gpt_entries(struct blk_desc *dev_desc,
                                         gpt_header *pgpt_head);
 static int is_pte_valid(gpt_entry * pte);
+static int find_valid_gpt(struct blk_desc *dev_desc, gpt_header *gpt_head,
+                         gpt_entry **pgpt_pte);
 
 static char *print_efiname(gpt_entry *pte)
 {
@@ -66,7 +68,7 @@ static char *print_efiname(gpt_entry *pte)
        return name;
 }
 
-static efi_guid_t system_guid = PARTITION_SYSTEM_GUID;
+static const efi_guid_t system_guid = PARTITION_SYSTEM_GUID;
 
 static inline int is_bootable(gpt_entry *p)
 {
@@ -192,23 +194,14 @@ int get_disk_guid(struct blk_desc * dev_desc, char *guid)
        unsigned char *guid_bin;
 
        /* This function validates AND fills in the GPT header and PTE */
-       if (is_gpt_valid(dev_desc, GPT_PRIMARY_PARTITION_TABLE_LBA,
-                        gpt_head, &gpt_pte) != 1) {
-               printf("%s: *** ERROR: Invalid GPT ***\n", __func__);
-               if (is_gpt_valid(dev_desc, dev_desc->lba - 1,
-                                gpt_head, &gpt_pte) != 1) {
-                       printf("%s: *** ERROR: Invalid Backup GPT ***\n",
-                              __func__);
-                       return -EINVAL;
-               } else {
-                       printf("%s: ***        Using Backup GPT ***\n",
-                              __func__);
-               }
-       }
+       if (find_valid_gpt(dev_desc, gpt_head, &gpt_pte) != 1)
+               return -EINVAL;
 
        guid_bin = gpt_head->disk_guid.b;
        uuid_bin_to_str(guid_bin, guid, UUID_STR_FORMAT_GUID);
 
+       /* Remember to free pte */
+       free(gpt_pte);
        return 0;
 }
 
@@ -221,19 +214,8 @@ void part_print_efi(struct blk_desc *dev_desc)
        unsigned char *uuid_bin;
 
        /* This function validates AND fills in the GPT header and PTE */
-       if (is_gpt_valid(dev_desc, GPT_PRIMARY_PARTITION_TABLE_LBA,
-                        gpt_head, &gpt_pte) != 1) {
-               printf("%s: *** ERROR: Invalid GPT ***\n", __func__);
-               if (is_gpt_valid(dev_desc, (dev_desc->lba - 1),
-                                gpt_head, &gpt_pte) != 1) {
-                       printf("%s: *** ERROR: Invalid Backup GPT ***\n",
-                              __func__);
-                       return;
-               } else {
-                       printf("%s: ***        Using Backup GPT ***\n",
-                              __func__);
-               }
-       }
+       if (find_valid_gpt(dev_desc, gpt_head, &gpt_pte) != 1)
+               return;
 
        debug("%s: gpt-entry at %p\n", __func__, gpt_pte);
 
@@ -282,19 +264,8 @@ int part_get_info_efi(struct blk_desc *dev_desc, int part,
        }
 
        /* This function validates AND fills in the GPT header and PTE */
-       if (is_gpt_valid(dev_desc, GPT_PRIMARY_PARTITION_TABLE_LBA,
-                       gpt_head, &gpt_pte) != 1) {
-               printf("%s: *** ERROR: Invalid GPT ***\n", __func__);
-               if (is_gpt_valid(dev_desc, (dev_desc->lba - 1),
-                                gpt_head, &gpt_pte) != 1) {
-                       printf("%s: *** ERROR: Invalid Backup GPT ***\n",
-                              __func__);
-                       return -1;
-               } else {
-                       printf("%s: ***        Using Backup GPT ***\n",
-                              __func__);
-               }
-       }
+       if (find_valid_gpt(dev_desc, gpt_head, &gpt_pte) != 1)
+               return -1;
 
        if (part > le32_to_cpu(gpt_head->num_partition_entries) ||
            !is_pte_valid(&gpt_pte[part - 1])) {
@@ -311,8 +282,8 @@ int part_get_info_efi(struct blk_desc *dev_desc, int part,
                     - info->start;
        info->blksz = dev_desc->blksz;
 
-       sprintf((char *)info->name, "%s",
-                       print_efiname(&gpt_pte[part - 1]));
+       snprintf((char *)info->name, sizeof(info->name), "%s",
+                print_efiname(&gpt_pte[part - 1]));
        strcpy((char *)info->type, "U-Boot");
        info->bootable = is_bootable(&gpt_pte[part - 1]);
 #if CONFIG_IS_ENABLED(PARTITION_UUIDS)
@@ -668,9 +639,18 @@ err:
        return ret;
 }
 
-static void gpt_convert_efi_name_to_char(char *s, efi_char16_t *es, int n)
+/**
+ * gpt_convert_efi_name_to_char() - convert u16 string to char string
+ *
+ * TODO: this conversion only supports ANSI characters
+ *
+ * @s: target buffer
+ * @es:        u16 string to be converted
+ * @n: size of target buffer
+ */
+static void gpt_convert_efi_name_to_char(char *s, void *es, int n)
 {
-       char *ess = (char *)es;
+       char *ess = es;
        int i, j;
 
        memset(s, '\0', n);
@@ -696,6 +676,10 @@ int gpt_verify_headers(struct blk_desc *dev_desc, gpt_header *gpt_head,
                       __func__);
                return -1;
        }
+
+       /* Free pte before allocating again */
+       free(*gpt_pte);
+
        if (is_gpt_valid(dev_desc, (dev_desc->lba - 1),
                         gpt_head, gpt_pte) != 1) {
                printf("%s: *** ERROR: Invalid Backup GPT ***\n",
@@ -924,7 +908,7 @@ static int is_pmbr_valid(legacy_mbr * mbr)
  * gpt is a GPT header ptr, filled on return.
  * ptes is a PTEs ptr, filled on return.
  *
- * Description: returns 1 if valid,  0 on error.
+ * Description: returns 1 if valid,  0 on error, 2 if ignored header
  * If valid, returns pointers to PTEs.
  */
 static int is_gpt_valid(struct blk_desc *dev_desc, u64 lba,
@@ -950,6 +934,12 @@ static int is_gpt_valid(struct blk_desc *dev_desc, u64 lba,
                return 0;
        }
 
+       /* Invalid but nothing to yell about. */
+       if (le64_to_cpu(pgpt_head->signature) == GPT_HEADER_CHROMEOS_IGNORE) {
+               debug("ChromeOS 'IGNOREME' GPT header found and ignored\n");
+               return 2;
+       }
+
        if (validate_gpt_header(pgpt_head, (lbaint_t)lba, dev_desc->lba))
                return 0;
 
@@ -981,6 +971,40 @@ static int is_gpt_valid(struct blk_desc *dev_desc, u64 lba,
        return 1;
 }
 
+/**
+ * find_valid_gpt() - finds a valid GPT header and PTEs
+ *
+ * gpt is a GPT header ptr, filled on return.
+ * ptes is a PTEs ptr, filled on return.
+ *
+ * Description: returns 1 if found a valid gpt,  0 on error.
+ * If valid, returns pointers to PTEs.
+ */
+static int find_valid_gpt(struct blk_desc *dev_desc, gpt_header *gpt_head,
+                         gpt_entry **pgpt_pte)
+{
+       int r;
+
+       r = is_gpt_valid(dev_desc, GPT_PRIMARY_PARTITION_TABLE_LBA, gpt_head,
+                        pgpt_pte);
+
+       if (r != 1) {
+               if (r != 2)
+                       printf("%s: *** ERROR: Invalid GPT ***\n", __func__);
+
+               if (is_gpt_valid(dev_desc, (dev_desc->lba - 1), gpt_head,
+                                pgpt_pte) != 1) {
+                       printf("%s: *** ERROR: Invalid Backup GPT ***\n",
+                              __func__);
+                       return 0;
+               }
+               if (r != 2)
+                       printf("%s: ***        Using Backup GPT ***\n",
+                              __func__);
+       }
+       return 1;
+}
+
 /**
  * alloc_read_gpt_entries(): reads partition entries from disk
  * @dev_desc