xref: /rk3399_rockchip-uboot/arch/x86/lib/fsp/fsp_dram.c (revision 7b02bf3c7dc74ab29e5c5f826cc0cfd141e41f2d)
1*7b02bf3cSSimon Glass /*
2*7b02bf3cSSimon Glass  * Copyright (C) 2014, Bin Meng <bmeng.cn@gmail.com>
3*7b02bf3cSSimon Glass  *
4*7b02bf3cSSimon Glass  * SPDX-License-Identifier:	GPL-2.0+
5*7b02bf3cSSimon Glass  */
6*7b02bf3cSSimon Glass 
7*7b02bf3cSSimon Glass #include <common.h>
8*7b02bf3cSSimon Glass #include <asm/fsp/fsp_support.h>
9*7b02bf3cSSimon Glass #include <asm/e820.h>
10*7b02bf3cSSimon Glass #include <asm/post.h>
11*7b02bf3cSSimon Glass 
12*7b02bf3cSSimon Glass DECLARE_GLOBAL_DATA_PTR;
13*7b02bf3cSSimon Glass 
14*7b02bf3cSSimon Glass int dram_init(void)
15*7b02bf3cSSimon Glass {
16*7b02bf3cSSimon Glass 	phys_size_t ram_size = 0;
17*7b02bf3cSSimon Glass 	const struct hob_header *hdr;
18*7b02bf3cSSimon Glass 	struct hob_res_desc *res_desc;
19*7b02bf3cSSimon Glass 
20*7b02bf3cSSimon Glass 	hdr = gd->arch.hob_list;
21*7b02bf3cSSimon Glass 	while (!end_of_hob(hdr)) {
22*7b02bf3cSSimon Glass 		if (hdr->type == HOB_TYPE_RES_DESC) {
23*7b02bf3cSSimon Glass 			res_desc = (struct hob_res_desc *)hdr;
24*7b02bf3cSSimon Glass 			if (res_desc->type == RES_SYS_MEM ||
25*7b02bf3cSSimon Glass 			    res_desc->type == RES_MEM_RESERVED) {
26*7b02bf3cSSimon Glass 				ram_size += res_desc->len;
27*7b02bf3cSSimon Glass 			}
28*7b02bf3cSSimon Glass 		}
29*7b02bf3cSSimon Glass 		hdr = get_next_hob(hdr);
30*7b02bf3cSSimon Glass 	}
31*7b02bf3cSSimon Glass 
32*7b02bf3cSSimon Glass 	gd->ram_size = ram_size;
33*7b02bf3cSSimon Glass 	post_code(POST_DRAM);
34*7b02bf3cSSimon Glass 
35*7b02bf3cSSimon Glass 	return 0;
36*7b02bf3cSSimon Glass }
37*7b02bf3cSSimon Glass 
38*7b02bf3cSSimon Glass void dram_init_banksize(void)
39*7b02bf3cSSimon Glass {
40*7b02bf3cSSimon Glass 	gd->bd->bi_dram[0].start = 0;
41*7b02bf3cSSimon Glass 	gd->bd->bi_dram[0].size = gd->ram_size;
42*7b02bf3cSSimon Glass }
43*7b02bf3cSSimon Glass 
44*7b02bf3cSSimon Glass /*
45*7b02bf3cSSimon Glass  * This function looks for the highest region of memory lower than 4GB which
46*7b02bf3cSSimon Glass  * has enough space for U-Boot where U-Boot is aligned on a page boundary.
47*7b02bf3cSSimon Glass  * It overrides the default implementation found elsewhere which simply
48*7b02bf3cSSimon Glass  * picks the end of ram, wherever that may be. The location of the stack,
49*7b02bf3cSSimon Glass  * the relocation address, and how far U-Boot is moved by relocation are
50*7b02bf3cSSimon Glass  * set in the global data structure.
51*7b02bf3cSSimon Glass  */
52*7b02bf3cSSimon Glass ulong board_get_usable_ram_top(ulong total_size)
53*7b02bf3cSSimon Glass {
54*7b02bf3cSSimon Glass 	return fsp_get_usable_lowmem_top(gd->arch.hob_list);
55*7b02bf3cSSimon Glass }
56*7b02bf3cSSimon Glass 
57*7b02bf3cSSimon Glass unsigned install_e820_map(unsigned max_entries, struct e820entry *entries)
58*7b02bf3cSSimon Glass {
59*7b02bf3cSSimon Glass 	unsigned num_entries = 0;
60*7b02bf3cSSimon Glass 	const struct hob_header *hdr;
61*7b02bf3cSSimon Glass 	struct hob_res_desc *res_desc;
62*7b02bf3cSSimon Glass 
63*7b02bf3cSSimon Glass 	hdr = gd->arch.hob_list;
64*7b02bf3cSSimon Glass 
65*7b02bf3cSSimon Glass 	while (!end_of_hob(hdr)) {
66*7b02bf3cSSimon Glass 		if (hdr->type == HOB_TYPE_RES_DESC) {
67*7b02bf3cSSimon Glass 			res_desc = (struct hob_res_desc *)hdr;
68*7b02bf3cSSimon Glass 			entries[num_entries].addr = res_desc->phys_start;
69*7b02bf3cSSimon Glass 			entries[num_entries].size = res_desc->len;
70*7b02bf3cSSimon Glass 
71*7b02bf3cSSimon Glass 			if (res_desc->type == RES_SYS_MEM)
72*7b02bf3cSSimon Glass 				entries[num_entries].type = E820_RAM;
73*7b02bf3cSSimon Glass 			else if (res_desc->type == RES_MEM_RESERVED)
74*7b02bf3cSSimon Glass 				entries[num_entries].type = E820_RESERVED;
75*7b02bf3cSSimon Glass 		}
76*7b02bf3cSSimon Glass 		hdr = get_next_hob(hdr);
77*7b02bf3cSSimon Glass 		num_entries++;
78*7b02bf3cSSimon Glass 	}
79*7b02bf3cSSimon Glass 
80*7b02bf3cSSimon Glass 	return num_entries;
81*7b02bf3cSSimon Glass }
82