blob: af8770c4b937eaa191e9bc4d6922fd21d6ee5f1c [file] [log] [blame]
/*
* Copyright (C) 2014-2016 Freescale Semiconductor, Inc.
* Copyright 2017 NXP
*
* SPDX-License-Identifier: GPL-2.0+
*/
#include <config.h>
/* DDR script */
.macro imx7d_ddrphy_latency_setting
ldr r2, =ANATOP_BASE_ADDR
ldr r3, [r2, #0x800]
and r3, r3, #0xFF
cmp r3, #0x11
bne TUNE_END
/*TO 1.1*/
ldr r1, =0x1c1c1c1c
str r1, [r0, #0x7c]
ldr r1, =0x1c1c1c1c
str r1, [r0, #0x80]
ldr r1, =0x30301c1c
str r1, [r0, #0x84]
ldr r1, =0x00000030
str r1, [r0, #0x88]
ldr r1, =0x30303030
str r1, [r0, #0x6c]
TUNE_END:
.endm
.macro imx7d_12x12_lpddr3_arm2_setting
/* check whether it is a LPSR resume */
ldr r1, =0x30270000
ldr r7, [r1]
cmp r7, #0
beq 16f
/* disable wdog powerdown counter */
ldr r0, =0x30280000
ldrh r1, =0x0
strh r1, [r0, #0x8]
/* initialize AIPs 1-3 port */
ldr r0, =0x301f0000
ldr r1, =0x77777777
str r1, [r0]
str r1, [r0, #0x4]
ldr r1, =0x0
str r1, [r0, #0x40]
str r1, [r0, #0x44]
str r1, [r0, #0x48]
str r1, [r0, #0x4c]
str r1, [r0, #0x50]
ldr r0, =0x305f0000
ldr r1, =0x77777777
str r1, [r0]
str r1, [r0, #0x4]
ldr r1, =0x0
str r1, [r0, #0x40]
str r1, [r0, #0x44]
str r1, [r0, #0x48]
str r1, [r0, #0x4c]
str r1, [r0, #0x50]
ldr r0, =0x309f0000
ldr r1, =0x77777777
str r1, [r0]
str r1, [r0, #0x4]
ldr r1, =0x0
str r1, [r0, #0x40]
str r1, [r0, #0x44]
str r1, [r0, #0x48]
str r1, [r0, #0x4c]
str r1, [r0, #0x50]
ldr r1, =0x30360000
ldr r2, =0x30390000
ldr r3, =0x307a0000
ldr r4, =0x30790000
ldr r10, =0x30380000
ldr r11, =0x30340000
/* turn on ddr power */
ldr r7, =(0x1 << 29)
str r7, [r1, #0x388]
ldr r6, =50
1:
subs r6, r6, #0x1
bne 1b
/* clear ddr_phy reset */
ldr r6, =0x1000
ldr r7, [r2, r6]
orr r7, r7, #0x3
str r7, [r2, r6]
ldr r7, [r2, r6]
bic r7, r7, #0x1
str r7, [r2, r6]
/* restore DDRC */
ldr r6, =0x0
ldr r7, =0x03040008
str r7, [r3, r6]
ldr r6, =0x1a0
ldr r7, =0x80400003
str r7, [r3, r6]
ldr r6, =0x1a4
ldr r7, =0x00100020
str r7, [r3, r6]
ldr r6, =0x1a8
ldr r7, =0x80100004
str r7, [r3, r6]
ldr r6, =0x64
ldr r7, =0x00200038
str r7, [r3, r6]
ldr r6, =0xd0
ldr r7, =0xc0350001
str r7, [r3, r6]
ldr r6, =0xdc
ldr r7, =0x00C3000A
str r7, [r3, r6]
ldr r6, =0xe0
ldr r7, =0x00010000
str r7, [r3, r6]
ldr r6, =0xe4
ldr r7, =0x00110006
str r7, [r3, r6]
ldr r6, =0xf4
ldr r7, =0x0000033F
str r7, [r3, r6]
ldr r6, =0x100
ldr r7, =0x0A0E110B
str r7, [r3, r6]
ldr r6, =0x104
ldr r7, =0x00020211
str r7, [r3, r6]
ldr r6, =0x108
ldr r7, =0x03060708
str r7, [r3, r6]
ldr r6, =0x10c
ldr r7, =0x00A0500C
str r7, [r3, r6]
ldr r6, =0x110
ldr r7, =0x05020307
str r7, [r3, r6]
ldr r6, =0x114
ldr r7, =0x02020404
str r7, [r3, r6]
ldr r6, =0x118
ldr r7, =0x02020003
str r7, [r3, r6]
ldr r6, =0x11c
ldr r7, =0x00000202
str r7, [r3, r6]
ldr r6, =0x120
ldr r7, =0x00000202
str r7, [r3, r6]
ldr r6, =0x180
ldr r7, =0x00600018
str r7, [r3, r6]
ldr r6, =0x184
ldr r7, =0x00e00100
str r7, [r3, r6]
ldr r6, =0x190
ldr r7, =0x02098205
str r7, [r3, r6]
ldr r6, =0x194
ldr r7, =0x00060303
str r7, [r3, r6]
ldr r6, =0x200
ldr r7, =0x00000016
str r7, [r3, r6]
ldr r6, =0x204
ldr r7, =0x00090909
str r7, [r3, r6]
ldr r6, =0x210
ldr r7, =0xF00
str r7, [r3, r6]
ldr r6, =0x214
ldr r7, =0x08080808
str r7, [r3, r6]
ldr r6, =0x218
ldr r7, =0x0f0f0808
str r7, [r3, r6]
ldr r6, =0x240
ldr r7, =0x06000600
str r7, [r3, r6]
ldr r6, =0x244
ldr r7, =0x00000000
str r7, [r3, r6]
ldr r7, =0x20
str r7, [r3, #0x30]
ldr r7, =0x0
str r7, [r3, #0x1b0]
/* do PHY, clear ddr_phy reset */
ldr r6, =0x1000
ldr r7, [r2, r6]
bic r7, r7, #0x2
str r7, [r2, r6]
ldr r7, [r1, #0x800]
and r7, r7, #0xFF
cmp r7, #0x11
bne 2f
/* for TO1.1 */
ldr r7, [r11]
bic r7, r7, #(1 << 27)
str r7, [r11]
ldr r7, [r11]
bic r7, r7, #(1 << 29)
str r7, [r11]
2:
/* clear/set bit30 of SNVS_MISC_CTRL to ensure exit from ddr retention */
ldr r7, =(0x1 << 30)
str r7, [r1, #0x388]
ldr r7, =(0x1 << 30)
str r7, [r1, #0x384]
/* need to delay ~5mS */
ldr r6, =0x100000
3:
subs r6, r6, #0x1
bne 3b
/* restore DDR PHY */
ldr r6, =0x0
ldr r7, =0x17421E40
str r7, [r4, r6]
ldr r6, =0x4
ldr r7, =0x10210100
str r7, [r4, r6]
ldr r6, =0x8
ldr r7, =0x00010000
str r7, [r4, r6]
ldr r6, =0x10
ldr r7, =0x0007080C
str r7, [r4, r6]
ldr r6, =0xb0
ldr r7, =0x1010007e
str r7, [r4, r6]
ldr r7, [r1, #0x800]
and r7, r7, #0xFF
cmp r7, #0x11
bne 4f
ldr r6, =0x7c
ldr r7, =0x1c1c1c1c
str r7, [r4, r6]
ldr r6, =0x80
ldr r7, =0x1c1c1c1c
str r7, [r4, r6]
ldr r6, =0x84
ldr r7, =0x30301c1c
str r7, [r4, r6]
ldr r6, =0x88
ldr r7, =0x00000030
str r7, [r4, r6]
ldr r6, =0x6c
ldr r7, =0x30303030
str r7, [r4, r6]
ldr r6, =0x1c
ldr r7, =0x01010000
str r7, [r4, r6]
ldr r6, =0x9c
ldr r7, =0x0DB60D6E
str r7, [r4, r6]
b 5f
4:
ldr r6, =0x1c
ldr r7, =0x01010000
str r7, [r4, r6]
ldr r6, =0x9c
ldr r7, =0x00000b24
str r7, [r4, r6]
5:
ldr r6, =0x20
ldr r7, =0x0a0a0a0a
str r7, [r4, r6]
ldr r6, =0x30
ldr r7, =0x06060606
str r7, [r4, r6]
ldr r6, =0x50
ldr r7, =0x01000008
str r7, [r4, r6]
ldr r6, =0x50
ldr r7, =0x00000008
str r7, [r4, r6]
ldr r6, =0xc0
ldr r7, =0x0e487304
str r7, [r4, r6]
ldr r6, =0xc0
ldr r7, =0x0e4c7304
str r7, [r4, r6]
ldr r6, =0xc0
ldr r7, =0x0e4c7306
str r7, [r4, r6]
6:
ldr r7, [r4, #0xc4]
tst r7, #0x1
beq 6b
ldr r6, =0xc0
ldr r7, =0x0e487304
str r7, [r4, r6]
ldr r7, =0x0
add r9, r10, #0x4000
str r7, [r9, #0x130]
ldr r7, =0x170
orr r7, r7, #0x8
str r7, [r11, #0x20]
ldr r7, =0x2
add r9, r10, #0x4000
str r7, [r9, #0x130]
ldr r7, =0xf
str r7, [r4, #0x18]
/* wait until self-refresh mode entered */
11:
ldr r7, [r3, #0x4]
and r7, r7, #0x3
cmp r7, #0x3
bne 11b
ldr r7, =0x0
str r7, [r3, #0x320]
ldr r7, =0x1
str r7, [r3, #0x1b0]
ldr r7, =0x1
str r7, [r3, #0x320]
12:
ldr r7, [r3, #0x324]
and r7, r7, #0x1
cmp r7, #0x1
bne 12b
13:
ldr r7, [r3, #0x4]
and r7, r7, #0x20
cmp r7, #0x20
bne 13b
/* let DDR out of self-refresh */
ldr r7, =0x0
str r7, [r3, #0x30]
14:
ldr r7, [r3, #0x4]
and r7, r7, #0x30
cmp r7, #0x0
bne 14b
15:
ldr r7, [r3, #0x4]
and r7, r7, #0x3
cmp r7, #0x1
bne 15b
imx7_qos_setting
/* enable port */
ldr r7, =0x1
str r7, [r3, #0x490]
/* jump to kernel resume */
ldr r1, =0x30270000
ldr r7, [r1]
mov pc, r7
16:
/* Configure ocram_epdc */
ldr r0, =IOMUXC_GPR_BASE_ADDR
ldr r1, =0x4f400005
str r1, [r0, #0x4]
/* clear/set bit30 of SNVS_MISC_CTRL to ensure exit from ddr retention */
ldr r0, =ANATOP_BASE_ADDR
ldr r1, =(0x1 << 30)
str r1, [r0, #0x388]
str r1, [r0, #0x384]
ldr r0, =SRC_BASE_ADDR
ldr r1, =0x2
ldr r2, =0x1000
str r1, [r0, r2]
ldr r0, =DDRC_IPS_BASE_ADDR
ldr r1, =0x03040008
str r1, [r0]
ldr r1, =0x00200038
str r1, [r0, #0x64]
ldr r1, =0x1
str r1, [r0, #0x490]
ldr r1, =0x00350001
str r1, [r0, #0xd0]
ldr r1, =0x00c3000a
str r1, [r0, #0xdc]
ldr r1, =0x00010000
str r1, [r0, #0xe0]
ldr r1, =0x00110006
str r1, [r0, #0xe4]
ldr r1, =0x33f
str r1, [r0, #0xf4]
ldr r1, =0x0a0e110b
str r1, [r0, #0x100]
ldr r1, =0x00020211
str r1, [r0, #0x104]
ldr r1, =0x03060708
str r1, [r0, #0x108]
ldr r1, =0x00a0500c
str r1, [r0, #0x10c]
ldr r1, =0x05020307
str r1, [r0, #0x110]
ldr r1, =0x02020404
str r1, [r0, #0x114]
ldr r1, =0x02020003
str r1, [r0, #0x118]
ldr r1, =0x00000202
str r1, [r0, #0x11c]
ldr r1, =0x00000202
str r1, [r0, #0x120]
ldr r1, =0x00600018
str r1, [r0, #0x180]
ldr r1, =0x00e00100
str r1, [r0, #0x184]
ldr r1, =0x02098205
str r1, [r0, #0x190]
ldr r1, =0x00060303
str r1, [r0, #0x194]
ldr r1, =0x80400003
str r1, [r0, #0x1a0]
ldr r1, =0x00100020
str r1, [r0, #0x1a4]
ldr r1, =0x80100004
str r1, [r0, #0x1a8]
ldr r1, =0x00000016
str r1, [r0, #0x200]
ldr r1, =0x00090909
str r1, [r0, #0x204]
ldr r1, =0x00000f00
str r1, [r0, #0x210]
ldr r1, =0x08080808
str r1, [r0, #0x214]
ldr r1, =0x0f0f0808
str r1, [r0, #0x218]
ldr r1, =0x06000600
str r1, [r0, #0x240]
mov r1, #0x0
str r1, [r0, #0x244]
ldr r0, =SRC_BASE_ADDR
mov r1, #0x0
ldr r2, =0x1000
str r1, [r0, r2]
ldr r0, =DDRPHY_IPS_BASE_ADDR
ldr r1, =0x17421e40
str r1, [r0]
ldr r1, =0x10210100
str r1, [r0, #0x4]
ldr r1, =0x00010000
str r1, [r0, #0x8]
ldr r1, =0x0007080c
str r1, [r0, #0x10]
imx7d_ddrphy_latency_setting
ldr r1, =0x1010007e
str r1, [r0, #0xb0]
ldr r1, =0x01010000
str r1, [r0, #0x1c]
ldr r2, =ANATOP_BASE_ADDR
ldr r3, [r2, #0x800]
and r3, r3, #0xFF
cmp r3, #0x11
bne 17f
ldr r1, =0x0db60d6e
str r1, [r0, #0x9c]
b 18f
17:
ldr r1, =0x00000b24
str r1, [r0, #0x9c]
18:
ldr r1, =0x06060606
str r1, [r0, #0x30]
ldr r1, =0x0a0a0a0a
str r1, [r0, #0x20]
ldr r1, =0x01000008
str r1, [r0, #0x50]
ldr r1, =0x00000008
str r1, [r0, #0x50]
ldr r1, =0x0000000f
str r1, [r0, #0x18]
ldr r1, =0x0e487304
str r1, [r0, #0xc0]
ldr r1, =0x0e4c7304
str r1, [r0, #0xc0]
ldr r1, =0x0e4c7306
str r1, [r0, #0xc0]
wait_zq:
ldr r1, [r0, #0xc4]
tst r1, #0x1
beq wait_zq
ldr r1, =0x0e487304
str r1, [r0, #0xc0]
ldr r0, =CCM_BASE_ADDR
mov r1, #0x0
ldr r2, =0x4130
str r1, [r0, r2]
ldr r0, =IOMUXC_GPR_BASE_ADDR
mov r1, #0x178
str r1, [r0, #0x20]
ldr r0, =CCM_BASE_ADDR
mov r1, #0x2
ldr r2, =0x4130
str r1, [r0, r2]
ldr r0, =DDRC_IPS_BASE_ADDR
wait_stat:
ldr r1, [r0, #0x4]
tst r1, #0x1
beq wait_stat
.endm
.macro imx7_clock_gating
#ifdef CONFIG_IMX_OPTEE
ldr r0, =0x30340024
ldr r1, =0x1
str r1, [r0]
#endif
.endm
.macro imx7_qos_setting
ldr r0, =REGS_QOS_BASE
ldr r1, =0
str r1, [r0, #0]
ldr r1, =0
str r1, [r0, #0x60]
ldr r0, =REGS_QOS_EPDC
ldr r1, =0
str r1, [r0, #0]
ldr r0, =REGS_QOS_PXP0
ldr r1, =0
str r1, [r0, #0]
ldr r0, =REGS_QOS_PXP1
ldr r1, =0
str r1, [r0, #0]
ldr r0, =REGS_QOS_EPDC
ldr r1, =0x0f020f22
str r1, [r0, #0xd0]
str r1, [r0, #0xe0]
ldr r0, =REGS_QOS_PXP0
ldr r1, =0x1
str r1, [r0, #0]
ldr r0, =REGS_QOS_PXP1
str r1, [r0, #0]
ldr r0, =REGS_QOS_PXP0
ldr r1, =0x0f020222
str r1, [r0, #0x50]
ldr r0, =REGS_QOS_PXP1
str r1, [r0, #0x50]
ldr r0, =REGS_QOS_PXP0
ldr r1, =0x0f020222
str r1, [r0, #0x60]
ldr r0, =REGS_QOS_PXP1
str r1, [r0, #0x60]
ldr r0, =REGS_QOS_PXP0
ldr r1, =0x0f020422
str r1, [r0, #0x70]
ldr r0, =REGS_QOS_PXP1
str r1, [r0, #0x70]
ldr r0, =IOMUXC_GPR_BASE_ADDR
ldr r1, =0xe080
str r1, [r0, #0x34]
.endm
.macro imx7_ddr_setting
imx7d_12x12_lpddr3_arm2_setting
.endm
/* include the common plugin code here */
#include <asm/arch/mx7_plugin.S>