Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

loongarch: Use new fallback IO memcpy/memset

Use the new fallback memcpy_{from,to}io and memset_io functions from
lib/iomem_copy.c on the loongarch processor architecture.

Reviewed-by: Yann Sionneau <ysionneau@kalrayinc.com>
Signed-off-by: Julian Vetter <jvetter@kalrayinc.com>
Signed-off-by: Arnd Bergmann <arnd@arndb.de>

authored by

Julian Vetter and committed by
Arnd Bergmann
6e3f5e62 4c9397cf

+1 -105
-10
arch/loongarch/include/asm/io.h
··· 62 62 63 63 #define mmiowb() wmb() 64 64 65 - /* 66 - * String version of I/O memory access operations. 67 - */ 68 - extern void __memset_io(volatile void __iomem *dst, int c, size_t count); 69 - extern void __memcpy_toio(volatile void __iomem *to, const void *from, size_t count); 70 - extern void __memcpy_fromio(void *to, const volatile void __iomem *from, size_t count); 71 - #define memset_io(c, v, l) __memset_io((c), (v), (l)) 72 - #define memcpy_fromio(a, c, l) __memcpy_fromio((a), (c), (l)) 73 - #define memcpy_toio(c, a, l) __memcpy_toio((c), (a), (l)) 74 - 75 65 #define __io_aw() mmiowb() 76 66 77 67 #ifdef CONFIG_KFENCE
+1 -1
arch/loongarch/kernel/Makefile
··· 8 8 extra-y := vmlinux.lds 9 9 10 10 obj-y += head.o cpu-probe.o cacheinfo.o env.o setup.o entry.o genex.o \ 11 - traps.o irq.o idle.o process.o dma.o mem.o io.o reset.o switch.o \ 11 + traps.o irq.o idle.o process.o dma.o mem.o reset.o switch.o \ 12 12 elf.o syscall.o signal.o time.o topology.o inst.o ptrace.o vdso.o \ 13 13 alternative.o unwind.o 14 14
-94
arch/loongarch/kernel/io.c
··· 1 - // SPDX-License-Identifier: GPL-2.0 2 - /* 3 - * Copyright (C) 2020-2022 Loongson Technology Corporation Limited 4 - */ 5 - #include <linux/export.h> 6 - #include <linux/types.h> 7 - #include <linux/io.h> 8 - 9 - /* 10 - * Copy data from IO memory space to "real" memory space. 11 - */ 12 - void __memcpy_fromio(void *to, const volatile void __iomem *from, size_t count) 13 - { 14 - while (count && !IS_ALIGNED((unsigned long)from, 8)) { 15 - *(u8 *)to = __raw_readb(from); 16 - from++; 17 - to++; 18 - count--; 19 - } 20 - 21 - while (count >= 8) { 22 - *(u64 *)to = __raw_readq(from); 23 - from += 8; 24 - to += 8; 25 - count -= 8; 26 - } 27 - 28 - while (count) { 29 - *(u8 *)to = __raw_readb(from); 30 - from++; 31 - to++; 32 - count--; 33 - } 34 - } 35 - EXPORT_SYMBOL(__memcpy_fromio); 36 - 37 - /* 38 - * Copy data from "real" memory space to IO memory space. 39 - */ 40 - void __memcpy_toio(volatile void __iomem *to, const void *from, size_t count) 41 - { 42 - while (count && !IS_ALIGNED((unsigned long)to, 8)) { 43 - __raw_writeb(*(u8 *)from, to); 44 - from++; 45 - to++; 46 - count--; 47 - } 48 - 49 - while (count >= 8) { 50 - __raw_writeq(*(u64 *)from, to); 51 - from += 8; 52 - to += 8; 53 - count -= 8; 54 - } 55 - 56 - while (count) { 57 - __raw_writeb(*(u8 *)from, to); 58 - from++; 59 - to++; 60 - count--; 61 - } 62 - } 63 - EXPORT_SYMBOL(__memcpy_toio); 64 - 65 - /* 66 - * "memset" on IO memory space. 67 - */ 68 - void __memset_io(volatile void __iomem *dst, int c, size_t count) 69 - { 70 - u64 qc = (u8)c; 71 - 72 - qc |= qc << 8; 73 - qc |= qc << 16; 74 - qc |= qc << 32; 75 - 76 - while (count && !IS_ALIGNED((unsigned long)dst, 8)) { 77 - __raw_writeb(c, dst); 78 - dst++; 79 - count--; 80 - } 81 - 82 - while (count >= 8) { 83 - __raw_writeq(qc, dst); 84 - dst += 8; 85 - count -= 8; 86 - } 87 - 88 - while (count) { 89 - __raw_writeb(c, dst); 90 - dst++; 91 - count--; 92 - } 93 - } 94 - EXPORT_SYMBOL(__memset_io);