Merge tag 'fixes-for-v2020.04' of https://gitlab.denx.de/u-boot/custodians/u-boot...
[oweals/u-boot.git] / arch / arm / mach-keystone / mon.c
index 81009848d033afd0def2aa06305f6b73f1acb7bf..b7de9ba099de3922919b9dce12370e64e100e99b 100644 (file)
@@ -1,19 +1,19 @@
+// SPDX-License-Identifier: GPL-2.0+
 /*
- * K2HK: secure kernel command file
+ * K2x: Secure commands file
  *
- * (C) Copyright 2012-2014
- *     Texas Instruments Incorporated, <www.ti.com>
- *
- * SPDX-License-Identifier:     GPL-2.0+
+ * Copyright (C) 2012-2019 Texas Instruments Incorporated - http://www.ti.com/
  */
 
+#include <hang.h>
+#include <asm/unaligned.h>
 #include <common.h>
 #include <command.h>
 #include <mach/mon.h>
 #include <spl.h>
 asm(".arch_extension sec\n\t");
 
-int mon_install(u32 addr, u32 dpsc, u32 freq)
+int mon_install(u32 addr, u32 dpsc, u32 freq, u32 bm_addr)
 {
        int result;
 
@@ -22,11 +22,13 @@ int mon_install(u32 addr, u32 dpsc, u32 freq)
                "mov r0, %1\n"
                "mov r1, %2\n"
                "mov r2, %3\n"
+               "mov r3, %4\n"
                "blx r0\n"
+               "mov %0, r0\n"
                "ldmfd r13!, {lr}\n"
                : "=&r" (result)
-               : "r" (addr), "r" (dpsc), "r" (freq)
-               : "cc", "r0", "r1", "r2", "memory");
+               : "r" (addr), "r" (dpsc), "r" (freq), "r" (bm_addr)
+               : "cc", "r0", "r1", "r2", "r3", "memory");
        return result;
 }
 
@@ -40,6 +42,7 @@ int mon_power_on(int core_id, void *ep)
                "mov r2, %2\n"
                "mov r0, #0\n"
                "smc    #0\n"
+               "mov %0, r0\n"
                "ldmfd  r13!, {lr}\n"
                : "=&r" (result)
                : "r" (core_id), "r" (ep)
@@ -56,6 +59,7 @@ int mon_power_off(int core_id)
                "mov r1, %1\n"
                "mov r0, #1\n"
                "smc    #1\n"
+               "mov %0, r0\n"
                "ldmfd  r13!, {lr}\n"
                : "=&r" (result)
                : "r" (core_id)
@@ -89,6 +93,7 @@ static int k2_hs_bm_auth(int cmd, void *arg1)
                "mov r0, %1\n"
                "mov r1, %2\n"
                "smc #2\n"
+               "mov %0, r0\n"
                "ldmfd r13!, {r4-r12, lr}\n"
                : "=&r" (result)
                : "r" (cmd), "r" (arg1)
@@ -114,12 +119,12 @@ void board_fit_image_post_process(void **p_image, size_t *p_size)
        }
 
        /*
-       * Overwrite the image headers after authentication
-       * and decryption. Update size to reflect removal
-       * of header.
-       */
+        * Overwrite the image headers after authentication
+        * and decryption. Update size to reflect removal
+        * of header and restore original file size.
+        */
+       *p_size = get_unaligned_le32(image + (*p_size - 4));
        memcpy(image, image + KS2_HS_SEC_HEADER_LEN, *p_size);
-       *p_size -= KS2_HS_SEC_HEADER_LEN;
 
        /*
         * Output notification of successful authentication to re-assure the