diff options
author | Marc Zyngier <marc.zyngier@arm.com> | 2012-03-05 06:49:33 -0500 |
---|---|---|
committer | Catalin Marinas <catalin.marinas@arm.com> | 2012-09-17 08:42:18 -0400 |
commit | f27bb139c3876806a2c82e979d2dbbece44c66df (patch) | |
tree | b89925966ca77224f0605dc85521a2e55ab89c70 /arch/arm64/lib | |
parent | 030896885ade0a17c8638e1ede8d3ca7099f0302 (diff) |
arm64: Miscellaneous library functions
This patch adds udelay, memory and bit operations together with the
ksyms exports.
Signed-off-by: Marc Zyngier <marc.zyngier@arm.com>
Signed-off-by: Will Deacon <will.deacon@arm.com>
Signed-off-by: Catalin Marinas <catalin.marinas@arm.com>
Acked-by: Tony Lindgren <tony@atomide.com>
Acked-by: Nicolas Pitre <nico@linaro.org>
Acked-by: Olof Johansson <olof@lixom.net>
Acked-by: Santosh Shilimkar <santosh.shilimkar@ti.com>
Diffstat (limited to 'arch/arm64/lib')
-rw-r--r-- | arch/arm64/lib/Makefile | 4 | ||||
-rw-r--r-- | arch/arm64/lib/bitops.c | 25 | ||||
-rw-r--r-- | arch/arm64/lib/clear_page.S | 39 | ||||
-rw-r--r-- | arch/arm64/lib/copy_page.S | 46 | ||||
-rw-r--r-- | arch/arm64/lib/delay.c | 55 |
5 files changed, 169 insertions, 0 deletions
diff --git a/arch/arm64/lib/Makefile b/arch/arm64/lib/Makefile new file mode 100644 index 000000000000..2fb7f6092aae --- /dev/null +++ b/arch/arm64/lib/Makefile | |||
@@ -0,0 +1,4 @@ | |||
1 | lib-y := bitops.o delay.o \ | ||
2 | strncpy_from_user.o strnlen_user.o clear_user.o \ | ||
3 | copy_from_user.o copy_to_user.o copy_in_user.o \ | ||
4 | copy_page.o clear_page.o | ||
diff --git a/arch/arm64/lib/bitops.c b/arch/arm64/lib/bitops.c new file mode 100644 index 000000000000..aa4965e60acc --- /dev/null +++ b/arch/arm64/lib/bitops.c | |||
@@ -0,0 +1,25 @@ | |||
1 | /* | ||
2 | * Copyright (C) 2012 ARM Limited | ||
3 | * | ||
4 | * This program is free software; you can redistribute it and/or modify | ||
5 | * it under the terms of the GNU General Public License version 2 as | ||
6 | * published by the Free Software Foundation. | ||
7 | * | ||
8 | * This program is distributed in the hope that it will be useful, | ||
9 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
10 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
11 | * GNU General Public License for more details. | ||
12 | * | ||
13 | * You should have received a copy of the GNU General Public License | ||
14 | * along with this program. If not, see <http://www.gnu.org/licenses/>. | ||
15 | */ | ||
16 | |||
17 | #include <linux/kernel.h> | ||
18 | #include <linux/spinlock.h> | ||
19 | #include <linux/atomic.h> | ||
20 | |||
21 | #ifdef CONFIG_SMP | ||
22 | arch_spinlock_t __atomic_hash[ATOMIC_HASH_SIZE] __lock_aligned = { | ||
23 | [0 ... (ATOMIC_HASH_SIZE-1)] = __ARCH_SPIN_LOCK_UNLOCKED | ||
24 | }; | ||
25 | #endif | ||
diff --git a/arch/arm64/lib/clear_page.S b/arch/arm64/lib/clear_page.S new file mode 100644 index 000000000000..ef08e905e35b --- /dev/null +++ b/arch/arm64/lib/clear_page.S | |||
@@ -0,0 +1,39 @@ | |||
1 | /* | ||
2 | * Copyright (C) 2012 ARM Ltd. | ||
3 | * | ||
4 | * This program is free software; you can redistribute it and/or modify | ||
5 | * it under the terms of the GNU General Public License version 2 as | ||
6 | * published by the Free Software Foundation. | ||
7 | * | ||
8 | * This program is distributed in the hope that it will be useful, | ||
9 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
10 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
11 | * GNU General Public License for more details. | ||
12 | * | ||
13 | * You should have received a copy of the GNU General Public License | ||
14 | * along with this program. If not, see <http://www.gnu.org/licenses/>. | ||
15 | */ | ||
16 | |||
17 | #include <linux/linkage.h> | ||
18 | #include <linux/const.h> | ||
19 | #include <asm/assembler.h> | ||
20 | #include <asm/page.h> | ||
21 | |||
22 | /* | ||
23 | * Clear page @dest | ||
24 | * | ||
25 | * Parameters: | ||
26 | * x0 - dest | ||
27 | */ | ||
28 | ENTRY(clear_page) | ||
29 | mrs x1, dczid_el0 | ||
30 | and w1, w1, #0xf | ||
31 | mov x2, #4 | ||
32 | lsl x1, x2, x1 | ||
33 | |||
34 | 1: dc zva, x0 | ||
35 | add x0, x0, x1 | ||
36 | tst x0, #(PAGE_SIZE - 1) | ||
37 | b.ne 1b | ||
38 | ret | ||
39 | ENDPROC(clear_page) | ||
diff --git a/arch/arm64/lib/copy_page.S b/arch/arm64/lib/copy_page.S new file mode 100644 index 000000000000..512b9a7b980e --- /dev/null +++ b/arch/arm64/lib/copy_page.S | |||
@@ -0,0 +1,46 @@ | |||
1 | /* | ||
2 | * Copyright (C) 2012 ARM Ltd. | ||
3 | * | ||
4 | * This program is free software; you can redistribute it and/or modify | ||
5 | * it under the terms of the GNU General Public License version 2 as | ||
6 | * published by the Free Software Foundation. | ||
7 | * | ||
8 | * This program is distributed in the hope that it will be useful, | ||
9 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
10 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
11 | * GNU General Public License for more details. | ||
12 | * | ||
13 | * You should have received a copy of the GNU General Public License | ||
14 | * along with this program. If not, see <http://www.gnu.org/licenses/>. | ||
15 | */ | ||
16 | |||
17 | #include <linux/linkage.h> | ||
18 | #include <linux/const.h> | ||
19 | #include <asm/assembler.h> | ||
20 | #include <asm/page.h> | ||
21 | |||
22 | /* | ||
23 | * Copy a page from src to dest (both are page aligned) | ||
24 | * | ||
25 | * Parameters: | ||
26 | * x0 - dest | ||
27 | * x1 - src | ||
28 | */ | ||
29 | ENTRY(copy_page) | ||
30 | /* Assume cache line size is 64 bytes. */ | ||
31 | prfm pldl1strm, [x1, #64] | ||
32 | 1: ldp x2, x3, [x1] | ||
33 | ldp x4, x5, [x1, #16] | ||
34 | ldp x6, x7, [x1, #32] | ||
35 | ldp x8, x9, [x1, #48] | ||
36 | add x1, x1, #64 | ||
37 | prfm pldl1strm, [x1, #64] | ||
38 | stnp x2, x3, [x0] | ||
39 | stnp x4, x5, [x0, #16] | ||
40 | stnp x6, x7, [x0, #32] | ||
41 | stnp x8, x9, [x0, #48] | ||
42 | add x0, x0, #64 | ||
43 | tst x1, #(PAGE_SIZE - 1) | ||
44 | b.ne 1b | ||
45 | ret | ||
46 | ENDPROC(copy_page) | ||
diff --git a/arch/arm64/lib/delay.c b/arch/arm64/lib/delay.c new file mode 100644 index 000000000000..dad4ec9bbfd1 --- /dev/null +++ b/arch/arm64/lib/delay.c | |||
@@ -0,0 +1,55 @@ | |||
1 | /* | ||
2 | * Delay loops based on the OpenRISC implementation. | ||
3 | * | ||
4 | * Copyright (C) 2012 ARM Limited | ||
5 | * | ||
6 | * This program is free software; you can redistribute it and/or modify | ||
7 | * it under the terms of the GNU General Public License version 2 as | ||
8 | * published by the Free Software Foundation. | ||
9 | * | ||
10 | * This program is distributed in the hope that it will be useful, | ||
11 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
12 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
13 | * GNU General Public License for more details. | ||
14 | * | ||
15 | * You should have received a copy of the GNU General Public License | ||
16 | * along with this program. If not, see <http://www.gnu.org/licenses/>. | ||
17 | * | ||
18 | * Author: Will Deacon <will.deacon@arm.com> | ||
19 | */ | ||
20 | |||
21 | #include <linux/delay.h> | ||
22 | #include <linux/init.h> | ||
23 | #include <linux/kernel.h> | ||
24 | #include <linux/module.h> | ||
25 | #include <linux/timex.h> | ||
26 | |||
27 | void __delay(unsigned long cycles) | ||
28 | { | ||
29 | cycles_t start = get_cycles(); | ||
30 | |||
31 | while ((get_cycles() - start) < cycles) | ||
32 | cpu_relax(); | ||
33 | } | ||
34 | EXPORT_SYMBOL(__delay); | ||
35 | |||
36 | inline void __const_udelay(unsigned long xloops) | ||
37 | { | ||
38 | unsigned long loops; | ||
39 | |||
40 | loops = xloops * loops_per_jiffy * HZ; | ||
41 | __delay(loops >> 32); | ||
42 | } | ||
43 | EXPORT_SYMBOL(__const_udelay); | ||
44 | |||
45 | void __udelay(unsigned long usecs) | ||
46 | { | ||
47 | __const_udelay(usecs * 0x10C7UL); /* 2**32 / 1000000 (rounded up) */ | ||
48 | } | ||
49 | EXPORT_SYMBOL(__udelay); | ||
50 | |||
51 | void __ndelay(unsigned long nsecs) | ||
52 | { | ||
53 | __const_udelay(nsecs * 0x5UL); /* 2**32 / 1000000000 (rounded up) */ | ||
54 | } | ||
55 | EXPORT_SYMBOL(__ndelay); | ||