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