Commit 05af9ac08052c92d011908726534e227db3143c4

Authored by Ye Li
1 parent 6df53e2727

MLK-25003-1 iMX8MN: Add support for 11x11 UltraLite part number

There are 3 part numbers for 11x11 i.MX8MNano with different core number
configuration: UltraLite Quad/Dual/Solo

Comparing with i.MX8MN Lite parts, they have MIPI DSI disabled. So
checking the MIPI DSI disable fuse to recognize these parts.

Signed-off-by: Ye Li <ye.li@nxp.com>
Reviewed-by: Peng Fan <peng.fan@nxp.com>

Showing 4 changed files with 43 additions and 17 deletions Inline Diff

arch/arm/include/asm/arch-imx/cpu.h
1 /* SPDX-License-Identifier: GPL-2.0+ */ 1 /* SPDX-License-Identifier: GPL-2.0+ */
2 /* 2 /*
3 * (C) Copyright 2014 Freescale Semiconductor, Inc. 3 * (C) Copyright 2014 Freescale Semiconductor, Inc.
4 * Copyright 2018-2020 NXP 4 * Copyright 2018-2020 NXP
5 */ 5 */
6 6
7 #define MXC_CPU_MX23 0x23 7 #define MXC_CPU_MX23 0x23
8 #define MXC_CPU_MX25 0x25 8 #define MXC_CPU_MX25 0x25
9 #define MXC_CPU_MX27 0x27 9 #define MXC_CPU_MX27 0x27
10 #define MXC_CPU_MX28 0x28 10 #define MXC_CPU_MX28 0x28
11 #define MXC_CPU_MX31 0x31 11 #define MXC_CPU_MX31 0x31
12 #define MXC_CPU_MX35 0x35 12 #define MXC_CPU_MX35 0x35
13 #define MXC_CPU_MX51 0x51 13 #define MXC_CPU_MX51 0x51
14 #define MXC_CPU_MX53 0x53 14 #define MXC_CPU_MX53 0x53
15 #define MXC_CPU_MX6SL 0x60 15 #define MXC_CPU_MX6SL 0x60
16 #define MXC_CPU_MX6DL 0x61 16 #define MXC_CPU_MX6DL 0x61
17 #define MXC_CPU_MX6SX 0x62 17 #define MXC_CPU_MX6SX 0x62
18 #define MXC_CPU_MX6Q 0x63 18 #define MXC_CPU_MX6Q 0x63
19 #define MXC_CPU_MX6UL 0x64 19 #define MXC_CPU_MX6UL 0x64
20 #define MXC_CPU_MX6ULL 0x65 20 #define MXC_CPU_MX6ULL 0x65
21 #define MXC_CPU_MX6ULZ 0x6B 21 #define MXC_CPU_MX6ULZ 0x6B
22 #define MXC_CPU_MX6SOLO 0x66 /* dummy */ 22 #define MXC_CPU_MX6SOLO 0x66 /* dummy */
23 #define MXC_CPU_MX6SLL 0x67 23 #define MXC_CPU_MX6SLL 0x67
24 #define MXC_CPU_MX6D 0x6A 24 #define MXC_CPU_MX6D 0x6A
25 #define MXC_CPU_MX6DP 0x68 25 #define MXC_CPU_MX6DP 0x68
26 #define MXC_CPU_MX6QP 0x69 26 #define MXC_CPU_MX6QP 0x69
27 #define MXC_CPU_MX7S 0x71 /* dummy ID */ 27 #define MXC_CPU_MX7S 0x71 /* dummy ID */
28 #define MXC_CPU_MX7D 0x72 28 #define MXC_CPU_MX7D 0x72
29 #define MXC_CPU_IMX8MQ 0x82 29 #define MXC_CPU_IMX8MQ 0x82
30 #define MXC_CPU_IMX8MD 0x83 /* dummy ID */ 30 #define MXC_CPU_IMX8MD 0x83 /* dummy ID */
31 #define MXC_CPU_IMX8MQL 0x84 /* dummy ID */ 31 #define MXC_CPU_IMX8MQL 0x84 /* dummy ID */
32 #define MXC_CPU_IMX8MM 0x85 /* dummy ID */ 32 #define MXC_CPU_IMX8MM 0x85 /* dummy ID */
33 #define MXC_CPU_IMX8MML 0x86 /* dummy ID */ 33 #define MXC_CPU_IMX8MML 0x86 /* dummy ID */
34 #define MXC_CPU_IMX8MMD 0x87 /* dummy ID */ 34 #define MXC_CPU_IMX8MMD 0x87 /* dummy ID */
35 #define MXC_CPU_IMX8MMDL 0x88 /* dummy ID */ 35 #define MXC_CPU_IMX8MMDL 0x88 /* dummy ID */
36 #define MXC_CPU_IMX8MMS 0x89 /* dummy ID */ 36 #define MXC_CPU_IMX8MMS 0x89 /* dummy ID */
37 #define MXC_CPU_IMX8MMSL 0x8a /* dummy ID */ 37 #define MXC_CPU_IMX8MMSL 0x8a /* dummy ID */
38 #define MXC_CPU_IMX8MN 0x8b /* dummy ID */ 38 #define MXC_CPU_IMX8MN 0x8b /* dummy ID */
39 #define MXC_CPU_IMX8MND 0x8c /* dummy ID */ 39 #define MXC_CPU_IMX8MND 0x8c /* dummy ID */
40 #define MXC_CPU_IMX8MNS 0x8d /* dummy ID */ 40 #define MXC_CPU_IMX8MNS 0x8d /* dummy ID */
41 #define MXC_CPU_IMX8MNL 0x8e /* dummy ID */ 41 #define MXC_CPU_IMX8MNL 0x8e /* dummy ID */
42 #define MXC_CPU_IMX8MNDL 0x8f /* dummy ID */ 42 #define MXC_CPU_IMX8MNDL 0x8f /* dummy ID */
43 #define MXC_CPU_IMX8MNSL 0x181 /* dummy ID */ 43 #define MXC_CPU_IMX8MNSL 0x181 /* dummy ID */
44 #define MXC_CPU_IMX8MP 0x182/* dummy ID */ 44 #define MXC_CPU_IMX8MNUQ 0x182 /* dummy ID */
45 #define MXC_CPU_IMX8MP6 0x184 /* dummy ID */ 45 #define MXC_CPU_IMX8MNUD 0x183 /* dummy ID */
46 #define MXC_CPU_IMX8MPL 0x186 /* dummy ID */ 46 #define MXC_CPU_IMX8MNUS 0x184 /* dummy ID */
47 #define MXC_CPU_IMX8MPD 0x187 /* dummy ID */ 47 #define MXC_CPU_IMX8MP 0x185/* dummy ID */
48 #define MXC_CPU_IMX8MP6 0x186 /* dummy ID */
49 #define MXC_CPU_IMX8MPL 0x187 /* dummy ID */
50 #define MXC_CPU_IMX8MPD 0x188 /* dummy ID */
48 #define MXC_CPU_IMX8QXP_A0 0x90 /* dummy ID */ 51 #define MXC_CPU_IMX8QXP_A0 0x90 /* dummy ID */
49 #define MXC_CPU_IMX8QM 0x91 /* dummy ID */ 52 #define MXC_CPU_IMX8QM 0x91 /* dummy ID */
50 #define MXC_CPU_IMX8QXP 0x92 /* dummy ID */ 53 #define MXC_CPU_IMX8QXP 0x92 /* dummy ID */
51 #define MXC_CPU_IMX8DXL 0x9E /* dummy ID */ 54 #define MXC_CPU_IMX8DXL 0x9E /* dummy ID */
52 #define MXC_CPU_MX7ULP 0xE1 /* Temporally hard code */ 55 #define MXC_CPU_MX7ULP 0xE1 /* Temporally hard code */
53 #define MXC_CPU_VF610 0xF6 /* dummy ID */ 56 #define MXC_CPU_VF610 0xF6 /* dummy ID */
54 57
55 #define MXC_SOC_MX6 0x60 58 #define MXC_SOC_MX6 0x60
56 #define MXC_SOC_MX7 0x70 59 #define MXC_SOC_MX7 0x70
57 #define MXC_SOC_IMX8M 0x80 60 #define MXC_SOC_IMX8M 0x80
58 #define MXC_SOC_IMX8 0x90 /* dummy */ 61 #define MXC_SOC_IMX8 0x90 /* dummy */
59 #define MXC_SOC_MX7ULP 0xE0 /* dummy */ 62 #define MXC_SOC_MX7ULP 0xE0 /* dummy */
60 63
61 #define CHIP_REV_1_0 0x10 64 #define CHIP_REV_1_0 0x10
62 #define CHIP_REV_1_1 0x11 65 #define CHIP_REV_1_1 0x11
63 #define CHIP_REV_1_2 0x12 66 #define CHIP_REV_1_2 0x12
64 #define CHIP_REV_1_3 0x13 67 #define CHIP_REV_1_3 0x13
65 #define CHIP_REV_1_5 0x15 68 #define CHIP_REV_1_5 0x15
66 #define CHIP_REV_2_0 0x20 69 #define CHIP_REV_2_0 0x20
67 #define CHIP_REV_2_1 0x21 70 #define CHIP_REV_2_1 0x21
68 #define CHIP_REV_2_5 0x25 71 #define CHIP_REV_2_5 0x25
69 #define CHIP_REV_3_0 0x30 72 #define CHIP_REV_3_0 0x30
70 73
71 #define CHIP_REV_A 0x0 74 #define CHIP_REV_A 0x0
72 #define CHIP_REV_B 0x1 75 #define CHIP_REV_B 0x1
73 #define CHIP_REV_C 0x2 76 #define CHIP_REV_C 0x2
74 #define CHIP_REV_A1 0x11 77 #define CHIP_REV_A1 0x11
75 #define CHIP_REV_A2 0x12 78 #define CHIP_REV_A2 0x12
76 79
77 #define BOARD_REV_1_0 0x0 80 #define BOARD_REV_1_0 0x0
78 #define BOARD_REV_2_0 0x1 81 #define BOARD_REV_2_0 0x1
79 #define BOARD_VER_OFFSET 0x8 82 #define BOARD_VER_OFFSET 0x8
80 83
81 #define CS0_128 0 84 #define CS0_128 0
82 #define CS0_64M_CS1_64M 1 85 #define CS0_64M_CS1_64M 1
83 #define CS0_64M_CS1_32M_CS2_32M 2 86 #define CS0_64M_CS1_32M_CS2_32M 2
84 #define CS0_32M_CS1_32M_CS2_32M_CS3_32M 3 87 #define CS0_32M_CS1_32M_CS2_32M_CS3_32M 3
85 88
86 u32 get_imx_reset_cause(void); 89 u32 get_imx_reset_cause(void);
87 ulong get_systemPLLCLK(void); 90 ulong get_systemPLLCLK(void);
88 ulong get_FCLK(void); 91 ulong get_FCLK(void);
89 ulong get_HCLK(void); 92 ulong get_HCLK(void);
90 ulong get_BCLK(void); 93 ulong get_BCLK(void);
91 ulong get_PERCLK1(void); 94 ulong get_PERCLK1(void);
92 ulong get_PERCLK2(void); 95 ulong get_PERCLK2(void);
93 ulong get_PERCLK3(void); 96 ulong get_PERCLK3(void);
94 97
arch/arm/include/asm/mach-imx/sys_proto.h
1 /* SPDX-License-Identifier: GPL-2.0+ */ 1 /* SPDX-License-Identifier: GPL-2.0+ */
2 /* 2 /*
3 * (C) Copyright 2009 3 * (C) Copyright 2009
4 * Stefano Babic, DENX Software Engineering, sbabic@denx.de. 4 * Stefano Babic, DENX Software Engineering, sbabic@denx.de.
5 * Copyright 2018-2020 NXP 5 * Copyright 2018-2020 NXP
6 */ 6 */
7 7
8 #ifndef _SYS_PROTO_H_ 8 #ifndef _SYS_PROTO_H_
9 #define _SYS_PROTO_H_ 9 #define _SYS_PROTO_H_
10 10
11 #include <asm/io.h> 11 #include <asm/io.h>
12 #include <asm/mach-imx/regs-common.h> 12 #include <asm/mach-imx/regs-common.h>
13 #include <common.h> 13 #include <common.h>
14 #include "../arch-imx/cpu.h" 14 #include "../arch-imx/cpu.h"
15 15
16 #define soc_rev() (get_cpu_rev() & 0xFF) 16 #define soc_rev() (get_cpu_rev() & 0xFF)
17 #define is_soc_rev(rev) (soc_rev() == rev) 17 #define is_soc_rev(rev) (soc_rev() == rev)
18 18
19 /* returns MXC_CPU_ value */ 19 /* returns MXC_CPU_ value */
20 #define cpu_type(rev) (((rev) >> 12) & 0x1ff) 20 #define cpu_type(rev) (((rev) >> 12) & 0x1ff)
21 #define soc_type(rev) (((rev) >> 12) & 0xf0) 21 #define soc_type(rev) (((rev) >> 12) & 0xf0)
22 /* both macros return/take MXC_CPU_ constants */ 22 /* both macros return/take MXC_CPU_ constants */
23 #define get_cpu_type() (cpu_type(get_cpu_rev())) 23 #define get_cpu_type() (cpu_type(get_cpu_rev()))
24 #define get_soc_type() (soc_type(get_cpu_rev())) 24 #define get_soc_type() (soc_type(get_cpu_rev()))
25 #define is_cpu_type(cpu) (get_cpu_type() == cpu) 25 #define is_cpu_type(cpu) (get_cpu_type() == cpu)
26 #define is_soc_type(soc) (get_soc_type() == soc) 26 #define is_soc_type(soc) (get_soc_type() == soc)
27 27
28 #define is_mx6() (is_soc_type(MXC_SOC_MX6)) 28 #define is_mx6() (is_soc_type(MXC_SOC_MX6))
29 #define is_mx7() (is_soc_type(MXC_SOC_MX7)) 29 #define is_mx7() (is_soc_type(MXC_SOC_MX7))
30 #define is_imx8m() (is_soc_type(MXC_SOC_IMX8M)) 30 #define is_imx8m() (is_soc_type(MXC_SOC_IMX8M))
31 #define is_imx8() (is_soc_type(MXC_SOC_IMX8)) 31 #define is_imx8() (is_soc_type(MXC_SOC_IMX8))
32 32
33 #define is_mx6dqp() (is_cpu_type(MXC_CPU_MX6QP) || is_cpu_type(MXC_CPU_MX6DP)) 33 #define is_mx6dqp() (is_cpu_type(MXC_CPU_MX6QP) || is_cpu_type(MXC_CPU_MX6DP))
34 #define is_mx6dq() (is_cpu_type(MXC_CPU_MX6Q) || is_cpu_type(MXC_CPU_MX6D)) 34 #define is_mx6dq() (is_cpu_type(MXC_CPU_MX6Q) || is_cpu_type(MXC_CPU_MX6D))
35 #define is_mx6sdl() (is_cpu_type(MXC_CPU_MX6SOLO) || is_cpu_type(MXC_CPU_MX6DL)) 35 #define is_mx6sdl() (is_cpu_type(MXC_CPU_MX6SOLO) || is_cpu_type(MXC_CPU_MX6DL))
36 #define is_mx6dl() (is_cpu_type(MXC_CPU_MX6DL)) 36 #define is_mx6dl() (is_cpu_type(MXC_CPU_MX6DL))
37 #define is_mx6sx() (is_cpu_type(MXC_CPU_MX6SX)) 37 #define is_mx6sx() (is_cpu_type(MXC_CPU_MX6SX))
38 #define is_mx6sl() (is_cpu_type(MXC_CPU_MX6SL)) 38 #define is_mx6sl() (is_cpu_type(MXC_CPU_MX6SL))
39 #define is_mx6solo() (is_cpu_type(MXC_CPU_MX6SOLO)) 39 #define is_mx6solo() (is_cpu_type(MXC_CPU_MX6SOLO))
40 #define is_mx6ul() (is_cpu_type(MXC_CPU_MX6UL)) 40 #define is_mx6ul() (is_cpu_type(MXC_CPU_MX6UL))
41 #define is_mx6ull() (is_cpu_type(MXC_CPU_MX6ULL) || is_cpu_type(MXC_CPU_MX6ULZ)) 41 #define is_mx6ull() (is_cpu_type(MXC_CPU_MX6ULL) || is_cpu_type(MXC_CPU_MX6ULZ))
42 #define is_mx6ulz() (is_cpu_type(MXC_CPU_MX6ULZ)) 42 #define is_mx6ulz() (is_cpu_type(MXC_CPU_MX6ULZ))
43 #define is_mx6sll() (is_cpu_type(MXC_CPU_MX6SLL)) 43 #define is_mx6sll() (is_cpu_type(MXC_CPU_MX6SLL))
44 44
45 #define is_mx7ulp() (is_cpu_type(MXC_CPU_MX7ULP)) 45 #define is_mx7ulp() (is_cpu_type(MXC_CPU_MX7ULP))
46 46
47 #define is_imx8mq() (is_cpu_type(MXC_CPU_IMX8MQ) || is_cpu_type(MXC_CPU_IMX8MD) || is_cpu_type(MXC_CPU_IMX8MQL)) 47 #define is_imx8mq() (is_cpu_type(MXC_CPU_IMX8MQ) || is_cpu_type(MXC_CPU_IMX8MD) || is_cpu_type(MXC_CPU_IMX8MQL))
48 #define is_imx8md() (is_cpu_type(MXC_CPU_IMX8MD)) 48 #define is_imx8md() (is_cpu_type(MXC_CPU_IMX8MD))
49 #define is_imx8mql() (is_cpu_type(MXC_CPU_IMX8MQL)) 49 #define is_imx8mql() (is_cpu_type(MXC_CPU_IMX8MQL))
50 #define is_imx8qm() (is_cpu_type(MXC_CPU_IMX8QM)) 50 #define is_imx8qm() (is_cpu_type(MXC_CPU_IMX8QM))
51 #define is_imx8mm() (is_cpu_type(MXC_CPU_IMX8MM) || is_cpu_type(MXC_CPU_IMX8MML) ||\ 51 #define is_imx8mm() (is_cpu_type(MXC_CPU_IMX8MM) || is_cpu_type(MXC_CPU_IMX8MML) ||\
52 is_cpu_type(MXC_CPU_IMX8MMD) || is_cpu_type(MXC_CPU_IMX8MMDL) || \ 52 is_cpu_type(MXC_CPU_IMX8MMD) || is_cpu_type(MXC_CPU_IMX8MMDL) || \
53 is_cpu_type(MXC_CPU_IMX8MMS) || is_cpu_type(MXC_CPU_IMX8MMSL)) 53 is_cpu_type(MXC_CPU_IMX8MMS) || is_cpu_type(MXC_CPU_IMX8MMSL))
54 #define is_imx8mml() (is_cpu_type(MXC_CPU_IMX8MML)) 54 #define is_imx8mml() (is_cpu_type(MXC_CPU_IMX8MML))
55 #define is_imx8mmd() (is_cpu_type(MXC_CPU_IMX8MMD)) 55 #define is_imx8mmd() (is_cpu_type(MXC_CPU_IMX8MMD))
56 #define is_imx8mmdl() (is_cpu_type(MXC_CPU_IMX8MMDL)) 56 #define is_imx8mmdl() (is_cpu_type(MXC_CPU_IMX8MMDL))
57 #define is_imx8mms() (is_cpu_type(MXC_CPU_IMX8MMS)) 57 #define is_imx8mms() (is_cpu_type(MXC_CPU_IMX8MMS))
58 #define is_imx8mmsl() (is_cpu_type(MXC_CPU_IMX8MMSL)) 58 #define is_imx8mmsl() (is_cpu_type(MXC_CPU_IMX8MMSL))
59 #define is_imx8mn() (is_cpu_type(MXC_CPU_IMX8MN) || is_cpu_type(MXC_CPU_IMX8MND) || \ 59 #define is_imx8mn() (is_cpu_type(MXC_CPU_IMX8MN) || is_cpu_type(MXC_CPU_IMX8MND) || \
60 is_cpu_type(MXC_CPU_IMX8MNS) || is_cpu_type(MXC_CPU_IMX8MNL) || \ 60 is_cpu_type(MXC_CPU_IMX8MNS) || is_cpu_type(MXC_CPU_IMX8MNL) || \
61 is_cpu_type(MXC_CPU_IMX8MNDL) || is_cpu_type(MXC_CPU_IMX8MNSL)) 61 is_cpu_type(MXC_CPU_IMX8MNDL) || is_cpu_type(MXC_CPU_IMX8MNSL) || \
62 is_cpu_type(MXC_CPU_IMX8MNUD) || is_cpu_type(MXC_CPU_IMX8MNUS) || is_cpu_type(MXC_CPU_IMX8MNUQ))
62 #define is_imx8mnd() (is_cpu_type(MXC_CPU_IMX8MND)) 63 #define is_imx8mnd() (is_cpu_type(MXC_CPU_IMX8MND))
63 #define is_imx8mns() (is_cpu_type(MXC_CPU_IMX8MNS)) 64 #define is_imx8mns() (is_cpu_type(MXC_CPU_IMX8MNS))
64 #define is_imx8mnl() (is_cpu_type(MXC_CPU_IMX8MNL)) 65 #define is_imx8mnl() (is_cpu_type(MXC_CPU_IMX8MNL))
65 #define is_imx8mndl() (is_cpu_type(MXC_CPU_IMX8MNDL)) 66 #define is_imx8mndl() (is_cpu_type(MXC_CPU_IMX8MNDL))
66 #define is_imx8mnsl() (is_cpu_type(MXC_CPU_IMX8MNSL)) 67 #define is_imx8mnsl() (is_cpu_type(MXC_CPU_IMX8MNSL))
68 #define is_imx8mnuq() (is_cpu_type(MXC_CPU_IMX8MNUQ))
69 #define is_imx8mnud() (is_cpu_type(MXC_CPU_IMX8MNUD))
70 #define is_imx8mnus() (is_cpu_type(MXC_CPU_IMX8MNUS))
67 #define is_imx8mp() (is_cpu_type(MXC_CPU_IMX8MP) || is_cpu_type(MXC_CPU_IMX8MPD) || \ 71 #define is_imx8mp() (is_cpu_type(MXC_CPU_IMX8MP) || is_cpu_type(MXC_CPU_IMX8MPD) || \
68 is_cpu_type(MXC_CPU_IMX8MPL) || is_cpu_type(MXC_CPU_IMX8MP6)) 72 is_cpu_type(MXC_CPU_IMX8MPL) || is_cpu_type(MXC_CPU_IMX8MP6))
69 #define is_imx8mpd() (is_cpu_type(MXC_CPU_IMX8MPD)) 73 #define is_imx8mpd() (is_cpu_type(MXC_CPU_IMX8MPD))
70 #define is_imx8mpl() (is_cpu_type(MXC_CPU_IMX8MPL)) 74 #define is_imx8mpl() (is_cpu_type(MXC_CPU_IMX8MPL))
71 #define is_imx8mp6() (is_cpu_type(MXC_CPU_IMX8MP6)) 75 #define is_imx8mp6() (is_cpu_type(MXC_CPU_IMX8MP6))
72 #define is_imx8qxp() (is_cpu_type(MXC_CPU_IMX8QXP)) 76 #define is_imx8qxp() (is_cpu_type(MXC_CPU_IMX8QXP))
73 #define is_imx8dxl() (is_cpu_type(MXC_CPU_IMX8DXL)) 77 #define is_imx8dxl() (is_cpu_type(MXC_CPU_IMX8DXL))
74 78
75 /* gd->flags reserves high 16 bits for arch-specific flags */ 79 /* gd->flags reserves high 16 bits for arch-specific flags */
76 #define GD_FLG_ARCH_IMX_USB_BOOT 0x80000000 /* Only used for MX6/7, If set, the u-boot is booting from USB serial download */ 80 #define GD_FLG_ARCH_IMX_USB_BOOT 0x80000000 /* Only used for MX6/7, If set, the u-boot is booting from USB serial download */
77 81
78 #ifdef CONFIG_MX6 82 #ifdef CONFIG_MX6
79 #define IMX6_SRC_GPR10_BMODE BIT(28) 83 #define IMX6_SRC_GPR10_BMODE BIT(28)
80 84
81 #define IMX6_BMODE_MASK GENMASK(7, 0) 85 #define IMX6_BMODE_MASK GENMASK(7, 0)
82 #define IMX6_BMODE_SHIFT 4 86 #define IMX6_BMODE_SHIFT 4
83 #define IMX6_BMODE_EMI_MASK BIT(3) 87 #define IMX6_BMODE_EMI_MASK BIT(3)
84 #define IMX6_BMODE_EMI_SHIFT 3 88 #define IMX6_BMODE_EMI_SHIFT 3
85 #define IMX6_BMODE_SERIAL_ROM_MASK GENMASK(26, 24) 89 #define IMX6_BMODE_SERIAL_ROM_MASK GENMASK(26, 24)
86 #define IMX6_BMODE_SERIAL_ROM_SHIFT 24 90 #define IMX6_BMODE_SERIAL_ROM_SHIFT 24
87 91
88 enum imx6_bmode_serial_rom { 92 enum imx6_bmode_serial_rom {
89 IMX6_BMODE_ECSPI1, 93 IMX6_BMODE_ECSPI1,
90 IMX6_BMODE_ECSPI2, 94 IMX6_BMODE_ECSPI2,
91 IMX6_BMODE_ECSPI3, 95 IMX6_BMODE_ECSPI3,
92 IMX6_BMODE_ECSPI4, 96 IMX6_BMODE_ECSPI4,
93 IMX6_BMODE_ECSPI5, 97 IMX6_BMODE_ECSPI5,
94 IMX6_BMODE_I2C1, 98 IMX6_BMODE_I2C1,
95 IMX6_BMODE_I2C2, 99 IMX6_BMODE_I2C2,
96 IMX6_BMODE_I2C3, 100 IMX6_BMODE_I2C3,
97 }; 101 };
98 102
99 enum imx6_bmode_emi { 103 enum imx6_bmode_emi {
100 IMX6_BMODE_NOR, 104 IMX6_BMODE_NOR,
101 IMX6_BMODE_ONENAND, 105 IMX6_BMODE_ONENAND,
102 }; 106 };
103 107
104 enum imx6_bmode { 108 enum imx6_bmode {
105 IMX6_BMODE_EMI, 109 IMX6_BMODE_EMI,
106 #if defined(CONFIG_MX6UL) || defined(CONFIG_MX6ULL) 110 #if defined(CONFIG_MX6UL) || defined(CONFIG_MX6ULL)
107 IMX6_BMODE_QSPI, 111 IMX6_BMODE_QSPI,
108 IMX6_BMODE_RESERVED, 112 IMX6_BMODE_RESERVED,
109 #else 113 #else
110 IMX6_BMODE_RESERVED, 114 IMX6_BMODE_RESERVED,
111 IMX6_BMODE_SATA, 115 IMX6_BMODE_SATA,
112 #endif 116 #endif
113 IMX6_BMODE_SERIAL_ROM, 117 IMX6_BMODE_SERIAL_ROM,
114 IMX6_BMODE_SD, 118 IMX6_BMODE_SD,
115 IMX6_BMODE_ESD, 119 IMX6_BMODE_ESD,
116 IMX6_BMODE_MMC, 120 IMX6_BMODE_MMC,
117 IMX6_BMODE_EMMC, 121 IMX6_BMODE_EMMC,
118 IMX6_BMODE_NAND_MIN, 122 IMX6_BMODE_NAND_MIN,
119 IMX6_BMODE_NAND_MAX = 0xf, 123 IMX6_BMODE_NAND_MAX = 0xf,
120 }; 124 };
121 125
122 u32 imx6_src_get_boot_mode(void); 126 u32 imx6_src_get_boot_mode(void);
123 void gpr_init(void); 127 void gpr_init(void);
124 128
125 #endif /* CONFIG_MX6 */ 129 #endif /* CONFIG_MX6 */
126 130
127 /* address translation table */ 131 /* address translation table */
128 struct rproc_att { 132 struct rproc_att {
129 u32 da; /* device address (From Cortex M4 view) */ 133 u32 da; /* device address (From Cortex M4 view) */
130 u32 sa; /* system bus address */ 134 u32 sa; /* system bus address */
131 u32 size; /* size of reg range */ 135 u32 size; /* size of reg range */
132 }; 136 };
133 137
134 #ifdef CONFIG_IMX8M 138 #ifdef CONFIG_IMX8M
135 struct rom_api { 139 struct rom_api {
136 u16 ver; 140 u16 ver;
137 u16 tag; 141 u16 tag;
138 u32 reserved1; 142 u32 reserved1;
139 u32 (*download_image)(u8 *dest, u32 offset, u32 size, u32 xor); 143 u32 (*download_image)(u8 *dest, u32 offset, u32 size, u32 xor);
140 u32 (*query_boot_infor)(u32 info_type, u32 *info, u32 xor); 144 u32 (*query_boot_infor)(u32 info_type, u32 *info, u32 xor);
141 }; 145 };
142 146
143 enum boot_dev_type_e { 147 enum boot_dev_type_e {
144 BT_DEV_TYPE_SD = 1, 148 BT_DEV_TYPE_SD = 1,
145 BT_DEV_TYPE_MMC = 2, 149 BT_DEV_TYPE_MMC = 2,
146 BT_DEV_TYPE_NAND = 3, 150 BT_DEV_TYPE_NAND = 3,
147 BT_DEV_TYPE_FLEXSPINOR = 4, 151 BT_DEV_TYPE_FLEXSPINOR = 4,
148 152
149 BT_DEV_TYPE_USB = 0xE, 153 BT_DEV_TYPE_USB = 0xE,
150 BT_DEV_TYPE_MEM_DEV = 0xF, 154 BT_DEV_TYPE_MEM_DEV = 0xF,
151 155
152 BT_DEV_TYPE_INVALID = 0xFF 156 BT_DEV_TYPE_INVALID = 0xFF
153 }; 157 };
154 158
155 #define QUERY_ROM_VER 1 159 #define QUERY_ROM_VER 1
156 #define QUERY_BT_DEV 2 160 #define QUERY_BT_DEV 2
157 #define QUERY_PAGE_SZ 3 161 #define QUERY_PAGE_SZ 3
158 #define QUERY_IVT_OFF 4 162 #define QUERY_IVT_OFF 4
159 #define QUERY_BT_STAGE 5 163 #define QUERY_BT_STAGE 5
160 #define QUERY_IMG_OFF 6 164 #define QUERY_IMG_OFF 6
161 165
162 #define ROM_API_OKAY 0xF0 166 #define ROM_API_OKAY 0xF0
163 167
164 extern struct rom_api *g_rom_api; 168 extern struct rom_api *g_rom_api;
165 #endif 169 #endif
166 170
167 u32 get_nr_cpus(void); 171 u32 get_nr_cpus(void);
168 u32 get_cpu_rev(void); 172 u32 get_cpu_rev(void);
169 u32 get_cpu_speed_grade_hz(void); 173 u32 get_cpu_speed_grade_hz(void);
170 u32 get_cpu_temp_grade(int *minc, int *maxc); 174 u32 get_cpu_temp_grade(int *minc, int *maxc);
171 const char *get_imx_type(u32 imxtype); 175 const char *get_imx_type(u32 imxtype);
172 u32 imx_ddr_size(void); 176 u32 imx_ddr_size(void);
173 void sdelay(unsigned long); 177 void sdelay(unsigned long);
174 void set_chipselect_size(int const); 178 void set_chipselect_size(int const);
175 179
176 void init_aips(void); 180 void init_aips(void);
177 void init_src(void); 181 void init_src(void);
178 void init_snvs(void); 182 void init_snvs(void);
179 void imx_wdog_disable_powerdown(void); 183 void imx_wdog_disable_powerdown(void);
180 184
181 int arch_auxiliary_core_check_up(u32 core_id); 185 int arch_auxiliary_core_check_up(u32 core_id);
182 186
183 int board_mmc_get_env_dev(int devno); 187 int board_mmc_get_env_dev(int devno);
184 188
185 int nxp_board_rev(void); 189 int nxp_board_rev(void);
186 char nxp_board_rev_string(void); 190 char nxp_board_rev_string(void);
187 191
188 /* 192 /*
189 * Initializes on-chip ethernet controllers. 193 * Initializes on-chip ethernet controllers.
190 * to override, implement board_eth_init() 194 * to override, implement board_eth_init()
191 */ 195 */
192 int fecmxc_initialize(bd_t *bis); 196 int fecmxc_initialize(bd_t *bis);
193 u32 get_ahb_clk(void); 197 u32 get_ahb_clk(void);
194 u32 get_periph_clk(void); 198 u32 get_periph_clk(void);
195 199
196 void lcdif_power_down(void); 200 void lcdif_power_down(void);
197 201
198 int mxs_reset_block(struct mxs_register_32 *reg); 202 int mxs_reset_block(struct mxs_register_32 *reg);
199 int mxs_wait_mask_set(struct mxs_register_32 *reg, u32 mask, u32 timeout); 203 int mxs_wait_mask_set(struct mxs_register_32 *reg, u32 mask, u32 timeout);
200 int mxs_wait_mask_clr(struct mxs_register_32 *reg, u32 mask, u32 timeout); 204 int mxs_wait_mask_clr(struct mxs_register_32 *reg, u32 mask, u32 timeout);
201 205
202 void board_late_mmc_env_init(void); 206 void board_late_mmc_env_init(void);
203 207
204 void vadc_power_up(void); 208 void vadc_power_up(void);
205 void vadc_power_down(void); 209 void vadc_power_down(void);
206 210
207 void pcie_power_up(void); 211 void pcie_power_up(void);
208 void pcie_power_off(void); 212 void pcie_power_off(void);
209 213
210 int arch_auxiliary_core_up(u32 core_id, ulong boot_private_data); 214 int arch_auxiliary_core_up(u32 core_id, ulong boot_private_data);
211 int arch_auxiliary_core_check_up(u32 core_id); 215 int arch_auxiliary_core_check_up(u32 core_id);
212 216
213 unsigned long call_imx_sip(unsigned long id, unsigned long reg0, 217 unsigned long call_imx_sip(unsigned long id, unsigned long reg0,
214 unsigned long reg1, unsigned long reg2, 218 unsigned long reg1, unsigned long reg2,
215 unsigned long reg3); 219 unsigned long reg3);
216 unsigned long call_imx_sip_ret2(unsigned long id, unsigned long reg0, 220 unsigned long call_imx_sip_ret2(unsigned long id, unsigned long reg0,
217 unsigned long *reg1, unsigned long reg2, 221 unsigned long *reg1, unsigned long reg2,
218 unsigned long reg3); 222 unsigned long reg3);
219 223
220 void imx_get_mac_from_fuse(int dev_id, unsigned char *mac); 224 void imx_get_mac_from_fuse(int dev_id, unsigned char *mac);
221 225
222 int add_res_mem_dt_node(void *fdt, const char *name, phys_addr_t pa, 226 int add_res_mem_dt_node(void *fdt, const char *name, phys_addr_t pa,
223 size_t size); 227 size_t size);
224 int add_dt_path_subnode(void *fdt, const char *path, const char *subnode); 228 int add_dt_path_subnode(void *fdt, const char *path, const char *subnode);
225 void configure_tzc380(void); 229 void configure_tzc380(void);
226 #endif 230 #endif
227 231
arch/arm/mach-imx/cpu.c
1 // SPDX-License-Identifier: GPL-2.0+ 1 // SPDX-License-Identifier: GPL-2.0+
2 /* 2 /*
3 * (C) Copyright 2007 3 * (C) Copyright 2007
4 * Sascha Hauer, Pengutronix 4 * Sascha Hauer, Pengutronix
5 * 5 *
6 * (C) Copyright 2009 Freescale Semiconductor, Inc. 6 * (C) Copyright 2009 Freescale Semiconductor, Inc.
7 */ 7 */
8 8
9 #include <bootm.h> 9 #include <bootm.h>
10 #include <common.h> 10 #include <common.h>
11 #include <netdev.h> 11 #include <netdev.h>
12 #include <linux/errno.h> 12 #include <linux/errno.h>
13 #include <asm/io.h> 13 #include <asm/io.h>
14 #include <asm/arch/imx-regs.h> 14 #include <asm/arch/imx-regs.h>
15 #include <asm/arch/clock.h> 15 #include <asm/arch/clock.h>
16 #include <asm/arch/sys_proto.h> 16 #include <asm/arch/sys_proto.h>
17 #include <asm/arch/crm_regs.h> 17 #include <asm/arch/crm_regs.h>
18 #include <asm/mach-imx/boot_mode.h> 18 #include <asm/mach-imx/boot_mode.h>
19 #include <imx_thermal.h> 19 #include <imx_thermal.h>
20 #include <ipu_pixfmt.h> 20 #include <ipu_pixfmt.h>
21 #include <thermal.h> 21 #include <thermal.h>
22 #include <sata.h> 22 #include <sata.h>
23 #include <dm/device-internal.h> 23 #include <dm/device-internal.h>
24 #include <dm/uclass-internal.h> 24 #include <dm/uclass-internal.h>
25 25
26 #ifdef CONFIG_VIDEO_GIS 26 #ifdef CONFIG_VIDEO_GIS
27 #include <gis.h> 27 #include <gis.h>
28 #endif 28 #endif
29 29
30 #ifdef CONFIG_FSL_ESDHC_IMX 30 #ifdef CONFIG_FSL_ESDHC_IMX
31 #include <fsl_esdhc_imx.h> 31 #include <fsl_esdhc_imx.h>
32 #endif 32 #endif
33 33
34 static u32 reset_cause = -1; 34 static u32 reset_cause = -1;
35 35
36 u32 get_imx_reset_cause(void) 36 u32 get_imx_reset_cause(void)
37 { 37 {
38 struct src *src_regs = (struct src *)SRC_BASE_ADDR; 38 struct src *src_regs = (struct src *)SRC_BASE_ADDR;
39 39
40 if (reset_cause == -1) { 40 if (reset_cause == -1) {
41 reset_cause = readl(&src_regs->srsr); 41 reset_cause = readl(&src_regs->srsr);
42 /* preserve the value for U-Boot proper */ 42 /* preserve the value for U-Boot proper */
43 #if !defined(CONFIG_SPL_BUILD) && !defined(CONFIG_ANDROID_BOOT_IMAGE) 43 #if !defined(CONFIG_SPL_BUILD) && !defined(CONFIG_ANDROID_BOOT_IMAGE)
44 /* We will read the ssrs states later for android so we don't 44 /* We will read the ssrs states later for android so we don't
45 * clear the states here. 45 * clear the states here.
46 */ 46 */
47 writel(reset_cause, &src_regs->srsr); 47 writel(reset_cause, &src_regs->srsr);
48 #endif 48 #endif
49 } 49 }
50 50
51 return reset_cause; 51 return reset_cause;
52 } 52 }
53 53
54 #if defined(CONFIG_DISPLAY_CPUINFO) && !defined(CONFIG_SPL_BUILD) 54 #if defined(CONFIG_DISPLAY_CPUINFO) && !defined(CONFIG_SPL_BUILD)
55 static char *get_reset_cause(void) 55 static char *get_reset_cause(void)
56 { 56 {
57 switch (get_imx_reset_cause()) { 57 switch (get_imx_reset_cause()) {
58 case 0x00001: 58 case 0x00001:
59 case 0x00011: 59 case 0x00011:
60 return "POR"; 60 return "POR";
61 case 0x00004: 61 case 0x00004:
62 return "CSU"; 62 return "CSU";
63 case 0x00008: 63 case 0x00008:
64 return "IPP USER"; 64 return "IPP USER";
65 case 0x00010: 65 case 0x00010:
66 #ifdef CONFIG_MX7 66 #ifdef CONFIG_MX7
67 return "WDOG1"; 67 return "WDOG1";
68 #else 68 #else
69 return "WDOG"; 69 return "WDOG";
70 #endif 70 #endif
71 case 0x00020: 71 case 0x00020:
72 return "JTAG HIGH-Z"; 72 return "JTAG HIGH-Z";
73 case 0x00040: 73 case 0x00040:
74 return "JTAG SW"; 74 return "JTAG SW";
75 case 0x00080: 75 case 0x00080:
76 return "WDOG3"; 76 return "WDOG3";
77 #ifdef CONFIG_MX7 77 #ifdef CONFIG_MX7
78 case 0x00100: 78 case 0x00100:
79 return "WDOG4"; 79 return "WDOG4";
80 case 0x00200: 80 case 0x00200:
81 return "TEMPSENSE"; 81 return "TEMPSENSE";
82 #elif defined(CONFIG_IMX8M) 82 #elif defined(CONFIG_IMX8M)
83 case 0x00100: 83 case 0x00100:
84 return "WDOG2"; 84 return "WDOG2";
85 case 0x00200: 85 case 0x00200:
86 return "TEMPSENSE"; 86 return "TEMPSENSE";
87 #else 87 #else
88 case 0x00100: 88 case 0x00100:
89 return "TEMPSENSE"; 89 return "TEMPSENSE";
90 case 0x10000: 90 case 0x10000:
91 return "WARM BOOT"; 91 return "WARM BOOT";
92 #endif 92 #endif
93 default: 93 default:
94 return "unknown reset"; 94 return "unknown reset";
95 } 95 }
96 } 96 }
97 97
98 #ifdef CONFIG_ANDROID_BOOT_IMAGE 98 #ifdef CONFIG_ANDROID_BOOT_IMAGE
99 void get_reboot_reason(char *ret) 99 void get_reboot_reason(char *ret)
100 { 100 {
101 struct src *src_regs = (struct src *)SRC_BASE_ADDR; 101 struct src *src_regs = (struct src *)SRC_BASE_ADDR;
102 102
103 strcpy(ret, (const char *)get_reset_cause()); 103 strcpy(ret, (const char *)get_reset_cause());
104 /* clear the srsr here, its state has been recorded in reset_cause */ 104 /* clear the srsr here, its state has been recorded in reset_cause */
105 writel(reset_cause, &src_regs->srsr); 105 writel(reset_cause, &src_regs->srsr);
106 } 106 }
107 #endif 107 #endif
108 #endif 108 #endif
109 109
110 #if defined(CONFIG_DISPLAY_CPUINFO) && !defined(CONFIG_SPL_BUILD) 110 #if defined(CONFIG_DISPLAY_CPUINFO) && !defined(CONFIG_SPL_BUILD)
111 111
112 const char *get_imx_type(u32 imxtype) 112 const char *get_imx_type(u32 imxtype)
113 { 113 {
114 switch (imxtype) { 114 switch (imxtype) {
115 case MXC_CPU_IMX8MP: 115 case MXC_CPU_IMX8MP:
116 return "8MP[8]"; /* Quad-core version of the imx8mp */ 116 return "8MP[8]"; /* Quad-core version of the imx8mp */
117 case MXC_CPU_IMX8MPD: 117 case MXC_CPU_IMX8MPD:
118 return "8MP Dual[3]"; /* Dual-core version of the imx8mp */ 118 return "8MP Dual[3]"; /* Dual-core version of the imx8mp */
119 case MXC_CPU_IMX8MPL: 119 case MXC_CPU_IMX8MPL:
120 return "8MP Lite[4]"; /* Quad-core Lite version of the imx8mp */ 120 return "8MP Lite[4]"; /* Quad-core Lite version of the imx8mp */
121 case MXC_CPU_IMX8MP6: 121 case MXC_CPU_IMX8MP6:
122 return "8MP[6]"; /* Quad-core version of the imx8mp, NPU fused */ 122 return "8MP[6]"; /* Quad-core version of the imx8mp, NPU fused */
123 case MXC_CPU_IMX8MN: 123 case MXC_CPU_IMX8MN:
124 return "8MNano Quad";/* Quad-core version of the imx8mn */ 124 return "8MNano Quad";/* Quad-core version of the imx8mn */
125 case MXC_CPU_IMX8MND: 125 case MXC_CPU_IMX8MND:
126 return "8MNano Dual";/* Dual-core version of the imx8mn */ 126 return "8MNano Dual";/* Dual-core version of the imx8mn */
127 case MXC_CPU_IMX8MNS: 127 case MXC_CPU_IMX8MNS:
128 return "8MNano Solo";/* Single-core version of the imx8mn */ 128 return "8MNano Solo";/* Single-core version of the imx8mn */
129 case MXC_CPU_IMX8MNL: 129 case MXC_CPU_IMX8MNL:
130 return "8MNano QuadLite";/* Quad-core Lite version of the imx8mn */ 130 return "8MNano QuadLite";/* Quad-core Lite version of the imx8mn */
131 case MXC_CPU_IMX8MNDL: 131 case MXC_CPU_IMX8MNDL:
132 return "8MNano DualLite";/* Dual-core Lite version of the imx8mn */ 132 return "8MNano DualLite";/* Dual-core Lite version of the imx8mn */
133 case MXC_CPU_IMX8MNSL: 133 case MXC_CPU_IMX8MNSL:
134 return "8MNano SoloLite";/* Single-core Lite version of the imx8mn */ 134 return "8MNano SoloLite";/* Single-core Lite version of the imx8mn */
135 case MXC_CPU_IMX8MNUQ:
136 return "8MNano UltraLite Quad";/* Quad-core UltraLite version of the imx8mn */
137 case MXC_CPU_IMX8MNUD:
138 return "8MNano UltraLite Dual";/* Dual-core UltraLite version of the imx8mn */
139 case MXC_CPU_IMX8MNUS:
140 return "8MNano UltraLite Solo";/* Single-core UltraLite version of the imx8mn */
135 case MXC_CPU_IMX8MM: 141 case MXC_CPU_IMX8MM:
136 return "8MMQ"; /* Quad-core version of the imx8mm */ 142 return "8MMQ"; /* Quad-core version of the imx8mm */
137 case MXC_CPU_IMX8MML: 143 case MXC_CPU_IMX8MML:
138 return "8MMQL"; /* Quad-core Lite version of the imx8mm */ 144 return "8MMQL"; /* Quad-core Lite version of the imx8mm */
139 case MXC_CPU_IMX8MMD: 145 case MXC_CPU_IMX8MMD:
140 return "8MMD"; /* Dual-core version of the imx8mm */ 146 return "8MMD"; /* Dual-core version of the imx8mm */
141 case MXC_CPU_IMX8MMDL: 147 case MXC_CPU_IMX8MMDL:
142 return "8MMDL"; /* Dual-core Lite version of the imx8mm */ 148 return "8MMDL"; /* Dual-core Lite version of the imx8mm */
143 case MXC_CPU_IMX8MMS: 149 case MXC_CPU_IMX8MMS:
144 return "8MMS"; /* Single-core version of the imx8mm */ 150 return "8MMS"; /* Single-core version of the imx8mm */
145 case MXC_CPU_IMX8MMSL: 151 case MXC_CPU_IMX8MMSL:
146 return "8MMSL"; /* Single-core Lite version of the imx8mm */ 152 return "8MMSL"; /* Single-core Lite version of the imx8mm */
147 case MXC_CPU_IMX8MQ: 153 case MXC_CPU_IMX8MQ:
148 return "8MQ"; /* Quad-core version of the imx8mq */ 154 return "8MQ"; /* Quad-core version of the imx8mq */
149 case MXC_CPU_IMX8MQL: 155 case MXC_CPU_IMX8MQL:
150 return "8MQLite"; /* Quad-core Lite version of the imx8mq */ 156 return "8MQLite"; /* Quad-core Lite version of the imx8mq */
151 case MXC_CPU_IMX8MD: 157 case MXC_CPU_IMX8MD:
152 return "8MD"; /* Dual-core version of the imx8mq */ 158 return "8MD"; /* Dual-core version of the imx8mq */
153 case MXC_CPU_MX7S: 159 case MXC_CPU_MX7S:
154 return "7S"; /* Single-core version of the mx7 */ 160 return "7S"; /* Single-core version of the mx7 */
155 case MXC_CPU_MX7D: 161 case MXC_CPU_MX7D:
156 return "7D"; /* Dual-core version of the mx7 */ 162 return "7D"; /* Dual-core version of the mx7 */
157 case MXC_CPU_MX6QP: 163 case MXC_CPU_MX6QP:
158 return "6QP"; /* Quad-Plus version of the mx6 */ 164 return "6QP"; /* Quad-Plus version of the mx6 */
159 case MXC_CPU_MX6DP: 165 case MXC_CPU_MX6DP:
160 return "6DP"; /* Dual-Plus version of the mx6 */ 166 return "6DP"; /* Dual-Plus version of the mx6 */
161 case MXC_CPU_MX6Q: 167 case MXC_CPU_MX6Q:
162 return "6Q"; /* Quad-core version of the mx6 */ 168 return "6Q"; /* Quad-core version of the mx6 */
163 case MXC_CPU_MX6D: 169 case MXC_CPU_MX6D:
164 return "6D"; /* Dual-core version of the mx6 */ 170 return "6D"; /* Dual-core version of the mx6 */
165 case MXC_CPU_MX6DL: 171 case MXC_CPU_MX6DL:
166 return "6DL"; /* Dual Lite version of the mx6 */ 172 return "6DL"; /* Dual Lite version of the mx6 */
167 case MXC_CPU_MX6SOLO: 173 case MXC_CPU_MX6SOLO:
168 return "6SOLO"; /* Solo version of the mx6 */ 174 return "6SOLO"; /* Solo version of the mx6 */
169 case MXC_CPU_MX6SL: 175 case MXC_CPU_MX6SL:
170 return "6SL"; /* Solo-Lite version of the mx6 */ 176 return "6SL"; /* Solo-Lite version of the mx6 */
171 case MXC_CPU_MX6SLL: 177 case MXC_CPU_MX6SLL:
172 return "6SLL"; /* SLL version of the mx6 */ 178 return "6SLL"; /* SLL version of the mx6 */
173 case MXC_CPU_MX6SX: 179 case MXC_CPU_MX6SX:
174 return "6SX"; /* SoloX version of the mx6 */ 180 return "6SX"; /* SoloX version of the mx6 */
175 case MXC_CPU_MX6UL: 181 case MXC_CPU_MX6UL:
176 return "6UL"; /* Ultra-Lite version of the mx6 */ 182 return "6UL"; /* Ultra-Lite version of the mx6 */
177 case MXC_CPU_MX6ULL: 183 case MXC_CPU_MX6ULL:
178 return "6ULL"; /* ULL version of the mx6 */ 184 return "6ULL"; /* ULL version of the mx6 */
179 case MXC_CPU_MX6ULZ: 185 case MXC_CPU_MX6ULZ:
180 return "6ULZ"; /* ULZ version of the mx6 */ 186 return "6ULZ"; /* ULZ version of the mx6 */
181 case MXC_CPU_MX51: 187 case MXC_CPU_MX51:
182 return "51"; 188 return "51";
183 case MXC_CPU_MX53: 189 case MXC_CPU_MX53:
184 return "53"; 190 return "53";
185 default: 191 default:
186 return "??"; 192 return "??";
187 } 193 }
188 } 194 }
189 195
190 int print_cpuinfo(void) 196 int print_cpuinfo(void)
191 { 197 {
192 u32 cpurev; 198 u32 cpurev;
193 __maybe_unused u32 max_freq; 199 __maybe_unused u32 max_freq;
194 #if defined(CONFIG_DBG_MONITOR) 200 #if defined(CONFIG_DBG_MONITOR)
195 struct dbg_monitor_regs *dbg = 201 struct dbg_monitor_regs *dbg =
196 (struct dbg_monitor_regs *)DEBUG_MONITOR_BASE_ADDR; 202 (struct dbg_monitor_regs *)DEBUG_MONITOR_BASE_ADDR;
197 #endif 203 #endif
198 204
199 cpurev = get_cpu_rev(); 205 cpurev = get_cpu_rev();
200 206
201 #if defined(CONFIG_IMX_THERMAL) || defined(CONFIG_NXP_TMU) 207 #if defined(CONFIG_IMX_THERMAL) || defined(CONFIG_NXP_TMU)
202 struct udevice *thermal_dev; 208 struct udevice *thermal_dev;
203 int cpu_tmp, minc, maxc, ret; 209 int cpu_tmp, minc, maxc, ret;
204 210
205 printf("CPU: i.MX%s rev%d.%d", 211 printf("CPU: i.MX%s rev%d.%d",
206 get_imx_type((cpurev & 0x1FF000) >> 12), 212 get_imx_type((cpurev & 0x1FF000) >> 12),
207 (cpurev & 0x000F0) >> 4, 213 (cpurev & 0x000F0) >> 4,
208 (cpurev & 0x0000F) >> 0); 214 (cpurev & 0x0000F) >> 0);
209 max_freq = get_cpu_speed_grade_hz(); 215 max_freq = get_cpu_speed_grade_hz();
210 if (!max_freq || max_freq == mxc_get_clock(MXC_ARM_CLK)) { 216 if (!max_freq || max_freq == mxc_get_clock(MXC_ARM_CLK)) {
211 printf(" at %dMHz\n", mxc_get_clock(MXC_ARM_CLK) / 1000000); 217 printf(" at %dMHz\n", mxc_get_clock(MXC_ARM_CLK) / 1000000);
212 } else { 218 } else {
213 printf(" %d MHz (running at %d MHz)\n", max_freq / 1000000, 219 printf(" %d MHz (running at %d MHz)\n", max_freq / 1000000,
214 mxc_get_clock(MXC_ARM_CLK) / 1000000); 220 mxc_get_clock(MXC_ARM_CLK) / 1000000);
215 } 221 }
216 #else 222 #else
217 printf("CPU: i.MX%s rev%d.%d at %d MHz\n", 223 printf("CPU: i.MX%s rev%d.%d at %d MHz\n",
218 get_imx_type((cpurev & 0x1FF000) >> 12), 224 get_imx_type((cpurev & 0x1FF000) >> 12),
219 (cpurev & 0x000F0) >> 4, 225 (cpurev & 0x000F0) >> 4,
220 (cpurev & 0x0000F) >> 0, 226 (cpurev & 0x0000F) >> 0,
221 mxc_get_clock(MXC_ARM_CLK) / 1000000); 227 mxc_get_clock(MXC_ARM_CLK) / 1000000);
222 #endif 228 #endif
223 229
224 #if defined(CONFIG_IMX_THERMAL) || defined(CONFIG_NXP_TMU) 230 #if defined(CONFIG_IMX_THERMAL) || defined(CONFIG_NXP_TMU)
225 puts("CPU: "); 231 puts("CPU: ");
226 switch (get_cpu_temp_grade(&minc, &maxc)) { 232 switch (get_cpu_temp_grade(&minc, &maxc)) {
227 case TEMP_AUTOMOTIVE: 233 case TEMP_AUTOMOTIVE:
228 puts("Automotive temperature grade "); 234 puts("Automotive temperature grade ");
229 break; 235 break;
230 case TEMP_INDUSTRIAL: 236 case TEMP_INDUSTRIAL:
231 puts("Industrial temperature grade "); 237 puts("Industrial temperature grade ");
232 break; 238 break;
233 case TEMP_EXTCOMMERCIAL: 239 case TEMP_EXTCOMMERCIAL:
234 puts("Extended Commercial temperature grade "); 240 puts("Extended Commercial temperature grade ");
235 break; 241 break;
236 default: 242 default:
237 puts("Commercial temperature grade "); 243 puts("Commercial temperature grade ");
238 break; 244 break;
239 } 245 }
240 printf("(%dC to %dC)", minc, maxc); 246 printf("(%dC to %dC)", minc, maxc);
241 #if defined(CONFIG_NXP_TMU) 247 #if defined(CONFIG_NXP_TMU)
242 ret = uclass_get_device_by_name(UCLASS_THERMAL, "cpu-thermal", &thermal_dev); 248 ret = uclass_get_device_by_name(UCLASS_THERMAL, "cpu-thermal", &thermal_dev);
243 #else 249 #else
244 ret = uclass_get_device(UCLASS_THERMAL, 0, &thermal_dev); 250 ret = uclass_get_device(UCLASS_THERMAL, 0, &thermal_dev);
245 #endif 251 #endif
246 if (!ret) { 252 if (!ret) {
247 ret = thermal_get_temp(thermal_dev, &cpu_tmp); 253 ret = thermal_get_temp(thermal_dev, &cpu_tmp);
248 254
249 if (!ret) 255 if (!ret)
250 printf(" at %dC\n", cpu_tmp); 256 printf(" at %dC\n", cpu_tmp);
251 else 257 else
252 debug(" - invalid sensor data\n"); 258 debug(" - invalid sensor data\n");
253 } else { 259 } else {
254 debug(" - invalid sensor device\n"); 260 debug(" - invalid sensor device\n");
255 } 261 }
256 #endif 262 #endif
257 263
258 #if defined(CONFIG_DBG_MONITOR) 264 #if defined(CONFIG_DBG_MONITOR)
259 if (readl(&dbg->snvs_addr)) 265 if (readl(&dbg->snvs_addr))
260 printf("DBG snvs regs addr 0x%x, data 0x%x, info 0x%x\n", 266 printf("DBG snvs regs addr 0x%x, data 0x%x, info 0x%x\n",
261 readl(&dbg->snvs_addr), 267 readl(&dbg->snvs_addr),
262 readl(&dbg->snvs_data), 268 readl(&dbg->snvs_data),
263 readl(&dbg->snvs_info)); 269 readl(&dbg->snvs_info));
264 #endif 270 #endif
265 271
266 printf("Reset cause: %s\n", get_reset_cause()); 272 printf("Reset cause: %s\n", get_reset_cause());
267 return 0; 273 return 0;
268 } 274 }
269 #endif 275 #endif
270 276
271 int cpu_eth_init(bd_t *bis) 277 int cpu_eth_init(bd_t *bis)
272 { 278 {
273 int rc = -ENODEV; 279 int rc = -ENODEV;
274 280
275 #if defined(CONFIG_FEC_MXC) 281 #if defined(CONFIG_FEC_MXC)
276 rc = fecmxc_initialize(bis); 282 rc = fecmxc_initialize(bis);
277 #endif 283 #endif
278 284
279 return rc; 285 return rc;
280 } 286 }
281 287
282 #ifdef CONFIG_FSL_ESDHC_IMX 288 #ifdef CONFIG_FSL_ESDHC_IMX
283 /* 289 /*
284 * Initializes on-chip MMC controllers. 290 * Initializes on-chip MMC controllers.
285 * to override, implement board_mmc_init() 291 * to override, implement board_mmc_init()
286 */ 292 */
287 int cpu_mmc_init(bd_t *bis) 293 int cpu_mmc_init(bd_t *bis)
288 { 294 {
289 return fsl_esdhc_mmc_init(bis); 295 return fsl_esdhc_mmc_init(bis);
290 } 296 }
291 #endif 297 #endif
292 298
293 #if !(defined(CONFIG_MX7) || defined(CONFIG_IMX8M)) 299 #if !(defined(CONFIG_MX7) || defined(CONFIG_IMX8M))
294 u32 get_ahb_clk(void) 300 u32 get_ahb_clk(void)
295 { 301 {
296 struct mxc_ccm_reg *imx_ccm = (struct mxc_ccm_reg *)CCM_BASE_ADDR; 302 struct mxc_ccm_reg *imx_ccm = (struct mxc_ccm_reg *)CCM_BASE_ADDR;
297 u32 reg, ahb_podf; 303 u32 reg, ahb_podf;
298 304
299 reg = __raw_readl(&imx_ccm->cbcdr); 305 reg = __raw_readl(&imx_ccm->cbcdr);
300 reg &= MXC_CCM_CBCDR_AHB_PODF_MASK; 306 reg &= MXC_CCM_CBCDR_AHB_PODF_MASK;
301 ahb_podf = reg >> MXC_CCM_CBCDR_AHB_PODF_OFFSET; 307 ahb_podf = reg >> MXC_CCM_CBCDR_AHB_PODF_OFFSET;
302 308
303 return get_periph_clk() / (ahb_podf + 1); 309 return get_periph_clk() / (ahb_podf + 1);
304 } 310 }
305 #endif 311 #endif
306 312
307 void arch_preboot_os(void) 313 void arch_preboot_os(void)
308 { 314 {
309 #if defined(CONFIG_PCIE_IMX) && !CONFIG_IS_ENABLED(DM_PCI) 315 #if defined(CONFIG_PCIE_IMX) && !CONFIG_IS_ENABLED(DM_PCI)
310 imx_pcie_remove(); 316 imx_pcie_remove();
311 #endif 317 #endif
312 318
313 #if defined(CONFIG_IMX_AHCI) 319 #if defined(CONFIG_IMX_AHCI)
314 struct udevice *dev; 320 struct udevice *dev;
315 int rc; 321 int rc;
316 322
317 rc = uclass_find_device(UCLASS_AHCI, 0, &dev); 323 rc = uclass_find_device(UCLASS_AHCI, 0, &dev);
318 if (!rc && dev) { 324 if (!rc && dev) {
319 rc = device_remove(dev, DM_REMOVE_NORMAL); 325 rc = device_remove(dev, DM_REMOVE_NORMAL);
320 if (rc) 326 if (rc)
321 printf("Cannot remove SATA device '%s' (err=%d)\n", 327 printf("Cannot remove SATA device '%s' (err=%d)\n",
322 dev->name, rc); 328 dev->name, rc);
323 } 329 }
324 #endif 330 #endif
325 331
326 #if defined(CONFIG_SATA) 332 #if defined(CONFIG_SATA)
327 if (!is_mx6sdl()) { 333 if (!is_mx6sdl()) {
328 sata_remove(0); 334 sata_remove(0);
329 #if defined(CONFIG_MX6) 335 #if defined(CONFIG_MX6)
330 disable_sata_clock(); 336 disable_sata_clock();
331 #endif 337 #endif
332 } 338 }
333 #endif 339 #endif
334 #if defined(CONFIG_LDO_BYPASS_CHECK) 340 #if defined(CONFIG_LDO_BYPASS_CHECK)
335 ldo_mode_set(check_ldo_bypass()); 341 ldo_mode_set(check_ldo_bypass());
336 #endif 342 #endif
337 #if defined(CONFIG_VIDEO_IPUV3) 343 #if defined(CONFIG_VIDEO_IPUV3)
338 /* disable video before launching O/S */ 344 /* disable video before launching O/S */
339 ipuv3_fb_shutdown(); 345 ipuv3_fb_shutdown();
340 #endif 346 #endif
341 #ifdef CONFIG_VIDEO_GIS 347 #ifdef CONFIG_VIDEO_GIS
342 /* Entry for GIS */ 348 /* Entry for GIS */
343 mxc_disable_gis(); 349 mxc_disable_gis();
344 #endif 350 #endif
345 #if defined(CONFIG_VIDEO_MXS) && !defined(CONFIG_DM_VIDEO) 351 #if defined(CONFIG_VIDEO_MXS) && !defined(CONFIG_DM_VIDEO)
346 lcdif_power_down(); 352 lcdif_power_down();
347 #endif 353 #endif
348 } 354 }
349 355
350 #ifndef CONFIG_IMX8M 356 #ifndef CONFIG_IMX8M
351 void set_chipselect_size(int const cs_size) 357 void set_chipselect_size(int const cs_size)
352 { 358 {
353 unsigned int reg; 359 unsigned int reg;
354 struct iomuxc *iomuxc_regs = (struct iomuxc *)IOMUXC_BASE_ADDR; 360 struct iomuxc *iomuxc_regs = (struct iomuxc *)IOMUXC_BASE_ADDR;
355 reg = readl(&iomuxc_regs->gpr[1]); 361 reg = readl(&iomuxc_regs->gpr[1]);
356 362
357 switch (cs_size) { 363 switch (cs_size) {
358 case CS0_128: 364 case CS0_128:
359 reg &= ~0x7; /* CS0=128MB, CS1=0, CS2=0, CS3=0 */ 365 reg &= ~0x7; /* CS0=128MB, CS1=0, CS2=0, CS3=0 */
360 reg |= 0x5; 366 reg |= 0x5;
361 break; 367 break;
362 case CS0_64M_CS1_64M: 368 case CS0_64M_CS1_64M:
363 reg &= ~0x3F; /* CS0=64MB, CS1=64MB, CS2=0, CS3=0 */ 369 reg &= ~0x3F; /* CS0=64MB, CS1=64MB, CS2=0, CS3=0 */
364 reg |= 0x1B; 370 reg |= 0x1B;
365 break; 371 break;
366 case CS0_64M_CS1_32M_CS2_32M: 372 case CS0_64M_CS1_32M_CS2_32M:
367 reg &= ~0x1FF; /* CS0=64MB, CS1=32MB, CS2=32MB, CS3=0 */ 373 reg &= ~0x1FF; /* CS0=64MB, CS1=32MB, CS2=32MB, CS3=0 */
368 reg |= 0x4B; 374 reg |= 0x4B;
369 break; 375 break;
370 case CS0_32M_CS1_32M_CS2_32M_CS3_32M: 376 case CS0_32M_CS1_32M_CS2_32M_CS3_32M:
371 reg &= ~0xFFF; /* CS0=32MB, CS1=32MB, CS2=32MB, CS3=32MB */ 377 reg &= ~0xFFF; /* CS0=32MB, CS1=32MB, CS2=32MB, CS3=32MB */
372 reg |= 0x249; 378 reg |= 0x249;
373 break; 379 break;
374 default: 380 default:
375 printf("Unknown chip select size: %d\n", cs_size); 381 printf("Unknown chip select size: %d\n", cs_size);
376 break; 382 break;
377 } 383 }
378 384
379 writel(reg, &iomuxc_regs->gpr[1]); 385 writel(reg, &iomuxc_regs->gpr[1]);
380 } 386 }
381 #endif 387 #endif
382 388
383 #if defined(CONFIG_MX7) || defined(CONFIG_IMX8M) 389 #if defined(CONFIG_MX7) || defined(CONFIG_IMX8M)
384 /* 390 /*
385 * OCOTP_TESTER3[9:8] (see Fusemap Description Table offset 0x440) 391 * OCOTP_TESTER3[9:8] (see Fusemap Description Table offset 0x440)
386 * defines a 2-bit SPEED_GRADING 392 * defines a 2-bit SPEED_GRADING
387 */ 393 */
388 #define OCOTP_TESTER3_SPEED_SHIFT 8 394 #define OCOTP_TESTER3_SPEED_SHIFT 8
389 enum cpu_speed { 395 enum cpu_speed {
390 OCOTP_TESTER3_SPEED_GRADE0, 396 OCOTP_TESTER3_SPEED_GRADE0,
391 OCOTP_TESTER3_SPEED_GRADE1, 397 OCOTP_TESTER3_SPEED_GRADE1,
392 OCOTP_TESTER3_SPEED_GRADE2, 398 OCOTP_TESTER3_SPEED_GRADE2,
393 OCOTP_TESTER3_SPEED_GRADE3, 399 OCOTP_TESTER3_SPEED_GRADE3,
394 OCOTP_TESTER3_SPEED_GRADE4, 400 OCOTP_TESTER3_SPEED_GRADE4,
395 }; 401 };
396 402
397 u32 get_cpu_speed_grade_hz(void) 403 u32 get_cpu_speed_grade_hz(void)
398 { 404 {
399 struct ocotp_regs *ocotp = (struct ocotp_regs *)OCOTP_BASE_ADDR; 405 struct ocotp_regs *ocotp = (struct ocotp_regs *)OCOTP_BASE_ADDR;
400 struct fuse_bank *bank = &ocotp->bank[1]; 406 struct fuse_bank *bank = &ocotp->bank[1];
401 struct fuse_bank1_regs *fuse = 407 struct fuse_bank1_regs *fuse =
402 (struct fuse_bank1_regs *)bank->fuse_regs; 408 (struct fuse_bank1_regs *)bank->fuse_regs;
403 uint32_t val; 409 uint32_t val;
404 410
405 val = readl(&fuse->tester3); 411 val = readl(&fuse->tester3);
406 val >>= OCOTP_TESTER3_SPEED_SHIFT; 412 val >>= OCOTP_TESTER3_SPEED_SHIFT;
407 413
408 if (is_imx8mn() || is_imx8mp()) { 414 if (is_imx8mn() || is_imx8mp()) {
409 val &= 0xf; 415 val &= 0xf;
410 return 2300000000 - val * 100000000; 416 return 2300000000 - val * 100000000;
411 } 417 }
412 418
413 if (is_imx8mm()) 419 if (is_imx8mm())
414 val &= 0x7; 420 val &= 0x7;
415 else 421 else
416 val &= 0x3; 422 val &= 0x3;
417 423
418 switch(val) { 424 switch(val) {
419 case OCOTP_TESTER3_SPEED_GRADE0: 425 case OCOTP_TESTER3_SPEED_GRADE0:
420 return 800000000; 426 return 800000000;
421 case OCOTP_TESTER3_SPEED_GRADE1: 427 case OCOTP_TESTER3_SPEED_GRADE1:
422 return (is_mx7() ? 500000000 : (is_imx8mq() ? 1000000000 : 1200000000)); 428 return (is_mx7() ? 500000000 : (is_imx8mq() ? 1000000000 : 1200000000));
423 case OCOTP_TESTER3_SPEED_GRADE2: 429 case OCOTP_TESTER3_SPEED_GRADE2:
424 return (is_mx7() ? 1000000000 : (is_imx8mq() ? 1300000000 : 1600000000)); 430 return (is_mx7() ? 1000000000 : (is_imx8mq() ? 1300000000 : 1600000000));
425 case OCOTP_TESTER3_SPEED_GRADE3: 431 case OCOTP_TESTER3_SPEED_GRADE3:
426 return (is_mx7() ? 1200000000 : (is_imx8mq() ? 1500000000 : 1800000000)); 432 return (is_mx7() ? 1200000000 : (is_imx8mq() ? 1500000000 : 1800000000));
427 case OCOTP_TESTER3_SPEED_GRADE4: 433 case OCOTP_TESTER3_SPEED_GRADE4:
428 return 2000000000; 434 return 2000000000;
429 } 435 }
430 436
431 return 0; 437 return 0;
432 } 438 }
433 439
434 /* 440 /*
435 * OCOTP_TESTER3[7:6] (see Fusemap Description Table offset 0x440) 441 * OCOTP_TESTER3[7:6] (see Fusemap Description Table offset 0x440)
436 * defines a 2-bit SPEED_GRADING 442 * defines a 2-bit SPEED_GRADING
437 */ 443 */
438 #define OCOTP_TESTER3_TEMP_SHIFT 6 444 #define OCOTP_TESTER3_TEMP_SHIFT 6
439 445
440 /* iMX8MP uses OCOTP_TESTER3[6:5] for Market segment */ 446 /* iMX8MP uses OCOTP_TESTER3[6:5] for Market segment */
441 #define IMX8MP_OCOTP_TESTER3_TEMP_SHIFT 5 447 #define IMX8MP_OCOTP_TESTER3_TEMP_SHIFT 5
442 448
443 u32 get_cpu_temp_grade(int *minc, int *maxc) 449 u32 get_cpu_temp_grade(int *minc, int *maxc)
444 { 450 {
445 struct ocotp_regs *ocotp = (struct ocotp_regs *)OCOTP_BASE_ADDR; 451 struct ocotp_regs *ocotp = (struct ocotp_regs *)OCOTP_BASE_ADDR;
446 struct fuse_bank *bank = &ocotp->bank[1]; 452 struct fuse_bank *bank = &ocotp->bank[1];
447 struct fuse_bank1_regs *fuse = 453 struct fuse_bank1_regs *fuse =
448 (struct fuse_bank1_regs *)bank->fuse_regs; 454 (struct fuse_bank1_regs *)bank->fuse_regs;
449 uint32_t val; 455 uint32_t val;
450 456
451 val = readl(&fuse->tester3); 457 val = readl(&fuse->tester3);
452 if (is_imx8mp()) 458 if (is_imx8mp())
453 val >>= IMX8MP_OCOTP_TESTER3_TEMP_SHIFT; 459 val >>= IMX8MP_OCOTP_TESTER3_TEMP_SHIFT;
454 else 460 else
455 val >>= OCOTP_TESTER3_TEMP_SHIFT; 461 val >>= OCOTP_TESTER3_TEMP_SHIFT;
456 val &= 0x3; 462 val &= 0x3;
457 463
458 if (minc && maxc) { 464 if (minc && maxc) {
459 if (val == TEMP_AUTOMOTIVE) { 465 if (val == TEMP_AUTOMOTIVE) {
460 *minc = -40; 466 *minc = -40;
461 *maxc = 125; 467 *maxc = 125;
462 } else if (val == TEMP_INDUSTRIAL) { 468 } else if (val == TEMP_INDUSTRIAL) {
463 *minc = -40; 469 *minc = -40;
464 *maxc = 105; 470 *maxc = 105;
465 } else if (val == TEMP_EXTCOMMERCIAL) { 471 } else if (val == TEMP_EXTCOMMERCIAL) {
466 *minc = -20; 472 *minc = -20;
467 *maxc = 105; 473 *maxc = 105;
468 } else { 474 } else {
469 *minc = 0; 475 *minc = 0;
470 *maxc = 95; 476 *maxc = 95;
471 } 477 }
472 } 478 }
473 return val; 479 return val;
474 } 480 }
475 #endif 481 #endif
476 482
477 #if defined(CONFIG_MX7) || defined(CONFIG_IMX8MQ) || defined(CONFIG_IMX8MM) 483 #if defined(CONFIG_MX7) || defined(CONFIG_IMX8MQ) || defined(CONFIG_IMX8MM)
478 enum boot_device get_boot_device(void) 484 enum boot_device get_boot_device(void)
479 { 485 {
480 struct bootrom_sw_info **p = 486 struct bootrom_sw_info **p =
481 (struct bootrom_sw_info **)(ulong)ROM_SW_INFO_ADDR; 487 (struct bootrom_sw_info **)(ulong)ROM_SW_INFO_ADDR;
482 488
483 enum boot_device boot_dev = SD1_BOOT; 489 enum boot_device boot_dev = SD1_BOOT;
484 u8 boot_type = (*p)->boot_dev_type; 490 u8 boot_type = (*p)->boot_dev_type;
485 u8 boot_instance = (*p)->boot_dev_instance; 491 u8 boot_instance = (*p)->boot_dev_instance;
486 492
487 switch (boot_type) { 493 switch (boot_type) {
488 case BOOT_TYPE_SD: 494 case BOOT_TYPE_SD:
489 boot_dev = boot_instance + SD1_BOOT; 495 boot_dev = boot_instance + SD1_BOOT;
490 break; 496 break;
491 case BOOT_TYPE_MMC: 497 case BOOT_TYPE_MMC:
492 boot_dev = boot_instance + MMC1_BOOT; 498 boot_dev = boot_instance + MMC1_BOOT;
493 break; 499 break;
494 case BOOT_TYPE_NAND: 500 case BOOT_TYPE_NAND:
495 boot_dev = NAND_BOOT; 501 boot_dev = NAND_BOOT;
496 break; 502 break;
497 case BOOT_TYPE_QSPI: 503 case BOOT_TYPE_QSPI:
498 boot_dev = QSPI_BOOT; 504 boot_dev = QSPI_BOOT;
499 break; 505 break;
500 case BOOT_TYPE_WEIM: 506 case BOOT_TYPE_WEIM:
501 boot_dev = WEIM_NOR_BOOT; 507 boot_dev = WEIM_NOR_BOOT;
502 break; 508 break;
503 case BOOT_TYPE_SPINOR: 509 case BOOT_TYPE_SPINOR:
504 boot_dev = SPI_NOR_BOOT; 510 boot_dev = SPI_NOR_BOOT;
505 break; 511 break;
506 case BOOT_TYPE_USB: 512 case BOOT_TYPE_USB:
507 boot_dev = USB_BOOT; 513 boot_dev = USB_BOOT;
508 break; 514 break;
509 default: 515 default:
510 #ifdef CONFIG_IMX8M 516 #ifdef CONFIG_IMX8M
511 if (((readl(SRC_BASE_ADDR + 0x58) & 0x00007FFF) >> 12) == 0x4) 517 if (((readl(SRC_BASE_ADDR + 0x58) & 0x00007FFF) >> 12) == 0x4)
512 boot_dev = QSPI_BOOT; 518 boot_dev = QSPI_BOOT;
513 #endif 519 #endif
514 break; 520 break;
515 } 521 }
516 522
517 return boot_dev; 523 return boot_dev;
518 } 524 }
519 #endif 525 #endif
520 526
521 #ifdef CONFIG_NXP_BOARD_REVISION 527 #ifdef CONFIG_NXP_BOARD_REVISION
522 int nxp_board_rev(void) 528 int nxp_board_rev(void)
523 { 529 {
524 /* 530 /*
525 * Get Board ID information from OCOTP_GP1[15:8] 531 * Get Board ID information from OCOTP_GP1[15:8]
526 * RevA: 0x1 532 * RevA: 0x1
527 * RevB: 0x2 533 * RevB: 0x2
528 * RevC: 0x3 534 * RevC: 0x3
529 */ 535 */
530 struct ocotp_regs *ocotp = (struct ocotp_regs *)OCOTP_BASE_ADDR; 536 struct ocotp_regs *ocotp = (struct ocotp_regs *)OCOTP_BASE_ADDR;
531 struct fuse_bank *bank = &ocotp->bank[4]; 537 struct fuse_bank *bank = &ocotp->bank[4];
532 struct fuse_bank4_regs *fuse = 538 struct fuse_bank4_regs *fuse =
533 (struct fuse_bank4_regs *)bank->fuse_regs; 539 (struct fuse_bank4_regs *)bank->fuse_regs;
534 540
535 return (readl(&fuse->gp1) >> 8 & 0x0F); 541 return (readl(&fuse->gp1) >> 8 & 0x0F);
536 } 542 }
537 543
538 char nxp_board_rev_string(void) 544 char nxp_board_rev_string(void)
539 { 545 {
540 const char *rev = "A"; 546 const char *rev = "A";
541 547
542 return (*rev + nxp_board_rev() - 1); 548 return (*rev + nxp_board_rev() - 1);
543 } 549 }
544 #endif 550 #endif
545 551
arch/arm/mach-imx/imx8m/soc.c
1 // SPDX-License-Identifier: GPL-2.0+ 1 // SPDX-License-Identifier: GPL-2.0+
2 /* 2 /*
3 * Copyright 2017-2019 NXP 3 * Copyright 2017-2019 NXP
4 * 4 *
5 * Peng Fan <peng.fan@nxp.com> 5 * Peng Fan <peng.fan@nxp.com>
6 */ 6 */
7 7
8 #include <common.h> 8 #include <common.h>
9 #include <cpu_func.h> 9 #include <cpu_func.h>
10 #include <asm/arch/imx-regs.h> 10 #include <asm/arch/imx-regs.h>
11 #include <asm/io.h> 11 #include <asm/io.h>
12 #include <asm/arch/clock.h> 12 #include <asm/arch/clock.h>
13 #include <asm/arch/sys_proto.h> 13 #include <asm/arch/sys_proto.h>
14 #include <asm/mach-imx/hab.h> 14 #include <asm/mach-imx/hab.h>
15 #include <asm/mach-imx/boot_mode.h> 15 #include <asm/mach-imx/boot_mode.h>
16 #include <asm/mach-imx/optee.h> 16 #include <asm/mach-imx/optee.h>
17 #include <asm/mach-imx/syscounter.h> 17 #include <asm/mach-imx/syscounter.h>
18 #include <asm/armv8/mmu.h> 18 #include <asm/armv8/mmu.h>
19 #include <dm/uclass.h> 19 #include <dm/uclass.h>
20 #include <errno.h> 20 #include <errno.h>
21 #include <fdt_support.h> 21 #include <fdt_support.h>
22 #include <fdtdec.h> 22 #include <fdtdec.h>
23 #include <fsl_wdog.h> 23 #include <fsl_wdog.h>
24 #include <imx_sip.h> 24 #include <imx_sip.h>
25 #include <generated/version_autogenerated.h> 25 #include <generated/version_autogenerated.h>
26 #include <asm/setup.h> 26 #include <asm/setup.h>
27 #include <asm/bootm.h> 27 #include <asm/bootm.h>
28 #ifdef CONFIG_IMX_SEC_INIT 28 #ifdef CONFIG_IMX_SEC_INIT
29 #include <fsl_caam.h> 29 #include <fsl_caam.h>
30 #endif 30 #endif
31 #include <env.h> 31 #include <env.h>
32 #include <env_internal.h> 32 #include <env_internal.h>
33 #include <efi_loader.h> 33 #include <efi_loader.h>
34 34
35 DECLARE_GLOBAL_DATA_PTR; 35 DECLARE_GLOBAL_DATA_PTR;
36 36
37 #if defined(CONFIG_IMX_HAB) || defined(CONFIG_AVB_ATX) || defined(CONFIG_IMX_TRUSTY_OS) 37 #if defined(CONFIG_IMX_HAB) || defined(CONFIG_AVB_ATX) || defined(CONFIG_IMX_TRUSTY_OS)
38 struct imx_sec_config_fuse_t const imx_sec_config_fuse = { 38 struct imx_sec_config_fuse_t const imx_sec_config_fuse = {
39 .bank = 1, 39 .bank = 1,
40 .word = 3, 40 .word = 3,
41 }; 41 };
42 #endif 42 #endif
43 43
44 int timer_init(void) 44 int timer_init(void)
45 { 45 {
46 #ifdef CONFIG_SPL_BUILD 46 #ifdef CONFIG_SPL_BUILD
47 struct sctr_regs *sctr = (struct sctr_regs *)SYSCNT_CTRL_BASE_ADDR; 47 struct sctr_regs *sctr = (struct sctr_regs *)SYSCNT_CTRL_BASE_ADDR;
48 unsigned long freq = readl(&sctr->cntfid0); 48 unsigned long freq = readl(&sctr->cntfid0);
49 49
50 /* Update with accurate clock frequency */ 50 /* Update with accurate clock frequency */
51 asm volatile("msr cntfrq_el0, %0" : : "r" (freq) : "memory"); 51 asm volatile("msr cntfrq_el0, %0" : : "r" (freq) : "memory");
52 52
53 clrsetbits_le32(&sctr->cntcr, SC_CNTCR_FREQ0 | SC_CNTCR_FREQ1, 53 clrsetbits_le32(&sctr->cntcr, SC_CNTCR_FREQ0 | SC_CNTCR_FREQ1,
54 SC_CNTCR_FREQ0 | SC_CNTCR_ENABLE | SC_CNTCR_HDBG); 54 SC_CNTCR_FREQ0 | SC_CNTCR_ENABLE | SC_CNTCR_HDBG);
55 #endif 55 #endif
56 56
57 gd->arch.tbl = 0; 57 gd->arch.tbl = 0;
58 gd->arch.tbu = 0; 58 gd->arch.tbu = 0;
59 59
60 return 0; 60 return 0;
61 } 61 }
62 62
63 void enable_tzc380(void) 63 void enable_tzc380(void)
64 { 64 {
65 struct iomuxc_gpr_base_regs *gpr = 65 struct iomuxc_gpr_base_regs *gpr =
66 (struct iomuxc_gpr_base_regs *)IOMUXC_GPR_BASE_ADDR; 66 (struct iomuxc_gpr_base_regs *)IOMUXC_GPR_BASE_ADDR;
67 67
68 /* Enable TZASC and lock setting */ 68 /* Enable TZASC and lock setting */
69 setbits_le32(&gpr->gpr[10], GPR_TZASC_EN); 69 setbits_le32(&gpr->gpr[10], GPR_TZASC_EN);
70 setbits_le32(&gpr->gpr[10], GPR_TZASC_EN_LOCK); 70 setbits_le32(&gpr->gpr[10], GPR_TZASC_EN_LOCK);
71 if (is_imx8mm() || is_imx8mn() || is_imx8mp()) 71 if (is_imx8mm() || is_imx8mn() || is_imx8mp())
72 setbits_le32(&gpr->gpr[10], BIT(1)); 72 setbits_le32(&gpr->gpr[10], BIT(1));
73 /* 73 /*
74 * set Region 0 attribute to allow secure and non-secure 74 * set Region 0 attribute to allow secure and non-secure
75 * read/write permission. Found some masters like usb dwc3 75 * read/write permission. Found some masters like usb dwc3
76 * controllers can't work with secure memory. 76 * controllers can't work with secure memory.
77 */ 77 */
78 writel(0xf0000000, TZASC_BASE_ADDR + 0x108); 78 writel(0xf0000000, TZASC_BASE_ADDR + 0x108);
79 } 79 }
80 80
81 void set_wdog_reset(struct wdog_regs *wdog) 81 void set_wdog_reset(struct wdog_regs *wdog)
82 { 82 {
83 /* 83 /*
84 * Output WDOG_B signal to reset external pmic or POR_B decided by 84 * Output WDOG_B signal to reset external pmic or POR_B decided by
85 * the board design. Without external reset, the peripherals/DDR/ 85 * the board design. Without external reset, the peripherals/DDR/
86 * PMIC are not reset, that may cause system working abnormal. 86 * PMIC are not reset, that may cause system working abnormal.
87 * WDZST bit is write-once only bit. Align this bit in kernel, 87 * WDZST bit is write-once only bit. Align this bit in kernel,
88 * otherwise kernel code will have no chance to set this bit. 88 * otherwise kernel code will have no chance to set this bit.
89 */ 89 */
90 setbits_le16(&wdog->wcr, WDOG_WDT_MASK | WDOG_WDZST_MASK); 90 setbits_le16(&wdog->wcr, WDOG_WDT_MASK | WDOG_WDZST_MASK);
91 } 91 }
92 92
93 static struct mm_region imx8m_mem_map[] = { 93 static struct mm_region imx8m_mem_map[] = {
94 { 94 {
95 /* ROM */ 95 /* ROM */
96 .virt = 0x0UL, 96 .virt = 0x0UL,
97 .phys = 0x0UL, 97 .phys = 0x0UL,
98 .size = 0x100000UL, 98 .size = 0x100000UL,
99 .attrs = PTE_BLOCK_MEMTYPE(MT_NORMAL) | 99 .attrs = PTE_BLOCK_MEMTYPE(MT_NORMAL) |
100 PTE_BLOCK_OUTER_SHARE 100 PTE_BLOCK_OUTER_SHARE
101 }, { 101 }, {
102 /* CAAM */ 102 /* CAAM */
103 .virt = 0x100000UL, 103 .virt = 0x100000UL,
104 .phys = 0x100000UL, 104 .phys = 0x100000UL,
105 .size = 0x8000UL, 105 .size = 0x8000UL,
106 .attrs = PTE_BLOCK_MEMTYPE(MT_DEVICE_NGNRNE) | 106 .attrs = PTE_BLOCK_MEMTYPE(MT_DEVICE_NGNRNE) |
107 PTE_BLOCK_NON_SHARE | 107 PTE_BLOCK_NON_SHARE |
108 PTE_BLOCK_PXN | PTE_BLOCK_UXN 108 PTE_BLOCK_PXN | PTE_BLOCK_UXN
109 }, { 109 }, {
110 /* TCM */ 110 /* TCM */
111 .virt = 0x7C0000UL, 111 .virt = 0x7C0000UL,
112 .phys = 0x7C0000UL, 112 .phys = 0x7C0000UL,
113 .size = 0x80000UL, 113 .size = 0x80000UL,
114 .attrs = PTE_BLOCK_MEMTYPE(MT_DEVICE_NGNRNE) | 114 .attrs = PTE_BLOCK_MEMTYPE(MT_DEVICE_NGNRNE) |
115 PTE_BLOCK_NON_SHARE | 115 PTE_BLOCK_NON_SHARE |
116 PTE_BLOCK_PXN | PTE_BLOCK_UXN 116 PTE_BLOCK_PXN | PTE_BLOCK_UXN
117 }, { 117 }, {
118 /* OCRAM */ 118 /* OCRAM */
119 .virt = 0x900000UL, 119 .virt = 0x900000UL,
120 .phys = 0x900000UL, 120 .phys = 0x900000UL,
121 .size = 0x200000UL, 121 .size = 0x200000UL,
122 .attrs = PTE_BLOCK_MEMTYPE(MT_NORMAL) | 122 .attrs = PTE_BLOCK_MEMTYPE(MT_NORMAL) |
123 PTE_BLOCK_OUTER_SHARE 123 PTE_BLOCK_OUTER_SHARE
124 }, { 124 }, {
125 /* AIPS */ 125 /* AIPS */
126 .virt = 0xB00000UL, 126 .virt = 0xB00000UL,
127 .phys = 0xB00000UL, 127 .phys = 0xB00000UL,
128 .size = 0x3f500000UL, 128 .size = 0x3f500000UL,
129 .attrs = PTE_BLOCK_MEMTYPE(MT_DEVICE_NGNRNE) | 129 .attrs = PTE_BLOCK_MEMTYPE(MT_DEVICE_NGNRNE) |
130 PTE_BLOCK_NON_SHARE | 130 PTE_BLOCK_NON_SHARE |
131 PTE_BLOCK_PXN | PTE_BLOCK_UXN 131 PTE_BLOCK_PXN | PTE_BLOCK_UXN
132 }, { 132 }, {
133 /* DRAM1 */ 133 /* DRAM1 */
134 .virt = 0x40000000UL, 134 .virt = 0x40000000UL,
135 .phys = 0x40000000UL, 135 .phys = 0x40000000UL,
136 .size = PHYS_SDRAM_SIZE, 136 .size = PHYS_SDRAM_SIZE,
137 .attrs = PTE_BLOCK_MEMTYPE(MT_NORMAL) | 137 .attrs = PTE_BLOCK_MEMTYPE(MT_NORMAL) |
138 #ifdef CONFIG_IMX_TRUSTY_OS 138 #ifdef CONFIG_IMX_TRUSTY_OS
139 PTE_BLOCK_INNER_SHARE 139 PTE_BLOCK_INNER_SHARE
140 #else 140 #else
141 PTE_BLOCK_OUTER_SHARE 141 PTE_BLOCK_OUTER_SHARE
142 #endif 142 #endif
143 #ifdef PHYS_SDRAM_2_SIZE 143 #ifdef PHYS_SDRAM_2_SIZE
144 }, { 144 }, {
145 /* DRAM2 */ 145 /* DRAM2 */
146 .virt = 0x100000000UL, 146 .virt = 0x100000000UL,
147 .phys = 0x100000000UL, 147 .phys = 0x100000000UL,
148 .size = PHYS_SDRAM_2_SIZE, 148 .size = PHYS_SDRAM_2_SIZE,
149 .attrs = PTE_BLOCK_MEMTYPE(MT_NORMAL) | 149 .attrs = PTE_BLOCK_MEMTYPE(MT_NORMAL) |
150 #ifdef CONFIG_IMX_TRUSTY_OS 150 #ifdef CONFIG_IMX_TRUSTY_OS
151 PTE_BLOCK_INNER_SHARE 151 PTE_BLOCK_INNER_SHARE
152 #else 152 #else
153 PTE_BLOCK_OUTER_SHARE 153 PTE_BLOCK_OUTER_SHARE
154 #endif 154 #endif
155 #endif 155 #endif
156 }, { 156 }, {
157 /* empty entrie to split table entry 5 157 /* empty entrie to split table entry 5
158 * if needed when TEEs are used 158 * if needed when TEEs are used
159 */ 159 */
160 0, 160 0,
161 }, { 161 }, {
162 /* List terminator */ 162 /* List terminator */
163 0, 163 0,
164 } 164 }
165 }; 165 };
166 166
167 struct mm_region *mem_map = imx8m_mem_map; 167 struct mm_region *mem_map = imx8m_mem_map;
168 168
169 void enable_caches(void) 169 void enable_caches(void)
170 { 170 {
171 /* If OPTEE runs, remove OPTEE memory from MMU table to avoid speculative prefetch */ 171 /* If OPTEE runs, remove OPTEE memory from MMU table to avoid speculative prefetch */
172 if (rom_pointer[1]) { 172 if (rom_pointer[1]) {
173 173
174 /* TEE are loaded, So the ddr bank structures 174 /* TEE are loaded, So the ddr bank structures
175 * have been modified update mmu table accordingly 175 * have been modified update mmu table accordingly
176 */ 176 */
177 int i = 0; 177 int i = 0;
178 /* please make sure that entry initial value matches 178 /* please make sure that entry initial value matches
179 * imx8m_mem_map for DRAM1 179 * imx8m_mem_map for DRAM1
180 */ 180 */
181 int entry = 5; 181 int entry = 5;
182 u64 attrs = imx8m_mem_map[entry].attrs; 182 u64 attrs = imx8m_mem_map[entry].attrs;
183 while (i < CONFIG_NR_DRAM_BANKS && entry < 8) { 183 while (i < CONFIG_NR_DRAM_BANKS && entry < 8) {
184 if (gd->bd->bi_dram[i].start == 0) 184 if (gd->bd->bi_dram[i].start == 0)
185 break; 185 break;
186 imx8m_mem_map[entry].phys = gd->bd->bi_dram[i].start; 186 imx8m_mem_map[entry].phys = gd->bd->bi_dram[i].start;
187 imx8m_mem_map[entry].virt = gd->bd->bi_dram[i].start; 187 imx8m_mem_map[entry].virt = gd->bd->bi_dram[i].start;
188 imx8m_mem_map[entry].size = gd->bd->bi_dram[i].size; 188 imx8m_mem_map[entry].size = gd->bd->bi_dram[i].size;
189 imx8m_mem_map[entry].attrs = attrs; 189 imx8m_mem_map[entry].attrs = attrs;
190 debug("Added memory mapping (%d): %llx %llx\n", entry, 190 debug("Added memory mapping (%d): %llx %llx\n", entry,
191 imx8m_mem_map[entry].phys, imx8m_mem_map[entry].size); 191 imx8m_mem_map[entry].phys, imx8m_mem_map[entry].size);
192 i++;entry++; 192 i++;entry++;
193 } 193 }
194 } 194 }
195 195
196 icache_enable(); 196 icache_enable();
197 dcache_enable(); 197 dcache_enable();
198 } 198 }
199 199
200 __weak int board_phys_sdram_size(phys_size_t *size) 200 __weak int board_phys_sdram_size(phys_size_t *size)
201 { 201 {
202 if (!size) 202 if (!size)
203 return -EINVAL; 203 return -EINVAL;
204 204
205 *size = PHYS_SDRAM_SIZE; 205 *size = PHYS_SDRAM_SIZE;
206 return 0; 206 return 0;
207 } 207 }
208 208
209 int dram_init(void) 209 int dram_init(void)
210 { 210 {
211 phys_size_t sdram_size; 211 phys_size_t sdram_size;
212 int ret; 212 int ret;
213 213
214 ret = board_phys_sdram_size(&sdram_size); 214 ret = board_phys_sdram_size(&sdram_size);
215 if (ret) 215 if (ret)
216 return ret; 216 return ret;
217 217
218 /* rom_pointer[1] contains the size of TEE occupies */ 218 /* rom_pointer[1] contains the size of TEE occupies */
219 if (rom_pointer[1]) 219 if (rom_pointer[1])
220 gd->ram_size = sdram_size - rom_pointer[1]; 220 gd->ram_size = sdram_size - rom_pointer[1];
221 else 221 else
222 gd->ram_size = sdram_size; 222 gd->ram_size = sdram_size;
223 223
224 #ifdef PHYS_SDRAM_2_SIZE 224 #ifdef PHYS_SDRAM_2_SIZE
225 gd->ram_size += PHYS_SDRAM_2_SIZE; 225 gd->ram_size += PHYS_SDRAM_2_SIZE;
226 #endif 226 #endif
227 227
228 return 0; 228 return 0;
229 } 229 }
230 230
231 int dram_init_banksize(void) 231 int dram_init_banksize(void)
232 { 232 {
233 int bank = 0; 233 int bank = 0;
234 int ret; 234 int ret;
235 phys_size_t sdram_size; 235 phys_size_t sdram_size;
236 236
237 ret = board_phys_sdram_size(&sdram_size); 237 ret = board_phys_sdram_size(&sdram_size);
238 if (ret) 238 if (ret)
239 return ret; 239 return ret;
240 240
241 gd->bd->bi_dram[bank].start = PHYS_SDRAM; 241 gd->bd->bi_dram[bank].start = PHYS_SDRAM;
242 if (rom_pointer[1]) { 242 if (rom_pointer[1]) {
243 phys_addr_t optee_start = (phys_addr_t)rom_pointer[0]; 243 phys_addr_t optee_start = (phys_addr_t)rom_pointer[0];
244 phys_size_t optee_size = (size_t)rom_pointer[1]; 244 phys_size_t optee_size = (size_t)rom_pointer[1];
245 245
246 gd->bd->bi_dram[bank].size = optee_start -gd->bd->bi_dram[bank].start; 246 gd->bd->bi_dram[bank].size = optee_start -gd->bd->bi_dram[bank].start;
247 if ((optee_start + optee_size) < (PHYS_SDRAM + sdram_size)) { 247 if ((optee_start + optee_size) < (PHYS_SDRAM + sdram_size)) {
248 if ( ++bank >= CONFIG_NR_DRAM_BANKS) { 248 if ( ++bank >= CONFIG_NR_DRAM_BANKS) {
249 puts("CONFIG_NR_DRAM_BANKS is not enough\n"); 249 puts("CONFIG_NR_DRAM_BANKS is not enough\n");
250 return -1; 250 return -1;
251 } 251 }
252 252
253 gd->bd->bi_dram[bank].start = optee_start + optee_size; 253 gd->bd->bi_dram[bank].start = optee_start + optee_size;
254 gd->bd->bi_dram[bank].size = PHYS_SDRAM + 254 gd->bd->bi_dram[bank].size = PHYS_SDRAM +
255 sdram_size - gd->bd->bi_dram[bank].start; 255 sdram_size - gd->bd->bi_dram[bank].start;
256 } 256 }
257 } else { 257 } else {
258 gd->bd->bi_dram[bank].size = sdram_size; 258 gd->bd->bi_dram[bank].size = sdram_size;
259 } 259 }
260 260
261 #ifdef PHYS_SDRAM_2_SIZE 261 #ifdef PHYS_SDRAM_2_SIZE
262 if ( ++bank >= CONFIG_NR_DRAM_BANKS) { 262 if ( ++bank >= CONFIG_NR_DRAM_BANKS) {
263 puts("CONFIG_NR_DRAM_BANKS is not enough for SDRAM_2\n"); 263 puts("CONFIG_NR_DRAM_BANKS is not enough for SDRAM_2\n");
264 return -1; 264 return -1;
265 } 265 }
266 gd->bd->bi_dram[bank].start = PHYS_SDRAM_2; 266 gd->bd->bi_dram[bank].start = PHYS_SDRAM_2;
267 gd->bd->bi_dram[bank].size = PHYS_SDRAM_2_SIZE; 267 gd->bd->bi_dram[bank].size = PHYS_SDRAM_2_SIZE;
268 #endif 268 #endif
269 269
270 return 0; 270 return 0;
271 } 271 }
272 272
273 phys_size_t get_effective_memsize(void) 273 phys_size_t get_effective_memsize(void)
274 { 274 {
275 /* return the first bank as effective memory */ 275 /* return the first bank as effective memory */
276 if (rom_pointer[1]) 276 if (rom_pointer[1])
277 return ((phys_addr_t)rom_pointer[0] - PHYS_SDRAM); 277 return ((phys_addr_t)rom_pointer[0] - PHYS_SDRAM);
278 278
279 #ifdef PHYS_SDRAM_2_SIZE 279 #ifdef PHYS_SDRAM_2_SIZE
280 return gd->ram_size - PHYS_SDRAM_2_SIZE; 280 return gd->ram_size - PHYS_SDRAM_2_SIZE;
281 #else 281 #else
282 return gd->ram_size; 282 return gd->ram_size;
283 #endif 283 #endif
284 } 284 }
285 285
286 static u32 get_cpu_variant_type(u32 type) 286 static u32 get_cpu_variant_type(u32 type)
287 { 287 {
288 struct ocotp_regs *ocotp = (struct ocotp_regs *)OCOTP_BASE_ADDR; 288 struct ocotp_regs *ocotp = (struct ocotp_regs *)OCOTP_BASE_ADDR;
289 struct fuse_bank *bank = &ocotp->bank[1]; 289 struct fuse_bank *bank = &ocotp->bank[1];
290 struct fuse_bank1_regs *fuse = 290 struct fuse_bank1_regs *fuse =
291 (struct fuse_bank1_regs *)bank->fuse_regs; 291 (struct fuse_bank1_regs *)bank->fuse_regs;
292 292
293 u32 value = readl(&fuse->tester4); 293 u32 value = readl(&fuse->tester4);
294 294
295 if (type == MXC_CPU_IMX8MQ) { 295 if (type == MXC_CPU_IMX8MQ) {
296 if ((value & 0x3) == 0x2) 296 if ((value & 0x3) == 0x2)
297 return MXC_CPU_IMX8MD; 297 return MXC_CPU_IMX8MD;
298 else if (value & 0x200000) 298 else if (value & 0x200000)
299 return MXC_CPU_IMX8MQL; 299 return MXC_CPU_IMX8MQL;
300 300
301 } else if (type == MXC_CPU_IMX8MM) { 301 } else if (type == MXC_CPU_IMX8MM) {
302 switch (value & 0x3) { 302 switch (value & 0x3) {
303 case 2: 303 case 2:
304 if (value & 0x1c0000) 304 if (value & 0x1c0000)
305 return MXC_CPU_IMX8MMDL; 305 return MXC_CPU_IMX8MMDL;
306 else 306 else
307 return MXC_CPU_IMX8MMD; 307 return MXC_CPU_IMX8MMD;
308 case 3: 308 case 3:
309 if (value & 0x1c0000) 309 if (value & 0x1c0000)
310 return MXC_CPU_IMX8MMSL; 310 return MXC_CPU_IMX8MMSL;
311 else 311 else
312 return MXC_CPU_IMX8MMS; 312 return MXC_CPU_IMX8MMS;
313 default: 313 default:
314 if (value & 0x1c0000) 314 if (value & 0x1c0000)
315 return MXC_CPU_IMX8MML; 315 return MXC_CPU_IMX8MML;
316 break; 316 break;
317 } 317 }
318 } else if (type == MXC_CPU_IMX8MN) { 318 } else if (type == MXC_CPU_IMX8MN) {
319 switch (value & 0x3) { 319 switch (value & 0x3) {
320 case 2: 320 case 2:
321 if (value & 0x1000000) 321 if (value & 0x1000000) {
322 return MXC_CPU_IMX8MNDL; 322 if (value & 0x10000000) /* MIPI DSI */
323 else 323 return MXC_CPU_IMX8MNUD;
324 else
325 return MXC_CPU_IMX8MNDL;
326 } else {
324 return MXC_CPU_IMX8MND; 327 return MXC_CPU_IMX8MND;
328 }
325 case 3: 329 case 3:
326 if (value & 0x1000000) 330 if (value & 0x1000000) {
327 return MXC_CPU_IMX8MNSL; 331 if (value & 0x10000000) /* MIPI DSI */
328 else 332 return MXC_CPU_IMX8MNUS;
333 else
334 return MXC_CPU_IMX8MNSL;
335 } else {
329 return MXC_CPU_IMX8MNS; 336 return MXC_CPU_IMX8MNS;
337 }
330 default: 338 default:
331 if (value & 0x1000000) 339 if (value & 0x1000000) {
332 return MXC_CPU_IMX8MNL; 340 if (value & 0x10000000) /* MIPI DSI */
341 return MXC_CPU_IMX8MNUQ;
342 else
343 return MXC_CPU_IMX8MNL;
344 }
333 break; 345 break;
334 } 346 }
335 } else if (type == MXC_CPU_IMX8MP) { 347 } else if (type == MXC_CPU_IMX8MP) {
336 u32 value0 = readl(&fuse->tester3); 348 u32 value0 = readl(&fuse->tester3);
337 u32 flag = 0; 349 u32 flag = 0;
338 350
339 if ((value0 & 0xc0000) == 0x80000) { 351 if ((value0 & 0xc0000) == 0x80000) {
340 return MXC_CPU_IMX8MPD; 352 return MXC_CPU_IMX8MPD;
341 } else { 353 } else {
342 /* vpu disabled */ 354 /* vpu disabled */
343 if ((value0 & 0x43000000) == 0x43000000) 355 if ((value0 & 0x43000000) == 0x43000000)
344 flag = 1; 356 flag = 1;
345 357
346 /* npu disabled*/ 358 /* npu disabled*/
347 if ((value & 0x8) == 0x8) 359 if ((value & 0x8) == 0x8)
348 flag |= (1 << 1); 360 flag |= (1 << 1);
349 361
350 /* isp disabled */ 362 /* isp disabled */
351 if ((value & 0x3) == 0x3) 363 if ((value & 0x3) == 0x3)
352 flag |= (1 << 2); 364 flag |= (1 << 2);
353 365
354 switch (flag) { 366 switch (flag) {
355 case 7: 367 case 7:
356 return MXC_CPU_IMX8MPL; 368 return MXC_CPU_IMX8MPL;
357 case 2: 369 case 2:
358 return MXC_CPU_IMX8MP6; 370 return MXC_CPU_IMX8MP6;
359 default: 371 default:
360 break; 372 break;
361 } 373 }
362 } 374 }
363 } 375 }
364 376
365 return type; 377 return type;
366 } 378 }
367 379
368 u32 get_cpu_rev(void) 380 u32 get_cpu_rev(void)
369 { 381 {
370 struct anamix_pll *ana_pll = (struct anamix_pll *)ANATOP_BASE_ADDR; 382 struct anamix_pll *ana_pll = (struct anamix_pll *)ANATOP_BASE_ADDR;
371 u32 reg = readl(&ana_pll->digprog); 383 u32 reg = readl(&ana_pll->digprog);
372 u32 type = (reg >> 16) & 0xff; 384 u32 type = (reg >> 16) & 0xff;
373 u32 major_low = (reg >> 8) & 0xff; 385 u32 major_low = (reg >> 8) & 0xff;
374 u32 rom_version; 386 u32 rom_version;
375 387
376 reg &= 0xff; 388 reg &= 0xff;
377 389
378 /* iMX8MP */ 390 /* iMX8MP */
379 if (major_low == 0x43) { 391 if (major_low == 0x43) {
380 type = get_cpu_variant_type(MXC_CPU_IMX8MP); 392 type = get_cpu_variant_type(MXC_CPU_IMX8MP);
381 } else if (major_low == 0x42) { 393 } else if (major_low == 0x42) {
382 /* iMX8MN */ 394 /* iMX8MN */
383 type = get_cpu_variant_type(MXC_CPU_IMX8MN); 395 type = get_cpu_variant_type(MXC_CPU_IMX8MN);
384 } else if (major_low == 0x41) { 396 } else if (major_low == 0x41) {
385 type = get_cpu_variant_type(MXC_CPU_IMX8MM); 397 type = get_cpu_variant_type(MXC_CPU_IMX8MM);
386 } else { 398 } else {
387 if (reg == CHIP_REV_1_0) { 399 if (reg == CHIP_REV_1_0) {
388 /* 400 /*
389 * For B0 chip, the DIGPROG is not updated, 401 * For B0 chip, the DIGPROG is not updated,
390 * it is still TO1.0. we have to check ROM 402 * it is still TO1.0. we have to check ROM
391 * version or OCOTP_READ_FUSE_DATA. 403 * version or OCOTP_READ_FUSE_DATA.
392 * 0xff0055aa is magic number for B1. 404 * 0xff0055aa is magic number for B1.
393 */ 405 */
394 if (readl((void __iomem *)(OCOTP_BASE_ADDR + 0x40)) == 0xff0055aa) { 406 if (readl((void __iomem *)(OCOTP_BASE_ADDR + 0x40)) == 0xff0055aa) {
395 reg = CHIP_REV_2_1; 407 reg = CHIP_REV_2_1;
396 } else { 408 } else {
397 rom_version = 409 rom_version =
398 readl((void __iomem *)ROM_VERSION_A0); 410 readl((void __iomem *)ROM_VERSION_A0);
399 if (rom_version != CHIP_REV_1_0) { 411 if (rom_version != CHIP_REV_1_0) {
400 rom_version = readl((void __iomem *)ROM_VERSION_B0); 412 rom_version = readl((void __iomem *)ROM_VERSION_B0);
401 rom_version &= 0xff; 413 rom_version &= 0xff;
402 if (rom_version == CHIP_REV_2_0) 414 if (rom_version == CHIP_REV_2_0)
403 reg = CHIP_REV_2_0; 415 reg = CHIP_REV_2_0;
404 } 416 }
405 } 417 }
406 } 418 }
407 419
408 type = get_cpu_variant_type(type); 420 type = get_cpu_variant_type(type);
409 } 421 }
410 422
411 return (type << 12) | reg; 423 return (type << 12) | reg;
412 } 424 }
413 425
414 static void imx_set_wdog_powerdown(bool enable) 426 static void imx_set_wdog_powerdown(bool enable)
415 { 427 {
416 struct wdog_regs *wdog1 = (struct wdog_regs *)WDOG1_BASE_ADDR; 428 struct wdog_regs *wdog1 = (struct wdog_regs *)WDOG1_BASE_ADDR;
417 struct wdog_regs *wdog2 = (struct wdog_regs *)WDOG2_BASE_ADDR; 429 struct wdog_regs *wdog2 = (struct wdog_regs *)WDOG2_BASE_ADDR;
418 struct wdog_regs *wdog3 = (struct wdog_regs *)WDOG3_BASE_ADDR; 430 struct wdog_regs *wdog3 = (struct wdog_regs *)WDOG3_BASE_ADDR;
419 431
420 /* Write to the PDE (Power Down Enable) bit */ 432 /* Write to the PDE (Power Down Enable) bit */
421 writew(enable, &wdog1->wmcr); 433 writew(enable, &wdog1->wmcr);
422 writew(enable, &wdog2->wmcr); 434 writew(enable, &wdog2->wmcr);
423 writew(enable, &wdog3->wmcr); 435 writew(enable, &wdog3->wmcr);
424 } 436 }
425 437
426 int arch_cpu_init_dm(void) 438 int arch_cpu_init_dm(void)
427 { 439 {
428 struct udevice *dev; 440 struct udevice *dev;
429 int ret; 441 int ret;
430 442
431 if (CONFIG_IS_ENABLED(CLK)) { 443 if (CONFIG_IS_ENABLED(CLK)) {
432 ret = uclass_get_device_by_name(UCLASS_CLK, 444 ret = uclass_get_device_by_name(UCLASS_CLK,
433 "clock-controller@30380000", 445 "clock-controller@30380000",
434 &dev); 446 &dev);
435 if (ret < 0) { 447 if (ret < 0) {
436 printf("Failed to find clock node. Check device tree\n"); 448 printf("Failed to find clock node. Check device tree\n");
437 return ret; 449 return ret;
438 } 450 }
439 } 451 }
440 452
441 return 0; 453 return 0;
442 } 454 }
443 455
444 #if defined(CONFIG_IMX_HAB) && defined(CONFIG_IMX8MQ) 456 #if defined(CONFIG_IMX_HAB) && defined(CONFIG_IMX8MQ)
445 static bool is_hdmi_fused(void) { 457 static bool is_hdmi_fused(void) {
446 struct ocotp_regs *ocotp = (struct ocotp_regs *)OCOTP_BASE_ADDR; 458 struct ocotp_regs *ocotp = (struct ocotp_regs *)OCOTP_BASE_ADDR;
447 struct fuse_bank *bank = &ocotp->bank[1]; 459 struct fuse_bank *bank = &ocotp->bank[1];
448 struct fuse_bank1_regs *fuse = 460 struct fuse_bank1_regs *fuse =
449 (struct fuse_bank1_regs *)bank->fuse_regs; 461 (struct fuse_bank1_regs *)bank->fuse_regs;
450 462
451 u32 value = readl(&fuse->tester4); 463 u32 value = readl(&fuse->tester4);
452 464
453 if (is_imx8mq()) { 465 if (is_imx8mq()) {
454 if (value & 0x02000000) 466 if (value & 0x02000000)
455 return true; 467 return true;
456 } 468 }
457 469
458 return false; 470 return false;
459 } 471 }
460 472
461 bool is_uid_matched(u64 uid) { 473 bool is_uid_matched(u64 uid) {
462 struct tag_serialnr nr; 474 struct tag_serialnr nr;
463 get_board_serial(&nr); 475 get_board_serial(&nr);
464 476
465 if (lower_32_bits(uid) == nr.low && 477 if (lower_32_bits(uid) == nr.low &&
466 upper_32_bits(uid) == nr.high) 478 upper_32_bits(uid) == nr.high)
467 return true; 479 return true;
468 480
469 return false; 481 return false;
470 } 482 }
471 483
472 static void secure_lockup(void) 484 static void secure_lockup(void)
473 { 485 {
474 if (is_imx8mq() && is_soc_rev(CHIP_REV_2_1) && 486 if (is_imx8mq() && is_soc_rev(CHIP_REV_2_1) &&
475 imx_hab_is_enabled() && !is_hdmi_fused()) { 487 imx_hab_is_enabled() && !is_hdmi_fused()) {
476 #ifdef CONFIG_SECURE_STICKY_BITS_LOCKUP 488 #ifdef CONFIG_SECURE_STICKY_BITS_LOCKUP
477 struct ocotp_regs *ocotp = (struct ocotp_regs *)OCOTP_BASE_ADDR; 489 struct ocotp_regs *ocotp = (struct ocotp_regs *)OCOTP_BASE_ADDR;
478 490
479 clock_enable(CCGR_OCOTP, 1); 491 clock_enable(CCGR_OCOTP, 1);
480 setbits_le32(&ocotp->sw_sticky, 0x6); /* Lock up field return and SRK revoke */ 492 setbits_le32(&ocotp->sw_sticky, 0x6); /* Lock up field return and SRK revoke */
481 writel(0x80000000, &ocotp->scs_set); /* Lock up SCS */ 493 writel(0x80000000, &ocotp->scs_set); /* Lock up SCS */
482 #else 494 #else
483 /* Check the Unique ID, if it is matched with UID config, then allow to leave sticky bits unlocked */ 495 /* Check the Unique ID, if it is matched with UID config, then allow to leave sticky bits unlocked */
484 if (!is_uid_matched(CONFIG_IMX_UNIQUE_ID)) 496 if (!is_uid_matched(CONFIG_IMX_UNIQUE_ID))
485 hang(); 497 hang();
486 #endif 498 #endif
487 } 499 }
488 } 500 }
489 #endif 501 #endif
490 502
491 int arch_cpu_init(void) 503 int arch_cpu_init(void)
492 { 504 {
493 struct ocotp_regs *ocotp = (struct ocotp_regs *)OCOTP_BASE_ADDR; 505 struct ocotp_regs *ocotp = (struct ocotp_regs *)OCOTP_BASE_ADDR;
494 /* 506 /*
495 * ROM might disable clock for SCTR, 507 * ROM might disable clock for SCTR,
496 * enable the clock before timer_init. 508 * enable the clock before timer_init.
497 */ 509 */
498 if (IS_ENABLED(CONFIG_SPL_BUILD)) 510 if (IS_ENABLED(CONFIG_SPL_BUILD))
499 clock_enable(CCGR_SCTR, 1); 511 clock_enable(CCGR_SCTR, 1);
500 /* 512 /*
501 * Init timer at very early state, because sscg pll setting 513 * Init timer at very early state, because sscg pll setting
502 * will use it 514 * will use it
503 */ 515 */
504 timer_init(); 516 timer_init();
505 517
506 if (IS_ENABLED(CONFIG_SPL_BUILD)) { 518 if (IS_ENABLED(CONFIG_SPL_BUILD)) {
507 clock_init(); 519 clock_init();
508 imx_set_wdog_powerdown(false); 520 imx_set_wdog_powerdown(false);
509 521
510 #if defined(CONFIG_IMX_HAB) && defined(CONFIG_IMX8MQ) 522 #if defined(CONFIG_IMX_HAB) && defined(CONFIG_IMX8MQ)
511 secure_lockup(); 523 secure_lockup();
512 #endif 524 #endif
513 if (is_imx8md() || is_imx8mmd() || is_imx8mmdl() || is_imx8mms() || is_imx8mmsl() || 525 if (is_imx8md() || is_imx8mmd() || is_imx8mmdl() || is_imx8mms() || is_imx8mmsl() ||
514 is_imx8mnd() || is_imx8mndl() || is_imx8mns() || is_imx8mnsl() || is_imx8mpd()) { 526 is_imx8mnd() || is_imx8mndl() || is_imx8mns() || is_imx8mnsl() || is_imx8mpd() ||
527 is_imx8mnud() || is_imx8mnus()) {
515 /* Power down cpu core 1, 2 and 3 for iMX8M Dual core or Single core */ 528 /* Power down cpu core 1, 2 and 3 for iMX8M Dual core or Single core */
516 struct pgc_reg *pgc_core1 = (struct pgc_reg *)(GPC_BASE_ADDR + 0x840); 529 struct pgc_reg *pgc_core1 = (struct pgc_reg *)(GPC_BASE_ADDR + 0x840);
517 struct pgc_reg *pgc_core2 = (struct pgc_reg *)(GPC_BASE_ADDR + 0x880); 530 struct pgc_reg *pgc_core2 = (struct pgc_reg *)(GPC_BASE_ADDR + 0x880);
518 struct pgc_reg *pgc_core3 = (struct pgc_reg *)(GPC_BASE_ADDR + 0x8C0); 531 struct pgc_reg *pgc_core3 = (struct pgc_reg *)(GPC_BASE_ADDR + 0x8C0);
519 struct gpc_reg *gpc = (struct gpc_reg *)GPC_BASE_ADDR; 532 struct gpc_reg *gpc = (struct gpc_reg *)GPC_BASE_ADDR;
520 533
521 writel(0x1, &pgc_core2->pgcr); 534 writel(0x1, &pgc_core2->pgcr);
522 writel(0x1, &pgc_core3->pgcr); 535 writel(0x1, &pgc_core3->pgcr);
523 if (is_imx8mms() || is_imx8mmsl() || is_imx8mns() || is_imx8mnsl()) { 536 if (is_imx8mms() || is_imx8mmsl() || is_imx8mns() || is_imx8mnsl() || is_imx8mnus()) {
524 writel(0x1, &pgc_core1->pgcr); 537 writel(0x1, &pgc_core1->pgcr);
525 writel(0xE, &gpc->cpu_pgc_dn_trg); 538 writel(0xE, &gpc->cpu_pgc_dn_trg);
526 } else { 539 } else {
527 writel(0xC, &gpc->cpu_pgc_dn_trg); 540 writel(0xC, &gpc->cpu_pgc_dn_trg);
528 } 541 }
529 } 542 }
530 } 543 }
531 544
532 #ifdef CONFIG_IMX_SEC_INIT 545 #ifdef CONFIG_IMX_SEC_INIT
533 /* Secure init function such RNG */ 546 /* Secure init function such RNG */
534 imx_sec_init(); 547 imx_sec_init();
535 #endif 548 #endif
536 #if defined(CONFIG_ANDROID_SUPPORT) 549 #if defined(CONFIG_ANDROID_SUPPORT)
537 /* Enable RTC */ 550 /* Enable RTC */
538 writel(0x21, 0x30370038); 551 writel(0x21, 0x30370038);
539 #endif 552 #endif
540 553
541 if (is_imx8mq()) { 554 if (is_imx8mq()) {
542 clock_enable(CCGR_OCOTP, 1); 555 clock_enable(CCGR_OCOTP, 1);
543 if (readl(&ocotp->ctrl) & 0x200) 556 if (readl(&ocotp->ctrl) & 0x200)
544 writel(0x200, &ocotp->ctrl_clr); 557 writel(0x200, &ocotp->ctrl_clr);
545 } 558 }
546 559
547 return 0; 560 return 0;
548 } 561 }
549 562
550 #if defined(CONFIG_IMX8MN) || defined(CONFIG_IMX8MP) 563 #if defined(CONFIG_IMX8MN) || defined(CONFIG_IMX8MP)
551 struct rom_api *g_rom_api = (struct rom_api *)0x980; 564 struct rom_api *g_rom_api = (struct rom_api *)0x980;
552 565
553 enum boot_device get_boot_device(void) 566 enum boot_device get_boot_device(void)
554 { 567 {
555 volatile gd_t *pgd = gd; 568 volatile gd_t *pgd = gd;
556 int ret; 569 int ret;
557 u32 boot; 570 u32 boot;
558 u16 boot_type; 571 u16 boot_type;
559 u8 boot_instance; 572 u8 boot_instance;
560 enum boot_device boot_dev = SD1_BOOT; 573 enum boot_device boot_dev = SD1_BOOT;
561 574
562 ret = g_rom_api->query_boot_infor(QUERY_BT_DEV, &boot, 575 ret = g_rom_api->query_boot_infor(QUERY_BT_DEV, &boot,
563 ((uintptr_t)&boot) ^ QUERY_BT_DEV); 576 ((uintptr_t)&boot) ^ QUERY_BT_DEV);
564 gd = pgd; 577 gd = pgd;
565 578
566 if (ret != ROM_API_OKAY) { 579 if (ret != ROM_API_OKAY) {
567 puts("ROMAPI: failure at query_boot_info\n"); 580 puts("ROMAPI: failure at query_boot_info\n");
568 return -1; 581 return -1;
569 } 582 }
570 583
571 boot_type = boot >> 16; 584 boot_type = boot >> 16;
572 boot_instance = (boot >> 8) & 0xff; 585 boot_instance = (boot >> 8) & 0xff;
573 586
574 switch (boot_type) { 587 switch (boot_type) {
575 case BT_DEV_TYPE_SD: 588 case BT_DEV_TYPE_SD:
576 boot_dev = boot_instance + SD1_BOOT; 589 boot_dev = boot_instance + SD1_BOOT;
577 break; 590 break;
578 case BT_DEV_TYPE_MMC: 591 case BT_DEV_TYPE_MMC:
579 boot_dev = boot_instance + MMC1_BOOT; 592 boot_dev = boot_instance + MMC1_BOOT;
580 break; 593 break;
581 case BT_DEV_TYPE_NAND: 594 case BT_DEV_TYPE_NAND:
582 boot_dev = NAND_BOOT; 595 boot_dev = NAND_BOOT;
583 break; 596 break;
584 case BT_DEV_TYPE_FLEXSPINOR: 597 case BT_DEV_TYPE_FLEXSPINOR:
585 boot_dev = QSPI_BOOT; 598 boot_dev = QSPI_BOOT;
586 break; 599 break;
587 case BT_DEV_TYPE_USB: 600 case BT_DEV_TYPE_USB:
588 boot_dev = USB_BOOT; 601 boot_dev = USB_BOOT;
589 break; 602 break;
590 default: 603 default:
591 break; 604 break;
592 } 605 }
593 606
594 return boot_dev; 607 return boot_dev;
595 } 608 }
596 #endif 609 #endif
597 610
598 bool is_usb_boot(void) 611 bool is_usb_boot(void)
599 { 612 {
600 return get_boot_device() == USB_BOOT; 613 return get_boot_device() == USB_BOOT;
601 } 614 }
602 #ifdef CONFIG_SERIAL_TAG 615 #ifdef CONFIG_SERIAL_TAG
603 void get_board_serial(struct tag_serialnr *serialnr) 616 void get_board_serial(struct tag_serialnr *serialnr)
604 { 617 {
605 struct ocotp_regs *ocotp = (struct ocotp_regs *)OCOTP_BASE_ADDR; 618 struct ocotp_regs *ocotp = (struct ocotp_regs *)OCOTP_BASE_ADDR;
606 struct fuse_bank *bank = &ocotp->bank[0]; 619 struct fuse_bank *bank = &ocotp->bank[0];
607 struct fuse_bank0_regs *fuse = 620 struct fuse_bank0_regs *fuse =
608 (struct fuse_bank0_regs *)bank->fuse_regs; 621 (struct fuse_bank0_regs *)bank->fuse_regs;
609 622
610 serialnr->low = fuse->uid_low; 623 serialnr->low = fuse->uid_low;
611 serialnr->high = fuse->uid_high; 624 serialnr->high = fuse->uid_high;
612 } 625 }
613 #endif 626 #endif
614 627
615 #ifdef CONFIG_OF_SYSTEM_SETUP 628 #ifdef CONFIG_OF_SYSTEM_SETUP
616 bool check_fdt_new_path(void *blob) 629 bool check_fdt_new_path(void *blob)
617 { 630 {
618 const char *soc_path = "/soc@0"; 631 const char *soc_path = "/soc@0";
619 int nodeoff; 632 int nodeoff;
620 633
621 nodeoff = fdt_path_offset(blob, soc_path); 634 nodeoff = fdt_path_offset(blob, soc_path);
622 if (nodeoff < 0) { 635 if (nodeoff < 0) {
623 return false; 636 return false;
624 } 637 }
625 638
626 return true; 639 return true;
627 } 640 }
628 641
629 static int disable_fdt_nodes(void *blob, const char *nodes_path[], int size_array) 642 static int disable_fdt_nodes(void *blob, const char *nodes_path[], int size_array)
630 { 643 {
631 int i = 0; 644 int i = 0;
632 int rc; 645 int rc;
633 int nodeoff; 646 int nodeoff;
634 const char *status = "disabled"; 647 const char *status = "disabled";
635 648
636 for (i = 0; i < size_array; i++) { 649 for (i = 0; i < size_array; i++) {
637 nodeoff = fdt_path_offset(blob, nodes_path[i]); 650 nodeoff = fdt_path_offset(blob, nodes_path[i]);
638 if (nodeoff < 0) 651 if (nodeoff < 0)
639 continue; /* Not found, skip it */ 652 continue; /* Not found, skip it */
640 653
641 printf("Found %s node\n", nodes_path[i]); 654 printf("Found %s node\n", nodes_path[i]);
642 655
643 add_status: 656 add_status:
644 rc = fdt_setprop(blob, nodeoff, "status", status, strlen(status) + 1); 657 rc = fdt_setprop(blob, nodeoff, "status", status, strlen(status) + 1);
645 if (rc) { 658 if (rc) {
646 if (rc == -FDT_ERR_NOSPACE) { 659 if (rc == -FDT_ERR_NOSPACE) {
647 rc = fdt_increase_size(blob, 512); 660 rc = fdt_increase_size(blob, 512);
648 if (!rc) 661 if (!rc)
649 goto add_status; 662 goto add_status;
650 } 663 }
651 printf("Unable to update property %s:%s, err=%s\n", 664 printf("Unable to update property %s:%s, err=%s\n",
652 nodes_path[i], "status", fdt_strerror(rc)); 665 nodes_path[i], "status", fdt_strerror(rc));
653 } else { 666 } else {
654 printf("Modify %s:%s disabled\n", 667 printf("Modify %s:%s disabled\n",
655 nodes_path[i], "status"); 668 nodes_path[i], "status");
656 } 669 }
657 } 670 }
658 671
659 return 0; 672 return 0;
660 } 673 }
661 674
662 #ifdef CONFIG_IMX8MQ 675 #ifdef CONFIG_IMX8MQ
663 bool check_dcss_fused(void) 676 bool check_dcss_fused(void)
664 { 677 {
665 struct ocotp_regs *ocotp = (struct ocotp_regs *)OCOTP_BASE_ADDR; 678 struct ocotp_regs *ocotp = (struct ocotp_regs *)OCOTP_BASE_ADDR;
666 struct fuse_bank *bank = &ocotp->bank[1]; 679 struct fuse_bank *bank = &ocotp->bank[1];
667 struct fuse_bank1_regs *fuse = 680 struct fuse_bank1_regs *fuse =
668 (struct fuse_bank1_regs *)bank->fuse_regs; 681 (struct fuse_bank1_regs *)bank->fuse_regs;
669 682
670 u32 value = readl(&fuse->tester4); 683 u32 value = readl(&fuse->tester4);
671 if (value & 0x4000000) 684 if (value & 0x4000000)
672 return true; 685 return true;
673 686
674 return false; 687 return false;
675 } 688 }
676 689
677 static int disable_mipi_dsi_nodes(void *blob) 690 static int disable_mipi_dsi_nodes(void *blob)
678 { 691 {
679 const char *nodes_path[] = { 692 const char *nodes_path[] = {
680 "/mipi_dsi@30A00000", 693 "/mipi_dsi@30A00000",
681 "/mipi_dsi_bridge@30A00000", 694 "/mipi_dsi_bridge@30A00000",
682 "/dsi_phy@30A00300", 695 "/dsi_phy@30A00300",
683 "/soc@0/bus@30800000/mipi_dsi@30a00000", 696 "/soc@0/bus@30800000/mipi_dsi@30a00000",
684 "/soc@0/bus@30800000/dphy@30a00300" 697 "/soc@0/bus@30800000/dphy@30a00300"
685 "/soc@0/bus@30800000/mipi-dsi@30a00000", 698 "/soc@0/bus@30800000/mipi-dsi@30a00000",
686 }; 699 };
687 700
688 return disable_fdt_nodes(blob, nodes_path, ARRAY_SIZE(nodes_path)); 701 return disable_fdt_nodes(blob, nodes_path, ARRAY_SIZE(nodes_path));
689 } 702 }
690 703
691 static int disable_dcss_nodes(void *blob) 704 static int disable_dcss_nodes(void *blob)
692 { 705 {
693 const char *nodes_path[] = { 706 const char *nodes_path[] = {
694 "/dcss@0x32e00000", 707 "/dcss@0x32e00000",
695 "/dcss@32e00000", 708 "/dcss@32e00000",
696 "/hdmi@32c00000", 709 "/hdmi@32c00000",
697 "/hdmi_cec@32c33800", 710 "/hdmi_cec@32c33800",
698 "/hdmi_drm@32c00000", 711 "/hdmi_drm@32c00000",
699 "/display-subsystem", 712 "/display-subsystem",
700 "/sound-hdmi", 713 "/sound-hdmi",
701 "/sound-hdmi-arc", 714 "/sound-hdmi-arc",
702 "/soc@0/bus@32c00000/display-controller@32e00000", 715 "/soc@0/bus@32c00000/display-controller@32e00000",
703 "/soc@0/bus@32c00000/hdmi@32c00000", 716 "/soc@0/bus@32c00000/hdmi@32c00000",
704 }; 717 };
705 718
706 return disable_fdt_nodes(blob, nodes_path, ARRAY_SIZE(nodes_path)); 719 return disable_fdt_nodes(blob, nodes_path, ARRAY_SIZE(nodes_path));
707 } 720 }
708 721
709 static int check_mipi_dsi_nodes(void *blob) 722 static int check_mipi_dsi_nodes(void *blob)
710 { 723 {
711 const char *lcdif_path[] = { 724 const char *lcdif_path[] = {
712 "/lcdif@30320000", 725 "/lcdif@30320000",
713 "/soc@0/bus@30000000/lcdif@30320000", 726 "/soc@0/bus@30000000/lcdif@30320000",
714 "/soc@0/bus@30000000/lcd-controller@30320000" 727 "/soc@0/bus@30000000/lcd-controller@30320000"
715 }; 728 };
716 const char *mipi_dsi_path[] = { 729 const char *mipi_dsi_path[] = {
717 "/mipi_dsi@30A00000", 730 "/mipi_dsi@30A00000",
718 "/soc@0/bus@30800000/mipi_dsi@30a00000" 731 "/soc@0/bus@30800000/mipi_dsi@30a00000"
719 }; 732 };
720 const char *lcdif_ep_path[] = { 733 const char *lcdif_ep_path[] = {
721 "/lcdif@30320000/port@0/mipi-dsi-endpoint", 734 "/lcdif@30320000/port@0/mipi-dsi-endpoint",
722 "/soc@0/bus@30000000/lcdif@30320000/port@0/endpoint", 735 "/soc@0/bus@30000000/lcdif@30320000/port@0/endpoint",
723 "/soc@0/bus@30000000/lcd-controller@30320000/port@0/endpoint" 736 "/soc@0/bus@30000000/lcd-controller@30320000/port@0/endpoint"
724 }; 737 };
725 const char *mipi_dsi_ep_path[] = { 738 const char *mipi_dsi_ep_path[] = {
726 "/mipi_dsi@30A00000/port@1/endpoint", 739 "/mipi_dsi@30A00000/port@1/endpoint",
727 "/soc@0/bus@30800000/mipi_dsi@30a00000/ports/port@0/endpoint", 740 "/soc@0/bus@30800000/mipi_dsi@30a00000/ports/port@0/endpoint",
728 "/soc@0/bus@30800000/mipi-dsi@30a00000/ports/port@0/endpoint@0" 741 "/soc@0/bus@30800000/mipi-dsi@30a00000/ports/port@0/endpoint@0"
729 }; 742 };
730 743
731 int nodeoff; 744 int nodeoff;
732 bool new_path = check_fdt_new_path(blob); 745 bool new_path = check_fdt_new_path(blob);
733 int i = new_path? 1 : 0; 746 int i = new_path? 1 : 0;
734 747
735 nodeoff = fdt_path_offset(blob, lcdif_path[i]); 748 nodeoff = fdt_path_offset(blob, lcdif_path[i]);
736 if (nodeoff < 0 || !fdtdec_get_is_enabled(blob, nodeoff)) { 749 if (nodeoff < 0 || !fdtdec_get_is_enabled(blob, nodeoff)) {
737 /* If can't find lcdif node or lcdif node is disabled, then disable all mipi dsi, 750 /* If can't find lcdif node or lcdif node is disabled, then disable all mipi dsi,
738 since they only can input from DCSS */ 751 since they only can input from DCSS */
739 return disable_mipi_dsi_nodes(blob); 752 return disable_mipi_dsi_nodes(blob);
740 } 753 }
741 754
742 nodeoff = fdt_path_offset(blob, mipi_dsi_path[i]); 755 nodeoff = fdt_path_offset(blob, mipi_dsi_path[i]);
743 if (nodeoff < 0 || !fdtdec_get_is_enabled(blob, nodeoff)) 756 if (nodeoff < 0 || !fdtdec_get_is_enabled(blob, nodeoff))
744 return 0; 757 return 0;
745 758
746 nodeoff = fdt_path_offset(blob, lcdif_ep_path[i]); 759 nodeoff = fdt_path_offset(blob, lcdif_ep_path[i]);
747 if (nodeoff < 0) { 760 if (nodeoff < 0) {
748 /* If can't find lcdif endpoint, then disable all mipi dsi, 761 /* If can't find lcdif endpoint, then disable all mipi dsi,
749 since they only can input from DCSS */ 762 since they only can input from DCSS */
750 return disable_mipi_dsi_nodes(blob); 763 return disable_mipi_dsi_nodes(blob);
751 } else { 764 } else {
752 int lookup_node; 765 int lookup_node;
753 lookup_node = fdtdec_lookup_phandle(blob, nodeoff, "remote-endpoint"); 766 lookup_node = fdtdec_lookup_phandle(blob, nodeoff, "remote-endpoint");
754 nodeoff = fdt_path_offset(blob, mipi_dsi_ep_path[i]); 767 nodeoff = fdt_path_offset(blob, mipi_dsi_ep_path[i]);
755 768
756 if (nodeoff >0 && nodeoff == lookup_node) 769 if (nodeoff >0 && nodeoff == lookup_node)
757 return 0; 770 return 0;
758 771
759 return disable_mipi_dsi_nodes(blob); 772 return disable_mipi_dsi_nodes(blob);
760 } 773 }
761 774
762 } 775 }
763 #endif 776 #endif
764 777
765 void board_quiesce_devices(void) 778 void board_quiesce_devices(void)
766 { 779 {
767 #ifdef CONFIG_USB_DWC3 780 #ifdef CONFIG_USB_DWC3
768 if (is_usb_boot()) 781 if (is_usb_boot())
769 disconnect_from_pc(); 782 disconnect_from_pc();
770 #endif 783 #endif
771 } 784 }
772 785
773 int disable_vpu_nodes(void *blob) 786 int disable_vpu_nodes(void *blob)
774 { 787 {
775 const char *nodes_path_8mq[] = { 788 const char *nodes_path_8mq[] = {
776 "/vpu@38300000", 789 "/vpu@38300000",
777 "/soc@0/vpu@38300000" 790 "/soc@0/vpu@38300000"
778 }; 791 };
779 792
780 const char *nodes_path_8mm[] = { 793 const char *nodes_path_8mm[] = {
781 "/vpu_g1@38300000", 794 "/vpu_g1@38300000",
782 "/vpu_g2@38310000", 795 "/vpu_g2@38310000",
783 "/vpu_h1@38320000" 796 "/vpu_h1@38320000"
784 }; 797 };
785 798
786 const char *nodes_path_8mp[] = { 799 const char *nodes_path_8mp[] = {
787 "/vpu_g1@38300000", 800 "/vpu_g1@38300000",
788 "/vpu_g2@38310000", 801 "/vpu_g2@38310000",
789 "/vpu_vc8000e@38320000" 802 "/vpu_vc8000e@38320000"
790 }; 803 };
791 804
792 if (is_imx8mq()) 805 if (is_imx8mq())
793 return disable_fdt_nodes(blob, nodes_path_8mq, ARRAY_SIZE(nodes_path_8mq)); 806 return disable_fdt_nodes(blob, nodes_path_8mq, ARRAY_SIZE(nodes_path_8mq));
794 else if (is_imx8mm()) 807 else if (is_imx8mm())
795 return disable_fdt_nodes(blob, nodes_path_8mm, ARRAY_SIZE(nodes_path_8mm)); 808 return disable_fdt_nodes(blob, nodes_path_8mm, ARRAY_SIZE(nodes_path_8mm));
796 else if (is_imx8mp()) 809 else if (is_imx8mp())
797 return disable_fdt_nodes(blob, nodes_path_8mp, ARRAY_SIZE(nodes_path_8mp)); 810 return disable_fdt_nodes(blob, nodes_path_8mp, ARRAY_SIZE(nodes_path_8mp));
798 else 811 else
799 return -EPERM; 812 return -EPERM;
800 813
801 } 814 }
802 815
803 #ifdef CONFIG_IMX8MN_LOW_DRIVE_MODE 816 #ifdef CONFIG_IMX8MN_LOW_DRIVE_MODE
804 static int low_drive_gpu_freq(void *blob) 817 static int low_drive_gpu_freq(void *blob)
805 { 818 {
806 const char *nodes_path_8mn[] = { 819 const char *nodes_path_8mn[] = {
807 "/gpu@38000000", 820 "/gpu@38000000",
808 "/soc@0/gpu@38000000" 821 "/soc@0/gpu@38000000"
809 }; 822 };
810 823
811 int nodeoff, cnt, i; 824 int nodeoff, cnt, i;
812 u32 assignedclks[7]; 825 u32 assignedclks[7];
813 826
814 nodeoff = fdt_path_offset(blob, nodes_path_8mn[0]); 827 nodeoff = fdt_path_offset(blob, nodes_path_8mn[0]);
815 if (nodeoff < 0) 828 if (nodeoff < 0)
816 return nodeoff; 829 return nodeoff;
817 830
818 cnt = fdtdec_get_int_array_count(blob, nodeoff, "assigned-clock-rates", assignedclks, 7); 831 cnt = fdtdec_get_int_array_count(blob, nodeoff, "assigned-clock-rates", assignedclks, 7);
819 if (cnt < 0) 832 if (cnt < 0)
820 return cnt; 833 return cnt;
821 834
822 if (cnt != 7) 835 if (cnt != 7)
823 printf("Warning: %s, assigned-clock-rates count %d\n", nodes_path_8mn[0], cnt); 836 printf("Warning: %s, assigned-clock-rates count %d\n", nodes_path_8mn[0], cnt);
824 837
825 assignedclks[cnt - 1] = 200000000; 838 assignedclks[cnt - 1] = 200000000;
826 assignedclks[cnt - 2] = 200000000; 839 assignedclks[cnt - 2] = 200000000;
827 840
828 for (i = 0; i < cnt; i++) { 841 for (i = 0; i < cnt; i++) {
829 debug("<%u>, ", assignedclks[i]); 842 debug("<%u>, ", assignedclks[i]);
830 assignedclks[i] = cpu_to_fdt32(assignedclks[i]); 843 assignedclks[i] = cpu_to_fdt32(assignedclks[i]);
831 } 844 }
832 debug("\n"); 845 debug("\n");
833 846
834 return fdt_setprop(blob, nodeoff, "assigned-clock-rates", &assignedclks, sizeof(assignedclks)); 847 return fdt_setprop(blob, nodeoff, "assigned-clock-rates", &assignedclks, sizeof(assignedclks));
835 } 848 }
836 #endif 849 #endif
837 850
838 int disable_gpu_nodes(void *blob) 851 int disable_gpu_nodes(void *blob)
839 { 852 {
840 const char *nodes_path_8mn[] = { 853 const char *nodes_path_8mn[] = {
841 "/gpu@38000000", 854 "/gpu@38000000",
842 "/soc@/gpu@38000000" 855 "/soc@/gpu@38000000"
843 }; 856 };
844 857
845 return disable_fdt_nodes(blob, nodes_path_8mn, ARRAY_SIZE(nodes_path_8mn)); 858 return disable_fdt_nodes(blob, nodes_path_8mn, ARRAY_SIZE(nodes_path_8mn));
846 } 859 }
847 860
848 int disable_npu_nodes(void *blob) 861 int disable_npu_nodes(void *blob)
849 { 862 {
850 const char *nodes_path_8mp[] = { 863 const char *nodes_path_8mp[] = {
851 "/vipsi@38500000" 864 "/vipsi@38500000"
852 }; 865 };
853 866
854 return disable_fdt_nodes(blob, nodes_path_8mp, ARRAY_SIZE(nodes_path_8mp)); 867 return disable_fdt_nodes(blob, nodes_path_8mp, ARRAY_SIZE(nodes_path_8mp));
855 } 868 }
856 869
857 int disable_isp_nodes(void *blob) 870 int disable_isp_nodes(void *blob)
858 { 871 {
859 const char *nodes_path_8mp[] = { 872 const char *nodes_path_8mp[] = {
860 "/soc@0/bus@32c00000/camera/isp@32e10000", 873 "/soc@0/bus@32c00000/camera/isp@32e10000",
861 "/soc@0/bus@32c00000/camera/isp@32e20000" 874 "/soc@0/bus@32c00000/camera/isp@32e20000"
862 }; 875 };
863 876
864 return disable_fdt_nodes(blob, nodes_path_8mp, ARRAY_SIZE(nodes_path_8mp)); 877 return disable_fdt_nodes(blob, nodes_path_8mp, ARRAY_SIZE(nodes_path_8mp));
865 } 878 }
866 879
867 int disable_dsp_nodes(void *blob) 880 int disable_dsp_nodes(void *blob)
868 { 881 {
869 const char *nodes_path_8mp[] = { 882 const char *nodes_path_8mp[] = {
870 "/dsp@3b6e8000" 883 "/dsp@3b6e8000"
871 }; 884 };
872 885
873 return disable_fdt_nodes(blob, nodes_path_8mp, ARRAY_SIZE(nodes_path_8mp)); 886 return disable_fdt_nodes(blob, nodes_path_8mp, ARRAY_SIZE(nodes_path_8mp));
874 } 887 }
875 888
876 static int disable_cpu_nodes(void *blob, u32 disabled_cores) 889 static int disable_cpu_nodes(void *blob, u32 disabled_cores)
877 { 890 {
878 const char *nodes_path[] = { 891 const char *nodes_path[] = {
879 "/cpus/cpu@1", 892 "/cpus/cpu@1",
880 "/cpus/cpu@2", 893 "/cpus/cpu@2",
881 "/cpus/cpu@3", 894 "/cpus/cpu@3",
882 }; 895 };
883 896
884 u32 i = 0; 897 u32 i = 0;
885 int rc; 898 int rc;
886 int nodeoff; 899 int nodeoff;
887 900
888 if (disabled_cores > 3) 901 if (disabled_cores > 3)
889 return -EINVAL; 902 return -EINVAL;
890 903
891 i = 3 - disabled_cores; 904 i = 3 - disabled_cores;
892 905
893 for (; i < 3; i++) { 906 for (; i < 3; i++) {
894 nodeoff = fdt_path_offset(blob, nodes_path[i]); 907 nodeoff = fdt_path_offset(blob, nodes_path[i]);
895 if (nodeoff < 0) 908 if (nodeoff < 0)
896 continue; /* Not found, skip it */ 909 continue; /* Not found, skip it */
897 910
898 printf("Found %s node\n", nodes_path[i]); 911 printf("Found %s node\n", nodes_path[i]);
899 912
900 rc = fdt_del_node(blob, nodeoff); 913 rc = fdt_del_node(blob, nodeoff);
901 if (rc < 0) { 914 if (rc < 0) {
902 printf("Unable to delete node %s, err=%s\n", 915 printf("Unable to delete node %s, err=%s\n",
903 nodes_path[i], fdt_strerror(rc)); 916 nodes_path[i], fdt_strerror(rc));
904 } else { 917 } else {
905 printf("Delete node %s\n", nodes_path[i]); 918 printf("Delete node %s\n", nodes_path[i]);
906 } 919 }
907 } 920 }
908 921
909 return 0; 922 return 0;
910 } 923 }
911 924
912 int ft_system_setup(void *blob, bd_t *bd) 925 int ft_system_setup(void *blob, bd_t *bd)
913 { 926 {
914 #ifdef CONFIG_IMX8MQ 927 #ifdef CONFIG_IMX8MQ
915 int i = 0; 928 int i = 0;
916 int rc; 929 int rc;
917 int nodeoff; 930 int nodeoff;
918 931
919 if (get_boot_device() == USB_BOOT) { 932 if (get_boot_device() == USB_BOOT) {
920 933
921 disable_dcss_nodes(blob); 934 disable_dcss_nodes(blob);
922 935
923 bool new_path = check_fdt_new_path(blob); 936 bool new_path = check_fdt_new_path(blob);
924 int v = new_path? 1 : 0; 937 int v = new_path? 1 : 0;
925 const char *usb_dwc3_path[] = { 938 const char *usb_dwc3_path[] = {
926 "/usb@38100000/dwc3", 939 "/usb@38100000/dwc3",
927 "/soc@0/usb@38100000" 940 "/soc@0/usb@38100000"
928 }; 941 };
929 942
930 nodeoff = fdt_path_offset(blob, usb_dwc3_path[v]); 943 nodeoff = fdt_path_offset(blob, usb_dwc3_path[v]);
931 if (nodeoff >= 0) { 944 if (nodeoff >= 0) {
932 const char *speed = "high-speed"; 945 const char *speed = "high-speed";
933 printf("Found %s node\n", usb_dwc3_path[v]); 946 printf("Found %s node\n", usb_dwc3_path[v]);
934 947
935 usb_modify_speed: 948 usb_modify_speed:
936 949
937 rc = fdt_setprop(blob, nodeoff, "maximum-speed", speed, strlen(speed) + 1); 950 rc = fdt_setprop(blob, nodeoff, "maximum-speed", speed, strlen(speed) + 1);
938 if (rc) { 951 if (rc) {
939 if (rc == -FDT_ERR_NOSPACE) { 952 if (rc == -FDT_ERR_NOSPACE) {
940 rc = fdt_increase_size(blob, 512); 953 rc = fdt_increase_size(blob, 512);
941 if (!rc) 954 if (!rc)
942 goto usb_modify_speed; 955 goto usb_modify_speed;
943 } 956 }
944 printf("Unable to set property %s:%s, err=%s\n", 957 printf("Unable to set property %s:%s, err=%s\n",
945 usb_dwc3_path[v], "maximum-speed", fdt_strerror(rc)); 958 usb_dwc3_path[v], "maximum-speed", fdt_strerror(rc));
946 } else { 959 } else {
947 printf("Modify %s:%s = %s\n", 960 printf("Modify %s:%s = %s\n",
948 usb_dwc3_path[v], "maximum-speed", speed); 961 usb_dwc3_path[v], "maximum-speed", speed);
949 } 962 }
950 }else { 963 }else {
951 printf("Can't found %s node\n", usb_dwc3_path[v]); 964 printf("Can't found %s node\n", usb_dwc3_path[v]);
952 } 965 }
953 } 966 }
954 967
955 /* Disable the CPU idle for A0 chip since the HW does not support it */ 968 /* Disable the CPU idle for A0 chip since the HW does not support it */
956 if (is_soc_rev(CHIP_REV_1_0)) { 969 if (is_soc_rev(CHIP_REV_1_0)) {
957 static const char * const nodes_path[] = { 970 static const char * const nodes_path[] = {
958 "/cpus/cpu@0", 971 "/cpus/cpu@0",
959 "/cpus/cpu@1", 972 "/cpus/cpu@1",
960 "/cpus/cpu@2", 973 "/cpus/cpu@2",
961 "/cpus/cpu@3", 974 "/cpus/cpu@3",
962 }; 975 };
963 976
964 for (i = 0; i < ARRAY_SIZE(nodes_path); i++) { 977 for (i = 0; i < ARRAY_SIZE(nodes_path); i++) {
965 nodeoff = fdt_path_offset(blob, nodes_path[i]); 978 nodeoff = fdt_path_offset(blob, nodes_path[i]);
966 if (nodeoff < 0) 979 if (nodeoff < 0)
967 continue; /* Not found, skip it */ 980 continue; /* Not found, skip it */
968 981
969 printf("Found %s node\n", nodes_path[i]); 982 printf("Found %s node\n", nodes_path[i]);
970 983
971 rc = fdt_delprop(blob, nodeoff, "cpu-idle-states"); 984 rc = fdt_delprop(blob, nodeoff, "cpu-idle-states");
972 if (rc) { 985 if (rc) {
973 printf("Unable to update property %s:%s, err=%s\n", 986 printf("Unable to update property %s:%s, err=%s\n",
974 nodes_path[i], "status", fdt_strerror(rc)); 987 nodes_path[i], "status", fdt_strerror(rc));
975 return rc; 988 return rc;
976 } 989 }
977 990
978 printf("Remove %s:%s\n", nodes_path[i], 991 printf("Remove %s:%s\n", nodes_path[i],
979 "cpu-idle-states"); 992 "cpu-idle-states");
980 } 993 }
981 } 994 }
982 995
983 if (is_imx8mql()) { 996 if (is_imx8mql()) {
984 disable_vpu_nodes(blob); 997 disable_vpu_nodes(blob);
985 if (check_dcss_fused()) { 998 if (check_dcss_fused()) {
986 printf("DCSS is fused\n"); 999 printf("DCSS is fused\n");
987 disable_dcss_nodes(blob); 1000 disable_dcss_nodes(blob);
988 check_mipi_dsi_nodes(blob); 1001 check_mipi_dsi_nodes(blob);
989 } 1002 }
990 } 1003 }
991 1004
992 if (is_imx8md()) 1005 if (is_imx8md())
993 disable_cpu_nodes(blob, 2); 1006 disable_cpu_nodes(blob, 2);
994 1007
995 #elif defined(CONFIG_IMX8MM) 1008 #elif defined(CONFIG_IMX8MM)
996 if (is_imx8mml() || is_imx8mmdl() || is_imx8mmsl()) 1009 if (is_imx8mml() || is_imx8mmdl() || is_imx8mmsl())
997 disable_vpu_nodes(blob); 1010 disable_vpu_nodes(blob);
998 1011
999 if (is_imx8mmd() || is_imx8mmdl()) 1012 if (is_imx8mmd() || is_imx8mmdl())
1000 disable_cpu_nodes(blob, 2); 1013 disable_cpu_nodes(blob, 2);
1001 else if (is_imx8mms() || is_imx8mmsl()) 1014 else if (is_imx8mms() || is_imx8mmsl())
1002 disable_cpu_nodes(blob, 3); 1015 disable_cpu_nodes(blob, 3);
1003 1016
1004 #elif defined(CONFIG_IMX8MN) 1017 #elif defined(CONFIG_IMX8MN)
1005 if (is_imx8mnl() || is_imx8mndl() || is_imx8mnsl()) 1018 if (is_imx8mnl() || is_imx8mndl() || is_imx8mnsl())
1006 disable_gpu_nodes(blob); 1019 disable_gpu_nodes(blob);
1007 #ifdef CONFIG_IMX8MN_LOW_DRIVE_MODE 1020 #ifdef CONFIG_IMX8MN_LOW_DRIVE_MODE
1008 else { 1021 else {
1009 int ldm_gpu = low_drive_gpu_freq(blob); 1022 int ldm_gpu = low_drive_gpu_freq(blob);
1010 if (ldm_gpu < 0) 1023 if (ldm_gpu < 0)
1011 printf("Update GPU node assigned-clock-rates failed\n"); 1024 printf("Update GPU node assigned-clock-rates failed\n");
1012 else 1025 else
1013 printf("Update GPU node assigned-clock-rates ok\n"); 1026 printf("Update GPU node assigned-clock-rates ok\n");
1014 } 1027 }
1015 #endif 1028 #endif
1016 1029
1017 if (is_imx8mnd() || is_imx8mndl()) 1030 if (is_imx8mnd() || is_imx8mndl() || is_imx8mnud())
1018 disable_cpu_nodes(blob, 2); 1031 disable_cpu_nodes(blob, 2);
1019 else if (is_imx8mns() || is_imx8mnsl()) 1032 else if (is_imx8mns() || is_imx8mnsl() || is_imx8mnus())
1020 disable_cpu_nodes(blob, 3); 1033 disable_cpu_nodes(blob, 3);
1021 1034
1022 #elif defined(CONFIG_IMX8MP) 1035 #elif defined(CONFIG_IMX8MP)
1023 if (is_imx8mpl()) 1036 if (is_imx8mpl())
1024 disable_vpu_nodes(blob); 1037 disable_vpu_nodes(blob);
1025 1038
1026 if (is_imx8mpl() || is_imx8mp6()) 1039 if (is_imx8mpl() || is_imx8mp6())
1027 disable_npu_nodes(blob); 1040 disable_npu_nodes(blob);
1028 1041
1029 if (is_imx8mpl()) 1042 if (is_imx8mpl())
1030 disable_isp_nodes(blob); 1043 disable_isp_nodes(blob);
1031 1044
1032 if (is_imx8mpl() || is_imx8mp6()) 1045 if (is_imx8mpl() || is_imx8mp6())
1033 disable_dsp_nodes(blob); 1046 disable_dsp_nodes(blob);
1034 1047
1035 if (is_imx8mpd()) 1048 if (is_imx8mpd())
1036 disable_cpu_nodes(blob, 2); 1049 disable_cpu_nodes(blob, 2);
1037 #endif 1050 #endif
1038 1051
1039 return ft_add_optee_node(blob, bd); 1052 return ft_add_optee_node(blob, bd);
1040 } 1053 }
1041 #endif 1054 #endif
1042 1055
1043 #if defined(CONFIG_SPL_BUILD) || !defined(CONFIG_SYSRESET) 1056 #if defined(CONFIG_SPL_BUILD) || !defined(CONFIG_SYSRESET)
1044 void reset_cpu(ulong addr) 1057 void reset_cpu(ulong addr)
1045 { 1058 {
1046 struct watchdog_regs *wdog = (struct watchdog_regs *)addr; 1059 struct watchdog_regs *wdog = (struct watchdog_regs *)addr;
1047 1060
1048 if (!addr) 1061 if (!addr)
1049 wdog = (struct watchdog_regs *)WDOG1_BASE_ADDR; 1062 wdog = (struct watchdog_regs *)WDOG1_BASE_ADDR;
1050 1063
1051 /* Clear WDA to trigger WDOG_B immediately */ 1064 /* Clear WDA to trigger WDOG_B immediately */
1052 writew((SET_WCR_WT(1) | WCR_WDT | WCR_WDE | WCR_SRS), &wdog->wcr); 1065 writew((SET_WCR_WT(1) | WCR_WDT | WCR_WDE | WCR_SRS), &wdog->wcr);
1053 1066
1054 while (1) { 1067 while (1) {
1055 /* 1068 /*
1056 * spin for 1 second before timeout reset 1069 * spin for 1 second before timeout reset
1057 */ 1070 */
1058 } 1071 }
1059 } 1072 }
1060 #endif 1073 #endif
1061 1074
1062 #if defined(CONFIG_ARCH_MISC_INIT) 1075 #if defined(CONFIG_ARCH_MISC_INIT)
1063 #define FSL_SIP_BUILDINFO 0xC2000003 1076 #define FSL_SIP_BUILDINFO 0xC2000003
1064 #define FSL_SIP_BUILDINFO_GET_COMMITHASH 0x00 1077 #define FSL_SIP_BUILDINFO_GET_COMMITHASH 0x00
1065 static void acquire_buildinfo(void) 1078 static void acquire_buildinfo(void)
1066 { 1079 {
1067 uint64_t atf_commit = 0; 1080 uint64_t atf_commit = 0;
1068 1081
1069 /* Get ARM Trusted Firmware commit id */ 1082 /* Get ARM Trusted Firmware commit id */
1070 atf_commit = call_imx_sip(FSL_SIP_BUILDINFO, 1083 atf_commit = call_imx_sip(FSL_SIP_BUILDINFO,
1071 FSL_SIP_BUILDINFO_GET_COMMITHASH, 0, 0, 0); 1084 FSL_SIP_BUILDINFO_GET_COMMITHASH, 0, 0, 0);
1072 if (atf_commit == 0xffffffff) { 1085 if (atf_commit == 0xffffffff) {
1073 debug("ATF does not support build info\n"); 1086 debug("ATF does not support build info\n");
1074 atf_commit = 0x30; /* Display 0, 0 ascii is 0x30 */ 1087 atf_commit = 0x30; /* Display 0, 0 ascii is 0x30 */
1075 } 1088 }
1076 1089
1077 printf("\n BuildInfo:\n - ATF %s\n - %s\n\n", (char *)&atf_commit, 1090 printf("\n BuildInfo:\n - ATF %s\n - %s\n\n", (char *)&atf_commit,
1078 U_BOOT_VERSION); 1091 U_BOOT_VERSION);
1079 } 1092 }
1080 1093
1081 int arch_misc_init(void) 1094 int arch_misc_init(void)
1082 { 1095 {
1083 acquire_buildinfo(); 1096 acquire_buildinfo();
1084 1097
1085 return 0; 1098 return 0;
1086 } 1099 }
1087 #endif 1100 #endif
1088 1101
1089 #define FSL_SIP_GPC 0xC2000000 1102 #define FSL_SIP_GPC 0xC2000000
1090 #define FSL_SIP_CONFIG_GPC_PM_DOMAIN 0x03 1103 #define FSL_SIP_CONFIG_GPC_PM_DOMAIN 0x03
1091 1104
1092 #ifdef CONFIG_SPL_BUILD 1105 #ifdef CONFIG_SPL_BUILD
1093 static uint32_t gpc_pu_m_core_offset[11] = { 1106 static uint32_t gpc_pu_m_core_offset[11] = {
1094 0xc00, 0xc40, 0xc80, 0xcc0, 1107 0xc00, 0xc40, 0xc80, 0xcc0,
1095 0xdc0, 0xe00, 0xe40, 0xe80, 1108 0xdc0, 0xe00, 0xe40, 0xe80,
1096 0xec0, 0xf00, 0xf40, 1109 0xec0, 0xf00, 0xf40,
1097 }; 1110 };
1098 1111
1099 #define PGC_PCR 0 1112 #define PGC_PCR 0
1100 1113
1101 void imx_gpc_set_m_core_pgc(unsigned int offset, bool pdn) 1114 void imx_gpc_set_m_core_pgc(unsigned int offset, bool pdn)
1102 { 1115 {
1103 uint32_t val; 1116 uint32_t val;
1104 uintptr_t reg = GPC_BASE_ADDR + offset; 1117 uintptr_t reg = GPC_BASE_ADDR + offset;
1105 1118
1106 val = readl(reg); 1119 val = readl(reg);
1107 val &= ~(0x1 << PGC_PCR); 1120 val &= ~(0x1 << PGC_PCR);
1108 1121
1109 if(pdn) 1122 if(pdn)
1110 val |= 0x1 << PGC_PCR; 1123 val |= 0x1 << PGC_PCR;
1111 writel(val, reg); 1124 writel(val, reg);
1112 } 1125 }
1113 1126
1114 void imx8m_usb_power_domain(uint32_t domain_id, bool on) 1127 void imx8m_usb_power_domain(uint32_t domain_id, bool on)
1115 { 1128 {
1116 uint32_t val; 1129 uint32_t val;
1117 uintptr_t reg; 1130 uintptr_t reg;
1118 1131
1119 imx_gpc_set_m_core_pgc(gpc_pu_m_core_offset[domain_id], true); 1132 imx_gpc_set_m_core_pgc(gpc_pu_m_core_offset[domain_id], true);
1120 1133
1121 reg = GPC_BASE_ADDR + (on ? 0xf8 : 0x104); 1134 reg = GPC_BASE_ADDR + (on ? 0xf8 : 0x104);
1122 val = 1 << (domain_id > 3 ? (domain_id + 3) : domain_id); 1135 val = 1 << (domain_id > 3 ? (domain_id + 3) : domain_id);
1123 writel(val, reg); 1136 writel(val, reg);
1124 while (readl(reg) & val) 1137 while (readl(reg) & val)
1125 ; 1138 ;
1126 imx_gpc_set_m_core_pgc(gpc_pu_m_core_offset[domain_id], false); 1139 imx_gpc_set_m_core_pgc(gpc_pu_m_core_offset[domain_id], false);
1127 } 1140 }
1128 #endif 1141 #endif
1129 1142
1130 int imx8m_usb_power(int usb_id, bool on) 1143 int imx8m_usb_power(int usb_id, bool on)
1131 { 1144 {
1132 if (usb_id > 1) 1145 if (usb_id > 1)
1133 return -EINVAL; 1146 return -EINVAL;
1134 1147
1135 #ifdef CONFIG_SPL_BUILD 1148 #ifdef CONFIG_SPL_BUILD
1136 imx8m_usb_power_domain(2 + usb_id, on); 1149 imx8m_usb_power_domain(2 + usb_id, on);
1137 #else 1150 #else
1138 unsigned long ret; 1151 unsigned long ret;
1139 ret = call_imx_sip(FSL_SIP_GPC, 1152 ret = call_imx_sip(FSL_SIP_GPC,
1140 FSL_SIP_CONFIG_GPC_PM_DOMAIN, 2 + usb_id, on, 0); 1153 FSL_SIP_CONFIG_GPC_PM_DOMAIN, 2 + usb_id, on, 0);
1141 if (ret) 1154 if (ret)
1142 return -EPERM; 1155 return -EPERM;
1143 #endif 1156 #endif
1144 1157
1145 return 0; 1158 return 0;
1146 } 1159 }
1147 1160
1148 void nxp_tmu_arch_init(void *reg_base) 1161 void nxp_tmu_arch_init(void *reg_base)
1149 { 1162 {
1150 if (is_imx8mm() || is_imx8mn()) { 1163 if (is_imx8mm() || is_imx8mn()) {
1151 /* Load TCALIV and TASR from fuses */ 1164 /* Load TCALIV and TASR from fuses */
1152 struct ocotp_regs *ocotp = (struct ocotp_regs *)OCOTP_BASE_ADDR; 1165 struct ocotp_regs *ocotp = (struct ocotp_regs *)OCOTP_BASE_ADDR;
1153 struct fuse_bank *bank = &ocotp->bank[3]; 1166 struct fuse_bank *bank = &ocotp->bank[3];
1154 struct fuse_bank3_regs *fuse = 1167 struct fuse_bank3_regs *fuse =
1155 (struct fuse_bank3_regs *)bank->fuse_regs; 1168 (struct fuse_bank3_regs *)bank->fuse_regs;
1156 1169
1157 u32 tca_rt, tca_hr, tca_en; 1170 u32 tca_rt, tca_hr, tca_en;
1158 u32 buf_vref, buf_slope; 1171 u32 buf_vref, buf_slope;
1159 1172
1160 tca_rt = fuse->ana0 & 0xFF; 1173 tca_rt = fuse->ana0 & 0xFF;
1161 tca_hr = (fuse->ana0 & 0xFF00) >> 8; 1174 tca_hr = (fuse->ana0 & 0xFF00) >> 8;
1162 tca_en = (fuse->ana0 & 0x2000000) >> 25; 1175 tca_en = (fuse->ana0 & 0x2000000) >> 25;
1163 1176
1164 buf_vref = (fuse->ana0 & 0x1F00000) >> 20; 1177 buf_vref = (fuse->ana0 & 0x1F00000) >> 20;
1165 buf_slope = (fuse->ana0 & 0xF0000) >> 16; 1178 buf_slope = (fuse->ana0 & 0xF0000) >> 16;
1166 1179
1167 writel(buf_vref | (buf_slope << 16), (ulong)reg_base + 0x28); 1180 writel(buf_vref | (buf_slope << 16), (ulong)reg_base + 0x28);
1168 writel((tca_en << 31) |(tca_hr <<16) | tca_rt, (ulong)reg_base + 0x30); 1181 writel((tca_en << 31) |(tca_hr <<16) | tca_rt, (ulong)reg_base + 0x30);
1169 } 1182 }
1170 #ifdef CONFIG_IMX8MP 1183 #ifdef CONFIG_IMX8MP
1171 /* Load TCALIV0/1/m40 and TRIM from fuses */ 1184 /* Load TCALIV0/1/m40 and TRIM from fuses */
1172 struct ocotp_regs *ocotp = (struct ocotp_regs *)OCOTP_BASE_ADDR; 1185 struct ocotp_regs *ocotp = (struct ocotp_regs *)OCOTP_BASE_ADDR;
1173 struct fuse_bank *bank = &ocotp->bank[38]; 1186 struct fuse_bank *bank = &ocotp->bank[38];
1174 struct fuse_bank38_regs *fuse = 1187 struct fuse_bank38_regs *fuse =
1175 (struct fuse_bank38_regs *)bank->fuse_regs; 1188 (struct fuse_bank38_regs *)bank->fuse_regs;
1176 1189
1177 struct fuse_bank *bank2 = &ocotp->bank[39]; 1190 struct fuse_bank *bank2 = &ocotp->bank[39];
1178 struct fuse_bank39_regs *fuse2 = 1191 struct fuse_bank39_regs *fuse2 =
1179 (struct fuse_bank39_regs *)bank2->fuse_regs; 1192 (struct fuse_bank39_regs *)bank2->fuse_regs;
1180 1193
1181 u32 buf_vref, buf_slope, bjt_cur, vlsb, bgr; 1194 u32 buf_vref, buf_slope, bjt_cur, vlsb, bgr;
1182 u32 reg; 1195 u32 reg;
1183 u32 tca40[2], tca25[2], tca105[2]; 1196 u32 tca40[2], tca25[2], tca105[2];
1184 1197
1185 /* For blank sample */ 1198 /* For blank sample */
1186 if (!fuse->ana_trim2 && !fuse->ana_trim3 && 1199 if (!fuse->ana_trim2 && !fuse->ana_trim3 &&
1187 !fuse->ana_trim4 && !fuse2->ana_trim5) { 1200 !fuse->ana_trim4 && !fuse2->ana_trim5) {
1188 /* Use a default 25C binary codes */ 1201 /* Use a default 25C binary codes */
1189 tca25[0] = 1596; 1202 tca25[0] = 1596;
1190 tca25[1] = 1596; 1203 tca25[1] = 1596;
1191 writel(tca25[0], (ulong)reg_base + 0x30); 1204 writel(tca25[0], (ulong)reg_base + 0x30);
1192 writel(tca25[1], (ulong)reg_base + 0x34); 1205 writel(tca25[1], (ulong)reg_base + 0x34);
1193 return; 1206 return;
1194 } 1207 }
1195 1208
1196 buf_vref = (fuse->ana_trim2 & 0xc0) >> 6; 1209 buf_vref = (fuse->ana_trim2 & 0xc0) >> 6;
1197 buf_slope = (fuse->ana_trim2 & 0xF00) >> 8; 1210 buf_slope = (fuse->ana_trim2 & 0xF00) >> 8;
1198 bjt_cur = (fuse->ana_trim2 & 0xF000) >> 12; 1211 bjt_cur = (fuse->ana_trim2 & 0xF000) >> 12;
1199 bgr = (fuse->ana_trim2 & 0xF0000) >> 16; 1212 bgr = (fuse->ana_trim2 & 0xF0000) >> 16;
1200 vlsb = (fuse->ana_trim2 & 0xF00000) >> 20; 1213 vlsb = (fuse->ana_trim2 & 0xF00000) >> 20;
1201 writel(buf_vref | (buf_slope << 16), (ulong)reg_base + 0x28); 1214 writel(buf_vref | (buf_slope << 16), (ulong)reg_base + 0x28);
1202 1215
1203 reg = (bgr << 28) | (bjt_cur << 20) | (vlsb << 12) | ( 1 << 7); 1216 reg = (bgr << 28) | (bjt_cur << 20) | (vlsb << 12) | ( 1 << 7);
1204 writel(reg, (ulong)reg_base + 0x3c); 1217 writel(reg, (ulong)reg_base + 0x3c);
1205 1218
1206 tca40[0] = (fuse->ana_trim3 & 0xFFF0000) >> 16; 1219 tca40[0] = (fuse->ana_trim3 & 0xFFF0000) >> 16;
1207 tca25[0] = (fuse->ana_trim3 & 0xF0000000) >> 28; 1220 tca25[0] = (fuse->ana_trim3 & 0xF0000000) >> 28;
1208 tca25[0] |= ((fuse->ana_trim4 & 0xFF) << 4); 1221 tca25[0] |= ((fuse->ana_trim4 & 0xFF) << 4);
1209 tca105[0] = (fuse->ana_trim4 & 0xFFF00) >> 8; 1222 tca105[0] = (fuse->ana_trim4 & 0xFFF00) >> 8;
1210 tca40[1] = (fuse->ana_trim4 & 0xFFF00000) >> 20; 1223 tca40[1] = (fuse->ana_trim4 & 0xFFF00000) >> 20;
1211 tca25[1] = fuse2->ana_trim5 & 0xFFF; 1224 tca25[1] = fuse2->ana_trim5 & 0xFFF;
1212 tca105[1] = (fuse2->ana_trim5 & 0xFFF000) >> 12; 1225 tca105[1] = (fuse2->ana_trim5 & 0xFFF000) >> 12;
1213 1226
1214 /* use 25c for 1p calibration */ 1227 /* use 25c for 1p calibration */
1215 writel(tca25[0] | (tca105[0] << 16), (ulong)reg_base + 0x30); 1228 writel(tca25[0] | (tca105[0] << 16), (ulong)reg_base + 0x30);
1216 writel(tca25[1] | (tca105[1] << 16), (ulong)reg_base + 0x34); 1229 writel(tca25[1] | (tca105[1] << 16), (ulong)reg_base + 0x34);
1217 writel(tca40[0] | (tca40[1] << 16), (ulong)reg_base + 0x38); 1230 writel(tca40[0] | (tca40[1] << 16), (ulong)reg_base + 0x38);
1218 #endif 1231 #endif
1219 } 1232 }
1220 1233
1221 #if defined(CONFIG_SPL_BUILD) 1234 #if defined(CONFIG_SPL_BUILD)
1222 #if defined(CONFIG_IMX8MQ) || defined(CONFIG_IMX8MM) || defined(CONFIG_IMX8MN) 1235 #if defined(CONFIG_IMX8MQ) || defined(CONFIG_IMX8MM) || defined(CONFIG_IMX8MN)
1223 bool serror_need_skip = true; 1236 bool serror_need_skip = true;
1224 void do_error(struct pt_regs *pt_regs, unsigned int esr) 1237 void do_error(struct pt_regs *pt_regs, unsigned int esr)
1225 { 1238 {
1226 /* If stack is still in ROM reserved OCRAM not switch to SPL, it is the ROM SError */ 1239 /* If stack is still in ROM reserved OCRAM not switch to SPL, it is the ROM SError */
1227 ulong sp; 1240 ulong sp;
1228 asm volatile("mov %0, sp" : "=r"(sp) : ); 1241 asm volatile("mov %0, sp" : "=r"(sp) : );
1229 1242
1230 if (serror_need_skip && 1243 if (serror_need_skip &&
1231 sp < 0x910000 && sp >= 0x900000) { 1244 sp < 0x910000 && sp >= 0x900000) {
1232 1245
1233 /* Check for ERR050342, imx8mq HDCP enabled parts */ 1246 /* Check for ERR050342, imx8mq HDCP enabled parts */
1234 if (is_imx8mq() && !(readl(OCOTP_BASE_ADDR + 0x450) & 0x08000000)) { 1247 if (is_imx8mq() && !(readl(OCOTP_BASE_ADDR + 0x450) & 0x08000000)) {
1235 serror_need_skip = false; 1248 serror_need_skip = false;
1236 return; /* Do nothing skip the SError in ROM */ 1249 return; /* Do nothing skip the SError in ROM */
1237 } 1250 }
1238 1251
1239 /* Check for ERR050350, field return mode for imx8mq, mm and mn */ 1252 /* Check for ERR050350, field return mode for imx8mq, mm and mn */
1240 if (readl(OCOTP_BASE_ADDR + 0x630) & 0x1) { 1253 if (readl(OCOTP_BASE_ADDR + 0x630) & 0x1) {
1241 serror_need_skip = false; 1254 serror_need_skip = false;
1242 return; /* Do nothing skip the SError in ROM */ 1255 return; /* Do nothing skip the SError in ROM */
1243 } 1256 }
1244 } 1257 }
1245 1258
1246 efi_restore_gd(); 1259 efi_restore_gd();
1247 printf("\"Error\" handler, esr 0x%08x\n", esr); 1260 printf("\"Error\" handler, esr 0x%08x\n", esr);
1248 show_regs(pt_regs); 1261 show_regs(pt_regs);
1249 panic("Resetting CPU ...\n"); 1262 panic("Resetting CPU ...\n");
1250 1263
1251 } 1264 }
1252 #endif 1265 #endif
1253 #endif 1266 #endif
1254 1267
1255 #if defined(CONFIG_IMX8MN) || defined(CONFIG_IMX8MP) 1268 #if defined(CONFIG_IMX8MN) || defined(CONFIG_IMX8MP)
1256 enum env_location env_get_location(enum env_operation op, int prio) 1269 enum env_location env_get_location(enum env_operation op, int prio)
1257 { 1270 {
1258 enum boot_device dev = get_boot_device(); 1271 enum boot_device dev = get_boot_device();
1259 enum env_location env_loc = ENVL_UNKNOWN; 1272 enum env_location env_loc = ENVL_UNKNOWN;
1260 1273
1261 if (prio) 1274 if (prio)
1262 return env_loc; 1275 return env_loc;
1263 1276
1264 switch (dev) { 1277 switch (dev) {
1265 #ifdef CONFIG_ENV_IS_IN_SPI_FLASH 1278 #ifdef CONFIG_ENV_IS_IN_SPI_FLASH
1266 case QSPI_BOOT: 1279 case QSPI_BOOT:
1267 env_loc = ENVL_SPI_FLASH; 1280 env_loc = ENVL_SPI_FLASH;
1268 break; 1281 break;
1269 #endif 1282 #endif
1270 #ifdef CONFIG_ENV_IS_IN_NAND 1283 #ifdef CONFIG_ENV_IS_IN_NAND
1271 case NAND_BOOT: 1284 case NAND_BOOT:
1272 env_loc = ENVL_NAND; 1285 env_loc = ENVL_NAND;
1273 break; 1286 break;
1274 #endif 1287 #endif
1275 #ifdef CONFIG_ENV_IS_IN_MMC 1288 #ifdef CONFIG_ENV_IS_IN_MMC
1276 case SD1_BOOT: 1289 case SD1_BOOT:
1277 case SD2_BOOT: 1290 case SD2_BOOT:
1278 case SD3_BOOT: 1291 case SD3_BOOT:
1279 case MMC1_BOOT: 1292 case MMC1_BOOT:
1280 case MMC2_BOOT: 1293 case MMC2_BOOT:
1281 case MMC3_BOOT: 1294 case MMC3_BOOT:
1282 env_loc = ENVL_MMC; 1295 env_loc = ENVL_MMC;
1283 break; 1296 break;
1284 #endif 1297 #endif
1285 default: 1298 default:
1286 #if defined(CONFIG_ENV_IS_NOWHERE) 1299 #if defined(CONFIG_ENV_IS_NOWHERE)
1287 env_loc = ENVL_NOWHERE; 1300 env_loc = ENVL_NOWHERE;
1288 #endif 1301 #endif
1289 break; 1302 break;
1290 } 1303 }
1291 1304
1292 return env_loc; 1305 return env_loc;
1293 } 1306 }
1294 1307
1295 #ifndef ENV_IS_EMBEDDED 1308 #ifndef ENV_IS_EMBEDDED
1296 long long env_get_offset(long long defautl_offset) 1309 long long env_get_offset(long long defautl_offset)
1297 { 1310 {
1298 enum boot_device dev = get_boot_device(); 1311 enum boot_device dev = get_boot_device();
1299 1312
1300 switch (dev) { 1313 switch (dev) {
1301 case NAND_BOOT: 1314 case NAND_BOOT:
1302 return (60 << 20); /* 60MB offset for NAND */ 1315 return (60 << 20); /* 60MB offset for NAND */
1303 default: 1316 default:
1304 break; 1317 break;
1305 } 1318 }
1306 1319
1307 return defautl_offset; 1320 return defautl_offset;
1308 } 1321 }
1309 #endif 1322 #endif
1310 #endif 1323 #endif
1311 1324
1312 #ifdef CONFIG_IMX8MQ 1325 #ifdef CONFIG_IMX8MQ
1313 int imx8m_dcss_power_init(void) 1326 int imx8m_dcss_power_init(void)
1314 { 1327 {
1315 /* Enable the display CCGR before power on */ 1328 /* Enable the display CCGR before power on */
1316 clock_enable(CCGR_DISPLAY, 1); 1329 clock_enable(CCGR_DISPLAY, 1);
1317 1330
1318 writel(0x0000ffff, 0x303A00EC); /*PGC_CPU_MAPPING */ 1331 writel(0x0000ffff, 0x303A00EC); /*PGC_CPU_MAPPING */
1319 setbits_le32(0x303A00F8, 0x1 << 10); /*PU_PGC_SW_PUP_REQ : disp was 10 */ 1332 setbits_le32(0x303A00F8, 0x1 << 10); /*PU_PGC_SW_PUP_REQ : disp was 10 */
1320 1333
1321 return 0; 1334 return 0;
1322 } 1335 }
1323 #endif 1336 #endif
1324 1337