xref: /rk3399_rockchip-uboot/arch/arm/lib/bootm-fdt.c (revision 5c47e3d4734d329f41880f3b6ccf76f598763980)
1 /*
2  * Copyright (c) 2013, Google Inc.
3  *
4  * Copyright (C) 2011
5  * Corscience GmbH & Co. KG - Simon Schwarz <schwarz@corscience.de>
6  *  - Added prep subcommand support
7  *  - Reorganized source - modeled after powerpc version
8  *
9  * (C) Copyright 2002
10  * Sysgo Real-Time Solutions, GmbH <www.elinos.com>
11  * Marius Groeger <mgroeger@sysgo.de>
12  *
13  * Copyright (C) 2001  Erik Mouw (J.A.K.Mouw@its.tudelft.nl)
14  *
15  * SPDX-License-Identifier:	GPL-2.0+
16  */
17 
18 #include <common.h>
19 #include <fdt_support.h>
20 #ifdef CONFIG_ARMV7_NONSEC
21 #include <asm/armv7.h>
22 #endif
23 #include <asm/psci.h>
24 #include <asm/spin_table.h>
25 
26 DECLARE_GLOBAL_DATA_PTR;
27 
28 #ifdef CONFIG_FMAN_ENET
29 __weak int fdt_update_ethernet_dt(void *blob)
30 {
31 	return 0;
32 }
33 #endif
34 
35 int arch_fixup_fdt(void *blob)
36 {
37 	int ret = 0;
38 #if defined(CONFIG_ARMV7_NONSEC) || defined(CONFIG_OF_LIBFDT)
39 	bd_t *bd = gd->bd;
40 	int bank;
41 	u64 start[CONFIG_NR_DRAM_BANKS];
42 	u64 size[CONFIG_NR_DRAM_BANKS];
43 
44 	for (bank = 0; bank < CONFIG_NR_DRAM_BANKS; bank++) {
45 		if (size[bank] == 0)
46 			continue;
47 		start[bank] = bd->bi_dram[bank].start;
48 		size[bank] = bd->bi_dram[bank].size;
49 		printf("Adding bank: start=0x%08lx, size=0x%08lx\n",
50 		       gd->bd->bi_dram[bank].start, gd->bd->bi_dram[bank].size);
51 
52 #ifdef CONFIG_ARMV7_NONSEC
53 		ret = armv7_apply_memory_carveout(&start[bank], &size[bank]);
54 		if (ret)
55 			return ret;
56 #endif
57 	}
58 
59 #ifdef CONFIG_OF_LIBFDT
60 	ret = fdt_fixup_memory_banks(blob, start, size, CONFIG_NR_DRAM_BANKS);
61 	if (ret)
62 		return ret;
63 #endif
64 
65 #ifdef CONFIG_ARMV8_SPIN_TABLE
66 	ret = spin_table_update_dt(blob);
67 	if (ret)
68 		return ret;
69 #endif
70 
71 #if defined(CONFIG_ARMV7_NONSEC) || defined(CONFIG_ARMV8_PSCI) || \
72 	defined(CONFIG_SEC_FIRMWARE_ARMV8_PSCI)
73 	ret = psci_update_dt(blob);
74 	if (ret)
75 		return ret;
76 #endif
77 #endif
78 
79 #ifdef CONFIG_FMAN_ENET
80 	ret = fdt_update_ethernet_dt(blob);
81 	if (ret)
82 		return ret;
83 #endif
84 	return 0;
85 }
86