xref: /arm-trusted-firmware/plat/rockchip/rk3399/drivers/pmu/plat_pmu_macros.S (revision 91f16700b400a8c0651d24a598fc48ee2997a0d7)
1*91f16700Schasinglulu/*
2*91f16700Schasinglulu * Copyright (c) 2016, ARM Limited and Contributors. All rights reserved.
3*91f16700Schasinglulu *
4*91f16700Schasinglulu * SPDX-License-Identifier: BSD-3-Clause
5*91f16700Schasinglulu */
6*91f16700Schasinglulu
7*91f16700Schasinglulu#include <arch.h>
8*91f16700Schasinglulu#include <asm_macros.S>
9*91f16700Schasinglulu#include <platform_def.h>
10*91f16700Schasinglulu#include <pmu_regs.h>
11*91f16700Schasinglulu
12*91f16700Schasinglulu	.globl	clst_warmboot_data
13*91f16700Schasinglulu
14*91f16700Schasinglulu	.macro sram_func _name
15*91f16700Schasinglulu	.cfi_sections .debug_frame
16*91f16700Schasinglulu	.section .sram.text, "ax"
17*91f16700Schasinglulu	.type \_name, %function
18*91f16700Schasinglulu	.cfi_startproc
19*91f16700Schasinglulu	\_name:
20*91f16700Schasinglulu	.endm
21*91f16700Schasinglulu
22*91f16700Schasinglulu#define CRU_CLKSEL_CON6	0x118
23*91f16700Schasinglulu
24*91f16700Schasinglulu#define DDRCTL0_C_SYSREQ_CFG 0x0100
25*91f16700Schasinglulu#define DDRCTL1_C_SYSREQ_CFG 0x1000
26*91f16700Schasinglulu
27*91f16700Schasinglulu#define DDRC0_SREF_DONE_EXT 0x01
28*91f16700Schasinglulu#define DDRC1_SREF_DONE_EXT 0x04
29*91f16700Schasinglulu
30*91f16700Schasinglulu#define PLL_MODE_SHIFT	(0x8)
31*91f16700Schasinglulu#define PLL_NORMAL_MODE	((0x3 << (PLL_MODE_SHIFT + 16)) | \
32*91f16700Schasinglulu						 (0x1 << PLL_MODE_SHIFT))
33*91f16700Schasinglulu#define MPIDR_CLST_L_BITS 0x0
34*91f16700Schasinglulu	/*
35*91f16700Schasinglulu	 * For different socs, if we want to speed up warmboot,
36*91f16700Schasinglulu	 * we need to config some regs here.
37*91f16700Schasinglulu	 * If scu was suspend, we must resume related clk
38*91f16700Schasinglulu	 * from slow (24M) mode to normal mode first.
39*91f16700Schasinglulu	 * X0: MPIDR_EL1 & MPIDR_CLUSTER_MASK
40*91f16700Schasinglulu	 */
41*91f16700Schasinglulu.macro	func_rockchip_clst_warmboot
42*91f16700Schasinglulu	adr	x4, clst_warmboot_data
43*91f16700Schasinglulu	lsr	x5, x0, #6
44*91f16700Schasinglulu	ldr	w3, [x4, x5]
45*91f16700Schasinglulu	str	wzr, [x4, x5]
46*91f16700Schasinglulu	cmp	w3, #PMU_CLST_RET
47*91f16700Schasinglulu	b.ne	clst_warmboot_end
48*91f16700Schasinglulu	ldr	w6, =(PLL_NORMAL_MODE)
49*91f16700Schasinglulu	/*
50*91f16700Schasinglulu	 * core_l offset is CRU_BASE + 0xc,
51*91f16700Schasinglulu	 * core_b offset is CRU_BASE + 0x2c
52*91f16700Schasinglulu	 */
53*91f16700Schasinglulu	ldr	x7, =(CRU_BASE + 0xc)
54*91f16700Schasinglulu	lsr	x2, x0, #3
55*91f16700Schasinglulu	str	w6, [x7, x2]
56*91f16700Schasingluluclst_warmboot_end:
57*91f16700Schasinglulu.endm
58*91f16700Schasinglulu
59*91f16700Schasinglulu.macro rockchip_clst_warmboot_data
60*91f16700Schasingluluclst_warmboot_data:
61*91f16700Schasinglulu	.rept	PLATFORM_CLUSTER_COUNT
62*91f16700Schasinglulu	.word	0
63*91f16700Schasinglulu	.endr
64*91f16700Schasinglulu.endm
65*91f16700Schasinglulu
66*91f16700Schasinglulu	/* -----------------------------------------------
67*91f16700Schasinglulu	 * void sram_func_set_ddrctl_pll(uint32_t pll_src)
68*91f16700Schasinglulu	 * Function to switch the PLL source for ddrctrl
69*91f16700Schasinglulu	 * In: x0 - The PLL of the clk_ddrc clock source
70*91f16700Schasinglulu	 * out: None
71*91f16700Schasinglulu	 * Clobber list : x0 - x3, x5, x8 - x10
72*91f16700Schasinglulu	 * -----------------------------------------------
73*91f16700Schasinglulu	 */
74*91f16700Schasinglulu
75*91f16700Schasinglulu	.globl	sram_func_set_ddrctl_pll
76*91f16700Schasinglulu
77*91f16700Schasinglulusram_func sram_func_set_ddrctl_pll
78*91f16700Schasinglulu	/* backup parameter */
79*91f16700Schasinglulu	mov	x8, x0
80*91f16700Schasinglulu
81*91f16700Schasinglulu	/* disable the MMU at EL3 */
82*91f16700Schasinglulu	mrs 	x9, sctlr_el3
83*91f16700Schasinglulu	bic	x10, x9, #(SCTLR_M_BIT)
84*91f16700Schasinglulu	msr 	sctlr_el3, x10
85*91f16700Schasinglulu	isb
86*91f16700Schasinglulu	dsb 	sy
87*91f16700Schasinglulu
88*91f16700Schasinglulu	/* enable ddrctl0_1 idle request */
89*91f16700Schasinglulu	mov	x5, PMU_BASE
90*91f16700Schasinglulu	ldr	w0, [x5, #PMU_SFT_CON]
91*91f16700Schasinglulu	orr	w0, w0, #DDRCTL0_C_SYSREQ_CFG
92*91f16700Schasinglulu	orr	w0, w0, #DDRCTL1_C_SYSREQ_CFG
93*91f16700Schasinglulu	str	w0, [x5, #PMU_SFT_CON]
94*91f16700Schasinglulu
95*91f16700Schasinglulucheck_ddrc0_1_sref_enter:
96*91f16700Schasinglulu	ldr	w1, [x5, #PMU_DDR_SREF_ST]
97*91f16700Schasinglulu	and	w2, w1, #DDRC0_SREF_DONE_EXT
98*91f16700Schasinglulu	and	w3, w1, #DDRC1_SREF_DONE_EXT
99*91f16700Schasinglulu	orr	w2, w2, w3
100*91f16700Schasinglulu	cmp	w2, #(DDRC0_SREF_DONE_EXT | DDRC1_SREF_DONE_EXT)
101*91f16700Schasinglulu	b.eq	check_ddrc0_1_sref_enter
102*91f16700Schasinglulu
103*91f16700Schasinglulu	/*
104*91f16700Schasinglulu	 * select a PLL for ddrctrl:
105*91f16700Schasinglulu	 * x0 = 0: ALPLL
106*91f16700Schasinglulu	 * x0 = 1: ABPLL
107*91f16700Schasinglulu	 * x0 = 2: DPLL
108*91f16700Schasinglulu	 * x0 = 3: GPLLL
109*91f16700Schasinglulu	 */
110*91f16700Schasinglulu	mov     x5, CRU_BASE
111*91f16700Schasinglulu	lsl	w0, w8, #4
112*91f16700Schasinglulu	orr	w0, w0, #0x00300000
113*91f16700Schasinglulu	str 	w0, [x5, #CRU_CLKSEL_CON6]
114*91f16700Schasinglulu
115*91f16700Schasinglulu	/* disable ddrctl0_1 idle request */
116*91f16700Schasinglulu	mov	x5, PMU_BASE
117*91f16700Schasinglulu	ldr	w0, [x5, #PMU_SFT_CON]
118*91f16700Schasinglulu	bic	w0, w0, #DDRCTL0_C_SYSREQ_CFG
119*91f16700Schasinglulu	bic	w0, w0, #DDRCTL1_C_SYSREQ_CFG
120*91f16700Schasinglulu	str	w0, [x5, #PMU_SFT_CON]
121*91f16700Schasinglulu
122*91f16700Schasinglulucheck_ddrc0_1_sref_exit:
123*91f16700Schasinglulu	ldr	w1, [x5, #PMU_DDR_SREF_ST]
124*91f16700Schasinglulu	and	w2, w1, #DDRC0_SREF_DONE_EXT
125*91f16700Schasinglulu	and	w3, w1, #DDRC1_SREF_DONE_EXT
126*91f16700Schasinglulu	orr	w2, w2, w3
127*91f16700Schasinglulu	cmp	w2, #0x0
128*91f16700Schasinglulu	b.eq	check_ddrc0_1_sref_exit
129*91f16700Schasinglulu
130*91f16700Schasinglulu	/* reenable the MMU at EL3 */
131*91f16700Schasinglulu	msr 	sctlr_el3, x9
132*91f16700Schasinglulu	isb
133*91f16700Schasinglulu	dsb 	sy
134*91f16700Schasinglulu
135*91f16700Schasinglulu	ret
136*91f16700Schasingluluendfunc sram_func_set_ddrctl_pll
137