xref: /rk3399_ARM-atf/plat/qti/common/src/qti_io_storage.c (revision 1c63cd61495542b0b52e1b6e484c59ce5c26e0d2)
1 /*
2  * Copyright (c) 2025, Qualcomm Technologies, Inc. and/or its subsidiaries.
3  *
4  * SPDX-License-Identifier: BSD-3-Clause
5  */
6 
7 #include <assert.h>
8 #include <errno.h>
9 #include <stdint.h>
10 
11 #include <drivers/io/io_block.h>
12 #include <drivers/io/io_driver.h>
13 #include <drivers/io/io_fip.h>
14 #include <drivers/io/io_memmap.h>
15 #include <lib/mmio.h>
16 #include <lib/utils_def.h>
17 #include <lib/xlat_tables/xlat_tables_v2.h>
18 #include <tools_share/firmware_image_package.h>
19 
20 #include <platform_def.h>
21 #include <qti_plat.h>
22 
23 static const io_dev_connector_t *qti_fip_dev_con;
24 static uintptr_t qti_fip_dev_handle;
25 
26 static const io_dev_connector_t *qti_backend_dev_con;
27 static uintptr_t qti_backend_dev_handle;
28 
29 static io_block_spec_t qti_fip_spec = {
30 	.offset = PLAT_QTI_FIP_IOBASE,
31 	.length = PLAT_QTI_FIP_MAXSIZE,
32 };
33 
34 static const io_uuid_spec_t qti_bl31_spec = {
35 	.uuid = UUID_EL3_RUNTIME_FIRMWARE_BL31,
36 };
37 
38 static const io_uuid_spec_t qti_bl32_spec = {
39 	.uuid = UUID_SECURE_PAYLOAD_BL32,
40 };
41 
42 static const io_uuid_spec_t qti_bl33_spec = {
43 	.uuid = UUID_NON_TRUSTED_FIRMWARE_BL33,
44 };
45 
46 struct qti_io_policy {
47 	uintptr_t *dev_handle;
48 	uintptr_t image_spec;
49 	uintptr_t init_params;
50 };
51 
52 static const struct qti_io_policy qti_io_policies[] = {
53 	[FIP_IMAGE_ID] = {
54 		.dev_handle = &qti_backend_dev_handle,
55 		.image_spec = (uintptr_t)&qti_fip_spec,
56 	},
57 	[BL31_IMAGE_ID] = {
58 		.dev_handle = &qti_fip_dev_handle,
59 		.image_spec = (uintptr_t)&qti_bl31_spec,
60 		.init_params = FIP_IMAGE_ID,
61 	},
62 	[BL32_IMAGE_ID] = {
63 		.dev_handle = &qti_fip_dev_handle,
64 		.image_spec = (uintptr_t)&qti_bl32_spec,
65 		.init_params = FIP_IMAGE_ID,
66 	},
67 	[BL33_IMAGE_ID] = {
68 		.dev_handle = &qti_fip_dev_handle,
69 		.image_spec = (uintptr_t)&qti_bl33_spec,
70 		.init_params = FIP_IMAGE_ID,
71 	},
72 };
73 
qti_io_memmap_setup(void)74 static int qti_io_memmap_setup(void)
75 {
76 	int ret;
77 
78 	ret = mmap_add_dynamic_region(qti_fip_spec.offset, qti_fip_spec.offset,
79 				      qti_fip_spec.length, MT_RO_DATA | MT_SECURE);
80 	if (ret) {
81 		return ret;
82 	}
83 
84 	ret = register_io_dev_memmap(&qti_backend_dev_con);
85 	if (ret) {
86 		return ret;
87 	}
88 
89 	return io_dev_open(qti_backend_dev_con, 0, &qti_backend_dev_handle);
90 }
91 
qti_io_fip_setup(void)92 static int qti_io_fip_setup(void)
93 {
94 	int ret;
95 
96 	ret = register_io_dev_fip(&qti_fip_dev_con);
97 	if (ret) {
98 		return ret;
99 	}
100 
101 	return io_dev_open(qti_fip_dev_con, 0, &qti_fip_dev_handle);
102 }
103 
qti_io_setup(void)104 int qti_io_setup(void)
105 {
106 	int ret;
107 
108 	ret = qti_io_memmap_setup();
109 	if (ret) {
110 		return ret;
111 	}
112 
113 	ret = qti_io_fip_setup();
114 	if (ret) {
115 		return ret;
116 	}
117 
118 	return 0;
119 }
120 
plat_get_image_source(unsigned int image_id,uintptr_t * dev_handle,uintptr_t * image_spec)121 int plat_get_image_source(unsigned int image_id, uintptr_t *dev_handle,
122 			  uintptr_t *image_spec)
123 {
124 	uintptr_t init_params;
125 
126 	assert(image_id < ARRAY_SIZE(qti_io_policies));
127 
128 	*dev_handle = *qti_io_policies[image_id].dev_handle;
129 	*image_spec = qti_io_policies[image_id].image_spec;
130 	init_params = qti_io_policies[image_id].init_params;
131 
132 	return io_dev_init(*dev_handle, init_params);
133 }
134