blob: 9b0ae90cbf17b09fdbf62ecb2c7ac42406e5c16e [file] [log] [blame]
Hyok S. Choib731c312006-09-26 17:37:50 +09001/*
2 * linux/arch/arm/mm/arm740.S: utility functions for ARM740
3 *
4 * Copyright (C) 2004-2006 Hyok S. Choi (hyok.choi@samsung.com)
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 */
11#include <linux/linkage.h>
12#include <linux/init.h>
13#include <asm/assembler.h>
14#include <asm/asm-offsets.h>
Russell King5ec94072008-09-07 19:15:31 +010015#include <asm/hwcap.h>
Hyok S. Choib731c312006-09-26 17:37:50 +090016#include <asm/pgtable-hwdef.h>
17#include <asm/pgtable.h>
Hyok S. Choib731c312006-09-26 17:37:50 +090018#include <asm/ptrace.h>
19
Dave Martin4cc1f0f2011-06-23 17:19:11 +010020#include "proc-macros.S"
21
Hyok S. Choib731c312006-09-26 17:37:50 +090022 .text
23/*
24 * cpu_arm740_proc_init()
25 * cpu_arm740_do_idle()
26 * cpu_arm740_dcache_clean_area()
27 * cpu_arm740_switch_mm()
28 *
29 * These are not required.
30 */
31ENTRY(cpu_arm740_proc_init)
32ENTRY(cpu_arm740_do_idle)
33ENTRY(cpu_arm740_dcache_clean_area)
34ENTRY(cpu_arm740_switch_mm)
35 mov pc, lr
36
37/*
38 * cpu_arm740_proc_fin()
39 */
40ENTRY(cpu_arm740_proc_fin)
Hyok S. Choib731c312006-09-26 17:37:50 +090041 mrc p15, 0, r0, c1, c0, 0
42 bic r0, r0, #0x3f000000 @ bank/f/lock/s
43 bic r0, r0, #0x0000000c @ w-buffer/cache
44 mcr p15, 0, r0, c1, c0, 0 @ disable caches
Russell King9ca03a22010-07-26 12:22:12 +010045 mov pc, lr
Hyok S. Choib731c312006-09-26 17:37:50 +090046
47/*
48 * cpu_arm740_reset(loc)
49 * Params : r0 = address to jump to
50 * Notes : This sets up everything for a reset
51 */
Will Deacon1a4baaf2011-11-15 13:25:04 +000052 .pushsection .idmap.text, "ax"
Hyok S. Choib731c312006-09-26 17:37:50 +090053ENTRY(cpu_arm740_reset)
54 mov ip, #0
55 mcr p15, 0, ip, c7, c0, 0 @ invalidate cache
56 mrc p15, 0, ip, c1, c0, 0 @ get ctrl register
57 bic ip, ip, #0x0000000c @ ............wc..
58 mcr p15, 0, ip, c1, c0, 0 @ ctrl register
59 mov pc, r0
Will Deacon1a4baaf2011-11-15 13:25:04 +000060ENDPROC(cpu_arm740_reset)
61 .popsection
Hyok S. Choib731c312006-09-26 17:37:50 +090062
Hyok S. Choib731c312006-09-26 17:37:50 +090063 .type __arm740_setup, #function
64__arm740_setup:
65 mov r0, #0
66 mcr p15, 0, r0, c7, c0, 0 @ invalidate caches
67
68 mcr p15, 0, r0, c6, c3 @ disable area 3~7
69 mcr p15, 0, r0, c6, c4
70 mcr p15, 0, r0, c6, c5
71 mcr p15, 0, r0, c6, c6
72 mcr p15, 0, r0, c6, c7
73
74 mov r0, #0x0000003F @ base = 0, size = 4GB
75 mcr p15, 0, r0, c6, c0 @ set area 0, default
76
77 ldr r0, =(CONFIG_DRAM_BASE & 0xFFFFF000) @ base[31:12] of RAM
Will Deacon3ef52f22013-01-22 10:37:51 +000078 ldr r3, =(CONFIG_DRAM_SIZE >> 12) @ size of RAM (must be >= 4KB)
79 mov r4, #10 @ 11 is the minimum (4KB)
801: add r4, r4, #1 @ area size *= 2
81 movs r3, r3, lsr #1
Hyok S. Choib731c312006-09-26 17:37:50 +090082 bne 1b @ count not zero r-shift
Will Deacon3ef52f22013-01-22 10:37:51 +000083 orr r0, r0, r4, lsl #1 @ the area register value
Hyok S. Choib731c312006-09-26 17:37:50 +090084 orr r0, r0, #1 @ set enable bit
85 mcr p15, 0, r0, c6, c1 @ set area 1, RAM
86
87 ldr r0, =(CONFIG_FLASH_MEM_BASE & 0xFFFFF000) @ base[31:12] of FLASH
Will Deacon3ef52f22013-01-22 10:37:51 +000088 ldr r3, =(CONFIG_FLASH_SIZE >> 12) @ size of FLASH (must be >= 4KB)
89 cmp r3, #0
90 moveq r0, #0
91 beq 2f
92 mov r4, #10 @ 11 is the minimum (4KB)
931: add r4, r4, #1 @ area size *= 2
94 movs r3, r3, lsr #1
Hyok S. Choib731c312006-09-26 17:37:50 +090095 bne 1b @ count not zero r-shift
Will Deacon3ef52f22013-01-22 10:37:51 +000096 orr r0, r0, r4, lsl #1 @ the area register value
Hyok S. Choib731c312006-09-26 17:37:50 +090097 orr r0, r0, #1 @ set enable bit
Will Deacon3ef52f22013-01-22 10:37:51 +0000982: mcr p15, 0, r0, c6, c2 @ set area 2, ROM/FLASH
Hyok S. Choib731c312006-09-26 17:37:50 +090099
100 mov r0, #0x06
101 mcr p15, 0, r0, c2, c0 @ Region 1&2 cacheable
102#ifdef CONFIG_CPU_DCACHE_WRITETHROUGH
103 mov r0, #0x00 @ disable whole write buffer
104#else
105 mov r0, #0x02 @ Region 1 write bufferred
106#endif
107 mcr p15, 0, r0, c3, c0
108
109 mov r0, #0x10000
110 sub r0, r0, #1 @ r0 = 0xffff
111 mcr p15, 0, r0, c5, c0 @ all read/write access
112
113 mrc p15, 0, r0, c1, c0 @ get control register
114 bic r0, r0, #0x3F000000 @ set to standard caching mode
115 @ need some benchmark
116 orr r0, r0, #0x0000000d @ MPU/Cache/WB
117
118 mov pc, lr
119
120 .size __arm740_setup, . - __arm740_setup
121
122 __INITDATA
123
Dave Martin4cc1f0f2011-06-23 17:19:11 +0100124 @ define struct processor (see <asm/proc-fns.h> and proc-macros.S)
125 define_processor_functions arm740, dabort=v4t_late_abort, pabort=legacy_pabort, nommu=1
Hyok S. Choib731c312006-09-26 17:37:50 +0900126
127 .section ".rodata"
128
Dave Martin4cc1f0f2011-06-23 17:19:11 +0100129 string cpu_arch_name, "armv4"
130 string cpu_elf_name, "v4"
131 string cpu_arm740_name, "ARM740T"
Hyok S. Choib731c312006-09-26 17:37:50 +0900132
133 .align
134
135 .section ".proc.info.init", #alloc, #execinstr
136 .type __arm740_proc_info,#object
137__arm740_proc_info:
138 .long 0x41807400
139 .long 0xfffffff0
140 .long 0
Will Deacon3ef52f22013-01-22 10:37:51 +0000141 .long 0
Hyok S. Choib731c312006-09-26 17:37:50 +0900142 b __arm740_setup
143 .long cpu_arch_name
144 .long cpu_elf_name
Will Deacon3ef52f22013-01-22 10:37:51 +0000145 .long HWCAP_SWP | HWCAP_HALF | HWCAP_THUMB | HWCAP_26BIT
Hyok S. Choib731c312006-09-26 17:37:50 +0900146 .long cpu_arm740_name
147 .long arm740_processor_functions
148 .long 0
149 .long 0
Will Deacon82d9b0d2013-01-15 12:07:40 +0000150 .long v4_cache_fns @ cache model
Hyok S. Choib731c312006-09-26 17:37:50 +0900151 .size __arm740_proc_info, . - __arm740_proc_info