summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--common/cmd_gpt.c38
-rw-r--r--disk/part_efi.c3
-rw-r--r--doc/README.gpt14
3 files changed, 55 insertions, 0 deletions
diff --git a/common/cmd_gpt.c b/common/cmd_gpt.c
index 460809c175..d94d5530bc 100644
--- a/common/cmd_gpt.c
+++ b/common/cmd_gpt.c
@@ -122,6 +122,40 @@ static char *extract_val(const char *str, const char *key)
}
/**
+ * found_key(): Found key without value in parameter list (comma separated).
+ *
+ * @param str - pointer to string with key
+ * @param key - pointer to the key to search for
+ *
+ * @return - true on found key
+ */
+static bool found_key(const char *str, const char *key)
+{
+ char *k;
+ char *s, *strcopy;
+ bool result = false;
+
+ strcopy = strdup(str);
+ if (!strcopy)
+ return NULL;
+
+ s = strcopy;
+ while (s) {
+ k = strsep(&s, ",");
+ if (!k)
+ break;
+ if (strcmp(k, key) == 0) {
+ result = true;
+ break;
+ }
+ }
+
+ free(strcopy);
+
+ return result;
+}
+
+/**
* set_gpt_info(): Fill partition information from string
* function allocates memory, remember to free!
*
@@ -275,6 +309,10 @@ static int set_gpt_info(block_dev_desc_t *dev_desc,
parts[i].start = lldiv(start_ll, dev_desc->blksz);
free(val);
}
+
+ /* bootable */
+ if (found_key(tok, "bootable"))
+ parts[i].bootable = 1;
}
*parts_count = p_count;
diff --git a/disk/part_efi.c b/disk/part_efi.c
index 40f0b361b4..b1e01558a6 100644
--- a/disk/part_efi.c
+++ b/disk/part_efi.c
@@ -493,6 +493,9 @@ int gpt_fill_pte(gpt_header *gpt_h, gpt_entry *gpt_e,
memset(&gpt_e[i].attributes, 0,
sizeof(gpt_entry_attributes));
+ if (partitions[i].bootable)
+ gpt_e[i].attributes.fields.legacy_bios_bootable = 1;
+
/* partition name */
efiname_len = sizeof(gpt_e[i].partition_name)
/ sizeof(efi_char16_t);
diff --git a/doc/README.gpt b/doc/README.gpt
index db439f9f28..a6f6de6a0f 100644
--- a/doc/README.gpt
+++ b/doc/README.gpt
@@ -142,6 +142,10 @@ of the Primary.
Attribute flags:
Bit 0 - System partition
+ Bit 1 - Hide from EFI
+ Bit 2 - Legacy BIOS bootable
+ Bit 48-63 - Defined and used by the individual partition type
+ For Basic data partition :
Bit 60 - Read-only
Bit 62 - Hidden
Bit 63 - Not mount
@@ -161,11 +165,21 @@ To restore GUID partition table one needs to:
The fields 'name' and 'size' are mandatory for every partition.
The field 'start' is optional.
+ If field 'size' of the last partition is 0, the partiton is extended
+ up to the end of the device.
+
The fields 'uuid' and 'uuid_disk' are optional if CONFIG_RANDOM_UUID is
enabled. A random uuid will be used if omitted or they point to an empty/
non-existent environment variable. The environment variable will be set to
the generated UUID.
+ The field 'bootable' is optional, it is used to mark the GPT partition
+ bootable (set attribute flags "Legacy BIOS bootable").
+ "name=u-boot,size=60MiB;name=boot,size=60Mib,bootable;name=rootfs,size=0"
+ It can be used to locate bootable disks with command
+ "part list <interface> <dev> -bootable <varname>",
+ please check out doc/README.distro for use.
+
2. Define 'CONFIG_EFI_PARTITION' and 'CONFIG_CMD_GPT'
3. From u-boot prompt type:
OpenPOWER on IntegriCloud