xref: /openbmc/linux/arch/arm/mm/proc-arm922.S (revision 4b4193256c8d3bc3a5397b5cd9494c2ad386317d)
11a59d1b8SThomas Gleixner/* SPDX-License-Identifier: GPL-2.0-or-later */
21da177e4SLinus Torvalds/*
31da177e4SLinus Torvalds *  linux/arch/arm/mm/proc-arm922.S: MMU functions for ARM922
41da177e4SLinus Torvalds *
51da177e4SLinus Torvalds *  Copyright (C) 1999,2000 ARM Limited
61da177e4SLinus Torvalds *  Copyright (C) 2000 Deep Blue Solutions Ltd.
71da177e4SLinus Torvalds *  Copyright (C) 2001 Altera Corporation
8d090dddaSHyok S. Choi *  hacked for non-paged-MM by Hyok S. Choi, 2003.
91da177e4SLinus Torvalds *
101da177e4SLinus Torvalds * These are the low level assembler for performing cache and TLB
111da177e4SLinus Torvalds * functions on the arm922.
121da177e4SLinus Torvalds *
131da177e4SLinus Torvalds *  CONFIG_CPU_ARM922_CPU_IDLE -> nohlt
141da177e4SLinus Torvalds */
151da177e4SLinus Torvalds#include <linux/linkage.h>
161da177e4SLinus Torvalds#include <linux/init.h>
17*65fddcfcSMike Rapoport#include <linux/pgtable.h>
181da177e4SLinus Torvalds#include <asm/assembler.h>
195ec9407dSRussell King#include <asm/hwcap.h>
2074945c86SRussell King#include <asm/pgtable-hwdef.h>
211da177e4SLinus Torvalds#include <asm/page.h>
221da177e4SLinus Torvalds#include <asm/ptrace.h>
231da177e4SLinus Torvalds#include "proc-macros.S"
241da177e4SLinus Torvalds
251da177e4SLinus Torvalds/*
261da177e4SLinus Torvalds * The size of one data cache line.
271da177e4SLinus Torvalds */
281da177e4SLinus Torvalds#define CACHE_DLINESIZE	32
291da177e4SLinus Torvalds
301da177e4SLinus Torvalds/*
311da177e4SLinus Torvalds * The number of data cache segments.
321da177e4SLinus Torvalds */
331da177e4SLinus Torvalds#define CACHE_DSEGMENTS	4
341da177e4SLinus Torvalds
351da177e4SLinus Torvalds/*
361da177e4SLinus Torvalds * The number of lines in a cache segment.
371da177e4SLinus Torvalds */
381da177e4SLinus Torvalds#define CACHE_DENTRIES	64
391da177e4SLinus Torvalds
401da177e4SLinus Torvalds/*
411da177e4SLinus Torvalds * This is the size at which it becomes more efficient to
421da177e4SLinus Torvalds * clean the whole cache, rather than using the individual
4325985edcSLucas De Marchi * cache line maintenance instructions.  (I think this should
441da177e4SLinus Torvalds * be 32768).
451da177e4SLinus Torvalds */
461da177e4SLinus Torvalds#define CACHE_DLIMIT	8192
471da177e4SLinus Torvalds
481da177e4SLinus Torvalds
491da177e4SLinus Torvalds	.text
501da177e4SLinus Torvalds/*
511da177e4SLinus Torvalds * cpu_arm922_proc_init()
521da177e4SLinus Torvalds */
531da177e4SLinus TorvaldsENTRY(cpu_arm922_proc_init)
546ebbf2ceSRussell King	ret	lr
551da177e4SLinus Torvalds
561da177e4SLinus Torvalds/*
571da177e4SLinus Torvalds * cpu_arm922_proc_fin()
581da177e4SLinus Torvalds */
591da177e4SLinus TorvaldsENTRY(cpu_arm922_proc_fin)
601da177e4SLinus Torvalds	mrc	p15, 0, r0, c1, c0, 0		@ ctrl register
611da177e4SLinus Torvalds	bic	r0, r0, #0x1000			@ ...i............
621da177e4SLinus Torvalds	bic	r0, r0, #0x000e			@ ............wca.
631da177e4SLinus Torvalds	mcr	p15, 0, r0, c1, c0, 0		@ disable caches
646ebbf2ceSRussell King	ret	lr
651da177e4SLinus Torvalds
661da177e4SLinus Torvalds/*
671da177e4SLinus Torvalds * cpu_arm922_reset(loc)
681da177e4SLinus Torvalds *
691da177e4SLinus Torvalds * Perform a soft reset of the system.  Put the CPU into the
701da177e4SLinus Torvalds * same state as it would be if it had been reset, and branch
711da177e4SLinus Torvalds * to what would be the reset vector.
721da177e4SLinus Torvalds *
731da177e4SLinus Torvalds * loc: location to jump to for soft reset
741da177e4SLinus Torvalds */
751da177e4SLinus Torvalds	.align	5
761a4baafaSWill Deacon	.pushsection	.idmap.text, "ax"
771da177e4SLinus TorvaldsENTRY(cpu_arm922_reset)
781da177e4SLinus Torvalds	mov	ip, #0
791da177e4SLinus Torvalds	mcr	p15, 0, ip, c7, c7, 0		@ invalidate I,D caches
801da177e4SLinus Torvalds	mcr	p15, 0, ip, c7, c10, 4		@ drain WB
81d090dddaSHyok S. Choi#ifdef CONFIG_MMU
821da177e4SLinus Torvalds	mcr	p15, 0, ip, c8, c7, 0		@ invalidate I & D TLBs
83d090dddaSHyok S. Choi#endif
841da177e4SLinus Torvalds	mrc	p15, 0, ip, c1, c0, 0		@ ctrl register
851da177e4SLinus Torvalds	bic	ip, ip, #0x000f			@ ............wcam
861da177e4SLinus Torvalds	bic	ip, ip, #0x1100			@ ...i...s........
871da177e4SLinus Torvalds	mcr	p15, 0, ip, c1, c0, 0		@ ctrl register
886ebbf2ceSRussell King	ret	r0
891a4baafaSWill DeaconENDPROC(cpu_arm922_reset)
901a4baafaSWill Deacon	.popsection
911da177e4SLinus Torvalds
921da177e4SLinus Torvalds/*
931da177e4SLinus Torvalds * cpu_arm922_do_idle()
941da177e4SLinus Torvalds */
951da177e4SLinus Torvalds	.align	5
961da177e4SLinus TorvaldsENTRY(cpu_arm922_do_idle)
971da177e4SLinus Torvalds	mcr	p15, 0, r0, c7, c0, 4		@ Wait for interrupt
986ebbf2ceSRussell King	ret	lr
991da177e4SLinus Torvalds
1001da177e4SLinus Torvalds
1011da177e4SLinus Torvalds#ifndef CONFIG_CPU_DCACHE_WRITETHROUGH
1021da177e4SLinus Torvalds
1031da177e4SLinus Torvalds/*
104c8c90860SMika Westerberg *	flush_icache_all()
105c8c90860SMika Westerberg *
106c8c90860SMika Westerberg *	Unconditionally clean and invalidate the entire icache.
107c8c90860SMika Westerberg */
108c8c90860SMika WesterbergENTRY(arm922_flush_icache_all)
109c8c90860SMika Westerberg	mov	r0, #0
110c8c90860SMika Westerberg	mcr	p15, 0, r0, c7, c5, 0		@ invalidate I cache
1116ebbf2ceSRussell King	ret	lr
112c8c90860SMika WesterbergENDPROC(arm922_flush_icache_all)
113c8c90860SMika Westerberg
114c8c90860SMika Westerberg/*
1151da177e4SLinus Torvalds *	flush_user_cache_all()
1161da177e4SLinus Torvalds *
1171da177e4SLinus Torvalds *	Clean and invalidate all cache entries in a particular
1181da177e4SLinus Torvalds *	address space.
1191da177e4SLinus Torvalds */
1201da177e4SLinus TorvaldsENTRY(arm922_flush_user_cache_all)
1211da177e4SLinus Torvalds	/* FALLTHROUGH */
1221da177e4SLinus Torvalds
1231da177e4SLinus Torvalds/*
1241da177e4SLinus Torvalds *	flush_kern_cache_all()
1251da177e4SLinus Torvalds *
1261da177e4SLinus Torvalds *	Clean and invalidate the entire cache.
1271da177e4SLinus Torvalds */
1281da177e4SLinus TorvaldsENTRY(arm922_flush_kern_cache_all)
1291da177e4SLinus Torvalds	mov	r2, #VM_EXEC
1301da177e4SLinus Torvalds	mov	ip, #0
1311da177e4SLinus Torvalds__flush_whole_cache:
1321da177e4SLinus Torvalds	mov	r1, #(CACHE_DSEGMENTS - 1) << 5	@ 8 segments
1331da177e4SLinus Torvalds1:	orr	r3, r1, #(CACHE_DENTRIES - 1) << 26 @ 64 entries
1341da177e4SLinus Torvalds2:	mcr	p15, 0, r3, c7, c14, 2		@ clean+invalidate D index
1351da177e4SLinus Torvalds	subs	r3, r3, #1 << 26
1361da177e4SLinus Torvalds	bcs	2b				@ entries 63 to 0
1371da177e4SLinus Torvalds	subs	r1, r1, #1 << 5
1381da177e4SLinus Torvalds	bcs	1b				@ segments 7 to 0
1391da177e4SLinus Torvalds	tst	r2, #VM_EXEC
1401da177e4SLinus Torvalds	mcrne	p15, 0, ip, c7, c5, 0		@ invalidate I cache
1411da177e4SLinus Torvalds	mcrne	p15, 0, ip, c7, c10, 4		@ drain WB
1426ebbf2ceSRussell King	ret	lr
1431da177e4SLinus Torvalds
1441da177e4SLinus Torvalds/*
1451da177e4SLinus Torvalds *	flush_user_cache_range(start, end, flags)
1461da177e4SLinus Torvalds *
1471da177e4SLinus Torvalds *	Clean and invalidate a range of cache entries in the
1481da177e4SLinus Torvalds *	specified address range.
1491da177e4SLinus Torvalds *
1501da177e4SLinus Torvalds *	- start	- start address (inclusive)
1511da177e4SLinus Torvalds *	- end	- end address (exclusive)
1521da177e4SLinus Torvalds *	- flags	- vm_flags describing address space
1531da177e4SLinus Torvalds */
1541da177e4SLinus TorvaldsENTRY(arm922_flush_user_cache_range)
1551da177e4SLinus Torvalds	mov	ip, #0
1561da177e4SLinus Torvalds	sub	r3, r1, r0			@ calculate total size
1571da177e4SLinus Torvalds	cmp	r3, #CACHE_DLIMIT
1581da177e4SLinus Torvalds	bhs	__flush_whole_cache
1591da177e4SLinus Torvalds
1601da177e4SLinus Torvalds1:	mcr	p15, 0, r0, c7, c14, 1		@ clean+invalidate D entry
1611da177e4SLinus Torvalds	tst	r2, #VM_EXEC
1621da177e4SLinus Torvalds	mcrne	p15, 0, r0, c7, c5, 1		@ invalidate I entry
1631da177e4SLinus Torvalds	add	r0, r0, #CACHE_DLINESIZE
1641da177e4SLinus Torvalds	cmp	r0, r1
1651da177e4SLinus Torvalds	blo	1b
1661da177e4SLinus Torvalds	tst	r2, #VM_EXEC
1671da177e4SLinus Torvalds	mcrne	p15, 0, ip, c7, c10, 4		@ drain WB
1686ebbf2ceSRussell King	ret	lr
1691da177e4SLinus Torvalds
1701da177e4SLinus Torvalds/*
1711da177e4SLinus Torvalds *	coherent_kern_range(start, end)
1721da177e4SLinus Torvalds *
1731da177e4SLinus Torvalds *	Ensure coherency between the Icache and the Dcache in the
1741da177e4SLinus Torvalds *	region described by start, end.  If you have non-snooping
1751da177e4SLinus Torvalds *	Harvard caches, you need to implement this function.
1761da177e4SLinus Torvalds *
1771da177e4SLinus Torvalds *	- start	- virtual start address
1781da177e4SLinus Torvalds *	- end	- virtual end address
1791da177e4SLinus Torvalds */
1801da177e4SLinus TorvaldsENTRY(arm922_coherent_kern_range)
1811da177e4SLinus Torvalds	/* FALLTHROUGH */
1821da177e4SLinus Torvalds
1831da177e4SLinus Torvalds/*
1841da177e4SLinus Torvalds *	coherent_user_range(start, end)
1851da177e4SLinus Torvalds *
1861da177e4SLinus Torvalds *	Ensure coherency between the Icache and the Dcache in the
1871da177e4SLinus Torvalds *	region described by start, end.  If you have non-snooping
1881da177e4SLinus Torvalds *	Harvard caches, you need to implement this function.
1891da177e4SLinus Torvalds *
1901da177e4SLinus Torvalds *	- start	- virtual start address
1911da177e4SLinus Torvalds *	- end	- virtual end address
1921da177e4SLinus Torvalds */
1931da177e4SLinus TorvaldsENTRY(arm922_coherent_user_range)
1941da177e4SLinus Torvalds	bic	r0, r0, #CACHE_DLINESIZE - 1
1951da177e4SLinus Torvalds1:	mcr	p15, 0, r0, c7, c10, 1		@ clean D entry
1961da177e4SLinus Torvalds	mcr	p15, 0, r0, c7, c5, 1		@ invalidate I entry
1971da177e4SLinus Torvalds	add	r0, r0, #CACHE_DLINESIZE
1981da177e4SLinus Torvalds	cmp	r0, r1
1991da177e4SLinus Torvalds	blo	1b
2001da177e4SLinus Torvalds	mcr	p15, 0, r0, c7, c10, 4		@ drain WB
201c5102f59SWill Deacon	mov	r0, #0
2026ebbf2ceSRussell King	ret	lr
2031da177e4SLinus Torvalds
2041da177e4SLinus Torvalds/*
2052c9b9c84SRussell King *	flush_kern_dcache_area(void *addr, size_t size)
2061da177e4SLinus Torvalds *
2071da177e4SLinus Torvalds *	Ensure no D cache aliasing occurs, either with itself or
2081da177e4SLinus Torvalds *	the I cache
2091da177e4SLinus Torvalds *
2102c9b9c84SRussell King *	- addr	- kernel address
2112c9b9c84SRussell King *	- size	- region size
2121da177e4SLinus Torvalds */
2132c9b9c84SRussell KingENTRY(arm922_flush_kern_dcache_area)
2142c9b9c84SRussell King	add	r1, r0, r1
2151da177e4SLinus Torvalds1:	mcr	p15, 0, r0, c7, c14, 1		@ clean+invalidate D entry
2161da177e4SLinus Torvalds	add	r0, r0, #CACHE_DLINESIZE
2171da177e4SLinus Torvalds	cmp	r0, r1
2181da177e4SLinus Torvalds	blo	1b
2191da177e4SLinus Torvalds	mov	r0, #0
2201da177e4SLinus Torvalds	mcr	p15, 0, r0, c7, c5, 0		@ invalidate I cache
2211da177e4SLinus Torvalds	mcr	p15, 0, r0, c7, c10, 4		@ drain WB
2226ebbf2ceSRussell King	ret	lr
2231da177e4SLinus Torvalds
2241da177e4SLinus Torvalds/*
2251da177e4SLinus Torvalds *	dma_inv_range(start, end)
2261da177e4SLinus Torvalds *
2271da177e4SLinus Torvalds *	Invalidate (discard) the specified virtual address range.
2281da177e4SLinus Torvalds *	May not write back any entries.  If 'start' or 'end'
2291da177e4SLinus Torvalds *	are not cache line aligned, those lines must be written
2301da177e4SLinus Torvalds *	back.
2311da177e4SLinus Torvalds *
2321da177e4SLinus Torvalds *	- start	- virtual start address
2331da177e4SLinus Torvalds *	- end	- virtual end address
2341da177e4SLinus Torvalds *
2351da177e4SLinus Torvalds * (same as v4wb)
2361da177e4SLinus Torvalds */
237702b94bfSRussell Kingarm922_dma_inv_range:
2381da177e4SLinus Torvalds	tst	r0, #CACHE_DLINESIZE - 1
2391da177e4SLinus Torvalds	bic	r0, r0, #CACHE_DLINESIZE - 1
2401da177e4SLinus Torvalds	mcrne	p15, 0, r0, c7, c10, 1		@ clean D entry
2411da177e4SLinus Torvalds	tst	r1, #CACHE_DLINESIZE - 1
2421da177e4SLinus Torvalds	mcrne	p15, 0, r1, c7, c10, 1		@ clean D entry
2431da177e4SLinus Torvalds1:	mcr	p15, 0, r0, c7, c6, 1		@ invalidate D entry
2441da177e4SLinus Torvalds	add	r0, r0, #CACHE_DLINESIZE
2451da177e4SLinus Torvalds	cmp	r0, r1
2461da177e4SLinus Torvalds	blo	1b
2471da177e4SLinus Torvalds	mcr	p15, 0, r0, c7, c10, 4		@ drain WB
2486ebbf2ceSRussell King	ret	lr
2491da177e4SLinus Torvalds
2501da177e4SLinus Torvalds/*
2511da177e4SLinus Torvalds *	dma_clean_range(start, end)
2521da177e4SLinus Torvalds *
2531da177e4SLinus Torvalds *	Clean the specified virtual address range.
2541da177e4SLinus Torvalds *
2551da177e4SLinus Torvalds *	- start	- virtual start address
2561da177e4SLinus Torvalds *	- end	- virtual end address
2571da177e4SLinus Torvalds *
2581da177e4SLinus Torvalds * (same as v4wb)
2591da177e4SLinus Torvalds */
260702b94bfSRussell Kingarm922_dma_clean_range:
2611da177e4SLinus Torvalds	bic	r0, r0, #CACHE_DLINESIZE - 1
2621da177e4SLinus Torvalds1:	mcr	p15, 0, r0, c7, c10, 1		@ clean D entry
2631da177e4SLinus Torvalds	add	r0, r0, #CACHE_DLINESIZE
2641da177e4SLinus Torvalds	cmp	r0, r1
2651da177e4SLinus Torvalds	blo	1b
2661da177e4SLinus Torvalds	mcr	p15, 0, r0, c7, c10, 4		@ drain WB
2676ebbf2ceSRussell King	ret	lr
2681da177e4SLinus Torvalds
2691da177e4SLinus Torvalds/*
2701da177e4SLinus Torvalds *	dma_flush_range(start, end)
2711da177e4SLinus Torvalds *
2721da177e4SLinus Torvalds *	Clean and invalidate the specified virtual address range.
2731da177e4SLinus Torvalds *
2741da177e4SLinus Torvalds *	- start	- virtual start address
2751da177e4SLinus Torvalds *	- end	- virtual end address
2761da177e4SLinus Torvalds */
2771da177e4SLinus TorvaldsENTRY(arm922_dma_flush_range)
2781da177e4SLinus Torvalds	bic	r0, r0, #CACHE_DLINESIZE - 1
2791da177e4SLinus Torvalds1:	mcr	p15, 0, r0, c7, c14, 1		@ clean+invalidate D entry
2801da177e4SLinus Torvalds	add	r0, r0, #CACHE_DLINESIZE
2811da177e4SLinus Torvalds	cmp	r0, r1
2821da177e4SLinus Torvalds	blo	1b
2831da177e4SLinus Torvalds	mcr	p15, 0, r0, c7, c10, 4		@ drain WB
2846ebbf2ceSRussell King	ret	lr
2851da177e4SLinus Torvalds
286a9c9147eSRussell King/*
287a9c9147eSRussell King *	dma_map_area(start, size, dir)
288a9c9147eSRussell King *	- start	- kernel virtual start address
289a9c9147eSRussell King *	- size	- size of region
290a9c9147eSRussell King *	- dir	- DMA direction
291a9c9147eSRussell King */
292a9c9147eSRussell KingENTRY(arm922_dma_map_area)
293a9c9147eSRussell King	add	r1, r1, r0
294a9c9147eSRussell King	cmp	r2, #DMA_TO_DEVICE
295a9c9147eSRussell King	beq	arm922_dma_clean_range
296a9c9147eSRussell King	bcs	arm922_dma_inv_range
297a9c9147eSRussell King	b	arm922_dma_flush_range
298a9c9147eSRussell KingENDPROC(arm922_dma_map_area)
299a9c9147eSRussell King
300a9c9147eSRussell King/*
301a9c9147eSRussell King *	dma_unmap_area(start, size, dir)
302a9c9147eSRussell King *	- start	- kernel virtual start address
303a9c9147eSRussell King *	- size	- size of region
304a9c9147eSRussell King *	- dir	- DMA direction
305a9c9147eSRussell King */
306a9c9147eSRussell KingENTRY(arm922_dma_unmap_area)
3076ebbf2ceSRussell King	ret	lr
308a9c9147eSRussell KingENDPROC(arm922_dma_unmap_area)
309a9c9147eSRussell King
310031bd879SLorenzo Pieralisi	.globl	arm922_flush_kern_cache_louis
311031bd879SLorenzo Pieralisi	.equ	arm922_flush_kern_cache_louis, arm922_flush_kern_cache_all
312031bd879SLorenzo Pieralisi
313f3e7383fSDave Martin	@ define struct cpu_cache_fns (see <asm/cacheflush.h> and proc-macros.S)
314f3e7383fSDave Martin	define_cache_functions arm922
3151da177e4SLinus Torvalds#endif
3161da177e4SLinus Torvalds
3171da177e4SLinus Torvalds
3181da177e4SLinus TorvaldsENTRY(cpu_arm922_dcache_clean_area)
3191da177e4SLinus Torvalds#ifndef CONFIG_CPU_DCACHE_WRITETHROUGH
3201da177e4SLinus Torvalds1:	mcr	p15, 0, r0, c7, c10, 1		@ clean D entry
3211da177e4SLinus Torvalds	add	r0, r0, #CACHE_DLINESIZE
3221da177e4SLinus Torvalds	subs	r1, r1, #CACHE_DLINESIZE
3231da177e4SLinus Torvalds	bhi	1b
3241da177e4SLinus Torvalds#endif
3256ebbf2ceSRussell King	ret	lr
3261da177e4SLinus Torvalds
3271da177e4SLinus Torvalds/* =============================== PageTable ============================== */
3281da177e4SLinus Torvalds
3291da177e4SLinus Torvalds/*
3301da177e4SLinus Torvalds * cpu_arm922_switch_mm(pgd)
3311da177e4SLinus Torvalds *
3321da177e4SLinus Torvalds * Set the translation base pointer to be as described by pgd.
3331da177e4SLinus Torvalds *
3341da177e4SLinus Torvalds * pgd: new page tables
3351da177e4SLinus Torvalds */
3361da177e4SLinus Torvalds	.align	5
3371da177e4SLinus TorvaldsENTRY(cpu_arm922_switch_mm)
338d090dddaSHyok S. Choi#ifdef CONFIG_MMU
3391da177e4SLinus Torvalds	mov	ip, #0
3401da177e4SLinus Torvalds#ifdef CONFIG_CPU_DCACHE_WRITETHROUGH
3411da177e4SLinus Torvalds	mcr	p15, 0, ip, c7, c6, 0		@ invalidate D cache
3421da177e4SLinus Torvalds#else
3431da177e4SLinus Torvalds@ && 'Clean & Invalidate whole DCache'
3441da177e4SLinus Torvalds@ && Re-written to use Index Ops.
3451da177e4SLinus Torvalds@ && Uses registers r1, r3 and ip
3461da177e4SLinus Torvalds
3471da177e4SLinus Torvalds	mov	r1, #(CACHE_DSEGMENTS - 1) << 5	@ 4 segments
3481da177e4SLinus Torvalds1:	orr	r3, r1, #(CACHE_DENTRIES - 1) << 26 @ 64 entries
3491da177e4SLinus Torvalds2:	mcr	p15, 0, r3, c7, c14, 2		@ clean & invalidate D index
3501da177e4SLinus Torvalds	subs	r3, r3, #1 << 26
3511da177e4SLinus Torvalds	bcs	2b				@ entries 63 to 0
3521da177e4SLinus Torvalds	subs	r1, r1, #1 << 5
3531da177e4SLinus Torvalds	bcs	1b				@ segments 7 to 0
3541da177e4SLinus Torvalds#endif
3551da177e4SLinus Torvalds	mcr	p15, 0, ip, c7, c5, 0		@ invalidate I cache
3561da177e4SLinus Torvalds	mcr	p15, 0, ip, c7, c10, 4		@ drain WB
3571da177e4SLinus Torvalds	mcr	p15, 0, r0, c2, c0, 0		@ load page table pointer
3581da177e4SLinus Torvalds	mcr	p15, 0, ip, c8, c7, 0		@ invalidate I & D TLBs
359d090dddaSHyok S. Choi#endif
3606ebbf2ceSRussell King	ret	lr
3611da177e4SLinus Torvalds
3621da177e4SLinus Torvalds/*
363ad1ae2feSRussell King * cpu_arm922_set_pte_ext(ptep, pte, ext)
3641da177e4SLinus Torvalds *
3651da177e4SLinus Torvalds * Set a PTE and flush it out
3661da177e4SLinus Torvalds */
3671da177e4SLinus Torvalds	.align	5
368ad1ae2feSRussell KingENTRY(cpu_arm922_set_pte_ext)
369d090dddaSHyok S. Choi#ifdef CONFIG_MMU
370da091653SRussell King	armv3_set_pte_ext
3711da177e4SLinus Torvalds	mov	r0, r0
3721da177e4SLinus Torvalds	mcr	p15, 0, r0, c7, c10, 1		@ clean D entry
3731da177e4SLinus Torvalds	mcr	p15, 0, r0, c7, c10, 4		@ drain WB
374d090dddaSHyok S. Choi#endif /* CONFIG_MMU */
3756ebbf2ceSRussell King	ret	lr
3761da177e4SLinus Torvalds
3771da177e4SLinus Torvalds	.type	__arm922_setup, #function
3781da177e4SLinus Torvalds__arm922_setup:
3791da177e4SLinus Torvalds	mov	r0, #0
3801da177e4SLinus Torvalds	mcr	p15, 0, r0, c7, c7		@ invalidate I,D caches on v4
3811da177e4SLinus Torvalds	mcr	p15, 0, r0, c7, c10, 4		@ drain write buffer on v4
382d090dddaSHyok S. Choi#ifdef CONFIG_MMU
3831da177e4SLinus Torvalds	mcr	p15, 0, r0, c8, c7		@ invalidate I,D TLBs on v4
384d090dddaSHyok S. Choi#endif
38522b19086SRussell King	adr	r5, arm922_crval
38622b19086SRussell King	ldmia	r5, {r5, r6}
3871da177e4SLinus Torvalds	mrc	p15, 0, r0, c1, c0		@ get control register v4
3881da177e4SLinus Torvalds	bic	r0, r0, r5
38922b19086SRussell King	orr	r0, r0, r6
3906ebbf2ceSRussell King	ret	lr
3911da177e4SLinus Torvalds	.size	__arm922_setup, . - __arm922_setup
3921da177e4SLinus Torvalds
3931da177e4SLinus Torvalds	/*
3941da177e4SLinus Torvalds	 *  R
3951da177e4SLinus Torvalds	 * .RVI ZFRS BLDP WCAM
3961da177e4SLinus Torvalds	 * ..11 0001 ..11 0101
3971da177e4SLinus Torvalds	 *
3981da177e4SLinus Torvalds	 */
39922b19086SRussell King	.type	arm922_crval, #object
40022b19086SRussell Kingarm922_crval:
40122b19086SRussell King	crval	clear=0x00003f3f, mmuset=0x00003135, ucset=0x00001130
4021da177e4SLinus Torvalds
4031da177e4SLinus Torvalds	__INITDATA
404f3e7383fSDave Martin	@ define struct processor (see <asm/proc-fns.h> and proc-macros.S)
405f3e7383fSDave Martin	define_processor_functions arm922, dabort=v4t_early_abort, pabort=legacy_pabort
4061da177e4SLinus Torvalds
4071da177e4SLinus Torvalds	.section ".rodata"
4081da177e4SLinus Torvalds
409f3e7383fSDave Martin	string	cpu_arch_name, "armv4t"
410f3e7383fSDave Martin	string	cpu_elf_name, "v4"
411f3e7383fSDave Martin	string	cpu_arm922_name, "ARM922T"
4121da177e4SLinus Torvalds
4131da177e4SLinus Torvalds	.align
4141da177e4SLinus Torvalds
415790756c7SNick Desaulniers	.section ".proc.info.init", "a"
4161da177e4SLinus Torvalds
4171da177e4SLinus Torvalds	.type	__arm922_proc_info,#object
4181da177e4SLinus Torvalds__arm922_proc_info:
4191da177e4SLinus Torvalds	.long	0x41009220
4201da177e4SLinus Torvalds	.long	0xff00fff0
4211da177e4SLinus Torvalds	.long   PMD_TYPE_SECT | \
4221da177e4SLinus Torvalds		PMD_SECT_BUFFERABLE | \
4231da177e4SLinus Torvalds		PMD_SECT_CACHEABLE | \
4241da177e4SLinus Torvalds		PMD_BIT4 | \
4251da177e4SLinus Torvalds		PMD_SECT_AP_WRITE | \
4261da177e4SLinus Torvalds		PMD_SECT_AP_READ
4278799ee9fSRussell King	.long   PMD_TYPE_SECT | \
4288799ee9fSRussell King		PMD_BIT4 | \
4298799ee9fSRussell King		PMD_SECT_AP_WRITE | \
4308799ee9fSRussell King		PMD_SECT_AP_READ
431bf35706fSArd Biesheuvel	initfn	__arm922_setup, __arm922_proc_info
4321da177e4SLinus Torvalds	.long	cpu_arch_name
4331da177e4SLinus Torvalds	.long	cpu_elf_name
4341da177e4SLinus Torvalds	.long	HWCAP_SWP | HWCAP_HALF | HWCAP_THUMB
4351da177e4SLinus Torvalds	.long	cpu_arm922_name
4361da177e4SLinus Torvalds	.long	arm922_processor_functions
4371da177e4SLinus Torvalds	.long	v4wbi_tlb_fns
4381da177e4SLinus Torvalds	.long	v4wb_user_fns
4391da177e4SLinus Torvalds#ifndef CONFIG_CPU_DCACHE_WRITETHROUGH
4401da177e4SLinus Torvalds	.long	arm922_cache_fns
4411da177e4SLinus Torvalds#else
4421da177e4SLinus Torvalds	.long	v4wt_cache_fns
4431da177e4SLinus Torvalds#endif
4441da177e4SLinus Torvalds	.size	__arm922_proc_info, . - __arm922_proc_info
445