X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=common%2Fboard_f.c;h=d3444c7edc93c4781f40f36755bcf81b46600e9b;hb=7a1a01c6029039e4fa6aa185cdbbf9a357eecba7;hp=591f18f391e22e7ae515c265de050e63f5d7e156;hpb=ba83753289f5ad99f64e72fd0ee141c647aeda0f;p=platform%2Fkernel%2Fu-boot.git diff --git a/common/board_f.c b/common/board_f.c index 591f18f..d3444c7 100644 --- a/common/board_f.c +++ b/common/board_f.c @@ -11,21 +11,28 @@ #include #include +#include +#include #include #include +#include #include #include #include #include #include +#include #include +#include #include #include +#include #include #include #include #include #include +#include #ifdef CONFIG_SPL #include #endif @@ -35,6 +42,7 @@ #include #include #include +#include #ifdef CONFIG_MACH_TYPE #include #endif @@ -178,11 +186,11 @@ static int print_cpuinfo(void) char desc[512]; int ret; - ret = uclass_first_device_err(UCLASS_CPU, &dev); - if (ret) { - debug("%s: Could not get CPU device (err = %d)\n", - __func__, ret); - return ret; + dev = cpu_get_current_dev(); + if (!dev) { + debug("%s: Could not get CPU device\n", + __func__); + return -ENODEV; } ret = cpu_get_desc(dev, desc, sizeof(desc)); @@ -246,11 +254,7 @@ __weak int dram_init_banksize(void) static int init_func_i2c(void) { puts("I2C: "); -#ifdef CONFIG_SYS_I2C i2c_init_all(); -#else - i2c_init(CONFIG_SYS_I2C_SPEED, CONFIG_SYS_I2C_SLAVE); -#endif puts("ready\n"); return 0; } @@ -304,7 +308,7 @@ __weak int mach_cpu_init(void) /* Get the top of usable RAM */ __weak ulong board_get_usable_ram_top(ulong total_size) { -#ifdef CONFIG_SYS_SDRAM_BASE +#if defined(CONFIG_SYS_SDRAM_BASE) && CONFIG_SYS_SDRAM_BASE > 0 /* * Detect whether we have so much RAM that it goes past the end of our * 32-bit address space. If so, clip the usable RAM so it doesn't. @@ -380,33 +384,10 @@ static int reserve_round_4k(void) return 0; } -#ifdef CONFIG_ARM -__weak int reserve_mmu(void) +__weak int arch_reserve_mmu(void) { -#if !(CONFIG_IS_ENABLED(SYS_ICACHE_OFF) && CONFIG_IS_ENABLED(SYS_DCACHE_OFF)) - /* reserve TLB table */ - gd->arch.tlb_size = PGTABLE_SIZE; - gd->relocaddr -= gd->arch.tlb_size; - - /* round down to next 64 kB limit */ - gd->relocaddr &= ~(0x10000 - 1); - - gd->arch.tlb_addr = gd->relocaddr; - debug("TLB table from %08lx to %08lx\n", gd->arch.tlb_addr, - gd->arch.tlb_addr + gd->arch.tlb_size); - -#ifdef CONFIG_SYS_MEM_RESERVE_SECURE - /* - * Record allocated tlb_addr in case gd->tlb_addr to be overwritten - * with location within secure ram. - */ - gd->arch.tlb_allocated = gd->arch.tlb_addr; -#endif -#endif - return 0; } -#endif static int reserve_video(void) { @@ -467,6 +448,17 @@ static int reserve_uboot(void) return 0; } +/* + * reserve after start_addr_sp the requested size and make the stack pointer + * 16-byte aligned, this alignment is needed for cast on the reserved memory + * ref = x86_64 ABI: https://reviews.llvm.org/D30049: 16 bytes + * = ARMv8 Instruction Set Overview: quad word, 16 bytes + */ +static unsigned long reserve_stack_aligned(size_t size) +{ + return ALIGN_DOWN(gd->start_addr_sp - size, 16); +} + #ifdef CONFIG_SYS_NONCACHED_MEMORY static int reserve_noncached(void) { @@ -492,7 +484,7 @@ static int reserve_noncached(void) /* reserve memory for malloc() area */ static int reserve_malloc(void) { - gd->start_addr_sp = gd->start_addr_sp - TOTAL_MALLOC_LEN; + gd->start_addr_sp = reserve_stack_aligned(TOTAL_MALLOC_LEN); debug("Reserving %dk for malloc() at: %08lx\n", TOTAL_MALLOC_LEN >> 10, gd->start_addr_sp); #ifdef CONFIG_SYS_NONCACHED_MEMORY @@ -506,11 +498,12 @@ static int reserve_malloc(void) static int reserve_board(void) { if (!gd->bd) { - gd->start_addr_sp -= sizeof(bd_t); - gd->bd = (bd_t *)map_sysmem(gd->start_addr_sp, sizeof(bd_t)); - memset(gd->bd, '\0', sizeof(bd_t)); + gd->start_addr_sp = reserve_stack_aligned(sizeof(struct bd_info)); + gd->bd = (struct bd_info *)map_sysmem(gd->start_addr_sp, + sizeof(struct bd_info)); + memset(gd->bd, '\0', sizeof(struct bd_info)); debug("Reserving %zu Bytes for Board Info at: %08lx\n", - sizeof(bd_t), gd->start_addr_sp); + sizeof(struct bd_info), gd->start_addr_sp); } return 0; } @@ -525,7 +518,7 @@ static int setup_machine(void) static int reserve_global_data(void) { - gd->start_addr_sp -= sizeof(gd_t); + gd->start_addr_sp = reserve_stack_aligned(sizeof(gd_t)); gd->new_gd = (gd_t *)map_sysmem(gd->start_addr_sp, sizeof(gd_t)); debug("Reserving %zu Bytes for Global Data at: %08lx\n", sizeof(gd_t), gd->start_addr_sp); @@ -541,9 +534,9 @@ static int reserve_fdt(void) * will be relocated with other data. */ if (gd->fdt_blob) { - gd->fdt_size = ALIGN(fdt_totalsize(gd->fdt_blob) + 0x1000, 32); + gd->fdt_size = ALIGN(fdt_totalsize(gd->fdt_blob), 32); - gd->start_addr_sp -= gd->fdt_size; + gd->start_addr_sp = reserve_stack_aligned(gd->fdt_size); gd->new_fdt = map_sysmem(gd->start_addr_sp, gd->fdt_size); debug("Reserving %lu Bytes for FDT at: %08lx\n", gd->fdt_size, gd->start_addr_sp); @@ -558,7 +551,7 @@ static int reserve_bootstage(void) #ifdef CONFIG_BOOTSTAGE int size = bootstage_get_size(); - gd->start_addr_sp -= size; + gd->start_addr_sp = reserve_stack_aligned(size); gd->new_bootstage = map_sysmem(gd->start_addr_sp, size); debug("Reserving %#x Bytes for bootstage at: %08lx\n", size, gd->start_addr_sp); @@ -575,8 +568,7 @@ __weak int arch_reserve_stacks(void) static int reserve_stacks(void) { /* make stack pointer 16-byte aligned */ - gd->start_addr_sp -= 16; - gd->start_addr_sp &= ~0xf; + gd->start_addr_sp = reserve_stack_aligned(16); /* * let the architecture-specific code tailor gd->start_addr_sp and @@ -588,7 +580,7 @@ static int reserve_stacks(void) static int reserve_bloblist(void) { #ifdef CONFIG_BLOBLIST - gd->start_addr_sp -= CONFIG_BLOBLIST_SIZE; + gd->start_addr_sp = reserve_stack_aligned(CONFIG_BLOBLIST_SIZE); gd->new_bloblist = map_sysmem(gd->start_addr_sp, CONFIG_BLOBLIST_SIZE); #endif @@ -602,62 +594,25 @@ static int display_new_sp(void) return 0; } -#if defined(CONFIG_M68K) || defined(CONFIG_MIPS) || defined(CONFIG_PPC) || \ - defined(CONFIG_SH) -static int setup_board_part1(void) +__weak int arch_setup_bdinfo(void) { - bd_t *bd = gd->bd; - - /* - * Save local variables to board info struct - */ - bd->bi_memstart = CONFIG_SYS_SDRAM_BASE; /* start of memory */ - bd->bi_memsize = gd->ram_size; /* size in bytes */ - -#ifdef CONFIG_SYS_SRAM_BASE - bd->bi_sramstart = CONFIG_SYS_SRAM_BASE; /* start of SRAM */ - bd->bi_sramsize = CONFIG_SYS_SRAM_SIZE; /* size of SRAM */ -#endif - -#if defined(CONFIG_E500) || defined(CONFIG_MPC86xx) - bd->bi_immr_base = CONFIG_SYS_IMMR; /* base of IMMR register */ -#endif -#if defined(CONFIG_M68K) - bd->bi_mbar_base = CONFIG_SYS_MBAR; /* base of internal registers */ -#endif -#if defined(CONFIG_MPC83xx) - bd->bi_immrbar = CONFIG_SYS_IMMR; -#endif - return 0; } -#endif -#if defined(CONFIG_PPC) || defined(CONFIG_M68K) -static int setup_board_part2(void) +int setup_bdinfo(void) { - bd_t *bd = gd->bd; - - bd->bi_intfreq = gd->cpu_clk; /* Internal Freq, in Hz */ - bd->bi_busfreq = gd->bus_clk; /* Bus Freq, in Hz */ -#if defined(CONFIG_CPM2) - bd->bi_cpmfreq = gd->arch.cpm_clk; - bd->bi_brgfreq = gd->arch.brg_clk; - bd->bi_sccfreq = gd->arch.scc_clk; - bd->bi_vco = gd->arch.vco_out; -#endif /* CONFIG_CPM2 */ -#if defined(CONFIG_M68K) && defined(CONFIG_PCI) - bd->bi_pcifreq = gd->pci_clk; -#endif -#if defined(CONFIG_EXTRA_CLOCK) - bd->bi_inpfreq = gd->arch.inp_clk; /* input Freq in Hz */ - bd->bi_vcofreq = gd->arch.vco_clk; /* vco Freq in Hz */ - bd->bi_flbfreq = gd->arch.flb_clk; /* flexbus Freq in Hz */ -#endif + struct bd_info *bd = gd->bd; - return 0; + bd->bi_memstart = gd->ram_base; /* start of memory */ + bd->bi_memsize = gd->ram_size; /* size in bytes */ + + if (IS_ENABLED(CONFIG_SYS_HAS_SRAM)) { + bd->bi_sramstart = CONFIG_SYS_SRAM_BASE; /* start of SRAM */ + bd->bi_sramsize = CONFIG_SYS_SRAM_SIZE; /* size of SRAM */ + } + + return arch_setup_bdinfo(); } -#endif #ifdef CONFIG_POST static int init_post(void) @@ -675,7 +630,7 @@ static int reloc_fdt(void) if (gd->flags & GD_FLG_SKIP_RELOC) return 0; if (gd->new_fdt) { - memcpy(gd->new_fdt, gd->fdt_blob, gd->fdt_size); + memcpy(gd->new_fdt, gd->fdt_blob, fdt_totalsize(gd->fdt_blob)); gd->fdt_blob = gd->new_fdt; } #endif @@ -695,6 +650,7 @@ static int reloc_bootstage(void) gd->bootstage, gd->new_bootstage, size); memcpy(gd->new_bootstage, gd->bootstage, size); gd->bootstage = gd->new_bootstage; + bootstage_relocate(); } #endif @@ -829,9 +785,9 @@ static int initf_dm(void) #if defined(CONFIG_DM) && CONFIG_VAL(SYS_MALLOC_F_LEN) int ret; - bootstage_start(BOOTSTATE_ID_ACCUM_DM_F, "dm_f"); + bootstage_start(BOOTSTAGE_ID_ACCUM_DM_F, "dm_f"); ret = dm_init_and_scan(true); - bootstage_accum(BOOTSTATE_ID_ACCUM_DM_F); + bootstage_accum(BOOTSTAGE_ID_ACCUM_DM_F); if (ret) return ret; #endif @@ -855,6 +811,16 @@ __weak int arch_cpu_init_dm(void) return 0; } +__weak int checkcpu(void) +{ + return 0; +} + +__weak int clear_bss(void) +{ + return 0; +} + static const init_fnc_t init_sequence_f[] = { setup_mon_len, #ifdef CONFIG_OF_CONTROL @@ -897,9 +863,7 @@ static const init_fnc_t init_sequence_f[] = { console_init_f, /* stage 1 init of console */ display_options, /* say that we are here */ display_text_info, /* show debugging info if required */ -#if defined(CONFIG_PPC) || defined(CONFIG_SH) || defined(CONFIG_X86) checkcpu, -#endif #if defined(CONFIG_SYSRESET) print_resetinfo, #endif @@ -951,13 +915,14 @@ static const init_fnc_t init_sequence_f[] = { * - board info struct */ setup_dest_addr, +#ifdef CONFIG_OF_BOARD_FIXUP + fix_fdt, +#endif #ifdef CONFIG_PRAM reserve_pram, #endif reserve_round_4k, -#ifdef CONFIG_ARM - reserve_mmu, -#endif + arch_reserve_mmu, reserve_video, reserve_trace, reserve_uboot, @@ -972,18 +937,9 @@ static const init_fnc_t init_sequence_f[] = { reserve_stacks, dram_init_banksize, show_dram_config, -#if defined(CONFIG_M68K) || defined(CONFIG_MIPS) || defined(CONFIG_PPC) || \ - defined(CONFIG_SH) - setup_board_part1, -#endif -#if defined(CONFIG_PPC) || defined(CONFIG_M68K) INIT_FUNC_WATCHDOG_RESET - setup_board_part2, -#endif + setup_bdinfo, display_new_sp, -#ifdef CONFIG_OF_BOARD_FIXUP - fix_fdt, -#endif INIT_FUNC_WATCHDOG_RESET reloc_fdt, reloc_bootstage, @@ -992,11 +948,8 @@ static const init_fnc_t init_sequence_f[] = { #if defined(CONFIG_X86) || defined(CONFIG_ARC) copy_uboot_to_ram, do_elf_reloc_fixups, - clear_bss, #endif -#if defined(CONFIG_XTENSA) clear_bss, -#endif #if !defined(CONFIG_ARM) && !defined(CONFIG_SANDBOX) && \ !CONFIG_IS_ENABLED(X86_64) jump_to_copy,