]> git.sur5r.net Git - u-boot/blob - arch/arm/imx-common/imx_bootaux.c
arm: at91: Add support for gurnard
[u-boot] / arch / arm / imx-common / imx_bootaux.c
1 /*
2  * Copyright (C) 2016 Freescale Semiconductor, Inc.
3  *
4  * SPDX-License-Identifier:     GPL-2.0+
5  */
6
7 #include <common.h>
8 #include <command.h>
9
10 /* Allow for arch specific config before we boot */
11 static int __arch_auxiliary_core_up(u32 core_id, u32 boot_private_data)
12 {
13         /* please define platform specific arch_auxiliary_core_up() */
14         return CMD_RET_FAILURE;
15 }
16
17 int arch_auxiliary_core_up(u32 core_id, u32 boot_private_data)
18         __attribute__((weak, alias("__arch_auxiliary_core_up")));
19
20 /* Allow for arch specific config before we boot */
21 static int __arch_auxiliary_core_check_up(u32 core_id)
22 {
23         /* please define platform specific arch_auxiliary_core_check_up() */
24         return 0;
25 }
26
27 int arch_auxiliary_core_check_up(u32 core_id)
28         __attribute__((weak, alias("__arch_auxiliary_core_check_up")));
29
30 /*
31  * To i.MX6SX and i.MX7D, the image supported by bootaux needs
32  * the reset vector at the head for the image, with SP and PC
33  * as the first two words.
34  *
35  * Per the cortex-M reference manual, the reset vector of M4 needs
36  * to exist at 0x0 (TCMUL). The PC and SP are the first two addresses
37  * of that vector.  So to boot M4, the A core must build the M4's reset
38  * vector with getting the PC and SP from image and filling them to
39  * TCMUL. When M4 is kicked, it will load the PC and SP by itself.
40  * The TCMUL is mapped to (M4_BOOTROM_BASE_ADDR) at A core side for
41  * accessing the M4 TCMUL.
42  */
43 int do_bootaux(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
44 {
45         ulong addr;
46         int ret, up;
47
48         if (argc < 2)
49                 return CMD_RET_USAGE;
50
51         up = arch_auxiliary_core_check_up(0);
52         if (up) {
53                 printf("## Auxiliary core is already up\n");
54                 return CMD_RET_SUCCESS;
55         }
56
57         addr = simple_strtoul(argv[1], NULL, 16);
58
59         printf("## Starting auxiliary core at 0x%08lX ...\n", addr);
60
61         ret = arch_auxiliary_core_up(0, addr);
62         if (ret)
63                 return CMD_RET_FAILURE;
64
65         return CMD_RET_SUCCESS;
66 }
67
68 U_BOOT_CMD(
69         bootaux, CONFIG_SYS_MAXARGS, 1, do_bootaux,
70         "Start auxiliary core",
71         ""
72 );