xref: /openbmc/linux/arch/arm/mm/proc-sa110.S (revision 4b4193256c8d3bc3a5397b5cd9494c2ad386317d)
1d2912cb1SThomas Gleixner/* SPDX-License-Identifier: GPL-2.0-only */
21da177e4SLinus Torvalds/*
31da177e4SLinus Torvalds *  linux/arch/arm/mm/proc-sa110.S
41da177e4SLinus Torvalds *
51da177e4SLinus Torvalds *  Copyright (C) 1997-2002 Russell King
6d090dddaSHyok S. Choi *  hacked for non-paged-MM by Hyok S. Choi, 2003.
71da177e4SLinus Torvalds *
81da177e4SLinus Torvalds *  MMU functions for SA110
91da177e4SLinus Torvalds *
101da177e4SLinus Torvalds *  These are the low level assembler for performing cache and TLB
111da177e4SLinus Torvalds *  functions on the StrongARM-110.
121da177e4SLinus Torvalds */
131da177e4SLinus Torvalds#include <linux/linkage.h>
141da177e4SLinus Torvalds#include <linux/init.h>
15*65fddcfcSMike Rapoport#include <linux/pgtable.h>
161da177e4SLinus Torvalds#include <asm/assembler.h>
17e6ae744dSSam Ravnborg#include <asm/asm-offsets.h>
185ec9407dSRussell King#include <asm/hwcap.h>
19a09e64fbSRussell King#include <mach/hardware.h>
2074945c86SRussell King#include <asm/pgtable-hwdef.h>
211da177e4SLinus Torvalds#include <asm/ptrace.h>
221da177e4SLinus Torvalds
23bb8d5a55SThomas Gleixner#include "proc-macros.S"
24bb8d5a55SThomas Gleixner
251da177e4SLinus Torvalds/*
261da177e4SLinus Torvalds * the cache line size of the I and D cache
271da177e4SLinus Torvalds */
281da177e4SLinus Torvalds#define DCACHELINESIZE	32
291da177e4SLinus Torvalds
301da177e4SLinus Torvalds	.text
311da177e4SLinus Torvalds
321da177e4SLinus Torvalds/*
331da177e4SLinus Torvalds * cpu_sa110_proc_init()
341da177e4SLinus Torvalds */
351da177e4SLinus TorvaldsENTRY(cpu_sa110_proc_init)
361da177e4SLinus Torvalds	mov	r0, #0
371da177e4SLinus Torvalds	mcr	p15, 0, r0, c15, c1, 2		@ Enable clock switching
386ebbf2ceSRussell King	ret	lr
391da177e4SLinus Torvalds
401da177e4SLinus Torvalds/*
411da177e4SLinus Torvalds * cpu_sa110_proc_fin()
421da177e4SLinus Torvalds */
431da177e4SLinus TorvaldsENTRY(cpu_sa110_proc_fin)
449ca03a21SRussell King	mov	r0, #0
451da177e4SLinus Torvalds	mcr	p15, 0, r0, c15, c2, 2		@ Disable clock switching
461da177e4SLinus Torvalds	mrc	p15, 0, r0, c1, c0, 0		@ ctrl register
471da177e4SLinus Torvalds	bic	r0, r0, #0x1000			@ ...i............
481da177e4SLinus Torvalds	bic	r0, r0, #0x000e			@ ............wca.
491da177e4SLinus Torvalds	mcr	p15, 0, r0, c1, c0, 0		@ disable caches
506ebbf2ceSRussell King	ret	lr
511da177e4SLinus Torvalds
521da177e4SLinus Torvalds/*
531da177e4SLinus Torvalds * cpu_sa110_reset(loc)
541da177e4SLinus Torvalds *
551da177e4SLinus Torvalds * Perform a soft reset of the system.  Put the CPU into the
561da177e4SLinus Torvalds * same state as it would be if it had been reset, and branch
571da177e4SLinus Torvalds * to what would be the reset vector.
581da177e4SLinus Torvalds *
591da177e4SLinus Torvalds * loc: location to jump to for soft reset
601da177e4SLinus Torvalds */
611da177e4SLinus Torvalds	.align	5
621a4baafaSWill Deacon	.pushsection	.idmap.text, "ax"
631da177e4SLinus TorvaldsENTRY(cpu_sa110_reset)
641da177e4SLinus Torvalds	mov	ip, #0
651da177e4SLinus Torvalds	mcr	p15, 0, ip, c7, c7, 0		@ invalidate I,D caches
661da177e4SLinus Torvalds	mcr	p15, 0, ip, c7, c10, 4		@ drain WB
67d090dddaSHyok S. Choi#ifdef CONFIG_MMU
681da177e4SLinus Torvalds	mcr	p15, 0, ip, c8, c7, 0		@ invalidate I & D TLBs
69d090dddaSHyok S. Choi#endif
701da177e4SLinus Torvalds	mrc	p15, 0, ip, c1, c0, 0		@ ctrl register
711da177e4SLinus Torvalds	bic	ip, ip, #0x000f			@ ............wcam
721da177e4SLinus Torvalds	bic	ip, ip, #0x1100			@ ...i...s........
731da177e4SLinus Torvalds	mcr	p15, 0, ip, c1, c0, 0		@ ctrl register
746ebbf2ceSRussell King	ret	r0
751a4baafaSWill DeaconENDPROC(cpu_sa110_reset)
761a4baafaSWill Deacon	.popsection
771da177e4SLinus Torvalds
781da177e4SLinus Torvalds/*
791da177e4SLinus Torvalds * cpu_sa110_do_idle(type)
801da177e4SLinus Torvalds *
811da177e4SLinus Torvalds * Cause the processor to idle
821da177e4SLinus Torvalds *
831da177e4SLinus Torvalds * type: call type:
841da177e4SLinus Torvalds *   0 = slow idle
851da177e4SLinus Torvalds *   1 = fast idle
861da177e4SLinus Torvalds *   2 = switch to slow processor clock
871da177e4SLinus Torvalds *   3 = switch to fast processor clock
881da177e4SLinus Torvalds */
891da177e4SLinus Torvalds	.align	5
901da177e4SLinus Torvalds
911da177e4SLinus TorvaldsENTRY(cpu_sa110_do_idle)
921da177e4SLinus Torvalds	mcr	p15, 0, ip, c15, c2, 2		@ disable clock switching
931da177e4SLinus Torvalds	ldr	r1, =UNCACHEABLE_ADDR		@ load from uncacheable loc
941da177e4SLinus Torvalds	ldr	r1, [r1, #0]			@ force switch to MCLK
951da177e4SLinus Torvalds	mov	r0, r0				@ safety
961da177e4SLinus Torvalds	mov	r0, r0				@ safety
971da177e4SLinus Torvalds	mov	r0, r0				@ safety
981da177e4SLinus Torvalds	mcr	p15, 0, r0, c15, c8, 2		@ Wait for interrupt, cache aligned
991da177e4SLinus Torvalds	mov	r0, r0				@ safety
1001da177e4SLinus Torvalds	mov	r0, r0				@ safety
1011da177e4SLinus Torvalds	mov	r0, r0				@ safety
1021da177e4SLinus Torvalds	mcr	p15, 0, r0, c15, c1, 2		@ enable clock switching
1036ebbf2ceSRussell King	ret	lr
1041da177e4SLinus Torvalds
1051da177e4SLinus Torvalds/* ================================= CACHE ================================ */
1061da177e4SLinus Torvalds
1071da177e4SLinus Torvalds/*
1081da177e4SLinus Torvalds * cpu_sa110_dcache_clean_area(addr,sz)
1091da177e4SLinus Torvalds *
1101da177e4SLinus Torvalds * Clean the specified entry of any caches such that the MMU
1111da177e4SLinus Torvalds * translation fetches will obtain correct data.
1121da177e4SLinus Torvalds *
1131da177e4SLinus Torvalds * addr: cache-unaligned virtual address
1141da177e4SLinus Torvalds */
1151da177e4SLinus Torvalds	.align	5
1161da177e4SLinus TorvaldsENTRY(cpu_sa110_dcache_clean_area)
1171da177e4SLinus Torvalds1:	mcr	p15, 0, r0, c7, c10, 1		@ clean D entry
1181da177e4SLinus Torvalds	add	r0, r0, #DCACHELINESIZE
1191da177e4SLinus Torvalds	subs	r1, r1, #DCACHELINESIZE
1201da177e4SLinus Torvalds	bhi	1b
1216ebbf2ceSRussell King	ret	lr
1221da177e4SLinus Torvalds
1231da177e4SLinus Torvalds/* =============================== PageTable ============================== */
1241da177e4SLinus Torvalds
1251da177e4SLinus Torvalds/*
1261da177e4SLinus Torvalds * cpu_sa110_switch_mm(pgd)
1271da177e4SLinus Torvalds *
1281da177e4SLinus Torvalds * Set the translation base pointer to be as described by pgd.
1291da177e4SLinus Torvalds *
1301da177e4SLinus Torvalds * pgd: new page tables
1311da177e4SLinus Torvalds */
1321da177e4SLinus Torvalds	.align	5
1331da177e4SLinus TorvaldsENTRY(cpu_sa110_switch_mm)
134d090dddaSHyok S. Choi#ifdef CONFIG_MMU
13595f3df6bSRussell King	str	lr, [sp, #-4]!
13695f3df6bSRussell King	bl	v4wb_flush_kern_cache_all	@ clears IP
1371da177e4SLinus Torvalds	mcr	p15, 0, r0, c2, c0, 0		@ load page table pointer
13895f3df6bSRussell King	mcr	p15, 0, ip, c8, c7, 0		@ invalidate I & D TLBs
13995f3df6bSRussell King	ldr	pc, [sp], #4
140d090dddaSHyok S. Choi#else
1416ebbf2ceSRussell King	ret	lr
142d090dddaSHyok S. Choi#endif
1431da177e4SLinus Torvalds
1441da177e4SLinus Torvalds/*
145ad1ae2feSRussell King * cpu_sa110_set_pte_ext(ptep, pte, ext)
1461da177e4SLinus Torvalds *
1471da177e4SLinus Torvalds * Set a PTE and flush it out
1481da177e4SLinus Torvalds */
1491da177e4SLinus Torvalds	.align	5
150ad1ae2feSRussell KingENTRY(cpu_sa110_set_pte_ext)
151d090dddaSHyok S. Choi#ifdef CONFIG_MMU
152da091653SRussell King	armv3_set_pte_ext wc_disable=0
1531da177e4SLinus Torvalds	mov	r0, r0
1541da177e4SLinus Torvalds	mcr	p15, 0, r0, c7, c10, 1		@ clean D entry
1551da177e4SLinus Torvalds	mcr	p15, 0, r0, c7, c10, 4		@ drain WB
156d090dddaSHyok S. Choi#endif
1576ebbf2ceSRussell King	ret	lr
1581da177e4SLinus Torvalds
1591da177e4SLinus Torvalds	.type	__sa110_setup, #function
1601da177e4SLinus Torvalds__sa110_setup:
1611da177e4SLinus Torvalds	mov	r10, #0
1621da177e4SLinus Torvalds	mcr	p15, 0, r10, c7, c7		@ invalidate I,D caches on v4
1631da177e4SLinus Torvalds	mcr	p15, 0, r10, c7, c10, 4		@ drain write buffer on v4
164d090dddaSHyok S. Choi#ifdef CONFIG_MMU
1651da177e4SLinus Torvalds	mcr	p15, 0, r10, c8, c7		@ invalidate I,D TLBs on v4
166d090dddaSHyok S. Choi#endif
16722b19086SRussell King
16822b19086SRussell King	adr	r5, sa110_crval
16922b19086SRussell King	ldmia	r5, {r5, r6}
1701da177e4SLinus Torvalds	mrc	p15, 0, r0, c1, c0		@ get control register v4
1711da177e4SLinus Torvalds	bic	r0, r0, r5
17222b19086SRussell King	orr	r0, r0, r6
1736ebbf2ceSRussell King	ret	lr
1741da177e4SLinus Torvalds	.size	__sa110_setup, . - __sa110_setup
1751da177e4SLinus Torvalds
1761da177e4SLinus Torvalds	/*
1771da177e4SLinus Torvalds	 *  R
1781da177e4SLinus Torvalds	 * .RVI ZFRS BLDP WCAM
1791da177e4SLinus Torvalds	 * ..01 0001 ..11 1101
1801da177e4SLinus Torvalds	 *
1811da177e4SLinus Torvalds	 */
18222b19086SRussell King	.type	sa110_crval, #object
18322b19086SRussell Kingsa110_crval:
18422b19086SRussell King	crval	clear=0x00003f3f, mmuset=0x0000113d, ucset=0x00001130
1851da177e4SLinus Torvalds
1861da177e4SLinus Torvalds	__INITDATA
1871da177e4SLinus Torvalds
1885973ba58SDave Martin	@ define struct processor (see <asm/proc-fns.h> and proc-macros.S)
1895973ba58SDave Martin	define_processor_functions sa110, dabort=v4_early_abort, pabort=legacy_pabort
1901da177e4SLinus Torvalds
1911da177e4SLinus Torvalds	.section ".rodata"
1921da177e4SLinus Torvalds
1935973ba58SDave Martin	string	cpu_arch_name, "armv4"
1945973ba58SDave Martin	string	cpu_elf_name, "v4"
1955973ba58SDave Martin	string	cpu_sa110_name, "StrongARM-110"
1961da177e4SLinus Torvalds
1971da177e4SLinus Torvalds	.align
1981da177e4SLinus Torvalds
199790756c7SNick Desaulniers	.section ".proc.info.init", "a"
2001da177e4SLinus Torvalds
2011da177e4SLinus Torvalds	.type	__sa110_proc_info,#object
2021da177e4SLinus Torvalds__sa110_proc_info:
2031da177e4SLinus Torvalds	.long	0x4401a100
2041da177e4SLinus Torvalds	.long	0xfffffff0
2051da177e4SLinus Torvalds	.long   PMD_TYPE_SECT | \
2061da177e4SLinus Torvalds		PMD_SECT_BUFFERABLE | \
2071da177e4SLinus Torvalds		PMD_SECT_CACHEABLE | \
2081da177e4SLinus Torvalds		PMD_SECT_AP_WRITE | \
2091da177e4SLinus Torvalds		PMD_SECT_AP_READ
2108799ee9fSRussell King	.long   PMD_TYPE_SECT | \
2118799ee9fSRussell King		PMD_SECT_AP_WRITE | \
2128799ee9fSRussell King		PMD_SECT_AP_READ
213bf35706fSArd Biesheuvel	initfn	__sa110_setup, __sa110_proc_info
2141da177e4SLinus Torvalds	.long	cpu_arch_name
2151da177e4SLinus Torvalds	.long	cpu_elf_name
2161da177e4SLinus Torvalds	.long	HWCAP_SWP | HWCAP_HALF | HWCAP_26BIT | HWCAP_FAST_MULT
2171da177e4SLinus Torvalds	.long	cpu_sa110_name
2181da177e4SLinus Torvalds	.long	sa110_processor_functions
2191da177e4SLinus Torvalds	.long	v4wb_tlb_fns
2201da177e4SLinus Torvalds	.long	v4wb_user_fns
2211da177e4SLinus Torvalds	.long	v4wb_cache_fns
2221da177e4SLinus Torvalds	.size	__sa110_proc_info, . - __sa110_proc_info
223