xref: /rk3399_rockchip-uboot/arch/arm/mach-tegra/psci.S (revision 1f9ef0dca0a1315f0a216808ade8946bcc54e2b4)
1ffdf9f9aSJan Kiszka/*
2ffdf9f9aSJan Kiszka * Copyright (C) 2014, NVIDIA
3ffdf9f9aSJan Kiszka * Copyright (C) 2015, Siemens AG
4ffdf9f9aSJan Kiszka *
5ffdf9f9aSJan Kiszka * Authors:
6ffdf9f9aSJan Kiszka *  Thierry Reding <treding@nvidia.com>
7ffdf9f9aSJan Kiszka *  Jan Kiszka <jan.kiszka@siemens.com>
8ffdf9f9aSJan Kiszka *
9ffdf9f9aSJan Kiszka * SPDX-License-Identifier:	GPL-2.0+
10ffdf9f9aSJan Kiszka */
11ffdf9f9aSJan Kiszka
12ffdf9f9aSJan Kiszka#include <linux/linkage.h>
13ffdf9f9aSJan Kiszka#include <asm/macro.h>
14ffdf9f9aSJan Kiszka#include <asm/psci.h>
15ffdf9f9aSJan Kiszka
16ffdf9f9aSJan Kiszka	.pushsection ._secure.text, "ax"
17ffdf9f9aSJan Kiszka	.arch_extension sec
18ffdf9f9aSJan Kiszka
19ffdf9f9aSJan Kiszka#define TEGRA_SB_CSR_0			0x6000c200
20ffdf9f9aSJan Kiszka#define NS_RST_VEC_WR_DIS		(1 << 1)
21ffdf9f9aSJan Kiszka
22ffdf9f9aSJan Kiszka#define TEGRA_RESET_EXCEPTION_VECTOR	0x6000f100
23ffdf9f9aSJan Kiszka
24ffdf9f9aSJan Kiszka#define TEGRA_FLOW_CTRL_BASE		0x60007000
25ffdf9f9aSJan Kiszka#define FLOW_CTRL_CPU_CSR		0x08
26ffdf9f9aSJan Kiszka#define CSR_ENABLE			(1 << 0)
27ffdf9f9aSJan Kiszka#define CSR_IMMEDIATE_WAKE		(1 << 3)
28ffdf9f9aSJan Kiszka#define CSR_WAIT_WFI_SHIFT		8
29ffdf9f9aSJan Kiszka#define FLOW_CTRL_CPU1_CSR		0x18
30ffdf9f9aSJan Kiszka
31ffdf9f9aSJan Kiszka@ converts CPU ID into FLOW_CTRL_CPUn_CSR offset
32ffdf9f9aSJan Kiszka.macro get_csr_reg cpu, ofs, tmp
33ffdf9f9aSJan Kiszka	cmp	\cpu, #0		@ CPU0?
34ffdf9f9aSJan Kiszka	lsl	\tmp, \cpu, #3	@ multiple by 8 (register offset CPU1-3)
35ffdf9f9aSJan Kiszka	moveq	\ofs, #FLOW_CTRL_CPU_CSR
36ffdf9f9aSJan Kiszka	addne	\ofs, \tmp, #FLOW_CTRL_CPU1_CSR - 8
37ffdf9f9aSJan Kiszka.endm
38ffdf9f9aSJan Kiszka
39ffdf9f9aSJan KiszkaENTRY(psci_arch_init)
40ffdf9f9aSJan Kiszka	mov	r6, lr
41ffdf9f9aSJan Kiszka
42ffdf9f9aSJan Kiszka	mrc	p15, 0, r5, c1, c1, 0	@ Read SCR
43ffdf9f9aSJan Kiszka	bic	r5, r5, #1		@ Secure mode
44ffdf9f9aSJan Kiszka	mcr	p15, 0, r5, c1, c1, 0	@ Write SCR
45ffdf9f9aSJan Kiszka	isb
46ffdf9f9aSJan Kiszka
47ffdf9f9aSJan Kiszka	@ lock reset vector for non-secure
48ffdf9f9aSJan Kiszka	ldr	r4, =TEGRA_SB_CSR_0
49ffdf9f9aSJan Kiszka	ldr	r5, [r4]
50ffdf9f9aSJan Kiszka	orr	r5, r5, #NS_RST_VEC_WR_DIS
51ffdf9f9aSJan Kiszka	str	r5, [r4]
52ffdf9f9aSJan Kiszka
53ffdf9f9aSJan Kiszka	bl	psci_get_cpu_id		@ CPU ID => r0
54a0d0a594SJan Kiszka
55a0d0a594SJan Kiszka	adr	r5, _sys_clock_freq
56a0d0a594SJan Kiszka	cmp	r0, #0
57a0d0a594SJan Kiszka
58a0d0a594SJan Kiszka	mrceq	p15, 0, r7, c14, c0, 0	@ read CNTFRQ from CPU0
59a0d0a594SJan Kiszka	streq	r7, [r5]
60a0d0a594SJan Kiszka
61a0d0a594SJan Kiszka	ldrne	r7, [r5]
62a0d0a594SJan Kiszka	mcrne	p15, 0, r7, c14, c0, 0	@ write CNTFRQ to CPU1..3
63a0d0a594SJan Kiszka
64ffdf9f9aSJan Kiszka	bx	r6
65ffdf9f9aSJan KiszkaENDPROC(psci_arch_init)
66ffdf9f9aSJan Kiszka
67a0d0a594SJan Kiszka_sys_clock_freq:
68a0d0a594SJan Kiszka	.word	0
69a0d0a594SJan Kiszka
70ffdf9f9aSJan KiszkaENTRY(psci_cpu_off)
71ffdf9f9aSJan Kiszka	bl	psci_cpu_off_common
72ffdf9f9aSJan Kiszka
73ffdf9f9aSJan Kiszka	bl	psci_get_cpu_id		@ CPU ID => r0
74ffdf9f9aSJan Kiszka
75ffdf9f9aSJan Kiszka	get_csr_reg r0, r2, r3
76ffdf9f9aSJan Kiszka
77ffdf9f9aSJan Kiszka	ldr	r6, =TEGRA_FLOW_CTRL_BASE
78ffdf9f9aSJan Kiszka	mov	r5, #(CSR_ENABLE)
79ffdf9f9aSJan Kiszka	mov	r4, #(1 << CSR_WAIT_WFI_SHIFT)
80ffdf9f9aSJan Kiszka	add	r5, r4, lsl r0
81ffdf9f9aSJan Kiszka	str	r5, [r6, r2]
82ffdf9f9aSJan Kiszka
83ffdf9f9aSJan Kiszka_loop:	wfi
84ffdf9f9aSJan Kiszka	b	_loop
85ffdf9f9aSJan KiszkaENDPROC(psci_cpu_off)
86ffdf9f9aSJan Kiszka
87ffdf9f9aSJan KiszkaENTRY(psci_cpu_on)
88*6e6622deSChen-Yu Tsai	push	{r4, r5, r6, lr}
89ffdf9f9aSJan Kiszka
90*6e6622deSChen-Yu Tsai	mov	r4, r1
91ffdf9f9aSJan Kiszka	mov	r0, r1
92*6e6622deSChen-Yu Tsai	mov	r1, r2
93*6e6622deSChen-Yu Tsai	bl	psci_save_target_pc	@ store target PC
94*6e6622deSChen-Yu Tsai	mov	r1, r4
95ffdf9f9aSJan Kiszka
96ffdf9f9aSJan Kiszka	ldr	r6, =TEGRA_RESET_EXCEPTION_VECTOR
97ffdf9f9aSJan Kiszka	ldr	r5, =psci_cpu_entry
98ffdf9f9aSJan Kiszka	str	r5, [r6]
99ffdf9f9aSJan Kiszka
100ffdf9f9aSJan Kiszka	get_csr_reg r1, r2, r3
101ffdf9f9aSJan Kiszka
102ffdf9f9aSJan Kiszka	ldr	r6, =TEGRA_FLOW_CTRL_BASE
103ffdf9f9aSJan Kiszka	mov	r5, #(CSR_IMMEDIATE_WAKE | CSR_ENABLE)
104ffdf9f9aSJan Kiszka	str	r5, [r6, r2]
105ffdf9f9aSJan Kiszka
106ffdf9f9aSJan Kiszka	mov	r0, #ARM_PSCI_RET_SUCCESS	@ Return PSCI_RET_SUCCESS
107*6e6622deSChen-Yu Tsai	pop	{r4, r5, r6, pc}
108ffdf9f9aSJan KiszkaENDPROC(psci_cpu_on)
109ffdf9f9aSJan Kiszka
110ffdf9f9aSJan Kiszka	.popsection
111