xref: /OK3568_Linux_fs/u-boot/arch/arm/mach-omap2/fdt-common.c (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun /*
2*4882a593Smuzhiyun  * Copyright 2016-2017 Texas Instruments, Inc.
3*4882a593Smuzhiyun  *
4*4882a593Smuzhiyun  * SPDX-License-Identifier: GPL-2.0+
5*4882a593Smuzhiyun  */
6*4882a593Smuzhiyun 
7*4882a593Smuzhiyun #include <common.h>
8*4882a593Smuzhiyun #include <linux/libfdt.h>
9*4882a593Smuzhiyun #include <fdt_support.h>
10*4882a593Smuzhiyun 
11*4882a593Smuzhiyun #include <asm/omap_common.h>
12*4882a593Smuzhiyun #include <asm/omap_sec_common.h>
13*4882a593Smuzhiyun 
14*4882a593Smuzhiyun #ifdef CONFIG_TI_SECURE_DEVICE
15*4882a593Smuzhiyun 
16*4882a593Smuzhiyun /* Give zero values if not already defined */
17*4882a593Smuzhiyun #ifndef TI_OMAP5_SECURE_BOOT_RESV_SRAM_SZ
18*4882a593Smuzhiyun #define TI_OMAP5_SECURE_BOOT_RESV_SRAM_SZ (0)
19*4882a593Smuzhiyun #endif
20*4882a593Smuzhiyun #ifndef CONFIG_SECURE_RUNTIME_RESV_SRAM_SZ
21*4882a593Smuzhiyun #define CONFIG_SECURE_RUNTIME_RESV_SRAM_SZ (0)
22*4882a593Smuzhiyun #endif
23*4882a593Smuzhiyun 
ft_hs_disable_rng(void * fdt,bd_t * bd)24*4882a593Smuzhiyun int ft_hs_disable_rng(void *fdt, bd_t *bd)
25*4882a593Smuzhiyun {
26*4882a593Smuzhiyun 	const char *path;
27*4882a593Smuzhiyun 	int offs;
28*4882a593Smuzhiyun 	int ret;
29*4882a593Smuzhiyun 
30*4882a593Smuzhiyun 	/* Make HW RNG reserved for secure world use */
31*4882a593Smuzhiyun 	path = "/ocp/rng";
32*4882a593Smuzhiyun 	offs = fdt_path_offset(fdt, path);
33*4882a593Smuzhiyun 	if (offs < 0) {
34*4882a593Smuzhiyun 		debug("Node %s not found.\n", path);
35*4882a593Smuzhiyun 		return 0;
36*4882a593Smuzhiyun 	}
37*4882a593Smuzhiyun 	ret = fdt_setprop_string(fdt, offs,
38*4882a593Smuzhiyun 				 "status", "disabled");
39*4882a593Smuzhiyun 	if (ret < 0) {
40*4882a593Smuzhiyun 		printf("Could not add status property to node %s: %s\n",
41*4882a593Smuzhiyun 		       path, fdt_strerror(ret));
42*4882a593Smuzhiyun 		return ret;
43*4882a593Smuzhiyun 	}
44*4882a593Smuzhiyun 	return 0;
45*4882a593Smuzhiyun }
46*4882a593Smuzhiyun 
47*4882a593Smuzhiyun #if (CONFIG_TI_SECURE_EMIF_TOTAL_REGION_SIZE != 0)
48*4882a593Smuzhiyun /*
49*4882a593Smuzhiyun  * fdt_pack_reg - pack address and size array into the "reg"-suitable stream
50*4882a593Smuzhiyun  */
fdt_pack_reg(const void * fdt,void * buf,u64 address,u64 size)51*4882a593Smuzhiyun static int fdt_pack_reg(const void *fdt, void *buf, u64 address, u64 size)
52*4882a593Smuzhiyun {
53*4882a593Smuzhiyun 	int address_cells = fdt_address_cells(fdt, 0);
54*4882a593Smuzhiyun 	int size_cells = fdt_size_cells(fdt, 0);
55*4882a593Smuzhiyun 	char *p = buf;
56*4882a593Smuzhiyun 
57*4882a593Smuzhiyun 	if (address_cells == 2)
58*4882a593Smuzhiyun 		*(fdt64_t *)p = cpu_to_fdt64(address);
59*4882a593Smuzhiyun 	else
60*4882a593Smuzhiyun 		*(fdt32_t *)p = cpu_to_fdt32(address);
61*4882a593Smuzhiyun 	p += 4 * address_cells;
62*4882a593Smuzhiyun 
63*4882a593Smuzhiyun 	if (size_cells == 2)
64*4882a593Smuzhiyun 		*(fdt64_t *)p = cpu_to_fdt64(size);
65*4882a593Smuzhiyun 	else
66*4882a593Smuzhiyun 		*(fdt32_t *)p = cpu_to_fdt32(size);
67*4882a593Smuzhiyun 	p += 4 * size_cells;
68*4882a593Smuzhiyun 
69*4882a593Smuzhiyun 	return p - (char *)buf;
70*4882a593Smuzhiyun }
71*4882a593Smuzhiyun 
ft_hs_fixup_dram(void * fdt,bd_t * bd)72*4882a593Smuzhiyun int ft_hs_fixup_dram(void *fdt, bd_t *bd)
73*4882a593Smuzhiyun {
74*4882a593Smuzhiyun 	const char *path, *subpath;
75*4882a593Smuzhiyun 	int offs, len;
76*4882a593Smuzhiyun 	u32 sec_mem_start = get_sec_mem_start();
77*4882a593Smuzhiyun 	u32 sec_mem_size = CONFIG_TI_SECURE_EMIF_TOTAL_REGION_SIZE;
78*4882a593Smuzhiyun 	fdt32_t address_cells = cpu_to_fdt32(fdt_address_cells(fdt, 0));
79*4882a593Smuzhiyun 	fdt32_t size_cells = cpu_to_fdt32(fdt_size_cells(fdt, 0));
80*4882a593Smuzhiyun 	u8 temp[16]; /* Up to 64-bit address + 64-bit size */
81*4882a593Smuzhiyun 
82*4882a593Smuzhiyun 	/* Delete any original secure_reserved node */
83*4882a593Smuzhiyun 	path = "/reserved-memory/secure_reserved";
84*4882a593Smuzhiyun 	offs = fdt_path_offset(fdt, path);
85*4882a593Smuzhiyun 	if (offs >= 0)
86*4882a593Smuzhiyun 		fdt_del_node(fdt, offs);
87*4882a593Smuzhiyun 
88*4882a593Smuzhiyun 	/* Add new secure_reserved node */
89*4882a593Smuzhiyun 	path = "/reserved-memory";
90*4882a593Smuzhiyun 	offs = fdt_path_offset(fdt, path);
91*4882a593Smuzhiyun 	if (offs < 0) {
92*4882a593Smuzhiyun 		debug("Node %s not found\n", path);
93*4882a593Smuzhiyun 		path = "/";
94*4882a593Smuzhiyun 		subpath = "reserved-memory";
95*4882a593Smuzhiyun 		offs = fdt_path_offset(fdt, path);
96*4882a593Smuzhiyun 		offs = fdt_add_subnode(fdt, offs, subpath);
97*4882a593Smuzhiyun 		if (offs < 0) {
98*4882a593Smuzhiyun 			printf("Could not create %s%s node.\n", path, subpath);
99*4882a593Smuzhiyun 			return 1;
100*4882a593Smuzhiyun 		}
101*4882a593Smuzhiyun 		path = "/reserved-memory";
102*4882a593Smuzhiyun 		offs = fdt_path_offset(fdt, path);
103*4882a593Smuzhiyun 
104*4882a593Smuzhiyun 		fdt_setprop(fdt, offs, "#address-cells", &address_cells, sizeof(address_cells));
105*4882a593Smuzhiyun 		fdt_setprop(fdt, offs, "#size-cells", &size_cells, sizeof(size_cells));
106*4882a593Smuzhiyun 		fdt_setprop(fdt, offs, "ranges", NULL, 0);
107*4882a593Smuzhiyun 	}
108*4882a593Smuzhiyun 
109*4882a593Smuzhiyun 	subpath = "secure_reserved";
110*4882a593Smuzhiyun 	offs = fdt_add_subnode(fdt, offs, subpath);
111*4882a593Smuzhiyun 	if (offs < 0) {
112*4882a593Smuzhiyun 		printf("Could not create %s%s node.\n", path, subpath);
113*4882a593Smuzhiyun 		return 1;
114*4882a593Smuzhiyun 	}
115*4882a593Smuzhiyun 
116*4882a593Smuzhiyun 	fdt_setprop_string(fdt, offs, "compatible", "ti,secure-memory");
117*4882a593Smuzhiyun 	fdt_setprop_string(fdt, offs, "status", "okay");
118*4882a593Smuzhiyun 	fdt_setprop(fdt, offs, "no-map", NULL, 0);
119*4882a593Smuzhiyun 	len = fdt_pack_reg(fdt, temp, sec_mem_start, sec_mem_size);
120*4882a593Smuzhiyun 	fdt_setprop(fdt, offs, "reg", temp, len);
121*4882a593Smuzhiyun 
122*4882a593Smuzhiyun 	return 0;
123*4882a593Smuzhiyun }
124*4882a593Smuzhiyun #else
ft_hs_fixup_dram(void * fdt,bd_t * bd)125*4882a593Smuzhiyun int ft_hs_fixup_dram(void *fdt, bd_t *bd) { return 0; }
126*4882a593Smuzhiyun #endif
127*4882a593Smuzhiyun 
ft_hs_add_tee(void * fdt,bd_t * bd)128*4882a593Smuzhiyun int ft_hs_add_tee(void *fdt, bd_t *bd)
129*4882a593Smuzhiyun {
130*4882a593Smuzhiyun 	const char *path, *subpath;
131*4882a593Smuzhiyun 	int offs;
132*4882a593Smuzhiyun 
133*4882a593Smuzhiyun 	extern int tee_loaded;
134*4882a593Smuzhiyun 	if (!tee_loaded)
135*4882a593Smuzhiyun 		return 0;
136*4882a593Smuzhiyun 
137*4882a593Smuzhiyun 	path = "/firmware";
138*4882a593Smuzhiyun 	offs = fdt_path_offset(fdt, path);
139*4882a593Smuzhiyun 	if (offs < 0) {
140*4882a593Smuzhiyun 		path = "/";
141*4882a593Smuzhiyun 		offs = fdt_path_offset(fdt, path);
142*4882a593Smuzhiyun 		if (offs < 0) {
143*4882a593Smuzhiyun 			printf("Could not find root node.\n");
144*4882a593Smuzhiyun 			return 1;
145*4882a593Smuzhiyun 		}
146*4882a593Smuzhiyun 
147*4882a593Smuzhiyun 		subpath = "firmware";
148*4882a593Smuzhiyun 		offs = fdt_add_subnode(fdt, offs, subpath);
149*4882a593Smuzhiyun 		if (offs < 0) {
150*4882a593Smuzhiyun 			printf("Could not create %s node.\n", subpath);
151*4882a593Smuzhiyun 			return 1;
152*4882a593Smuzhiyun 		}
153*4882a593Smuzhiyun 	}
154*4882a593Smuzhiyun 
155*4882a593Smuzhiyun 	subpath = "optee";
156*4882a593Smuzhiyun 	offs = fdt_add_subnode(fdt, offs, subpath);
157*4882a593Smuzhiyun 	if (offs < 0) {
158*4882a593Smuzhiyun 		printf("Could not create %s node.\n", subpath);
159*4882a593Smuzhiyun 		return 1;
160*4882a593Smuzhiyun 	}
161*4882a593Smuzhiyun 
162*4882a593Smuzhiyun 	fdt_setprop_string(fdt, offs, "compatible", "linaro,optee-tz");
163*4882a593Smuzhiyun 	fdt_setprop_string(fdt, offs, "method", "smc");
164*4882a593Smuzhiyun 
165*4882a593Smuzhiyun 	return 0;
166*4882a593Smuzhiyun }
167*4882a593Smuzhiyun 
168*4882a593Smuzhiyun #endif
169