From mboxrd@z Thu Jan 1 00:00:00 1970 From: Thomas Weber Date: Sun, 19 Feb 2012 07:09:01 +0100 Subject: [U-Boot] [PATCH V13 01/12] Add cmd_spl command In-Reply-To: <1328350963-30989-2-git-send-email-sbabic@denx.de> References: <1324049833-18143-1-git-send-email-sbabic@denx.de> <1328350963-30989-1-git-send-email-sbabic@denx.de> <1328350963-30989-2-git-send-email-sbabic@denx.de> Message-ID: <4F4091FD.8040505@gmail.com> List-Id: MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit To: u-boot@lists.denx.de On 02/04/2012 11:22 AM, Stefano Babic wrote: > From: Simon Schwarz > > This adds a spl command to the u-boot. > > Related config: > CONFIG_CMD_CPL > activate/deactivate the command > CONFIG_CMD_SPL_NAND_OFS > Offset in NAND to use > > Signed-off-by: Simon Schwarz > CC: Tom Rini > CC: Stefano Babic > CC: Wolfgang Denk > --- > common/Makefile | 1 + > common/cmd_spl.c | 229 +++++++++++++++++++++++++++++++++++++++++++++++ > doc/README.commands.spl | 31 +++++++ > include/cmd_spl.h | 30 ++++++ > include/image.h | 2 + > 5 files changed, 293 insertions(+), 0 deletions(-) > create mode 100644 common/cmd_spl.c > create mode 100644 doc/README.commands.spl > create mode 100644 include/cmd_spl.h > > diff --git a/common/Makefile b/common/Makefile > index 2d9ae8c..910c056 100644 > --- a/common/Makefile > +++ b/common/Makefile > @@ -162,6 +162,7 @@ COBJS-$(CONFIG_USB_STORAGE) += usb_storage.o > endif > COBJS-$(CONFIG_CMD_XIMG) += cmd_ximg.o > COBJS-$(CONFIG_YAFFS2) += cmd_yaffs2.o > +COBJS-$(CONFIG_CMD_SPL) += cmd_spl.o > > # others > ifdef CONFIG_DDR_SPD > diff --git a/common/cmd_spl.c b/common/cmd_spl.c > new file mode 100644 > index 0000000..deab8e9 > --- /dev/null > +++ b/common/cmd_spl.c > @@ -0,0 +1,229 @@ > +/* > + * Copyright (C) 2011 > + * Corscience GmbH& Co. KG - Simon Schwarz > + * > + * See file CREDITS for list of people who contributed to this > + * project. > + * > + * This program is free software; you can redistribute it and/or > + * modify it under the terms of the GNU General Public License as > + * published by the Free Software Foundation; either version 2 of > + * the License, or (at your option) any later version. > + * > + * This program is distributed in the hope that it will be useful, > + * but WITHOUT ANY WARRANTY; without even the implied warranty of > + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the > + * GNU General Public License for more details. > + * > + * You should have received a copy of the GNU General Public License > + * along with this program; if not, write to the Free Software > + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, > + * MA 02111-1307 USA > + */ > + > +#include > +#include > +#include > + > +DECLARE_GLOBAL_DATA_PTR; > + > +/* Calls bootm with the parameters given */ > +static int call_bootm(int argc, char * const argv[], char *subcommand[]) > +{ > + char *bootm_argv[5]; > + char command[] = "do_bootm"; > + > + int i = 0; > + int ret = 0; > + > + /* create paramter array */ > + bootm_argv[0] = command; > + switch (argc) { > + case 3: > + bootm_argv[4] = argv[2]; /* fdt addr */ > + case 2: > + bootm_argv[3] = argv[1]; /* initrd addr */ > + case 1: > + bootm_argv[2] = argv[0]; /* kernel addr */ > + } > + > + > + /* > + * - do the work - > + * exec subcommands of do_bootm to init the images > + * data structure > + */ > + while (subcommand[i] != NULL) { > + bootm_argv[1] = subcommand[i]; > + debug("args: %s, %s, %s, %s, %s, %d\n", bootm_argv[0], > + bootm_argv[1], bootm_argv[2], bootm_argv[3], > + bootm_argv[4], argc); > + ret = do_bootm(find_cmd("do_bootm"), 0, argc+2, > + bootm_argv); > + debug("Subcommand retcode: %d\n", ret); > + i++; > + } > + > + if (ret) { > + printf("ERROR prep subcommand failed!\n"); > + return -1; > + } > + > + return 0; > +} > + > +/* assemble the bootm paramteres for fdt creation */ > +static int spl_export_fdt(int argc, char * const argv[]) > +{ > +#ifdef CONFIG_OF_LIBFDT > + /* Create subcommand string */ > + char *subcommand[] = { > + "start", > + "loados", > +#ifdef CONFIG_SYS_BOOT_RAMDISK_HIGH > + "ramdisk", > +#endif > + "fdt", > + "cmdline", > + "bdt", > + "prep", > + NULL}; > + > + /* inspect paramters and execute bootm */ > + argc--; > + argv++; > + if (call_bootm(argc, argv, subcommand)) > + return -1; > + > + printf("Argument image is now in RAM: 0x%p\n", > + (void *)images.ft_addr); > + return 0; > +#else > + printf("Das U-Boot was build without fdt support - aborting\n"); > + return -1; > +#endif > +} > + > +/* assemble the bootm patameters for atags creation */ > +static int spl_export_atags(int argc, char * const argv[]) > +{ > +#if defined(CONFIG_SETUP_MEMORY_TAGS) || \ > + defined(CONFIG_CMDLINE_TAG) || \ > + defined(CONFIG_INITRD_TAG) || \ > + defined(CONFIG_SERIAL_TAG) || \ > + defined(CONFIG_REVISION_TAG) > + /* Create subcommand string */ > + char *subcommand[] = { > + "start", > + "loados", > +#ifdef CONFIG_SYS_BOOT_RAMDISK_HIGH > + "ramdisk", > +#endif > + "cmdline", > + "bdt", > + "prep", > + NULL}; > + > + /* inspect parameters and execute bootm */ > + argc--; > + argv++; > + if (call_bootm(argc, argv, subcommand)) > + return -1; > + > + printf("Argument image is now in RAM at: 0x%p\n", > + (void *)gd->bd->bi_boot_params); > + return 0; > +#endif > + printf("Das U-Boot was build without ATAGS support - aborting\n"); > + return -1; > +} > + > +static cmd_tbl_t cmd_spl_export_sub[] = { > + U_BOOT_CMD_MKENT(fdt, 0, 1, (void *)SPL_EXPORT_FDT, "", ""), > + U_BOOT_CMD_MKENT(atags, 0, 1, (void *)SPL_EXPORT_ATAGS, "", ""), > +}; > + > +static int spl_export(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) > +{ > + const cmd_tbl_t *c; > + int cmd; > + > + if (argc< 2) /* no subcommand */ > + return cmd_usage(cmdtp); > + > + c = find_cmd_tbl(argv[1],&cmd_spl_export_sub[0], > + ARRAY_SIZE(cmd_spl_export_sub)); > + if (c) { > + cmd = (int)c->cmd; > + switch (cmd) { > + case SPL_EXPORT_FDT: > + argc--; > + argv++; > + return spl_export_fdt(argc, argv); > + break; > + case SPL_EXPORT_ATAGS: > + argc--; > + argv++; > + return spl_export_atags(argc, argv); > + break; > + default: > + /* unrecognized command */ > + return cmd_usage(cmdtp); > + } > + } else { > + /* Unrecognized command */ > + return cmd_usage(cmdtp); > + } > + > + return 0; > +} > + > +static cmd_tbl_t cmd_spl_sub[] = { > + U_BOOT_CMD_MKENT(export, 0, 1, (void *)SPL_EXPORT, "", ""), > +}; > + > +static int do_spl(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) > +{ > + const cmd_tbl_t *c; > + int cmd; > + > + if (argc< 2) /* no subcommand */ > + return cmd_usage(cmdtp); > + > + c = find_cmd_tbl(argv[1],&cmd_spl_sub[0], ARRAY_SIZE(cmd_spl_sub)); > + if (c) { > + cmd = (int)c->cmd; > + switch (cmd) { > + case SPL_EXPORT: > + argc--; > + argv++; > + if (spl_export(cmdtp, flag, argc, argv)) > + printf("Subcommand failed\n"); > + break; > + default: > + /* unrecognized command */ > + return cmd_usage(cmdtp); > + } > + } else { > + /* Unrecognized command */ > + return cmd_usage(cmdtp); > + } > + return 0; > +} > + > +/* > + * Arguments: > + * 1: subcommand > + * 2: image_type > + * 3: nand_offset > + * 4: kernel_addr > + * 5: initrd_addr > + * 6: fdt_adr > + */ > + > +U_BOOT_CMD( > + spl, 6 , 1, do_spl, "SPL configuration", > + "export [kernel_addr] [initrd_addr] " > + "[fdt_addr if = fdt] - export a kernel parameter image\n" > + "\t initrd_img can be set to \"-\" if fdt_addr without initrd img is" > + "used"); > diff --git a/doc/README.commands.spl b/doc/README.commands.spl > new file mode 100644 > index 0000000..818dd53 > --- /dev/null > +++ b/doc/README.commands.spl > @@ -0,0 +1,31 @@ > +The spl command is used to export a boot parameter image to RAM. Later > +it may implement more functions connected to the SPL. > + > +SUBCOMMAND EXPORT > +To execute the command everything has to be in place as if bootm should be > +used. (kernel image, initrd-image, fdt-image etc.) > + > +export has to subcommands: two subcommands: > + atags: exports the ATAGS > + fdt: exports the FDT > + > +Call is: > +spl export [kernel_addr] [initrd_addr] [fdt_addr if fdt] > + > + > +TYPICAL CALL > + > +on OMAP3: > +nandecc hw > +nand read 0x82000000 0x280000 0x400000 /* Read kernel image from NAND*/ > +spl export atags /* export ATAGS */ > +nand erase 0x680000 0x20000 /* erase - one page */ > +nand write 0x80000100 0x680000 0x20000 /* write the image - one page */ > + > +call with FDT: > +nandecc hw > +nand read 0x82000000 0x280000 0x400000 /* Read kernel image from NAND*/ > +tftpboot 0x80000100 devkit8000.dtb /* Read fdt */ > +spl export fdt 0x82000000 - 0x80000100 /* export FDT */ > +nand erase 0x680000 0x20000 /* erase - one page */ > +nand write 0x680000 0x20000 > diff --git a/include/cmd_spl.h b/include/cmd_spl.h > new file mode 100644 > index 0000000..2845367 > --- /dev/null > +++ b/include/cmd_spl.h > @@ -0,0 +1,30 @@ > +/* Copyright (C) 2011 > + * Corscience GmbH& Co. KG - Simon Schwarz > + * > + * See file CREDITS for list of people who contributed to this > + * project. > + * > + * This program is free software; you can redistribute it and/or > + * modify it under the terms of the GNU General Public License as > + * published by the Free Software Foundation; either version 2 of > + * the License, or (at your option) any later version. > + * > + * This program is distributed in the hope that it will be useful, > + * but WITHOUT ANY WARRANTY; without even the implied warranty of > + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the > + * GNU General Public License for more details. > + * > + * You should have received a copy of the GNU General Public License > + * along with this program; if not, write to the Free Software > + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, > + * MA 02111-1307 USA > + */ > +#ifndef _NAND_SPL_H_ > +#define _NAND_SPL_H_ > + > +#define SPL_EXPORT (0x00000001) > + > +#define SPL_EXPORT_FDT (0x00000001) > +#define SPL_EXPORT_ATAGS (0x00000002) > + > +#endif /* _NAND_SPL_H_ */ > diff --git a/include/image.h b/include/image.h > index bbf80f0..a1c6e4e 100644 > --- a/include/image.h > +++ b/include/image.h > @@ -268,6 +268,8 @@ typedef struct bootm_headers { > #endif > } bootm_headers_t; > > +extern bootm_headers_t images; > + > /* > * Some systems (for example LWMON) have very short watchdog periods; > * we must make sure to split long operations like memmove() or