1*91f16700Schasinglulu /* 2*91f16700Schasinglulu * Copyright (c) 2021, ARM Limited. All rights reserved. 3*91f16700Schasinglulu * 4*91f16700Schasinglulu * SPDX-License-Identifier: BSD-3-Clause 5*91f16700Schasinglulu */ 6*91f16700Schasinglulu 7*91f16700Schasinglulu #include <libfdt.h> 8*91f16700Schasinglulu 9*91f16700Schasinglulu #include <common/debug.h> 10*91f16700Schasinglulu #include <common/fdt_fixup.h> 11*91f16700Schasinglulu #include <common/fdt_wrappers.h> 12*91f16700Schasinglulu 13*91f16700Schasinglulu #include <sunxi_private.h> 14*91f16700Schasinglulu 15*91f16700Schasinglulu void sunxi_prepare_dtb(void *fdt) 16*91f16700Schasinglulu { 17*91f16700Schasinglulu int ret; 18*91f16700Schasinglulu 19*91f16700Schasinglulu if (fdt == NULL || fdt_check_header(fdt) != 0) { 20*91f16700Schasinglulu return; 21*91f16700Schasinglulu } 22*91f16700Schasinglulu 23*91f16700Schasinglulu ret = fdt_open_into(fdt, fdt, 0x10000); 24*91f16700Schasinglulu if (ret < 0) { 25*91f16700Schasinglulu ERROR("Preparing devicetree at %p: error %d\n", fdt, ret); 26*91f16700Schasinglulu return; 27*91f16700Schasinglulu } 28*91f16700Schasinglulu 29*91f16700Schasinglulu #ifdef SUNXI_BL31_IN_DRAM 30*91f16700Schasinglulu /* Reserve memory used by Trusted Firmware. */ 31*91f16700Schasinglulu if (fdt_add_reserved_memory(fdt, "tf-a@40000000", BL31_BASE, 32*91f16700Schasinglulu BL31_LIMIT - BL31_BASE)) { 33*91f16700Schasinglulu WARN("Failed to add reserved memory nodes to DT.\n"); 34*91f16700Schasinglulu } 35*91f16700Schasinglulu #endif 36*91f16700Schasinglulu 37*91f16700Schasinglulu if (sunxi_psci_is_scpi()) { 38*91f16700Schasinglulu ret = fdt_add_cpu_idle_states(fdt, sunxi_idle_states); 39*91f16700Schasinglulu if (ret < 0) { 40*91f16700Schasinglulu WARN("Failed to add idle states to DT: %d\n", ret); 41*91f16700Schasinglulu } 42*91f16700Schasinglulu } 43*91f16700Schasinglulu 44*91f16700Schasinglulu ret = fdt_pack(fdt); 45*91f16700Schasinglulu if (ret < 0) { 46*91f16700Schasinglulu ERROR("Failed to pack devicetree at %p: error %d\n", 47*91f16700Schasinglulu fdt, ret); 48*91f16700Schasinglulu } 49*91f16700Schasinglulu 50*91f16700Schasinglulu clean_dcache_range((uintptr_t)fdt, fdt_blob_size(fdt)); 51*91f16700Schasinglulu INFO("Changed devicetree.\n"); 52*91f16700Schasinglulu } 53