1d8e919c7SMasahiro Yamada /*
2b5dd85f2SMasahiro Yamada * Copyright (c) 2017-2020, ARM Limited and Contributors. All rights reserved.
3d8e919c7SMasahiro Yamada *
4d8e919c7SMasahiro Yamada * SPDX-License-Identifier: BSD-3-Clause
5d8e919c7SMasahiro Yamada */
6d8e919c7SMasahiro Yamada
7d8e919c7SMasahiro Yamada #include <assert.h>
8d8e919c7SMasahiro Yamada #include <errno.h>
993c78ed2SAntonio Nino Diaz #include <stdint.h>
1009d40e0eSAntonio Nino Diaz
1109d40e0eSAntonio Nino Diaz #include <platform_def.h>
1209d40e0eSAntonio Nino Diaz
1309d40e0eSAntonio Nino Diaz #include <drivers/io/io_block.h>
1409d40e0eSAntonio Nino Diaz #include <drivers/io/io_driver.h>
1509d40e0eSAntonio Nino Diaz #include <drivers/io/io_fip.h>
1609d40e0eSAntonio Nino Diaz #include <drivers/io/io_memmap.h>
1709d40e0eSAntonio Nino Diaz #include <lib/utils_def.h>
1809d40e0eSAntonio Nino Diaz #include <lib/xlat_tables/xlat_tables_v2.h>
1909d40e0eSAntonio Nino Diaz #include <tools_share/firmware_image_package.h>
20d8e919c7SMasahiro Yamada
21d8e919c7SMasahiro Yamada #include "uniphier.h"
22d8e919c7SMasahiro Yamada
234f557c77SMasahiro Yamada #define UNIPHIER_ROM_REGION_BASE 0x00000000ULL
24548654bcSMasahiro Yamada #define UNIPHIER_ROM_REGION_SIZE 0x04000000ULL
25d8e919c7SMasahiro Yamada
264f557c77SMasahiro Yamada #define UNIPHIER_OCM_REGION_SIZE 0x00040000ULL
279c740a58SMasahiro Yamada
28*39784f2aSMasahiro Yamada #define UNIPHIER_BLOCK_BUF_OFFSET 0x03000000UL
29*39784f2aSMasahiro Yamada #define UNIPHIER_BLOCK_BUF_SIZE 0x00800000UL
30b79b3177SMasahiro Yamada
31d8e919c7SMasahiro Yamada static const io_dev_connector_t *uniphier_fip_dev_con;
32d8e919c7SMasahiro Yamada static uintptr_t uniphier_fip_dev_handle;
33d8e919c7SMasahiro Yamada
34d8e919c7SMasahiro Yamada static const io_dev_connector_t *uniphier_backend_dev_con;
35d8e919c7SMasahiro Yamada static uintptr_t uniphier_backend_dev_handle;
36d8e919c7SMasahiro Yamada
37d8e919c7SMasahiro Yamada static io_block_spec_t uniphier_fip_spec = {
38d8e919c7SMasahiro Yamada /* .offset will be set by the io_setup func */
39d8e919c7SMasahiro Yamada .length = 0x00200000,
40d8e919c7SMasahiro Yamada };
41d8e919c7SMasahiro Yamada
42d8e919c7SMasahiro Yamada static const io_uuid_spec_t uniphier_bl2_spec = {
43d8e919c7SMasahiro Yamada .uuid = UUID_TRUSTED_BOOT_FIRMWARE_BL2,
44d8e919c7SMasahiro Yamada };
45d8e919c7SMasahiro Yamada
46d8e919c7SMasahiro Yamada static const io_uuid_spec_t uniphier_scp_spec = {
47d8e919c7SMasahiro Yamada .uuid = UUID_SCP_FIRMWARE_SCP_BL2,
48d8e919c7SMasahiro Yamada };
49d8e919c7SMasahiro Yamada
50d8e919c7SMasahiro Yamada static const io_uuid_spec_t uniphier_bl31_spec = {
51d8e919c7SMasahiro Yamada .uuid = UUID_EL3_RUNTIME_FIRMWARE_BL31,
52d8e919c7SMasahiro Yamada };
53d8e919c7SMasahiro Yamada
54d8e919c7SMasahiro Yamada static const io_uuid_spec_t uniphier_bl32_spec = {
55d8e919c7SMasahiro Yamada .uuid = UUID_SECURE_PAYLOAD_BL32,
56d8e919c7SMasahiro Yamada };
57d8e919c7SMasahiro Yamada
58d8e919c7SMasahiro Yamada static const io_uuid_spec_t uniphier_bl33_spec = {
59d8e919c7SMasahiro Yamada .uuid = UUID_NON_TRUSTED_FIRMWARE_BL33,
60d8e919c7SMasahiro Yamada };
61d8e919c7SMasahiro Yamada
62d8e919c7SMasahiro Yamada #if TRUSTED_BOARD_BOOT
63d8e919c7SMasahiro Yamada static const io_uuid_spec_t uniphier_tb_fw_cert_spec = {
64d8e919c7SMasahiro Yamada .uuid = UUID_TRUSTED_BOOT_FW_CERT,
65d8e919c7SMasahiro Yamada };
66d8e919c7SMasahiro Yamada
67d8e919c7SMasahiro Yamada static const io_uuid_spec_t uniphier_trusted_key_cert_spec = {
68d8e919c7SMasahiro Yamada .uuid = UUID_TRUSTED_KEY_CERT,
69d8e919c7SMasahiro Yamada };
70d8e919c7SMasahiro Yamada
71d8e919c7SMasahiro Yamada static const io_uuid_spec_t uniphier_scp_fw_key_cert_spec = {
72d8e919c7SMasahiro Yamada .uuid = UUID_SCP_FW_KEY_CERT,
73d8e919c7SMasahiro Yamada };
74d8e919c7SMasahiro Yamada
75d8e919c7SMasahiro Yamada static const io_uuid_spec_t uniphier_soc_fw_key_cert_spec = {
76d8e919c7SMasahiro Yamada .uuid = UUID_SOC_FW_KEY_CERT,
77d8e919c7SMasahiro Yamada };
78d8e919c7SMasahiro Yamada
79d8e919c7SMasahiro Yamada static const io_uuid_spec_t uniphier_tos_fw_key_cert_spec = {
80d8e919c7SMasahiro Yamada .uuid = UUID_TRUSTED_OS_FW_KEY_CERT,
81d8e919c7SMasahiro Yamada };
82d8e919c7SMasahiro Yamada
83d8e919c7SMasahiro Yamada static const io_uuid_spec_t uniphier_nt_fw_key_cert_spec = {
84d8e919c7SMasahiro Yamada .uuid = UUID_NON_TRUSTED_FW_KEY_CERT,
85d8e919c7SMasahiro Yamada };
86d8e919c7SMasahiro Yamada
87d8e919c7SMasahiro Yamada static const io_uuid_spec_t uniphier_scp_fw_cert_spec = {
88d8e919c7SMasahiro Yamada .uuid = UUID_SCP_FW_CONTENT_CERT,
89d8e919c7SMasahiro Yamada };
90d8e919c7SMasahiro Yamada
91d8e919c7SMasahiro Yamada static const io_uuid_spec_t uniphier_soc_fw_cert_spec = {
92d8e919c7SMasahiro Yamada .uuid = UUID_SOC_FW_CONTENT_CERT,
93d8e919c7SMasahiro Yamada };
94d8e919c7SMasahiro Yamada
95d8e919c7SMasahiro Yamada static const io_uuid_spec_t uniphier_tos_fw_cert_spec = {
96d8e919c7SMasahiro Yamada .uuid = UUID_TRUSTED_OS_FW_CONTENT_CERT,
97d8e919c7SMasahiro Yamada };
98d8e919c7SMasahiro Yamada
99d8e919c7SMasahiro Yamada static const io_uuid_spec_t uniphier_nt_fw_cert_spec = {
100d8e919c7SMasahiro Yamada .uuid = UUID_NON_TRUSTED_FW_CONTENT_CERT,
101d8e919c7SMasahiro Yamada };
102d8e919c7SMasahiro Yamada #endif /* TRUSTED_BOARD_BOOT */
103d8e919c7SMasahiro Yamada
104d8e919c7SMasahiro Yamada struct uniphier_io_policy {
105d8e919c7SMasahiro Yamada uintptr_t *dev_handle;
106d8e919c7SMasahiro Yamada uintptr_t image_spec;
107d8e919c7SMasahiro Yamada uintptr_t init_params;
108d8e919c7SMasahiro Yamada };
109d8e919c7SMasahiro Yamada
110d8e919c7SMasahiro Yamada static const struct uniphier_io_policy uniphier_io_policies[] = {
111d8e919c7SMasahiro Yamada [FIP_IMAGE_ID] = {
112d8e919c7SMasahiro Yamada .dev_handle = &uniphier_backend_dev_handle,
113d8e919c7SMasahiro Yamada .image_spec = (uintptr_t)&uniphier_fip_spec,
114d8e919c7SMasahiro Yamada },
115d8e919c7SMasahiro Yamada [BL2_IMAGE_ID] = {
116d8e919c7SMasahiro Yamada .dev_handle = &uniphier_fip_dev_handle,
117d8e919c7SMasahiro Yamada .image_spec = (uintptr_t)&uniphier_bl2_spec,
118d8e919c7SMasahiro Yamada .init_params = FIP_IMAGE_ID,
119d8e919c7SMasahiro Yamada },
120d8e919c7SMasahiro Yamada [SCP_BL2_IMAGE_ID] = {
121d8e919c7SMasahiro Yamada .dev_handle = &uniphier_fip_dev_handle,
122d8e919c7SMasahiro Yamada .image_spec = (uintptr_t)&uniphier_scp_spec,
123d8e919c7SMasahiro Yamada .init_params = FIP_IMAGE_ID,
124d8e919c7SMasahiro Yamada },
125d8e919c7SMasahiro Yamada [BL31_IMAGE_ID] = {
126d8e919c7SMasahiro Yamada .dev_handle = &uniphier_fip_dev_handle,
127d8e919c7SMasahiro Yamada .image_spec = (uintptr_t)&uniphier_bl31_spec,
128d8e919c7SMasahiro Yamada .init_params = FIP_IMAGE_ID,
129d8e919c7SMasahiro Yamada },
130d8e919c7SMasahiro Yamada [BL32_IMAGE_ID] = {
131d8e919c7SMasahiro Yamada .dev_handle = &uniphier_fip_dev_handle,
132d8e919c7SMasahiro Yamada .image_spec = (uintptr_t)&uniphier_bl32_spec,
133d8e919c7SMasahiro Yamada .init_params = FIP_IMAGE_ID,
134d8e919c7SMasahiro Yamada },
135d8e919c7SMasahiro Yamada [BL33_IMAGE_ID] = {
136d8e919c7SMasahiro Yamada .dev_handle = &uniphier_fip_dev_handle,
137d8e919c7SMasahiro Yamada .image_spec = (uintptr_t)&uniphier_bl33_spec,
138d8e919c7SMasahiro Yamada .init_params = FIP_IMAGE_ID,
139d8e919c7SMasahiro Yamada },
140d8e919c7SMasahiro Yamada #if TRUSTED_BOARD_BOOT
141d8e919c7SMasahiro Yamada [TRUSTED_BOOT_FW_CERT_ID] = {
142d8e919c7SMasahiro Yamada .dev_handle = &uniphier_fip_dev_handle,
143d8e919c7SMasahiro Yamada .image_spec = (uintptr_t)&uniphier_tb_fw_cert_spec,
144d8e919c7SMasahiro Yamada .init_params = FIP_IMAGE_ID,
145d8e919c7SMasahiro Yamada },
146d8e919c7SMasahiro Yamada [TRUSTED_KEY_CERT_ID] = {
147d8e919c7SMasahiro Yamada .dev_handle = &uniphier_fip_dev_handle,
148d8e919c7SMasahiro Yamada .image_spec = (uintptr_t)&uniphier_trusted_key_cert_spec,
149d8e919c7SMasahiro Yamada .init_params = FIP_IMAGE_ID,
150d8e919c7SMasahiro Yamada },
151d8e919c7SMasahiro Yamada [SCP_FW_KEY_CERT_ID] = {
152d8e919c7SMasahiro Yamada .dev_handle = &uniphier_fip_dev_handle,
153d8e919c7SMasahiro Yamada .image_spec = (uintptr_t)&uniphier_scp_fw_key_cert_spec,
154d8e919c7SMasahiro Yamada .init_params = FIP_IMAGE_ID,
155d8e919c7SMasahiro Yamada },
156d8e919c7SMasahiro Yamada [SOC_FW_KEY_CERT_ID] = {
157d8e919c7SMasahiro Yamada .dev_handle = &uniphier_fip_dev_handle,
158d8e919c7SMasahiro Yamada .image_spec = (uintptr_t)&uniphier_soc_fw_key_cert_spec,
159d8e919c7SMasahiro Yamada .init_params = FIP_IMAGE_ID,
160d8e919c7SMasahiro Yamada },
161d8e919c7SMasahiro Yamada [TRUSTED_OS_FW_KEY_CERT_ID] = {
162d8e919c7SMasahiro Yamada .dev_handle = &uniphier_fip_dev_handle,
163d8e919c7SMasahiro Yamada .image_spec = (uintptr_t)&uniphier_tos_fw_key_cert_spec,
164d8e919c7SMasahiro Yamada .init_params = FIP_IMAGE_ID,
165d8e919c7SMasahiro Yamada },
166d8e919c7SMasahiro Yamada [NON_TRUSTED_FW_KEY_CERT_ID] = {
167d8e919c7SMasahiro Yamada .dev_handle = &uniphier_fip_dev_handle,
168d8e919c7SMasahiro Yamada .image_spec = (uintptr_t)&uniphier_nt_fw_key_cert_spec,
169d8e919c7SMasahiro Yamada .init_params = FIP_IMAGE_ID,
170d8e919c7SMasahiro Yamada },
171d8e919c7SMasahiro Yamada [SCP_FW_CONTENT_CERT_ID] = {
172d8e919c7SMasahiro Yamada .dev_handle = &uniphier_fip_dev_handle,
173d8e919c7SMasahiro Yamada .image_spec = (uintptr_t)&uniphier_scp_fw_cert_spec,
174d8e919c7SMasahiro Yamada .init_params = FIP_IMAGE_ID,
175d8e919c7SMasahiro Yamada },
176d8e919c7SMasahiro Yamada [SOC_FW_CONTENT_CERT_ID] = {
177d8e919c7SMasahiro Yamada .dev_handle = &uniphier_fip_dev_handle,
178d8e919c7SMasahiro Yamada .image_spec = (uintptr_t)&uniphier_soc_fw_cert_spec,
179d8e919c7SMasahiro Yamada .init_params = FIP_IMAGE_ID,
180d8e919c7SMasahiro Yamada },
181d8e919c7SMasahiro Yamada [TRUSTED_OS_FW_CONTENT_CERT_ID] = {
182d8e919c7SMasahiro Yamada .dev_handle = &uniphier_fip_dev_handle,
183d8e919c7SMasahiro Yamada .image_spec = (uintptr_t)&uniphier_tos_fw_cert_spec,
184d8e919c7SMasahiro Yamada .init_params = FIP_IMAGE_ID,
185d8e919c7SMasahiro Yamada },
186d8e919c7SMasahiro Yamada [NON_TRUSTED_FW_CONTENT_CERT_ID] = {
187d8e919c7SMasahiro Yamada .dev_handle = &uniphier_fip_dev_handle,
188d8e919c7SMasahiro Yamada .image_spec = (uintptr_t)&uniphier_nt_fw_cert_spec,
189d8e919c7SMasahiro Yamada .init_params = FIP_IMAGE_ID,
190d8e919c7SMasahiro Yamada },
191d8e919c7SMasahiro Yamada #endif
192d8e919c7SMasahiro Yamada };
193d8e919c7SMasahiro Yamada
uniphier_io_block_setup(size_t fip_offset,struct io_block_dev_spec * block_dev_spec,size_t buffer_offset)194b79b3177SMasahiro Yamada static int uniphier_io_block_setup(size_t fip_offset,
195b79b3177SMasahiro Yamada struct io_block_dev_spec *block_dev_spec,
196b79b3177SMasahiro Yamada size_t buffer_offset)
197d8e919c7SMasahiro Yamada {
198d8e919c7SMasahiro Yamada int ret;
199d8e919c7SMasahiro Yamada
200d8e919c7SMasahiro Yamada uniphier_fip_spec.offset = fip_offset;
201d8e919c7SMasahiro Yamada
202b79b3177SMasahiro Yamada block_dev_spec->buffer.offset = buffer_offset;
203b79b3177SMasahiro Yamada block_dev_spec->buffer.length = UNIPHIER_BLOCK_BUF_SIZE;
204b79b3177SMasahiro Yamada
205b79b3177SMasahiro Yamada ret = mmap_add_dynamic_region(block_dev_spec->buffer.offset,
206b79b3177SMasahiro Yamada block_dev_spec->buffer.offset,
207b79b3177SMasahiro Yamada block_dev_spec->buffer.length,
208b5dd85f2SMasahiro Yamada MT_MEMORY | MT_RW | MT_NS);
209b5dd85f2SMasahiro Yamada if (ret)
210b5dd85f2SMasahiro Yamada return ret;
211b5dd85f2SMasahiro Yamada
212d8e919c7SMasahiro Yamada ret = register_io_dev_block(&uniphier_backend_dev_con);
213d8e919c7SMasahiro Yamada if (ret)
214d8e919c7SMasahiro Yamada return ret;
215d8e919c7SMasahiro Yamada
216b79b3177SMasahiro Yamada return io_dev_open(uniphier_backend_dev_con, (uintptr_t)block_dev_spec,
217d8e919c7SMasahiro Yamada &uniphier_backend_dev_handle);
218d8e919c7SMasahiro Yamada }
219d8e919c7SMasahiro Yamada
uniphier_io_memmap_setup(size_t fip_offset)220d8e919c7SMasahiro Yamada static int uniphier_io_memmap_setup(size_t fip_offset)
221d8e919c7SMasahiro Yamada {
222d8e919c7SMasahiro Yamada int ret;
223d8e919c7SMasahiro Yamada
224d8e919c7SMasahiro Yamada uniphier_fip_spec.offset = fip_offset;
225d8e919c7SMasahiro Yamada
226d8e919c7SMasahiro Yamada ret = mmap_add_dynamic_region(fip_offset, fip_offset,
227d8e919c7SMasahiro Yamada uniphier_fip_spec.length,
228d8e919c7SMasahiro Yamada MT_RO_DATA | MT_SECURE);
229d8e919c7SMasahiro Yamada if (ret)
230d8e919c7SMasahiro Yamada return ret;
231d8e919c7SMasahiro Yamada
232d8e919c7SMasahiro Yamada ret = register_io_dev_memmap(&uniphier_backend_dev_con);
233d8e919c7SMasahiro Yamada if (ret)
234d8e919c7SMasahiro Yamada return ret;
235d8e919c7SMasahiro Yamada
236d8e919c7SMasahiro Yamada return io_dev_open(uniphier_backend_dev_con, 0,
237d8e919c7SMasahiro Yamada &uniphier_backend_dev_handle);
238d8e919c7SMasahiro Yamada }
239d8e919c7SMasahiro Yamada
uniphier_io_fip_setup(void)240d8e919c7SMasahiro Yamada static int uniphier_io_fip_setup(void)
241d8e919c7SMasahiro Yamada {
242d8e919c7SMasahiro Yamada int ret;
243d8e919c7SMasahiro Yamada
244d8e919c7SMasahiro Yamada ret = register_io_dev_fip(&uniphier_fip_dev_con);
245d8e919c7SMasahiro Yamada if (ret)
246d8e919c7SMasahiro Yamada return ret;
247d8e919c7SMasahiro Yamada
248d8e919c7SMasahiro Yamada return io_dev_open(uniphier_fip_dev_con, 0, &uniphier_fip_dev_handle);
249d8e919c7SMasahiro Yamada }
250d8e919c7SMasahiro Yamada
uniphier_io_emmc_setup(unsigned int soc,size_t buffer_offset)251070dcbf5SMasahiro Yamada static int uniphier_io_emmc_setup(unsigned int soc, size_t buffer_offset)
252d8e919c7SMasahiro Yamada {
253b79b3177SMasahiro Yamada struct io_block_dev_spec *block_dev_spec;
254d8e919c7SMasahiro Yamada int ret;
255d8e919c7SMasahiro Yamada
256070dcbf5SMasahiro Yamada ret = uniphier_emmc_init(soc, &block_dev_spec);
257d8e919c7SMasahiro Yamada if (ret)
258d8e919c7SMasahiro Yamada return ret;
259d8e919c7SMasahiro Yamada
260b79b3177SMasahiro Yamada return uniphier_io_block_setup(0x20000, block_dev_spec, buffer_offset);
261d8e919c7SMasahiro Yamada }
262d8e919c7SMasahiro Yamada
uniphier_io_nand_setup(unsigned int soc,size_t buffer_offset)263bda9cd70SMasahiro Yamada static int uniphier_io_nand_setup(unsigned int soc, size_t buffer_offset)
264d8e919c7SMasahiro Yamada {
265b79b3177SMasahiro Yamada struct io_block_dev_spec *block_dev_spec;
266d8e919c7SMasahiro Yamada int ret;
267d8e919c7SMasahiro Yamada
268bda9cd70SMasahiro Yamada ret = uniphier_nand_init(soc, &block_dev_spec);
269d8e919c7SMasahiro Yamada if (ret)
270d8e919c7SMasahiro Yamada return ret;
271d8e919c7SMasahiro Yamada
272b79b3177SMasahiro Yamada return uniphier_io_block_setup(0x20000, block_dev_spec, buffer_offset);
273d8e919c7SMasahiro Yamada }
274d8e919c7SMasahiro Yamada
uniphier_io_nor_setup(unsigned int soc_id,size_t buffer_offset)275b79b3177SMasahiro Yamada static int uniphier_io_nor_setup(unsigned int soc_id, size_t buffer_offset)
276d8e919c7SMasahiro Yamada {
277d8e919c7SMasahiro Yamada return uniphier_io_memmap_setup(0x70000);
278d8e919c7SMasahiro Yamada }
279d8e919c7SMasahiro Yamada
2808eaffdf7SMasahiro Yamada static const uintptr_t uniphier_ocm_base[] = {
2818eaffdf7SMasahiro Yamada [UNIPHIER_SOC_LD11] = 0x30000000,
2828eaffdf7SMasahiro Yamada [UNIPHIER_SOC_LD20] = 0x30000000,
2838eaffdf7SMasahiro Yamada [UNIPHIER_SOC_PXS3] = 0x30000000,
2848eaffdf7SMasahiro Yamada };
2858eaffdf7SMasahiro Yamada
uniphier_io_rom_api_setup(unsigned int soc)2868eaffdf7SMasahiro Yamada static int uniphier_io_rom_api_setup(unsigned int soc)
287d8e919c7SMasahiro Yamada {
2888eaffdf7SMasahiro Yamada uintptr_t ocm_base;
289d8e919c7SMasahiro Yamada int ret;
290d8e919c7SMasahiro Yamada
2918eaffdf7SMasahiro Yamada assert(soc < ARRAY_SIZE(uniphier_ocm_base));
2928eaffdf7SMasahiro Yamada ocm_base = uniphier_ocm_base[soc];
2938eaffdf7SMasahiro Yamada
294d8e919c7SMasahiro Yamada ret = mmap_add_dynamic_region(UNIPHIER_ROM_REGION_BASE,
295d8e919c7SMasahiro Yamada UNIPHIER_ROM_REGION_BASE,
296d8e919c7SMasahiro Yamada UNIPHIER_ROM_REGION_SIZE,
297d8e919c7SMasahiro Yamada MT_CODE | MT_SECURE);
298d8e919c7SMasahiro Yamada if (ret)
299d8e919c7SMasahiro Yamada return ret;
300d8e919c7SMasahiro Yamada
3019c740a58SMasahiro Yamada /*
3029c740a58SMasahiro Yamada * on-chip SRAM region: should be DEVICE attribute because the USB
3039c740a58SMasahiro Yamada * load functions provided by the ROM use this memory region as a work
3049c740a58SMasahiro Yamada * area, but do not cater to cache coherency.
3059c740a58SMasahiro Yamada */
3068eaffdf7SMasahiro Yamada ret = mmap_add_dynamic_region(ocm_base, ocm_base,
3079c740a58SMasahiro Yamada UNIPHIER_OCM_REGION_SIZE,
3089c740a58SMasahiro Yamada MT_DEVICE | MT_RW | MT_SECURE);
3099c740a58SMasahiro Yamada if (ret)
3109c740a58SMasahiro Yamada return ret;
3119c740a58SMasahiro Yamada
3128eaffdf7SMasahiro Yamada return 0;
3138eaffdf7SMasahiro Yamada }
3148eaffdf7SMasahiro Yamada
uniphier_io_usb_setup(unsigned int soc,size_t buffer_offset)3158eaffdf7SMasahiro Yamada static int uniphier_io_usb_setup(unsigned int soc, size_t buffer_offset)
3168eaffdf7SMasahiro Yamada {
3178eaffdf7SMasahiro Yamada struct io_block_dev_spec *block_dev_spec;
3188eaffdf7SMasahiro Yamada int ret;
3198eaffdf7SMasahiro Yamada
3208eaffdf7SMasahiro Yamada /* use ROM API for loading images from USB storage */
3218eaffdf7SMasahiro Yamada ret = uniphier_io_rom_api_setup(soc);
3228eaffdf7SMasahiro Yamada if (ret)
3238eaffdf7SMasahiro Yamada return ret;
3248eaffdf7SMasahiro Yamada
3258eaffdf7SMasahiro Yamada ret = uniphier_usb_init(soc, &block_dev_spec);
326d8e919c7SMasahiro Yamada if (ret)
327d8e919c7SMasahiro Yamada return ret;
328d8e919c7SMasahiro Yamada
329b79b3177SMasahiro Yamada return uniphier_io_block_setup(0x20000, block_dev_spec, buffer_offset);
330d8e919c7SMasahiro Yamada }
331d8e919c7SMasahiro Yamada
332b79b3177SMasahiro Yamada static int (* const uniphier_io_setup_table[])(unsigned int, size_t) = {
333d8e919c7SMasahiro Yamada [UNIPHIER_BOOT_DEVICE_EMMC] = uniphier_io_emmc_setup,
334d8e919c7SMasahiro Yamada [UNIPHIER_BOOT_DEVICE_NAND] = uniphier_io_nand_setup,
335d8e919c7SMasahiro Yamada [UNIPHIER_BOOT_DEVICE_NOR] = uniphier_io_nor_setup,
336d8e919c7SMasahiro Yamada [UNIPHIER_BOOT_DEVICE_USB] = uniphier_io_usb_setup,
337d8e919c7SMasahiro Yamada };
338d8e919c7SMasahiro Yamada
uniphier_io_setup(unsigned int soc_id,uintptr_t mem_base)3397af21317SMasahiro Yamada int uniphier_io_setup(unsigned int soc_id, uintptr_t mem_base)
340d8e919c7SMasahiro Yamada {
341b79b3177SMasahiro Yamada int (*io_setup)(unsigned int soc_id, size_t buffer_offset);
342d8e919c7SMasahiro Yamada unsigned int boot_dev;
343d8e919c7SMasahiro Yamada int ret;
344d8e919c7SMasahiro Yamada
345d8e919c7SMasahiro Yamada boot_dev = uniphier_get_boot_device(soc_id);
346d8e919c7SMasahiro Yamada if (boot_dev == UNIPHIER_BOOT_DEVICE_RSV)
347d8e919c7SMasahiro Yamada return -EINVAL;
348d8e919c7SMasahiro Yamada
349d8e919c7SMasahiro Yamada io_setup = uniphier_io_setup_table[boot_dev];
3507af21317SMasahiro Yamada ret = io_setup(soc_id, mem_base + UNIPHIER_BLOCK_BUF_OFFSET);
351d8e919c7SMasahiro Yamada if (ret)
352d8e919c7SMasahiro Yamada return ret;
353d8e919c7SMasahiro Yamada
354d8e919c7SMasahiro Yamada ret = uniphier_io_fip_setup();
355d8e919c7SMasahiro Yamada if (ret)
356d8e919c7SMasahiro Yamada return ret;
357d8e919c7SMasahiro Yamada
358d8e919c7SMasahiro Yamada return 0;
359d8e919c7SMasahiro Yamada }
360d8e919c7SMasahiro Yamada
plat_get_image_source(unsigned int image_id,uintptr_t * dev_handle,uintptr_t * image_spec)361d8e919c7SMasahiro Yamada int plat_get_image_source(unsigned int image_id, uintptr_t *dev_handle,
362d8e919c7SMasahiro Yamada uintptr_t *image_spec)
363d8e919c7SMasahiro Yamada {
364d8e919c7SMasahiro Yamada uintptr_t init_params;
365d8e919c7SMasahiro Yamada
366d8e919c7SMasahiro Yamada assert(image_id < ARRAY_SIZE(uniphier_io_policies));
367d8e919c7SMasahiro Yamada
3684dd4bde4SMasahiro Yamada *dev_handle = *uniphier_io_policies[image_id].dev_handle;
369d8e919c7SMasahiro Yamada *image_spec = uniphier_io_policies[image_id].image_spec;
370d8e919c7SMasahiro Yamada init_params = uniphier_io_policies[image_id].init_params;
371d8e919c7SMasahiro Yamada
372d8e919c7SMasahiro Yamada return io_dev_init(*dev_handle, init_params);
373d8e919c7SMasahiro Yamada }
374