0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018 #include <stdarg.h>
0019 #include <stddef.h>
0020 #include "types.h"
0021 #include "elf.h"
0022 #include "string.h"
0023 #include "stdio.h"
0024 #include "page.h"
0025 #include "ops.h"
0026 #include "reg.h"
0027 #include "io.h"
0028 #include "dcr.h"
0029 #include "4xx.h"
0030 #include "44x.h"
0031 #include "libfdt.h"
0032
0033 BSS_STACK(4096);
0034
0035 #define MAX_RANKS 0x4
0036 #define DDR3_MR0CF 0x80010011U
0037
0038 static unsigned long long ibm_currituck_memsize;
0039 static unsigned long long ibm_currituck_detect_memsize(void)
0040 {
0041 u32 reg;
0042 unsigned i;
0043 unsigned long long memsize = 0;
0044
0045 for(i = 0; i < MAX_RANKS; i++){
0046 reg = mfdcrx(DDR3_MR0CF + i);
0047
0048 if (!(reg & 1))
0049 continue;
0050
0051 reg &= 0x0000f000;
0052 reg >>= 12;
0053 memsize += (0x800000ULL << reg);
0054 }
0055
0056 return memsize;
0057 }
0058
0059 static void ibm_currituck_fixups(void)
0060 {
0061 void *devp = finddevice("/");
0062 u32 dma_ranges[7];
0063
0064 dt_fixup_memory(0x0ULL, ibm_currituck_memsize);
0065
0066 while ((devp = find_node_by_devtype(devp, "pci"))) {
0067 if (getprop(devp, "dma-ranges", dma_ranges, sizeof(dma_ranges)) < 0) {
0068 printf("%s: Failed to get dma-ranges\r\n", __func__);
0069 continue;
0070 }
0071
0072 dma_ranges[5] = ibm_currituck_memsize >> 32;
0073 dma_ranges[6] = ibm_currituck_memsize & 0xffffffffUL;
0074
0075 setprop(devp, "dma-ranges", dma_ranges, sizeof(dma_ranges));
0076 }
0077 }
0078
0079 #define SPRN_PIR 0x11E
0080 void platform_init(void)
0081 {
0082 unsigned long end_of_ram, avail_ram;
0083 u32 pir_reg;
0084 int node, size;
0085 const u32 *timebase;
0086
0087 ibm_currituck_memsize = ibm_currituck_detect_memsize();
0088 if (ibm_currituck_memsize >> 32)
0089 end_of_ram = ~0UL;
0090 else
0091 end_of_ram = ibm_currituck_memsize;
0092 avail_ram = end_of_ram - (unsigned long)_end;
0093
0094 simple_alloc_init(_end, avail_ram, 128, 64);
0095 platform_ops.fixups = ibm_currituck_fixups;
0096 platform_ops.exit = ibm44x_dbcr_reset;
0097 pir_reg = mfspr(SPRN_PIR);
0098
0099
0100 if (fdt_check_header(_dtb_start) != 0)
0101 fatal("Invalid device tree blob\n");
0102
0103 node = fdt_node_offset_by_prop_value(_dtb_start, -1, "device_type",
0104 "cpu", sizeof("cpu"));
0105 if (!node)
0106 fatal("Cannot find cpu node\n");
0107 timebase = fdt_getprop(_dtb_start, node, "timebase-frequency", &size);
0108 if (timebase && (size == 4))
0109 timebase_period_ns = 1000000000 / *timebase;
0110
0111 fdt_set_boot_cpuid_phys(_dtb_start, pir_reg);
0112 fdt_init(_dtb_start);
0113
0114 serial_console_init();
0115 }