hikey960: fix to load FIP by partition table
authorHaojian Zhuang <haojian.zhuang@linaro.org>
Sat, 14 Sep 2019 10:43:51 +0000 (18:43 +0800)
committerHaojian Zhuang <haojian.zhuang@linaro.org>
Wed, 18 Sep 2019 10:18:41 +0000 (18:18 +0800)
Avoid to load FIP by hacking address. Load it by partition table instead.

Signed-off-by: Haojian Zhuang <haojian.zhuang@linaro.org>
Change-Id: Ib476d024a51e4b9705441a0007d78f9fdf0ca078

plat/hisilicon/hikey960/hikey960_bl2_setup.c
plat/hisilicon/hikey960/hikey960_def.h
plat/hisilicon/hikey960/hikey960_io_storage.c
plat/hisilicon/hikey960/hikey960_private.h
plat/hisilicon/hikey960/platform.mk

index fc9ddab0dfc2c01a304cb15ca015bbbe661b420b..35d76921dc7dbdd253d1da30e9c1cab930b1df8d 100644 (file)
@@ -18,6 +18,7 @@
 #include <drivers/delay_timer.h>
 #include <drivers/dw_ufs.h>
 #include <drivers/generic_delay_timer.h>
+#include <drivers/partition/partition.h>
 #include <drivers/ufs.h>
 #include <lib/mmio.h>
 #ifdef SPD_opteed
@@ -263,6 +264,11 @@ int hikey960_bl2_handle_post_image_load(unsigned int image_id)
  * This function can be used by the platforms to update/use image
  * information for given `image_id`.
  ******************************************************************************/
+int bl2_plat_handle_pre_image_load(unsigned int image_id)
+{
+       return hikey960_set_fip_addr(image_id, "fip");
+}
+
 int bl2_plat_handle_post_image_load(unsigned int image_id)
 {
        return hikey960_bl2_handle_post_image_load(image_id);
index 4ea3acd5100f3e763795962823b21de9273410a9..9651d78919e0c50507ad7fc41c02182a16264532 100644 (file)
@@ -44,9 +44,6 @@
 #define PL011_UART_CLK_IN_HZ           19200000
 
 #define UFS_BASE                       0
-/* FIP partition */
-#define HIKEY960_FIP_BASE              (UFS_BASE + 0x1400000)
-#define HIKEY960_FIP_MAX_SIZE          (12 << 20)
 
 #define HIKEY960_UFS_DESC_BASE         0x20000000
 #define HIKEY960_UFS_DESC_SIZE         0x00200000      /* 2MB */
index a4e83897ededa327860d681aad29c4e0885ef584..e1c5845fbdb1e7f8bc7f69ed50dc88195d9fd097 100644 (file)
@@ -18,6 +18,7 @@
 #include <drivers/io/io_fip.h>
 #include <drivers/io/io_memmap.h>
 #include <drivers/io/io_storage.h>
+#include <drivers/partition/partition.h>
 #include <lib/mmio.h>
 #include <lib/semihosting.h>
 #include <tools_share/firmware_image_package.h>
@@ -36,9 +37,12 @@ static int check_fip(const uintptr_t spec);
 size_t ufs_read_lun3_blks(int lba, uintptr_t buf, size_t size);
 size_t ufs_write_lun3_blks(int lba, const uintptr_t buf, size_t size);
 
-static const io_block_spec_t ufs_fip_spec = {
-       .offset         = HIKEY960_FIP_BASE,
-       .length         = HIKEY960_FIP_MAX_SIZE,
+static io_block_spec_t ufs_fip_spec;
+
+static const io_block_spec_t ufs_gpt_spec = {
+       .offset         = 0,
+       .length         = PLAT_PARTITION_BLOCK_SIZE *
+                         (PLAT_PARTITION_MAX_ENTRIES / 4 + 2),
 };
 
 static const io_block_dev_spec_t ufs_dev_spec = {
@@ -199,6 +203,11 @@ static const struct plat_io_policy policies[] = {
                check_fip
        },
 #endif /* TRUSTED_BOARD_BOOT */
+       [GPT_IMAGE_ID] = {
+               &ufs_dev_handle,
+               (uintptr_t)&ufs_gpt_spec,
+               check_ufs
+       },
 };
 
 static int check_ufs(const uintptr_t spec)
@@ -253,6 +262,23 @@ void hikey960_io_setup(void)
        (void)result;
 }
 
+int hikey960_set_fip_addr(unsigned int image_id, const char *name)
+{
+       const partition_entry_t *entry;
+
+       if (ufs_fip_spec.length == 0) {
+               partition_init(GPT_IMAGE_ID);
+               entry = get_partition_entry(name);
+               if (entry == NULL) {
+                       ERROR("Could NOT find the %s partition!\n", name);
+                       return -ENOENT;
+               }
+               ufs_fip_spec.offset = entry->start;
+               ufs_fip_spec.length = entry->length;
+       }
+       return 0;
+}
+
 /* Return an IO device handle and specification which can be used to access
  * an image. Use this to enforce platform load policy
  */
index 9a18dd620c5c0ff31f8cf7b72c3cc54021f40dfd..54bf501341083573850cba91e77ffec9f78c1943 100644 (file)
@@ -26,6 +26,7 @@ void hikey960_init_mmu_el3(unsigned long total_base,
                        unsigned long coh_limit);
 void hikey960_io_setup(void);
 int hikey960_read_boardid(unsigned int *id);
+int hikey960_set_fip_addr(unsigned int image_id, const char *name);
 void hikey960_clk_init(void);
 void hikey960_pmu_init(void);
 void hikey960_regulator_enable(void);
index 4f2c3c699fef0afee85b8418d13e15490ab26d31..6cb53c7b6cb18f3de3287596a44cdee62daf4b53 100644 (file)
@@ -22,11 +22,13 @@ COLD_BOOT_SINGLE_CPU                :=      1
 PLAT_PL061_MAX_GPIOS           :=      176
 PROGRAMMABLE_RESET_ADDRESS     :=      1
 ENABLE_SVE_FOR_NS              :=      0
+PLAT_PARTITION_BLOCK_SIZE      :=      4096
 
 # Process flags
 $(eval $(call add_define,HIKEY960_TSP_RAM_LOCATION_ID))
 $(eval $(call add_define,CRASH_CONSOLE_BASE))
 $(eval $(call add_define,PLAT_PL061_MAX_GPIOS))
+$(eval $(call add_define,PLAT_PARTITION_BLOCK_SIZE))
 
 # Add the build options to pack Trusted OS Extra1 and Trusted OS Extra2 images
 # in the FIP if the platform requires.
@@ -75,6 +77,8 @@ BL2_SOURCES           +=      common/desc_image_load.c                \
                                drivers/io/io_block.c                   \
                                drivers/io/io_fip.c                     \
                                drivers/io/io_storage.c                 \
+                               drivers/partition/gpt.c                 \
+                               drivers/partition/partition.c           \
                                drivers/synopsys/ufs/dw_ufs.c           \
                                drivers/ufs/ufs.c                       \
                                lib/cpus/aarch64/cortex_a53.S           \