1 // SPDX-License-Identifier: GPL-2.0-only 1 2 /* 3 * Copyright(c) 2017 IBM Corporation. All righ 4 */ 5 6 #include <linux/string.h> 7 #include <linux/export.h> 8 #include <linux/uaccess.h> 9 #include <linux/libnvdimm.h> 10 11 #include <asm/cacheflush.h> 12 13 static inline void __clean_pmem_range(unsigned 14 { 15 unsigned long shift = l1_dcache_shift( 16 unsigned long bytes = l1_dcache_bytes( 17 void *addr = (void *)(start & ~(bytes 18 unsigned long size = stop - (unsigned 19 unsigned long i; 20 21 for (i = 0; i < size >> shift; i++, ad 22 asm volatile(PPC_DCBSTPS(%0, % 23 } 24 25 static inline void __flush_pmem_range(unsigned 26 { 27 unsigned long shift = l1_dcache_shift( 28 unsigned long bytes = l1_dcache_bytes( 29 void *addr = (void *)(start & ~(bytes 30 unsigned long size = stop - (unsigned 31 unsigned long i; 32 33 for (i = 0; i < size >> shift; i++, ad 34 asm volatile(PPC_DCBFPS(%0, %1 35 } 36 37 static inline void clean_pmem_range(unsigned l 38 { 39 if (cpu_has_feature(CPU_FTR_ARCH_207S) 40 return __clean_pmem_range(star 41 } 42 43 static inline void flush_pmem_range(unsigned l 44 { 45 if (cpu_has_feature(CPU_FTR_ARCH_207S) 46 return __flush_pmem_range(star 47 } 48 49 /* 50 * CONFIG_ARCH_HAS_PMEM_API symbols 51 */ 52 void arch_wb_cache_pmem(void *addr, size_t siz 53 { 54 unsigned long start = (unsigned long) 55 clean_pmem_range(start, start + size); 56 } 57 EXPORT_SYMBOL_GPL(arch_wb_cache_pmem); 58 59 void arch_invalidate_pmem(void *addr, size_t s 60 { 61 unsigned long start = (unsigned long) 62 flush_pmem_range(start, start + size); 63 } 64 EXPORT_SYMBOL_GPL(arch_invalidate_pmem); 65 66 /* 67 * CONFIG_ARCH_HAS_UACCESS_FLUSHCACHE symbols 68 */ 69 long __copy_from_user_flushcache(void *dest, c 70 unsigned size) 71 { 72 unsigned long copied, start = (unsigne 73 74 copied = __copy_from_user(dest, src, s 75 clean_pmem_range(start, start + size); 76 77 return copied; 78 } 79 80 void memcpy_flushcache(void *dest, const void 81 { 82 unsigned long start = (unsigned long) 83 84 memcpy(dest, src, size); 85 clean_pmem_range(start, start + size); 86 } 87 EXPORT_SYMBOL(memcpy_flushcache); 88
Linux® is a registered trademark of Linus Torvalds in the United States and other countries.
TOMOYO® is a registered trademark of NTT DATA CORPORATION.