blob: 98fb144f2f9a68555615214d6e43cb046c5e9cf1 [file] [log] [blame]
/*
* SPDX-License-Identifier: BSD-3-Clause
* SPDX-FileCopyrightText: Copyright TF-RMM Contributors.
*/
#include <arch_helpers.h>
#include <arm_memory.h>
#include <assert.h>
#include <rmm_el3_ifc.h>
static void arm_set_memory_layout(struct memory_info *plat_info,
struct arm_memory_layout *memory_ptr)
{
struct memory_bank *bank_ptr;
uint64_t num_banks, num_granules = 0UL;
assert((plat_info != NULL) && (memory_ptr != NULL));
assert(!is_mmu_enabled());
/* Number of banks */
num_banks = plat_info->num_banks;
assert(num_banks > 0UL);
assert(num_banks <= PLAT_ARM_MAX_MEM_BANKS);
/* Pointer to memory_bank[] array */
bank_ptr = plat_info->banks;
for (unsigned long i = 0UL; i < num_banks; i++) {
uint64_t base = bank_ptr->base;
uint64_t size = bank_ptr->size;
memory_ptr->bank[i].base = base;
memory_ptr->bank[i].size = size;
memory_ptr->bank[i].start_gran_idx = num_granules;
num_granules += (size >> GRANULE_SHIFT);
bank_ptr++;
}
memory_ptr->num_banks = num_banks;
memory_ptr->num_granules = num_granules;
inv_dcache_range((uintptr_t)memory_ptr,
sizeof(struct arm_memory_layout));
}
void arm_set_dram_layout(struct memory_info *plat_dram)
{
assert(plat_dram != NULL);
arm_set_memory_layout(plat_dram, arm_get_dram_layout());
}
void arm_set_dev_layout(struct memory_info *plat_dev, enum range_type type)
{
struct arm_memory_layout *memory_ptr;
assert(plat_dev != NULL);
assert(type < DEV_RANGE_MAX);
switch (type) {
case DEV_RANGE_COHERENT:
memory_ptr = arm_get_dev_coh_layout();
break;
default:
/* DEV_RANGE_NON_COHERENT */
memory_ptr = arm_get_dev_ncoh_layout();
}
arm_set_memory_layout(plat_dev, memory_ptr);
}