xref: /linux/lib/iomap_copy.c (revision 22ae813b85df7c0b0fc7c8d6f336d6a9f566ff97)
1c27a0d75SBryan O'Sullivan /*
2c27a0d75SBryan O'Sullivan  * Copyright 2006 PathScale, Inc.  All Rights Reserved.
3c27a0d75SBryan O'Sullivan  *
4c27a0d75SBryan O'Sullivan  * This file is free software; you can redistribute it and/or modify
5c27a0d75SBryan O'Sullivan  * it under the terms of version 2 of the GNU General Public License
6c27a0d75SBryan O'Sullivan  * as published by the Free Software Foundation.
7c27a0d75SBryan O'Sullivan  *
8c27a0d75SBryan O'Sullivan  * This program is distributed in the hope that it will be useful,
9c27a0d75SBryan O'Sullivan  * but WITHOUT ANY WARRANTY; without even the implied warranty of
10c27a0d75SBryan O'Sullivan  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
11c27a0d75SBryan O'Sullivan  * GNU General Public License for more details.
12c27a0d75SBryan O'Sullivan  *
13c27a0d75SBryan O'Sullivan  * You should have received a copy of the GNU General Public License
14c27a0d75SBryan O'Sullivan  * along with this program; if not, write to the Free Software Foundation,
15c27a0d75SBryan O'Sullivan  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA.
16c27a0d75SBryan O'Sullivan  */
17c27a0d75SBryan O'Sullivan 
18c27a0d75SBryan O'Sullivan #include <linux/module.h>
19ad6b97fcSAl Viro #include <linux/io.h>
20c27a0d75SBryan O'Sullivan 
21c27a0d75SBryan O'Sullivan /**
22c27a0d75SBryan O'Sullivan  * __iowrite32_copy - copy data to MMIO space, in 32-bit units
23c27a0d75SBryan O'Sullivan  * @to: destination, in MMIO space (must be 32-bit aligned)
24c27a0d75SBryan O'Sullivan  * @from: source (must be 32-bit aligned)
25c27a0d75SBryan O'Sullivan  * @count: number of 32-bit quantities to copy
26c27a0d75SBryan O'Sullivan  *
27c27a0d75SBryan O'Sullivan  * Copy data from kernel space to MMIO space, in units of 32 bits at a
28c27a0d75SBryan O'Sullivan  * time.  Order of access is not guaranteed, nor is a memory barrier
29c27a0d75SBryan O'Sullivan  * performed afterwards.
30c27a0d75SBryan O'Sullivan  */
31c27a0d75SBryan O'Sullivan void __attribute__((weak)) __iowrite32_copy(void __iomem *to,
32c27a0d75SBryan O'Sullivan 					    const void *from,
33c27a0d75SBryan O'Sullivan 					    size_t count)
34c27a0d75SBryan O'Sullivan {
35c27a0d75SBryan O'Sullivan 	u32 __iomem *dst = to;
36c27a0d75SBryan O'Sullivan 	const u32 *src = from;
37c27a0d75SBryan O'Sullivan 	const u32 *end = src + count;
38c27a0d75SBryan O'Sullivan 
39c27a0d75SBryan O'Sullivan 	while (src < end)
40c27a0d75SBryan O'Sullivan 		__raw_writel(*src++, dst++);
41c27a0d75SBryan O'Sullivan }
42c27a0d75SBryan O'Sullivan EXPORT_SYMBOL_GPL(__iowrite32_copy);
43*22ae813bSBrice Goglin 
44*22ae813bSBrice Goglin /**
45*22ae813bSBrice Goglin  * __iowrite64_copy - copy data to MMIO space, in 64-bit or 32-bit units
46*22ae813bSBrice Goglin  * @to: destination, in MMIO space (must be 64-bit aligned)
47*22ae813bSBrice Goglin  * @from: source (must be 64-bit aligned)
48*22ae813bSBrice Goglin  * @count: number of 64-bit quantities to copy
49*22ae813bSBrice Goglin  *
50*22ae813bSBrice Goglin  * Copy data from kernel space to MMIO space, in units of 32 or 64 bits at a
51*22ae813bSBrice Goglin  * time.  Order of access is not guaranteed, nor is a memory barrier
52*22ae813bSBrice Goglin  * performed afterwards.
53*22ae813bSBrice Goglin  */
54*22ae813bSBrice Goglin void __attribute__((weak)) __iowrite64_copy(void __iomem *to,
55*22ae813bSBrice Goglin 					    const void *from,
56*22ae813bSBrice Goglin 					    size_t count)
57*22ae813bSBrice Goglin {
58*22ae813bSBrice Goglin #ifdef CONFIG_64BIT
59*22ae813bSBrice Goglin 	u64 __iomem *dst = to;
60*22ae813bSBrice Goglin 	const u64 *src = from;
61*22ae813bSBrice Goglin 	const u64 *end = src + count;
62*22ae813bSBrice Goglin 
63*22ae813bSBrice Goglin 	while (src < end)
64*22ae813bSBrice Goglin 		__raw_writeq(*src++, dst++);
65*22ae813bSBrice Goglin #else
66*22ae813bSBrice Goglin 	__iowrite32_copy(to, from, count * 2);
67*22ae813bSBrice Goglin #endif
68*22ae813bSBrice Goglin }
69*22ae813bSBrice Goglin 
70*22ae813bSBrice Goglin EXPORT_SYMBOL_GPL(__iowrite64_copy);
71