162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-or-later */ 262306a36Sopenharmony_ci/* 362306a36Sopenharmony_ci * linux/arch/arm/mm/proc-fa526.S: MMU functions for FA526 462306a36Sopenharmony_ci * 562306a36Sopenharmony_ci * Written by : Luke Lee 662306a36Sopenharmony_ci * Copyright (C) 2005 Faraday Corp. 762306a36Sopenharmony_ci * Copyright (C) 2008-2009 Paulius Zaleckas <paulius.zaleckas@teltonika.lt> 862306a36Sopenharmony_ci * 962306a36Sopenharmony_ci * These are the low level assembler for performing cache and TLB 1062306a36Sopenharmony_ci * functions on the fa526. 1162306a36Sopenharmony_ci */ 1262306a36Sopenharmony_ci#include <linux/linkage.h> 1362306a36Sopenharmony_ci#include <linux/init.h> 1462306a36Sopenharmony_ci#include <linux/pgtable.h> 1562306a36Sopenharmony_ci#include <asm/assembler.h> 1662306a36Sopenharmony_ci#include <asm/hwcap.h> 1762306a36Sopenharmony_ci#include <asm/pgtable-hwdef.h> 1862306a36Sopenharmony_ci#include <asm/page.h> 1962306a36Sopenharmony_ci#include <asm/ptrace.h> 2062306a36Sopenharmony_ci 2162306a36Sopenharmony_ci#include "proc-macros.S" 2262306a36Sopenharmony_ci 2362306a36Sopenharmony_ci#define CACHE_DLINESIZE 16 2462306a36Sopenharmony_ci 2562306a36Sopenharmony_ci .text 2662306a36Sopenharmony_ci/* 2762306a36Sopenharmony_ci * cpu_fa526_proc_init() 2862306a36Sopenharmony_ci */ 2962306a36Sopenharmony_ciENTRY(cpu_fa526_proc_init) 3062306a36Sopenharmony_ci ret lr 3162306a36Sopenharmony_ci 3262306a36Sopenharmony_ci/* 3362306a36Sopenharmony_ci * cpu_fa526_proc_fin() 3462306a36Sopenharmony_ci */ 3562306a36Sopenharmony_ciENTRY(cpu_fa526_proc_fin) 3662306a36Sopenharmony_ci mrc p15, 0, r0, c1, c0, 0 @ ctrl register 3762306a36Sopenharmony_ci bic r0, r0, #0x1000 @ ...i............ 3862306a36Sopenharmony_ci bic r0, r0, #0x000e @ ............wca. 3962306a36Sopenharmony_ci mcr p15, 0, r0, c1, c0, 0 @ disable caches 4062306a36Sopenharmony_ci nop 4162306a36Sopenharmony_ci nop 4262306a36Sopenharmony_ci ret lr 4362306a36Sopenharmony_ci 4462306a36Sopenharmony_ci/* 4562306a36Sopenharmony_ci * cpu_fa526_reset(loc) 4662306a36Sopenharmony_ci * 4762306a36Sopenharmony_ci * Perform a soft reset of the system. Put the CPU into the 4862306a36Sopenharmony_ci * same state as it would be if it had been reset, and branch 4962306a36Sopenharmony_ci * to what would be the reset vector. 5062306a36Sopenharmony_ci * 5162306a36Sopenharmony_ci * loc: location to jump to for soft reset 5262306a36Sopenharmony_ci */ 5362306a36Sopenharmony_ci .align 4 5462306a36Sopenharmony_ci .pushsection .idmap.text, "ax" 5562306a36Sopenharmony_ciENTRY(cpu_fa526_reset) 5662306a36Sopenharmony_ci/* TODO: Use CP8 if possible... */ 5762306a36Sopenharmony_ci mov ip, #0 5862306a36Sopenharmony_ci mcr p15, 0, ip, c7, c7, 0 @ invalidate I,D caches 5962306a36Sopenharmony_ci mcr p15, 0, ip, c7, c10, 4 @ drain WB 6062306a36Sopenharmony_ci#ifdef CONFIG_MMU 6162306a36Sopenharmony_ci mcr p15, 0, ip, c8, c7, 0 @ invalidate I & D TLBs 6262306a36Sopenharmony_ci#endif 6362306a36Sopenharmony_ci mrc p15, 0, ip, c1, c0, 0 @ ctrl register 6462306a36Sopenharmony_ci bic ip, ip, #0x000f @ ............wcam 6562306a36Sopenharmony_ci bic ip, ip, #0x1100 @ ...i...s........ 6662306a36Sopenharmony_ci bic ip, ip, #0x0800 @ BTB off 6762306a36Sopenharmony_ci mcr p15, 0, ip, c1, c0, 0 @ ctrl register 6862306a36Sopenharmony_ci nop 6962306a36Sopenharmony_ci nop 7062306a36Sopenharmony_ci ret r0 7162306a36Sopenharmony_ciENDPROC(cpu_fa526_reset) 7262306a36Sopenharmony_ci .popsection 7362306a36Sopenharmony_ci 7462306a36Sopenharmony_ci/* 7562306a36Sopenharmony_ci * cpu_fa526_do_idle() 7662306a36Sopenharmony_ci */ 7762306a36Sopenharmony_ci .align 4 7862306a36Sopenharmony_ciENTRY(cpu_fa526_do_idle) 7962306a36Sopenharmony_ci ret lr 8062306a36Sopenharmony_ci 8162306a36Sopenharmony_ci 8262306a36Sopenharmony_ciENTRY(cpu_fa526_dcache_clean_area) 8362306a36Sopenharmony_ci1: mcr p15, 0, r0, c7, c10, 1 @ clean D entry 8462306a36Sopenharmony_ci add r0, r0, #CACHE_DLINESIZE 8562306a36Sopenharmony_ci subs r1, r1, #CACHE_DLINESIZE 8662306a36Sopenharmony_ci bhi 1b 8762306a36Sopenharmony_ci mcr p15, 0, r0, c7, c10, 4 @ drain WB 8862306a36Sopenharmony_ci ret lr 8962306a36Sopenharmony_ci 9062306a36Sopenharmony_ci/* =============================== PageTable ============================== */ 9162306a36Sopenharmony_ci 9262306a36Sopenharmony_ci/* 9362306a36Sopenharmony_ci * cpu_fa526_switch_mm(pgd) 9462306a36Sopenharmony_ci * 9562306a36Sopenharmony_ci * Set the translation base pointer to be as described by pgd. 9662306a36Sopenharmony_ci * 9762306a36Sopenharmony_ci * pgd: new page tables 9862306a36Sopenharmony_ci */ 9962306a36Sopenharmony_ci .align 4 10062306a36Sopenharmony_ciENTRY(cpu_fa526_switch_mm) 10162306a36Sopenharmony_ci#ifdef CONFIG_MMU 10262306a36Sopenharmony_ci mov ip, #0 10362306a36Sopenharmony_ci#ifdef CONFIG_CPU_DCACHE_WRITETHROUGH 10462306a36Sopenharmony_ci mcr p15, 0, ip, c7, c6, 0 @ invalidate D cache 10562306a36Sopenharmony_ci#else 10662306a36Sopenharmony_ci mcr p15, 0, ip, c7, c14, 0 @ clean and invalidate whole D cache 10762306a36Sopenharmony_ci#endif 10862306a36Sopenharmony_ci mcr p15, 0, ip, c7, c5, 0 @ invalidate I cache 10962306a36Sopenharmony_ci mcr p15, 0, ip, c7, c5, 6 @ invalidate BTB since mm changed 11062306a36Sopenharmony_ci mcr p15, 0, ip, c7, c10, 4 @ data write barrier 11162306a36Sopenharmony_ci mcr p15, 0, ip, c7, c5, 4 @ prefetch flush 11262306a36Sopenharmony_ci mcr p15, 0, r0, c2, c0, 0 @ load page table pointer 11362306a36Sopenharmony_ci mcr p15, 0, ip, c8, c7, 0 @ invalidate UTLB 11462306a36Sopenharmony_ci#endif 11562306a36Sopenharmony_ci ret lr 11662306a36Sopenharmony_ci 11762306a36Sopenharmony_ci/* 11862306a36Sopenharmony_ci * cpu_fa526_set_pte_ext(ptep, pte, ext) 11962306a36Sopenharmony_ci * 12062306a36Sopenharmony_ci * Set a PTE and flush it out 12162306a36Sopenharmony_ci */ 12262306a36Sopenharmony_ci .align 4 12362306a36Sopenharmony_ciENTRY(cpu_fa526_set_pte_ext) 12462306a36Sopenharmony_ci#ifdef CONFIG_MMU 12562306a36Sopenharmony_ci armv3_set_pte_ext 12662306a36Sopenharmony_ci mov r0, r0 12762306a36Sopenharmony_ci mcr p15, 0, r0, c7, c10, 1 @ clean D entry 12862306a36Sopenharmony_ci mov r0, #0 12962306a36Sopenharmony_ci mcr p15, 0, r0, c7, c10, 4 @ drain WB 13062306a36Sopenharmony_ci#endif 13162306a36Sopenharmony_ci ret lr 13262306a36Sopenharmony_ci 13362306a36Sopenharmony_ci .type __fa526_setup, #function 13462306a36Sopenharmony_ci__fa526_setup: 13562306a36Sopenharmony_ci /* On return of this routine, r0 must carry correct flags for CFG register */ 13662306a36Sopenharmony_ci mov r0, #0 13762306a36Sopenharmony_ci mcr p15, 0, r0, c7, c7 @ invalidate I,D caches on v4 13862306a36Sopenharmony_ci mcr p15, 0, r0, c7, c10, 4 @ drain write buffer on v4 13962306a36Sopenharmony_ci#ifdef CONFIG_MMU 14062306a36Sopenharmony_ci mcr p15, 0, r0, c8, c7 @ invalidate I,D TLBs on v4 14162306a36Sopenharmony_ci#endif 14262306a36Sopenharmony_ci mcr p15, 0, r0, c7, c5, 5 @ invalidate IScratchpad RAM 14362306a36Sopenharmony_ci 14462306a36Sopenharmony_ci mov r0, #1 14562306a36Sopenharmony_ci mcr p15, 0, r0, c1, c1, 0 @ turn-on ECR 14662306a36Sopenharmony_ci 14762306a36Sopenharmony_ci mov r0, #0 14862306a36Sopenharmony_ci mcr p15, 0, r0, c7, c5, 6 @ invalidate BTB All 14962306a36Sopenharmony_ci mcr p15, 0, r0, c7, c10, 4 @ data write barrier 15062306a36Sopenharmony_ci mcr p15, 0, r0, c7, c5, 4 @ prefetch flush 15162306a36Sopenharmony_ci 15262306a36Sopenharmony_ci mov r0, #0x1f @ Domains 0, 1 = manager, 2 = client 15362306a36Sopenharmony_ci mcr p15, 0, r0, c3, c0 @ load domain access register 15462306a36Sopenharmony_ci 15562306a36Sopenharmony_ci mrc p15, 0, r0, c1, c0 @ get control register v4 15662306a36Sopenharmony_ci ldr r5, fa526_cr1_clear 15762306a36Sopenharmony_ci bic r0, r0, r5 15862306a36Sopenharmony_ci ldr r5, fa526_cr1_set 15962306a36Sopenharmony_ci orr r0, r0, r5 16062306a36Sopenharmony_ci ret lr 16162306a36Sopenharmony_ci .size __fa526_setup, . - __fa526_setup 16262306a36Sopenharmony_ci 16362306a36Sopenharmony_ci /* 16462306a36Sopenharmony_ci * .RVI ZFRS BLDP WCAM 16562306a36Sopenharmony_ci * ..11 1001 .111 1101 16662306a36Sopenharmony_ci * 16762306a36Sopenharmony_ci */ 16862306a36Sopenharmony_ci .type fa526_cr1_clear, #object 16962306a36Sopenharmony_ci .type fa526_cr1_set, #object 17062306a36Sopenharmony_cifa526_cr1_clear: 17162306a36Sopenharmony_ci .word 0x3f3f 17262306a36Sopenharmony_cifa526_cr1_set: 17362306a36Sopenharmony_ci .word 0x397D 17462306a36Sopenharmony_ci 17562306a36Sopenharmony_ci __INITDATA 17662306a36Sopenharmony_ci 17762306a36Sopenharmony_ci @ define struct processor (see <asm/proc-fns.h> and proc-macros.S) 17862306a36Sopenharmony_ci define_processor_functions fa526, dabort=v4_early_abort, pabort=legacy_pabort 17962306a36Sopenharmony_ci 18062306a36Sopenharmony_ci .section ".rodata" 18162306a36Sopenharmony_ci 18262306a36Sopenharmony_ci string cpu_arch_name, "armv4" 18362306a36Sopenharmony_ci string cpu_elf_name, "v4" 18462306a36Sopenharmony_ci string cpu_fa526_name, "FA526" 18562306a36Sopenharmony_ci 18662306a36Sopenharmony_ci .align 18762306a36Sopenharmony_ci 18862306a36Sopenharmony_ci .section ".proc.info.init", "a" 18962306a36Sopenharmony_ci 19062306a36Sopenharmony_ci .type __fa526_proc_info,#object 19162306a36Sopenharmony_ci__fa526_proc_info: 19262306a36Sopenharmony_ci .long 0x66015261 19362306a36Sopenharmony_ci .long 0xff01fff1 19462306a36Sopenharmony_ci .long PMD_TYPE_SECT | \ 19562306a36Sopenharmony_ci PMD_SECT_BUFFERABLE | \ 19662306a36Sopenharmony_ci PMD_SECT_CACHEABLE | \ 19762306a36Sopenharmony_ci PMD_BIT4 | \ 19862306a36Sopenharmony_ci PMD_SECT_AP_WRITE | \ 19962306a36Sopenharmony_ci PMD_SECT_AP_READ 20062306a36Sopenharmony_ci .long PMD_TYPE_SECT | \ 20162306a36Sopenharmony_ci PMD_BIT4 | \ 20262306a36Sopenharmony_ci PMD_SECT_AP_WRITE | \ 20362306a36Sopenharmony_ci PMD_SECT_AP_READ 20462306a36Sopenharmony_ci initfn __fa526_setup, __fa526_proc_info 20562306a36Sopenharmony_ci .long cpu_arch_name 20662306a36Sopenharmony_ci .long cpu_elf_name 20762306a36Sopenharmony_ci .long HWCAP_SWP | HWCAP_HALF 20862306a36Sopenharmony_ci .long cpu_fa526_name 20962306a36Sopenharmony_ci .long fa526_processor_functions 21062306a36Sopenharmony_ci .long fa_tlb_fns 21162306a36Sopenharmony_ci .long fa_user_fns 21262306a36Sopenharmony_ci .long fa_cache_fns 21362306a36Sopenharmony_ci .size __fa526_proc_info, . - __fa526_proc_info 214