diff mbox series

[v2,4/8] cmd: gpt: Add gpt_partition_bootable variable

Message ID 20230823164755.2874792-5-JPEWhacker@gmail.com
State Changes Requested
Delegated to: Tom Rini
Headers show
Series cmd: gpt: GPT manipulation improvements | expand

Commit Message

Joshua Watt Aug. 23, 2023, 4:47 p.m. UTC
Adds an additional variable called gpt_partition_bootable that indicates
if the given partition is bootable or not.

Signed-off-by: Joshua Watt <JPEWhacker@gmail.com>
---
 cmd/gpt.c                 |  9 +++++++--
 doc/usage/cmd/gpt.rst     |  3 +++
 test/py/tests/test_gpt.py | 33 +++++++++++++++++++++++++++++++++
 3 files changed, 43 insertions(+), 2 deletions(-)

Comments

Simon Glass Aug. 23, 2023, 11:57 p.m. UTC | #1
Hi Joshue,

On Wed, 23 Aug 2023 at 10:48, Joshua Watt <jpewhacker@gmail.com> wrote:
>
> Adds an additional variable called gpt_partition_bootable that indicates
> if the given partition is bootable or not.
>
> Signed-off-by: Joshua Watt <JPEWhacker@gmail.com>
> ---
>  cmd/gpt.c                 |  9 +++++++--
>  doc/usage/cmd/gpt.rst     |  3 +++
>  test/py/tests/test_gpt.py | 33 +++++++++++++++++++++++++++++++++
>  3 files changed, 43 insertions(+), 2 deletions(-)
>
> diff --git a/cmd/gpt.c b/cmd/gpt.c
> index e6f7b0319a..7a8990e400 100644
> --- a/cmd/gpt.c
> +++ b/cmd/gpt.c
> @@ -723,7 +723,7 @@ static int gpt_enumerate(struct blk_desc *desc)
>   * gpt_setenv_part_variables() - setup partition environmental variables
>   *
>   * Setup the gpt_partition_name, gpt_partition_entry, gpt_partition_addr
> - * and gpt_partition_size environment variables.
> + * and gpt_partition_size, gpt_partition_bootable environment variables.
>   *
>   * @pinfo: pointer to disk partition
>   * @i: partition entry
> @@ -750,6 +750,10 @@ static int gpt_setenv_part_variables(struct disk_partition *pinfo, int i)
>         if (ret)
>                 goto fail;
>
> +       ret = env_set_ulong("gpt_partition_bootable", !!(pinfo->bootable & PART_BOOTABLE));
> +       if (ret)
> +               goto fail;
> +
>         return 0;
>
>  fail:
> @@ -1057,7 +1061,8 @@ U_BOOT_CMD(gpt, CONFIG_SYS_MAXARGS, 1, do_gpt,
>         " gpt setenv mmc 0 $name\n"
>         "    - setup environment variables for partition $name:\n"
>         "      gpt_partition_addr, gpt_partition_size,\n"
> -       "      gpt_partition_name, gpt_partition_entry\n"
> +       "      gpt_partition_name, gpt_partition_entry,\n"
> +       "      gpt_partition_bootable\n"

Please use single quotes except for the """ for function headers.

>         " gpt enumerate mmc 0\n"
>         "    - store list of partitions to gpt_partition_list environment variable\n"
>         " gpt guid <interface> <dev>\n"
> diff --git a/doc/usage/cmd/gpt.rst b/doc/usage/cmd/gpt.rst
> index ea2cf73a60..c9d15b2cba 100644
> --- a/doc/usage/cmd/gpt.rst
> +++ b/doc/usage/cmd/gpt.rst
> @@ -85,6 +85,7 @@ information about a particular partition. The variables are:
>  * gpt_partition_size (the size of the partition, in hexadecimal blocks)
>  * gpt_partition_name (the name of the partition)
>  * gpt_partition_entry (the partition number in the table, e.g. 1, 2, 3, etc.)
> +* gpt_partition_bootable (1 if the partition is marked as bootable, 0 if not)
>
>  To get the information about the partition named 'rootfs', issue the following
>  command:
> @@ -99,6 +100,8 @@ command:
>      rootfs
>      => echo ${gpt_partition_entry}
>      2
> +    => echo ${gpt_partition_bootable}
> +    0
>
>  The 'gpt enumerate' command will set the variable 'gpt_partition_list' with the
>  list of partition names on the device. For example:
> diff --git a/test/py/tests/test_gpt.py b/test/py/tests/test_gpt.py
> index 339468bc12..1537ceb8c8 100644
> --- a/test/py/tests/test_gpt.py
> +++ b/test/py/tests/test_gpt.py
> @@ -49,6 +49,7 @@ class GptTestDiskImage(object):
>                  u_boot_utils.run_and_log(u_boot_console, cmd)
>                  # part1 offset 1MB size 1MB
>                  cmd = ('sgdisk', '--new=1:2048:4095', '--change-name=1:part1',
> +                    '-A 1:set:2',
>                      persistent)
>                  # part2 offset 2MB size 1.5MB
>                  u_boot_utils.run_and_log(u_boot_console, cmd)
> @@ -117,6 +118,38 @@ def test_gpt_guid(state_disk_image, u_boot_console):
>      output = u_boot_console.run_command('gpt guid host 0')
>      assert '375a56f7-d6c9-4e81-b5f0-09d41ca89efe' in output
>
> +@pytest.mark.boardspec('sandbox')
> +@pytest.mark.buildconfigspec('cmd_gpt')
> +@pytest.mark.requiredtool('sgdisk')
> +def test_gpt_setenv(state_disk_image, u_boot_console):
> +    """Test the gpt setenv command."""
> +    u_boot_console.run_command('host bind 0 ' + state_disk_image.path)
> +    output = u_boot_console.run_command('gpt setenv host 0 part1')
> +    assert 'success!' in output
> +    output = u_boot_console.run_command('echo ${gpt_partition_addr}')
> +    assert output.rstrip() == '800'
> +    output = u_boot_console.run_command('echo ${gpt_partition_size}')
> +    assert output.rstrip() == '800'
> +    output = u_boot_console.run_command('echo ${gpt_partition_name}')
> +    assert output.rstrip() == 'part1'
> +    output = u_boot_console.run_command('echo ${gpt_partition_entry}')
> +    assert output.rstrip() == "1"
> +    output = u_boot_console.run_command('echo ${gpt_partition_bootable}')
> +    assert output.rstrip() == "1"
> +
> +    output = u_boot_console.run_command('gpt setenv host 0 part2')
> +    assert 'success!' in output
> +    output = u_boot_console.run_command('echo ${gpt_partition_addr}')
> +    assert output.rstrip() == '1000'
> +    output = u_boot_console.run_command('echo ${gpt_partition_size}')
> +    assert output.rstrip() == 'c00'
> +    output = u_boot_console.run_command('echo ${gpt_partition_name}')
> +    assert output.rstrip() == 'part2'
> +    output = u_boot_console.run_command('echo ${gpt_partition_entry}')
> +    assert output.rstrip() == "2"
> +    output = u_boot_console.run_command('echo ${gpt_partition_bootable}')
> +    assert output.rstrip() == "0"
> +
>  @pytest.mark.boardspec('sandbox')
>  @pytest.mark.buildconfigspec('cmd_gpt')
>  @pytest.mark.requiredtool('sgdisk')
> --
> 2.33.0
>

Regards,
Simon
diff mbox series

Patch

diff --git a/cmd/gpt.c b/cmd/gpt.c
index e6f7b0319a..7a8990e400 100644
--- a/cmd/gpt.c
+++ b/cmd/gpt.c
@@ -723,7 +723,7 @@  static int gpt_enumerate(struct blk_desc *desc)
  * gpt_setenv_part_variables() - setup partition environmental variables
  *
  * Setup the gpt_partition_name, gpt_partition_entry, gpt_partition_addr
- * and gpt_partition_size environment variables.
+ * and gpt_partition_size, gpt_partition_bootable environment variables.
  *
  * @pinfo: pointer to disk partition
  * @i: partition entry
@@ -750,6 +750,10 @@  static int gpt_setenv_part_variables(struct disk_partition *pinfo, int i)
 	if (ret)
 		goto fail;
 
+	ret = env_set_ulong("gpt_partition_bootable", !!(pinfo->bootable & PART_BOOTABLE));
+	if (ret)
+		goto fail;
+
 	return 0;
 
 fail:
@@ -1057,7 +1061,8 @@  U_BOOT_CMD(gpt, CONFIG_SYS_MAXARGS, 1, do_gpt,
 	" gpt setenv mmc 0 $name\n"
 	"    - setup environment variables for partition $name:\n"
 	"      gpt_partition_addr, gpt_partition_size,\n"
-	"      gpt_partition_name, gpt_partition_entry\n"
+	"      gpt_partition_name, gpt_partition_entry,\n"
+	"      gpt_partition_bootable\n"
 	" gpt enumerate mmc 0\n"
 	"    - store list of partitions to gpt_partition_list environment variable\n"
 	" gpt guid <interface> <dev>\n"
diff --git a/doc/usage/cmd/gpt.rst b/doc/usage/cmd/gpt.rst
index ea2cf73a60..c9d15b2cba 100644
--- a/doc/usage/cmd/gpt.rst
+++ b/doc/usage/cmd/gpt.rst
@@ -85,6 +85,7 @@  information about a particular partition. The variables are:
 * gpt_partition_size (the size of the partition, in hexadecimal blocks)
 * gpt_partition_name (the name of the partition)
 * gpt_partition_entry (the partition number in the table, e.g. 1, 2, 3, etc.)
+* gpt_partition_bootable (1 if the partition is marked as bootable, 0 if not)
 
 To get the information about the partition named 'rootfs', issue the following
 command:
@@ -99,6 +100,8 @@  command:
     rootfs
     => echo ${gpt_partition_entry}
     2
+    => echo ${gpt_partition_bootable}
+    0
 
 The 'gpt enumerate' command will set the variable 'gpt_partition_list' with the
 list of partition names on the device. For example:
diff --git a/test/py/tests/test_gpt.py b/test/py/tests/test_gpt.py
index 339468bc12..1537ceb8c8 100644
--- a/test/py/tests/test_gpt.py
+++ b/test/py/tests/test_gpt.py
@@ -49,6 +49,7 @@  class GptTestDiskImage(object):
                 u_boot_utils.run_and_log(u_boot_console, cmd)
                 # part1 offset 1MB size 1MB
                 cmd = ('sgdisk', '--new=1:2048:4095', '--change-name=1:part1',
+                    '-A 1:set:2',
                     persistent)
                 # part2 offset 2MB size 1.5MB
                 u_boot_utils.run_and_log(u_boot_console, cmd)
@@ -117,6 +118,38 @@  def test_gpt_guid(state_disk_image, u_boot_console):
     output = u_boot_console.run_command('gpt guid host 0')
     assert '375a56f7-d6c9-4e81-b5f0-09d41ca89efe' in output
 
+@pytest.mark.boardspec('sandbox')
+@pytest.mark.buildconfigspec('cmd_gpt')
+@pytest.mark.requiredtool('sgdisk')
+def test_gpt_setenv(state_disk_image, u_boot_console):
+    """Test the gpt setenv command."""
+    u_boot_console.run_command('host bind 0 ' + state_disk_image.path)
+    output = u_boot_console.run_command('gpt setenv host 0 part1')
+    assert 'success!' in output
+    output = u_boot_console.run_command('echo ${gpt_partition_addr}')
+    assert output.rstrip() == '800'
+    output = u_boot_console.run_command('echo ${gpt_partition_size}')
+    assert output.rstrip() == '800'
+    output = u_boot_console.run_command('echo ${gpt_partition_name}')
+    assert output.rstrip() == 'part1'
+    output = u_boot_console.run_command('echo ${gpt_partition_entry}')
+    assert output.rstrip() == "1"
+    output = u_boot_console.run_command('echo ${gpt_partition_bootable}')
+    assert output.rstrip() == "1"
+
+    output = u_boot_console.run_command('gpt setenv host 0 part2')
+    assert 'success!' in output
+    output = u_boot_console.run_command('echo ${gpt_partition_addr}')
+    assert output.rstrip() == '1000'
+    output = u_boot_console.run_command('echo ${gpt_partition_size}')
+    assert output.rstrip() == 'c00'
+    output = u_boot_console.run_command('echo ${gpt_partition_name}')
+    assert output.rstrip() == 'part2'
+    output = u_boot_console.run_command('echo ${gpt_partition_entry}')
+    assert output.rstrip() == "2"
+    output = u_boot_console.run_command('echo ${gpt_partition_bootable}')
+    assert output.rstrip() == "0"
+
 @pytest.mark.boardspec('sandbox')
 @pytest.mark.buildconfigspec('cmd_gpt')
 @pytest.mark.requiredtool('sgdisk')