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