From d91245dd1ce4d8e65efd11c44cafdae90c9e70a5 Mon Sep 17 00:00:00 2001 From: Peter Robinson Date: Thu, 21 Mar 2024 13:56:05 +0000 Subject: [PATCH] Updated patch for DTB loading --- uboot-tools.spec | 5 +- ..._location-for-finding-the-DT-on-disk.patch | 74 ++++++++++++------- 2 files changed, 52 insertions(+), 27 deletions(-) diff --git a/uboot-tools.spec b/uboot-tools.spec index fa7c75d..d726634 100644 --- a/uboot-tools.spec +++ b/uboot-tools.spec @@ -7,7 +7,7 @@ Name: uboot-tools Version: 2024.04 -Release: 0.6%{?candidate:.%{candidate}}%{?dist} +Release: 0.7%{?candidate:.%{candidate}}%{?dist} Epoch: 1 Summary: U-Boot utilities License: GPLv2+ BSD LGPL-2.1+ LGPL-2.0+ @@ -190,6 +190,9 @@ install -p -m 0755 builds/tools/env/fw_printenv %{buildroot}%{_bindir} %endif %changelog +* Thu Mar 21 2024 Peter Robinson - 1:2024.04-0.7.rc4 +- Updated patch for DTB loading + * Fri Mar 15 2024 Peter Robinson - 1:2024.04-0.6.rc4 - Updated fix for FDT load diff --git a/uefi-initial-find_fdt_location-for-finding-the-DT-on-disk.patch b/uefi-initial-find_fdt_location-for-finding-the-DT-on-disk.patch index 2b425f1..232e121 100644 --- a/uefi-initial-find_fdt_location-for-finding-the-DT-on-disk.patch +++ b/uefi-initial-find_fdt_location-for-finding-the-DT-on-disk.patch @@ -1,6 +1,6 @@ -From 751b1c4ec581f3546c49e4d59485306601fe6e2d Mon Sep 17 00:00:00 2001 +From 8abb44f89aefd25cda27c54c08b68b3a60bea7c3 Mon Sep 17 00:00:00 2001 From: Peter Robinson -Date: Fri, 15 Mar 2024 16:42:23 +0000 +Date: Thu, 21 Mar 2024 13:43:24 +0000 Subject: [PATCH] initial find_fdt_location for finding the DT on disk The old distro boot looked for a DT on the first boot partition @@ -16,11 +16,11 @@ so that devices will continue to work as they did previously. Signed-off-by: Peter Robinson --- - cmd/bootefi.c | 1 + - cmd/bootmenu.c | 5 +++ - include/efi_loader.h | 2 + - lib/efi_loader/efi_helper.c | 83 ++++++++++++++++++++++++++++++++++++- - 4 files changed, 90 insertions(+), 1 deletion(-) + cmd/bootefi.c | 1 + + cmd/bootmenu.c | 5 ++ + include/efi_loader.h | 2 + + lib/efi_loader/efi_helper.c | 105 +++++++++++++++++++++++++++++++++++- + 4 files changed, 112 insertions(+), 1 deletion(-) diff --git a/cmd/bootefi.c b/cmd/bootefi.c index 9cf9027bf40..8b6194a8702 100644 @@ -64,7 +64,7 @@ index 7daca0afba2..a969378ff2f 100644 int efi_init_early(void); /* Initialize efi execution environment */ diff --git a/lib/efi_loader/efi_helper.c b/lib/efi_loader/efi_helper.c -index 5dd9cc876e4..8d51c9570b7 100644 +index 5dd9cc876e4..a33ec39ff74 100644 --- a/lib/efi_loader/efi_helper.c +++ b/lib/efi_loader/efi_helper.c @@ -12,6 +12,7 @@ @@ -75,7 +75,7 @@ index 5dd9cc876e4..8d51c9570b7 100644 #include #include #include -@@ -24,6 +25,77 @@ +@@ -24,6 +25,99 @@ const efi_guid_t efi_lf2_initrd_guid = EFI_INITRD_MEDIA_GUID; #endif @@ -91,6 +91,7 @@ index 5dd9cc876e4..8d51c9570b7 100644 + int MAX_PART = 8; + int part; + struct disk_partition info; ++ int fdtext; + int ret; + int retfdt; + int retload; @@ -115,7 +116,9 @@ index 5dd9cc876e4..8d51c9570b7 100644 + log_debug("FFL: part num: %d\n", part); + ret = part_get_info(desc, part, &info); + /* if we have partition check it for DT */ -+ if (ret) { ++ if (ret < 0) { ++ log_debug("FFL: no partition\n"); ++ } else { + log_debug("FFL: we have a partition\n"); + /* we should have a case/for prefix in =/ /dtb/ /dtb/current/ */ + /* but for now we hard code if for Fedora */ @@ -123,22 +126,41 @@ index 5dd9cc876e4..8d51c9570b7 100644 + snprintf(fdt_fullpath, sizeof(fdt_fullpath), "%s/%s", prefix, fdt_filename); + log_debug("FFL: full name: %s\n", fdt_fullpath); + /* search for DT on partition and either find and exit or continue */ -+ retfdt = fs_size(fdt_fullpath, &fdtsize); -+ if (retfdt) { -+ /* we have a fdt!*/ -+ log_debug("FFL: we have found a DT on disk\n"); -+ pbraddr = (ulong)(env_get("fdt_addr")); -+ retload = fs_read(fdt_fullpath, pbraddr, 0, 0, &len_read); -+ if (retload) { -+ log_debug("FFL: we have a loaded DT, size %ld we can return\n", sizeof(len_read)); -+ log_info("Found DTB: %s\n", fdt_filename); -+ const char *fdt_opt; -+ fdt_opt = env_get("fdt_addr"); -+ return fdt_opt; ++ if (fs_set_blk_dev_with_part(desc, part) == 0){ ++ log_debug("FFL: set block part pass\n"); ++ fdtext = fs_exists(fdt_fullpath); ++ if (fdtext) { ++ /* we have a fdt!*/ ++ if (fs_set_blk_dev_with_part(desc, part) == 0){ ++ retfdt = fs_size(fdt_fullpath, &fdtsize); ++ if (retfdt == 0) { ++ log_debug("FFL: we have found a DT on disk, size %lld\n", fdtsize); ++ /* Get the main fdt and map it */ ++ const char *fdt_pbr; ++ fdt_pbr = env_get("fdt_addr_r"); ++ pbraddr = hextoul(fdt_pbr, NULL); ++ log_debug("FFL: fdr addr: %s\n", fdt_pbr); ++ if (fs_set_blk_dev_with_part(desc, part) == 0){ ++ retload = fs_read(fdt_fullpath, pbraddr, 0, fdtsize, &len_read); ++ if (retload == 0) { ++ log_debug("FFL: we have a loaded DT, size %lld we can return\n", fdtsize); ++ log_info("Found DTB: %s\n", fdt_filename); ++ return fdt_pbr; ++ } else { ++ log_debug("FFL: DT load failed\n"); ++ } ++ } ++ } else { ++ log_debug("FFL: we DON'T have a DT with size\n"); ++ } ++ } ++ } else { ++ /* we don't have a fdt!*/ ++ log_debug("FFL: we DON'T have a DT\n"); + } ++ } else { ++ log_debug("FFL: set block part FAIL\n"); + } -+ } else { -+ log_debug("FFL: no partition\n"); + } + } + } @@ -153,14 +175,14 @@ index 5dd9cc876e4..8d51c9570b7 100644 /** * efi_create_current_boot_var() - Return Boot#### name were #### is replaced by * the value of BootCurrent -@@ -432,11 +504,20 @@ efi_status_t efi_install_fdt(void *fdt) +@@ -432,11 +526,20 @@ efi_status_t efi_install_fdt(void *fdt) /* Look for device tree that is already installed */ if (efi_get_configuration_table(&efi_guid_fdt)) return EFI_SUCCESS; + /* Check if there is device tree loaded from disk */ + fdt_opt = find_fdt_location(); + if (fdt_opt) -+ log_debug("Found DTB: insert file name here\n"); ++ log_debug("Found DTB on disk\n"); /* Check if there is a hardware device tree */ - fdt_opt = env_get("fdt_addr"); + if (!fdt_opt) {