xref: /rk3399_ARM-atf/plat/hisilicon/poplar/plat_storage.c (revision e35d0edbbf5f55f2da5fa54ab5518149c18de622)
1*e35d0edbSJorge Ramirez-Ortiz /*
2*e35d0edbSJorge Ramirez-Ortiz  * Copyright (c) 2017, ARM Limited and Contributors. All rights reserved.
3*e35d0edbSJorge Ramirez-Ortiz  *
4*e35d0edbSJorge Ramirez-Ortiz  * SPDX-License-Identifier: BSD-3-Clause
5*e35d0edbSJorge Ramirez-Ortiz  */
6*e35d0edbSJorge Ramirez-Ortiz 
7*e35d0edbSJorge Ramirez-Ortiz #include <arch_helpers.h>
8*e35d0edbSJorge Ramirez-Ortiz #include <assert.h>
9*e35d0edbSJorge Ramirez-Ortiz #include <debug.h>
10*e35d0edbSJorge Ramirez-Ortiz #include <firmware_image_package.h>
11*e35d0edbSJorge Ramirez-Ortiz #include <io_block.h>
12*e35d0edbSJorge Ramirez-Ortiz #include <io_driver.h>
13*e35d0edbSJorge Ramirez-Ortiz #include <io_fip.h>
14*e35d0edbSJorge Ramirez-Ortiz #include <io_memmap.h>
15*e35d0edbSJorge Ramirez-Ortiz #include <io_storage.h>
16*e35d0edbSJorge Ramirez-Ortiz #include <mmio.h>
17*e35d0edbSJorge Ramirez-Ortiz #include <partition/partition.h>
18*e35d0edbSJorge Ramirez-Ortiz #include <semihosting.h>
19*e35d0edbSJorge Ramirez-Ortiz #include <string.h>
20*e35d0edbSJorge Ramirez-Ortiz #include <tbbr_img_def.h>
21*e35d0edbSJorge Ramirez-Ortiz #include <utils.h>
22*e35d0edbSJorge Ramirez-Ortiz #include "platform_def.h"
23*e35d0edbSJorge Ramirez-Ortiz 
24*e35d0edbSJorge Ramirez-Ortiz static const io_dev_connector_t *mmap_dev_con;
25*e35d0edbSJorge Ramirez-Ortiz static const io_dev_connector_t *fip_dev_con;
26*e35d0edbSJorge Ramirez-Ortiz 
27*e35d0edbSJorge Ramirez-Ortiz static uintptr_t mmap_dev_handle;
28*e35d0edbSJorge Ramirez-Ortiz static uintptr_t fip_dev_handle;
29*e35d0edbSJorge Ramirez-Ortiz 
30*e35d0edbSJorge Ramirez-Ortiz static int open_mmap(const uintptr_t spec);
31*e35d0edbSJorge Ramirez-Ortiz static int open_fip(const uintptr_t spec);
32*e35d0edbSJorge Ramirez-Ortiz 
33*e35d0edbSJorge Ramirez-Ortiz static const io_block_spec_t loader_fip_spec = {
34*e35d0edbSJorge Ramirez-Ortiz 	.offset		= FIP_BASE,
35*e35d0edbSJorge Ramirez-Ortiz 	.length		= FIP_SIZE
36*e35d0edbSJorge Ramirez-Ortiz };
37*e35d0edbSJorge Ramirez-Ortiz 
38*e35d0edbSJorge Ramirez-Ortiz static const io_uuid_spec_t bl2_uuid_spec = {
39*e35d0edbSJorge Ramirez-Ortiz 	.uuid = UUID_TRUSTED_BOOT_FIRMWARE_BL2,
40*e35d0edbSJorge Ramirez-Ortiz };
41*e35d0edbSJorge Ramirez-Ortiz 
42*e35d0edbSJorge Ramirez-Ortiz static const io_uuid_spec_t bl31_uuid_spec = {
43*e35d0edbSJorge Ramirez-Ortiz 	.uuid = UUID_EL3_RUNTIME_FIRMWARE_BL31,
44*e35d0edbSJorge Ramirez-Ortiz };
45*e35d0edbSJorge Ramirez-Ortiz 
46*e35d0edbSJorge Ramirez-Ortiz static const io_uuid_spec_t bl33_uuid_spec = {
47*e35d0edbSJorge Ramirez-Ortiz 	.uuid = UUID_NON_TRUSTED_FIRMWARE_BL33,
48*e35d0edbSJorge Ramirez-Ortiz };
49*e35d0edbSJorge Ramirez-Ortiz 
50*e35d0edbSJorge Ramirez-Ortiz struct plat_io_policy {
51*e35d0edbSJorge Ramirez-Ortiz 	uintptr_t	*dev_handle;
52*e35d0edbSJorge Ramirez-Ortiz 	uintptr_t	image_spec;
53*e35d0edbSJorge Ramirez-Ortiz 	int		(*check)(const uintptr_t spec);
54*e35d0edbSJorge Ramirez-Ortiz };
55*e35d0edbSJorge Ramirez-Ortiz 
56*e35d0edbSJorge Ramirez-Ortiz static const struct plat_io_policy policies[] = {
57*e35d0edbSJorge Ramirez-Ortiz 	[FIP_IMAGE_ID] = {
58*e35d0edbSJorge Ramirez-Ortiz 		&mmap_dev_handle,
59*e35d0edbSJorge Ramirez-Ortiz 		(uintptr_t)&loader_fip_spec,
60*e35d0edbSJorge Ramirez-Ortiz 		open_mmap
61*e35d0edbSJorge Ramirez-Ortiz 	},
62*e35d0edbSJorge Ramirez-Ortiz 	[BL2_IMAGE_ID] = {
63*e35d0edbSJorge Ramirez-Ortiz 		&fip_dev_handle,
64*e35d0edbSJorge Ramirez-Ortiz 		(uintptr_t)&bl2_uuid_spec,
65*e35d0edbSJorge Ramirez-Ortiz 		open_fip
66*e35d0edbSJorge Ramirez-Ortiz 	},
67*e35d0edbSJorge Ramirez-Ortiz 	[BL31_IMAGE_ID] = {
68*e35d0edbSJorge Ramirez-Ortiz 		&fip_dev_handle,
69*e35d0edbSJorge Ramirez-Ortiz 		(uintptr_t)&bl31_uuid_spec,
70*e35d0edbSJorge Ramirez-Ortiz 		open_fip
71*e35d0edbSJorge Ramirez-Ortiz 	},
72*e35d0edbSJorge Ramirez-Ortiz 	[BL33_IMAGE_ID] = {
73*e35d0edbSJorge Ramirez-Ortiz 		&fip_dev_handle,
74*e35d0edbSJorge Ramirez-Ortiz 		(uintptr_t)&bl33_uuid_spec,
75*e35d0edbSJorge Ramirez-Ortiz 		open_fip
76*e35d0edbSJorge Ramirez-Ortiz 	},
77*e35d0edbSJorge Ramirez-Ortiz };
78*e35d0edbSJorge Ramirez-Ortiz 
79*e35d0edbSJorge Ramirez-Ortiz static int open_mmap(const uintptr_t spec)
80*e35d0edbSJorge Ramirez-Ortiz {
81*e35d0edbSJorge Ramirez-Ortiz 	int result;
82*e35d0edbSJorge Ramirez-Ortiz 	uintptr_t local_image_handle;
83*e35d0edbSJorge Ramirez-Ortiz 
84*e35d0edbSJorge Ramirez-Ortiz 	result = io_dev_init(mmap_dev_handle, (uintptr_t)NULL);
85*e35d0edbSJorge Ramirez-Ortiz 	if (result == 0) {
86*e35d0edbSJorge Ramirez-Ortiz 		result = io_open(mmap_dev_handle, spec, &local_image_handle);
87*e35d0edbSJorge Ramirez-Ortiz 		if (result == 0) {
88*e35d0edbSJorge Ramirez-Ortiz 			io_close(local_image_handle);
89*e35d0edbSJorge Ramirez-Ortiz 		}
90*e35d0edbSJorge Ramirez-Ortiz 	}
91*e35d0edbSJorge Ramirez-Ortiz 	return result;
92*e35d0edbSJorge Ramirez-Ortiz }
93*e35d0edbSJorge Ramirez-Ortiz 
94*e35d0edbSJorge Ramirez-Ortiz static int open_fip(const uintptr_t spec)
95*e35d0edbSJorge Ramirez-Ortiz {
96*e35d0edbSJorge Ramirez-Ortiz 	uintptr_t local_image_handle;
97*e35d0edbSJorge Ramirez-Ortiz 	int result;
98*e35d0edbSJorge Ramirez-Ortiz 
99*e35d0edbSJorge Ramirez-Ortiz 	result = io_dev_init(fip_dev_handle, (uintptr_t) FIP_IMAGE_ID);
100*e35d0edbSJorge Ramirez-Ortiz 	if (result == 0) {
101*e35d0edbSJorge Ramirez-Ortiz 		result = io_open(fip_dev_handle, spec, &local_image_handle);
102*e35d0edbSJorge Ramirez-Ortiz 		if (result == 0) {
103*e35d0edbSJorge Ramirez-Ortiz 			io_close(local_image_handle);
104*e35d0edbSJorge Ramirez-Ortiz 		} else {
105*e35d0edbSJorge Ramirez-Ortiz 			VERBOSE("error opening fip\n");
106*e35d0edbSJorge Ramirez-Ortiz 		}
107*e35d0edbSJorge Ramirez-Ortiz 	} else {
108*e35d0edbSJorge Ramirez-Ortiz 		VERBOSE("error initializing fip\n");
109*e35d0edbSJorge Ramirez-Ortiz 	}
110*e35d0edbSJorge Ramirez-Ortiz 
111*e35d0edbSJorge Ramirez-Ortiz 	return result;
112*e35d0edbSJorge Ramirez-Ortiz }
113*e35d0edbSJorge Ramirez-Ortiz 
114*e35d0edbSJorge Ramirez-Ortiz int plat_get_image_source(unsigned int image_id, uintptr_t *dev_handle,
115*e35d0edbSJorge Ramirez-Ortiz 			  uintptr_t *image_spec)
116*e35d0edbSJorge Ramirez-Ortiz {
117*e35d0edbSJorge Ramirez-Ortiz 	const struct plat_io_policy *policy;
118*e35d0edbSJorge Ramirez-Ortiz 	int result;
119*e35d0edbSJorge Ramirez-Ortiz 
120*e35d0edbSJorge Ramirez-Ortiz 	assert(image_id < ARRAY_SIZE(policies));
121*e35d0edbSJorge Ramirez-Ortiz 
122*e35d0edbSJorge Ramirez-Ortiz 	policy = &policies[image_id];
123*e35d0edbSJorge Ramirez-Ortiz 	result = policy->check(policy->image_spec);
124*e35d0edbSJorge Ramirez-Ortiz 	assert(result == 0);
125*e35d0edbSJorge Ramirez-Ortiz 
126*e35d0edbSJorge Ramirez-Ortiz 	*image_spec = policy->image_spec;
127*e35d0edbSJorge Ramirez-Ortiz 	*dev_handle = *(policy->dev_handle);
128*e35d0edbSJorge Ramirez-Ortiz 
129*e35d0edbSJorge Ramirez-Ortiz 	return result;
130*e35d0edbSJorge Ramirez-Ortiz }
131*e35d0edbSJorge Ramirez-Ortiz 
132*e35d0edbSJorge Ramirez-Ortiz void plat_io_setup(void)
133*e35d0edbSJorge Ramirez-Ortiz {
134*e35d0edbSJorge Ramirez-Ortiz 	int result;
135*e35d0edbSJorge Ramirez-Ortiz 
136*e35d0edbSJorge Ramirez-Ortiz 	result = register_io_dev_memmap(&mmap_dev_con);
137*e35d0edbSJorge Ramirez-Ortiz 	assert(result == 0);
138*e35d0edbSJorge Ramirez-Ortiz 
139*e35d0edbSJorge Ramirez-Ortiz 	result = register_io_dev_fip(&fip_dev_con);
140*e35d0edbSJorge Ramirez-Ortiz 	assert(result == 0);
141*e35d0edbSJorge Ramirez-Ortiz 
142*e35d0edbSJorge Ramirez-Ortiz 	result = io_dev_open(fip_dev_con, (uintptr_t)&loader_fip_spec,
143*e35d0edbSJorge Ramirez-Ortiz 				&fip_dev_handle);
144*e35d0edbSJorge Ramirez-Ortiz 	assert(result == 0);
145*e35d0edbSJorge Ramirez-Ortiz 
146*e35d0edbSJorge Ramirez-Ortiz 	result = io_dev_open(mmap_dev_con, (uintptr_t)NULL, &mmap_dev_handle);
147*e35d0edbSJorge Ramirez-Ortiz 	assert(result == 0);
148*e35d0edbSJorge Ramirez-Ortiz 
149*e35d0edbSJorge Ramirez-Ortiz 	(void) result;
150*e35d0edbSJorge Ramirez-Ortiz }
151