1*4882a593Smuzhiyun/* SPDX-License-Identifier: GPL-2.0-or-later */ 2*4882a593Smuzhiyun/* 3*4882a593Smuzhiyun * linux/arch/arm/mm/proc-arm720.S: MMU functions for ARM720 4*4882a593Smuzhiyun * 5*4882a593Smuzhiyun * Copyright (C) 2000 Steve Hill (sjhill@cotw.com) 6*4882a593Smuzhiyun * Rob Scott (rscott@mtrob.fdns.net) 7*4882a593Smuzhiyun * Copyright (C) 2000 ARM Limited, Deep Blue Solutions Ltd. 8*4882a593Smuzhiyun * hacked for non-paged-MM by Hyok S. Choi, 2004. 9*4882a593Smuzhiyun * 10*4882a593Smuzhiyun * These are the low level assembler for performing cache and TLB 11*4882a593Smuzhiyun * functions on the ARM720T. The ARM720T has a writethrough IDC 12*4882a593Smuzhiyun * cache, so we don't need to clean it. 13*4882a593Smuzhiyun * 14*4882a593Smuzhiyun * Changelog: 15*4882a593Smuzhiyun * 05-09-2000 SJH Created by moving 720 specific functions 16*4882a593Smuzhiyun * out of 'proc-arm6,7.S' per RMK discussion 17*4882a593Smuzhiyun * 07-25-2000 SJH Added idle function. 18*4882a593Smuzhiyun * 08-25-2000 DBS Updated for integration of ARM Ltd version. 19*4882a593Smuzhiyun * 04-20-2004 HSC modified for non-paged memory management mode. 20*4882a593Smuzhiyun */ 21*4882a593Smuzhiyun#include <linux/linkage.h> 22*4882a593Smuzhiyun#include <linux/init.h> 23*4882a593Smuzhiyun#include <linux/pgtable.h> 24*4882a593Smuzhiyun#include <asm/assembler.h> 25*4882a593Smuzhiyun#include <asm/asm-offsets.h> 26*4882a593Smuzhiyun#include <asm/hwcap.h> 27*4882a593Smuzhiyun#include <asm/pgtable-hwdef.h> 28*4882a593Smuzhiyun#include <asm/ptrace.h> 29*4882a593Smuzhiyun 30*4882a593Smuzhiyun#include "proc-macros.S" 31*4882a593Smuzhiyun 32*4882a593Smuzhiyun/* 33*4882a593Smuzhiyun * Function: arm720_proc_init (void) 34*4882a593Smuzhiyun * : arm720_proc_fin (void) 35*4882a593Smuzhiyun * 36*4882a593Smuzhiyun * Notes : This processor does not require these 37*4882a593Smuzhiyun */ 38*4882a593SmuzhiyunENTRY(cpu_arm720_dcache_clean_area) 39*4882a593SmuzhiyunENTRY(cpu_arm720_proc_init) 40*4882a593Smuzhiyun ret lr 41*4882a593Smuzhiyun 42*4882a593SmuzhiyunENTRY(cpu_arm720_proc_fin) 43*4882a593Smuzhiyun mrc p15, 0, r0, c1, c0, 0 44*4882a593Smuzhiyun bic r0, r0, #0x1000 @ ...i............ 45*4882a593Smuzhiyun bic r0, r0, #0x000e @ ............wca. 46*4882a593Smuzhiyun mcr p15, 0, r0, c1, c0, 0 @ disable caches 47*4882a593Smuzhiyun ret lr 48*4882a593Smuzhiyun 49*4882a593Smuzhiyun/* 50*4882a593Smuzhiyun * Function: arm720_proc_do_idle(void) 51*4882a593Smuzhiyun * Params : r0 = unused 52*4882a593Smuzhiyun * Purpose : put the processor in proper idle mode 53*4882a593Smuzhiyun */ 54*4882a593SmuzhiyunENTRY(cpu_arm720_do_idle) 55*4882a593Smuzhiyun ret lr 56*4882a593Smuzhiyun 57*4882a593Smuzhiyun/* 58*4882a593Smuzhiyun * Function: arm720_switch_mm(unsigned long pgd_phys) 59*4882a593Smuzhiyun * Params : pgd_phys Physical address of page table 60*4882a593Smuzhiyun * Purpose : Perform a task switch, saving the old process' state and restoring 61*4882a593Smuzhiyun * the new. 62*4882a593Smuzhiyun */ 63*4882a593SmuzhiyunENTRY(cpu_arm720_switch_mm) 64*4882a593Smuzhiyun#ifdef CONFIG_MMU 65*4882a593Smuzhiyun mov r1, #0 66*4882a593Smuzhiyun mcr p15, 0, r1, c7, c7, 0 @ invalidate cache 67*4882a593Smuzhiyun mcr p15, 0, r0, c2, c0, 0 @ update page table ptr 68*4882a593Smuzhiyun mcr p15, 0, r1, c8, c7, 0 @ flush TLB (v4) 69*4882a593Smuzhiyun#endif 70*4882a593Smuzhiyun ret lr 71*4882a593Smuzhiyun 72*4882a593Smuzhiyun/* 73*4882a593Smuzhiyun * Function: arm720_set_pte_ext(pte_t *ptep, pte_t pte, unsigned int ext) 74*4882a593Smuzhiyun * Params : r0 = Address to set 75*4882a593Smuzhiyun * : r1 = value to set 76*4882a593Smuzhiyun * Purpose : Set a PTE and flush it out of any WB cache 77*4882a593Smuzhiyun */ 78*4882a593Smuzhiyun .align 5 79*4882a593SmuzhiyunENTRY(cpu_arm720_set_pte_ext) 80*4882a593Smuzhiyun#ifdef CONFIG_MMU 81*4882a593Smuzhiyun armv3_set_pte_ext wc_disable=0 82*4882a593Smuzhiyun#endif 83*4882a593Smuzhiyun ret lr 84*4882a593Smuzhiyun 85*4882a593Smuzhiyun/* 86*4882a593Smuzhiyun * Function: arm720_reset 87*4882a593Smuzhiyun * Params : r0 = address to jump to 88*4882a593Smuzhiyun * Notes : This sets up everything for a reset 89*4882a593Smuzhiyun */ 90*4882a593Smuzhiyun .pushsection .idmap.text, "ax" 91*4882a593SmuzhiyunENTRY(cpu_arm720_reset) 92*4882a593Smuzhiyun mov ip, #0 93*4882a593Smuzhiyun mcr p15, 0, ip, c7, c7, 0 @ invalidate cache 94*4882a593Smuzhiyun#ifdef CONFIG_MMU 95*4882a593Smuzhiyun mcr p15, 0, ip, c8, c7, 0 @ flush TLB (v4) 96*4882a593Smuzhiyun#endif 97*4882a593Smuzhiyun mrc p15, 0, ip, c1, c0, 0 @ get ctrl register 98*4882a593Smuzhiyun bic ip, ip, #0x000f @ ............wcam 99*4882a593Smuzhiyun bic ip, ip, #0x2100 @ ..v....s........ 100*4882a593Smuzhiyun mcr p15, 0, ip, c1, c0, 0 @ ctrl register 101*4882a593Smuzhiyun ret r0 102*4882a593SmuzhiyunENDPROC(cpu_arm720_reset) 103*4882a593Smuzhiyun .popsection 104*4882a593Smuzhiyun 105*4882a593Smuzhiyun .type __arm710_setup, #function 106*4882a593Smuzhiyun__arm710_setup: 107*4882a593Smuzhiyun mov r0, #0 108*4882a593Smuzhiyun mcr p15, 0, r0, c7, c7, 0 @ invalidate caches 109*4882a593Smuzhiyun#ifdef CONFIG_MMU 110*4882a593Smuzhiyun mcr p15, 0, r0, c8, c7, 0 @ flush TLB (v4) 111*4882a593Smuzhiyun#endif 112*4882a593Smuzhiyun mrc p15, 0, r0, c1, c0 @ get control register 113*4882a593Smuzhiyun ldr r5, arm710_cr1_clear 114*4882a593Smuzhiyun bic r0, r0, r5 115*4882a593Smuzhiyun ldr r5, arm710_cr1_set 116*4882a593Smuzhiyun orr r0, r0, r5 117*4882a593Smuzhiyun ret lr @ __ret (head.S) 118*4882a593Smuzhiyun .size __arm710_setup, . - __arm710_setup 119*4882a593Smuzhiyun 120*4882a593Smuzhiyun /* 121*4882a593Smuzhiyun * R 122*4882a593Smuzhiyun * .RVI ZFRS BLDP WCAM 123*4882a593Smuzhiyun * .... 0001 ..11 1101 124*4882a593Smuzhiyun * 125*4882a593Smuzhiyun */ 126*4882a593Smuzhiyun .type arm710_cr1_clear, #object 127*4882a593Smuzhiyun .type arm710_cr1_set, #object 128*4882a593Smuzhiyunarm710_cr1_clear: 129*4882a593Smuzhiyun .word 0x0f3f 130*4882a593Smuzhiyunarm710_cr1_set: 131*4882a593Smuzhiyun .word 0x013d 132*4882a593Smuzhiyun 133*4882a593Smuzhiyun .type __arm720_setup, #function 134*4882a593Smuzhiyun__arm720_setup: 135*4882a593Smuzhiyun mov r0, #0 136*4882a593Smuzhiyun mcr p15, 0, r0, c7, c7, 0 @ invalidate caches 137*4882a593Smuzhiyun#ifdef CONFIG_MMU 138*4882a593Smuzhiyun mcr p15, 0, r0, c8, c7, 0 @ flush TLB (v4) 139*4882a593Smuzhiyun#endif 140*4882a593Smuzhiyun adr r5, arm720_crval 141*4882a593Smuzhiyun ldmia r5, {r5, r6} 142*4882a593Smuzhiyun mrc p15, 0, r0, c1, c0 @ get control register 143*4882a593Smuzhiyun bic r0, r0, r5 144*4882a593Smuzhiyun orr r0, r0, r6 145*4882a593Smuzhiyun ret lr @ __ret (head.S) 146*4882a593Smuzhiyun .size __arm720_setup, . - __arm720_setup 147*4882a593Smuzhiyun 148*4882a593Smuzhiyun /* 149*4882a593Smuzhiyun * R 150*4882a593Smuzhiyun * .RVI ZFRS BLDP WCAM 151*4882a593Smuzhiyun * ..1. 1001 ..11 1101 152*4882a593Smuzhiyun * 153*4882a593Smuzhiyun */ 154*4882a593Smuzhiyun .type arm720_crval, #object 155*4882a593Smuzhiyunarm720_crval: 156*4882a593Smuzhiyun crval clear=0x00002f3f, mmuset=0x0000213d, ucset=0x00000130 157*4882a593Smuzhiyun 158*4882a593Smuzhiyun __INITDATA 159*4882a593Smuzhiyun @ define struct processor (see <asm/proc-fns.h> and proc-macros.S) 160*4882a593Smuzhiyun define_processor_functions arm720, dabort=v4t_late_abort, pabort=legacy_pabort 161*4882a593Smuzhiyun 162*4882a593Smuzhiyun .section ".rodata" 163*4882a593Smuzhiyun 164*4882a593Smuzhiyun string cpu_arch_name, "armv4t" 165*4882a593Smuzhiyun string cpu_elf_name, "v4" 166*4882a593Smuzhiyun string cpu_arm710_name, "ARM710T" 167*4882a593Smuzhiyun string cpu_arm720_name, "ARM720T" 168*4882a593Smuzhiyun 169*4882a593Smuzhiyun .align 170*4882a593Smuzhiyun 171*4882a593Smuzhiyun/* 172*4882a593Smuzhiyun * See <asm/procinfo.h> for a definition of this structure. 173*4882a593Smuzhiyun */ 174*4882a593Smuzhiyun 175*4882a593Smuzhiyun .section ".proc.info.init", "a" 176*4882a593Smuzhiyun 177*4882a593Smuzhiyun.macro arm720_proc_info name:req, cpu_val:req, cpu_mask:req, cpu_name:req, cpu_flush:req 178*4882a593Smuzhiyun .type __\name\()_proc_info,#object 179*4882a593Smuzhiyun__\name\()_proc_info: 180*4882a593Smuzhiyun .long \cpu_val 181*4882a593Smuzhiyun .long \cpu_mask 182*4882a593Smuzhiyun .long PMD_TYPE_SECT | \ 183*4882a593Smuzhiyun PMD_SECT_BUFFERABLE | \ 184*4882a593Smuzhiyun PMD_SECT_CACHEABLE | \ 185*4882a593Smuzhiyun PMD_BIT4 | \ 186*4882a593Smuzhiyun PMD_SECT_AP_WRITE | \ 187*4882a593Smuzhiyun PMD_SECT_AP_READ 188*4882a593Smuzhiyun .long PMD_TYPE_SECT | \ 189*4882a593Smuzhiyun PMD_BIT4 | \ 190*4882a593Smuzhiyun PMD_SECT_AP_WRITE | \ 191*4882a593Smuzhiyun PMD_SECT_AP_READ 192*4882a593Smuzhiyun initfn \cpu_flush, __\name\()_proc_info @ cpu_flush 193*4882a593Smuzhiyun .long cpu_arch_name @ arch_name 194*4882a593Smuzhiyun .long cpu_elf_name @ elf_name 195*4882a593Smuzhiyun .long HWCAP_SWP | HWCAP_HALF | HWCAP_THUMB @ elf_hwcap 196*4882a593Smuzhiyun .long \cpu_name 197*4882a593Smuzhiyun .long arm720_processor_functions 198*4882a593Smuzhiyun .long v4_tlb_fns 199*4882a593Smuzhiyun .long v4wt_user_fns 200*4882a593Smuzhiyun .long v4_cache_fns 201*4882a593Smuzhiyun .size __\name\()_proc_info, . - __\name\()_proc_info 202*4882a593Smuzhiyun.endm 203*4882a593Smuzhiyun 204*4882a593Smuzhiyun arm720_proc_info arm710, 0x41807100, 0xffffff00, cpu_arm710_name, __arm710_setup 205*4882a593Smuzhiyun arm720_proc_info arm720, 0x41807200, 0xffffff00, cpu_arm720_name, __arm720_setup 206