From: Mayuresh Chitale <mchitale@ventanamicro.com>
To: u-boot@lists.denx.de
Cc: Mayuresh Chitale <mchitale@ventanamicro.com>,
Simon Glass <sjg@chromium.org>,
Heinrich Schuchardt <xypron.glpk@gmx.de>,
Sean Anderson <sean.anderson@seco.com>,
Tom Rini <trini@konsulko.com>
Subject: [PATCH v1 2/2] spl: Add support for booting from ESP
Date: Thu, 14 Sep 2023 15:38:21 +0530 [thread overview]
Message-ID: <20230914100821.755904-3-mchitale@ventanamicro.com> (raw)
In-Reply-To: <20230914100821.755904-1-mchitale@ventanamicro.com>
Some platforms as described by EBBR specification may store images in
the FIRMWARE directory of the UEFI system partition(ESP). Add support
to boot from the EFI system partition if it is enabled for a platform.
Signed-off-by: Mayuresh Chitale <mchitale@ventanamicro.com>
---
common/spl/Kconfig | 7 +++++
common/spl/spl_blk_fs.c | 61 +++++++++++++++++++++++++++++------------
common/spl/spl_fat.c | 34 ++++++++++++++++++++---
3 files changed, 81 insertions(+), 21 deletions(-)
diff --git a/common/spl/Kconfig b/common/spl/Kconfig
index 76bde18515..92984b19da 100644
--- a/common/spl/Kconfig
+++ b/common/spl/Kconfig
@@ -1241,6 +1241,13 @@ config SPL_SATA_RAW_U_BOOT_SECTOR
Sector on the SATA disk to load U-Boot from, when the SATA disk is being
used in raw mode. Units: SATA disk sectors (1 sector = 512 bytes).
+config SPL_ESP_BOOT
+ bool "Load next stage boot image from the UEFI system partition"
+ select SPL_PARTITION_TYPE_GUID
+ help
+ When enabled, first try to boot from the UEFI system partition as
+ described in the Ch.4 of the EBBR specification.
+
config SPL_NVME
bool "NVM Express device support"
depends on BLK
diff --git a/common/spl/spl_blk_fs.c b/common/spl/spl_blk_fs.c
index 5268daaaff..78d1478426 100644
--- a/common/spl/spl_blk_fs.c
+++ b/common/spl/spl_blk_fs.c
@@ -9,9 +9,12 @@
#include <spl.h>
#include <image.h>
#include <fs.h>
+#include <part.h>
struct blk_dev {
const char *ifname;
+ int devnum;
+ int partnum;
char dev_part_str[8];
};
@@ -39,16 +42,38 @@ static ulong spl_fit_read(struct spl_load_info *load, ulong file_offset,
return actlen;
}
+static int spl_blk_file_size(struct blk_dev *dev, const char *filename,
+ loff_t *filesize)
+{
+ int ret;
+
+ snprintf(dev->dev_part_str, sizeof(dev->dev_part_str) - 1, "%x:%x",
+ dev->devnum, dev->partnum);
+ debug("Loading file %s from %s %s\n", filename, dev->ifname,
+ dev->dev_part_str);
+ ret = fs_set_blk_dev(dev->ifname, dev->dev_part_str, FS_TYPE_ANY);
+ if (ret) {
+ printf("spl: unable to set blk_dev %s %s. Err - %d\n",
+ dev->ifname, dev->dev_part_str, ret);
+ return ret;
+ }
+
+ ret = fs_size(filename, filesize);
+ if (ret)
+ printf("spl: unable to get size, file: %s. Err - %d\n",
+ filename, ret);
+ return ret;
+}
+
int spl_blk_load_image(struct spl_image_info *spl_image,
struct spl_boot_device *bootdev,
enum uclass_id uclass_id, int devnum, int partnum)
{
const char *filename = CONFIG_SPL_FS_LOAD_PAYLOAD_NAME;
- struct legacy_img_hdr *header;
struct blk_desc *blk_desc;
loff_t filesize;
struct blk_dev dev;
- int ret;
+ int ret, part;
struct spl_load_info load = {
.read = spl_fit_read,
.bl_len = 1,
@@ -63,24 +88,26 @@ int spl_blk_load_image(struct spl_image_info *spl_image,
}
blk_show_device(uclass_id, devnum);
- header = spl_get_load_buffer(-sizeof(*header), sizeof(*header));
-
dev.ifname = blk_get_uclass_name(uclass_id);
- snprintf(dev.dev_part_str, sizeof(dev.dev_part_str) - 1, "%x:%x",
- devnum, partnum);
- ret = fs_set_blk_dev(dev.ifname, dev.dev_part_str, FS_TYPE_ANY);
- if (ret) {
- printf("spl: unable to set blk_dev %s %s. Err - %d\n",
- dev.ifname, dev.dev_part_str, ret);
- return ret;
+ dev.devnum = devnum;
+ /*
+ * First try to boot from EFI System partition. In case of failure,
+ * fall back to the configured partition.
+ */
+ if (IS_ENABLED(CONFIG_SPL_ESP_BOOT)) {
+ part = part_get_esp(blk_desc);
+ if (part) {
+ dev.partnum = part;
+ ret = spl_blk_file_size(&dev, filename, &filesize);
+ if (!ret)
+ goto out;
+ }
}
- ret = fs_size(filename, &filesize);
- if (ret) {
- printf("spl: unable to get file size: %s. Err - %d\n",
- filename, ret);
+ dev.partnum = partnum;
+ ret = spl_blk_file_size(&dev, filename, &filesize);
+ if (ret)
return ret;
- }
-
+out:
return spl_load(spl_image, bootdev, &load, filesize, 0);
}
diff --git a/common/spl/spl_fat.c b/common/spl/spl_fat.c
index 6530bcd5a7..63091f2bd6 100644
--- a/common/spl/spl_fat.c
+++ b/common/spl/spl_fat.c
@@ -54,10 +54,10 @@ static ulong spl_fit_read(struct spl_load_info *load, ulong file_offset,
return actread;
}
-int spl_load_image_fat(struct spl_image_info *spl_image,
- struct spl_boot_device *bootdev,
- struct blk_desc *block_dev, int partition,
- const char *filename)
+int spl_load_image_fat_one(struct spl_image_info *spl_image,
+ struct spl_boot_device *bootdev,
+ struct blk_desc *block_dev, int partition,
+ const char *filename)
{
int err;
loff_t size;
@@ -96,6 +96,32 @@ end:
return err;
}
+int spl_load_image_fat(struct spl_image_info *spl_image,
+ struct spl_boot_device *bootdev,
+ struct blk_desc *block_dev, int partition,
+ const char *filename)
+{
+ int err, part;
+
+ /*
+ * First try to boot from EFI System partition. In case of failure,
+ * fall back to the configured partition.
+ */
+ if (IS_ENABLED(CONFIG_SPL_ESP_BOOT)) {
+ part = part_get_esp(block_dev);
+ if (part) {
+ err = spl_load_image_fat_one(spl_image, bootdev,
+ block_dev, part,
+ filename);
+ if (!err)
+ return err;
+ }
+ }
+
+ return spl_load_image_fat_one(spl_image, bootdev, block_dev,
+ partition, filename);
+}
+
#if CONFIG_IS_ENABLED(OS_BOOT)
int spl_load_image_fat_os(struct spl_image_info *spl_image,
struct spl_boot_device *bootdev,
--
2.34.1
next prev parent reply other threads:[~2023-09-14 12:21 UTC|newest]
Thread overview: 10+ messages / expand[flat|nested] mbox.gz Atom feed top
2023-09-14 10:08 [PATCH v1 0/2] SPL EBBR - EFI System Partition support Mayuresh Chitale
2023-09-14 10:08 ` [PATCH v1 1/2] part: Add a function to find ESP partition Mayuresh Chitale
2023-09-14 16:29 ` Tom Rini
2023-09-21 11:35 ` mchitale
2023-09-14 10:08 ` Mayuresh Chitale [this message]
2023-09-14 16:29 ` [PATCH v1 2/2] spl: Add support for booting from ESP Tom Rini
2023-09-21 11:33 ` mchitale
2023-09-21 15:43 ` Tom Rini
2023-09-14 14:15 ` [PATCH v1 0/2] SPL EBBR - EFI System Partition support Heinrich Schuchardt
2023-09-14 14:36 ` Sean Anderson
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20230914100821.755904-3-mchitale@ventanamicro.com \
--to=mchitale@ventanamicro.com \
--cc=sean.anderson@seco.com \
--cc=sjg@chromium.org \
--cc=trini@konsulko.com \
--cc=u-boot@lists.denx.de \
--cc=xypron.glpk@gmx.de \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox