|  | /* SPDX-License-Identifier: GPL-2.0 */ | 
|  | /* | 
|  | * Copyright (C) 2014 Renesas Electronics Corporation | 
|  | * | 
|  | * Initialization of CNTVOFF register from secure mode | 
|  | * | 
|  | */ | 
|  |  | 
|  | #include <linux/linkage.h> | 
|  | #include <asm/assembler.h> | 
|  |  | 
|  | ENTRY(secure_cntvoff_init) | 
|  | .arch	armv7-a | 
|  | /* | 
|  | * CNTVOFF has to be initialized either from non-secure Hypervisor | 
|  | * mode or secure Monitor mode with SCR.NS==1. If TrustZone is enabled | 
|  | * then it should be handled by the secure code. The CPU must implement | 
|  | * the virtualization extensions. | 
|  | */ | 
|  | cps	#MON_MODE | 
|  | mrc	p15, 0, r1, c1, c1, 0		/* Get Secure Config */ | 
|  | orr	r0, r1, #1 | 
|  | mcr	p15, 0, r0, c1, c1, 0		/* Set Non Secure bit */ | 
|  | isb | 
|  | mov	r0, #0 | 
|  | mcrr	p15, 4, r0, r0, c14		/* CNTVOFF = 0 */ | 
|  | isb | 
|  | mcr	p15, 0, r1, c1, c1, 0		/* Set Secure bit */ | 
|  | isb | 
|  | cps	#SVC_MODE | 
|  | ret	lr | 
|  | ENDPROC(secure_cntvoff_init) |