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) #ifndef _ASM_POWERPC_SYNCH_H 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3) #define _ASM_POWERPC_SYNCH_H 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4) #ifdef __KERNEL__
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6) #include <asm/cputable.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7) #include <asm/feature-fixups.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8) #include <asm/ppc-opcode.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10) #ifndef __ASSEMBLY__
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11) extern unsigned int __start___lwsync_fixup, __stop___lwsync_fixup;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12) extern void do_lwsync_fixups(unsigned long value, void *fixup_start,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 13) 			     void *fixup_end);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 14) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 15) static inline void eieio(void)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 16) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 17) 	__asm__ __volatile__ ("eieio" : : : "memory");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 18) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 19) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 20) static inline void isync(void)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 21) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 22) 	__asm__ __volatile__ ("isync" : : : "memory");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 23) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 24) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 25) static inline void ppc_after_tlbiel_barrier(void)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 26) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 27) 	asm volatile("ptesync": : :"memory");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 28) 	/*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 29) 	 * POWER9, POWER10 need a cp_abort after tlbiel to ensure the copy is
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 30) 	 * invalidated correctly. If this is not done, the paste can take data
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 31) 	 * from the physical address that was translated at copy time.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 32) 	 *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 33) 	 * POWER9 in practice does not need this, because address spaces with
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 34) 	 * accelerators mapped will use tlbie (which does invalidate the copy)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 35) 	 * to invalidate translations. It's not possible to limit POWER10 this
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 36) 	 * way due to local copy-paste.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 37) 	 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 38) 	asm volatile(ASM_FTR_IFSET(PPC_CP_ABORT, "", %0) : : "i" (CPU_FTR_ARCH_31) : "memory");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 39) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 40) #endif /* __ASSEMBLY__ */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 41) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 42) #if defined(__powerpc64__)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 43) #    define LWSYNC	lwsync
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 44) #elif defined(CONFIG_E500)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 45) #    define LWSYNC					\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 46) 	START_LWSYNC_SECTION(96);			\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 47) 	sync;						\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 48) 	MAKE_LWSYNC_SECTION_ENTRY(96, __lwsync_fixup);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 49) #else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 50) #    define LWSYNC	sync
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 51) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 52) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 53) #ifdef CONFIG_SMP
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 54) #define __PPC_ACQUIRE_BARRIER				\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 55) 	START_LWSYNC_SECTION(97);			\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 56) 	isync;						\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 57) 	MAKE_LWSYNC_SECTION_ENTRY(97, __lwsync_fixup);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 58) #define PPC_ACQUIRE_BARRIER	 "\n" stringify_in_c(__PPC_ACQUIRE_BARRIER)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 59) #define PPC_RELEASE_BARRIER	 stringify_in_c(LWSYNC) "\n"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 60) #define PPC_ATOMIC_ENTRY_BARRIER "\n" stringify_in_c(sync) "\n"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 61) #define PPC_ATOMIC_EXIT_BARRIER	 "\n" stringify_in_c(sync) "\n"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 62) #else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 63) #define PPC_ACQUIRE_BARRIER
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 64) #define PPC_RELEASE_BARRIER
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 65) #define PPC_ATOMIC_ENTRY_BARRIER
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 66) #define PPC_ATOMIC_EXIT_BARRIER
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 67) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 68) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 69) #endif /* __KERNEL__ */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 70) #endif	/* _ASM_POWERPC_SYNCH_H */