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-only
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   2) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   3)  * Cache management functions for Hexagon
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   4)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   5)  * Copyright (c) 2010-2011, The Linux Foundation. All rights reserved.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   6)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   7) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   8) #include <linux/mm.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   9) #include <asm/cacheflush.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  10) #include <asm/hexagon_vm.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  11) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  12) #define spanlines(start, end) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  13) 	(((end - (start & ~(LINESIZE - 1))) >> LINEBITS) + 1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  14) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  15) void flush_dcache_range(unsigned long start, unsigned long end)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  16) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  17) 	unsigned long lines = spanlines(start, end-1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  18) 	unsigned long i, flags;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  19) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  20) 	start &= ~(LINESIZE - 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  21) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  22) 	local_irq_save(flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  23) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  24) 	for (i = 0; i < lines; i++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  25) 		__asm__ __volatile__ (
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  26) 		"	dccleaninva(%0);	"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  27) 		:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  28) 		: "r" (start)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  29) 		);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  30) 		start += LINESIZE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  31) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  32) 	local_irq_restore(flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  33) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  34) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  35) void flush_icache_range(unsigned long start, unsigned long end)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  36) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  37) 	unsigned long lines = spanlines(start, end-1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  38) 	unsigned long i, flags;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  39) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  40) 	start &= ~(LINESIZE - 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  41) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  42) 	local_irq_save(flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  43) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  44) 	for (i = 0; i < lines; i++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  45) 		__asm__ __volatile__ (
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  46) 			"	dccleana(%0); "
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  47) 			"	icinva(%0);	"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  48) 			:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  49) 			: "r" (start)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  50) 		);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  51) 		start += LINESIZE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  52) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  53) 	__asm__ __volatile__ (
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  54) 		"isync"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  55) 	);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  56) 	local_irq_restore(flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  57) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  58) EXPORT_SYMBOL(flush_icache_range);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  59) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  60) void hexagon_clean_dcache_range(unsigned long start, unsigned long end)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  61) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  62) 	unsigned long lines = spanlines(start, end-1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  63) 	unsigned long i, flags;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  64) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  65) 	start &= ~(LINESIZE - 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  66) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  67) 	local_irq_save(flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  68) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  69) 	for (i = 0; i < lines; i++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  70) 		__asm__ __volatile__ (
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  71) 		"	dccleana(%0);	"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  72) 		:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  73) 		: "r" (start)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  74) 		);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  75) 		start += LINESIZE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  76) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  77) 	local_irq_restore(flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  78) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  79) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  80) void hexagon_inv_dcache_range(unsigned long start, unsigned long end)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  81) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  82) 	unsigned long lines = spanlines(start, end-1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  83) 	unsigned long i, flags;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  84) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  85) 	start &= ~(LINESIZE - 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  86) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  87) 	local_irq_save(flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  88) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  89) 	for (i = 0; i < lines; i++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  90) 		__asm__ __volatile__ (
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  91) 		"	dcinva(%0);	"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  92) 		:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  93) 		: "r" (start)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  94) 		);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  95) 		start += LINESIZE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  96) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  97) 	local_irq_restore(flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  98) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  99) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 100) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 101) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 102) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 103) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 104)  * This is just really brutal and shouldn't be used anyways,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 105)  * especially on V2.  Left here just in case.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 106)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 107) void flush_cache_all_hexagon(void)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 108) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 109) 	unsigned long flags;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 110) 	local_irq_save(flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 111) 	__vmcache_ickill();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 112) 	__vmcache_dckill();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 113) 	__vmcache_l2kill();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 114) 	local_irq_restore(flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 115) 	mb();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 116) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 117) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 118) void copy_to_user_page(struct vm_area_struct *vma, struct page *page,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 119) 		       unsigned long vaddr, void *dst, void *src, int len)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 120) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 121) 	memcpy(dst, src, len);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 122) 	if (vma->vm_flags & VM_EXEC) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 123) 		flush_icache_range((unsigned long) dst,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 124) 		(unsigned long) dst + len);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 125) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 126) }