1*4882a593Smuzhiyun/* SPDX-License-Identifier: GPL-2.0-only */ 2*4882a593Smuzhiyun/* 3*4882a593Smuzhiyun * linux/arch/arm/mm/arm740.S: utility functions for ARM740 4*4882a593Smuzhiyun * 5*4882a593Smuzhiyun * Copyright (C) 2004-2006 Hyok S. Choi (hyok.choi@samsung.com) 6*4882a593Smuzhiyun */ 7*4882a593Smuzhiyun#include <linux/linkage.h> 8*4882a593Smuzhiyun#include <linux/init.h> 9*4882a593Smuzhiyun#include <linux/pgtable.h> 10*4882a593Smuzhiyun#include <asm/assembler.h> 11*4882a593Smuzhiyun#include <asm/asm-offsets.h> 12*4882a593Smuzhiyun#include <asm/hwcap.h> 13*4882a593Smuzhiyun#include <asm/pgtable-hwdef.h> 14*4882a593Smuzhiyun#include <asm/ptrace.h> 15*4882a593Smuzhiyun 16*4882a593Smuzhiyun#include "proc-macros.S" 17*4882a593Smuzhiyun 18*4882a593Smuzhiyun .text 19*4882a593Smuzhiyun/* 20*4882a593Smuzhiyun * cpu_arm740_proc_init() 21*4882a593Smuzhiyun * cpu_arm740_do_idle() 22*4882a593Smuzhiyun * cpu_arm740_dcache_clean_area() 23*4882a593Smuzhiyun * cpu_arm740_switch_mm() 24*4882a593Smuzhiyun * 25*4882a593Smuzhiyun * These are not required. 26*4882a593Smuzhiyun */ 27*4882a593SmuzhiyunENTRY(cpu_arm740_proc_init) 28*4882a593SmuzhiyunENTRY(cpu_arm740_do_idle) 29*4882a593SmuzhiyunENTRY(cpu_arm740_dcache_clean_area) 30*4882a593SmuzhiyunENTRY(cpu_arm740_switch_mm) 31*4882a593Smuzhiyun ret lr 32*4882a593Smuzhiyun 33*4882a593Smuzhiyun/* 34*4882a593Smuzhiyun * cpu_arm740_proc_fin() 35*4882a593Smuzhiyun */ 36*4882a593SmuzhiyunENTRY(cpu_arm740_proc_fin) 37*4882a593Smuzhiyun mrc p15, 0, r0, c1, c0, 0 38*4882a593Smuzhiyun bic r0, r0, #0x3f000000 @ bank/f/lock/s 39*4882a593Smuzhiyun bic r0, r0, #0x0000000c @ w-buffer/cache 40*4882a593Smuzhiyun mcr p15, 0, r0, c1, c0, 0 @ disable caches 41*4882a593Smuzhiyun ret lr 42*4882a593Smuzhiyun 43*4882a593Smuzhiyun/* 44*4882a593Smuzhiyun * cpu_arm740_reset(loc) 45*4882a593Smuzhiyun * Params : r0 = address to jump to 46*4882a593Smuzhiyun * Notes : This sets up everything for a reset 47*4882a593Smuzhiyun */ 48*4882a593Smuzhiyun .pushsection .idmap.text, "ax" 49*4882a593SmuzhiyunENTRY(cpu_arm740_reset) 50*4882a593Smuzhiyun mov ip, #0 51*4882a593Smuzhiyun mcr p15, 0, ip, c7, c0, 0 @ invalidate cache 52*4882a593Smuzhiyun mrc p15, 0, ip, c1, c0, 0 @ get ctrl register 53*4882a593Smuzhiyun bic ip, ip, #0x0000000c @ ............wc.. 54*4882a593Smuzhiyun mcr p15, 0, ip, c1, c0, 0 @ ctrl register 55*4882a593Smuzhiyun ret r0 56*4882a593SmuzhiyunENDPROC(cpu_arm740_reset) 57*4882a593Smuzhiyun .popsection 58*4882a593Smuzhiyun 59*4882a593Smuzhiyun .type __arm740_setup, #function 60*4882a593Smuzhiyun__arm740_setup: 61*4882a593Smuzhiyun mov r0, #0 62*4882a593Smuzhiyun mcr p15, 0, r0, c7, c0, 0 @ invalidate caches 63*4882a593Smuzhiyun 64*4882a593Smuzhiyun mcr p15, 0, r0, c6, c3 @ disable area 3~7 65*4882a593Smuzhiyun mcr p15, 0, r0, c6, c4 66*4882a593Smuzhiyun mcr p15, 0, r0, c6, c5 67*4882a593Smuzhiyun mcr p15, 0, r0, c6, c6 68*4882a593Smuzhiyun mcr p15, 0, r0, c6, c7 69*4882a593Smuzhiyun 70*4882a593Smuzhiyun mov r0, #0x0000003F @ base = 0, size = 4GB 71*4882a593Smuzhiyun mcr p15, 0, r0, c6, c0 @ set area 0, default 72*4882a593Smuzhiyun 73*4882a593Smuzhiyun ldr r0, =(CONFIG_DRAM_BASE & 0xFFFFF000) @ base[31:12] of RAM 74*4882a593Smuzhiyun ldr r3, =(CONFIG_DRAM_SIZE >> 12) @ size of RAM (must be >= 4KB) 75*4882a593Smuzhiyun mov r4, #10 @ 11 is the minimum (4KB) 76*4882a593Smuzhiyun1: add r4, r4, #1 @ area size *= 2 77*4882a593Smuzhiyun movs r3, r3, lsr #1 78*4882a593Smuzhiyun bne 1b @ count not zero r-shift 79*4882a593Smuzhiyun orr r0, r0, r4, lsl #1 @ the area register value 80*4882a593Smuzhiyun orr r0, r0, #1 @ set enable bit 81*4882a593Smuzhiyun mcr p15, 0, r0, c6, c1 @ set area 1, RAM 82*4882a593Smuzhiyun 83*4882a593Smuzhiyun ldr r0, =(CONFIG_FLASH_MEM_BASE & 0xFFFFF000) @ base[31:12] of FLASH 84*4882a593Smuzhiyun ldr r3, =(CONFIG_FLASH_SIZE >> 12) @ size of FLASH (must be >= 4KB) 85*4882a593Smuzhiyun cmp r3, #0 86*4882a593Smuzhiyun moveq r0, #0 87*4882a593Smuzhiyun beq 2f 88*4882a593Smuzhiyun mov r4, #10 @ 11 is the minimum (4KB) 89*4882a593Smuzhiyun1: add r4, r4, #1 @ area size *= 2 90*4882a593Smuzhiyun movs r3, r3, lsr #1 91*4882a593Smuzhiyun bne 1b @ count not zero r-shift 92*4882a593Smuzhiyun orr r0, r0, r4, lsl #1 @ the area register value 93*4882a593Smuzhiyun orr r0, r0, #1 @ set enable bit 94*4882a593Smuzhiyun2: mcr p15, 0, r0, c6, c2 @ set area 2, ROM/FLASH 95*4882a593Smuzhiyun 96*4882a593Smuzhiyun mov r0, #0x06 97*4882a593Smuzhiyun mcr p15, 0, r0, c2, c0 @ Region 1&2 cacheable 98*4882a593Smuzhiyun#ifdef CONFIG_CPU_DCACHE_WRITETHROUGH 99*4882a593Smuzhiyun mov r0, #0x00 @ disable whole write buffer 100*4882a593Smuzhiyun#else 101*4882a593Smuzhiyun mov r0, #0x02 @ Region 1 write bufferred 102*4882a593Smuzhiyun#endif 103*4882a593Smuzhiyun mcr p15, 0, r0, c3, c0 104*4882a593Smuzhiyun 105*4882a593Smuzhiyun mov r0, #0x10000 106*4882a593Smuzhiyun sub r0, r0, #1 @ r0 = 0xffff 107*4882a593Smuzhiyun mcr p15, 0, r0, c5, c0 @ all read/write access 108*4882a593Smuzhiyun 109*4882a593Smuzhiyun mrc p15, 0, r0, c1, c0 @ get control register 110*4882a593Smuzhiyun bic r0, r0, #0x3F000000 @ set to standard caching mode 111*4882a593Smuzhiyun @ need some benchmark 112*4882a593Smuzhiyun orr r0, r0, #0x0000000d @ MPU/Cache/WB 113*4882a593Smuzhiyun 114*4882a593Smuzhiyun ret lr 115*4882a593Smuzhiyun 116*4882a593Smuzhiyun .size __arm740_setup, . - __arm740_setup 117*4882a593Smuzhiyun 118*4882a593Smuzhiyun __INITDATA 119*4882a593Smuzhiyun 120*4882a593Smuzhiyun @ define struct processor (see <asm/proc-fns.h> and proc-macros.S) 121*4882a593Smuzhiyun define_processor_functions arm740, dabort=v4t_late_abort, pabort=legacy_pabort, nommu=1 122*4882a593Smuzhiyun 123*4882a593Smuzhiyun .section ".rodata" 124*4882a593Smuzhiyun 125*4882a593Smuzhiyun string cpu_arch_name, "armv4" 126*4882a593Smuzhiyun string cpu_elf_name, "v4" 127*4882a593Smuzhiyun string cpu_arm740_name, "ARM740T" 128*4882a593Smuzhiyun 129*4882a593Smuzhiyun .align 130*4882a593Smuzhiyun 131*4882a593Smuzhiyun .section ".proc.info.init", "a" 132*4882a593Smuzhiyun .type __arm740_proc_info,#object 133*4882a593Smuzhiyun__arm740_proc_info: 134*4882a593Smuzhiyun .long 0x41807400 135*4882a593Smuzhiyun .long 0xfffffff0 136*4882a593Smuzhiyun .long 0 137*4882a593Smuzhiyun .long 0 138*4882a593Smuzhiyun initfn __arm740_setup, __arm740_proc_info 139*4882a593Smuzhiyun .long cpu_arch_name 140*4882a593Smuzhiyun .long cpu_elf_name 141*4882a593Smuzhiyun .long HWCAP_SWP | HWCAP_HALF | HWCAP_THUMB | HWCAP_26BIT 142*4882a593Smuzhiyun .long cpu_arm740_name 143*4882a593Smuzhiyun .long arm740_processor_functions 144*4882a593Smuzhiyun .long 0 145*4882a593Smuzhiyun .long 0 146*4882a593Smuzhiyun .long v4_cache_fns @ cache model 147*4882a593Smuzhiyun .size __arm740_proc_info, . - __arm740_proc_info 148