| // SPDX-License-Identifier: GPL-2.0 | 
 | // Copyright (c) 2018, The Linux Foundation. All rights reserved. | 
 |  | 
 | #include <linux/spinlock.h> | 
 | #include <linux/export.h> | 
 |  | 
 | #include <asm/barrier.h> | 
 | #include <asm/krait-l2-accessors.h> | 
 |  | 
 | static DEFINE_RAW_SPINLOCK(krait_l2_lock); | 
 |  | 
 | void krait_set_l2_indirect_reg(u32 addr, u32 val) | 
 | { | 
 | 	unsigned long flags; | 
 |  | 
 | 	raw_spin_lock_irqsave(&krait_l2_lock, flags); | 
 | 	/* | 
 | 	 * Select the L2 window by poking l2cpselr, then write to the window | 
 | 	 * via l2cpdr. | 
 | 	 */ | 
 | 	asm volatile ("mcr p15, 3, %0, c15, c0, 6 @ l2cpselr" : : "r" (addr)); | 
 | 	isb(); | 
 | 	asm volatile ("mcr p15, 3, %0, c15, c0, 7 @ l2cpdr" : : "r" (val)); | 
 | 	isb(); | 
 |  | 
 | 	raw_spin_unlock_irqrestore(&krait_l2_lock, flags); | 
 | } | 
 | EXPORT_SYMBOL(krait_set_l2_indirect_reg); | 
 |  | 
 | u32 krait_get_l2_indirect_reg(u32 addr) | 
 | { | 
 | 	u32 val; | 
 | 	unsigned long flags; | 
 |  | 
 | 	raw_spin_lock_irqsave(&krait_l2_lock, flags); | 
 | 	/* | 
 | 	 * Select the L2 window by poking l2cpselr, then read from the window | 
 | 	 * via l2cpdr. | 
 | 	 */ | 
 | 	asm volatile ("mcr p15, 3, %0, c15, c0, 6 @ l2cpselr" : : "r" (addr)); | 
 | 	isb(); | 
 | 	asm volatile ("mrc p15, 3, %0, c15, c0, 7 @ l2cpdr" : "=r" (val)); | 
 |  | 
 | 	raw_spin_unlock_irqrestore(&krait_l2_lock, flags); | 
 |  | 
 | 	return val; | 
 | } | 
 | EXPORT_SYMBOL(krait_get_l2_indirect_reg); |