/* * Copyright (c) 2008 PIKA Technologies * Sean MacLennan * * 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 "4xx.h" #include "cuboot.h" #include "stdio.h" #define TARGET_4xx #define TARGET_44x #include "ppcboot.h" static bd_t bd; static void warp_fixup_one_nor(u32 from, u32 to) { void *devp; char name[50]; u32 v[2]; sprintf(name, "/plb/opb/ebc/nor_flash@0,0/partition@%x", from); devp = finddevice(name); if (!devp) return; if (getprop(devp, "reg", v, sizeof(v)) == sizeof(v)) { v[0] = to; setprop(devp, "reg", v, sizeof(v)); printf("NOR 64M fixup %x -> %x\r\n", from, to); } } static void warp_fixups(void) { ibm440ep_fixup_clocks(66000000, 11059200, 50000000); ibm4xx_sdram_fixup_memsize(); ibm4xx_fixup_ebc_ranges("/plb/opb/ebc"); dt_fixup_mac_address_by_alias("ethernet0", bd.bi_enetaddr); /* Fixup for 64M flash on Rev A boards. */ if (bd.bi_flashsize == 0x4000000) { void *devp; u32 v[3]; devp = finddevice("/plb/opb/ebc/nor_flash@0,0"); if (!devp) return; /* Fixup the size */ if (getprop(devp, "reg", v, sizeof(v)) == sizeof(v)) { v[2] = bd.bi_flashsize; setprop(devp, "reg", v, sizeof(v)); } /* Fixup parition offsets */ warp_fixup_one_nor(0x300000, 0x3f00000); warp_fixup_one_nor(0x340000, 0x3f40000); warp_fixup_one_nor(0x380000, 0x3f80000); } } void platform_init(unsigned long r3, unsigned long r4, unsigned long r5, unsigned long r6, unsigned long r7) { CUBOOT_INIT(); platform_ops.fixups = warp_fixups; platform_ops.exit = ibm44x_dbcr_reset; fdt_init(_dtb_start); serial_console_init(); }