1*91f16700Schasinglulu /* 2*91f16700Schasinglulu * Copyright (C) 2022-2023, STMicroelectronics - All Rights Reserved 3*91f16700Schasinglulu * 4*91f16700Schasinglulu * SPDX-License-Identifier: BSD-3-Clause 5*91f16700Schasinglulu */ 6*91f16700Schasinglulu 7*91f16700Schasinglulu #include <errno.h> 8*91f16700Schasinglulu #include <stdbool.h> 9*91f16700Schasinglulu 10*91f16700Schasinglulu #include <common/debug.h> 11*91f16700Schasinglulu #include <common/fdt_wrappers.h> 12*91f16700Schasinglulu #include <drivers/st/stm32mp_ram.h> 13*91f16700Schasinglulu #include <libfdt.h> 14*91f16700Schasinglulu 15*91f16700Schasinglulu #include <platform_def.h> 16*91f16700Schasinglulu 17*91f16700Schasinglulu int stm32mp_ddr_dt_get_info(void *fdt, int node, struct stm32mp_ddr_info *info) 18*91f16700Schasinglulu { 19*91f16700Schasinglulu int ret; 20*91f16700Schasinglulu 21*91f16700Schasinglulu ret = fdt_read_uint32(fdt, node, "st,mem-speed", &info->speed); 22*91f16700Schasinglulu if (ret < 0) { 23*91f16700Schasinglulu VERBOSE("%s: no st,mem-speed\n", __func__); 24*91f16700Schasinglulu return -EINVAL; 25*91f16700Schasinglulu } 26*91f16700Schasinglulu info->size = dt_get_ddr_size(); 27*91f16700Schasinglulu if (info->size == 0U) { 28*91f16700Schasinglulu VERBOSE("%s: no st,mem-size\n", __func__); 29*91f16700Schasinglulu return -EINVAL; 30*91f16700Schasinglulu } 31*91f16700Schasinglulu info->name = fdt_getprop(fdt, node, "st,mem-name", NULL); 32*91f16700Schasinglulu if (info->name == NULL) { 33*91f16700Schasinglulu VERBOSE("%s: no st,mem-name\n", __func__); 34*91f16700Schasinglulu return -EINVAL; 35*91f16700Schasinglulu } 36*91f16700Schasinglulu 37*91f16700Schasinglulu INFO("RAM: %s\n", info->name); 38*91f16700Schasinglulu 39*91f16700Schasinglulu return 0; 40*91f16700Schasinglulu } 41*91f16700Schasinglulu 42*91f16700Schasinglulu int stm32mp_ddr_dt_get_param(void *fdt, int node, const struct stm32mp_ddr_param *param, 43*91f16700Schasinglulu uint32_t param_size, uintptr_t config) 44*91f16700Schasinglulu { 45*91f16700Schasinglulu int ret; 46*91f16700Schasinglulu uint32_t idx; 47*91f16700Schasinglulu 48*91f16700Schasinglulu for (idx = 0U; idx < param_size; idx++) { 49*91f16700Schasinglulu ret = fdt_read_uint32_array(fdt, node, param[idx].name, param[idx].size, 50*91f16700Schasinglulu (void *)(config + param[idx].offset)); 51*91f16700Schasinglulu 52*91f16700Schasinglulu VERBOSE("%s: %s[0x%x] = %d\n", __func__, param[idx].name, param[idx].size, ret); 53*91f16700Schasinglulu if (ret != 0) { 54*91f16700Schasinglulu ERROR("%s: Cannot read %s, error=%d\n", __func__, param[idx].name, ret); 55*91f16700Schasinglulu return -EINVAL; 56*91f16700Schasinglulu } 57*91f16700Schasinglulu } 58*91f16700Schasinglulu 59*91f16700Schasinglulu return 0; 60*91f16700Schasinglulu } 61