static void platform_fixups(void) { u64 val; void *nvrtc; dt_fixup_memory(0, mem_size); planetcore_set_mac_addrs(table); if (!planetcore_get_decimal(table, PLANETCORE_KEY_CRYSTAL_HZ, &val)) { printf("No PlanetCore crystal frequency key.\r\n"); return; } ibm405gp_fixup_clocks(val, 0xa8c000); ibm4xx_quiesce_eth((u32 *)0xef600800, NULL); ibm4xx_fixup_ebc_ranges("/plb/ebc"); if (!planetcore_get_decimal(table, PLANETCORE_KEY_KB_NVRAM, &val)) { printf("No PlanetCore NVRAM size key.\r\n"); return; } nvrtc = finddevice("/plb/ebc/nvrtc@4,200000"); if (nvrtc != NULL) { u32 reg[3] = { 4, 0x200000, 0}; getprop(nvrtc, "reg", reg, 3); reg[2] = (val << 10) & 0xffffffff; setprop(nvrtc, "reg", reg, 3); } }
static void platform_fixups(void) { void *soc; dt_fixup_memory(bd.bi_memstart, bd.bi_memsize); dt_fixup_mac_addresses(bd.bi_enetaddr, bd.bi_enet1addr, bd.bi_enet2addr); dt_fixup_cpu_clocks(bd.bi_intfreq, bd.bi_busfreq / 8, bd.bi_busfreq); /* Unfortunately, the specific model number is encoded in the * soc node name in existing dts files -- once that is fixed, * this can do a simple path lookup. */ soc = find_node_by_devtype(NULL, "soc"); if (soc) { void *serial = NULL; setprop(soc, "bus-frequency", &bd.bi_busfreq, sizeof(bd.bi_busfreq)); while ((serial = find_node_by_devtype(serial, "serial"))) { if (get_parent(serial) != soc) continue; setprop(serial, "clock-frequency", &bd.bi_busfreq, sizeof(bd.bi_busfreq)); } } }
static void platform_fixups(void) { void *devp; dt_fixup_memory(bd.bi_memstart, bd.bi_memsize); dt_fixup_mac_address_by_alias("ethernet0", bd.bi_enetaddr); dt_fixup_mac_address_by_alias("ethernet1", bd.bi_enet1addr); dt_fixup_mac_address_by_alias("ethernet2", bd.bi_enet2addr); dt_fixup_cpu_clocks(bd.bi_intfreq, bd.bi_busfreq / 8, bd.bi_busfreq); devp = find_node_by_devtype(NULL, "soc"); if (devp) { void *serial = NULL; setprop(devp, "bus-frequency", &bd.bi_busfreq, sizeof(bd.bi_busfreq)); while ((serial = find_node_by_devtype(serial, "serial"))) { if (get_parent(serial) != devp) continue; setprop(serial, "clock-frequency", &bd.bi_busfreq, sizeof(bd.bi_busfreq)); } } devp = find_node_by_compatible(NULL, "fsl,cpm2-brg"); if (devp) setprop(devp, "clock-frequency", &bd.bi_brgfreq, sizeof(bd.bi_brgfreq)); }
static void platform_fixups(void) { void *soc, *mpic; dt_fixup_memory(0, mem_size); dt_fixup_mac_address_by_alias("ethernet0", enetaddr); dt_fixup_cpu_clocks(int_freq, bus_freq / 8, bus_freq); /* Unfortunately, the specific model number is encoded in the * soc node name in existing dts files -- once that is fixed, * this can do a simple path lookup. */ soc = find_node_by_devtype(NULL, "soc"); if (soc) { void *serial = NULL; setprop(soc, "bus-frequency", &bus_freq, sizeof(bus_freq)); while ((serial = find_node_by_devtype(serial, "serial"))) { if (get_parent(serial) != soc) continue; setprop(serial, "clock-frequency", &bus_freq, sizeof(bus_freq)); } } mpic = find_node_by_compatible(NULL, "fsl,mpic"); if (mpic) setprop(mpic, "clock-frequency", &bus_freq, sizeof(bus_freq)); }
static void platform_fixups(void) { void *devp; dt_fixup_memory(bd.bi_memstart, bd.bi_memsize); dt_fixup_mac_address_by_alias("ethernet0", bd.bi_enetaddr); dt_fixup_mac_address_by_alias("ethernet1", bd.bi_enet1addr); dt_fixup_mac_address_by_alias("ethernet2", bd.bi_enet2addr); dt_fixup_cpu_clocks(bd.bi_intfreq, bd.bi_busfreq / 8, bd.bi_busfreq); /* Unfortunately, the specific model number is encoded in the * soc node name in existing dts files -- once that is fixed, * this can do a simple path lookup. */ devp = find_node_by_devtype(NULL, "soc"); if (devp) { void *serial = NULL; setprop(devp, "bus-frequency", &bd.bi_busfreq, sizeof(bd.bi_busfreq)); while ((serial = find_node_by_devtype(serial, "serial"))) { if (get_parent(serial) != devp) continue; setprop(serial, "clock-frequency", &bd.bi_busfreq, sizeof(bd.bi_busfreq)); } } devp = find_node_by_compatible(NULL, "fsl,cpm2-brg"); if (devp) setprop(devp, "clock-frequency", &bd.bi_brgfreq, sizeof(bd.bi_brgfreq)); }
static void kilauea_fixups(void) { unsigned long sysclk = 33333333; ibm405ex_fixup_clocks(sysclk, KILAUEA_SYS_EXT_SERIAL_CLOCK); dt_fixup_memory(bd.bi_memstart, bd.bi_memsize); ibm4xx_fixup_ebc_ranges("/plb/opb/ebc"); dt_fixup_mac_address_by_alias("ethernet0", bd.bi_enetaddr); dt_fixup_mac_address_by_alias("ethernet1", bd.bi_enet1addr); }
static void platform_fixups(void) { void *tsi; dt_fixup_memory(bd.bi_memstart, bd.bi_memsize); dt_fixup_mac_addresses(bd.bi_enetaddr, bd.bi_enet1addr); dt_fixup_cpu_clocks(bd.bi_intfreq, bd.bi_busfreq / 4, bd.bi_busfreq); tsi = find_node_by_devtype(NULL, "tsi-bridge"); if (tsi) setprop(tsi, "bus-frequency", &bd.bi_busfreq, sizeof(bd.bi_busfreq)); }
static void platform_fixups(void) { void *node; dt_fixup_memory(bd.bi_memstart, bd.bi_memsize); dt_fixup_mac_addresses(bd.bi_enetaddr); dt_fixup_cpu_clocks(bd.bi_intfreq, bd.bi_busfreq / 16, bd.bi_busfreq); node = finddevice("/soc/cpm/brg"); if (node) { printf("BRG clock-frequency <- 0x%x (%dMHz)\r\n", bd.bi_busfreq, MHZ(bd.bi_busfreq)); setprop(node, "clock-frequency", &bd.bi_busfreq, 4); } }
static void pq2_platform_fixups(void) { void *node; dt_fixup_memory(bd.bi_memstart, bd.bi_memsize); dt_fixup_mac_addresses(bd.bi_enetaddr, bd.bi_enet1addr); dt_fixup_cpu_clocks(bd.bi_intfreq, bd.bi_busfreq / 4, bd.bi_busfreq); node = finddevice("/soc/cpm"); if (node) setprop(node, "clock-frequency", &bd.bi_cpmfreq, 4); node = finddevice("/soc/cpm/brg"); if (node) setprop(node, "clock-frequency", &bd.bi_brgfreq, 4); update_cs_ranges(); fixup_pci(); }
void platform_init(unsigned long null_check) { const u32 heapsize = 0x1000000 - (u32)_end; /* 16MiB */ void *chosen; unsigned long ft_addr; u64 rm_size; unsigned long val; console_ops.write = ps3_console_write; platform_ops.exit = ps3_exit; printf("\n-- PS3 bootwrapper --\n"); simple_alloc_init(_end, heapsize, 32, 64); fdt_init(_dtb_start); chosen = finddevice("/chosen"); ps3_repository_read_rm_size(&rm_size); dt_fixup_memory(0, rm_size); if (_initrd_end > _initrd_start) { setprop_val(chosen, "linux,initrd-start", (u32)(_initrd_start)); setprop_val(chosen, "linux,initrd-end", (u32)(_initrd_end)); } prep_cmdline(chosen); ft_addr = dt_ops.finalize(); ps3_copy_vectors(); printf(" flat tree at 0x%lx\n\r", ft_addr); val = *(unsigned long *)0; if (val != null_check) printf("null check failed: %lx != %lx\n\r", val, null_check); ((kernel_entry_t)0)(ft_addr, 0, NULL); ps3_exit(); }
static void platform_fixups(void) { void *soc; dt_fixup_memory(bd.bi_memstart, bd.bi_memsize); dt_fixup_mac_addresses(bd.bi_enetaddr); dt_fixup_cpu_clocks(bd.bi_intfreq, bd.bi_busfreq / 4, bd.bi_busfreq); soc = find_node_by_devtype(NULL, "soc"); if (soc) { void *serial = NULL; setprop(soc, "bus-frequency", &bd.bi_busfreq, sizeof(bd.bi_busfreq)); while ((serial = find_node_by_devtype(serial, "serial"))) { if (get_parent(serial) != soc) continue; setprop(serial, "clock-frequency", &bd.bi_busfreq, sizeof(bd.bi_busfreq)); } } }
static void platform_fixups(void) { struct mipc_infohdr **hdrp, *hdr; u32 reg[4]; u32 mem2_boundary, top; void *devp; /* * The mini header pointer is specified in the second "reg" entry * of the starlet-mini-ipc node. */ devp = find_node_by_compatible(NULL, "twiizers,starlet-mini-ipc"); if (!devp) { printf("unable to find %s node\n", "twiizers,starlet-mini-ipc"); goto err_out; } if (getprop(devp, "reg", ®, sizeof(reg)) != sizeof(reg)) { printf("unable to find %s property\n", "reg"); goto err_out; } hdrp = (struct mipc_infohdr **)reg[2]; if (mipc_check_address((u32)hdrp)) { printf("mini: invalid hdrp %08X\n", (u32)hdrp); goto err_out; } hdr = *hdrp; if (mipc_check_address((u32)hdr)) { printf("mini: invalid hdr %08X\n", (u32)hdr); goto err_out; } if (memcmp(hdr->magic, "IPC", 3)) { printf("mini: invalid magic, asuming ios\n"); goto err_out; } mem2_boundary = hdr->mem2_boundary; if (mipc_check_address(mem2_boundary)) { printf("mini: invalid mem2_boundary %08X\n", mem2_boundary); goto err_out; } top = mem2_boundary; printf("top of mem @ %08X (%s)\n", top, "current"); /* fixup local memory for EHCI controller */ devp = NULL; while ((devp = find_node_by_compatible(devp, "nintendo,hollywood-ehci"))) { if (getprop(devp, "reg", ®, sizeof(reg)) == sizeof(reg)) { top -= reg[3]; printf("ehci %08X -> %08X\n", reg[2], top); reg[2] = top; setprop(devp, "reg", ®, sizeof(reg)); } } /* fixup local memory for OHCI controllers */ devp = NULL; while ((devp = find_node_by_compatible(devp, "nintendo,hollywood-ohci"))) { if (getprop(devp, "reg", ®, sizeof(reg)) == sizeof(reg)) { top -= reg[3]; printf("ohci %08X -> %08X\n", reg[2], top); reg[2] = top; setprop(devp, "reg", ®, sizeof(reg)); } } /* fixup available memory */ dt_fixup_memory(0, top); printf("top of mem @ %08X (%s)\n", top, "final"); return; err_out: return; }
static void platform_fixups(void) { dt_fixup_memory(bd.bi_memstart, bd.bi_memsize); dt_fixup_cpu_clocks(bd.bi_intfreq, bd.bi_busfreq / 4, bd.bi_busfreq); }