Back to home page

OSCL-LXR

 
 

    


0001 // SPDX-License-Identifier: GPL-2.0
0002 // Copyright (c) 2018, The Linux Foundation. All rights reserved.
0003 
0004 #include <linux/spinlock.h>
0005 #include <linux/export.h>
0006 
0007 #include <asm/barrier.h>
0008 #include <asm/krait-l2-accessors.h>
0009 
0010 static DEFINE_RAW_SPINLOCK(krait_l2_lock);
0011 
0012 void krait_set_l2_indirect_reg(u32 addr, u32 val)
0013 {
0014     unsigned long flags;
0015 
0016     raw_spin_lock_irqsave(&krait_l2_lock, flags);
0017     /*
0018      * Select the L2 window by poking l2cpselr, then write to the window
0019      * via l2cpdr.
0020      */
0021     asm volatile ("mcr p15, 3, %0, c15, c0, 6 @ l2cpselr" : : "r" (addr));
0022     isb();
0023     asm volatile ("mcr p15, 3, %0, c15, c0, 7 @ l2cpdr" : : "r" (val));
0024     isb();
0025 
0026     raw_spin_unlock_irqrestore(&krait_l2_lock, flags);
0027 }
0028 EXPORT_SYMBOL(krait_set_l2_indirect_reg);
0029 
0030 u32 krait_get_l2_indirect_reg(u32 addr)
0031 {
0032     u32 val;
0033     unsigned long flags;
0034 
0035     raw_spin_lock_irqsave(&krait_l2_lock, flags);
0036     /*
0037      * Select the L2 window by poking l2cpselr, then read from the window
0038      * via l2cpdr.
0039      */
0040     asm volatile ("mcr p15, 3, %0, c15, c0, 6 @ l2cpselr" : : "r" (addr));
0041     isb();
0042     asm volatile ("mrc p15, 3, %0, c15, c0, 7 @ l2cpdr" : "=r" (val));
0043 
0044     raw_spin_unlock_irqrestore(&krait_l2_lock, flags);
0045 
0046     return val;
0047 }
0048 EXPORT_SYMBOL(krait_get_l2_indirect_reg);