typedef void boot_os_Fcn (cmd_tbl_t *cmdtp, bd_t *bd, int flag, int argc, char *argv[],
ulong addr, /* of image to boot */
ulong *len_ptr, /* multi-file image length table */
- ulong data, /* points to first image */
int verify); /* getenv("verify")[0] != 'n' */
static boot_os_Fcn do_bootm_linux;
default: /* handled by (original) Linux case */
case IH_OS_LINUX:
do_bootm_linux (cmdtp, bd, flag, argc, argv,
- addr, len_ptr, data, verify);
+ addr, len_ptr, verify);
break;
case IH_OS_NETBSD:
do_bootm_netbsd (cmdtp, bd, flag, argc, argv,
- addr, len_ptr, data, verify);
+ addr, len_ptr, verify);
break;
}
do_bootm_linux (cmd_tbl_t *cmdtp, bd_t *bd, int flag, int argc, char *argv[],
ulong addr,
ulong *len_ptr,
- ulong data,
int verify)
{
ulong sp;
ulong initrd_start, initrd_end;
ulong cmd_start, cmd_end;
ulong initrd_high;
+ ulong data;
char *cmdline;
char *s;
bd_t *kbd;
asm( "mr %0,1": "=r"(sp) : );
- sp -= 1024; /* just to be sure */
+#ifdef DEBUG
+ printf ("## Current stack ends at 0x%08lX ", sp);
+#endif
+ sp -= 2048; /* just to be sure */
if (sp > CFG_BOOTMAPSZ)
sp = CFG_BOOTMAPSZ;
sp &= ~0xF;
+#ifdef DEBUG
+ printf ("=> set upper limit to 0x%08lX\n", sp);
+#endif
cmdline = (char *)((sp - CFG_BARGSIZE) & ~0xF);
kbd = (bd_t *)(((ulong)cmdline - sizeof(bd_t)) & ~0xF);
cmd_start = (ulong)&cmdline[0];
cmd_end = cmd_start + strlen(cmdline);
+#ifdef DEBUG
+ printf ("## cmdline at 0x%08lX ... 0x%08lX\n", cmd_start, cmd_end);
+#endif
+
*kbd = *bd;
kernel = (void (*)(bd_t *, ulong, ulong, ulong, ulong))hdr->ih_ep;
do_reset (cmdtp, bd, flag, argc, argv);
}
- initrd_start = (ulong)kbd - hdr->ih_size;
+ /*
+ * Now check if we have a multifile image
+ */
+ } else if ((hdr->ih_type==IH_TYPE_MULTI) && (len_ptr[1])) {
+ u_long tail = len_ptr[0] % 4;
+ int i;
+
+#ifdef CONFIG_HERMES
+ hermes_set_led (13);
+#endif
+ /* skip kernel length and terminator */
+ data = (ulong)(&len_ptr[2]);
+ /* skip any additional image length fields */
+ for (i=1; len_ptr[i]; ++i)
+ data += 4;
+ /* add kernel length, and align */
+ data += len_ptr[0];
+ if (tail) {
+ data += 4 - tail;
+ }
+
+ len = len_ptr[1];
+
+ } else {
+ /*
+ * no initrd image
+ */
+#ifdef CONFIG_HERMES
+ hermes_set_led (14);
+#endif
+ data = 0;
+ }
+
+#ifdef DEBUG
+ if (!data) {
+ printf ("No initrd\n");
+ }
+#endif
+
+ if (data) {
+ initrd_start = (ulong)kbd - len;
initrd_start &= ~(4096 - 1); /* align on page */
if (initrd_high) {
* above for command line args and board info.
*/
asm( "mr %0,1": "=r"(nsp) : );
- nsp -= 1024; /* just to be sure */
+ nsp -= 2048; /* just to be sure */
nsp &= ~0xF;
if (nsp > initrd_high) /* limit as specified */
nsp = initrd_high;
#ifdef CONFIG_HERMES
hermes_set_led (12);
#endif
-
+#ifdef DEBUG
+ printf ("## initrd at 0x%08lX ... 0x%08lX (len=%ld=0x%lX)\n",
+ data, data + len - 1, len, len);
+#endif
initrd_end = initrd_start + hdr->ih_size;
printf (" Loading Ramdisk to %08lx, end %08lx ... ",
initrd_start, initrd_end);
- memcpy ((void *)initrd_start,
- (void *)(addr + sizeof(image_header_t)),
- hdr->ih_size );
- printf ("OK\n");
- } else if ((hdr->ih_type==IH_TYPE_MULTI) && (len_ptr[1])) {
- u_long i_start = data + len_ptr[0];
- u_long tail = len_ptr[0] % 4;
-
-#ifdef CONFIG_HERMES
- hermes_set_led (13);
-#endif
- if (tail) {
- i_start += 4 - tail;
- }
-
- initrd_start = (ulong)kbd - len_ptr[1];
- initrd_start &= ~(4096 - 1); /* align on page */
- initrd_end = initrd_start + len_ptr[1];
- printf (" Loading Ramdisk to %08lx ... ", initrd_start);
- memcpy ((void *)initrd_start, (void *)i_start, len_ptr[1]);
+ memmove ((void *)initrd_start, (void *)data, len);
printf ("OK\n");
} else {
- /*
- * no initrd image
- */
-#ifdef CONFIG_HERMES
- hermes_set_led (14);
-#endif
- initrd_start = 0;
- initrd_end = 0;
+ initrd_end = 0;
}
#ifdef DEBUG
do_bootm_netbsd (cmd_tbl_t *cmdtp, bd_t *bd, int flag, int argc, char *argv[],
ulong addr,
ulong *len_ptr,
- ulong data,
int verify)
{
image_header_t *hdr = &header;
/* What is the oscillator's (UX2) frequency in Hz? */
#define CONFIG_8260_CLKIN (33 * 1000 * 1000)
-/* How is switch S2 set? We really only want the MODCK[1-3] bits, so
- * only the 3 least significant bits are important.
-*/
-#define CFG_SBC_S2 0x02
-
-/* What should MODCK_H be? It is dependent on the oscillator
+/*-----------------------------------------------------------------------
+ * MODCK_H & MODCLK[1-3] - Ref: Section 9.2 in MPC8206 User Manual
+ *-----------------------------------------------------------------------
+ * What should MODCK_H be? It is dependent on the oscillator
* frequency, MODCK[1-3], and desired CPM and core frequencies.
- * Some example values (all frequencies are in MHz):
+ * Here are some example values (all frequencies are in MHz):
*
- * MODCK_H MODCK[1-3] Osc CPM Core
- * 0x2 0x2 33 133 133
- * 0x2 0x4 33 133 200
- * 0x5 0x5 66 133 133
- * 0x5 0x7 66 133 200
+ * MODCK_H MODCK[1-3] Osc CPM Core S2-6 S2-7 S2-8
+ * ------- ---------- --- --- ---- ----- ----- -----
+ * 0x2 0x2 33 133 133 Close Open Close
+ * 0x2 0x3 33 133 166 Close Open Open
+ * 0x2 0x4 33 133 200 Open Close Close
+ * 0x2 0x5 33 133 233 Open Close Open
+ * 0x2 0x6 33 133 266 Open Open Close
+ *
+ * 0x5 0x5 66 133 133 Open Close Open
+ * 0x5 0x6 66 133 166 Open Open Close
+ * 0x5 0x7 66 133 200 Open Open Open
+ * 0x6 0x0 66 133 233 Close Close Close
+ * 0x6 0x1 66 133 266 Close Close Open
+ * 0x6 0x2 66 133 300 Close Open Close
*/
#define CFG_SBC_MODCK_H 0x02
#define BOOTFLAG_WARM 0x02 /* Software reboot */
#endif /* __CONFIG_H */
-
-