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