blob: 1a94bbf6e53fc2e983444164c3e19a1bc935af02 [file] [log] [blame]
Thomas Gleixnerd2912cb2019-06-04 10:11:33 +02001/* SPDX-License-Identifier: GPL-2.0-only */
Hyok S. Choib731c312006-09-26 17:37:50 +09002/*
3 * linux/arch/arm/mm/arm740.S: utility functions for ARM740
4 *
5 * Copyright (C) 2004-2006 Hyok S. Choi (hyok.choi@samsung.com)
Hyok S. Choib731c312006-09-26 17:37:50 +09006 */
7#include <linux/linkage.h>
8#include <linux/init.h>
9#include <asm/assembler.h>
10#include <asm/asm-offsets.h>
Russell King5ec94072008-09-07 19:15:31 +010011#include <asm/hwcap.h>
Hyok S. Choib731c312006-09-26 17:37:50 +090012#include <asm/pgtable-hwdef.h>
13#include <asm/pgtable.h>
Hyok S. Choib731c312006-09-26 17:37:50 +090014#include <asm/ptrace.h>
15
Dave Martin4cc1f0f2011-06-23 17:19:11 +010016#include "proc-macros.S"
17
Hyok S. Choib731c312006-09-26 17:37:50 +090018 .text
19/*
20 * cpu_arm740_proc_init()
21 * cpu_arm740_do_idle()
22 * cpu_arm740_dcache_clean_area()
23 * cpu_arm740_switch_mm()
24 *
25 * These are not required.
26 */
27ENTRY(cpu_arm740_proc_init)
28ENTRY(cpu_arm740_do_idle)
29ENTRY(cpu_arm740_dcache_clean_area)
30ENTRY(cpu_arm740_switch_mm)
Russell King6ebbf2c2014-06-30 16:29:12 +010031 ret lr
Hyok S. Choib731c312006-09-26 17:37:50 +090032
33/*
34 * cpu_arm740_proc_fin()
35 */
36ENTRY(cpu_arm740_proc_fin)
Hyok S. Choib731c312006-09-26 17:37:50 +090037 mrc p15, 0, r0, c1, c0, 0
38 bic r0, r0, #0x3f000000 @ bank/f/lock/s
39 bic r0, r0, #0x0000000c @ w-buffer/cache
40 mcr p15, 0, r0, c1, c0, 0 @ disable caches
Russell King6ebbf2c2014-06-30 16:29:12 +010041 ret lr
Hyok S. Choib731c312006-09-26 17:37:50 +090042
43/*
44 * cpu_arm740_reset(loc)
45 * Params : r0 = address to jump to
46 * Notes : This sets up everything for a reset
47 */
Will Deacon1a4baaf2011-11-15 13:25:04 +000048 .pushsection .idmap.text, "ax"
Hyok S. Choib731c312006-09-26 17:37:50 +090049ENTRY(cpu_arm740_reset)
50 mov ip, #0
51 mcr p15, 0, ip, c7, c0, 0 @ invalidate cache
52 mrc p15, 0, ip, c1, c0, 0 @ get ctrl register
53 bic ip, ip, #0x0000000c @ ............wc..
54 mcr p15, 0, ip, c1, c0, 0 @ ctrl register
Russell King6ebbf2c2014-06-30 16:29:12 +010055 ret r0
Will Deacon1a4baaf2011-11-15 13:25:04 +000056ENDPROC(cpu_arm740_reset)
57 .popsection
Hyok S. Choib731c312006-09-26 17:37:50 +090058
Hyok S. Choib731c312006-09-26 17:37:50 +090059 .type __arm740_setup, #function
60__arm740_setup:
61 mov r0, #0
62 mcr p15, 0, r0, c7, c0, 0 @ invalidate caches
63
64 mcr p15, 0, r0, c6, c3 @ disable area 3~7
65 mcr p15, 0, r0, c6, c4
66 mcr p15, 0, r0, c6, c5
67 mcr p15, 0, r0, c6, c6
68 mcr p15, 0, r0, c6, c7
69
70 mov r0, #0x0000003F @ base = 0, size = 4GB
71 mcr p15, 0, r0, c6, c0 @ set area 0, default
72
73 ldr r0, =(CONFIG_DRAM_BASE & 0xFFFFF000) @ base[31:12] of RAM
Will Deacon3ef52f22013-01-22 10:37:51 +000074 ldr r3, =(CONFIG_DRAM_SIZE >> 12) @ size of RAM (must be >= 4KB)
75 mov r4, #10 @ 11 is the minimum (4KB)
761: add r4, r4, #1 @ area size *= 2
77 movs r3, r3, lsr #1
Hyok S. Choib731c312006-09-26 17:37:50 +090078 bne 1b @ count not zero r-shift
Will Deacon3ef52f22013-01-22 10:37:51 +000079 orr r0, r0, r4, lsl #1 @ the area register value
Hyok S. Choib731c312006-09-26 17:37:50 +090080 orr r0, r0, #1 @ set enable bit
81 mcr p15, 0, r0, c6, c1 @ set area 1, RAM
82
83 ldr r0, =(CONFIG_FLASH_MEM_BASE & 0xFFFFF000) @ base[31:12] of FLASH
Will Deacon3ef52f22013-01-22 10:37:51 +000084 ldr r3, =(CONFIG_FLASH_SIZE >> 12) @ size of FLASH (must be >= 4KB)
85 cmp r3, #0
86 moveq r0, #0
87 beq 2f
88 mov r4, #10 @ 11 is the minimum (4KB)
891: add r4, r4, #1 @ area size *= 2
90 movs r3, r3, lsr #1
Hyok S. Choib731c312006-09-26 17:37:50 +090091 bne 1b @ count not zero r-shift
Will Deacon3ef52f22013-01-22 10:37:51 +000092 orr r0, r0, r4, lsl #1 @ the area register value
Hyok S. Choib731c312006-09-26 17:37:50 +090093 orr r0, r0, #1 @ set enable bit
Will Deacon3ef52f22013-01-22 10:37:51 +0000942: mcr p15, 0, r0, c6, c2 @ set area 2, ROM/FLASH
Hyok S. Choib731c312006-09-26 17:37:50 +090095
96 mov r0, #0x06
97 mcr p15, 0, r0, c2, c0 @ Region 1&2 cacheable
98#ifdef CONFIG_CPU_DCACHE_WRITETHROUGH
99 mov r0, #0x00 @ disable whole write buffer
100#else
101 mov r0, #0x02 @ Region 1 write bufferred
102#endif
103 mcr p15, 0, r0, c3, c0
104
105 mov r0, #0x10000
106 sub r0, r0, #1 @ r0 = 0xffff
107 mcr p15, 0, r0, c5, c0 @ all read/write access
108
109 mrc p15, 0, r0, c1, c0 @ get control register
110 bic r0, r0, #0x3F000000 @ set to standard caching mode
111 @ need some benchmark
112 orr r0, r0, #0x0000000d @ MPU/Cache/WB
113
Russell King6ebbf2c2014-06-30 16:29:12 +0100114 ret lr
Hyok S. Choib731c312006-09-26 17:37:50 +0900115
116 .size __arm740_setup, . - __arm740_setup
117
118 __INITDATA
119
Dave Martin4cc1f0f2011-06-23 17:19:11 +0100120 @ define struct processor (see <asm/proc-fns.h> and proc-macros.S)
121 define_processor_functions arm740, dabort=v4t_late_abort, pabort=legacy_pabort, nommu=1
Hyok S. Choib731c312006-09-26 17:37:50 +0900122
123 .section ".rodata"
124
Dave Martin4cc1f0f2011-06-23 17:19:11 +0100125 string cpu_arch_name, "armv4"
126 string cpu_elf_name, "v4"
127 string cpu_arm740_name, "ARM740T"
Hyok S. Choib731c312006-09-26 17:37:50 +0900128
129 .align
130
Nick Desaulniers790756c2019-11-04 19:31:45 +0100131 .section ".proc.info.init", "a"
Hyok S. Choib731c312006-09-26 17:37:50 +0900132 .type __arm740_proc_info,#object
133__arm740_proc_info:
134 .long 0x41807400
135 .long 0xfffffff0
136 .long 0
Will Deacon3ef52f22013-01-22 10:37:51 +0000137 .long 0
Ard Biesheuvelbf357062015-03-18 07:29:32 +0100138 initfn __arm740_setup, __arm740_proc_info
Hyok S. Choib731c312006-09-26 17:37:50 +0900139 .long cpu_arch_name
140 .long cpu_elf_name
Will Deacon3ef52f22013-01-22 10:37:51 +0000141 .long HWCAP_SWP | HWCAP_HALF | HWCAP_THUMB | HWCAP_26BIT
Hyok S. Choib731c312006-09-26 17:37:50 +0900142 .long cpu_arm740_name
143 .long arm740_processor_functions
144 .long 0
145 .long 0
Will Deacon82d9b0d2013-01-15 12:07:40 +0000146 .long v4_cache_fns @ cache model
Hyok S. Choib731c312006-09-26 17:37:50 +0900147 .size __arm740_proc_info, . - __arm740_proc_info