Loading...
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 | // SPDX-License-Identifier: GPL-2.0+ /* * (C) Copyright 2015 Miao Yan <yanmiaobest@gmail.com> */ #include <command.h> #include <env.h> #include <errno.h> #include <qfw.h> #include <dm.h> static struct udevice *qfw_dev; static int qemu_fwcfg_cmd_list_firmware(void) { int ret; struct fw_cfg_file_iter iter; struct fw_file *file; /* make sure fw_list is loaded */ ret = qfw_read_firmware_list(qfw_dev); if (ret) return ret; printf(" Addr Size Sel Name\n"); printf("---------------- -------- --- ------------\n"); for (file = qfw_file_iter_init(qfw_dev, &iter); !qfw_file_iter_end(&iter); file = qfw_file_iter_next(&iter)) { printf("%16lx %8x %3x %-48s\n", file->addr, be32_to_cpu(file->cfg.size), be16_to_cpu(file->cfg.select), file->cfg.name); } return 0; } static int qemu_fwcfg_do_list(struct cmd_tbl *cmdtp, int flag, int argc, char *const argv[]) { if (qemu_fwcfg_cmd_list_firmware() < 0) return CMD_RET_FAILURE; return 0; } static int qemu_fwcfg_do_cpus(struct cmd_tbl *cmdtp, int flag, int argc, char *const argv[]) { printf("%d cpu(s) online\n", qfw_online_cpus(qfw_dev)); return 0; } static int qemu_fwcfg_do_load(struct cmd_tbl *cmdtp, int flag, int argc, char *const argv[]) { char *env; ulong load_addr; ulong initrd_addr; env = env_get("loadaddr"); load_addr = env ? hextoul(env, NULL) : CONFIG_SYS_LOAD_ADDR; env = env_get("ramdiskaddr"); initrd_addr = env ? hextoul(env, NULL) : #ifdef CFG_RAMDISK_ADDR CFG_RAMDISK_ADDR; #else 0; #endif if (argc == 2) { load_addr = hextoul(argv[0], NULL); initrd_addr = hextoul(argv[1], NULL); } else if (argc == 1) { load_addr = hextoul(argv[0], NULL); } if (!load_addr || !initrd_addr) { printf("missing load or initrd address\n"); return CMD_RET_FAILURE; } return qemu_fwcfg_setup_kernel(qfw_dev, load_addr, initrd_addr); } static struct cmd_tbl fwcfg_commands[] = { U_BOOT_CMD_MKENT(list, 0, 1, qemu_fwcfg_do_list, "", ""), U_BOOT_CMD_MKENT(cpus, 0, 1, qemu_fwcfg_do_cpus, "", ""), U_BOOT_CMD_MKENT(load, 2, 1, qemu_fwcfg_do_load, "", ""), }; static int do_qemu_fw(struct cmd_tbl *cmdtp, int flag, int argc, char *const argv[]) { int ret; struct cmd_tbl *fwcfg_cmd; ret = qfw_get_dev(&qfw_dev); if (ret) { printf("QEMU fw_cfg interface not found\n"); return CMD_RET_USAGE; } fwcfg_cmd = find_cmd_tbl(argv[1], fwcfg_commands, ARRAY_SIZE(fwcfg_commands)); argc -= 2; argv += 2; if (!fwcfg_cmd || argc > fwcfg_cmd->maxargs) return CMD_RET_USAGE; ret = fwcfg_cmd->cmd(fwcfg_cmd, flag, argc, argv); return cmd_process_error(fwcfg_cmd, ret); } U_BOOT_CMD( qfw, 4, 1, do_qemu_fw, "QEMU firmware interface", "<command>\n" " - list : print firmware(s) currently loaded\n" " - cpus : print online cpu number\n" " - load <kernel addr> <initrd addr> : load kernel and initrd (if any), and setup for zboot\n" ); |