Orange Pi5 kernel

Deprecated Linux kernel 5.10.110 for OrangePi 5/5B/5+ boards

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