123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417 |
- /*
- * Copyright (c) 2015-2020, Renesas Electronics Corporation. All rights reserved.
- *
- * SPDX-License-Identifier: BSD-3-Clause
- */
- #include <string.h>
- #include <common/debug.h>
- #include <drivers/io/io_driver.h>
- #include <drivers/io/io_storage.h>
- #include <drivers/io/io_semihosting.h>
- #include "io_common.h"
- #include "io_memdrv.h"
- #include "io_emmcdrv.h"
- #include "io_private.h"
- #include "io_rcar.h"
- #include <platform_def.h>
- static uintptr_t emmcdrv_dev_handle;
- static uintptr_t memdrv_dev_handle;
- static uintptr_t rcar_dev_handle;
- static uintptr_t boot_io_drv_id;
- static const io_block_spec_t rcar_block_spec = {
- .offset = FLASH0_BASE,
- .length = FLASH0_SIZE
- };
- static const io_block_spec_t bl2_file_spec = {
- .offset = BL2_IMAGE_ID,
- };
- static const io_block_spec_t bl31_file_spec = {
- .offset = BL31_IMAGE_ID,
- };
- static const io_block_spec_t bl32_file_spec = {
- .offset = BL32_IMAGE_ID,
- };
- static const io_block_spec_t bl33_file_spec = {
- .offset = BL33_IMAGE_ID,
- };
- static const io_block_spec_t bl332_file_spec = {
- .offset = BL332_IMAGE_ID,
- };
- static const io_block_spec_t bl333_file_spec = {
- .offset = BL333_IMAGE_ID,
- };
- static const io_block_spec_t bl334_file_spec = {
- .offset = BL334_IMAGE_ID,
- };
- static const io_block_spec_t bl335_file_spec = {
- .offset = BL335_IMAGE_ID,
- };
- static const io_block_spec_t bl336_file_spec = {
- .offset = BL336_IMAGE_ID,
- };
- static const io_block_spec_t bl337_file_spec = {
- .offset = BL337_IMAGE_ID,
- };
- static const io_block_spec_t bl338_file_spec = {
- .offset = BL338_IMAGE_ID,
- };
- #if TRUSTED_BOARD_BOOT
- static const io_block_spec_t trusted_key_cert_file_spec = {
- .offset = TRUSTED_KEY_CERT_ID,
- };
- static const io_block_spec_t bl31_key_cert_file_spec = {
- .offset = SOC_FW_KEY_CERT_ID,
- };
- static const io_block_spec_t bl32_key_cert_file_spec = {
- .offset = TRUSTED_OS_FW_KEY_CERT_ID,
- };
- static const io_block_spec_t bl33_key_cert_file_spec = {
- .offset = NON_TRUSTED_FW_KEY_CERT_ID,
- };
- static const io_block_spec_t bl332_key_cert_file_spec = {
- .offset = BL332_KEY_CERT_ID,
- };
- static const io_block_spec_t bl333_key_cert_file_spec = {
- .offset = BL333_KEY_CERT_ID,
- };
- static const io_block_spec_t bl334_key_cert_file_spec = {
- .offset = BL334_KEY_CERT_ID,
- };
- static const io_block_spec_t bl335_key_cert_file_spec = {
- .offset = BL335_KEY_CERT_ID,
- };
- static const io_block_spec_t bl336_key_cert_file_spec = {
- .offset = BL336_KEY_CERT_ID,
- };
- static const io_block_spec_t bl337_key_cert_file_spec = {
- .offset = BL337_KEY_CERT_ID,
- };
- static const io_block_spec_t bl338_key_cert_file_spec = {
- .offset = BL338_KEY_CERT_ID,
- };
- static const io_block_spec_t bl31_cert_file_spec = {
- .offset = SOC_FW_CONTENT_CERT_ID,
- };
- static const io_block_spec_t bl32_cert_file_spec = {
- .offset = TRUSTED_OS_FW_CONTENT_CERT_ID,
- };
- static const io_block_spec_t bl33_cert_file_spec = {
- .offset = NON_TRUSTED_FW_CONTENT_CERT_ID,
- };
- static const io_block_spec_t bl332_cert_file_spec = {
- .offset = BL332_CERT_ID,
- };
- static const io_block_spec_t bl333_cert_file_spec = {
- .offset = BL333_CERT_ID,
- };
- static const io_block_spec_t bl334_cert_file_spec = {
- .offset = BL334_CERT_ID,
- };
- static const io_block_spec_t bl335_cert_file_spec = {
- .offset = BL335_CERT_ID,
- };
- static const io_block_spec_t bl336_cert_file_spec = {
- .offset = BL336_CERT_ID,
- };
- static const io_block_spec_t bl337_cert_file_spec = {
- .offset = BL337_CERT_ID,
- };
- static const io_block_spec_t bl338_cert_file_spec = {
- .offset = BL338_CERT_ID,
- };
- #endif
- static int32_t open_emmcdrv(const uintptr_t spec);
- static int32_t open_memmap(const uintptr_t spec);
- static int32_t open_rcar(const uintptr_t spec);
- struct plat_io_policy {
- uintptr_t *dev_handle;
- uintptr_t image_spec;
- int32_t (*check)(const uintptr_t spec);
- };
- static const struct plat_io_policy policies[] = {
- [FIP_IMAGE_ID] = {
- &memdrv_dev_handle,
- (uintptr_t) &rcar_block_spec,
- &open_memmap},
- [BL2_IMAGE_ID] = {
- &rcar_dev_handle,
- (uintptr_t) &bl2_file_spec,
- &open_rcar},
- [BL31_IMAGE_ID] = {
- &rcar_dev_handle,
- (uintptr_t) &bl31_file_spec,
- &open_rcar},
- [BL32_IMAGE_ID] = {
- &rcar_dev_handle,
- (uintptr_t) &bl32_file_spec,
- &open_rcar},
- [BL33_IMAGE_ID] = {
- &rcar_dev_handle,
- (uintptr_t) &bl33_file_spec,
- &open_rcar},
- [BL332_IMAGE_ID] = {
- &rcar_dev_handle,
- (uintptr_t) &bl332_file_spec,
- &open_rcar},
- [BL333_IMAGE_ID] = {
- &rcar_dev_handle,
- (uintptr_t) &bl333_file_spec,
- &open_rcar},
- [BL334_IMAGE_ID] = {
- &rcar_dev_handle,
- (uintptr_t) &bl334_file_spec,
- &open_rcar},
- [BL335_IMAGE_ID] = {
- &rcar_dev_handle,
- (uintptr_t) &bl335_file_spec,
- &open_rcar},
- [BL336_IMAGE_ID] = {
- &rcar_dev_handle,
- (uintptr_t) &bl336_file_spec,
- &open_rcar},
- [BL337_IMAGE_ID] = {
- &rcar_dev_handle,
- (uintptr_t) &bl337_file_spec,
- &open_rcar},
- [BL338_IMAGE_ID] = {
- &rcar_dev_handle,
- (uintptr_t) &bl338_file_spec,
- &open_rcar},
- #if TRUSTED_BOARD_BOOT
- [TRUSTED_KEY_CERT_ID] = {
- &rcar_dev_handle,
- (uintptr_t) &trusted_key_cert_file_spec,
- &open_rcar},
- [SOC_FW_KEY_CERT_ID] = {
- &rcar_dev_handle,
- (uintptr_t) &bl31_key_cert_file_spec,
- &open_rcar},
- [TRUSTED_OS_FW_KEY_CERT_ID] = {
- &rcar_dev_handle,
- (uintptr_t) &bl32_key_cert_file_spec,
- &open_rcar},
- [NON_TRUSTED_FW_KEY_CERT_ID] = {
- &rcar_dev_handle,
- (uintptr_t) &bl33_key_cert_file_spec,
- &open_rcar},
- [BL332_KEY_CERT_ID] = {
- &rcar_dev_handle,
- (uintptr_t) &bl332_key_cert_file_spec,
- &open_rcar},
- [BL333_KEY_CERT_ID] = {
- &rcar_dev_handle,
- (uintptr_t) &bl333_key_cert_file_spec,
- &open_rcar},
- [BL334_KEY_CERT_ID] = {
- &rcar_dev_handle,
- (uintptr_t) &bl334_key_cert_file_spec,
- &open_rcar},
- [BL335_KEY_CERT_ID] = {
- &rcar_dev_handle,
- (uintptr_t) &bl335_key_cert_file_spec,
- &open_rcar},
- [BL336_KEY_CERT_ID] = {
- &rcar_dev_handle,
- (uintptr_t) &bl336_key_cert_file_spec,
- &open_rcar},
- [BL337_KEY_CERT_ID] = {
- &rcar_dev_handle,
- (uintptr_t) &bl337_key_cert_file_spec,
- &open_rcar},
- [BL338_KEY_CERT_ID] = {
- &rcar_dev_handle,
- (uintptr_t) &bl338_key_cert_file_spec,
- &open_rcar},
- [SOC_FW_CONTENT_CERT_ID] = {
- &rcar_dev_handle,
- (uintptr_t) &bl31_cert_file_spec,
- &open_rcar},
- [TRUSTED_OS_FW_CONTENT_CERT_ID] = {
- &rcar_dev_handle,
- (uintptr_t) &bl32_cert_file_spec,
- &open_rcar},
- [NON_TRUSTED_FW_CONTENT_CERT_ID] = {
- &rcar_dev_handle,
- (uintptr_t) &bl33_cert_file_spec,
- &open_rcar},
- [BL332_CERT_ID] = {
- &rcar_dev_handle,
- (uintptr_t) &bl332_cert_file_spec,
- &open_rcar},
- [BL333_CERT_ID] = {
- &rcar_dev_handle,
- (uintptr_t) &bl333_cert_file_spec,
- &open_rcar},
- [BL334_CERT_ID] = {
- &rcar_dev_handle,
- (uintptr_t) &bl334_cert_file_spec,
- &open_rcar},
- [BL335_CERT_ID] = {
- &rcar_dev_handle,
- (uintptr_t) &bl335_cert_file_spec,
- &open_rcar},
- [BL336_CERT_ID] = {
- &rcar_dev_handle,
- (uintptr_t) &bl336_cert_file_spec,
- &open_rcar},
- [BL337_CERT_ID] = {
- &rcar_dev_handle,
- (uintptr_t) &bl337_cert_file_spec,
- &open_rcar},
- [BL338_CERT_ID] = {
- &rcar_dev_handle,
- (uintptr_t) &bl338_cert_file_spec,
- &open_rcar}, {
- #else
- {
- #endif
- 0, 0, 0}
- };
- static io_drv_spec_t io_drv_spec_memdrv = {
- FLASH0_BASE,
- FLASH0_SIZE,
- 0,
- };
- static io_drv_spec_t io_drv_spec_emmcdrv = {
- 0,
- 0,
- 0,
- };
- static struct plat_io_policy drv_policies[] __attribute__ ((section(".data"))) = {
- /* FLASH_DEV_ID */
- { &memdrv_dev_handle, (uintptr_t) &io_drv_spec_memdrv, &open_memmap, },
- /* EMMC_DEV_ID */
- { &emmcdrv_dev_handle, (uintptr_t) &io_drv_spec_emmcdrv, &open_emmcdrv, }
- };
- static int32_t open_rcar(const uintptr_t spec)
- {
- return io_dev_init(rcar_dev_handle, boot_io_drv_id);
- }
- static int32_t open_memmap(const uintptr_t spec)
- {
- uintptr_t handle;
- int32_t result;
- result = io_dev_init(memdrv_dev_handle, 0);
- if (result != IO_SUCCESS)
- return result;
- result = io_open(memdrv_dev_handle, spec, &handle);
- if (result == IO_SUCCESS)
- io_close(handle);
- return result;
- }
- static int32_t open_emmcdrv(const uintptr_t spec)
- {
- return io_dev_init(emmcdrv_dev_handle, 0);
- }
- void rcar_io_setup(void)
- {
- const io_dev_connector_t *memmap;
- const io_dev_connector_t *rcar;
- boot_io_drv_id = FLASH_DEV_ID;
- rcar_register_io_dev(&rcar);
- rcar_register_io_dev_memdrv(&memmap);
- io_dev_open(rcar, 0, &rcar_dev_handle);
- io_dev_open(memmap, 0, &memdrv_dev_handle);
- }
- void rcar_io_emmc_setup(void)
- {
- const io_dev_connector_t *rcar;
- const io_dev_connector_t *emmc;
- boot_io_drv_id = EMMC_DEV_ID;
- rcar_register_io_dev(&rcar);
- rcar_register_io_dev_emmcdrv(&emmc);
- io_dev_open(rcar, 0, &rcar_dev_handle);
- io_dev_open(emmc, 0, &emmcdrv_dev_handle);
- }
- int plat_get_image_source(unsigned int image_id, uintptr_t *dev_handle,
- uintptr_t *image_spec)
- {
- const struct plat_io_policy *policy;
- int result;
- policy = &policies[image_id];
- result = policy->check(policy->image_spec);
- if (result != IO_SUCCESS)
- return result;
- *image_spec = policy->image_spec;
- *dev_handle = *(policy->dev_handle);
- return IO_SUCCESS;
- }
- int32_t plat_get_drv_source(uint32_t io_drv_id, uintptr_t *dev_handle,
- uintptr_t *image_spec)
- {
- const struct plat_io_policy *policy;
- int32_t result;
- policy = &drv_policies[io_drv_id];
- result = policy->check(policy->image_spec);
- if (result != IO_SUCCESS)
- return result;
- *image_spec = policy->image_spec;
- *dev_handle = *(policy->dev_handle);
- return IO_SUCCESS;
- }
|