xref: /freebsd/sys/arm/include/cpufunc.h (revision af3dc4a7ca7fdfbe1790f34b83024557a35d11f2)
16fc729afSOlivier Houchard /*	$NetBSD: cpufunc.h,v 1.29 2003/09/06 09:08:35 rearnsha Exp $	*/
26fc729afSOlivier Houchard 
3d8315c79SWarner Losh /*-
4*af3dc4a7SPedro F. Giffuni  * SPDX-License-Identifier: BSD-4-Clause
5*af3dc4a7SPedro F. Giffuni  *
66fc729afSOlivier Houchard  * Copyright (c) 1997 Mark Brinicombe.
76fc729afSOlivier Houchard  * Copyright (c) 1997 Causality Limited
86fc729afSOlivier Houchard  * All rights reserved.
96fc729afSOlivier Houchard  *
106fc729afSOlivier Houchard  * Redistribution and use in source and binary forms, with or without
116fc729afSOlivier Houchard  * modification, are permitted provided that the following conditions
126fc729afSOlivier Houchard  * are met:
136fc729afSOlivier Houchard  * 1. Redistributions of source code must retain the above copyright
146fc729afSOlivier Houchard  *    notice, this list of conditions and the following disclaimer.
156fc729afSOlivier Houchard  * 2. Redistributions in binary form must reproduce the above copyright
166fc729afSOlivier Houchard  *    notice, this list of conditions and the following disclaimer in the
176fc729afSOlivier Houchard  *    documentation and/or other materials provided with the distribution.
186fc729afSOlivier Houchard  * 3. All advertising materials mentioning features or use of this software
196fc729afSOlivier Houchard  *    must display the following acknowledgement:
206fc729afSOlivier Houchard  *	This product includes software developed by Causality Limited.
216fc729afSOlivier Houchard  * 4. The name of Causality Limited may not be used to endorse or promote
226fc729afSOlivier Houchard  *    products derived from this software without specific prior written
236fc729afSOlivier Houchard  *    permission.
246fc729afSOlivier Houchard  *
256fc729afSOlivier Houchard  * THIS SOFTWARE IS PROVIDED BY CAUSALITY LIMITED ``AS IS'' AND ANY EXPRESS
266fc729afSOlivier Houchard  * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
276fc729afSOlivier Houchard  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
286fc729afSOlivier Houchard  * DISCLAIMED. IN NO EVENT SHALL CAUSALITY LIMITED BE LIABLE FOR ANY DIRECT,
296fc729afSOlivier Houchard  * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
306fc729afSOlivier Houchard  * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
316fc729afSOlivier Houchard  * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
326fc729afSOlivier Houchard  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
336fc729afSOlivier Houchard  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
346fc729afSOlivier Houchard  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
356fc729afSOlivier Houchard  * SUCH DAMAGE.
366fc729afSOlivier Houchard  *
376fc729afSOlivier Houchard  * RiscBSD kernel project
386fc729afSOlivier Houchard  *
396fc729afSOlivier Houchard  * cpufunc.h
406fc729afSOlivier Houchard  *
416fc729afSOlivier Houchard  * Prototypes for cpu, mmu and tlb related functions.
426fc729afSOlivier Houchard  *
436fc729afSOlivier Houchard  * $FreeBSD$
446fc729afSOlivier Houchard  */
456fc729afSOlivier Houchard 
466fc729afSOlivier Houchard #ifndef _MACHINE_CPUFUNC_H_
476fc729afSOlivier Houchard #define _MACHINE_CPUFUNC_H_
486fc729afSOlivier Houchard 
496fc729afSOlivier Houchard #ifdef _KERNEL
506fc729afSOlivier Houchard 
516fc729afSOlivier Houchard #include <sys/types.h>
525fcbe89aSMichal Meloun #include <machine/armreg.h>
536fc729afSOlivier Houchard 
544628245bSOlivier Houchard static __inline void
554628245bSOlivier Houchard breakpoint(void)
564628245bSOlivier Houchard {
573488a2f7SOlivier Houchard 	__asm(".word      0xe7ffffff");
584628245bSOlivier Houchard }
59be687a0dSOlivier Houchard 
606fc729afSOlivier Houchard struct cpu_functions {
616fc729afSOlivier Houchard 
626fc729afSOlivier Houchard 	/* CPU functions */
63610d93d8SAndrew Turner #if __ARM_ARCH < 6
646fc729afSOlivier Houchard 	void	(*cf_cpwait)		(void);
656fc729afSOlivier Houchard 
666fc729afSOlivier Houchard 	/* MMU functions */
676fc729afSOlivier Houchard 
686fc729afSOlivier Houchard 	u_int	(*cf_control)		(u_int bic, u_int eor);
696fc729afSOlivier Houchard 	void	(*cf_setttb)		(u_int ttb);
706fc729afSOlivier Houchard 
716fc729afSOlivier Houchard 	/* TLB functions */
726fc729afSOlivier Houchard 
736fc729afSOlivier Houchard 	void	(*cf_tlb_flushID)	(void);
746fc729afSOlivier Houchard 	void	(*cf_tlb_flushID_SE)	(u_int va);
756fc729afSOlivier Houchard 	void	(*cf_tlb_flushD)	(void);
766fc729afSOlivier Houchard 	void	(*cf_tlb_flushD_SE)	(u_int va);
776fc729afSOlivier Houchard 
786fc729afSOlivier Houchard 	/*
796fc729afSOlivier Houchard 	 * Cache operations:
806fc729afSOlivier Houchard 	 *
816fc729afSOlivier Houchard 	 * We define the following primitives:
826fc729afSOlivier Houchard 	 *
836fc729afSOlivier Houchard 	 *	icache_sync_range	Synchronize I-cache range
846fc729afSOlivier Houchard 	 *
856fc729afSOlivier Houchard 	 *	dcache_wbinv_all	Write-back and Invalidate D-cache
866fc729afSOlivier Houchard 	 *	dcache_wbinv_range	Write-back and Invalidate D-cache range
876fc729afSOlivier Houchard 	 *	dcache_inv_range	Invalidate D-cache range
886fc729afSOlivier Houchard 	 *	dcache_wb_range		Write-back D-cache range
896fc729afSOlivier Houchard 	 *
906fc729afSOlivier Houchard 	 *	idcache_wbinv_all	Write-back and Invalidate D-cache,
916fc729afSOlivier Houchard 	 *				Invalidate I-cache
926fc729afSOlivier Houchard 	 *	idcache_wbinv_range	Write-back and Invalidate D-cache,
936fc729afSOlivier Houchard 	 *				Invalidate I-cache range
946fc729afSOlivier Houchard 	 *
956fc729afSOlivier Houchard 	 * Note that the ARM term for "write-back" is "clean".  We use
966fc729afSOlivier Houchard 	 * the term "write-back" since it's a more common way to describe
976fc729afSOlivier Houchard 	 * the operation.
986fc729afSOlivier Houchard 	 *
996fc729afSOlivier Houchard 	 * There are some rules that must be followed:
1006fc729afSOlivier Houchard 	 *
1014b7fcd31SIan Lepore 	 *	ID-cache Invalidate All:
1024b7fcd31SIan Lepore 	 *		Unlike other functions, this one must never write back.
1034b7fcd31SIan Lepore 	 *		It is used to intialize the MMU when it is in an unknown
1044b7fcd31SIan Lepore 	 *		state (such as when it may have lines tagged as valid
1054b7fcd31SIan Lepore 	 *		that belong to a previous set of mappings).
1064b7fcd31SIan Lepore 	 *
107d397c7a0SMichal Meloun 	 *	I-cache Sync range:
1086fc729afSOlivier Houchard 	 *		The goal is to synchronize the instruction stream,
1096fc729afSOlivier Houchard 	 *		so you may beed to write-back dirty D-cache blocks
1106fc729afSOlivier Houchard 	 *		first.  If a range is requested, and you can't
1116fc729afSOlivier Houchard 	 *		synchronize just a range, you have to hit the whole
1126fc729afSOlivier Houchard 	 *		thing.
1136fc729afSOlivier Houchard 	 *
1146fc729afSOlivier Houchard 	 *	D-cache Write-Back and Invalidate range:
1156fc729afSOlivier Houchard 	 *		If you can't WB-Inv a range, you must WB-Inv the
1166fc729afSOlivier Houchard 	 *		entire D-cache.
1176fc729afSOlivier Houchard 	 *
1186fc729afSOlivier Houchard 	 *	D-cache Invalidate:
1196fc729afSOlivier Houchard 	 *		If you can't Inv the D-cache, you must Write-Back
1206fc729afSOlivier Houchard 	 *		and Invalidate.  Code that uses this operation
1216fc729afSOlivier Houchard 	 *		MUST NOT assume that the D-cache will not be written
1226fc729afSOlivier Houchard 	 *		back to memory.
1236fc729afSOlivier Houchard 	 *
1246fc729afSOlivier Houchard 	 *	D-cache Write-Back:
1256fc729afSOlivier Houchard 	 *		If you can't Write-back without doing an Inv,
1266fc729afSOlivier Houchard 	 *		that's fine.  Then treat this as a WB-Inv.
1276fc729afSOlivier Houchard 	 *		Skipping the invalidate is merely an optimization.
1286fc729afSOlivier Houchard 	 *
1296fc729afSOlivier Houchard 	 *	All operations:
1306fc729afSOlivier Houchard 	 *		Valid virtual addresses must be passed to each
1316fc729afSOlivier Houchard 	 *		cache operation.
1326fc729afSOlivier Houchard 	 */
1336fc729afSOlivier Houchard 	void	(*cf_icache_sync_range)	(vm_offset_t, vm_size_t);
1346fc729afSOlivier Houchard 
1356fc729afSOlivier Houchard 	void	(*cf_dcache_wbinv_all)	(void);
1366fc729afSOlivier Houchard 	void	(*cf_dcache_wbinv_range) (vm_offset_t, vm_size_t);
1376fc729afSOlivier Houchard 	void	(*cf_dcache_inv_range)	(vm_offset_t, vm_size_t);
1386fc729afSOlivier Houchard 	void	(*cf_dcache_wb_range)	(vm_offset_t, vm_size_t);
1396fc729afSOlivier Houchard 
1404b7fcd31SIan Lepore 	void	(*cf_idcache_inv_all)	(void);
1416fc729afSOlivier Houchard 	void	(*cf_idcache_wbinv_all)	(void);
1426fc729afSOlivier Houchard 	void	(*cf_idcache_wbinv_range) (vm_offset_t, vm_size_t);
143610d93d8SAndrew Turner #endif
144425b5be3SOlivier Houchard 	void	(*cf_l2cache_wbinv_all) (void);
145425b5be3SOlivier Houchard 	void	(*cf_l2cache_wbinv_range) (vm_offset_t, vm_size_t);
146425b5be3SOlivier Houchard 	void	(*cf_l2cache_inv_range)	  (vm_offset_t, vm_size_t);
147425b5be3SOlivier Houchard 	void	(*cf_l2cache_wb_range)	  (vm_offset_t, vm_size_t);
148b07d0cbcSIan Lepore 	void	(*cf_l2cache_drain_writebuf)	  (void);
1496fc729afSOlivier Houchard 
1506fc729afSOlivier Houchard 	/* Other functions */
1516fc729afSOlivier Houchard 
1529567accaSMichal Meloun #if __ARM_ARCH < 6
1536fc729afSOlivier Houchard 	void	(*cf_drain_writebuf)	(void);
1549567accaSMichal Meloun #endif
1556fc729afSOlivier Houchard 
1566fc729afSOlivier Houchard 	void	(*cf_sleep)		(int mode);
1576fc729afSOlivier Houchard 
158610d93d8SAndrew Turner #if __ARM_ARCH < 6
1596fc729afSOlivier Houchard 	/* Soft functions */
1606fc729afSOlivier Houchard 
1616fc729afSOlivier Houchard 	void	(*cf_context_switch)	(void);
162610d93d8SAndrew Turner #endif
1636fc729afSOlivier Houchard 
1649a25f3e8SAndrew Turner 	void	(*cf_setup)		(void);
1656fc729afSOlivier Houchard };
1666fc729afSOlivier Houchard 
1676fc729afSOlivier Houchard extern struct cpu_functions cpufuncs;
1686fc729afSOlivier Houchard extern u_int cputype;
1696fc729afSOlivier Houchard 
170a89156f5SMichal Meloun #if __ARM_ARCH < 6
1716fc729afSOlivier Houchard #define	cpu_cpwait()		cpufuncs.cf_cpwait()
1726fc729afSOlivier Houchard 
1736fc729afSOlivier Houchard #define cpu_control(c, e)	cpufuncs.cf_control(c, e)
1746fc729afSOlivier Houchard #define cpu_setttb(t)		cpufuncs.cf_setttb(t)
1756fc729afSOlivier Houchard 
1766fc729afSOlivier Houchard #define	cpu_tlb_flushID()	cpufuncs.cf_tlb_flushID()
1776fc729afSOlivier Houchard #define	cpu_tlb_flushID_SE(e)	cpufuncs.cf_tlb_flushID_SE(e)
1786fc729afSOlivier Houchard #define	cpu_tlb_flushD()	cpufuncs.cf_tlb_flushD()
1796fc729afSOlivier Houchard #define	cpu_tlb_flushD_SE(e)	cpufuncs.cf_tlb_flushD_SE(e)
1806fc729afSOlivier Houchard 
1816fc729afSOlivier Houchard #define	cpu_icache_sync_range(a, s) cpufuncs.cf_icache_sync_range((a), (s))
1826fc729afSOlivier Houchard 
1836fc729afSOlivier Houchard #define	cpu_dcache_wbinv_all()	cpufuncs.cf_dcache_wbinv_all()
1846fc729afSOlivier Houchard #define	cpu_dcache_wbinv_range(a, s) cpufuncs.cf_dcache_wbinv_range((a), (s))
1856fc729afSOlivier Houchard #define	cpu_dcache_inv_range(a, s) cpufuncs.cf_dcache_inv_range((a), (s))
1866fc729afSOlivier Houchard #define	cpu_dcache_wb_range(a, s) cpufuncs.cf_dcache_wb_range((a), (s))
1876fc729afSOlivier Houchard 
1884b7fcd31SIan Lepore #define	cpu_idcache_inv_all()	cpufuncs.cf_idcache_inv_all()
1896fc729afSOlivier Houchard #define	cpu_idcache_wbinv_all()	cpufuncs.cf_idcache_wbinv_all()
1906fc729afSOlivier Houchard #define	cpu_idcache_wbinv_range(a, s) cpufuncs.cf_idcache_wbinv_range((a), (s))
191a89156f5SMichal Meloun #endif
192c5bf621bSAndrew Turner 
193425b5be3SOlivier Houchard #define cpu_l2cache_wbinv_all()	cpufuncs.cf_l2cache_wbinv_all()
194425b5be3SOlivier Houchard #define cpu_l2cache_wb_range(a, s) cpufuncs.cf_l2cache_wb_range((a), (s))
195425b5be3SOlivier Houchard #define cpu_l2cache_inv_range(a, s) cpufuncs.cf_l2cache_inv_range((a), (s))
196425b5be3SOlivier Houchard #define cpu_l2cache_wbinv_range(a, s) cpufuncs.cf_l2cache_wbinv_range((a), (s))
197b07d0cbcSIan Lepore #define cpu_l2cache_drain_writebuf() cpufuncs.cf_l2cache_drain_writebuf()
1986fc729afSOlivier Houchard 
199a89156f5SMichal Meloun #if __ARM_ARCH < 6
2006fc729afSOlivier Houchard #define	cpu_drain_writebuf()	cpufuncs.cf_drain_writebuf()
201a89156f5SMichal Meloun #endif
2026fc729afSOlivier Houchard #define cpu_sleep(m)		cpufuncs.cf_sleep(m)
2036fc729afSOlivier Houchard 
2049a25f3e8SAndrew Turner #define cpu_setup()			cpufuncs.cf_setup()
2056fc729afSOlivier Houchard 
2066fc729afSOlivier Houchard int	set_cpufuncs		(void);
2076fc729afSOlivier Houchard #define ARCHITECTURE_NOT_PRESENT	1	/* known but not configured */
2086fc729afSOlivier Houchard #define ARCHITECTURE_NOT_SUPPORTED	2	/* not known */
2096fc729afSOlivier Houchard 
2106fc729afSOlivier Houchard void	cpufunc_nullop		(void);
211bf488b9dSMichal Meloun u_int	cpu_ident		(void);
2126fc729afSOlivier Houchard u_int	cpufunc_control		(u_int clear, u_int bic);
213bf488b9dSMichal Meloun void	cpu_domains		(u_int domains);
214bf488b9dSMichal Meloun u_int	cpu_faultstatus		(void);
215bf488b9dSMichal Meloun u_int	cpu_faultaddress	(void);
2160b5afe4aSMichal Meloun u_int	cpu_get_control		(void);
217cf1a573fSOleksandr Tymoshenko u_int	cpu_pfr			(int);
2186fc729afSOlivier Houchard 
219303c8079SAndrew Turner #if defined(CPU_FA526)
2209a25f3e8SAndrew Turner void	fa526_setup		(void);
221381a19ccSRui Paulo void	fa526_setttb		(u_int ttb);
222381a19ccSRui Paulo void	fa526_context_switch	(void);
223381a19ccSRui Paulo void	fa526_cpu_sleep		(int);
224381a19ccSRui Paulo void	fa526_tlb_flushID_SE	(u_int);
225381a19ccSRui Paulo 
226381a19ccSRui Paulo void	fa526_icache_sync_range(vm_offset_t start, vm_size_t end);
227381a19ccSRui Paulo void	fa526_dcache_wbinv_all	(void);
228381a19ccSRui Paulo void	fa526_dcache_wbinv_range(vm_offset_t start, vm_size_t end);
229381a19ccSRui Paulo void	fa526_dcache_inv_range	(vm_offset_t start, vm_size_t end);
230381a19ccSRui Paulo void	fa526_dcache_wb_range	(vm_offset_t start, vm_size_t end);
231381a19ccSRui Paulo void	fa526_idcache_wbinv_all(void);
232381a19ccSRui Paulo void	fa526_idcache_wbinv_range(vm_offset_t start, vm_size_t end);
233381a19ccSRui Paulo #endif
234381a19ccSRui Paulo 
235381a19ccSRui Paulo 
236e3f95afdSMichal Meloun #if defined(CPU_ARM9) || defined(CPU_ARM9E)
2376fc729afSOlivier Houchard void	arm9_setttb		(u_int);
2386fc729afSOlivier Houchard void	arm9_tlb_flushID_SE	(u_int va);
239e3f95afdSMichal Meloun void	arm9_context_switch	(void);
240e3f95afdSMichal Meloun #endif
2416fc729afSOlivier Houchard 
242e3f95afdSMichal Meloun #if defined(CPU_ARM9)
2434eaa43e6SKevin Lo void	arm9_icache_sync_range	(vm_offset_t, vm_size_t);
2446fc729afSOlivier Houchard 
2454eaa43e6SKevin Lo void	arm9_dcache_wbinv_all	(void);
2464eaa43e6SKevin Lo void	arm9_dcache_wbinv_range (vm_offset_t, vm_size_t);
2474eaa43e6SKevin Lo void	arm9_dcache_inv_range	(vm_offset_t, vm_size_t);
2484eaa43e6SKevin Lo void	arm9_dcache_wb_range	(vm_offset_t, vm_size_t);
2496fc729afSOlivier Houchard 
2504eaa43e6SKevin Lo void	arm9_idcache_wbinv_all	(void);
2514eaa43e6SKevin Lo void	arm9_idcache_wbinv_range (vm_offset_t, vm_size_t);
2526fc729afSOlivier Houchard 
2539a25f3e8SAndrew Turner void	arm9_setup		(void);
254094df973SOlivier Houchard 
255094df973SOlivier Houchard extern unsigned arm9_dcache_sets_max;
256094df973SOlivier Houchard extern unsigned arm9_dcache_sets_inc;
257094df973SOlivier Houchard extern unsigned arm9_dcache_index_max;
258094df973SOlivier Houchard extern unsigned arm9_dcache_index_inc;
2596fc729afSOlivier Houchard #endif
2606fc729afSOlivier Houchard 
2617a959e49SAndrew Turner #if defined(CPU_ARM9E)
2629a25f3e8SAndrew Turner void	arm10_setup		(void);
2636fc729afSOlivier Houchard 
2641ee5b3b4SRafal Jaworowski u_int	sheeva_control_ext 		(u_int, u_int);
265cfa892b5SAlexander Motin void	sheeva_cpu_sleep		(int);
2661ee5b3b4SRafal Jaworowski void	sheeva_setttb			(u_int);
2671ee5b3b4SRafal Jaworowski void	sheeva_dcache_wbinv_range	(vm_offset_t, vm_size_t);
2681ee5b3b4SRafal Jaworowski void	sheeva_dcache_inv_range		(vm_offset_t, vm_size_t);
2691ee5b3b4SRafal Jaworowski void	sheeva_dcache_wb_range		(vm_offset_t, vm_size_t);
2701ee5b3b4SRafal Jaworowski void	sheeva_idcache_wbinv_range	(vm_offset_t, vm_size_t);
271ba6faad6SRafal Jaworowski 
2721ee5b3b4SRafal Jaworowski void	sheeva_l2cache_wbinv_range	(vm_offset_t, vm_size_t);
2731ee5b3b4SRafal Jaworowski void	sheeva_l2cache_inv_range	(vm_offset_t, vm_size_t);
2741ee5b3b4SRafal Jaworowski void	sheeva_l2cache_wb_range		(vm_offset_t, vm_size_t);
2751ee5b3b4SRafal Jaworowski void	sheeva_l2cache_wbinv_all	(void);
2766fc729afSOlivier Houchard #endif
2776fc729afSOlivier Houchard 
27865328620SAndrew Turner #if defined(CPU_MV_PJ4B)
279cf1a573fSOleksandr Tymoshenko void	armv6_idcache_wbinv_all		(void);
28065328620SAndrew Turner #endif
28193a065e7SMichal Meloun #if defined(CPU_CORTEXA) || defined(CPU_MV_PJ4B) || defined(CPU_KRAIT)
282cf1a573fSOleksandr Tymoshenko void	armv7_idcache_wbinv_all		(void);
283cf1a573fSOleksandr Tymoshenko void	armv7_cpu_sleep			(int);
2849a25f3e8SAndrew Turner void	armv7_setup			(void);
285cf1a573fSOleksandr Tymoshenko void	armv7_drain_writebuf		(void);
286cf1a573fSOleksandr Tymoshenko 
2879a25f3e8SAndrew Turner void 	cortexa_setup			(void);
28863b25978SWarner Losh #endif
28937b25ee6SAndrew Turner #if defined(CPU_MV_PJ4B)
29037b25ee6SAndrew Turner void	pj4b_config			(void);
29137b25ee6SAndrew Turner void	pj4bv7_setup			(void);
29237b25ee6SAndrew Turner #endif
29363b25978SWarner Losh 
294930798f3SAndrew Turner #if defined(CPU_ARM1176)
29565328620SAndrew Turner void	arm11_drain_writebuf	(void);
29665328620SAndrew Turner 
2979a25f3e8SAndrew Turner void    arm11x6_setup                   (void);
298c5f8f894SOleksandr Tymoshenko void    arm11x6_sleep                   (int);  /* no ref. for errata */
299c5f8f894SOleksandr Tymoshenko #endif
300c5f8f894SOleksandr Tymoshenko 
3017a959e49SAndrew Turner #if defined(CPU_ARM9E)
30263b25978SWarner Losh void	armv5_ec_setttb(u_int);
30363b25978SWarner Losh 
30463b25978SWarner Losh void	armv5_ec_icache_sync_range(vm_offset_t, vm_size_t);
30563b25978SWarner Losh 
30663b25978SWarner Losh void	armv5_ec_dcache_wbinv_all(void);
30763b25978SWarner Losh void	armv5_ec_dcache_wbinv_range(vm_offset_t, vm_size_t);
30863b25978SWarner Losh void	armv5_ec_dcache_inv_range(vm_offset_t, vm_size_t);
30963b25978SWarner Losh void	armv5_ec_dcache_wb_range(vm_offset_t, vm_size_t);
31063b25978SWarner Losh 
31163b25978SWarner Losh void	armv5_ec_idcache_wbinv_all(void);
31263b25978SWarner Losh void	armv5_ec_idcache_wbinv_range(vm_offset_t, vm_size_t);
31363b25978SWarner Losh #endif
31463b25978SWarner Losh 
3157a959e49SAndrew Turner #if defined(CPU_ARM9) || defined(CPU_ARM9E) ||				\
316303c8079SAndrew Turner   defined(CPU_FA526) ||							\
31711d1528cSOlivier Houchard   defined(CPU_XSCALE_PXA2X0) || defined(CPU_XSCALE_IXP425) ||		\
318afdcfee4SMichal Meloun   defined(CPU_XSCALE_81342)
3196fc729afSOlivier Houchard 
3206fc729afSOlivier Houchard void	armv4_tlb_flushID	(void);
3216fc729afSOlivier Houchard void	armv4_tlb_flushD	(void);
3226fc729afSOlivier Houchard void	armv4_tlb_flushD_SE	(u_int va);
3236fc729afSOlivier Houchard 
3246fc729afSOlivier Houchard void	armv4_drain_writebuf	(void);
3254b7fcd31SIan Lepore void	armv4_idcache_inv_all	(void);
3266fc729afSOlivier Houchard #endif
3276fc729afSOlivier Houchard 
328afdcfee4SMichal Meloun #if defined(CPU_XSCALE_PXA2X0) || defined(CPU_XSCALE_IXP425) ||		\
329afdcfee4SMichal Meloun   defined(CPU_XSCALE_81342)
3306fc729afSOlivier Houchard void	xscale_cpwait		(void);
3316fc729afSOlivier Houchard 
3326fc729afSOlivier Houchard void	xscale_cpu_sleep	(int mode);
3336fc729afSOlivier Houchard 
3346fc729afSOlivier Houchard u_int	xscale_control		(u_int clear, u_int bic);
3356fc729afSOlivier Houchard 
3366fc729afSOlivier Houchard void	xscale_setttb		(u_int ttb);
3376fc729afSOlivier Houchard 
3386fc729afSOlivier Houchard void	xscale_tlb_flushID_SE	(u_int va);
3396fc729afSOlivier Houchard 
3406fc729afSOlivier Houchard void	xscale_cache_flushID	(void);
3416fc729afSOlivier Houchard void	xscale_cache_flushI	(void);
3426fc729afSOlivier Houchard void	xscale_cache_flushD	(void);
3436fc729afSOlivier Houchard void	xscale_cache_flushD_SE	(u_int entry);
3446fc729afSOlivier Houchard 
3456fc729afSOlivier Houchard void	xscale_cache_cleanID	(void);
3466fc729afSOlivier Houchard void	xscale_cache_cleanD	(void);
3476fc729afSOlivier Houchard void	xscale_cache_cleanD_E	(u_int entry);
3486fc729afSOlivier Houchard 
3496fc729afSOlivier Houchard void	xscale_cache_clean_minidata (void);
3506fc729afSOlivier Houchard 
3516fc729afSOlivier Houchard void	xscale_cache_purgeID	(void);
3526fc729afSOlivier Houchard void	xscale_cache_purgeID_E	(u_int entry);
3536fc729afSOlivier Houchard void	xscale_cache_purgeD	(void);
3546fc729afSOlivier Houchard void	xscale_cache_purgeD_E	(u_int entry);
3556fc729afSOlivier Houchard 
3566fc729afSOlivier Houchard void	xscale_cache_syncI	(void);
3576fc729afSOlivier Houchard void	xscale_cache_cleanID_rng (vm_offset_t start, vm_size_t end);
3586fc729afSOlivier Houchard void	xscale_cache_cleanD_rng	(vm_offset_t start, vm_size_t end);
3596fc729afSOlivier Houchard void	xscale_cache_purgeID_rng (vm_offset_t start, vm_size_t end);
3606fc729afSOlivier Houchard void	xscale_cache_purgeD_rng	(vm_offset_t start, vm_size_t end);
3616fc729afSOlivier Houchard void	xscale_cache_syncI_rng	(vm_offset_t start, vm_size_t end);
3626fc729afSOlivier Houchard void	xscale_cache_flushD_rng	(vm_offset_t start, vm_size_t end);
3636fc729afSOlivier Houchard 
3646fc729afSOlivier Houchard void	xscale_context_switch	(void);
3656fc729afSOlivier Houchard 
3669a25f3e8SAndrew Turner void	xscale_setup		(void);
367afdcfee4SMichal Meloun #endif	/* CPU_XSCALE_PXA2X0 || CPU_XSCALE_IXP425 */
3686fc729afSOlivier Houchard 
369676b1fbdSOlivier Houchard #ifdef	CPU_XSCALE_81342
370676b1fbdSOlivier Houchard 
371425b5be3SOlivier Houchard void	xscalec3_l2cache_purge	(void);
372425b5be3SOlivier Houchard void	xscalec3_cache_purgeID	(void);
373425b5be3SOlivier Houchard void	xscalec3_cache_purgeD	(void);
374676b1fbdSOlivier Houchard void	xscalec3_cache_cleanID	(void);
375676b1fbdSOlivier Houchard void	xscalec3_cache_cleanD	(void);
376676b1fbdSOlivier Houchard void	xscalec3_cache_syncI	(void);
377425b5be3SOlivier Houchard 
378676b1fbdSOlivier Houchard void	xscalec3_cache_purgeID_rng 	(vm_offset_t start, vm_size_t end);
379676b1fbdSOlivier Houchard void	xscalec3_cache_purgeD_rng	(vm_offset_t start, vm_size_t end);
380425b5be3SOlivier Houchard void	xscalec3_cache_cleanID_rng	(vm_offset_t start, vm_size_t end);
381425b5be3SOlivier Houchard void	xscalec3_cache_cleanD_rng	(vm_offset_t start, vm_size_t end);
382425b5be3SOlivier Houchard void	xscalec3_cache_syncI_rng	(vm_offset_t start, vm_size_t end);
383425b5be3SOlivier Houchard 
384425b5be3SOlivier Houchard void	xscalec3_l2cache_flush_rng	(vm_offset_t, vm_size_t);
385425b5be3SOlivier Houchard void	xscalec3_l2cache_clean_rng	(vm_offset_t start, vm_size_t end);
386425b5be3SOlivier Houchard void	xscalec3_l2cache_purge_rng	(vm_offset_t start, vm_size_t end);
387676b1fbdSOlivier Houchard 
388676b1fbdSOlivier Houchard 
389676b1fbdSOlivier Houchard void	xscalec3_setttb		(u_int ttb);
390676b1fbdSOlivier Houchard void	xscalec3_context_switch	(void);
391676b1fbdSOlivier Houchard 
392676b1fbdSOlivier Houchard #endif /* CPU_XSCALE_81342 */
393676b1fbdSOlivier Houchard 
3946fc729afSOlivier Houchard /*
3956fc729afSOlivier Houchard  * Macros for manipulating CPU interrupts
3966fc729afSOlivier Houchard  */
3975fcbe89aSMichal Meloun #if __ARM_ARCH < 6
3985fcbe89aSMichal Meloun #define	__ARM_INTR_BITS		(PSR_I | PSR_F)
3995fcbe89aSMichal Meloun #else
4005fcbe89aSMichal Meloun #define	__ARM_INTR_BITS		(PSR_I | PSR_F | PSR_A)
4015fcbe89aSMichal Meloun #endif
4026fc729afSOlivier Houchard 
4035fcbe89aSMichal Meloun static __inline uint32_t
4045fcbe89aSMichal Meloun __set_cpsr(uint32_t bic, uint32_t eor)
4056fc729afSOlivier Houchard {
4065fcbe89aSMichal Meloun 	uint32_t	tmp, ret;
4076fc729afSOlivier Houchard 
4086fc729afSOlivier Houchard 	__asm __volatile(
4096fc729afSOlivier Houchard 		"mrs     %0, cpsr\n"		/* Get the CPSR */
4106fc729afSOlivier Houchard 		"bic	 %1, %0, %2\n"		/* Clear bits */
4116fc729afSOlivier Houchard 		"eor	 %1, %1, %3\n"		/* XOR bits */
4125fcbe89aSMichal Meloun 		"msr     cpsr_xc, %1\n"		/* Set the CPSR */
4136fc729afSOlivier Houchard 	: "=&r" (ret), "=&r" (tmp)
41424e01b0cSOlivier Houchard 	: "r" (bic), "r" (eor) : "memory");
4156fc729afSOlivier Houchard 
4166fc729afSOlivier Houchard 	return ret;
4176fc729afSOlivier Houchard }
4186fc729afSOlivier Houchard 
4195fcbe89aSMichal Meloun static __inline uint32_t
4205fcbe89aSMichal Meloun disable_interrupts(uint32_t mask)
4215fcbe89aSMichal Meloun {
422dfad9244SMarcel Moolenaar 
4235fcbe89aSMichal Meloun 	return (__set_cpsr(mask & __ARM_INTR_BITS, mask & __ARM_INTR_BITS));
4245fcbe89aSMichal Meloun }
4256fc729afSOlivier Houchard 
4265fcbe89aSMichal Meloun static __inline uint32_t
4275fcbe89aSMichal Meloun enable_interrupts(uint32_t mask)
4285fcbe89aSMichal Meloun {
4296fc729afSOlivier Houchard 
4305fcbe89aSMichal Meloun 	return (__set_cpsr(mask & __ARM_INTR_BITS, 0));
4315fcbe89aSMichal Meloun }
4325fcbe89aSMichal Meloun 
4335fcbe89aSMichal Meloun static __inline uint32_t
4345fcbe89aSMichal Meloun restore_interrupts(uint32_t old_cpsr)
4355fcbe89aSMichal Meloun {
4365fcbe89aSMichal Meloun 
4375fcbe89aSMichal Meloun 	return (__set_cpsr(__ARM_INTR_BITS, old_cpsr & __ARM_INTR_BITS));
4385fcbe89aSMichal Meloun }
4396fc729afSOlivier Houchard 
440dfad9244SMarcel Moolenaar static __inline register_t
441dfad9244SMarcel Moolenaar intr_disable(void)
442dfad9244SMarcel Moolenaar {
443dfad9244SMarcel Moolenaar 
4445fcbe89aSMichal Meloun 	return (disable_interrupts(PSR_I | PSR_F));
445dfad9244SMarcel Moolenaar }
446dfad9244SMarcel Moolenaar 
447dfad9244SMarcel Moolenaar static __inline void
448dfad9244SMarcel Moolenaar intr_restore(register_t s)
449dfad9244SMarcel Moolenaar {
450dfad9244SMarcel Moolenaar 
451dfad9244SMarcel Moolenaar 	restore_interrupts(s);
452dfad9244SMarcel Moolenaar }
4535fcbe89aSMichal Meloun #undef __ARM_INTR_BITS
4546fc729afSOlivier Houchard 
4556fc729afSOlivier Houchard /*
4566fc729afSOlivier Houchard  * Functions to manipulate cpu r13
4576fc729afSOlivier Houchard  * (in arm/arm32/setstack.S)
4586fc729afSOlivier Houchard  */
4596fc729afSOlivier Houchard 
4604eaa43e6SKevin Lo void set_stackptr	(u_int mode, u_int address);
4614eaa43e6SKevin Lo u_int get_stackptr	(u_int mode);
4626fc729afSOlivier Houchard 
4636fc729afSOlivier Houchard /*
4646fc729afSOlivier Houchard  * Miscellany
4656fc729afSOlivier Houchard  */
4666fc729afSOlivier Houchard 
4674eaa43e6SKevin Lo int get_pc_str_offset	(void);
4686fc729afSOlivier Houchard 
4696fc729afSOlivier Houchard /*
4706fc729afSOlivier Houchard  * CPU functions from locore.S
4716fc729afSOlivier Houchard  */
4726fc729afSOlivier Houchard 
4734eaa43e6SKevin Lo void cpu_reset		(void) __attribute__((__noreturn__));
4746fc729afSOlivier Houchard 
4756fc729afSOlivier Houchard /*
4766fc729afSOlivier Houchard  * Cache info variables.
4776fc729afSOlivier Houchard  */
4786fc729afSOlivier Houchard 
4796fc729afSOlivier Houchard /* PRIMARY CACHE VARIABLES */
4806fc729afSOlivier Houchard extern int	arm_picache_size;
4816fc729afSOlivier Houchard extern int	arm_picache_line_size;
4826fc729afSOlivier Houchard extern int	arm_picache_ways;
4836fc729afSOlivier Houchard 
4846fc729afSOlivier Houchard extern int	arm_pdcache_size;	/* and unified */
4856fc729afSOlivier Houchard extern int	arm_pdcache_line_size;
4866fc729afSOlivier Houchard extern int	arm_pdcache_ways;
4876fc729afSOlivier Houchard 
4886fc729afSOlivier Houchard extern int	arm_pcache_type;
4896fc729afSOlivier Houchard extern int	arm_pcache_unified;
4906fc729afSOlivier Houchard 
4916fc729afSOlivier Houchard extern int	arm_dcache_align;
4926fc729afSOlivier Houchard extern int	arm_dcache_align_mask;
4936fc729afSOlivier Houchard 
494cf1a573fSOleksandr Tymoshenko extern u_int	arm_cache_level;
495cf1a573fSOleksandr Tymoshenko extern u_int	arm_cache_loc;
496cf1a573fSOleksandr Tymoshenko extern u_int	arm_cache_type[14];
497cf1a573fSOleksandr Tymoshenko 
4986fc729afSOlivier Houchard #endif	/* _KERNEL */
4996fc729afSOlivier Houchard #endif	/* _MACHINE_CPUFUNC_H_ */
5006fc729afSOlivier Houchard 
5016fc729afSOlivier Houchard /* End of cpufunc.h */
502