krait-l2-accessors.c 1.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748
  1. // SPDX-License-Identifier: GPL-2.0
  2. // Copyright (c) 2018, The Linux Foundation. All rights reserved.
  3. #include <linux/spinlock.h>
  4. #include <linux/export.h>
  5. #include <asm/barrier.h>
  6. #include <asm/krait-l2-accessors.h>
  7. static DEFINE_RAW_SPINLOCK(krait_l2_lock);
  8. void krait_set_l2_indirect_reg(u32 addr, u32 val)
  9. {
  10. unsigned long flags;
  11. raw_spin_lock_irqsave(&krait_l2_lock, flags);
  12. /*
  13. * Select the L2 window by poking l2cpselr, then write to the window
  14. * via l2cpdr.
  15. */
  16. asm volatile ("mcr p15, 3, %0, c15, c0, 6 @ l2cpselr" : : "r" (addr));
  17. isb();
  18. asm volatile ("mcr p15, 3, %0, c15, c0, 7 @ l2cpdr" : : "r" (val));
  19. isb();
  20. raw_spin_unlock_irqrestore(&krait_l2_lock, flags);
  21. }
  22. EXPORT_SYMBOL(krait_set_l2_indirect_reg);
  23. u32 krait_get_l2_indirect_reg(u32 addr)
  24. {
  25. u32 val;
  26. unsigned long flags;
  27. raw_spin_lock_irqsave(&krait_l2_lock, flags);
  28. /*
  29. * Select the L2 window by poking l2cpselr, then read from the window
  30. * via l2cpdr.
  31. */
  32. asm volatile ("mcr p15, 3, %0, c15, c0, 6 @ l2cpselr" : : "r" (addr));
  33. isb();
  34. asm volatile ("mrc p15, 3, %0, c15, c0, 7 @ l2cpdr" : "=r" (val));
  35. raw_spin_unlock_irqrestore(&krait_l2_lock, flags);
  36. return val;
  37. }
  38. EXPORT_SYMBOL(krait_get_l2_indirect_reg);