diff mbox

[U-Boot] part:efi: add bootable parameter in gpt command

Message ID 1447756613-24170-1-git-send-email-patrick.delaunay73@gmail.com
State Accepted
Delegated to: Tom Rini
Headers show

Commit Message

Patrick Delaunay Nov. 17, 2015, 10:36 a.m. UTC
The optional parameter bootable is added in gpt command to set the
partition attribute flag "Legacy BIOS bootable"

This flag is used in extlinux and so in with distro to select
the boot partition where is located the configuration file
(please check out doc/README.distro for details).

With this parameter, U-Boot can be used to create the boot partition
needed for device using distro.

example of use:

setenv partitions "name=u-boot,size=60MiB;name=boot,size=60Mib,bootable;\
                   name=rootfs,size=0"

> gpt write mmc 0 $partitions

> part list mmc 0

Partition Map for MMC device 0  --   Partition Type: EFI

Part	Start LBA	End LBA		Name
	Attributes
	Type GUID
	Partition GUID
  1	0x00000022	0x0001e021	"u-boot"
	attrs:	0x0000000000000000
	type:	ebd0a0a2-b9e5-4433-87c0-68b6b72699c7
	guid:	cceb0b18-39cb-d547-9db7-03b405fa77d4
  2	0x0001e022	0x0003c021	"boot"
	attrs:	0x0000000000000004
	type:	ebd0a0a2-b9e5-4433-87c0-68b6b72699c7
	guid:	d4981a2b-0478-544e-9607-7fd3c651068d
  3	0x0003c022	0x003a9fde	"rootfs"
	attrs:	0x0000000000000000
	type:	ebd0a0a2-b9e5-4433-87c0-68b6b72699c7
	guid:	6d6c9a36-e919-264d-a9ee-bd00379686c7

> part list mmc 0 -bootable devplist

> printenv devplist

devplist=2

Then the distro scripts will search extlinux in partition 2
and not in the first partition.

Signed-off-by: Patrick Delaunay <patrick.delaunay73@gmail.com>
---

 common/cmd_gpt.c | 38 ++++++++++++++++++++++++++++++++++++++
 disk/part_efi.c  |  3 +++
 doc/README.gpt   | 14 ++++++++++++++
 3 files changed, 55 insertions(+)

Comments

Tom Rini Nov. 23, 2015, 10:44 p.m. UTC | #1
On Tue, Nov 17, 2015 at 11:36:52AM +0100, Patrick Delaunay wrote:

> The optional parameter bootable is added in gpt command to set the
> partition attribute flag "Legacy BIOS bootable"
> 
> This flag is used in extlinux and so in with distro to select
> the boot partition where is located the configuration file
> (please check out doc/README.distro for details).
> 
> With this parameter, U-Boot can be used to create the boot partition
> needed for device using distro.
> 
> example of use:
> 
> setenv partitions "name=u-boot,size=60MiB;name=boot,size=60Mib,bootable;\
>                    name=rootfs,size=0"
> 
> > gpt write mmc 0 $partitions
> 
> > part list mmc 0
> 
> Partition Map for MMC device 0  --   Partition Type: EFI
> 
> Part	Start LBA	End LBA		Name
> 	Attributes
> 	Type GUID
> 	Partition GUID
>   1	0x00000022	0x0001e021	"u-boot"
> 	attrs:	0x0000000000000000
> 	type:	ebd0a0a2-b9e5-4433-87c0-68b6b72699c7
> 	guid:	cceb0b18-39cb-d547-9db7-03b405fa77d4
>   2	0x0001e022	0x0003c021	"boot"
> 	attrs:	0x0000000000000004
> 	type:	ebd0a0a2-b9e5-4433-87c0-68b6b72699c7
> 	guid:	d4981a2b-0478-544e-9607-7fd3c651068d
>   3	0x0003c022	0x003a9fde	"rootfs"
> 	attrs:	0x0000000000000000
> 	type:	ebd0a0a2-b9e5-4433-87c0-68b6b72699c7
> 	guid:	6d6c9a36-e919-264d-a9ee-bd00379686c7
> 
> > part list mmc 0 -bootable devplist
> 
> > printenv devplist
> 
> devplist=2
> 
> Then the distro scripts will search extlinux in partition 2
> and not in the first partition.
> 
> Signed-off-by: Patrick Delaunay <patrick.delaunay73@gmail.com>

Applied to u-boot/master, thanks!
diff mbox

Patch

diff --git a/common/cmd_gpt.c b/common/cmd_gpt.c
index e3c0297..2f152f6 100644
--- a/common/cmd_gpt.c
+++ b/common/cmd_gpt.c
@@ -118,6 +118,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!
  *
@@ -271,6 +305,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 ea9c615..ba6dec7 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 35902ce..8002442 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'
 
 2. From u-boot prompt type: