blob: ff6a816b6412322574a6fcd6624a8bf112b82c68 [file] [log] [blame]
AlexeiFedorov7c5001a2022-12-14 13:22:33 +00001/*
2 * SPDX-License-Identifier: BSD-3-Clause
3 * SPDX-FileCopyrightText: Copyright TF-RMM Contributors.
4 */
5
6#include <arch_helpers.h>
7#include <assert.h>
AlexeiFedorov7c5001a2022-12-14 13:22:33 +00008#include <fvp_dram.h>
9#include <rmm_el3_ifc.h>
10
11COMPILER_ASSERT(MAX_DRAM_NUM_BANKS == 2UL);
12
13void fvp_set_dram_layout(struct ns_dram_info *plat_dram)
14{
15 uint64_t num_banks, num_granules = 0UL;
16 struct ns_dram_bank *bank_ptr;
AlexeiFedorovee2fc822023-10-31 14:54:39 +000017 struct fvp_dram_layout *dram_ptr = fvp_get_dram_layout();
AlexeiFedorov7c5001a2022-12-14 13:22:33 +000018
19 /* Number of banks */
20 num_banks = plat_dram->num_banks;
AlexeiFedorov3669cb32023-06-05 14:45:08 +010021 assert(num_banks <= MAX_DRAM_NUM_BANKS);
AlexeiFedorov7c5001a2022-12-14 13:22:33 +000022
23 /* Pointer to dram_bank[] array */
24 bank_ptr = plat_dram->banks;
25
26 for (unsigned long i = 0UL; i < num_banks; i++) {
27 uintptr_t start = bank_ptr->base;
28 uint64_t size = bank_ptr->size;
29 uintptr_t end = start + size - 1UL;
30
31 if (i == 1UL) {
32 /* Start granule index in bank 1 */
AlexeiFedorovee2fc822023-10-31 14:54:39 +000033 dram_ptr->idx_bank_1 = num_granules;
AlexeiFedorov7c5001a2022-12-14 13:22:33 +000034 }
35
36 /* Total number of granules */
37 num_granules += (size / GRANULE_SIZE);
38
AlexeiFedorovee2fc822023-10-31 14:54:39 +000039 dram_ptr->fvp_bank[i].start_addr = start;
40 dram_ptr->fvp_bank[i].end_addr = end;
AlexeiFedorov7c5001a2022-12-14 13:22:33 +000041
42 bank_ptr++;
43 }
44
AlexeiFedorovee2fc822023-10-31 14:54:39 +000045 dram_ptr->num_granules = num_granules;
AlexeiFedorov7c5001a2022-12-14 13:22:33 +000046
AlexeiFedorovee2fc822023-10-31 14:54:39 +000047 inv_dcache_range((uintptr_t)dram_ptr, sizeof(struct fvp_dram_layout));
AlexeiFedorov7c5001a2022-12-14 13:22:33 +000048}