f5a26b4
From patchwork Sun Oct  8 15:33:08 2017
f5a26b4
Content-Type: text/plain; charset="utf-8"
f5a26b4
MIME-Version: 1.0
f5a26b4
Content-Transfer-Encoding: 7bit
f5a26b4
Subject: [U-Boot] efi_loader: Fix disk dp's for pre-DM/legacy devices
f5a26b4
X-Patchwork-Submitter: Rob Clark <robdclark@gmail.com>
f5a26b4
X-Patchwork-Id: 823012
f5a26b4
Message-Id: <20171008153310.25350-1-robdclark@gmail.com>
f5a26b4
To: U-Boot Mailing List <u-boot@lists.denx.de>
f5a26b4
Cc: Heinrich Schuchardt <xypron.glpk@gmx.de>, =?utf-8?q?Andreas_F=C3=A4rbe?=
f5a26b4
 =?utf-8?q?r?= <afaerber@suse.de>
f5a26b4
Date: Sun,  8 Oct 2017 11:33:08 -0400
f5a26b4
From: Rob Clark <robdclark@gmail.com>
f5a26b4
List-Id: U-Boot discussion <u-boot.lists.denx.de>
f5a26b4
f5a26b4
This fixes an issue with OpenBSD's bootloader, and I think should also
f5a26b4
fix a similar issue with grub2 on legacy devices.  In the legacy case
f5a26b4
we were creating disk objects for the partitions, but not also the
f5a26b4
parent device.
f5a26b4
f5a26b4
Reported-by: Jonathan Gray <jsg@jsg.id.au>
f5a26b4
Signed-off-by: Rob Clark <robdclark@gmail.com>
f5a26b4
---
f5a26b4
 lib/efi_loader/efi_disk.c | 11 +++++++++++
f5a26b4
 1 file changed, 11 insertions(+)
f5a26b4
f5a26b4
diff --git a/lib/efi_loader/efi_disk.c b/lib/efi_loader/efi_disk.c
f5a26b4
index eb9ce772d1..47b487aa30 100644
f5a26b4
--- a/lib/efi_loader/efi_disk.c
f5a26b4
+++ b/lib/efi_loader/efi_disk.c
f5a26b4
@@ -340,6 +340,8 @@ int efi_disk_register(void)
f5a26b4
 		for (i = 0; i < 4; i++) {
f5a26b4
 			struct blk_desc *desc;
f5a26b4
 			char devname[32] = { 0 }; /* dp->str is u16[32] long */
f5a26b4
+			disk_partition_t info;
f5a26b4
+			int part = 1;
f5a26b4
 
f5a26b4
 			desc = blk_get_devnum_by_type(if_type, i);
f5a26b4
 			if (!desc)
f5a26b4
@@ -349,6 +351,15 @@ int efi_disk_register(void)
f5a26b4
 
f5a26b4
 			snprintf(devname, sizeof(devname), "%s%d",
f5a26b4
 				 if_typename, i);
f5a26b4
+
f5a26b4
+			/* add devices for each partition: */
f5a26b4
+			while (!part_get_info(desc, part, &info)) {
f5a26b4
+				efi_disk_add_dev(devname, if_typename, desc,
f5a26b4
+						 i, 0, part);
f5a26b4
+				part++;
f5a26b4
+			}
f5a26b4
+
f5a26b4
+			/* ... and add block device: */
f5a26b4
 			efi_disk_add_dev(devname, if_typename, desc, i, 0, 0);
f5a26b4
 			disks++;
f5a26b4
 
f5a26b4
From patchwork Tue Oct 10 02:55:26 2017
f5a26b4
Content-Type: text/plain; charset="utf-8"
f5a26b4
MIME-Version: 1.0
f5a26b4
Content-Transfer-Encoding: 7bit
f5a26b4
Subject: [U-Boot] efi_loader: search all possible disk partitions
f5a26b4
X-Patchwork-Submitter: Jonathan Gray <jsg@jsg.id.au>
f5a26b4
X-Patchwork-Id: 823664
f5a26b4
X-Patchwork-Delegate: agraf@suse.de
f5a26b4
Message-Id: <20171010025526.85329-1-jsg@jsg.id.au>
f5a26b4
To: u-boot@lists.denx.de
f5a26b4
Date: Tue, 10 Oct 2017 13:55:26 +1100
f5a26b4
From: Jonathan Gray <jsg@jsg.id.au>
f5a26b4
List-Id: U-Boot discussion <u-boot.lists.denx.de>
f5a26b4
f5a26b4
When searching for partitions don't stop if a partition is not present
f5a26b4
for a given partition number as there may be valid partitions after.
f5a26b4
f5a26b4
Search for up to MAX_SEARCH_PARTITIONS matching the other callers of
f5a26b4
part_get_info().
f5a26b4
f5a26b4
This allows OpenBSD to boot via the efi_loader on rpi_3 again after
f5a26b4
changes made after U-Boot 2017.09.  With MBR partitioning OpenBSD will
f5a26b4
by default use the fourth partition for the 0xA6 (OpenBSD) partition.
f5a26b4
f5a26b4
Signed-off-by: Jonathan Gray <jsg@jsg.id.au>
f5a26b4
---
f5a26b4
 lib/efi_loader/efi_disk.c | 20 ++++++++++++--------
f5a26b4
 1 file changed, 12 insertions(+), 8 deletions(-)
f5a26b4
f5a26b4
diff --git a/lib/efi_loader/efi_disk.c b/lib/efi_loader/efi_disk.c
f5a26b4
index 47b487aa30..6b192701a8 100644
f5a26b4
--- a/lib/efi_loader/efi_disk.c
f5a26b4
+++ b/lib/efi_loader/efi_disk.c
f5a26b4
@@ -254,18 +254,19 @@ static int efi_disk_create_eltorito(struct blk_desc *desc,
f5a26b4
 #if CONFIG_IS_ENABLED(ISO_PARTITION)
f5a26b4
 	char devname[32] = { 0 }; /* dp->str is u16[32] long */
f5a26b4
 	disk_partition_t info;
f5a26b4
-	int part = 1;
f5a26b4
+	int part;
f5a26b4
 
f5a26b4
 	if (desc->part_type != PART_TYPE_ISO)
f5a26b4
 		return 0;
f5a26b4
 
f5a26b4
 	/* and devices for each partition: */
f5a26b4
-	while (!part_get_info(desc, part, &info)) {
f5a26b4
+	for (part = 1; part <= MAX_SEARCH_PARTITIONS; part++) {
f5a26b4
+		if (part_get_info(desc, part, &info))
f5a26b4
+			continue;
f5a26b4
 		snprintf(devname, sizeof(devname), "%s:%d", pdevname,
f5a26b4
 			 part);
f5a26b4
 		efi_disk_add_dev(devname, if_typename, desc, diskid,
f5a26b4
 				 info.start, part);
f5a26b4
-		part++;
f5a26b4
 		disks++;
f5a26b4
 	}
f5a26b4
 
f5a26b4
@@ -299,15 +300,16 @@ int efi_disk_register(void)
f5a26b4
 		struct blk_desc *desc = dev_get_uclass_platdata(dev);
f5a26b4
 		const char *if_typename = dev->driver->name;
f5a26b4
 		disk_partition_t info;
f5a26b4
-		int part = 1;
f5a26b4
+		int part;
f5a26b4
 
f5a26b4
 		printf("Scanning disk %s...\n", dev->name);
f5a26b4
 
f5a26b4
 		/* add devices for each partition: */
f5a26b4
-		while (!part_get_info(desc, part, &info)) {
f5a26b4
+		for (part = 1; part <= MAX_SEARCH_PARTITIONS; part++) {
f5a26b4
+			if (part_get_info(desc, part, &info))
f5a26b4
+				continue;
f5a26b4
 			efi_disk_add_dev(dev->name, if_typename, desc,
f5a26b4
 					 desc->devnum, 0, part);
f5a26b4
-			part++;
f5a26b4
 		}
f5a26b4
 
f5a26b4
 		/* ... and add block device: */
f5a26b4
@@ -341,7 +343,7 @@ int efi_disk_register(void)
f5a26b4
 			struct blk_desc *desc;
f5a26b4
 			char devname[32] = { 0 }; /* dp->str is u16[32] long */
f5a26b4
 			disk_partition_t info;
f5a26b4
-			int part = 1;
f5a26b4
+			int part;
f5a26b4
 
f5a26b4
 			desc = blk_get_devnum_by_type(if_type, i);
f5a26b4
 			if (!desc)
f5a26b4
@@ -353,7 +355,9 @@ int efi_disk_register(void)
f5a26b4
 				 if_typename, i);
f5a26b4
 
f5a26b4
 			/* add devices for each partition: */
f5a26b4
-			while (!part_get_info(desc, part, &info)) {
f5a26b4
+			for (part = 1; part <= MAX_SEARCH_PARTITIONS; part++) {
f5a26b4
+				if (part_get_info(desc, part, &info))
f5a26b4
+					continue;
f5a26b4
 				efi_disk_add_dev(devname, if_typename, desc,
f5a26b4
 						 i, 0, part);
f5a26b4
 				part++;
f5a26b4
From patchwork Tue Oct 10 10:32:29 2017
f5a26b4
Content-Type: text/plain; charset="utf-8"
f5a26b4
MIME-Version: 1.0
f5a26b4
Content-Transfer-Encoding: 7bit
f5a26b4
Subject: [U-Boot] efi_loader: don't increment part twice per loop
f5a26b4
X-Patchwork-Submitter: Jonathan Gray <jsg@jsg.id.au>
f5a26b4
X-Patchwork-Id: 823787
f5a26b4
Message-Id: <20171010103229.71768-1-jsg@jsg.id.au>
f5a26b4
To: u-boot@lists.denx.de
f5a26b4
Date: Tue, 10 Oct 2017 21:32:29 +1100
f5a26b4
From: Jonathan Gray <jsg@jsg.id.au>
f5a26b4
List-Id: U-Boot discussion <u-boot.lists.denx.de>
f5a26b4
f5a26b4
Correct a mistake in the part number handling of
f5a26b4
16a73b249d138fedeb188710533902ed7aac1ddc and only increment part once
f5a26b4
per loop.
f5a26b4
f5a26b4
Signed-off-by: Jonathan Gray <jsg@jsg.id.au>
f5a26b4
---
f5a26b4
 lib/efi_loader/efi_disk.c | 1 -
f5a26b4
 1 file changed, 1 deletion(-)
f5a26b4
f5a26b4
diff --git a/lib/efi_loader/efi_disk.c b/lib/efi_loader/efi_disk.c
f5a26b4
index 6b192701a8..e61dbc8058 100644
f5a26b4
--- a/lib/efi_loader/efi_disk.c
f5a26b4
+++ b/lib/efi_loader/efi_disk.c
f5a26b4
@@ -360,7 +360,6 @@ int efi_disk_register(void)
f5a26b4
 					continue;
f5a26b4
 				efi_disk_add_dev(devname, if_typename, desc,
f5a26b4
 						 i, 0, part);
f5a26b4
-				part++;
f5a26b4
 			}
f5a26b4
 
f5a26b4
 			/* ... and add block device: */