xref: /openbmc/u-boot/arch/x86/lib/init_helpers.c (revision 940db16d)
1 /*
2  * (C) Copyright 2011
3  * Graeme Russ, <graeme.russ@gmail.com>
4  *
5  * SPDX-License-Identifier:	GPL-2.0+
6  */
7 #include <common.h>
8 #include <fdtdec.h>
9 #include <spi.h>
10 #include <asm/sections.h>
11 
12 DECLARE_GLOBAL_DATA_PTR;
13 
14 /* Get the top of usable RAM */
15 __weak ulong board_get_usable_ram_top(ulong total_size)
16 {
17 	return gd->ram_size;
18 }
19 
20 int calculate_relocation_address(void)
21 {
22 	const ulong uboot_size = (uintptr_t)&__bss_end -
23 			(uintptr_t)&__text_start;
24 	ulong total_size;
25 	ulong dest_addr;
26 	ulong fdt_size = 0;
27 
28 #if defined(CONFIG_OF_SEPARATE) && defined(CONFIG_OF_CONTROL)
29 	if (gd->fdt_blob)
30 		fdt_size = ALIGN(fdt_totalsize(gd->fdt_blob) + 0x1000, 32);
31 #endif
32 	total_size = ALIGN(uboot_size, 1 << 12) + CONFIG_SYS_MALLOC_LEN +
33 		CONFIG_SYS_STACK_SIZE + fdt_size;
34 
35 	dest_addr = board_get_usable_ram_top(total_size);
36 	/*
37 	 * NOTE: All destination address are rounded down to 16-byte
38 	 *       boundary to satisfy various worst-case alignment
39 	 *       requirements
40 	 */
41 	dest_addr &= ~15;
42 
43 #if defined(CONFIG_OF_SEPARATE) && defined(CONFIG_OF_CONTROL)
44 	/*
45 	 * If the device tree is sitting immediate above our image then we
46 	 * must relocate it. If it is embedded in the data section, then it
47 	 * will be relocated with other data.
48 	 */
49 	if (gd->fdt_blob) {
50 		dest_addr -= fdt_size;
51 		gd->new_fdt = (void *)dest_addr;
52 		dest_addr &= ~15;
53 	}
54 #endif
55 	/* U-Boot is below the FDT */
56 	dest_addr -= uboot_size;
57 	dest_addr &= ~((1 << 12) - 1);
58 	gd->relocaddr = dest_addr;
59 	gd->reloc_off = dest_addr - (uintptr_t)&__text_start;
60 
61 	/* Stack is at the bottom, so it can grow down */
62 	gd->start_addr_sp = dest_addr - CONFIG_SYS_MALLOC_LEN;
63 
64 	return 0;
65 }
66 
67 int init_cache_f_r(void)
68 {
69 	/* Initialise the CPU cache(s) */
70 	return init_cache();
71 }
72 
73 bd_t bd_data;
74 
75 int init_bd_struct_r(void)
76 {
77 	gd->bd = &bd_data;
78 	memset(gd->bd, 0, sizeof(bd_t));
79 
80 	return 0;
81 }
82 
83 int init_func_spi(void)
84 {
85 	puts("SPI:   ");
86 	spi_init();
87 	puts("ready\n");
88 	return 0;
89 }
90 
91 int find_fdt(void)
92 {
93 #ifdef CONFIG_OF_EMBED
94 	/* Get a pointer to the FDT */
95 	gd->fdt_blob = _binary_dt_dtb_start;
96 #elif defined CONFIG_OF_SEPARATE
97 	/* FDT is at end of image */
98 	gd->fdt_blob = (ulong *)&_end;
99 #endif
100 	/* Allow the early environment to override the fdt address */
101 	gd->fdt_blob = (void *)getenv_ulong("fdtcontroladdr", 16,
102 						(uintptr_t)gd->fdt_blob);
103 
104 	return 0;
105 }
106 
107 int prepare_fdt(void)
108 {
109 	/* For now, put this check after the console is ready */
110 	if (fdtdec_prepare_fdt()) {
111 		panic("** CONFIG_OF_CONTROL defined but no FDT - please see "
112 			"doc/README.fdt-control");
113 	}
114 
115 	return 0;
116 }
117