Blame view

kernel/linux-imx6_3.14.28/arch/um/sys-ppc/misc.S 2.29 KB
6b13f685e   김민수   BSP 최초 추가
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
  /*
   * This file contains miscellaneous low-level functions.
   *    Copyright (C) 1995-1996 Gary Thomas (gdt@linuxppc.org)
   *
   * Largely rewritten by Cort Dougan (cort@cs.nmt.edu)
   * and Paul Mackerras.
   *
   * A couple of functions stolen from arch/ppc/kernel/misc.S for UML
   * by Chris Emerson.
   *
   * This program is free software; you can redistribute it and/or
   * modify it under the terms of the GNU General Public License
   * as published by the Free Software Foundation; either version
   * 2 of the License, or (at your option) any later version.
   *
   */
  
  #include <asm/processor.h>
  #include "ppc_asm.h"
  
  #if defined(CONFIG_4xx) || defined(CONFIG_8xx)
  #define CACHE_LINE_SIZE		16
  #define LG_CACHE_LINE_SIZE	4
  #define MAX_COPY_PREFETCH	1
  #else
  #define CACHE_LINE_SIZE		32
  #define LG_CACHE_LINE_SIZE	5
  #define MAX_COPY_PREFETCH	4
  #endif /* CONFIG_4xx || CONFIG_8xx */
  
  	.text
  
  /*
   * Clear a page using the dcbz instruction, which doesn't cause any
   * memory traffic (except to write out any cache lines which get
   * displaced).  This only works on cacheable memory.
   */
  _GLOBAL(clear_page)
  	li	r0,4096/CACHE_LINE_SIZE
  	mtctr	r0
  #ifdef CONFIG_8xx
  	li	r4, 0
  1:	stw	r4, 0(r3)
  	stw	r4, 4(r3)
  	stw	r4, 8(r3)
  	stw	r4, 12(r3)
  #else
  1:	dcbz	0,r3
  #endif
  	addi	r3,r3,CACHE_LINE_SIZE
  	bdnz	1b
  	blr
  
  /*
   * Copy a whole page.  We use the dcbz instruction on the destination
   * to reduce memory traffic (it eliminates the unnecessary reads of
   * the destination into cache).  This requires that the destination
   * is cacheable.
   */
  #define COPY_16_BYTES		\
  	lwz	r6,4(r4);	\
  	lwz	r7,8(r4);	\
  	lwz	r8,12(r4);	\
  	lwzu	r9,16(r4);	\
  	stw	r6,4(r3);	\
  	stw	r7,8(r3);	\
  	stw	r8,12(r3);	\
  	stwu	r9,16(r3)
  
  _GLOBAL(copy_page)
  	addi	r3,r3,-4
  	addi	r4,r4,-4
  	li	r5,4
  
  #ifndef CONFIG_8xx
  #if MAX_COPY_PREFETCH > 1
  	li	r0,MAX_COPY_PREFETCH
  	li	r11,4
  	mtctr	r0
  11:	dcbt	r11,r4
  	addi	r11,r11,CACHE_LINE_SIZE
  	bdnz	11b
  #else /* MAX_COPY_PREFETCH == 1 */
  	dcbt	r5,r4
  	li	r11,CACHE_LINE_SIZE+4
  #endif /* MAX_COPY_PREFETCH */
  #endif /* CONFIG_8xx */
  
  	li	r0,4096/CACHE_LINE_SIZE
  	mtctr	r0
  1:
  #ifndef CONFIG_8xx
  	dcbt	r11,r4
  	dcbz	r5,r3
  #endif
  	COPY_16_BYTES
  #if CACHE_LINE_SIZE >= 32
  	COPY_16_BYTES
  #if CACHE_LINE_SIZE >= 64
  	COPY_16_BYTES
  	COPY_16_BYTES
  #if CACHE_LINE_SIZE >= 128
  	COPY_16_BYTES
  	COPY_16_BYTES
  	COPY_16_BYTES
  	COPY_16_BYTES
  #endif
  #endif
  #endif
  	bdnz	1b
  	blr