Merge tag 'tpm-030822' of https://source.denx.de/u-boot/custodians/u-boot-tpm
[platform/kernel/u-boot.git] / arch / arm / mach-k3 / common.c
index bb0f641..3962f28 100644 (file)
@@ -156,13 +156,15 @@ void init_env(void)
 #endif
 }
 
-#ifdef CONFIG_FS_LOADER
 int load_firmware(char *name_fw, char *name_loadaddr, u32 *loadaddr)
 {
        struct udevice *fsdev;
        char *name = NULL;
        int size = 0;
 
+       if (!IS_ENABLED(CONFIG_FS_LOADER))
+               return 0;
+
        *loadaddr = 0;
 #ifdef CONFIG_SPL_ENV_SUPPORT
        switch (spl_boot_device()) {
@@ -186,19 +188,18 @@ int load_firmware(char *name_fw, char *name_loadaddr, u32 *loadaddr)
 
        return size;
 }
-#else
-int load_firmware(char *name_fw, char *name_loadaddr, u32 *loadaddr)
+
+__weak void release_resources_for_core_shutdown(void)
 {
-       return 0;
+       debug("%s not implemented...\n", __func__);
 }
-#endif
 
 void __noreturn jump_to_image_no_args(struct spl_image_info *spl_image)
 {
        typedef void __noreturn (*image_entry_noargs_t)(void);
        struct ti_sci_handle *ti_sci = get_ti_sci_handle();
        u32 loadaddr = 0;
-       int ret, size = 0;
+       int ret, size = 0, shut_cpu = 0;
 
        /* Release all the exclusive devices held by SPL before starting ATF */
        ti_sci->ops.dev_ops.release_exclusive_devices(ti_sci);
@@ -226,19 +227,10 @@ void __noreturn jump_to_image_no_args(struct spl_image_info *spl_image)
        if (ret)
                panic("%s: ATF failed to load on rproc (%d)\n", __func__, ret);
 
-       /* Add an extra newline to differentiate the ATF logs from SPL */
-       printf("Starting ATF on ARM64 core...\n\n");
-
-       ret = rproc_start(1);
-       if (ret)
-               panic("%s: ATF failed to start on rproc (%d)\n", __func__, ret);
        if (!fit_image_info[IMAGE_ID_DM_FW].image_len &&
            !(size > 0 && valid_elf_image(loadaddr))) {
-               debug("Shutting down...\n");
-               release_resources_for_core_shutdown();
-
-               while (1)
-                       asm volatile("wfe");
+               shut_cpu = 1;
+               goto start_arm64;
        }
 
        if (!fit_image_info[IMAGE_ID_DM_FW].image_start) {
@@ -251,6 +243,21 @@ void __noreturn jump_to_image_no_args(struct spl_image_info *spl_image)
 
        debug("%s: jumping to address %x\n", __func__, loadaddr);
 
+start_arm64:
+       /* Add an extra newline to differentiate the ATF logs from SPL */
+       printf("Starting ATF on ARM64 core...\n\n");
+
+       ret = rproc_start(1);
+       if (ret)
+               panic("%s: ATF failed to start on rproc (%d)\n", __func__, ret);
+
+       if (shut_cpu) {
+               debug("Shutting down...\n");
+               release_resources_for_core_shutdown();
+
+               while (1)
+                       asm volatile("wfe");
+       }
        image_entry_noargs_t image_entry = (image_entry_noargs_t)loadaddr;
 
        image_entry();
@@ -283,9 +290,7 @@ void board_fit_image_post_process(const void *fit, int node, void **p_image,
        }
 #endif
 
-#if IS_ENABLED(CONFIG_TI_SECURE_DEVICE)
        ti_secure_image_post_process(p_image, p_size);
-#endif
 }
 #endif
 
@@ -389,7 +394,54 @@ void reset_cpu(void)
 }
 #endif
 
+enum k3_device_type get_device_type(void)
+{
+       u32 sys_status = readl(K3_SEC_MGR_SYS_STATUS);
+
+       u32 sys_dev_type = (sys_status & SYS_STATUS_DEV_TYPE_MASK) >>
+                       SYS_STATUS_DEV_TYPE_SHIFT;
+
+       u32 sys_sub_type = (sys_status & SYS_STATUS_SUB_TYPE_MASK) >>
+                       SYS_STATUS_SUB_TYPE_SHIFT;
+
+       switch (sys_dev_type) {
+       case SYS_STATUS_DEV_TYPE_GP:
+               return K3_DEVICE_TYPE_GP;
+       case SYS_STATUS_DEV_TYPE_TEST:
+               return K3_DEVICE_TYPE_TEST;
+       case SYS_STATUS_DEV_TYPE_EMU:
+               return K3_DEVICE_TYPE_EMU;
+       case SYS_STATUS_DEV_TYPE_HS:
+               if (sys_sub_type == SYS_STATUS_SUB_TYPE_VAL_FS)
+                       return K3_DEVICE_TYPE_HS_FS;
+               else
+                       return K3_DEVICE_TYPE_HS_SE;
+       default:
+               return K3_DEVICE_TYPE_BAD;
+       }
+}
+
 #if defined(CONFIG_DISPLAY_CPUINFO)
+static const char *get_device_type_name(void)
+{
+       enum k3_device_type type = get_device_type();
+
+       switch (type) {
+       case K3_DEVICE_TYPE_GP:
+               return "GP";
+       case K3_DEVICE_TYPE_TEST:
+               return "TEST";
+       case K3_DEVICE_TYPE_EMU:
+               return "EMU";
+       case K3_DEVICE_TYPE_HS_FS:
+               return "HS-FS";
+       case K3_DEVICE_TYPE_HS_SE:
+               return "HS-SE";
+       default:
+               return "BAD";
+       }
+}
+
 int print_cpuinfo(void)
 {
        struct udevice *soc;
@@ -411,9 +463,11 @@ int print_cpuinfo(void)
 
        ret = soc_get_revision(soc, name, 64);
        if (!ret) {
-               printf("%s\n", name);
+               printf("%s ", name);
        }
 
+       printf("%s\n", get_device_type_name());
+
        return 0;
 }
 #endif
@@ -509,7 +563,7 @@ void spl_enable_dcache(void)
 #if !(defined(CONFIG_SYS_ICACHE_OFF) && defined(CONFIG_SYS_DCACHE_OFF))
        phys_addr_t ram_top = CONFIG_SYS_SDRAM_BASE;
 
-       dram_init_banksize();
+       dram_init();
 
        /* reserve TLB table */
        gd->arch.tlb_size = PGTABLE_SIZE;
@@ -538,3 +592,19 @@ void spl_board_prepare_for_linux(void)
        dcache_disable();
 }
 #endif
+
+int misc_init_r(void)
+{
+       if (IS_ENABLED(CONFIG_TI_AM65_CPSW_NUSS)) {
+               struct udevice *dev;
+               int ret;
+
+               ret = uclass_get_device_by_driver(UCLASS_MISC,
+                                                 DM_DRIVER_GET(am65_cpsw_nuss),
+                                                 &dev);
+               if (ret)
+                       printf("Failed to probe am65_cpsw_nuss driver\n");
+       }
+
+       return 0;
+}