--- /dev/null +++ b/arch/powerpc/boot/rb600.c @@ -0,0 +1,80 @@ +/* + * The RouterBOARD platform -- for booting RB600(A) RouterBOARDs. + * + * Author: Michael Guntsche + * + * Copyright (c) 2009 Michael Guntsche + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 as published + * by the Free Software Foundation. + */ + +#include "ops.h" +#include "types.h" +#include "io.h" +#include "stdio.h" +#include + +BSS_STACK(4*1024); + +u64 memsize64; +const void *fw_dtb; + +static void rb600_fixups(void) +{ + const u32 *reg, *timebase, *clock; + int node, size; + void *chosen; + const char* bootargs; + + dt_fixup_memory(0, memsize64); + + /* Set the MAC addresses. */ + node = fdt_path_offset(fw_dtb, "/soc8343@e0000000/ethernet@24000"); + reg = fdt_getprop(fw_dtb, node, "mac-address", &size); + dt_fixup_mac_address_by_alias("ethernet1", (const u8 *)reg); + + node = fdt_path_offset(fw_dtb, "/soc8343@e0000000/ethernet@25000"); + reg = fdt_getprop(fw_dtb, node, "mac-address", &size); + dt_fixup_mac_address_by_alias("ethernet0", (const u8 *)reg); + + /* Find the CPU timebase and clock frequencies. */ + node = fdt_node_offset_by_prop_value(fw_dtb, -1, "device_type", "cpu", sizeof("cpu")); + timebase = fdt_getprop(fw_dtb, node, "timebase-frequency", &size); + clock = fdt_getprop(fw_dtb, node, "clock-frequency", &size); + dt_fixup_cpu_clocks(*clock, *timebase, 0); + + /* Fixup chosen + * The bootloader reads the kernelparm segment and adds the content to + * bootargs. This is needed to specify root and other boot flags. + */ + chosen = finddevice("/chosen"); + node = fdt_path_offset(fw_dtb, "/chosen"); + bootargs = fdt_getprop(fw_dtb, node, "bootargs", &size); + setprop_str(chosen, "bootargs", bootargs); +} + +void platform_init(unsigned long r3, unsigned long r4, unsigned long r5, + unsigned long r6, unsigned long r7) +{ + const u32 *reg; + int node, size; + + fw_dtb = (const void *)r3; + + /* Find the memory range. */ + node = fdt_node_offset_by_prop_value(fw_dtb, -1, "device_type", "memory", sizeof("memory")); + reg = fdt_getprop(fw_dtb, node, "reg", &size); + memsize64 = reg[1]; + + /* Now we have the memory size; initialize the heap. */ + simple_alloc_init(_end, memsize64 - (unsigned long)_end, 32, 64); + + /* Prepare the device tree and find the console. */ + fdt_init(_dtb_start); + serial_console_init(); + + /* Remaining fixups... */ + platform_ops.fixups = rb600_fixups; +}