iomap_copy.c (2226B)
1// SPDX-License-Identifier: GPL-2.0-only 2/* 3 * Copyright 2006 PathScale, Inc. All Rights Reserved. 4 */ 5 6#include <linux/export.h> 7#include <linux/io.h> 8 9/** 10 * __iowrite32_copy - copy data to MMIO space, in 32-bit units 11 * @to: destination, in MMIO space (must be 32-bit aligned) 12 * @from: source (must be 32-bit aligned) 13 * @count: number of 32-bit quantities to copy 14 * 15 * Copy data from kernel space to MMIO space, in units of 32 bits at a 16 * time. Order of access is not guaranteed, nor is a memory barrier 17 * performed afterwards. 18 */ 19void __attribute__((weak)) __iowrite32_copy(void __iomem *to, 20 const void *from, 21 size_t count) 22{ 23 u32 __iomem *dst = to; 24 const u32 *src = from; 25 const u32 *end = src + count; 26 27 while (src < end) 28 __raw_writel(*src++, dst++); 29} 30EXPORT_SYMBOL_GPL(__iowrite32_copy); 31 32/** 33 * __ioread32_copy - copy data from MMIO space, in 32-bit units 34 * @to: destination (must be 32-bit aligned) 35 * @from: source, in MMIO space (must be 32-bit aligned) 36 * @count: number of 32-bit quantities to copy 37 * 38 * Copy data from MMIO space to kernel space, in units of 32 bits at a 39 * time. Order of access is not guaranteed, nor is a memory barrier 40 * performed afterwards. 41 */ 42void __ioread32_copy(void *to, const void __iomem *from, size_t count) 43{ 44 u32 *dst = to; 45 const u32 __iomem *src = from; 46 const u32 __iomem *end = src + count; 47 48 while (src < end) 49 *dst++ = __raw_readl(src++); 50} 51EXPORT_SYMBOL_GPL(__ioread32_copy); 52 53/** 54 * __iowrite64_copy - copy data to MMIO space, in 64-bit or 32-bit units 55 * @to: destination, in MMIO space (must be 64-bit aligned) 56 * @from: source (must be 64-bit aligned) 57 * @count: number of 64-bit quantities to copy 58 * 59 * Copy data from kernel space to MMIO space, in units of 32 or 64 bits at a 60 * time. Order of access is not guaranteed, nor is a memory barrier 61 * performed afterwards. 62 */ 63void __attribute__((weak)) __iowrite64_copy(void __iomem *to, 64 const void *from, 65 size_t count) 66{ 67#ifdef CONFIG_64BIT 68 u64 __iomem *dst = to; 69 const u64 *src = from; 70 const u64 *end = src + count; 71 72 while (src < end) 73 __raw_writeq(*src++, dst++); 74#else 75 __iowrite32_copy(to, from, count * 2); 76#endif 77} 78 79EXPORT_SYMBOL_GPL(__iowrite64_copy);