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