Dragonboard and uEFI fixes

This commit is contained in:
Peter Robinson 2017-06-21 13:02:27 +01:00
parent b6a8ab9ae5
commit fa1db3d061
3 changed files with 306 additions and 5 deletions

85
dragonboard-fixes.patch Normal file
View File

@ -0,0 +1,85 @@
From patchwork Tue Jun 20 21:55:24 2017
Content-Type: text/plain; charset="utf-8"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Subject: [U-Boot,1/2] board/db410c: add missing linker map entries for efi
From: Rob Clark <robdclark@gmail.com>
X-Patchwork-Id: 778514
Message-Id: <20170620215525.10430-1-robdclark@gmail.com>
To: U-Boot Mailing List <u-boot@lists.denx.de>
Cc: Nicolas Dechesne <nicolas.dechesne@linaro.org>,
Stephen Boyd <sboyd@codeaurora.org>
Date: Tue, 20 Jun 2017 17:55:24 -0400
Otherwise the loaded image would miss the efi_runtime sections, and fall
over hard when grub (for example) tried to call runtime services located
in this section.
Signed-off-by: Rob Clark <robdclark@gmail.com>
---
board/qualcomm/dragonboard410c/u-boot.lds | 16 ++++++++++++++++
1 file changed, 16 insertions(+)
diff --git a/board/qualcomm/dragonboard410c/u-boot.lds b/board/qualcomm/dragonboard410c/u-boot.lds
index 6e1c5a8..62ac4d7 100644
--- a/board/qualcomm/dragonboard410c/u-boot.lds
+++ b/board/qualcomm/dragonboard410c/u-boot.lds
@@ -43,6 +43,22 @@ SECTIONS
. = ALIGN(8);
+ .efi_runtime : {
+ __efi_runtime_start = .;
+ *(efi_runtime_text)
+ *(efi_runtime_data)
+ __efi_runtime_stop = .;
+ }
+
+ .efi_runtime_rel : {
+ __efi_runtime_rel_start = .;
+ *(.relaefi_runtime_text)
+ *(.relaefi_runtime_data)
+ __efi_runtime_rel_stop = .;
+ }
+
+ . = ALIGN(8);
+
.image_copy_end :
{
*(.__image_copy_end)
From patchwork Tue Jun 20 21:55:25 2017
Content-Type: text/plain; charset="utf-8"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Subject: [U-Boot,2/2] board/db410c: fix fdt address
From: Rob Clark <robdclark@gmail.com>
X-Patchwork-Id: 778516
Message-Id: <20170620215525.10430-2-robdclark@gmail.com>
To: U-Boot Mailing List <u-boot@lists.denx.de>
Cc: Nicolas Dechesne <nicolas.dechesne@linaro.org>,
Stephen Boyd <sboyd@codeaurora.org>
Date: Tue, 20 Jun 2017 17:55:25 -0400
Signed-off-by: Rob Clark <robdclark@gmail.com>
---
Maybe there is a better way to not hardcode this? But at least with
the build of lk that I have, the fdt table is at 0x81e00000. I guess
there must be a more robust way to do this, since presumably lk when
booting the linux kernel directly somehow passes the fdt address.
include/configs/dragonboard410c.h | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/include/configs/dragonboard410c.h b/include/configs/dragonboard410c.h
index 11c842d..3b9932d 100644
--- a/include/configs/dragonboard410c.h
+++ b/include/configs/dragonboard410c.h
@@ -105,7 +105,7 @@ REFLASH(dragonboard/u-boot.img, 8)\
"linux_image=Image\0" \
"kernel_addr_r=0x81000000\0"\
"fdtfile=apq8016-sbc.dtb\0" \
- "fdt_addr_r=0x83000000\0"\
+ "fdt_addr_r=0x81e00000\0"\
"ramdisk_addr_r=0x84000000\0"\
"scriptaddr=0x90000000\0"\
"pxefile_addr_r=0x90100000\0"\

View File

@ -14,14 +14,16 @@ Source3: aarch64-boards
Source4: aarch64-chromebooks
Patch1: add-BOOTENV_INIT_COMMAND-for-commands-that-may-be-ne.patch
Patch2: dragonboard-fixes.patch
Patch3: mx6cuboxi-Add-support-for-sata.patch
Patch4: mx6-Initial-Hummingboard-2-support.patch
# Patch5: sti-STiH410-B2260-support.patch
# Patch6: AW64-add-spl-atf-support.patch
Patch7: use-Fedora-specific-EFI-path-name.patch
# Patch9: arm-tegra-nyan-chromebook.patch
Patch5: uefi-fixes.patch
Patch6: use-Fedora-specific-EFI-path-name.patch
# Patch19: 0001-arm-mvebu-enable-generic-distro-boot-config.patch
# Patch11: sti-STiH410-B2260-support.patch
# Patch12: AW64-add-spl-atf-support.patch
# Patch13: arm-tegra-nyan-chromebook.patch
# Patch14: 0001-arm-mvebu-enable-generic-distro-boot-config.patch
BuildRequires: bc
BuildRequires: dtc
@ -276,6 +278,8 @@ cp -p board/warp7/README builds/docs/README.warp7
- 2017.07 RC2
- Enable AllWinner: NanoPi M1+, NanoPi Neo2, SoPine baseboard, OrangePi Zero+2, OrangePi Win
- Enable Rockchips: GeekBox, Sheep
- Dragonboard fixes
- uEFI fixes
* Tue Jun 6 2017 Peter Robinson <pbrobinson@fedoraproject.org> 2017.07-0.1.rc1
- 2017.07 RC1

212
uefi-fixes.patch Normal file
View File

@ -0,0 +1,212 @@
From patchwork Tue Jun 20 21:49:23 2017
Content-Type: text/plain; charset="utf-8"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Subject: [U-Boot] dm: core: don't fail to iterate if first one fails to probe
From: Rob Clark <robdclark@gmail.com>
X-Patchwork-Id: 778515
Message-Id: <20170620214923.8564-1-robdclark@gmail.com>
To: U-Boot Mailing List <u-boot@lists.denx.de>
Date: Tue, 20 Jun 2017 17:49:23 -0400
efi_disk_register() would try to iterate all the blk devices. But if
the first one in the list failed to probe, uclass_first_device() would
return NULL and no attempt would be made to register the remaining
devices. Also uclass_next_device() needs the same fix.
Signed-off-by: Rob Clark <robdclark@gmail.com>
---
drivers/core/uclass.c | 24 +++++++++++++++++++++---
1 file changed, 21 insertions(+), 3 deletions(-)
diff --git a/drivers/core/uclass.c b/drivers/core/uclass.c
index 21dc696..c47ff56 100644
--- a/drivers/core/uclass.c
+++ b/drivers/core/uclass.c
@@ -458,14 +458,23 @@ int uclass_get_device_by_phandle(enum uclass_id id, struct udevice *parent,
int uclass_first_device(enum uclass_id id, struct udevice **devp)
{
- struct udevice *dev;
+ struct udevice *dev = NULL;
int ret;
*devp = NULL;
ret = uclass_find_first_device(id, &dev);
if (!dev)
return 0;
- return uclass_get_device_tail(dev, ret, devp);
+ ret = uclass_get_device_tail(dev, ret, devp);
+ if (ret && dev) {
+ /* we have a device, but it failed to probe, move on and
+ * try the next one.
+ */
+ ret = uclass_next_device(&dev);
+ if (!ret)
+ *devp = dev;
+ }
+ return ret;
}
int uclass_first_device_err(enum uclass_id id, struct udevice **devp)
@@ -490,7 +499,16 @@ int uclass_next_device(struct udevice **devp)
ret = uclass_find_next_device(&dev);
if (!dev)
return 0;
- return uclass_get_device_tail(dev, ret, devp);
+ ret = uclass_get_device_tail(dev, ret, devp);
+ if (ret && (dev != *devp)) {
+ /* we have a device, but it failed to probe, move on and
+ * try the next one.
+ */
+ ret = uclass_next_device(&dev);
+ if (!ret)
+ *devp = dev;
+ }
+ return ret;
}
int uclass_bind_device(struct udevice *dev)
From patchwork Tue Jun 20 06:35:53 2017
Content-Type: text/plain; charset="utf-8"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Subject: [U-Boot,v2] efi: Export mbr partition for EFI.
From: Emmanuel Vadot <manu@bidouilliste.com>
X-Patchwork-Id: 778138
Message-Id: <20170620063553.8637-1-manu@bidouilliste.com>
To: agraf@suse.de
Cc: u-boot@lists.denx.de
Date: Tue, 20 Jun 2017 08:35:53 +0200
While MBR partition isn't supposed to work in a EFI environment some
board rely partially or fully on MBR (BeagleBone, RPI and probably others).
This export the MBR partition as logical partition which is useful to efi
application that cannot read raw disks.
Signed-off-by: Emmanuel Vadot <manu@bidouilliste.com>
---
Changes in v2:
* Pass correct arg to efi_disk_create_mbr
lib/efi_loader/efi_disk.c | 59 +++++++++++++++++++++++++++++++++++++++--------
1 file changed, 50 insertions(+), 9 deletions(-)
diff --git a/lib/efi_loader/efi_disk.c b/lib/efi_loader/efi_disk.c
index 39e602a868..097bb544d7 100644
--- a/lib/efi_loader/efi_disk.c
+++ b/lib/efi_loader/efi_disk.c
@@ -197,11 +197,13 @@ static void efi_disk_add_dev(const char *name,
const char *if_typename,
const struct blk_desc *desc,
int dev_index,
- lbaint_t offset)
+ disk_partition_t *info,
+ int logical_partition)
{
struct efi_disk_obj *diskobj;
struct efi_device_path_file_path *dp;
int objlen = sizeof(*diskobj) + (sizeof(*dp) * 2);
+ static int mediaid;
/* Don't add empty devices */
if (!desc->lba)
@@ -218,16 +220,26 @@ static void efi_disk_add_dev(const char *name,
diskobj->ops = block_io_disk_template;
diskobj->ifname = if_typename;
diskobj->dev_index = dev_index;
- diskobj->offset = offset;
+ if (info)
+ diskobj->offset = info->start;
+
diskobj->desc = desc;
/* Fill in EFI IO Media info (for read/write callbacks) */
diskobj->media.removable_media = desc->removable;
diskobj->media.media_present = 1;
- diskobj->media.block_size = desc->blksz;
- diskobj->media.io_align = desc->blksz;
- diskobj->media.last_block = desc->lba - offset;
+ diskobj->media.media_id = mediaid++;
diskobj->ops.media = &diskobj->media;
+ if (logical_partition) {
+ diskobj->media.logical_partition = 1;
+ diskobj->media.block_size = info->blksz;
+ diskobj->media.io_align = info->blksz;
+ diskobj->media.last_block = info->size - 1;
+ } else {
+ diskobj->media.block_size = desc->blksz;
+ diskobj->media.io_align = desc->blksz;
+ diskobj->media.last_block = desc->lba;
+ }
/* Fill in device path */
dp = (void*)&diskobj[1];
@@ -262,8 +274,33 @@ static int efi_disk_create_eltorito(struct blk_desc *desc,
while (!part_get_info(desc, part, &info)) {
snprintf(devname, sizeof(devname), "%s:%d", pdevname,
part);
- efi_disk_add_dev(devname, if_typename, desc, diskid,
- info.start);
+ efi_disk_add_dev(devname, if_typename, desc, diskid, 0, 0);
+ part++;
+ disks++;
+ }
+#endif
+
+ return disks;
+}
+
+static int efi_disk_create_mbr(struct blk_desc *desc,
+ const char *if_typename,
+ int diskid)
+{
+ int disks = 0;
+#if CONFIG_IS_ENABLED(DOS_PARTITION)
+ char devname[32] = { 0 }; /* dp->str is u16[32] long */
+ disk_partition_t info;
+ int part = 1;
+
+ if (desc->part_type != PART_TYPE_DOS)
+ return 0;
+
+ while (!part_get_info(desc, part, &info)) {
+ snprintf(devname, sizeof(devname), "%s%d:%d", if_typename,
+ diskid, part);
+
+ efi_disk_add_dev(devname, if_typename, desc, diskid, &info, 1);
part++;
disks++;
}
@@ -296,9 +333,11 @@ int efi_disk_register(void)
const char *if_typename = dev->driver->name;
printf("Scanning disk %s...\n", dev->name);
- efi_disk_add_dev(dev->name, if_typename, desc, desc->devnum, 0);
+ efi_disk_add_dev(dev->name, if_typename, desc, desc->devnum,
+ NULL, 0);
disks++;
+ disks += efi_disk_create_mbr(desc, if_typename, desc->devnum);
/*
* El Torito images show up as block devices in an EFI world,
* so let's create them here
@@ -332,15 +371,17 @@ int efi_disk_register(void)
snprintf(devname, sizeof(devname), "%s%d",
if_typename, i);
- efi_disk_add_dev(devname, if_typename, desc, i, 0);
+ efi_disk_add_dev(devname, if_typename, desc, i, 0, 0);
disks++;
+ disks += efi_disk_create_mbr(desc, if_typename, i);
/*
* El Torito images show up as block devices
* in an EFI world, so let's create them here
*/
disks += efi_disk_create_eltorito(desc, if_typename,
i, devname);
+
}
}
#endif