1c9d75b3cSYann Gautier /* 2c9d75b3cSYann Gautier * Copyright (c) 2017-2019, ARM Limited and Contributors. All rights reserved. 3c9d75b3cSYann Gautier * 4c9d75b3cSYann Gautier * SPDX-License-Identifier: BSD-3-Clause 5c9d75b3cSYann Gautier */ 6c9d75b3cSYann Gautier 7c9d75b3cSYann Gautier #include <assert.h> 8c9d75b3cSYann Gautier #include <errno.h> 9c9d75b3cSYann Gautier 10c9d75b3cSYann Gautier #include <libfdt.h> 11c9d75b3cSYann Gautier 12c9d75b3cSYann Gautier #include <platform_def.h> 13c9d75b3cSYann Gautier 14c9d75b3cSYann Gautier #include <common/debug.h> 15c9d75b3cSYann Gautier #include <drivers/st/stm32_gpio.h> 16c9d75b3cSYann Gautier #include <drivers/st/stm32mp1_ddr.h> 17c9d75b3cSYann Gautier #include <drivers/st/stm32mp1_ram.h> 18c9d75b3cSYann Gautier 19c9d75b3cSYann Gautier #include <stm32mp_dt.h> 20c9d75b3cSYann Gautier 21c9d75b3cSYann Gautier static int fdt_checked; 22c9d75b3cSYann Gautier 233f9c9784SYann Gautier static void *fdt = (void *)(uintptr_t)STM32MP_DTB_BASE; 24c9d75b3cSYann Gautier 25c9d75b3cSYann Gautier /******************************************************************************* 26c9d75b3cSYann Gautier * This function checks device tree file with its header. 27c9d75b3cSYann Gautier * Returns 0 on success and a negative FDT error code on failure. 28c9d75b3cSYann Gautier ******************************************************************************/ 29c9d75b3cSYann Gautier int dt_open_and_check(void) 30c9d75b3cSYann Gautier { 31c9d75b3cSYann Gautier int ret = fdt_check_header(fdt); 32c9d75b3cSYann Gautier 33c9d75b3cSYann Gautier if (ret == 0) { 34c9d75b3cSYann Gautier fdt_checked = 1; 35c9d75b3cSYann Gautier } 36c9d75b3cSYann Gautier 37c9d75b3cSYann Gautier return ret; 38c9d75b3cSYann Gautier } 39c9d75b3cSYann Gautier 40c9d75b3cSYann Gautier /******************************************************************************* 41c9d75b3cSYann Gautier * This function gets the address of the DT. 42c9d75b3cSYann Gautier * If DT is OK, fdt_addr is filled with DT address. 43c9d75b3cSYann Gautier * Returns 1 if success, 0 otherwise. 44c9d75b3cSYann Gautier ******************************************************************************/ 45c9d75b3cSYann Gautier int fdt_get_address(void **fdt_addr) 46c9d75b3cSYann Gautier { 47c9d75b3cSYann Gautier if (fdt_checked == 1) { 48c9d75b3cSYann Gautier *fdt_addr = fdt; 49c9d75b3cSYann Gautier } 50c9d75b3cSYann Gautier 51c9d75b3cSYann Gautier return fdt_checked; 52c9d75b3cSYann Gautier } 53c9d75b3cSYann Gautier 54c9d75b3cSYann Gautier /******************************************************************************* 55c9d75b3cSYann Gautier * This function check the presence of a node (generic use of fdt library). 56c9d75b3cSYann Gautier * Returns true if present, else return false. 57c9d75b3cSYann Gautier ******************************************************************************/ 58c9d75b3cSYann Gautier bool fdt_check_node(int node) 59c9d75b3cSYann Gautier { 60c9d75b3cSYann Gautier int len; 61c9d75b3cSYann Gautier const char *cchar; 62c9d75b3cSYann Gautier 63c9d75b3cSYann Gautier cchar = fdt_get_name(fdt, node, &len); 64c9d75b3cSYann Gautier 65c9d75b3cSYann Gautier return (cchar != NULL) && (len >= 0); 66c9d75b3cSYann Gautier } 67c9d75b3cSYann Gautier 68c9d75b3cSYann Gautier /******************************************************************************* 69c9d75b3cSYann Gautier * This function return global node status (generic use of fdt library). 70c9d75b3cSYann Gautier ******************************************************************************/ 71c9d75b3cSYann Gautier uint8_t fdt_get_status(int node) 72c9d75b3cSYann Gautier { 73c9d75b3cSYann Gautier uint8_t status = DT_DISABLED; 74c9d75b3cSYann Gautier int len; 75c9d75b3cSYann Gautier const char *cchar; 76c9d75b3cSYann Gautier 77c9d75b3cSYann Gautier cchar = fdt_getprop(fdt, node, "status", &len); 78c9d75b3cSYann Gautier if ((cchar == NULL) || 79c9d75b3cSYann Gautier (strncmp(cchar, "okay", (size_t)len) == 0)) { 80c9d75b3cSYann Gautier status |= DT_NON_SECURE; 81c9d75b3cSYann Gautier } 82c9d75b3cSYann Gautier 83c9d75b3cSYann Gautier cchar = fdt_getprop(fdt, node, "secure-status", &len); 84c9d75b3cSYann Gautier if (cchar == NULL) { 85c9d75b3cSYann Gautier if (status == DT_NON_SECURE) { 86c9d75b3cSYann Gautier status |= DT_SECURE; 87c9d75b3cSYann Gautier } 88c9d75b3cSYann Gautier } else if (strncmp(cchar, "okay", (size_t)len) == 0) { 89c9d75b3cSYann Gautier status |= DT_SECURE; 90c9d75b3cSYann Gautier } 91c9d75b3cSYann Gautier 92c9d75b3cSYann Gautier return status; 93c9d75b3cSYann Gautier } 94c9d75b3cSYann Gautier 95c9d75b3cSYann Gautier /******************************************************************************* 96c9d75b3cSYann Gautier * This function reads a value of a node property (generic use of fdt 97c9d75b3cSYann Gautier * library). 98c9d75b3cSYann Gautier * Returns value if success, and a default value if property not found. 99c9d75b3cSYann Gautier * Default value is passed as parameter. 100c9d75b3cSYann Gautier ******************************************************************************/ 101c9d75b3cSYann Gautier uint32_t fdt_read_uint32_default(int node, const char *prop_name, 102c9d75b3cSYann Gautier uint32_t dflt_value) 103c9d75b3cSYann Gautier { 104c9d75b3cSYann Gautier const fdt32_t *cuint; 105c9d75b3cSYann Gautier int lenp; 106c9d75b3cSYann Gautier 107c9d75b3cSYann Gautier cuint = fdt_getprop(fdt, node, prop_name, &lenp); 108c9d75b3cSYann Gautier if (cuint == NULL) { 109c9d75b3cSYann Gautier return dflt_value; 110c9d75b3cSYann Gautier } 111c9d75b3cSYann Gautier 112c9d75b3cSYann Gautier return fdt32_to_cpu(*cuint); 113c9d75b3cSYann Gautier } 114c9d75b3cSYann Gautier 115c9d75b3cSYann Gautier /******************************************************************************* 116c9d75b3cSYann Gautier * This function reads a series of parameters in a node property 117c9d75b3cSYann Gautier * (generic use of fdt library). 118c9d75b3cSYann Gautier * It reads the values inside the device tree, from property name and node. 119c9d75b3cSYann Gautier * The number of parameters is also indicated as entry parameter. 120c9d75b3cSYann Gautier * Returns 0 on success and a negative FDT error code on failure. 121c9d75b3cSYann Gautier * If success, values are stored at the third parameter address. 122c9d75b3cSYann Gautier ******************************************************************************/ 123c9d75b3cSYann Gautier int fdt_read_uint32_array(int node, const char *prop_name, uint32_t *array, 124c9d75b3cSYann Gautier uint32_t count) 125c9d75b3cSYann Gautier { 126c9d75b3cSYann Gautier const fdt32_t *cuint; 127c9d75b3cSYann Gautier int len; 128c9d75b3cSYann Gautier uint32_t i; 129c9d75b3cSYann Gautier 130c9d75b3cSYann Gautier cuint = fdt_getprop(fdt, node, prop_name, &len); 131c9d75b3cSYann Gautier if (cuint == NULL) { 132c9d75b3cSYann Gautier return -FDT_ERR_NOTFOUND; 133c9d75b3cSYann Gautier } 134c9d75b3cSYann Gautier 135c9d75b3cSYann Gautier if ((uint32_t)len != (count * sizeof(uint32_t))) { 136c9d75b3cSYann Gautier return -FDT_ERR_BADLAYOUT; 137c9d75b3cSYann Gautier } 138c9d75b3cSYann Gautier 139c9d75b3cSYann Gautier for (i = 0; i < ((uint32_t)len / sizeof(uint32_t)); i++) { 140c9d75b3cSYann Gautier *array = fdt32_to_cpu(*cuint); 141c9d75b3cSYann Gautier array++; 142c9d75b3cSYann Gautier cuint++; 143c9d75b3cSYann Gautier } 144c9d75b3cSYann Gautier 145c9d75b3cSYann Gautier return 0; 146c9d75b3cSYann Gautier } 147c9d75b3cSYann Gautier 148c9d75b3cSYann Gautier /******************************************************************************* 149*f805594dSYann Gautier * This function gets the stdout path node. 150*f805594dSYann Gautier * It reads the value indicated inside the device tree. 151*f805594dSYann Gautier * Returns node offset on success and a negative FDT error code on failure. 152*f805594dSYann Gautier ******************************************************************************/ 153*f805594dSYann Gautier static int dt_get_stdout_node_offset(void) 154*f805594dSYann Gautier { 155*f805594dSYann Gautier int node; 156*f805594dSYann Gautier const char *cchar; 157*f805594dSYann Gautier 158*f805594dSYann Gautier node = fdt_path_offset(fdt, "/secure-chosen"); 159*f805594dSYann Gautier if (node < 0) { 160*f805594dSYann Gautier node = fdt_path_offset(fdt, "/chosen"); 161*f805594dSYann Gautier if (node < 0) { 162*f805594dSYann Gautier return -FDT_ERR_NOTFOUND; 163*f805594dSYann Gautier } 164*f805594dSYann Gautier } 165*f805594dSYann Gautier 166*f805594dSYann Gautier cchar = fdt_getprop(fdt, node, "stdout-path", NULL); 167*f805594dSYann Gautier if (cchar == NULL) { 168*f805594dSYann Gautier return -FDT_ERR_NOTFOUND; 169*f805594dSYann Gautier } 170*f805594dSYann Gautier 171*f805594dSYann Gautier node = -FDT_ERR_NOTFOUND; 172*f805594dSYann Gautier if (strchr(cchar, (int)':') != NULL) { 173*f805594dSYann Gautier const char *name; 174*f805594dSYann Gautier char *str = (char *)cchar; 175*f805594dSYann Gautier int len = 0; 176*f805594dSYann Gautier 177*f805594dSYann Gautier while (strncmp(":", str, 1)) { 178*f805594dSYann Gautier len++; 179*f805594dSYann Gautier str++; 180*f805594dSYann Gautier } 181*f805594dSYann Gautier 182*f805594dSYann Gautier name = fdt_get_alias_namelen(fdt, cchar, len); 183*f805594dSYann Gautier 184*f805594dSYann Gautier if (name != NULL) { 185*f805594dSYann Gautier node = fdt_path_offset(fdt, name); 186*f805594dSYann Gautier } 187*f805594dSYann Gautier } else { 188*f805594dSYann Gautier node = fdt_path_offset(fdt, cchar); 189*f805594dSYann Gautier } 190*f805594dSYann Gautier 191*f805594dSYann Gautier return node; 192*f805594dSYann Gautier } 193*f805594dSYann Gautier 194*f805594dSYann Gautier /******************************************************************************* 195c9d75b3cSYann Gautier * This function gets the stdout pin configuration information from the DT. 196c9d75b3cSYann Gautier * And then calls the sub-function to treat it and set GPIO registers. 197c9d75b3cSYann Gautier * Returns 0 on success and a negative FDT error code on failure. 198c9d75b3cSYann Gautier ******************************************************************************/ 199c9d75b3cSYann Gautier int dt_set_stdout_pinctrl(void) 200c9d75b3cSYann Gautier { 201c9d75b3cSYann Gautier int node; 202c9d75b3cSYann Gautier 203c9d75b3cSYann Gautier node = dt_get_stdout_node_offset(); 204c9d75b3cSYann Gautier if (node < 0) { 205c9d75b3cSYann Gautier return -FDT_ERR_NOTFOUND; 206c9d75b3cSYann Gautier } 207c9d75b3cSYann Gautier 208c9d75b3cSYann Gautier return dt_set_pinctrl_config(node); 209c9d75b3cSYann Gautier } 210c9d75b3cSYann Gautier 211c9d75b3cSYann Gautier /******************************************************************************* 212c9d75b3cSYann Gautier * This function fills the generic information from a given node. 213c9d75b3cSYann Gautier ******************************************************************************/ 214c9d75b3cSYann Gautier void dt_fill_device_info(struct dt_node_info *info, int node) 215c9d75b3cSYann Gautier { 216c9d75b3cSYann Gautier const fdt32_t *cuint; 217c9d75b3cSYann Gautier 218c9d75b3cSYann Gautier cuint = fdt_getprop(fdt, node, "reg", NULL); 219c9d75b3cSYann Gautier if (cuint != NULL) { 220c9d75b3cSYann Gautier info->base = fdt32_to_cpu(*cuint); 221c9d75b3cSYann Gautier } else { 222c9d75b3cSYann Gautier info->base = 0; 223c9d75b3cSYann Gautier } 224c9d75b3cSYann Gautier 225c9d75b3cSYann Gautier cuint = fdt_getprop(fdt, node, "clocks", NULL); 226c9d75b3cSYann Gautier if (cuint != NULL) { 227c9d75b3cSYann Gautier cuint++; 228c9d75b3cSYann Gautier info->clock = (int)fdt32_to_cpu(*cuint); 229c9d75b3cSYann Gautier } else { 230c9d75b3cSYann Gautier info->clock = -1; 231c9d75b3cSYann Gautier } 232c9d75b3cSYann Gautier 233c9d75b3cSYann Gautier cuint = fdt_getprop(fdt, node, "resets", NULL); 234c9d75b3cSYann Gautier if (cuint != NULL) { 235c9d75b3cSYann Gautier cuint++; 236c9d75b3cSYann Gautier info->reset = (int)fdt32_to_cpu(*cuint); 237c9d75b3cSYann Gautier } else { 238c9d75b3cSYann Gautier info->reset = -1; 239c9d75b3cSYann Gautier } 240c9d75b3cSYann Gautier 241c9d75b3cSYann Gautier info->status = fdt_get_status(node); 242c9d75b3cSYann Gautier } 243c9d75b3cSYann Gautier 244c9d75b3cSYann Gautier /******************************************************************************* 245c9d75b3cSYann Gautier * This function retrieve the generic information from DT. 246c9d75b3cSYann Gautier * Returns node on success and a negative FDT error code on failure. 247c9d75b3cSYann Gautier ******************************************************************************/ 248c9d75b3cSYann Gautier int dt_get_node(struct dt_node_info *info, int offset, const char *compat) 249c9d75b3cSYann Gautier { 250c9d75b3cSYann Gautier int node; 251c9d75b3cSYann Gautier 252c9d75b3cSYann Gautier node = fdt_node_offset_by_compatible(fdt, offset, compat); 253c9d75b3cSYann Gautier if (node < 0) { 254c9d75b3cSYann Gautier return -FDT_ERR_NOTFOUND; 255c9d75b3cSYann Gautier } 256c9d75b3cSYann Gautier 257c9d75b3cSYann Gautier dt_fill_device_info(info, node); 258c9d75b3cSYann Gautier 259c9d75b3cSYann Gautier return node; 260c9d75b3cSYann Gautier } 261c9d75b3cSYann Gautier 262c9d75b3cSYann Gautier /******************************************************************************* 263c9d75b3cSYann Gautier * This function gets the UART instance info of stdout from the DT. 264c9d75b3cSYann Gautier * Returns node on success and a negative FDT error code on failure. 265c9d75b3cSYann Gautier ******************************************************************************/ 266c9d75b3cSYann Gautier int dt_get_stdout_uart_info(struct dt_node_info *info) 267c9d75b3cSYann Gautier { 268c9d75b3cSYann Gautier int node; 269c9d75b3cSYann Gautier 270c9d75b3cSYann Gautier node = dt_get_stdout_node_offset(); 271c9d75b3cSYann Gautier if (node < 0) { 272c9d75b3cSYann Gautier return -FDT_ERR_NOTFOUND; 273c9d75b3cSYann Gautier } 274c9d75b3cSYann Gautier 275c9d75b3cSYann Gautier dt_fill_device_info(info, node); 276c9d75b3cSYann Gautier 277c9d75b3cSYann Gautier return node; 278c9d75b3cSYann Gautier } 279c9d75b3cSYann Gautier 280c9d75b3cSYann Gautier /******************************************************************************* 281c9d75b3cSYann Gautier * This function gets DDR size information from the DT. 282c9d75b3cSYann Gautier * Returns value in bytes on success, and 0 on failure. 283c9d75b3cSYann Gautier ******************************************************************************/ 284c9d75b3cSYann Gautier uint32_t dt_get_ddr_size(void) 285c9d75b3cSYann Gautier { 286c9d75b3cSYann Gautier int node; 287c9d75b3cSYann Gautier 288c9d75b3cSYann Gautier node = fdt_node_offset_by_compatible(fdt, -1, DT_DDR_COMPAT); 289c9d75b3cSYann Gautier if (node < 0) { 290c9d75b3cSYann Gautier INFO("%s: Cannot read DDR node in DT\n", __func__); 291c9d75b3cSYann Gautier return 0; 292c9d75b3cSYann Gautier } 293c9d75b3cSYann Gautier 294c9d75b3cSYann Gautier return fdt_read_uint32_default(node, "st,mem-size", 0); 295c9d75b3cSYann Gautier } 296c9d75b3cSYann Gautier 297c9d75b3cSYann Gautier /******************************************************************************* 2987ae58c6bSYann Gautier * This function gets DDRCTRL base address information from the DT. 2997ae58c6bSYann Gautier * Returns value on success, and 0 on failure. 3007ae58c6bSYann Gautier ******************************************************************************/ 3017ae58c6bSYann Gautier uintptr_t dt_get_ddrctrl_base(void) 3027ae58c6bSYann Gautier { 3037ae58c6bSYann Gautier int node; 3047ae58c6bSYann Gautier uint32_t array[4]; 3057ae58c6bSYann Gautier 3067ae58c6bSYann Gautier node = fdt_node_offset_by_compatible(fdt, -1, DT_DDR_COMPAT); 3077ae58c6bSYann Gautier if (node < 0) { 3087ae58c6bSYann Gautier INFO("%s: Cannot read DDR node in DT\n", __func__); 3097ae58c6bSYann Gautier return 0; 3107ae58c6bSYann Gautier } 3117ae58c6bSYann Gautier 3127ae58c6bSYann Gautier if (fdt_read_uint32_array(node, "reg", array, 4) < 0) { 3137ae58c6bSYann Gautier return 0; 3147ae58c6bSYann Gautier } 3157ae58c6bSYann Gautier 3167ae58c6bSYann Gautier return array[0]; 3177ae58c6bSYann Gautier } 3187ae58c6bSYann Gautier 3197ae58c6bSYann Gautier /******************************************************************************* 3207ae58c6bSYann Gautier * This function gets DDRPHYC base address information from the DT. 3217ae58c6bSYann Gautier * Returns value on success, and 0 on failure. 3227ae58c6bSYann Gautier ******************************************************************************/ 3237ae58c6bSYann Gautier uintptr_t dt_get_ddrphyc_base(void) 3247ae58c6bSYann Gautier { 3257ae58c6bSYann Gautier int node; 3267ae58c6bSYann Gautier uint32_t array[4]; 3277ae58c6bSYann Gautier 3287ae58c6bSYann Gautier node = fdt_node_offset_by_compatible(fdt, -1, DT_DDR_COMPAT); 3297ae58c6bSYann Gautier if (node < 0) { 3307ae58c6bSYann Gautier INFO("%s: Cannot read DDR node in DT\n", __func__); 3317ae58c6bSYann Gautier return 0; 3327ae58c6bSYann Gautier } 3337ae58c6bSYann Gautier 3347ae58c6bSYann Gautier if (fdt_read_uint32_array(node, "reg", array, 4) < 0) { 3357ae58c6bSYann Gautier return 0; 3367ae58c6bSYann Gautier } 3377ae58c6bSYann Gautier 3387ae58c6bSYann Gautier return array[2]; 3397ae58c6bSYann Gautier } 3407ae58c6bSYann Gautier 3417ae58c6bSYann Gautier /******************************************************************************* 3427ae58c6bSYann Gautier * This function gets PWR base address information from the DT. 3437ae58c6bSYann Gautier * Returns value on success, and 0 on failure. 3447ae58c6bSYann Gautier ******************************************************************************/ 3457ae58c6bSYann Gautier uintptr_t dt_get_pwr_base(void) 3467ae58c6bSYann Gautier { 3477ae58c6bSYann Gautier int node; 3487ae58c6bSYann Gautier const fdt32_t *cuint; 3497ae58c6bSYann Gautier 3507ae58c6bSYann Gautier node = fdt_node_offset_by_compatible(fdt, -1, DT_PWR_COMPAT); 3517ae58c6bSYann Gautier if (node < 0) { 3527ae58c6bSYann Gautier INFO("%s: Cannot read PWR node in DT\n", __func__); 3537ae58c6bSYann Gautier return 0; 3547ae58c6bSYann Gautier } 3557ae58c6bSYann Gautier 3567ae58c6bSYann Gautier cuint = fdt_getprop(fdt, node, "reg", NULL); 3577ae58c6bSYann Gautier if (cuint == NULL) { 3587ae58c6bSYann Gautier return 0; 3597ae58c6bSYann Gautier } 3607ae58c6bSYann Gautier 3617ae58c6bSYann Gautier return fdt32_to_cpu(*cuint); 3627ae58c6bSYann Gautier } 3637ae58c6bSYann Gautier 3647ae58c6bSYann Gautier /******************************************************************************* 365f33b2433SYann Gautier * This function gets PWR VDD regulator voltage information from the DT. 366f33b2433SYann Gautier * Returns value in microvolts on success, and 0 on failure. 367f33b2433SYann Gautier ******************************************************************************/ 368f33b2433SYann Gautier uint32_t dt_get_pwr_vdd_voltage(void) 369f33b2433SYann Gautier { 370f33b2433SYann Gautier int node, pwr_regulators_node; 371f33b2433SYann Gautier const fdt32_t *cuint; 372f33b2433SYann Gautier 373f33b2433SYann Gautier node = fdt_node_offset_by_compatible(fdt, -1, DT_PWR_COMPAT); 374f33b2433SYann Gautier if (node < 0) { 375f33b2433SYann Gautier INFO("%s: Cannot read PWR node in DT\n", __func__); 376f33b2433SYann Gautier return 0; 377f33b2433SYann Gautier } 378f33b2433SYann Gautier 379f33b2433SYann Gautier pwr_regulators_node = fdt_subnode_offset(fdt, node, "pwr-regulators"); 380f33b2433SYann Gautier if (node < 0) { 381f33b2433SYann Gautier INFO("%s: Cannot read pwr-regulators node in DT\n", __func__); 382f33b2433SYann Gautier return 0; 383f33b2433SYann Gautier } 384f33b2433SYann Gautier 385f33b2433SYann Gautier cuint = fdt_getprop(fdt, pwr_regulators_node, "vdd-supply", NULL); 386f33b2433SYann Gautier if (cuint == NULL) { 387f33b2433SYann Gautier return 0; 388f33b2433SYann Gautier } 389f33b2433SYann Gautier 390f33b2433SYann Gautier node = fdt_node_offset_by_phandle(fdt, fdt32_to_cpu(*cuint)); 391f33b2433SYann Gautier if (node < 0) { 392f33b2433SYann Gautier return 0; 393f33b2433SYann Gautier } 394f33b2433SYann Gautier 395f33b2433SYann Gautier cuint = fdt_getprop(fdt, node, "regulator-min-microvolt", NULL); 396f33b2433SYann Gautier if (cuint == NULL) { 397f33b2433SYann Gautier return 0; 398f33b2433SYann Gautier } 399f33b2433SYann Gautier 400f33b2433SYann Gautier return fdt32_to_cpu(*cuint); 401f33b2433SYann Gautier } 402f33b2433SYann Gautier 403f33b2433SYann Gautier /******************************************************************************* 404f33b2433SYann Gautier * This function gets SYSCFG base address information from the DT. 405f33b2433SYann Gautier * Returns value on success, and 0 on failure. 406f33b2433SYann Gautier ******************************************************************************/ 407f33b2433SYann Gautier uintptr_t dt_get_syscfg_base(void) 408f33b2433SYann Gautier { 409f33b2433SYann Gautier int node; 410f33b2433SYann Gautier const fdt32_t *cuint; 411f33b2433SYann Gautier 412f33b2433SYann Gautier node = fdt_node_offset_by_compatible(fdt, -1, DT_SYSCFG_COMPAT); 413f33b2433SYann Gautier if (node < 0) { 414f33b2433SYann Gautier INFO("%s: Cannot read SYSCFG node in DT\n", __func__); 415f33b2433SYann Gautier return 0; 416f33b2433SYann Gautier } 417f33b2433SYann Gautier 418f33b2433SYann Gautier cuint = fdt_getprop(fdt, node, "reg", NULL); 419f33b2433SYann Gautier if (cuint == NULL) { 420f33b2433SYann Gautier return 0; 421f33b2433SYann Gautier } 422f33b2433SYann Gautier 423f33b2433SYann Gautier return fdt32_to_cpu(*cuint); 424f33b2433SYann Gautier } 425f33b2433SYann Gautier 426f33b2433SYann Gautier /******************************************************************************* 427c9d75b3cSYann Gautier * This function retrieves board model from DT 428c9d75b3cSYann Gautier * Returns string taken from model node, NULL otherwise 429c9d75b3cSYann Gautier ******************************************************************************/ 430c9d75b3cSYann Gautier const char *dt_get_board_model(void) 431c9d75b3cSYann Gautier { 432c9d75b3cSYann Gautier int node = fdt_path_offset(fdt, "/"); 433c9d75b3cSYann Gautier 434c9d75b3cSYann Gautier if (node < 0) { 435c9d75b3cSYann Gautier return NULL; 436c9d75b3cSYann Gautier } 437c9d75b3cSYann Gautier 438c9d75b3cSYann Gautier return (const char *)fdt_getprop(fdt, node, "model", NULL); 439c9d75b3cSYann Gautier } 440