]> Git Repo - J-u-boot.git/blame - cmd/qfw.c
Merge tag 'u-boot-imx-master-20250127' of https://gitlab.denx.de/u-boot/custodians...
[J-u-boot.git] / cmd / qfw.c
CommitLineData
83d290c5 1// SPDX-License-Identifier: GPL-2.0+
f60df20a 2/*
7b63b183 3 * (C) Copyright 2015 Miao Yan <[email protected]>
f60df20a
MY
4 */
5
f60df20a 6#include <command.h>
9fb625ce 7#include <env.h>
f60df20a 8#include <errno.h>
18686590 9#include <qfw.h>
5b0b43e0
AC
10#include <dm.h>
11
12static struct udevice *qfw_dev;
f60df20a 13
5b0b43e0 14static int qemu_fwcfg_cmd_list_firmware(void)
25757220
MY
15{
16 int ret;
099b2196 17 struct fw_cfg_file_iter iter;
25757220
MY
18 struct fw_file *file;
19
20 /* make sure fw_list is loaded */
5b0b43e0 21 ret = qfw_read_firmware_list(qfw_dev);
25757220
MY
22 if (ret)
23 return ret;
24
5b0b43e0
AC
25 for (file = qfw_file_iter_init(qfw_dev, &iter);
26 !qfw_file_iter_end(&iter);
27 file = qfw_file_iter_next(&iter)) {
d2e7972d 28 printf("%08lx %-56s\n", file->addr, file->cfg.name);
25757220
MY
29 }
30
f60df20a
MY
31 return 0;
32}
33
09140113
SG
34static int qemu_fwcfg_do_list(struct cmd_tbl *cmdtp, int flag,
35 int argc, char *const argv[])
f60df20a 36{
5b0b43e0 37 if (qemu_fwcfg_cmd_list_firmware() < 0)
f60df20a
MY
38 return CMD_RET_FAILURE;
39
40 return 0;
41}
42
09140113
SG
43static int qemu_fwcfg_do_cpus(struct cmd_tbl *cmdtp, int flag,
44 int argc, char *const argv[])
f60df20a 45{
5b0b43e0 46 printf("%d cpu(s) online\n", qfw_online_cpus(qfw_dev));
f60df20a
MY
47 return 0;
48}
49
09140113
SG
50static int qemu_fwcfg_do_load(struct cmd_tbl *cmdtp, int flag,
51 int argc, char *const argv[])
f60df20a
MY
52{
53 char *env;
e08e6ea6
SG
54 ulong load_addr;
55 ulong initrd_addr;
f60df20a 56
00caae6d 57 env = env_get("loadaddr");
f60df20a 58 load_addr = env ?
e08e6ea6
SG
59 hextoul(env, NULL) :
60 CONFIG_SYS_LOAD_ADDR;
f60df20a 61
00caae6d 62 env = env_get("ramdiskaddr");
f60df20a 63 initrd_addr = env ?
e08e6ea6 64 hextoul(env, NULL) :
d4c8dd1e 65#ifdef CFG_RAMDISK_ADDR
e08e6ea6 66 CFG_RAMDISK_ADDR;
86e30e67 67#else
e08e6ea6 68 0;
86e30e67 69#endif
f60df20a
MY
70
71 if (argc == 2) {
e08e6ea6
SG
72 load_addr = hextoul(argv[0], NULL);
73 initrd_addr = hextoul(argv[1], NULL);
f60df20a 74 } else if (argc == 1) {
e08e6ea6 75 load_addr = hextoul(argv[0], NULL);
f60df20a
MY
76 }
77
86e30e67
MY
78 if (!load_addr || !initrd_addr) {
79 printf("missing load or initrd address\n");
80 return CMD_RET_FAILURE;
81 }
82
00fa989e 83 return qemu_fwcfg_setup_kernel(qfw_dev, load_addr, initrd_addr);
f60df20a
MY
84}
85
09140113 86static struct cmd_tbl fwcfg_commands[] = {
f60df20a
MY
87 U_BOOT_CMD_MKENT(list, 0, 1, qemu_fwcfg_do_list, "", ""),
88 U_BOOT_CMD_MKENT(cpus, 0, 1, qemu_fwcfg_do_cpus, "", ""),
89 U_BOOT_CMD_MKENT(load, 2, 1, qemu_fwcfg_do_load, "", ""),
90};
91
09140113
SG
92static int do_qemu_fw(struct cmd_tbl *cmdtp, int flag, int argc,
93 char *const argv[])
f60df20a
MY
94{
95 int ret;
09140113 96 struct cmd_tbl *fwcfg_cmd;
f60df20a 97
5b0b43e0
AC
98 ret = qfw_get_dev(&qfw_dev);
99 if (ret) {
f60df20a
MY
100 printf("QEMU fw_cfg interface not found\n");
101 return CMD_RET_USAGE;
102 }
103
104 fwcfg_cmd = find_cmd_tbl(argv[1], fwcfg_commands,
105 ARRAY_SIZE(fwcfg_commands));
106 argc -= 2;
107 argv += 2;
108 if (!fwcfg_cmd || argc > fwcfg_cmd->maxargs)
109 return CMD_RET_USAGE;
110
111 ret = fwcfg_cmd->cmd(fwcfg_cmd, flag, argc, argv);
112
113 return cmd_process_error(fwcfg_cmd, ret);
114}
115
116U_BOOT_CMD(
117 qfw, 4, 1, do_qemu_fw,
118 "QEMU firmware interface",
119 "<command>\n"
120 " - list : print firmware(s) currently loaded\n"
121 " - cpus : print online cpu number\n"
122 " - load <kernel addr> <initrd addr> : load kernel and initrd (if any), and setup for zboot\n"
10c398d6 123);
This page took 0.349188 seconds and 5 git commands to generate.