0001
0002
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
0019
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
0038
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);