blob: 66af35ab80e905e6bbb7dbd23cf49cd9fe936366 [file] [log] [blame]
Andre Przywarafb838332020-12-14 12:06:24 +00001/*
2 * Copyright (c) 2021, ARM Limited. All rights reserved.
3 *
4 * SPDX-License-Identifier: BSD-3-Clause
5 */
6
7#include <libfdt.h>
8
9#include <common/debug.h>
10#include <common/fdt_fixup.h>
11#include <common/fdt_wrappers.h>
12
13#include <sunxi_private.h>
14
15void sunxi_prepare_dtb(void *fdt)
16{
17 int ret;
18
19 if (fdt == NULL || fdt_check_header(fdt) != 0) {
20 return;
21 }
Andre Przywara9de12222021-12-19 13:39:40 +000022
23 ret = fdt_open_into(fdt, fdt, 0x10000);
Andre Przywarafb838332020-12-14 12:06:24 +000024 if (ret < 0) {
25 ERROR("Preparing devicetree at %p: error %d\n", fdt, ret);
26 return;
27 }
28
Andre Przywara9de12222021-12-19 13:39:40 +000029#ifdef SUNXI_BL31_IN_DRAM
Andre Przywarafb838332020-12-14 12:06:24 +000030 /* Reserve memory used by Trusted Firmware. */
31 if (fdt_add_reserved_memory(fdt, "tf-a@40000000", BL31_BASE,
32 BL31_LIMIT - BL31_BASE)) {
33 WARN("Failed to add reserved memory nodes to DT.\n");
Andre Przywarafb838332020-12-14 12:06:24 +000034 }
Andre Przywara9de12222021-12-19 13:39:40 +000035#endif
Andre Przywarafb838332020-12-14 12:06:24 +000036
Samuel Holland365966c2022-01-22 23:37:12 -060037 if (sunxi_psci_is_scpi()) {
38 ret = fdt_add_cpu_idle_states(fdt, sunxi_idle_states);
39 if (ret < 0) {
40 WARN("Failed to add idle states to DT: %d\n", ret);
41 }
42 }
43
Andre Przywarafb838332020-12-14 12:06:24 +000044 ret = fdt_pack(fdt);
45 if (ret < 0) {
46 ERROR("Failed to pack devicetree at %p: error %d\n",
47 fdt, ret);
Andre Przywarafb838332020-12-14 12:06:24 +000048 }
Samuel Holland60fcf322022-01-23 16:30:08 -060049
50 clean_dcache_range((uintptr_t)fdt, fdt_blob_size(fdt));
51 INFO("Changed devicetree.\n");
Andre Przywarafb838332020-12-14 12:06:24 +000052}