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: stable/11/sys/arm/include/cpufunc.h 338514 2018-09-06 22:23:39Z jhb $
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
52132055Scognetstatic __inline void
53132055Scognetbreakpoint(void)
54132055Scognet{
55338514Sjhb	__asm("udf        0xffff");
56132055Scognet}
57132471Scognet
58129198Scognetstruct cpu_functions {
59129198Scognet
60129198Scognet	/* CPU functions */
61317002Smmel#if __ARM_ARCH < 6
62129198Scognet	void	(*cf_cpwait)		(void);
63129198Scognet
64129198Scognet	/* MMU functions */
65129198Scognet
66129198Scognet	u_int	(*cf_control)		(u_int bic, u_int eor);
67129198Scognet	void	(*cf_setttb)		(u_int ttb);
68129198Scognet
69129198Scognet	/* TLB functions */
70129198Scognet
71290648Smmel	void	(*cf_tlb_flushID)	(void);
72290648Smmel	void	(*cf_tlb_flushID_SE)	(u_int va);
73129198Scognet	void	(*cf_tlb_flushD)	(void);
74290648Smmel	void	(*cf_tlb_flushD_SE)	(u_int va);
75129198Scognet
76129198Scognet	/*
77129198Scognet	 * Cache operations:
78129198Scognet	 *
79129198Scognet	 * We define the following primitives:
80129198Scognet	 *
81129198Scognet	 *	icache_sync_range	Synchronize I-cache range
82129198Scognet	 *
83129198Scognet	 *	dcache_wbinv_all	Write-back and Invalidate D-cache
84129198Scognet	 *	dcache_wbinv_range	Write-back and Invalidate D-cache range
85129198Scognet	 *	dcache_inv_range	Invalidate D-cache range
86129198Scognet	 *	dcache_wb_range		Write-back D-cache range
87129198Scognet	 *
88129198Scognet	 *	idcache_wbinv_all	Write-back and Invalidate D-cache,
89129198Scognet	 *				Invalidate I-cache
90129198Scognet	 *	idcache_wbinv_range	Write-back and Invalidate D-cache,
91129198Scognet	 *				Invalidate I-cache range
92129198Scognet	 *
93129198Scognet	 * Note that the ARM term for "write-back" is "clean".  We use
94129198Scognet	 * the term "write-back" since it's a more common way to describe
95129198Scognet	 * the operation.
96129198Scognet	 *
97129198Scognet	 * There are some rules that must be followed:
98129198Scognet	 *
99262420Sian	 *	ID-cache Invalidate All:
100262420Sian	 *		Unlike other functions, this one must never write back.
101262420Sian	 *		It is used to intialize the MMU when it is in an unknown
102262420Sian	 *		state (such as when it may have lines tagged as valid
103262420Sian	 *		that belong to a previous set of mappings).
104290648Smmel	 *
105295207Smmel	 *	I-cache Sync range:
106129198Scognet	 *		The goal is to synchronize the instruction stream,
107129198Scognet	 *		so you may beed to write-back dirty D-cache blocks
108129198Scognet	 *		first.  If a range is requested, and you can't
109129198Scognet	 *		synchronize just a range, you have to hit the whole
110129198Scognet	 *		thing.
111129198Scognet	 *
112129198Scognet	 *	D-cache Write-Back and Invalidate range:
113129198Scognet	 *		If you can't WB-Inv a range, you must WB-Inv the
114129198Scognet	 *		entire D-cache.
115129198Scognet	 *
116129198Scognet	 *	D-cache Invalidate:
117129198Scognet	 *		If you can't Inv the D-cache, you must Write-Back
118129198Scognet	 *		and Invalidate.  Code that uses this operation
119129198Scognet	 *		MUST NOT assume that the D-cache will not be written
120129198Scognet	 *		back to memory.
121129198Scognet	 *
122129198Scognet	 *	D-cache Write-Back:
123129198Scognet	 *		If you can't Write-back without doing an Inv,
124129198Scognet	 *		that's fine.  Then treat this as a WB-Inv.
125129198Scognet	 *		Skipping the invalidate is merely an optimization.
126129198Scognet	 *
127129198Scognet	 *	All operations:
128129198Scognet	 *		Valid virtual addresses must be passed to each
129129198Scognet	 *		cache operation.
130129198Scognet	 */
131129198Scognet	void	(*cf_icache_sync_range)	(vm_offset_t, vm_size_t);
132129198Scognet
133129198Scognet	void	(*cf_dcache_wbinv_all)	(void);
134129198Scognet	void	(*cf_dcache_wbinv_range) (vm_offset_t, vm_size_t);
135129198Scognet	void	(*cf_dcache_inv_range)	(vm_offset_t, vm_size_t);
136129198Scognet	void	(*cf_dcache_wb_range)	(vm_offset_t, vm_size_t);
137129198Scognet
138262420Sian	void	(*cf_idcache_inv_all)	(void);
139129198Scognet	void	(*cf_idcache_wbinv_all)	(void);
140129198Scognet	void	(*cf_idcache_wbinv_range) (vm_offset_t, vm_size_t);
141317002Smmel#endif
142171618Scognet	void	(*cf_l2cache_wbinv_all) (void);
143171618Scognet	void	(*cf_l2cache_wbinv_range) (vm_offset_t, vm_size_t);
144171618Scognet	void	(*cf_l2cache_inv_range)	  (vm_offset_t, vm_size_t);
145171618Scognet	void	(*cf_l2cache_wb_range)	  (vm_offset_t, vm_size_t);
146265870Sian	void	(*cf_l2cache_drain_writebuf)	  (void);
147129198Scognet
148129198Scognet	/* Other functions */
149129198Scognet
150317003Smmel#if __ARM_ARCH < 6
151129198Scognet	void	(*cf_drain_writebuf)	(void);
152317003Smmel#endif
153129198Scognet
154129198Scognet	void	(*cf_sleep)		(int mode);
155129198Scognet
156317002Smmel#if __ARM_ARCH < 6
157129198Scognet	/* Soft functions */
158129198Scognet
159129198Scognet	void	(*cf_context_switch)	(void);
160317002Smmel#endif
161129198Scognet
162280823Sandrew	void	(*cf_setup)		(void);
163129198Scognet};
164129198Scognet
165129198Scognetextern struct cpu_functions cpufuncs;
166129198Scognetextern u_int cputype;
167129198Scognet
168295319Smmel#if __ARM_ARCH < 6
169129198Scognet#define	cpu_cpwait()		cpufuncs.cf_cpwait()
170295319Smmel#endif
171129198Scognet
172129198Scognet#define cpu_control(c, e)	cpufuncs.cf_control(c, e)
173295319Smmel#if __ARM_ARCH < 6
174129198Scognet#define cpu_setttb(t)		cpufuncs.cf_setttb(t)
175129198Scognet
176129198Scognet#define	cpu_tlb_flushID()	cpufuncs.cf_tlb_flushID()
177129198Scognet#define	cpu_tlb_flushID_SE(e)	cpufuncs.cf_tlb_flushID_SE(e)
178129198Scognet#define	cpu_tlb_flushD()	cpufuncs.cf_tlb_flushD()
179129198Scognet#define	cpu_tlb_flushD_SE(e)	cpufuncs.cf_tlb_flushD_SE(e)
180129198Scognet
181129198Scognet#define	cpu_icache_sync_range(a, s) cpufuncs.cf_icache_sync_range((a), (s))
182129198Scognet
183129198Scognet#define	cpu_dcache_wbinv_all()	cpufuncs.cf_dcache_wbinv_all()
184129198Scognet#define	cpu_dcache_wbinv_range(a, s) cpufuncs.cf_dcache_wbinv_range((a), (s))
185129198Scognet#define	cpu_dcache_inv_range(a, s) cpufuncs.cf_dcache_inv_range((a), (s))
186129198Scognet#define	cpu_dcache_wb_range(a, s) cpufuncs.cf_dcache_wb_range((a), (s))
187129198Scognet
188262420Sian#define	cpu_idcache_inv_all()	cpufuncs.cf_idcache_inv_all()
189129198Scognet#define	cpu_idcache_wbinv_all()	cpufuncs.cf_idcache_wbinv_all()
190129198Scognet#define	cpu_idcache_wbinv_range(a, s) cpufuncs.cf_idcache_wbinv_range((a), (s))
191295319Smmel#endif
192171618Scognet#define cpu_l2cache_wbinv_all()	cpufuncs.cf_l2cache_wbinv_all()
193171618Scognet#define cpu_l2cache_wb_range(a, s) cpufuncs.cf_l2cache_wb_range((a), (s))
194171618Scognet#define cpu_l2cache_inv_range(a, s) cpufuncs.cf_l2cache_inv_range((a), (s))
195171618Scognet#define cpu_l2cache_wbinv_range(a, s) cpufuncs.cf_l2cache_wbinv_range((a), (s))
196265870Sian#define cpu_l2cache_drain_writebuf() cpufuncs.cf_l2cache_drain_writebuf()
197129198Scognet
198295319Smmel#if __ARM_ARCH < 6
199129198Scognet#define	cpu_drain_writebuf()	cpufuncs.cf_drain_writebuf()
200295319Smmel#endif
201129198Scognet#define cpu_sleep(m)		cpufuncs.cf_sleep(m)
202129198Scognet
203280823Sandrew#define cpu_setup()			cpufuncs.cf_setup()
204129198Scognet
205129198Scognetint	set_cpufuncs		(void);
206129198Scognet#define ARCHITECTURE_NOT_PRESENT	1	/* known but not configured */
207129198Scognet#define ARCHITECTURE_NOT_SUPPORTED	2	/* not known */
208129198Scognet
209129198Scognetvoid	cpufunc_nullop		(void);
210295096Smmelu_int	cpu_ident		(void);
211129198Scognetu_int	cpufunc_control		(u_int clear, u_int bic);
212295096Smmelvoid	cpu_domains		(u_int domains);
213295096Smmelu_int	cpu_faultstatus		(void);
214295096Smmelu_int	cpu_faultaddress	(void);
215295252Smmelu_int	cpu_get_control		(void);
216239268Sgonzou_int	cpu_pfr			(int);
217129198Scognet
218280842Sandrew#if defined(CPU_FA526)
219280823Sandrewvoid	fa526_setup		(void);
220201468Srpaulovoid	fa526_setttb		(u_int ttb);
221201468Srpaulovoid	fa526_context_switch	(void);
222201468Srpaulovoid	fa526_cpu_sleep		(int);
223201468Srpaulovoid	fa526_tlb_flushID_SE	(u_int);
224201468Srpaulo
225201468Srpaulovoid	fa526_icache_sync_range(vm_offset_t start, vm_size_t end);
226201468Srpaulovoid	fa526_dcache_wbinv_all	(void);
227201468Srpaulovoid	fa526_dcache_wbinv_range(vm_offset_t start, vm_size_t end);
228201468Srpaulovoid	fa526_dcache_inv_range	(vm_offset_t start, vm_size_t end);
229201468Srpaulovoid	fa526_dcache_wb_range	(vm_offset_t start, vm_size_t end);
230201468Srpaulovoid	fa526_idcache_wbinv_all(void);
231201468Srpaulovoid	fa526_idcache_wbinv_range(vm_offset_t start, vm_size_t end);
232201468Srpaulo#endif
233201468Srpaulo
234201468Srpaulo
235295149Smmel#if defined(CPU_ARM9) || defined(CPU_ARM9E)
236129198Scognetvoid	arm9_setttb		(u_int);
237129198Scognetvoid	arm9_tlb_flushID_SE	(u_int va);
238295149Smmelvoid	arm9_context_switch	(void);
239295149Smmel#endif
240129198Scognet
241295207Smmel#if defined(CPU_ARM9)
242167752Skevlovoid	arm9_icache_sync_range	(vm_offset_t, vm_size_t);
243129198Scognet
244167752Skevlovoid	arm9_dcache_wbinv_all	(void);
245167752Skevlovoid	arm9_dcache_wbinv_range (vm_offset_t, vm_size_t);
246167752Skevlovoid	arm9_dcache_inv_range	(vm_offset_t, vm_size_t);
247167752Skevlovoid	arm9_dcache_wb_range	(vm_offset_t, vm_size_t);
248129198Scognet
249167752Skevlovoid	arm9_idcache_wbinv_all	(void);
250167752Skevlovoid	arm9_idcache_wbinv_range (vm_offset_t, vm_size_t);
251129198Scognet
252280823Sandrewvoid	arm9_setup		(void);
253146948Scognet
254146948Scognetextern unsigned arm9_dcache_sets_max;
255146948Scognetextern unsigned arm9_dcache_sets_inc;
256146948Scognetextern unsigned arm9_dcache_index_max;
257146948Scognetextern unsigned arm9_dcache_index_inc;
258129198Scognet#endif
259129198Scognet
260280809Sandrew#if defined(CPU_ARM9E)
261280823Sandrewvoid	arm10_setup		(void);
262129198Scognet
263186933Sraju_int	sheeva_control_ext 		(u_int, u_int);
264212825Smavvoid	sheeva_cpu_sleep		(int);
265186933Srajvoid	sheeva_setttb			(u_int);
266186933Srajvoid	sheeva_dcache_wbinv_range	(vm_offset_t, vm_size_t);
267186933Srajvoid	sheeva_dcache_inv_range		(vm_offset_t, vm_size_t);
268186933Srajvoid	sheeva_dcache_wb_range		(vm_offset_t, vm_size_t);
269186933Srajvoid	sheeva_idcache_wbinv_range	(vm_offset_t, vm_size_t);
270183835Sraj
271186933Srajvoid	sheeva_l2cache_wbinv_range	(vm_offset_t, vm_size_t);
272186933Srajvoid	sheeva_l2cache_inv_range	(vm_offset_t, vm_size_t);
273186933Srajvoid	sheeva_l2cache_wb_range		(vm_offset_t, vm_size_t);
274186933Srajvoid	sheeva_l2cache_wbinv_all	(void);
275129198Scognet#endif
276129198Scognet
277280813Sandrew#if defined(CPU_MV_PJ4B)
278239268Sgonzovoid	armv6_idcache_wbinv_all		(void);
279280813Sandrew#endif
280280813Sandrew#if defined(CPU_MV_PJ4B) || defined(CPU_CORTEXA) || defined(CPU_KRAIT)
281239268Sgonzovoid	armv7_setttb			(u_int);
282239268Sgonzovoid	armv7_tlb_flushID		(void);
283239268Sgonzovoid	armv7_tlb_flushID_SE		(u_int);
284239268Sgonzovoid	armv7_icache_sync_range		(vm_offset_t, vm_size_t);
285239268Sgonzovoid	armv7_idcache_wbinv_range	(vm_offset_t, vm_size_t);
286262420Sianvoid	armv7_idcache_inv_all		(void);
287239268Sgonzovoid	armv7_dcache_wbinv_all		(void);
288239268Sgonzovoid	armv7_idcache_wbinv_all		(void);
289239268Sgonzovoid	armv7_dcache_wbinv_range	(vm_offset_t, vm_size_t);
290239268Sgonzovoid	armv7_dcache_inv_range		(vm_offset_t, vm_size_t);
291239268Sgonzovoid	armv7_dcache_wb_range		(vm_offset_t, vm_size_t);
292239268Sgonzovoid	armv7_cpu_sleep			(int);
293280823Sandrewvoid	armv7_setup			(void);
294239268Sgonzovoid	armv7_context_switch		(void);
295239268Sgonzovoid	armv7_drain_writebuf		(void);
296239268Sgonzou_int	armv7_auxctrl			(u_int, u_int);
297239268Sgonzo
298239268Sgonzovoid	armadaxp_idcache_wbinv_all	(void);
299239268Sgonzo
300280823Sandrewvoid 	cortexa_setup			(void);
301172738Simp#endif
302280832Sandrew#if defined(CPU_MV_PJ4B)
303280832Sandrewvoid	pj4b_config			(void);
304280832Sandrewvoid	pj4bv7_setup			(void);
305280832Sandrew#endif
306172738Simp
307280824Sandrew#if defined(CPU_ARM1176)
308280813Sandrewvoid	arm11_tlb_flushID	(void);
309280813Sandrewvoid	arm11_tlb_flushID_SE	(u_int);
310280813Sandrewvoid	arm11_tlb_flushD	(void);
311280813Sandrewvoid	arm11_tlb_flushD_SE	(u_int va);
312280813Sandrew
313280813Sandrewvoid	arm11_context_switch	(void);
314280813Sandrew
315280813Sandrewvoid	arm11_drain_writebuf	(void);
316280813Sandrew
317280813Sandrewvoid	armv6_dcache_wbinv_range	(vm_offset_t, vm_size_t);
318280813Sandrewvoid	armv6_dcache_inv_range		(vm_offset_t, vm_size_t);
319280813Sandrewvoid	armv6_dcache_wb_range		(vm_offset_t, vm_size_t);
320280813Sandrew
321280813Sandrewvoid	armv6_idcache_inv_all		(void);
322280813Sandrew
323244480Sgonzovoid    arm11x6_setttb                  (u_int);
324244480Sgonzovoid    arm11x6_idcache_wbinv_all       (void);
325244480Sgonzovoid    arm11x6_dcache_wbinv_all        (void);
326244480Sgonzovoid    arm11x6_icache_sync_range       (vm_offset_t, vm_size_t);
327244480Sgonzovoid    arm11x6_idcache_wbinv_range     (vm_offset_t, vm_size_t);
328280823Sandrewvoid    arm11x6_setup                   (void);
329244480Sgonzovoid    arm11x6_sleep                   (int);  /* no ref. for errata */
330244480Sgonzo#endif
331244480Sgonzo
332280809Sandrew#if defined(CPU_ARM9E)
333172738Simpvoid	armv5_ec_setttb(u_int);
334172738Simp
335172738Simpvoid	armv5_ec_icache_sync_range(vm_offset_t, vm_size_t);
336172738Simp
337172738Simpvoid	armv5_ec_dcache_wbinv_all(void);
338172738Simpvoid	armv5_ec_dcache_wbinv_range(vm_offset_t, vm_size_t);
339172738Simpvoid	armv5_ec_dcache_inv_range(vm_offset_t, vm_size_t);
340172738Simpvoid	armv5_ec_dcache_wb_range(vm_offset_t, vm_size_t);
341172738Simp
342172738Simpvoid	armv5_ec_idcache_wbinv_all(void);
343172738Simpvoid	armv5_ec_idcache_wbinv_range(vm_offset_t, vm_size_t);
344172738Simp#endif
345172738Simp
346280809Sandrew#if defined(CPU_ARM9) || defined(CPU_ARM9E) ||				\
347280842Sandrew  defined(CPU_FA526) ||							\
348207611Skevlo  defined(CPU_XSCALE_PXA2X0) || defined(CPU_XSCALE_IXP425) ||		\
349295200Smmel  defined(CPU_XSCALE_81342)
350236992Simp
351129198Scognetvoid	armv4_tlb_flushID	(void);
352129198Scognetvoid	armv4_tlb_flushD	(void);
353129198Scognetvoid	armv4_tlb_flushD_SE	(u_int va);
354129198Scognet
355129198Scognetvoid	armv4_drain_writebuf	(void);
356262420Sianvoid	armv4_idcache_inv_all	(void);
357129198Scognet#endif
358129198Scognet
359295200Smmel#if defined(CPU_XSCALE_PXA2X0) || defined(CPU_XSCALE_IXP425) ||		\
360295200Smmel  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);
398295200Smmel#endif	/* CPU_XSCALE_PXA2X0 || CPU_XSCALE_IXP425 */
399129198Scognet
400164080Scognet#ifdef	CPU_XSCALE_81342
401164080Scognet
402171618Scognetvoid	xscalec3_l2cache_purge	(void);
403171618Scognetvoid	xscalec3_cache_purgeID	(void);
404171618Scognetvoid	xscalec3_cache_purgeD	(void);
405164080Scognetvoid	xscalec3_cache_cleanID	(void);
406164080Scognetvoid	xscalec3_cache_cleanD	(void);
407171618Scognetvoid	xscalec3_cache_syncI	(void);
408164080Scognet
409171618Scognetvoid	xscalec3_cache_purgeID_rng 	(vm_offset_t start, vm_size_t end);
410171618Scognetvoid	xscalec3_cache_purgeD_rng	(vm_offset_t start, vm_size_t end);
411171618Scognetvoid	xscalec3_cache_cleanID_rng	(vm_offset_t start, vm_size_t end);
412164080Scognetvoid	xscalec3_cache_cleanD_rng	(vm_offset_t start, vm_size_t end);
413171618Scognetvoid	xscalec3_cache_syncI_rng	(vm_offset_t start, vm_size_t end);
414164080Scognet
415171618Scognetvoid	xscalec3_l2cache_flush_rng	(vm_offset_t, vm_size_t);
416171618Scognetvoid	xscalec3_l2cache_clean_rng	(vm_offset_t start, vm_size_t end);
417171618Scognetvoid	xscalec3_l2cache_purge_rng	(vm_offset_t start, vm_size_t end);
418164080Scognet
419171618Scognet
420164080Scognetvoid	xscalec3_setttb		(u_int ttb);
421164080Scognetvoid	xscalec3_context_switch	(void);
422164080Scognet
423164080Scognet#endif /* CPU_XSCALE_81342 */
424164080Scognet
425129198Scognet/*
426129198Scognet * Macros for manipulating CPU interrupts
427129198Scognet */
428290661Smmel#if __ARM_ARCH < 6
429290661Smmel#define	__ARM_INTR_BITS		(PSR_I | PSR_F)
430290661Smmel#else
431290661Smmel#define	__ARM_INTR_BITS		(PSR_I | PSR_F | PSR_A)
432290661Smmel#endif
433129198Scognet
434290661Smmelstatic __inline uint32_t
435290661Smmel__set_cpsr(uint32_t bic, uint32_t eor)
436129198Scognet{
437290661Smmel	uint32_t	tmp, ret;
438129198Scognet
439129198Scognet	__asm __volatile(
440290661Smmel		"mrs     %0, cpsr\n"		/* Get the CPSR */
441290661Smmel		"bic	 %1, %0, %2\n"		/* Clear bits */
442290661Smmel		"eor	 %1, %1, %3\n"		/* XOR bits */
443290661Smmel		"msr     cpsr_xc, %1\n"		/* Set the CPSR */
444129198Scognet	: "=&r" (ret), "=&r" (tmp)
445137226Scognet	: "r" (bic), "r" (eor) : "memory");
446129198Scognet
447129198Scognet	return ret;
448129198Scognet}
449129198Scognet
450290661Smmelstatic __inline uint32_t
451290661Smmeldisable_interrupts(uint32_t mask)
452290661Smmel{
453243576Smarcel
454290661Smmel	return (__set_cpsr(mask & __ARM_INTR_BITS, mask & __ARM_INTR_BITS));
455290661Smmel}
456129198Scognet
457290661Smmelstatic __inline uint32_t
458290661Smmelenable_interrupts(uint32_t mask)
459290661Smmel{
460129198Scognet
461290661Smmel	return (__set_cpsr(mask & __ARM_INTR_BITS, 0));
462290661Smmel}
463129198Scognet
464290661Smmelstatic __inline uint32_t
465290661Smmelrestore_interrupts(uint32_t old_cpsr)
466290661Smmel{
467290661Smmel
468290661Smmel	return (__set_cpsr(__ARM_INTR_BITS, old_cpsr & __ARM_INTR_BITS));
469290661Smmel}
470290661Smmel
471243576Smarcelstatic __inline register_t
472243576Smarcelintr_disable(void)
473243576Smarcel{
474243576Smarcel
475290661Smmel	return (disable_interrupts(PSR_I | PSR_F));
476243576Smarcel}
477243576Smarcel
478243576Smarcelstatic __inline void
479243576Smarcelintr_restore(register_t s)
480243576Smarcel{
481243576Smarcel
482243576Smarcel	restore_interrupts(s);
483243576Smarcel}
484290661Smmel#undef __ARM_INTR_BITS
485243576Smarcel
486129198Scognet/*
487129198Scognet * Functions to manipulate cpu r13
488129198Scognet * (in arm/arm32/setstack.S)
489129198Scognet */
490129198Scognet
491167752Skevlovoid set_stackptr	(u_int mode, u_int address);
492167752Skevlou_int get_stackptr	(u_int mode);
493129198Scognet
494129198Scognet/*
495129198Scognet * Miscellany
496129198Scognet */
497129198Scognet
498167752Skevloint get_pc_str_offset	(void);
499129198Scognet
500129198Scognet/*
501129198Scognet * CPU functions from locore.S
502129198Scognet */
503129198Scognet
504167752Skevlovoid cpu_reset		(void) __attribute__((__noreturn__));
505129198Scognet
506129198Scognet/*
507129198Scognet * Cache info variables.
508129198Scognet */
509129198Scognet
510129198Scognet/* PRIMARY CACHE VARIABLES */
511129198Scognetextern int	arm_picache_size;
512129198Scognetextern int	arm_picache_line_size;
513129198Scognetextern int	arm_picache_ways;
514129198Scognet
515129198Scognetextern int	arm_pdcache_size;	/* and unified */
516129198Scognetextern int	arm_pdcache_line_size;
517236992Simpextern int	arm_pdcache_ways;
518129198Scognet
519129198Scognetextern int	arm_pcache_type;
520129198Scognetextern int	arm_pcache_unified;
521129198Scognet
522129198Scognetextern int	arm_dcache_align;
523129198Scognetextern int	arm_dcache_align_mask;
524129198Scognet
525239268Sgonzoextern u_int	arm_cache_level;
526239268Sgonzoextern u_int	arm_cache_loc;
527239268Sgonzoextern u_int	arm_cache_type[14];
528239268Sgonzo
529338514Sjhb#else	/* !_KERNEL */
530338514Sjhb
531338514Sjhbstatic __inline void
532338514Sjhbbreakpoint(void)
533338514Sjhb{
534338514Sjhb
535338514Sjhb	/*
536338514Sjhb	 * This matches the instruction used by GDB for software
537338514Sjhb	 * breakpoints.
538338514Sjhb	 */
539338514Sjhb	__asm("udf        0xfdee");
540338514Sjhb}
541338514Sjhb
542129198Scognet#endif	/* _KERNEL */
543129198Scognet#endif	/* _MACHINE_CPUFUNC_H_ */
544129198Scognet
545129198Scognet/* End of cpufunc.h */
546