summaryrefslogtreecommitdiff
path: root/cmd
diff options
context:
space:
mode:
authorSimon Glass <sjg@chromium.org>2023-01-28 15:00:23 -0700
committerTom Rini <trini@konsulko.com>2023-02-06 13:04:53 -0500
commit00fa989eab2f75c450477d00e335aa05402e7fe9 (patch)
tree889f97b33270544bab1ffbc9fcbcf5edbcaa3165 /cmd
parente08e6ea67d91af6e2c423f5248aaedb82088b897 (diff)
qemu: Move qfw kernel setup into a common file
This is currently in the cmd/ file but we want to call it from a driver. Move it into a common place. Tidy up the header-file order while we are here. Signed-off-by: Simon Glass <sjg@chromium.org>
Diffstat (limited to 'cmd')
-rw-r--r--cmd/qfw.c69
1 files changed, 1 insertions, 68 deletions
diff --git a/cmd/qfw.c b/cmd/qfw.c
index 8837911d99..ae3c6a7a84 100644
--- a/cmd/qfw.c
+++ b/cmd/qfw.c
@@ -7,78 +7,11 @@
#include <command.h>
#include <env.h>
#include <errno.h>
-#include <mapmem.h>
#include <qfw.h>
#include <dm.h>
static struct udevice *qfw_dev;
-/*
- * This function prepares kernel for zboot. It loads kernel data
- * to 'load_addr', initrd to 'initrd_addr' and kernel command
- * line using qemu fw_cfg interface.
- */
-int qemu_fwcfg_cmd_setup_kernel(ulong load_addr, ulong initrd_addr)
-{
- char *data_addr;
- uint32_t 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;
-}
-
static int qemu_fwcfg_cmd_list_firmware(void)
{
int ret;
@@ -148,7 +81,7 @@ static int qemu_fwcfg_do_load(struct cmd_tbl *cmdtp, int flag,
return CMD_RET_FAILURE;
}
- return qemu_fwcfg_cmd_setup_kernel(load_addr, initrd_addr);
+ return qemu_fwcfg_setup_kernel(qfw_dev, load_addr, initrd_addr);
}
static struct cmd_tbl fwcfg_commands[] = {