#include <asm/addrspace.h>
#include <ar7240_soc.h>
-//#define DEBUG
+/* #define DEBUG */
DECLARE_GLOBAL_DATA_PTR;
-#define LINUX_MAX_ENVS 512 // was 256
-#define LINUX_MAX_ARGS 512 // was 256
+#define LINUX_MAX_ENVS 512
+#define LINUX_MAX_ARGS 512
-/* from cmd_bootm.c */
+/* From cmd_bootm.c */
extern image_header_t header;
-/* from cpu.c */
-extern int do_reset(cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]);
-
static int linux_argc;
-static char ** linux_argv;
-
-static char ** linux_env;
-static char * linux_env_p;
static int linux_env_idx;
-static void linux_params_init(ulong start, char * commandline);
-static void linux_env_set(char * env_name, char * env_val);
-
-#ifdef CONFIG_WASP_SUPPORT
-void wasp_set_cca(void){
- /* set cache coherency attribute */
- asm("mfc0 $t0, $16\n" /* CP0_CONFIG == 16 */
- "li $t1, ~7\n"
- "and $t0, $t0, $t1\n"
- "ori $t0, 3\n" /* CONF_CM_CACHABLE_NONCOHERENT */
- "mtc0 $t0, $16\n" /* CP0_CONFIG == 16 */
- "nop\n": : );
+static char **linux_argv;
+static char **linux_env;
+static char *linux_env_p;
+
+#if defined(CONFIG_WASP_SUPPORT)
+void wasp_set_cca(void)
+{
+ /* Set cache coherency attribute */
+ asm("mfc0 $t0, $16\n" /* CP0_CONFIG == 16 */
+ "li $t1, ~7\n"
+ "and $t0, $t0, $t1\n"
+ "ori $t0, 3\n" /* CONF_CM_CACHABLE_NONCOHERENT */
+ "mtc0 $t0, $16\n" /* CP0_CONFIG == 16 */
+ "nop\n": : );
}
#endif
-void do_bootm_linux(cmd_tbl_t * cmdtp, int flag, int argc, char *argv[]){
- //ulong initrd_start = 0, initrd_end = 0;
- int flash_size_mbytes;
- void(*theKernel)(int, char **, char **, int);
- image_header_t *hdr = &header;
- char *commandline = getenv("bootargs");
- char env_buf[12];
-
- theKernel = (void (*)(int, char **, char **, int))ntohl(hdr->ih_ep);
-
-#ifdef DEBUG
- printf("## Bootargs: %s\n", commandline);
- printf("## Transferring control to Linux (at address %08lx) ...\n", (ulong)theKernel);
-#endif
-
- linux_params_init(UNCACHED_SDRAM(gd->bd->bi_boot_params), commandline);
-
- sprintf(env_buf, "%lu", gd->ram_size >> 20);
-
-#ifdef DEBUG
- printf("## Giving linux memsize in MB, %lu\n", gd->ram_size >> 20);
-#endif
-
- linux_env_set("memsize", env_buf);
-
- //sprintf(env_buf, "0x%08X", (uint)UNCACHED_SDRAM(initrd_start));
- //linux_env_set("initrd_start", env_buf);
-
- //sprintf(env_buf, "0x%X", (uint)(initrd_end - initrd_start));
- //linux_env_set("initrd_size", env_buf);
-
- sprintf(env_buf, "0x%08X", (uint)(gd->bd->bi_flashstart));
- linux_env_set("flash_start", env_buf);
-
- sprintf(env_buf, "0x%X", (uint)(gd->bd->bi_flashsize));
- linux_env_set("flash_size", env_buf);
-
- // we assume that the kernel is in place
- printf("Starting kernel...\n\n");
-
-#ifdef CONFIG_WASP_SUPPORT
- wasp_set_cca();
-#endif
-
-#if defined(CONFIG_FOR_DRAGINO_V2) || defined(CONFIG_FOR_MESH_POTATO_V2)
- // Restore WAN/LAN LEDs (BIT 3 and 7 in GPIO_FUNCTION_1)
- ar7240_reg_wr(AR7240_GPIO_FUNC, (ar7240_reg_rd(AR7240_GPIO_FUNC) | 0x88));
-#endif
-
- // Pass the flash size as expected by current Linux kernel for AR7100
- flash_size_mbytes = gd->bd->bi_flashsize/(1024 * 1024);
- theKernel(linux_argc, linux_argv, linux_env, flash_size_mbytes);
-}
-
-static void linux_params_init(ulong start, char *line){
+static void linux_params_init(ulong start, char *cmdline)
+{
+ char memstr[16];
char *next, *quote, *argp;
- char memstr[32];
linux_argc = 1;
linux_argv = (char **)start;
linux_argv[0] = 0;
argp = (char *)(linux_argv + LINUX_MAX_ARGS);
- next = line;
+ next = cmdline;
- if(strstr(line, "mem=")){
+ if (strstr(cmdline, "mem="))
memstr[0] = 0;
- } else {
+ else
memstr[0] = 1;
- }
- while(line && *line && linux_argc < LINUX_MAX_ARGS){
- quote = strchr(line, '"');
- next = strchr(line, ' ');
+ while (cmdline && *cmdline && linux_argc < LINUX_MAX_ARGS) {
+ quote = strchr(cmdline, '"');
+ next = strchr(cmdline, ' ');
- while(next != NULL && quote != NULL && quote < next){
- /* we found a left quote before the next blank
+ while (next != NULL && quote != NULL && quote < next) {
+ /*
+ * We found a left quote before the next blank
* now we have to find the matching right quote
*/
next = strchr(quote + 1, '"');
- if(next != NULL){
+ if (next != NULL) {
quote = strchr(next + 1, '"');
- next = strchr(next + 1, ' ');
+ next = strchr(next + 1, ' ');
}
}
- if(next == NULL){
- next = line + strlen(line);
- }
+ if (next == NULL)
+ next = cmdline + strlen(cmdline);
linux_argv[linux_argc] = argp;
- memcpy(argp, line, next - line);
- argp[next - line] = 0;
+ memcpy(argp, cmdline, next - cmdline);
+ argp[next - cmdline] = 0;
- argp += next - line + 1;
+ argp += next - cmdline + 1;
linux_argc++;
- if(*next){
+ if (*next)
next++;
- }
- line = next;
+ cmdline = next;
}
- /* Add mem size to command line */
- if(memstr[0]){
+ /* Add mem size to command line if it's missing' */
+ if (memstr[0]) {
sprintf(memstr, "mem=%luM", gd->ram_size >> 20);
- memcpy(argp, memstr, strlen(memstr)+1);
+ memcpy(argp, memstr, strlen(memstr) + 1);
+
linux_argv[linux_argc] = argp;
linux_argc++;
+
argp += strlen(memstr) + 1;
}
linux_env = (char **)(((ulong)argp + 15) & ~15);
linux_env[0] = 0;
+
linux_env_p = (char *)(linux_env + LINUX_MAX_ENVS);
linux_env_idx = 0;
}
-static void linux_env_set(char *env_name, char *env_val){
- if(linux_env_idx < LINUX_MAX_ENVS - 1){
+static void linux_env_set(char *env_name, char *env_val)
+{
+ if (linux_env_idx < LINUX_MAX_ENVS - 1) {
linux_env[linux_env_idx] = linux_env_p;
strcpy(linux_env_p, env_name);
linux_env[++linux_env_idx] = 0;
}
}
+
+void do_bootm_linux(cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
+{
+ char buf[16];
+ char *cmdline;
+ unsigned int flash_mb;
+ image_header_t *hdr = &header;
+ void(*theKernel)(int, char **, char **, int);
+
+ cmdline = getenv("bootargs");
+
+ theKernel = (void (*)(int, char **, char **, int))ntohl(hdr->ih_ep);
+
+#if defined(DEBUG)
+ printf("## Bootargs: %s\n", cmdline);
+ printf("## Transferring control to Linux (at address %08lx) ...\n",
+ (ulong)theKernel);
+#endif
+
+ linux_params_init(UNCACHED_SDRAM(gd->bd->bi_boot_params), cmdline);
+
+#if defined(DEBUG)
+ printf("## Giving linux memsize in MB, %lu\n", gd->ram_size >> 20);
+#endif
+
+ sprintf(buf, "%lu", gd->ram_size >> 20);
+ linux_env_set("memsize", buf);
+
+ sprintf(buf, "0x%X", (unsigned int)(gd->bd->bi_flashstart));
+ linux_env_set("flash_start", buf);
+
+ sprintf(buf, "0x%X", (unsigned int)(gd->bd->bi_flashsize));
+ linux_env_set("flash_size", buf);
+
+ /* We assume that the kernel is in place */
+ printf("Starting kernel...\n\n");
+
+#if defined(CONFIG_WASP_SUPPORT)
+ wasp_set_cca();
+#endif
+
+#if defined(CONFIG_FOR_DRAGINO_V2) || defined(CONFIG_FOR_MESH_POTATO_V2)
+ /* Restore WAN/LAN LEDs (BIT 3 and 7 in GPIO_FUNCTION_1) */
+ ar7240_reg_wr(AR7240_GPIO_FUNC,
+ (ar7240_reg_rd(AR7240_GPIO_FUNC) | 0x88));
+#endif
+
+ /* Pass the flash size as expected by current Linux kernel for AR7100 */
+ flash_mb = gd->bd->bi_flashsize >> 20;
+ theKernel(linux_argc, linux_argv, linux_env, flash_mb);
+}