162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0 262306a36Sopenharmony_ci// Copyright (c) 2018, The Linux Foundation. All rights reserved. 362306a36Sopenharmony_ci 462306a36Sopenharmony_ci#include <linux/spinlock.h> 562306a36Sopenharmony_ci#include <linux/export.h> 662306a36Sopenharmony_ci 762306a36Sopenharmony_ci#include <asm/barrier.h> 862306a36Sopenharmony_ci#include <asm/krait-l2-accessors.h> 962306a36Sopenharmony_ci 1062306a36Sopenharmony_cistatic DEFINE_RAW_SPINLOCK(krait_l2_lock); 1162306a36Sopenharmony_ci 1262306a36Sopenharmony_civoid krait_set_l2_indirect_reg(u32 addr, u32 val) 1362306a36Sopenharmony_ci{ 1462306a36Sopenharmony_ci unsigned long flags; 1562306a36Sopenharmony_ci 1662306a36Sopenharmony_ci raw_spin_lock_irqsave(&krait_l2_lock, flags); 1762306a36Sopenharmony_ci /* 1862306a36Sopenharmony_ci * Select the L2 window by poking l2cpselr, then write to the window 1962306a36Sopenharmony_ci * via l2cpdr. 2062306a36Sopenharmony_ci */ 2162306a36Sopenharmony_ci asm volatile ("mcr p15, 3, %0, c15, c0, 6 @ l2cpselr" : : "r" (addr)); 2262306a36Sopenharmony_ci isb(); 2362306a36Sopenharmony_ci asm volatile ("mcr p15, 3, %0, c15, c0, 7 @ l2cpdr" : : "r" (val)); 2462306a36Sopenharmony_ci isb(); 2562306a36Sopenharmony_ci 2662306a36Sopenharmony_ci raw_spin_unlock_irqrestore(&krait_l2_lock, flags); 2762306a36Sopenharmony_ci} 2862306a36Sopenharmony_ciEXPORT_SYMBOL(krait_set_l2_indirect_reg); 2962306a36Sopenharmony_ci 3062306a36Sopenharmony_ciu32 krait_get_l2_indirect_reg(u32 addr) 3162306a36Sopenharmony_ci{ 3262306a36Sopenharmony_ci u32 val; 3362306a36Sopenharmony_ci unsigned long flags; 3462306a36Sopenharmony_ci 3562306a36Sopenharmony_ci raw_spin_lock_irqsave(&krait_l2_lock, flags); 3662306a36Sopenharmony_ci /* 3762306a36Sopenharmony_ci * Select the L2 window by poking l2cpselr, then read from the window 3862306a36Sopenharmony_ci * via l2cpdr. 3962306a36Sopenharmony_ci */ 4062306a36Sopenharmony_ci asm volatile ("mcr p15, 3, %0, c15, c0, 6 @ l2cpselr" : : "r" (addr)); 4162306a36Sopenharmony_ci isb(); 4262306a36Sopenharmony_ci asm volatile ("mrc p15, 3, %0, c15, c0, 7 @ l2cpdr" : "=r" (val)); 4362306a36Sopenharmony_ci 4462306a36Sopenharmony_ci raw_spin_unlock_irqrestore(&krait_l2_lock, flags); 4562306a36Sopenharmony_ci 4662306a36Sopenharmony_ci return val; 4762306a36Sopenharmony_ci} 4862306a36Sopenharmony_ciEXPORT_SYMBOL(krait_get_l2_indirect_reg); 49