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