hc
2024-12-19 9370bb92b2d16684ee45cf24e879c93c509162da
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
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
/* SPDX-License-Identifier: GPL-2.0-only */
/*
 *  linux/arch/arm/mm/arm740.S: utility functions for ARM740
 *
 *  Copyright (C) 2004-2006 Hyok S. Choi (hyok.choi@samsung.com)
 */
#include <linux/linkage.h>
#include <linux/init.h>
#include <linux/pgtable.h>
#include <asm/assembler.h>
#include <asm/asm-offsets.h>
#include <asm/hwcap.h>
#include <asm/pgtable-hwdef.h>
#include <asm/ptrace.h>
 
#include "proc-macros.S"
 
   .text
/*
 * cpu_arm740_proc_init()
 * cpu_arm740_do_idle()
 * cpu_arm740_dcache_clean_area()
 * cpu_arm740_switch_mm()
 *
 * These are not required.
 */
ENTRY(cpu_arm740_proc_init)
ENTRY(cpu_arm740_do_idle)
ENTRY(cpu_arm740_dcache_clean_area)
ENTRY(cpu_arm740_switch_mm)
   ret    lr
 
/*
 * cpu_arm740_proc_fin()
 */
ENTRY(cpu_arm740_proc_fin)
   mrc    p15, 0, r0, c1, c0, 0
   bic    r0, r0, #0x3f000000        @ bank/f/lock/s
   bic    r0, r0, #0x0000000c        @ w-buffer/cache
   mcr    p15, 0, r0, c1, c0, 0        @ disable caches
   ret    lr
 
/*
 * cpu_arm740_reset(loc)
 * Params  : r0 = address to jump to
 * Notes   : This sets up everything for a reset
 */
   .pushsection    .idmap.text, "ax"
ENTRY(cpu_arm740_reset)
   mov    ip, #0
   mcr    p15, 0, ip, c7, c0, 0        @ invalidate cache
   mrc    p15, 0, ip, c1, c0, 0        @ get ctrl register
   bic    ip, ip, #0x0000000c        @ ............wc..
   mcr    p15, 0, ip, c1, c0, 0        @ ctrl register
   ret    r0
ENDPROC(cpu_arm740_reset)
   .popsection
 
   .type    __arm740_setup, #function
__arm740_setup:
   mov    r0, #0
   mcr    p15, 0, r0, c7, c0, 0        @ invalidate caches
 
   mcr    p15, 0, r0, c6, c3        @ disable area 3~7
   mcr    p15, 0, r0, c6, c4
   mcr    p15, 0, r0, c6, c5
   mcr    p15, 0, r0, c6, c6
   mcr    p15, 0, r0, c6, c7
 
   mov    r0, #0x0000003F            @ base = 0, size = 4GB
   mcr    p15, 0, r0, c6,    c0        @ set area 0, default
 
   ldr    r0, =(CONFIG_DRAM_BASE & 0xFFFFF000) @ base[31:12] of RAM
   ldr    r3, =(CONFIG_DRAM_SIZE >> 12)    @ size of RAM (must be >= 4KB)
   mov    r4, #10                @ 11 is the minimum (4KB)
1:    add    r4, r4, #1            @ area size *= 2
   movs    r3, r3, lsr #1
   bne    1b                @ count not zero r-shift
   orr    r0, r0, r4, lsl #1        @ the area register value
   orr    r0, r0, #1            @ set enable bit
   mcr    p15, 0, r0, c6,    c1        @ set area 1, RAM
 
   ldr    r0, =(CONFIG_FLASH_MEM_BASE & 0xFFFFF000) @ base[31:12] of FLASH
   ldr    r3, =(CONFIG_FLASH_SIZE >> 12)    @ size of FLASH (must be >= 4KB)
   cmp    r3, #0
   moveq    r0, #0
   beq    2f
   mov    r4, #10                @ 11 is the minimum (4KB)
1:    add    r4, r4, #1            @ area size *= 2
   movs    r3, r3, lsr #1
   bne    1b                @ count not zero r-shift
   orr    r0, r0, r4, lsl #1        @ the area register value
   orr    r0, r0, #1            @ set enable bit
2:    mcr    p15, 0, r0, c6,    c2        @ set area 2, ROM/FLASH
 
   mov    r0, #0x06
   mcr    p15, 0, r0, c2, c0        @ Region 1&2 cacheable
#ifdef CONFIG_CPU_DCACHE_WRITETHROUGH
   mov    r0, #0x00            @ disable whole write buffer
#else
   mov    r0, #0x02            @ Region 1 write bufferred
#endif
   mcr    p15, 0, r0, c3, c0
 
   mov    r0, #0x10000
   sub    r0, r0, #1            @ r0 = 0xffff
   mcr    p15, 0, r0, c5, c0        @ all read/write access
 
   mrc    p15, 0, r0, c1, c0        @ get control register
   bic    r0, r0, #0x3F000000        @ set to standard caching mode
                       @ need some benchmark
   orr    r0, r0, #0x0000000d        @ MPU/Cache/WB
 
   ret    lr
 
   .size    __arm740_setup, . - __arm740_setup
 
   __INITDATA
 
   @ define struct processor (see <asm/proc-fns.h> and proc-macros.S)
   define_processor_functions arm740, dabort=v4t_late_abort, pabort=legacy_pabort, nommu=1
 
   .section ".rodata"
 
   string    cpu_arch_name, "armv4"
   string    cpu_elf_name, "v4"
   string    cpu_arm740_name, "ARM740T"
 
   .align
 
   .section ".proc.info.init", "a"
   .type    __arm740_proc_info,#object
__arm740_proc_info:
   .long    0x41807400
   .long    0xfffffff0
   .long    0
   .long    0
   initfn    __arm740_setup, __arm740_proc_info
   .long    cpu_arch_name
   .long    cpu_elf_name
   .long    HWCAP_SWP | HWCAP_HALF | HWCAP_THUMB | HWCAP_26BIT
   .long    cpu_arm740_name
   .long    arm740_processor_functions
   .long    0
   .long    0
   .long    v4_cache_fns            @ cache model
   .size    __arm740_proc_info, . - __arm740_proc_info