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 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 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 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 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