#include <command.h>
#include <env.h>
#include <errno.h>
+#include <mapmem.h>
#include <qfw.h>
#include <dm.h>
* to 'load_addr', initrd to 'initrd_addr' and kernel command
* line using qemu fw_cfg interface.
*/
-static int qemu_fwcfg_cmd_setup_kernel(void *load_addr, void *initrd_addr)
+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 == 0) {
+ if (!kernel_size) {
printf("fatal: no kernel available\n");
- return CMD_RET_FAILURE;
+ return -ENOENT;
}
- data_addr = load_addr;
- if (setup_size != 0) {
+ 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);
data_addr += le32_to_cpu(kernel_size);
env_set_hex("filesize", le32_to_cpu(kernel_size));
- data_addr = initrd_addr;
+ data_addr = map_sysmem(initrd_addr, 0);
qfw_read_entry(qfw_dev, FW_CFG_INITRD_SIZE, 4, &initrd_size);
- if (initrd_size == 0) {
+ if (!initrd_size) {
printf("warning: no initrd available\n");
} else {
qfw_read_entry(qfw_dev, FW_CFG_INITRD_DATA,
* if kernel cmdline only contains '\0', (e.g. no -append
* when invoking qemu), do not update bootargs
*/
- if (*data_addr != '\0') {
+ if (*data_addr) {
if (env_set("bootargs", data_addr) < 0)
printf("warning: unable to change bootargs\n");
}
}
- printf("loading kernel to address %p size %x", load_addr,
+ printf("loading kernel to address %lx size %x", load_addr,
le32_to_cpu(kernel_size));
if (initrd_size)
- printf(" initrd %p size %x\n",
- initrd_addr,
+ printf(" initrd %lx size %x\n", initrd_addr,
le32_to_cpu(initrd_size));
else
printf("\n");
int argc, char *const argv[])
{
char *env;
- void *load_addr;
- void *initrd_addr;
+ ulong load_addr;
+ ulong initrd_addr;
env = env_get("loadaddr");
load_addr = env ?
- (void *)hextoul(env, NULL) :
- (void *)CONFIG_SYS_LOAD_ADDR;
+ hextoul(env, NULL) :
+ CONFIG_SYS_LOAD_ADDR;
env = env_get("ramdiskaddr");
initrd_addr = env ?
- (void *)hextoul(env, NULL) :
+ hextoul(env, NULL) :
#ifdef CFG_RAMDISK_ADDR
- (void *)CFG_RAMDISK_ADDR;
+ CFG_RAMDISK_ADDR;
#else
- NULL;
+ 0;
#endif
if (argc == 2) {
- load_addr = (void *)hextoul(argv[0], NULL);
- initrd_addr = (void *)hextoul(argv[1], NULL);
+ load_addr = hextoul(argv[0], NULL);
+ initrd_addr = hextoul(argv[1], NULL);
} else if (argc == 1) {
- load_addr = (void *)hextoul(argv[0], NULL);
+ load_addr = hextoul(argv[0], NULL);
}
if (!load_addr || !initrd_addr) {