cpufunc.h revision 295149
1129198Scognet/*	$NetBSD: cpufunc.h,v 1.29 2003/09/06 09:08:35 rearnsha Exp $	*/
2129198Scognet
3139735Simp/*-
4129198Scognet * Copyright (c) 1997 Mark Brinicombe.
5129198Scognet * Copyright (c) 1997 Causality Limited
6129198Scognet * All rights reserved.
7129198Scognet *
8129198Scognet * Redistribution and use in source and binary forms, with or without
9129198Scognet * modification, are permitted provided that the following conditions
10129198Scognet * are met:
11129198Scognet * 1. Redistributions of source code must retain the above copyright
12129198Scognet *    notice, this list of conditions and the following disclaimer.
13129198Scognet * 2. Redistributions in binary form must reproduce the above copyright
14129198Scognet *    notice, this list of conditions and the following disclaimer in the
15129198Scognet *    documentation and/or other materials provided with the distribution.
16129198Scognet * 3. All advertising materials mentioning features or use of this software
17129198Scognet *    must display the following acknowledgement:
18129198Scognet *	This product includes software developed by Causality Limited.
19129198Scognet * 4. The name of Causality Limited may not be used to endorse or promote
20129198Scognet *    products derived from this software without specific prior written
21129198Scognet *    permission.
22129198Scognet *
23129198Scognet * THIS SOFTWARE IS PROVIDED BY CAUSALITY LIMITED ``AS IS'' AND ANY EXPRESS
24129198Scognet * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
25129198Scognet * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
26129198Scognet * DISCLAIMED. IN NO EVENT SHALL CAUSALITY LIMITED BE LIABLE FOR ANY DIRECT,
27129198Scognet * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
28129198Scognet * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
29129198Scognet * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
30129198Scognet * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
31129198Scognet * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
32129198Scognet * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
33129198Scognet * SUCH DAMAGE.
34129198Scognet *
35129198Scognet * RiscBSD kernel project
36129198Scognet *
37129198Scognet * cpufunc.h
38129198Scognet *
39129198Scognet * Prototypes for cpu, mmu and tlb related functions.
40129198Scognet *
41129198Scognet * $FreeBSD: head/sys/arm/include/cpufunc.h 295149 2016-02-02 14:53:34Z mmel $
42129198Scognet */
43129198Scognet
44129198Scognet#ifndef _MACHINE_CPUFUNC_H_
45129198Scognet#define _MACHINE_CPUFUNC_H_
46129198Scognet
47129198Scognet#ifdef _KERNEL
48129198Scognet
49129198Scognet#include <sys/types.h>
50290661Smmel#include <machine/armreg.h>
51129198Scognet#include <machine/cpuconf.h>
52129198Scognet
53132055Scognetstatic __inline void
54132055Scognetbreakpoint(void)
55132055Scognet{
56137940Scognet	__asm(".word      0xe7ffffff");
57132055Scognet}
58132471Scognet
59129198Scognetstruct cpu_functions {
60129198Scognet
61129198Scognet	/* CPU functions */
62290648Smmel
63129198Scognet	void	(*cf_cpwait)		(void);
64129198Scognet
65129198Scognet	/* MMU functions */
66129198Scognet
67129198Scognet	u_int	(*cf_control)		(u_int bic, u_int eor);
68129198Scognet	void	(*cf_setttb)		(u_int ttb);
69129198Scognet
70129198Scognet	/* TLB functions */
71129198Scognet
72290648Smmel	void	(*cf_tlb_flushID)	(void);
73290648Smmel	void	(*cf_tlb_flushID_SE)	(u_int va);
74129198Scognet	void	(*cf_tlb_flushD)	(void);
75290648Smmel	void	(*cf_tlb_flushD_SE)	(u_int va);
76129198Scognet
77129198Scognet	/*
78129198Scognet	 * Cache operations:
79129198Scognet	 *
80129198Scognet	 * We define the following primitives:
81129198Scognet	 *
82129198Scognet	 *	icache_sync_all		Synchronize I-cache
83129198Scognet	 *	icache_sync_range	Synchronize I-cache range
84129198Scognet	 *
85129198Scognet	 *	dcache_wbinv_all	Write-back and Invalidate D-cache
86129198Scognet	 *	dcache_wbinv_range	Write-back and Invalidate D-cache range
87129198Scognet	 *	dcache_inv_range	Invalidate D-cache range
88129198Scognet	 *	dcache_wb_range		Write-back D-cache range
89129198Scognet	 *
90129198Scognet	 *	idcache_wbinv_all	Write-back and Invalidate D-cache,
91129198Scognet	 *				Invalidate I-cache
92129198Scognet	 *	idcache_wbinv_range	Write-back and Invalidate D-cache,
93129198Scognet	 *				Invalidate I-cache range
94129198Scognet	 *
95129198Scognet	 * Note that the ARM term for "write-back" is "clean".  We use
96129198Scognet	 * the term "write-back" since it's a more common way to describe
97129198Scognet	 * the operation.
98129198Scognet	 *
99129198Scognet	 * There are some rules that must be followed:
100129198Scognet	 *
101262420Sian	 *	ID-cache Invalidate All:
102262420Sian	 *		Unlike other functions, this one must never write back.
103262420Sian	 *		It is used to intialize the MMU when it is in an unknown
104262420Sian	 *		state (such as when it may have lines tagged as valid
105262420Sian	 *		that belong to a previous set of mappings).
106290648Smmel	 *
107129198Scognet	 *	I-cache Synch (all or range):
108129198Scognet	 *		The goal is to synchronize the instruction stream,
109129198Scognet	 *		so you may beed to write-back dirty D-cache blocks
110129198Scognet	 *		first.  If a range is requested, and you can't
111129198Scognet	 *		synchronize just a range, you have to hit the whole
112129198Scognet	 *		thing.
113129198Scognet	 *
114129198Scognet	 *	D-cache Write-Back and Invalidate range:
115129198Scognet	 *		If you can't WB-Inv a range, you must WB-Inv the
116129198Scognet	 *		entire D-cache.
117129198Scognet	 *
118129198Scognet	 *	D-cache Invalidate:
119129198Scognet	 *		If you can't Inv the D-cache, you must Write-Back
120129198Scognet	 *		and Invalidate.  Code that uses this operation
121129198Scognet	 *		MUST NOT assume that the D-cache will not be written
122129198Scognet	 *		back to memory.
123129198Scognet	 *
124129198Scognet	 *	D-cache Write-Back:
125129198Scognet	 *		If you can't Write-back without doing an Inv,
126129198Scognet	 *		that's fine.  Then treat this as a WB-Inv.
127129198Scognet	 *		Skipping the invalidate is merely an optimization.
128129198Scognet	 *
129129198Scognet	 *	All operations:
130129198Scognet	 *		Valid virtual addresses must be passed to each
131129198Scognet	 *		cache operation.
132129198Scognet	 */
133129198Scognet	void	(*cf_icache_sync_all)	(void);
134129198Scognet	void	(*cf_icache_sync_range)	(vm_offset_t, vm_size_t);
135129198Scognet
136129198Scognet	void	(*cf_dcache_wbinv_all)	(void);
137129198Scognet	void	(*cf_dcache_wbinv_range) (vm_offset_t, vm_size_t);
138129198Scognet	void	(*cf_dcache_inv_range)	(vm_offset_t, vm_size_t);
139129198Scognet	void	(*cf_dcache_wb_range)	(vm_offset_t, vm_size_t);
140129198Scognet
141262420Sian	void	(*cf_idcache_inv_all)	(void);
142129198Scognet	void	(*cf_idcache_wbinv_all)	(void);
143129198Scognet	void	(*cf_idcache_wbinv_range) (vm_offset_t, vm_size_t);
144171618Scognet	void	(*cf_l2cache_wbinv_all) (void);
145171618Scognet	void	(*cf_l2cache_wbinv_range) (vm_offset_t, vm_size_t);
146171618Scognet	void	(*cf_l2cache_inv_range)	  (vm_offset_t, vm_size_t);
147171618Scognet	void	(*cf_l2cache_wb_range)	  (vm_offset_t, vm_size_t);
148265870Sian	void	(*cf_l2cache_drain_writebuf)	  (void);
149129198Scognet
150129198Scognet	/* Other functions */
151129198Scognet
152129198Scognet	void	(*cf_drain_writebuf)	(void);
153129198Scognet
154129198Scognet	void	(*cf_sleep)		(int mode);
155129198Scognet
156129198Scognet	/* Soft functions */
157129198Scognet
158129198Scognet	void	(*cf_context_switch)	(void);
159129198Scognet
160280823Sandrew	void	(*cf_setup)		(void);
161129198Scognet};
162129198Scognet
163129198Scognetextern struct cpu_functions cpufuncs;
164129198Scognetextern u_int cputype;
165129198Scognet
166129198Scognet#define	cpu_cpwait()		cpufuncs.cf_cpwait()
167129198Scognet
168129198Scognet#define cpu_control(c, e)	cpufuncs.cf_control(c, e)
169129198Scognet#define cpu_setttb(t)		cpufuncs.cf_setttb(t)
170129198Scognet
171129198Scognet#define	cpu_tlb_flushID()	cpufuncs.cf_tlb_flushID()
172129198Scognet#define	cpu_tlb_flushID_SE(e)	cpufuncs.cf_tlb_flushID_SE(e)
173129198Scognet#define	cpu_tlb_flushD()	cpufuncs.cf_tlb_flushD()
174129198Scognet#define	cpu_tlb_flushD_SE(e)	cpufuncs.cf_tlb_flushD_SE(e)
175129198Scognet
176129198Scognet#define	cpu_icache_sync_all()	cpufuncs.cf_icache_sync_all()
177129198Scognet#define	cpu_icache_sync_range(a, s) cpufuncs.cf_icache_sync_range((a), (s))
178129198Scognet
179129198Scognet#define	cpu_dcache_wbinv_all()	cpufuncs.cf_dcache_wbinv_all()
180129198Scognet#define	cpu_dcache_wbinv_range(a, s) cpufuncs.cf_dcache_wbinv_range((a), (s))
181129198Scognet#define	cpu_dcache_inv_range(a, s) cpufuncs.cf_dcache_inv_range((a), (s))
182129198Scognet#define	cpu_dcache_wb_range(a, s) cpufuncs.cf_dcache_wb_range((a), (s))
183129198Scognet
184262420Sian#define	cpu_idcache_inv_all()	cpufuncs.cf_idcache_inv_all()
185129198Scognet#define	cpu_idcache_wbinv_all()	cpufuncs.cf_idcache_wbinv_all()
186129198Scognet#define	cpu_idcache_wbinv_range(a, s) cpufuncs.cf_idcache_wbinv_range((a), (s))
187171618Scognet#define cpu_l2cache_wbinv_all()	cpufuncs.cf_l2cache_wbinv_all()
188171618Scognet#define cpu_l2cache_wb_range(a, s) cpufuncs.cf_l2cache_wb_range((a), (s))
189171618Scognet#define cpu_l2cache_inv_range(a, s) cpufuncs.cf_l2cache_inv_range((a), (s))
190171618Scognet#define cpu_l2cache_wbinv_range(a, s) cpufuncs.cf_l2cache_wbinv_range((a), (s))
191265870Sian#define cpu_l2cache_drain_writebuf() cpufuncs.cf_l2cache_drain_writebuf()
192129198Scognet
193129198Scognet#define	cpu_drain_writebuf()	cpufuncs.cf_drain_writebuf()
194129198Scognet#define cpu_sleep(m)		cpufuncs.cf_sleep(m)
195129198Scognet
196280823Sandrew#define cpu_setup()			cpufuncs.cf_setup()
197129198Scognet
198129198Scognetint	set_cpufuncs		(void);
199129198Scognet#define ARCHITECTURE_NOT_PRESENT	1	/* known but not configured */
200129198Scognet#define ARCHITECTURE_NOT_SUPPORTED	2	/* not known */
201129198Scognet
202129198Scognetvoid	cpufunc_nullop		(void);
203295096Smmelu_int	cpu_ident		(void);
204129198Scognetu_int	cpufunc_control		(u_int clear, u_int bic);
205295096Smmelvoid	cpu_domains		(u_int domains);
206295096Smmelu_int	cpu_faultstatus		(void);
207295096Smmelu_int	cpu_faultaddress	(void);
208239268Sgonzou_int	cpu_pfr			(int);
209129198Scognet
210280842Sandrew#if defined(CPU_FA526)
211280823Sandrewvoid	fa526_setup		(void);
212201468Srpaulovoid	fa526_setttb		(u_int ttb);
213201468Srpaulovoid	fa526_context_switch	(void);
214201468Srpaulovoid	fa526_cpu_sleep		(int);
215201468Srpaulovoid	fa526_tlb_flushID_SE	(u_int);
216201468Srpaulo
217201468Srpaulovoid	fa526_icache_sync_all	(void);
218201468Srpaulovoid	fa526_icache_sync_range(vm_offset_t start, vm_size_t end);
219201468Srpaulovoid	fa526_dcache_wbinv_all	(void);
220201468Srpaulovoid	fa526_dcache_wbinv_range(vm_offset_t start, vm_size_t end);
221201468Srpaulovoid	fa526_dcache_inv_range	(vm_offset_t start, vm_size_t end);
222201468Srpaulovoid	fa526_dcache_wb_range	(vm_offset_t start, vm_size_t end);
223201468Srpaulovoid	fa526_idcache_wbinv_all(void);
224201468Srpaulovoid	fa526_idcache_wbinv_range(vm_offset_t start, vm_size_t end);
225201468Srpaulo#endif
226201468Srpaulo
227201468Srpaulo
228295149Smmel#if defined(CPU_ARM9) || defined(CPU_ARM9E)
229129198Scognetvoid	arm9_setttb		(u_int);
230129198Scognetvoid	arm9_tlb_flushID_SE	(u_int va);
231295149Smmelvoid	arm9_context_switch	(void);
232295149Smmel#endif
233129198Scognet
234295149Smmel#if defined(CPU_ARM9)
235167752Skevlovoid	arm9_icache_sync_all	(void);
236167752Skevlovoid	arm9_icache_sync_range	(vm_offset_t, vm_size_t);
237129198Scognet
238167752Skevlovoid	arm9_dcache_wbinv_all	(void);
239167752Skevlovoid	arm9_dcache_wbinv_range (vm_offset_t, vm_size_t);
240167752Skevlovoid	arm9_dcache_inv_range	(vm_offset_t, vm_size_t);
241167752Skevlovoid	arm9_dcache_wb_range	(vm_offset_t, vm_size_t);
242129198Scognet
243167752Skevlovoid	arm9_idcache_wbinv_all	(void);
244167752Skevlovoid	arm9_idcache_wbinv_range (vm_offset_t, vm_size_t);
245129198Scognet
246280823Sandrewvoid	arm9_setup		(void);
247146948Scognet
248146948Scognetextern unsigned arm9_dcache_sets_max;
249146948Scognetextern unsigned arm9_dcache_sets_inc;
250146948Scognetextern unsigned arm9_dcache_index_max;
251146948Scognetextern unsigned arm9_dcache_index_inc;
252129198Scognet#endif
253129198Scognet
254280809Sandrew#if defined(CPU_ARM9E)
255280823Sandrewvoid	arm10_setup		(void);
256129198Scognet
257186933Sraju_int	sheeva_control_ext 		(u_int, u_int);
258212825Smavvoid	sheeva_cpu_sleep		(int);
259186933Srajvoid	sheeva_setttb			(u_int);
260186933Srajvoid	sheeva_dcache_wbinv_range	(vm_offset_t, vm_size_t);
261186933Srajvoid	sheeva_dcache_inv_range		(vm_offset_t, vm_size_t);
262186933Srajvoid	sheeva_dcache_wb_range		(vm_offset_t, vm_size_t);
263186933Srajvoid	sheeva_idcache_wbinv_range	(vm_offset_t, vm_size_t);
264183835Sraj
265186933Srajvoid	sheeva_l2cache_wbinv_range	(vm_offset_t, vm_size_t);
266186933Srajvoid	sheeva_l2cache_inv_range	(vm_offset_t, vm_size_t);
267186933Srajvoid	sheeva_l2cache_wb_range		(vm_offset_t, vm_size_t);
268186933Srajvoid	sheeva_l2cache_wbinv_all	(void);
269129198Scognet#endif
270129198Scognet
271280813Sandrew#if defined(CPU_MV_PJ4B)
272239268Sgonzovoid	armv6_idcache_wbinv_all		(void);
273280813Sandrew#endif
274280813Sandrew#if defined(CPU_MV_PJ4B) || defined(CPU_CORTEXA) || defined(CPU_KRAIT)
275239268Sgonzovoid	armv7_setttb			(u_int);
276239268Sgonzovoid	armv7_tlb_flushID		(void);
277239268Sgonzovoid	armv7_tlb_flushID_SE		(u_int);
278265111Sianvoid	armv7_icache_sync_all		(void);
279239268Sgonzovoid	armv7_icache_sync_range		(vm_offset_t, vm_size_t);
280239268Sgonzovoid	armv7_idcache_wbinv_range	(vm_offset_t, vm_size_t);
281262420Sianvoid	armv7_idcache_inv_all		(void);
282239268Sgonzovoid	armv7_dcache_wbinv_all		(void);
283239268Sgonzovoid	armv7_idcache_wbinv_all		(void);
284239268Sgonzovoid	armv7_dcache_wbinv_range	(vm_offset_t, vm_size_t);
285239268Sgonzovoid	armv7_dcache_inv_range		(vm_offset_t, vm_size_t);
286239268Sgonzovoid	armv7_dcache_wb_range		(vm_offset_t, vm_size_t);
287239268Sgonzovoid	armv7_cpu_sleep			(int);
288280823Sandrewvoid	armv7_setup			(void);
289239268Sgonzovoid	armv7_context_switch		(void);
290239268Sgonzovoid	armv7_drain_writebuf		(void);
291239268Sgonzovoid	armv7_sev			(void);
292239268Sgonzou_int	armv7_auxctrl			(u_int, u_int);
293239268Sgonzo
294239268Sgonzovoid	armadaxp_idcache_wbinv_all	(void);
295239268Sgonzo
296280823Sandrewvoid 	cortexa_setup			(void);
297172738Simp#endif
298280832Sandrew#if defined(CPU_MV_PJ4B)
299280832Sandrewvoid	pj4b_config			(void);
300280832Sandrewvoid	pj4bv7_setup			(void);
301280832Sandrew#endif
302172738Simp
303280824Sandrew#if defined(CPU_ARM1176)
304280813Sandrewvoid	arm11_tlb_flushID	(void);
305280813Sandrewvoid	arm11_tlb_flushID_SE	(u_int);
306280813Sandrewvoid	arm11_tlb_flushD	(void);
307280813Sandrewvoid	arm11_tlb_flushD_SE	(u_int va);
308280813Sandrew
309280813Sandrewvoid	arm11_context_switch	(void);
310280813Sandrew
311280813Sandrewvoid	arm11_drain_writebuf	(void);
312280813Sandrew
313280813Sandrewvoid	armv6_dcache_wbinv_range	(vm_offset_t, vm_size_t);
314280813Sandrewvoid	armv6_dcache_inv_range		(vm_offset_t, vm_size_t);
315280813Sandrewvoid	armv6_dcache_wb_range		(vm_offset_t, vm_size_t);
316280813Sandrew
317280813Sandrewvoid	armv6_idcache_inv_all		(void);
318280813Sandrew
319244480Sgonzovoid    arm11x6_setttb                  (u_int);
320244480Sgonzovoid    arm11x6_idcache_wbinv_all       (void);
321244480Sgonzovoid    arm11x6_dcache_wbinv_all        (void);
322244480Sgonzovoid    arm11x6_icache_sync_all         (void);
323244480Sgonzovoid    arm11x6_icache_sync_range       (vm_offset_t, vm_size_t);
324244480Sgonzovoid    arm11x6_idcache_wbinv_range     (vm_offset_t, vm_size_t);
325280823Sandrewvoid    arm11x6_setup                   (void);
326244480Sgonzovoid    arm11x6_sleep                   (int);  /* no ref. for errata */
327244480Sgonzo#endif
328244480Sgonzo
329280809Sandrew#if defined(CPU_ARM9E)
330172738Simpvoid	armv5_ec_setttb(u_int);
331172738Simp
332172738Simpvoid	armv5_ec_icache_sync_all(void);
333172738Simpvoid	armv5_ec_icache_sync_range(vm_offset_t, vm_size_t);
334172738Simp
335172738Simpvoid	armv5_ec_dcache_wbinv_all(void);
336172738Simpvoid	armv5_ec_dcache_wbinv_range(vm_offset_t, vm_size_t);
337172738Simpvoid	armv5_ec_dcache_inv_range(vm_offset_t, vm_size_t);
338172738Simpvoid	armv5_ec_dcache_wb_range(vm_offset_t, vm_size_t);
339172738Simp
340172738Simpvoid	armv5_ec_idcache_wbinv_all(void);
341172738Simpvoid	armv5_ec_idcache_wbinv_range(vm_offset_t, vm_size_t);
342172738Simp#endif
343172738Simp
344280809Sandrew#if defined(CPU_ARM9) || defined(CPU_ARM9E) ||				\
345280847Sandrew  defined(CPU_XSCALE_80321) ||						\
346280842Sandrew  defined(CPU_FA526) ||							\
347207611Skevlo  defined(CPU_XSCALE_PXA2X0) || defined(CPU_XSCALE_IXP425) ||		\
348164080Scognet  defined(CPU_XSCALE_80219) || defined(CPU_XSCALE_81342)
349236992Simp
350129198Scognetvoid	armv4_tlb_flushID	(void);
351129198Scognetvoid	armv4_tlb_flushD	(void);
352129198Scognetvoid	armv4_tlb_flushD_SE	(u_int va);
353129198Scognet
354129198Scognetvoid	armv4_drain_writebuf	(void);
355262420Sianvoid	armv4_idcache_inv_all	(void);
356129198Scognet#endif
357129198Scognet
358280847Sandrew#if defined(CPU_XSCALE_80321) ||				\
359161592Scognet  defined(CPU_XSCALE_PXA2X0) || defined(CPU_XSCALE_IXP425) ||	\
360164080Scognet  defined(CPU_XSCALE_80219) || defined(CPU_XSCALE_81342)
361129198Scognetvoid	xscale_cpwait		(void);
362129198Scognet
363129198Scognetvoid	xscale_cpu_sleep	(int mode);
364129198Scognet
365129198Scognetu_int	xscale_control		(u_int clear, u_int bic);
366129198Scognet
367129198Scognetvoid	xscale_setttb		(u_int ttb);
368129198Scognet
369129198Scognetvoid	xscale_tlb_flushID_SE	(u_int va);
370129198Scognet
371129198Scognetvoid	xscale_cache_flushID	(void);
372129198Scognetvoid	xscale_cache_flushI	(void);
373129198Scognetvoid	xscale_cache_flushD	(void);
374129198Scognetvoid	xscale_cache_flushD_SE	(u_int entry);
375129198Scognet
376129198Scognetvoid	xscale_cache_cleanID	(void);
377129198Scognetvoid	xscale_cache_cleanD	(void);
378129198Scognetvoid	xscale_cache_cleanD_E	(u_int entry);
379129198Scognet
380129198Scognetvoid	xscale_cache_clean_minidata (void);
381129198Scognet
382129198Scognetvoid	xscale_cache_purgeID	(void);
383129198Scognetvoid	xscale_cache_purgeID_E	(u_int entry);
384129198Scognetvoid	xscale_cache_purgeD	(void);
385129198Scognetvoid	xscale_cache_purgeD_E	(u_int entry);
386129198Scognet
387129198Scognetvoid	xscale_cache_syncI	(void);
388129198Scognetvoid	xscale_cache_cleanID_rng (vm_offset_t start, vm_size_t end);
389129198Scognetvoid	xscale_cache_cleanD_rng	(vm_offset_t start, vm_size_t end);
390129198Scognetvoid	xscale_cache_purgeID_rng (vm_offset_t start, vm_size_t end);
391129198Scognetvoid	xscale_cache_purgeD_rng	(vm_offset_t start, vm_size_t end);
392129198Scognetvoid	xscale_cache_syncI_rng	(vm_offset_t start, vm_size_t end);
393129198Scognetvoid	xscale_cache_flushD_rng	(vm_offset_t start, vm_size_t end);
394129198Scognet
395129198Scognetvoid	xscale_context_switch	(void);
396129198Scognet
397280823Sandrewvoid	xscale_setup		(void);
398280847Sandrew#endif	/* CPU_XSCALE_80321 || CPU_XSCALE_PXA2X0 || CPU_XSCALE_IXP425
399161592Scognet	   CPU_XSCALE_80219 */
400129198Scognet
401164080Scognet#ifdef	CPU_XSCALE_81342
402164080Scognet
403171618Scognetvoid	xscalec3_l2cache_purge	(void);
404171618Scognetvoid	xscalec3_cache_purgeID	(void);
405171618Scognetvoid	xscalec3_cache_purgeD	(void);
406164080Scognetvoid	xscalec3_cache_cleanID	(void);
407164080Scognetvoid	xscalec3_cache_cleanD	(void);
408171618Scognetvoid	xscalec3_cache_syncI	(void);
409164080Scognet
410171618Scognetvoid	xscalec3_cache_purgeID_rng 	(vm_offset_t start, vm_size_t end);
411171618Scognetvoid	xscalec3_cache_purgeD_rng	(vm_offset_t start, vm_size_t end);
412171618Scognetvoid	xscalec3_cache_cleanID_rng	(vm_offset_t start, vm_size_t end);
413164080Scognetvoid	xscalec3_cache_cleanD_rng	(vm_offset_t start, vm_size_t end);
414171618Scognetvoid	xscalec3_cache_syncI_rng	(vm_offset_t start, vm_size_t end);
415164080Scognet
416171618Scognetvoid	xscalec3_l2cache_flush_rng	(vm_offset_t, vm_size_t);
417171618Scognetvoid	xscalec3_l2cache_clean_rng	(vm_offset_t start, vm_size_t end);
418171618Scognetvoid	xscalec3_l2cache_purge_rng	(vm_offset_t start, vm_size_t end);
419164080Scognet
420171618Scognet
421164080Scognetvoid	xscalec3_setttb		(u_int ttb);
422164080Scognetvoid	xscalec3_context_switch	(void);
423164080Scognet
424164080Scognet#endif /* CPU_XSCALE_81342 */
425164080Scognet
426129198Scognet#define setttb		cpu_setttb
427129198Scognet#define drain_writebuf	cpu_drain_writebuf
428129198Scognet
429129198Scognet/*
430129198Scognet * Macros for manipulating CPU interrupts
431129198Scognet */
432290661Smmel#if __ARM_ARCH < 6
433290661Smmel#define	__ARM_INTR_BITS		(PSR_I | PSR_F)
434290661Smmel#else
435290661Smmel#define	__ARM_INTR_BITS		(PSR_I | PSR_F | PSR_A)
436290661Smmel#endif
437129198Scognet
438290661Smmelstatic __inline uint32_t
439290661Smmel__set_cpsr(uint32_t bic, uint32_t eor)
440129198Scognet{
441290661Smmel	uint32_t	tmp, ret;
442129198Scognet
443129198Scognet	__asm __volatile(
444290661Smmel		"mrs     %0, cpsr\n"		/* Get the CPSR */
445290661Smmel		"bic	 %1, %0, %2\n"		/* Clear bits */
446290661Smmel		"eor	 %1, %1, %3\n"		/* XOR bits */
447290661Smmel		"msr     cpsr_xc, %1\n"		/* Set the CPSR */
448129198Scognet	: "=&r" (ret), "=&r" (tmp)
449137226Scognet	: "r" (bic), "r" (eor) : "memory");
450129198Scognet
451129198Scognet	return ret;
452129198Scognet}
453129198Scognet
454290661Smmelstatic __inline uint32_t
455290661Smmeldisable_interrupts(uint32_t mask)
456290661Smmel{
457243576Smarcel
458290661Smmel	return (__set_cpsr(mask & __ARM_INTR_BITS, mask & __ARM_INTR_BITS));
459290661Smmel}
460129198Scognet
461290661Smmelstatic __inline uint32_t
462290661Smmelenable_interrupts(uint32_t mask)
463290661Smmel{
464129198Scognet
465290661Smmel	return (__set_cpsr(mask & __ARM_INTR_BITS, 0));
466290661Smmel}
467129198Scognet
468290661Smmelstatic __inline uint32_t
469290661Smmelrestore_interrupts(uint32_t old_cpsr)
470290661Smmel{
471290661Smmel
472290661Smmel	return (__set_cpsr(__ARM_INTR_BITS, old_cpsr & __ARM_INTR_BITS));
473290661Smmel}
474290661Smmel
475243576Smarcelstatic __inline register_t
476243576Smarcelintr_disable(void)
477243576Smarcel{
478243576Smarcel
479290661Smmel	return (disable_interrupts(PSR_I | PSR_F));
480243576Smarcel}
481243576Smarcel
482243576Smarcelstatic __inline void
483243576Smarcelintr_restore(register_t s)
484243576Smarcel{
485243576Smarcel
486243576Smarcel	restore_interrupts(s);
487243576Smarcel}
488290661Smmel#undef __ARM_INTR_BITS
489243576Smarcel
490129198Scognet/*
491129198Scognet * Functions to manipulate cpu r13
492129198Scognet * (in arm/arm32/setstack.S)
493129198Scognet */
494129198Scognet
495167752Skevlovoid set_stackptr	(u_int mode, u_int address);
496167752Skevlou_int get_stackptr	(u_int mode);
497129198Scognet
498129198Scognet/*
499129198Scognet * Miscellany
500129198Scognet */
501129198Scognet
502167752Skevloint get_pc_str_offset	(void);
503129198Scognet
504129198Scognet/*
505129198Scognet * CPU functions from locore.S
506129198Scognet */
507129198Scognet
508167752Skevlovoid cpu_reset		(void) __attribute__((__noreturn__));
509129198Scognet
510129198Scognet/*
511129198Scognet * Cache info variables.
512129198Scognet */
513129198Scognet
514129198Scognet/* PRIMARY CACHE VARIABLES */
515129198Scognetextern int	arm_picache_size;
516129198Scognetextern int	arm_picache_line_size;
517129198Scognetextern int	arm_picache_ways;
518129198Scognet
519129198Scognetextern int	arm_pdcache_size;	/* and unified */
520129198Scognetextern int	arm_pdcache_line_size;
521236992Simpextern int	arm_pdcache_ways;
522129198Scognet
523129198Scognetextern int	arm_pcache_type;
524129198Scognetextern int	arm_pcache_unified;
525129198Scognet
526129198Scognetextern int	arm_dcache_align;
527129198Scognetextern int	arm_dcache_align_mask;
528129198Scognet
529239268Sgonzoextern u_int	arm_cache_level;
530239268Sgonzoextern u_int	arm_cache_loc;
531239268Sgonzoextern u_int	arm_cache_type[14];
532239268Sgonzo
533129198Scognet#endif	/* _KERNEL */
534129198Scognet#endif	/* _MACHINE_CPUFUNC_H_ */
535129198Scognet
536129198Scognet/* End of cpufunc.h */
537