summaryrefslogtreecommitdiff
path: root/common
diff options
context:
space:
mode:
authorTom Rini <trini@konsulko.com>2023-02-07 11:42:26 -0500
committerTom Rini <trini@konsulko.com>2023-02-07 11:42:26 -0500
commitb69026c91f2e98b247120e217a986f5056724baf (patch)
treef1533069fcdbcf265deb0ea6b3b940e81902d9b3 /common
parentf8f47e6ff214a3ba7a61025bcc4dc058f507c279 (diff)
parent41a29f284cef48a86c86d038c0cd8cc1c851417e (diff)
Merge branch '2023-02-07-assorted-updates'
- Default to dynamic LMB allocation, and fix an issue with the EFI one, assorted TI platform updates, socrates platform updates, switch qemu-arm to using bootstd, imagetool fixes, macOS host build fixes, keymile platform upates, spl FPGA load fix, MMC env bugfix, add seama command, usb bootdev test bugfix.
Diffstat (limited to 'common')
-rw-r--r--common/log.c1
-rw-r--r--common/qfw.c66
-rw-r--r--common/spl/spl_fit.c1
3 files changed, 66 insertions, 2 deletions
diff --git a/common/log.c b/common/log.c
index 57b71ed1b36..7cfc49bc28a 100644
--- a/common/log.c
+++ b/common/log.c
@@ -30,6 +30,7 @@ static const char *const log_cat_name[] = {
"acpi",
"boot",
"event",
+ "fs",
};
_Static_assert(ARRAY_SIZE(log_cat_name) == LOGC_COUNT - LOGC_NONE,
diff --git a/common/qfw.c b/common/qfw.c
index 90cbb8c5dd4..45e87d3ae28 100644
--- a/common/qfw.c
+++ b/common/qfw.c
@@ -5,9 +5,11 @@
*/
#include <dm.h>
-#include <dm/uclass.h>
+#include <env.h>
+#include <mapmem.h>
#include <qfw.h>
#include <stdlib.h>
+#include <dm/uclass.h>
int qfw_get_dev(struct udevice **devp)
{
@@ -102,3 +104,65 @@ bool qfw_file_iter_end(struct fw_cfg_file_iter *iter)
{
return iter->entry == iter->end;
}
+
+int qemu_fwcfg_setup_kernel(struct udevice *qfw_dev, ulong load_addr,
+ ulong initrd_addr)
+{
+ char *data_addr;
+ u32 setup_size, kernel_size, cmdline_size, initrd_size;
+
+ qfw_read_entry(qfw_dev, FW_CFG_SETUP_SIZE, 4, &setup_size);
+ qfw_read_entry(qfw_dev, FW_CFG_KERNEL_SIZE, 4, &kernel_size);
+
+ if (!kernel_size) {
+ printf("fatal: no kernel available\n");
+ return -ENOENT;
+ }
+
+ data_addr = map_sysmem(load_addr, 0);
+ if (setup_size) {
+ qfw_read_entry(qfw_dev, FW_CFG_SETUP_DATA,
+ le32_to_cpu(setup_size), data_addr);
+ data_addr += le32_to_cpu(setup_size);
+ }
+
+ qfw_read_entry(qfw_dev, FW_CFG_KERNEL_DATA,
+ le32_to_cpu(kernel_size), data_addr);
+ data_addr += le32_to_cpu(kernel_size);
+ env_set_hex("filesize", le32_to_cpu(kernel_size));
+
+ data_addr = map_sysmem(initrd_addr, 0);
+ qfw_read_entry(qfw_dev, FW_CFG_INITRD_SIZE, 4, &initrd_size);
+ if (!initrd_size) {
+ printf("warning: no initrd available\n");
+ } else {
+ qfw_read_entry(qfw_dev, FW_CFG_INITRD_DATA,
+ le32_to_cpu(initrd_size), data_addr);
+ data_addr += le32_to_cpu(initrd_size);
+ env_set_hex("filesize", le32_to_cpu(initrd_size));
+ }
+
+ qfw_read_entry(qfw_dev, FW_CFG_CMDLINE_SIZE, 4, &cmdline_size);
+ if (cmdline_size) {
+ qfw_read_entry(qfw_dev, FW_CFG_CMDLINE_DATA,
+ le32_to_cpu(cmdline_size), data_addr);
+ /*
+ * if kernel cmdline only contains '\0', (e.g. no -append
+ * when invoking qemu), do not update bootargs
+ */
+ if (*data_addr) {
+ if (env_set("bootargs", data_addr) < 0)
+ printf("warning: unable to change bootargs\n");
+ }
+ }
+
+ printf("loading kernel to address %lx size %x", load_addr,
+ le32_to_cpu(kernel_size));
+ if (initrd_size)
+ printf(" initrd %lx size %x\n", initrd_addr,
+ le32_to_cpu(initrd_size));
+ else
+ printf("\n");
+
+ return 0;
+}
diff --git a/common/spl/spl_fit.c b/common/spl/spl_fit.c
index 9ae3e5e35d4..c51482b3b65 100644
--- a/common/spl/spl_fit.c
+++ b/common/spl/spl_fit.c
@@ -591,7 +591,6 @@ static int spl_fit_upload_fpga(struct spl_fit_info *ctx, int node,
debug("Ignoring compatible = %s property\n",
compatible);
}
- return 0;
ret = fpga_load(devnum, (void *)fpga_image->load_addr,
fpga_image->size, BIT_FULL, flags);