diff --git a/plat/hisilicon/poplar/bl1_plat_setup.c b/plat/hisilicon/poplar/bl1_plat_setup.c index 827a15cea458962aa4430f22336d8e3cbc03c95e..7d6f10c2c8201ea00629fac2af37a1321c211fff 100644 --- a/plat/hisilicon/poplar/bl1_plat_setup.c +++ b/plat/hisilicon/poplar/bl1_plat_setup.c @@ -73,7 +73,9 @@ void bl1_plat_arch_setup(void) void bl1_platform_setup(void) { int i; +#if !POPLAR_RECOVERY dw_mmc_params_t params = EMMC_INIT_PARAMS(POPLAR_EMMC_DESC_BASE); +#endif generic_delay_timer_init(); @@ -81,9 +83,11 @@ void bl1_platform_setup(void) for (i = 0; i < GPIO_MAX; i++) pl061_gpio_register(GPIO_BASE(i), i); +#if !POPLAR_RECOVERY /* SoC-specific emmc register are initialized/configured by bootrom */ INFO("BL1: initializing emmc\n"); dw_mmc_init(¶ms); +#endif plat_io_setup(); } diff --git a/plat/hisilicon/poplar/bl2_plat_setup.c b/plat/hisilicon/poplar/bl2_plat_setup.c index 5c79dee3f05663ee71890df125cdf341c1dcf9c6..7edfab7ff45df9051af38596231d6f35a88f0068 100644 --- a/plat/hisilicon/poplar/bl2_plat_setup.c +++ b/plat/hisilicon/poplar/bl2_plat_setup.c @@ -183,7 +183,9 @@ void bl2_plat_get_bl33_meminfo(meminfo_t *bl33_meminfo) void bl2_early_platform_setup(meminfo_t *mem_layout) { +#if !POPLAR_RECOVERY dw_mmc_params_t params = EMMC_INIT_PARAMS(POPLAR_EMMC_DESC_BASE); +#endif console_init(PL011_UART0_BASE, PL011_UART0_CLK_IN_HZ, PL011_BAUDRATE); @@ -192,9 +194,11 @@ void bl2_early_platform_setup(meminfo_t *mem_layout) bl2_tzram_layout = *mem_layout; +#if !POPLAR_RECOVERY /* SoC-specific emmc register are initialized/configured by bootrom */ INFO("BL2: initializing emmc\n"); dw_mmc_init(¶ms); +#endif plat_io_setup(); } diff --git a/plat/hisilicon/poplar/include/poplar_layout.h b/plat/hisilicon/poplar/include/poplar_layout.h index 3e113707805fcfc3625b05ec8c0adc8a00963ffe..9ce04342349703f316fa0e90f72184278f1dbb13 100644 --- a/plat/hisilicon/poplar/include/poplar_layout.h +++ b/plat/hisilicon/poplar/include/poplar_layout.h @@ -90,6 +90,7 @@ #define BL1_SIZE (BL1_RO_SIZE + BL1_RW_SIZE) #define BL2_SIZE 0x0000c000 /* page multiple */ #define BL31_SIZE 0x00014000 +#if !POPLAR_RECOVERY /* * emmc partition1 4096KB * - l-loader.bin 1984KB @@ -99,6 +100,14 @@ * - uefi persistent data 2048KB */ #define FIP_SIZE 0x001b0000 /* absolute max */ +#else +/* + * same as above, but bootrom can only load an image (l-loader.bin) of + * 1024KB max, so after deducting the size of l-loader + bl1.bin (256KB), + * that leaves 768KB (0x000c0000) for fip.bin + */ +#define FIP_SIZE 0x000c0000 /* absolute max */ +#endif /* BL1_OFFSET */ /* (Defined above) */ #define BL1_BASE (LLOADER_TEXT_BASE + BL1_OFFSET) diff --git a/plat/hisilicon/poplar/plat_storage.c b/plat/hisilicon/poplar/plat_storage.c index f72dbb8807a36e79fc7eaf030690c5ff2a00706e..468e229264a39fd133dd571a8ed117c5b61ce0b3 100644 --- a/plat/hisilicon/poplar/plat_storage.c +++ b/plat/hisilicon/poplar/plat_storage.c @@ -22,14 +22,10 @@ #include <utils.h> #include "platform_def.h" +#if !POPLAR_RECOVERY static const io_dev_connector_t *emmc_dev_con; -static const io_dev_connector_t *fip_dev_con; - static uintptr_t emmc_dev_handle; -static uintptr_t fip_dev_handle; - static int open_emmc(const uintptr_t spec); -static int open_fip(const uintptr_t spec); static const io_block_spec_t emmc_fip_spec = { .offset = FIP_BASE_EMMC, @@ -47,6 +43,20 @@ static const io_block_dev_spec_t emmc_dev_spec = { }, .block_size = EMMC_BLOCK_SIZE, }; +#else +static const io_dev_connector_t *mmap_dev_con; +static uintptr_t mmap_dev_handle; +static int open_mmap(const uintptr_t spec); + +static const io_block_spec_t loader_fip_spec = { + .offset = FIP_BASE, + .length = FIP_SIZE +}; +#endif + +static const io_dev_connector_t *fip_dev_con; +static uintptr_t fip_dev_handle; +static int open_fip(const uintptr_t spec); static const io_uuid_spec_t bl2_uuid_spec = { .uuid = UUID_TRUSTED_BOOT_FIRMWARE_BL2, @@ -71,11 +81,19 @@ struct plat_io_policy { }; static const struct plat_io_policy policies[] = { +#if !POPLAR_RECOVERY [FIP_IMAGE_ID] = { &emmc_dev_handle, (uintptr_t)&emmc_fip_spec, open_emmc }, +#else + [FIP_IMAGE_ID] = { + &mmap_dev_handle, + (uintptr_t)&loader_fip_spec, + open_mmap + }, +#endif [BL2_IMAGE_ID] = { &fip_dev_handle, (uintptr_t)&bl2_uuid_spec, @@ -98,6 +116,7 @@ static const struct plat_io_policy policies[] = { }, }; +#if !POPLAR_RECOVERY static int open_emmc(const uintptr_t spec) { int result; @@ -118,6 +137,28 @@ static int open_emmc(const uintptr_t spec) return result; } +#else +static int open_mmap(const uintptr_t spec) +{ + int result; + uintptr_t local_image_handle; + + result = io_dev_init(mmap_dev_handle, (uintptr_t)NULL); + if (result == 0) { + result = io_open(mmap_dev_handle, spec, &local_image_handle); + if (result == 0) { + INFO("Using mmap\n"); + io_close(local_image_handle); + } else { + ERROR("error opening mmap\n"); + } + } else { + ERROR("error initializing mmap\n"); + } + + return result; +} +#endif static int open_fip(const uintptr_t spec) { @@ -162,18 +203,31 @@ void plat_io_setup(void) { int result; +#if !POPLAR_RECOVERY result = register_io_dev_block(&emmc_dev_con); +#else + result = register_io_dev_memmap(&mmap_dev_con); +#endif assert(result == 0); result = register_io_dev_fip(&fip_dev_con); assert(result == 0); +#if !POPLAR_RECOVERY result = io_dev_open(fip_dev_con, (uintptr_t)NULL, &fip_dev_handle); +#else + result = io_dev_open(fip_dev_con, (uintptr_t)&loader_fip_spec, + &fip_dev_handle); +#endif assert(result == 0); +#if !POPLAR_RECOVERY result = io_dev_open(emmc_dev_con, (uintptr_t)&emmc_dev_spec, &emmc_dev_handle); +#else + result = io_dev_open(mmap_dev_con, (uintptr_t)NULL, &mmap_dev_handle); +#endif assert(result == 0); (void) result; diff --git a/plat/hisilicon/poplar/platform.mk b/plat/hisilicon/poplar/platform.mk index cdeecbd43b683613fff02657112e431080321493..2dbbac6e7124866ba5cb843decc263dfff782ce2 100644 --- a/plat/hisilicon/poplar/platform.mk +++ b/plat/hisilicon/poplar/platform.mk @@ -15,6 +15,9 @@ else endif $(eval $(call add_define,POPLAR_TSP_RAM_LOCATION_ID)) +POPLAR_RECOVERY := 0 +$(eval $(call add_define,POPLAR_RECOVERY)) + NEED_BL33 := yes COLD_BOOT_SINGLE_CPU := 1