16fc729afSOlivier Houchard /* $NetBSD: cpufunc.h,v 1.29 2003/09/06 09:08:35 rearnsha Exp $ */ 26fc729afSOlivier Houchard 3d8315c79SWarner Losh /*- 46fc729afSOlivier Houchard * Copyright (c) 1997 Mark Brinicombe. 56fc729afSOlivier Houchard * Copyright (c) 1997 Causality Limited 66fc729afSOlivier Houchard * All rights reserved. 76fc729afSOlivier Houchard * 86fc729afSOlivier Houchard * Redistribution and use in source and binary forms, with or without 96fc729afSOlivier Houchard * modification, are permitted provided that the following conditions 106fc729afSOlivier Houchard * are met: 116fc729afSOlivier Houchard * 1. Redistributions of source code must retain the above copyright 126fc729afSOlivier Houchard * notice, this list of conditions and the following disclaimer. 136fc729afSOlivier Houchard * 2. Redistributions in binary form must reproduce the above copyright 146fc729afSOlivier Houchard * notice, this list of conditions and the following disclaimer in the 156fc729afSOlivier Houchard * documentation and/or other materials provided with the distribution. 166fc729afSOlivier Houchard * 3. All advertising materials mentioning features or use of this software 176fc729afSOlivier Houchard * must display the following acknowledgement: 186fc729afSOlivier Houchard * This product includes software developed by Causality Limited. 196fc729afSOlivier Houchard * 4. The name of Causality Limited may not be used to endorse or promote 206fc729afSOlivier Houchard * products derived from this software without specific prior written 216fc729afSOlivier Houchard * permission. 226fc729afSOlivier Houchard * 236fc729afSOlivier Houchard * THIS SOFTWARE IS PROVIDED BY CAUSALITY LIMITED ``AS IS'' AND ANY EXPRESS 246fc729afSOlivier Houchard * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 256fc729afSOlivier Houchard * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 266fc729afSOlivier Houchard * DISCLAIMED. IN NO EVENT SHALL CAUSALITY LIMITED BE LIABLE FOR ANY DIRECT, 276fc729afSOlivier Houchard * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 286fc729afSOlivier Houchard * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR 296fc729afSOlivier Houchard * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 306fc729afSOlivier Houchard * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 316fc729afSOlivier Houchard * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 326fc729afSOlivier Houchard * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 336fc729afSOlivier Houchard * SUCH DAMAGE. 346fc729afSOlivier Houchard * 356fc729afSOlivier Houchard * RiscBSD kernel project 366fc729afSOlivier Houchard * 376fc729afSOlivier Houchard * cpufunc.h 386fc729afSOlivier Houchard * 396fc729afSOlivier Houchard * Prototypes for cpu, mmu and tlb related functions. 406fc729afSOlivier Houchard * 416fc729afSOlivier Houchard * $FreeBSD$ 426fc729afSOlivier Houchard */ 436fc729afSOlivier Houchard 446fc729afSOlivier Houchard #ifndef _MACHINE_CPUFUNC_H_ 456fc729afSOlivier Houchard #define _MACHINE_CPUFUNC_H_ 466fc729afSOlivier Houchard 476fc729afSOlivier Houchard #ifdef _KERNEL 486fc729afSOlivier Houchard 496fc729afSOlivier Houchard #include <sys/types.h> 506fc729afSOlivier Houchard #include <machine/cpuconf.h> 514628245bSOlivier Houchard #include <machine/katelib.h> /* For in[bwl] and out[bwl] */ 526fc729afSOlivier Houchard 534628245bSOlivier Houchard static __inline void 544628245bSOlivier Houchard breakpoint(void) 554628245bSOlivier Houchard { 563488a2f7SOlivier Houchard __asm(".word 0xe7ffffff"); 574628245bSOlivier Houchard } 58be687a0dSOlivier Houchard 596fc729afSOlivier Houchard struct cpu_functions { 606fc729afSOlivier Houchard 616fc729afSOlivier Houchard /* CPU functions */ 626fc729afSOlivier Houchard 636fc729afSOlivier Houchard u_int (*cf_id) (void); 646fc729afSOlivier Houchard void (*cf_cpwait) (void); 656fc729afSOlivier Houchard 666fc729afSOlivier Houchard /* MMU functions */ 676fc729afSOlivier Houchard 686fc729afSOlivier Houchard u_int (*cf_control) (u_int bic, u_int eor); 696fc729afSOlivier Houchard void (*cf_domains) (u_int domains); 706fc729afSOlivier Houchard void (*cf_setttb) (u_int ttb); 716fc729afSOlivier Houchard u_int (*cf_faultstatus) (void); 726fc729afSOlivier Houchard u_int (*cf_faultaddress) (void); 736fc729afSOlivier Houchard 746fc729afSOlivier Houchard /* TLB functions */ 756fc729afSOlivier Houchard 766fc729afSOlivier Houchard void (*cf_tlb_flushID) (void); 776fc729afSOlivier Houchard void (*cf_tlb_flushID_SE) (u_int va); 786fc729afSOlivier Houchard void (*cf_tlb_flushI) (void); 796fc729afSOlivier Houchard void (*cf_tlb_flushI_SE) (u_int va); 806fc729afSOlivier Houchard void (*cf_tlb_flushD) (void); 816fc729afSOlivier Houchard void (*cf_tlb_flushD_SE) (u_int va); 826fc729afSOlivier Houchard 836fc729afSOlivier Houchard /* 846fc729afSOlivier Houchard * Cache operations: 856fc729afSOlivier Houchard * 866fc729afSOlivier Houchard * We define the following primitives: 876fc729afSOlivier Houchard * 886fc729afSOlivier Houchard * icache_sync_all Synchronize I-cache 896fc729afSOlivier Houchard * icache_sync_range Synchronize I-cache range 906fc729afSOlivier Houchard * 916fc729afSOlivier Houchard * dcache_wbinv_all Write-back and Invalidate D-cache 926fc729afSOlivier Houchard * dcache_wbinv_range Write-back and Invalidate D-cache range 936fc729afSOlivier Houchard * dcache_inv_range Invalidate D-cache range 946fc729afSOlivier Houchard * dcache_wb_range Write-back D-cache range 956fc729afSOlivier Houchard * 966fc729afSOlivier Houchard * idcache_wbinv_all Write-back and Invalidate D-cache, 976fc729afSOlivier Houchard * Invalidate I-cache 986fc729afSOlivier Houchard * idcache_wbinv_range Write-back and Invalidate D-cache, 996fc729afSOlivier Houchard * Invalidate I-cache range 1006fc729afSOlivier Houchard * 1016fc729afSOlivier Houchard * Note that the ARM term for "write-back" is "clean". We use 1026fc729afSOlivier Houchard * the term "write-back" since it's a more common way to describe 1036fc729afSOlivier Houchard * the operation. 1046fc729afSOlivier Houchard * 1056fc729afSOlivier Houchard * There are some rules that must be followed: 1066fc729afSOlivier Houchard * 1074b7fcd31SIan Lepore * ID-cache Invalidate All: 1084b7fcd31SIan Lepore * Unlike other functions, this one must never write back. 1094b7fcd31SIan Lepore * It is used to intialize the MMU when it is in an unknown 1104b7fcd31SIan Lepore * state (such as when it may have lines tagged as valid 1114b7fcd31SIan Lepore * that belong to a previous set of mappings). 1124b7fcd31SIan Lepore * 1136fc729afSOlivier Houchard * I-cache Synch (all or range): 1146fc729afSOlivier Houchard * The goal is to synchronize the instruction stream, 1156fc729afSOlivier Houchard * so you may beed to write-back dirty D-cache blocks 1166fc729afSOlivier Houchard * first. If a range is requested, and you can't 1176fc729afSOlivier Houchard * synchronize just a range, you have to hit the whole 1186fc729afSOlivier Houchard * thing. 1196fc729afSOlivier Houchard * 1206fc729afSOlivier Houchard * D-cache Write-Back and Invalidate range: 1216fc729afSOlivier Houchard * If you can't WB-Inv a range, you must WB-Inv the 1226fc729afSOlivier Houchard * entire D-cache. 1236fc729afSOlivier Houchard * 1246fc729afSOlivier Houchard * D-cache Invalidate: 1256fc729afSOlivier Houchard * If you can't Inv the D-cache, you must Write-Back 1266fc729afSOlivier Houchard * and Invalidate. Code that uses this operation 1276fc729afSOlivier Houchard * MUST NOT assume that the D-cache will not be written 1286fc729afSOlivier Houchard * back to memory. 1296fc729afSOlivier Houchard * 1306fc729afSOlivier Houchard * D-cache Write-Back: 1316fc729afSOlivier Houchard * If you can't Write-back without doing an Inv, 1326fc729afSOlivier Houchard * that's fine. Then treat this as a WB-Inv. 1336fc729afSOlivier Houchard * Skipping the invalidate is merely an optimization. 1346fc729afSOlivier Houchard * 1356fc729afSOlivier Houchard * All operations: 1366fc729afSOlivier Houchard * Valid virtual addresses must be passed to each 1376fc729afSOlivier Houchard * cache operation. 1386fc729afSOlivier Houchard */ 1396fc729afSOlivier Houchard void (*cf_icache_sync_all) (void); 1406fc729afSOlivier Houchard void (*cf_icache_sync_range) (vm_offset_t, vm_size_t); 1416fc729afSOlivier Houchard 1426fc729afSOlivier Houchard void (*cf_dcache_wbinv_all) (void); 1436fc729afSOlivier Houchard void (*cf_dcache_wbinv_range) (vm_offset_t, vm_size_t); 1446fc729afSOlivier Houchard void (*cf_dcache_inv_range) (vm_offset_t, vm_size_t); 1456fc729afSOlivier Houchard void (*cf_dcache_wb_range) (vm_offset_t, vm_size_t); 1466fc729afSOlivier Houchard 1474b7fcd31SIan Lepore void (*cf_idcache_inv_all) (void); 1486fc729afSOlivier Houchard void (*cf_idcache_wbinv_all) (void); 1496fc729afSOlivier Houchard void (*cf_idcache_wbinv_range) (vm_offset_t, vm_size_t); 150425b5be3SOlivier Houchard void (*cf_l2cache_wbinv_all) (void); 151425b5be3SOlivier Houchard void (*cf_l2cache_wbinv_range) (vm_offset_t, vm_size_t); 152425b5be3SOlivier Houchard void (*cf_l2cache_inv_range) (vm_offset_t, vm_size_t); 153425b5be3SOlivier Houchard void (*cf_l2cache_wb_range) (vm_offset_t, vm_size_t); 154*b07d0cbcSIan Lepore void (*cf_l2cache_drain_writebuf) (void); 1556fc729afSOlivier Houchard 1566fc729afSOlivier Houchard /* Other functions */ 1576fc729afSOlivier Houchard 1586fc729afSOlivier Houchard void (*cf_flush_prefetchbuf) (void); 1596fc729afSOlivier Houchard void (*cf_drain_writebuf) (void); 1606fc729afSOlivier Houchard void (*cf_flush_brnchtgt_C) (void); 1616fc729afSOlivier Houchard void (*cf_flush_brnchtgt_E) (u_int va); 1626fc729afSOlivier Houchard 1636fc729afSOlivier Houchard void (*cf_sleep) (int mode); 1646fc729afSOlivier Houchard 1656fc729afSOlivier Houchard /* Soft functions */ 1666fc729afSOlivier Houchard 1676fc729afSOlivier Houchard int (*cf_dataabt_fixup) (void *arg); 1686fc729afSOlivier Houchard int (*cf_prefetchabt_fixup) (void *arg); 1696fc729afSOlivier Houchard 1706fc729afSOlivier Houchard void (*cf_context_switch) (void); 1716fc729afSOlivier Houchard 1726fc729afSOlivier Houchard void (*cf_setup) (char *string); 1736fc729afSOlivier Houchard }; 1746fc729afSOlivier Houchard 1756fc729afSOlivier Houchard extern struct cpu_functions cpufuncs; 1766fc729afSOlivier Houchard extern u_int cputype; 1776fc729afSOlivier Houchard 1786fc729afSOlivier Houchard #define cpu_id() cpufuncs.cf_id() 1796fc729afSOlivier Houchard #define cpu_cpwait() cpufuncs.cf_cpwait() 1806fc729afSOlivier Houchard 1816fc729afSOlivier Houchard #define cpu_control(c, e) cpufuncs.cf_control(c, e) 1826fc729afSOlivier Houchard #define cpu_domains(d) cpufuncs.cf_domains(d) 1836fc729afSOlivier Houchard #define cpu_setttb(t) cpufuncs.cf_setttb(t) 1846fc729afSOlivier Houchard #define cpu_faultstatus() cpufuncs.cf_faultstatus() 1856fc729afSOlivier Houchard #define cpu_faultaddress() cpufuncs.cf_faultaddress() 1866fc729afSOlivier Houchard 187cf1a573fSOleksandr Tymoshenko #ifndef SMP 188cf1a573fSOleksandr Tymoshenko 1896fc729afSOlivier Houchard #define cpu_tlb_flushID() cpufuncs.cf_tlb_flushID() 1906fc729afSOlivier Houchard #define cpu_tlb_flushID_SE(e) cpufuncs.cf_tlb_flushID_SE(e) 1916fc729afSOlivier Houchard #define cpu_tlb_flushI() cpufuncs.cf_tlb_flushI() 1926fc729afSOlivier Houchard #define cpu_tlb_flushI_SE(e) cpufuncs.cf_tlb_flushI_SE(e) 1936fc729afSOlivier Houchard #define cpu_tlb_flushD() cpufuncs.cf_tlb_flushD() 1946fc729afSOlivier Houchard #define cpu_tlb_flushD_SE(e) cpufuncs.cf_tlb_flushD_SE(e) 1956fc729afSOlivier Houchard 196cf1a573fSOleksandr Tymoshenko #else 197cf1a573fSOleksandr Tymoshenko void tlb_broadcast(int); 198cf1a573fSOleksandr Tymoshenko 199543c9e95SGanbold Tsagaankhuu #if defined(CPU_CORTEXA) || defined(CPU_MV_PJ4B) || defined(CPU_KRAIT) 200cf1a573fSOleksandr Tymoshenko #define TLB_BROADCAST /* No need to explicitely send an IPI */ 201cf1a573fSOleksandr Tymoshenko #else 202cf1a573fSOleksandr Tymoshenko #define TLB_BROADCAST tlb_broadcast(7) 203cf1a573fSOleksandr Tymoshenko #endif 204cf1a573fSOleksandr Tymoshenko 205cf1a573fSOleksandr Tymoshenko #define cpu_tlb_flushID() do { \ 206cf1a573fSOleksandr Tymoshenko cpufuncs.cf_tlb_flushID(); \ 207cf1a573fSOleksandr Tymoshenko TLB_BROADCAST; \ 208cf1a573fSOleksandr Tymoshenko } while(0) 209cf1a573fSOleksandr Tymoshenko 210cf1a573fSOleksandr Tymoshenko #define cpu_tlb_flushID_SE(e) do { \ 211cf1a573fSOleksandr Tymoshenko cpufuncs.cf_tlb_flushID_SE(e); \ 212cf1a573fSOleksandr Tymoshenko TLB_BROADCAST; \ 213cf1a573fSOleksandr Tymoshenko } while(0) 214cf1a573fSOleksandr Tymoshenko 215cf1a573fSOleksandr Tymoshenko 216cf1a573fSOleksandr Tymoshenko #define cpu_tlb_flushI() do { \ 217cf1a573fSOleksandr Tymoshenko cpufuncs.cf_tlb_flushI(); \ 218cf1a573fSOleksandr Tymoshenko TLB_BROADCAST; \ 219cf1a573fSOleksandr Tymoshenko } while(0) 220cf1a573fSOleksandr Tymoshenko 221cf1a573fSOleksandr Tymoshenko 222cf1a573fSOleksandr Tymoshenko #define cpu_tlb_flushI_SE(e) do { \ 223cf1a573fSOleksandr Tymoshenko cpufuncs.cf_tlb_flushI_SE(e); \ 224cf1a573fSOleksandr Tymoshenko TLB_BROADCAST; \ 225cf1a573fSOleksandr Tymoshenko } while(0) 226cf1a573fSOleksandr Tymoshenko 227cf1a573fSOleksandr Tymoshenko 228cf1a573fSOleksandr Tymoshenko #define cpu_tlb_flushD() do { \ 229cf1a573fSOleksandr Tymoshenko cpufuncs.cf_tlb_flushD(); \ 230cf1a573fSOleksandr Tymoshenko TLB_BROADCAST; \ 231cf1a573fSOleksandr Tymoshenko } while(0) 232cf1a573fSOleksandr Tymoshenko 233cf1a573fSOleksandr Tymoshenko 234cf1a573fSOleksandr Tymoshenko #define cpu_tlb_flushD_SE(e) do { \ 235cf1a573fSOleksandr Tymoshenko cpufuncs.cf_tlb_flushD_SE(e); \ 236cf1a573fSOleksandr Tymoshenko TLB_BROADCAST; \ 237cf1a573fSOleksandr Tymoshenko } while(0) 238cf1a573fSOleksandr Tymoshenko 239cf1a573fSOleksandr Tymoshenko #endif 240cf1a573fSOleksandr Tymoshenko 2416fc729afSOlivier Houchard #define cpu_icache_sync_all() cpufuncs.cf_icache_sync_all() 2426fc729afSOlivier Houchard #define cpu_icache_sync_range(a, s) cpufuncs.cf_icache_sync_range((a), (s)) 2436fc729afSOlivier Houchard 2446fc729afSOlivier Houchard #define cpu_dcache_wbinv_all() cpufuncs.cf_dcache_wbinv_all() 2456fc729afSOlivier Houchard #define cpu_dcache_wbinv_range(a, s) cpufuncs.cf_dcache_wbinv_range((a), (s)) 2466fc729afSOlivier Houchard #define cpu_dcache_inv_range(a, s) cpufuncs.cf_dcache_inv_range((a), (s)) 2476fc729afSOlivier Houchard #define cpu_dcache_wb_range(a, s) cpufuncs.cf_dcache_wb_range((a), (s)) 2486fc729afSOlivier Houchard 2494b7fcd31SIan Lepore #define cpu_idcache_inv_all() cpufuncs.cf_idcache_inv_all() 2506fc729afSOlivier Houchard #define cpu_idcache_wbinv_all() cpufuncs.cf_idcache_wbinv_all() 2516fc729afSOlivier Houchard #define cpu_idcache_wbinv_range(a, s) cpufuncs.cf_idcache_wbinv_range((a), (s)) 252425b5be3SOlivier Houchard #define cpu_l2cache_wbinv_all() cpufuncs.cf_l2cache_wbinv_all() 253425b5be3SOlivier Houchard #define cpu_l2cache_wb_range(a, s) cpufuncs.cf_l2cache_wb_range((a), (s)) 254425b5be3SOlivier Houchard #define cpu_l2cache_inv_range(a, s) cpufuncs.cf_l2cache_inv_range((a), (s)) 255425b5be3SOlivier Houchard #define cpu_l2cache_wbinv_range(a, s) cpufuncs.cf_l2cache_wbinv_range((a), (s)) 256*b07d0cbcSIan Lepore #define cpu_l2cache_drain_writebuf() cpufuncs.cf_l2cache_drain_writebuf() 2576fc729afSOlivier Houchard 2586fc729afSOlivier Houchard #define cpu_flush_prefetchbuf() cpufuncs.cf_flush_prefetchbuf() 2596fc729afSOlivier Houchard #define cpu_drain_writebuf() cpufuncs.cf_drain_writebuf() 2606fc729afSOlivier Houchard #define cpu_flush_brnchtgt_C() cpufuncs.cf_flush_brnchtgt_C() 2616fc729afSOlivier Houchard #define cpu_flush_brnchtgt_E(e) cpufuncs.cf_flush_brnchtgt_E(e) 2626fc729afSOlivier Houchard 2636fc729afSOlivier Houchard #define cpu_sleep(m) cpufuncs.cf_sleep(m) 2646fc729afSOlivier Houchard 2656fc729afSOlivier Houchard #define cpu_dataabt_fixup(a) cpufuncs.cf_dataabt_fixup(a) 2666fc729afSOlivier Houchard #define cpu_prefetchabt_fixup(a) cpufuncs.cf_prefetchabt_fixup(a) 2676fc729afSOlivier Houchard #define ABORT_FIXUP_OK 0 /* fixup succeeded */ 2686fc729afSOlivier Houchard #define ABORT_FIXUP_FAILED 1 /* fixup failed */ 2696fc729afSOlivier Houchard #define ABORT_FIXUP_RETURN 2 /* abort handler should return */ 2706fc729afSOlivier Houchard 2716fc729afSOlivier Houchard #define cpu_setup(a) cpufuncs.cf_setup(a) 2726fc729afSOlivier Houchard 2736fc729afSOlivier Houchard int set_cpufuncs (void); 2746fc729afSOlivier Houchard #define ARCHITECTURE_NOT_PRESENT 1 /* known but not configured */ 2756fc729afSOlivier Houchard #define ARCHITECTURE_NOT_SUPPORTED 2 /* not known */ 2766fc729afSOlivier Houchard 2776fc729afSOlivier Houchard void cpufunc_nullop (void); 2786fc729afSOlivier Houchard int cpufunc_null_fixup (void *); 2796fc729afSOlivier Houchard int early_abort_fixup (void *); 2806fc729afSOlivier Houchard int late_abort_fixup (void *); 2816fc729afSOlivier Houchard u_int cpufunc_id (void); 282cf1a573fSOleksandr Tymoshenko u_int cpufunc_cpuid (void); 2836fc729afSOlivier Houchard u_int cpufunc_control (u_int clear, u_int bic); 2846fc729afSOlivier Houchard void cpufunc_domains (u_int domains); 2856fc729afSOlivier Houchard u_int cpufunc_faultstatus (void); 2866fc729afSOlivier Houchard u_int cpufunc_faultaddress (void); 287cf1a573fSOleksandr Tymoshenko u_int cpu_pfr (int); 2886fc729afSOlivier Houchard 28964c68f1cSKevin Lo #if defined(CPU_FA526) || defined(CPU_FA626TE) 290381a19ccSRui Paulo void fa526_setup (char *arg); 291381a19ccSRui Paulo void fa526_setttb (u_int ttb); 292381a19ccSRui Paulo void fa526_context_switch (void); 293381a19ccSRui Paulo void fa526_cpu_sleep (int); 294381a19ccSRui Paulo void fa526_tlb_flushI_SE (u_int); 295381a19ccSRui Paulo void fa526_tlb_flushID_SE (u_int); 296381a19ccSRui Paulo void fa526_flush_prefetchbuf (void); 297381a19ccSRui Paulo void fa526_flush_brnchtgt_E (u_int); 298381a19ccSRui Paulo 299381a19ccSRui Paulo void fa526_icache_sync_all (void); 300381a19ccSRui Paulo void fa526_icache_sync_range(vm_offset_t start, vm_size_t end); 301381a19ccSRui Paulo void fa526_dcache_wbinv_all (void); 302381a19ccSRui Paulo void fa526_dcache_wbinv_range(vm_offset_t start, vm_size_t end); 303381a19ccSRui Paulo void fa526_dcache_inv_range (vm_offset_t start, vm_size_t end); 304381a19ccSRui Paulo void fa526_dcache_wb_range (vm_offset_t start, vm_size_t end); 305381a19ccSRui Paulo void fa526_idcache_wbinv_all(void); 306381a19ccSRui Paulo void fa526_idcache_wbinv_range(vm_offset_t start, vm_size_t end); 307381a19ccSRui Paulo #endif 308381a19ccSRui Paulo 309381a19ccSRui Paulo 3106fc729afSOlivier Houchard #ifdef CPU_ARM9 3116fc729afSOlivier Houchard void arm9_setttb (u_int); 3126fc729afSOlivier Houchard 3136fc729afSOlivier Houchard void arm9_tlb_flushID_SE (u_int va); 3146fc729afSOlivier Houchard 3154eaa43e6SKevin Lo void arm9_icache_sync_all (void); 3164eaa43e6SKevin Lo void arm9_icache_sync_range (vm_offset_t, vm_size_t); 3176fc729afSOlivier Houchard 3184eaa43e6SKevin Lo void arm9_dcache_wbinv_all (void); 3194eaa43e6SKevin Lo void arm9_dcache_wbinv_range (vm_offset_t, vm_size_t); 3204eaa43e6SKevin Lo void arm9_dcache_inv_range (vm_offset_t, vm_size_t); 3214eaa43e6SKevin Lo void arm9_dcache_wb_range (vm_offset_t, vm_size_t); 3226fc729afSOlivier Houchard 3234eaa43e6SKevin Lo void arm9_idcache_wbinv_all (void); 3244eaa43e6SKevin Lo void arm9_idcache_wbinv_range (vm_offset_t, vm_size_t); 3256fc729afSOlivier Houchard 3266fc729afSOlivier Houchard void arm9_context_switch (void); 3276fc729afSOlivier Houchard 3286fc729afSOlivier Houchard void arm9_setup (char *string); 329094df973SOlivier Houchard 330094df973SOlivier Houchard extern unsigned arm9_dcache_sets_max; 331094df973SOlivier Houchard extern unsigned arm9_dcache_sets_inc; 332094df973SOlivier Houchard extern unsigned arm9_dcache_index_max; 333094df973SOlivier Houchard extern unsigned arm9_dcache_index_inc; 3346fc729afSOlivier Houchard #endif 3356fc729afSOlivier Houchard 33663b25978SWarner Losh #if defined(CPU_ARM9E) || defined(CPU_ARM10) 3376fc729afSOlivier Houchard void arm10_setttb (u_int); 3386fc729afSOlivier Houchard 3396fc729afSOlivier Houchard void arm10_tlb_flushID_SE (u_int); 3406fc729afSOlivier Houchard void arm10_tlb_flushI_SE (u_int); 3416fc729afSOlivier Houchard 3426fc729afSOlivier Houchard void arm10_icache_sync_all (void); 3436fc729afSOlivier Houchard void arm10_icache_sync_range (vm_offset_t, vm_size_t); 3446fc729afSOlivier Houchard 3456fc729afSOlivier Houchard void arm10_dcache_wbinv_all (void); 3466fc729afSOlivier Houchard void arm10_dcache_wbinv_range (vm_offset_t, vm_size_t); 3476fc729afSOlivier Houchard void arm10_dcache_inv_range (vm_offset_t, vm_size_t); 3486fc729afSOlivier Houchard void arm10_dcache_wb_range (vm_offset_t, vm_size_t); 3496fc729afSOlivier Houchard 3506fc729afSOlivier Houchard void arm10_idcache_wbinv_all (void); 3516fc729afSOlivier Houchard void arm10_idcache_wbinv_range (vm_offset_t, vm_size_t); 3526fc729afSOlivier Houchard 3536fc729afSOlivier Houchard void arm10_context_switch (void); 3546fc729afSOlivier Houchard 3556fc729afSOlivier Houchard void arm10_setup (char *string); 3566fc729afSOlivier Houchard 3576fc729afSOlivier Houchard extern unsigned arm10_dcache_sets_max; 3586fc729afSOlivier Houchard extern unsigned arm10_dcache_sets_inc; 3596fc729afSOlivier Houchard extern unsigned arm10_dcache_index_max; 3606fc729afSOlivier Houchard extern unsigned arm10_dcache_index_inc; 361ba6faad6SRafal Jaworowski 3621ee5b3b4SRafal Jaworowski u_int sheeva_control_ext (u_int, u_int); 363cfa892b5SAlexander Motin void sheeva_cpu_sleep (int); 3641ee5b3b4SRafal Jaworowski void sheeva_setttb (u_int); 3651ee5b3b4SRafal Jaworowski void sheeva_dcache_wbinv_range (vm_offset_t, vm_size_t); 3661ee5b3b4SRafal Jaworowski void sheeva_dcache_inv_range (vm_offset_t, vm_size_t); 3671ee5b3b4SRafal Jaworowski void sheeva_dcache_wb_range (vm_offset_t, vm_size_t); 3681ee5b3b4SRafal Jaworowski void sheeva_idcache_wbinv_range (vm_offset_t, vm_size_t); 369ba6faad6SRafal Jaworowski 3701ee5b3b4SRafal Jaworowski void sheeva_l2cache_wbinv_range (vm_offset_t, vm_size_t); 3711ee5b3b4SRafal Jaworowski void sheeva_l2cache_inv_range (vm_offset_t, vm_size_t); 3721ee5b3b4SRafal Jaworowski void sheeva_l2cache_wb_range (vm_offset_t, vm_size_t); 3731ee5b3b4SRafal Jaworowski void sheeva_l2cache_wbinv_all (void); 3746fc729afSOlivier Houchard #endif 3756fc729afSOlivier Houchard 376c5f8f894SOleksandr Tymoshenko #if defined(CPU_ARM1136) || defined(CPU_ARM1176) || \ 377543c9e95SGanbold Tsagaankhuu defined(CPU_MV_PJ4B) || defined(CPU_CORTEXA) || defined(CPU_KRAIT) 37863b25978SWarner Losh void arm11_setttb (u_int); 379cf1a573fSOleksandr Tymoshenko void arm11_sleep (int); 38063b25978SWarner Losh 38163b25978SWarner Losh void arm11_tlb_flushID_SE (u_int); 38263b25978SWarner Losh void arm11_tlb_flushI_SE (u_int); 38363b25978SWarner Losh 38463b25978SWarner Losh void arm11_context_switch (void); 38563b25978SWarner Losh 38663b25978SWarner Losh void arm11_setup (char *string); 38763b25978SWarner Losh void arm11_tlb_flushID (void); 38863b25978SWarner Losh void arm11_tlb_flushI (void); 38963b25978SWarner Losh void arm11_tlb_flushD (void); 39063b25978SWarner Losh void arm11_tlb_flushD_SE (u_int va); 39163b25978SWarner Losh 39263b25978SWarner Losh void arm11_drain_writebuf (void); 393cf1a573fSOleksandr Tymoshenko 394cf1a573fSOleksandr Tymoshenko void pj4b_setttb (u_int); 395cf1a573fSOleksandr Tymoshenko 396cf1a573fSOleksandr Tymoshenko void pj4b_drain_readbuf (void); 397cf1a573fSOleksandr Tymoshenko void pj4b_flush_brnchtgt_all (void); 398cf1a573fSOleksandr Tymoshenko void pj4b_flush_brnchtgt_va (u_int); 399cf1a573fSOleksandr Tymoshenko void pj4b_sleep (int); 400cf1a573fSOleksandr Tymoshenko 401cf1a573fSOleksandr Tymoshenko void armv6_icache_sync_all (void); 4028f2a36c0SOleksandr Tymoshenko void armv6_icache_sync_range (vm_offset_t, vm_size_t); 4038f2a36c0SOleksandr Tymoshenko 404cf1a573fSOleksandr Tymoshenko void armv6_dcache_wbinv_all (void); 4058f2a36c0SOleksandr Tymoshenko void armv6_dcache_wbinv_range (vm_offset_t, vm_size_t); 4068f2a36c0SOleksandr Tymoshenko void armv6_dcache_inv_range (vm_offset_t, vm_size_t); 4078f2a36c0SOleksandr Tymoshenko void armv6_dcache_wb_range (vm_offset_t, vm_size_t); 4088f2a36c0SOleksandr Tymoshenko 4094b7fcd31SIan Lepore void armv6_idcache_inv_all (void); 410cf1a573fSOleksandr Tymoshenko void armv6_idcache_wbinv_all (void); 4118f2a36c0SOleksandr Tymoshenko void armv6_idcache_wbinv_range (vm_offset_t, vm_size_t); 412cf1a573fSOleksandr Tymoshenko 413cf1a573fSOleksandr Tymoshenko void armv7_setttb (u_int); 414cf1a573fSOleksandr Tymoshenko void armv7_tlb_flushID (void); 415cf1a573fSOleksandr Tymoshenko void armv7_tlb_flushID_SE (u_int); 416457e64a0SIan Lepore void armv7_icache_sync_all (void); 417cf1a573fSOleksandr Tymoshenko void armv7_icache_sync_range (vm_offset_t, vm_size_t); 418cf1a573fSOleksandr Tymoshenko void armv7_idcache_wbinv_range (vm_offset_t, vm_size_t); 4194b7fcd31SIan Lepore void armv7_idcache_inv_all (void); 420cf1a573fSOleksandr Tymoshenko void armv7_dcache_wbinv_all (void); 421cf1a573fSOleksandr Tymoshenko void armv7_idcache_wbinv_all (void); 422cf1a573fSOleksandr Tymoshenko void armv7_dcache_wbinv_range (vm_offset_t, vm_size_t); 423cf1a573fSOleksandr Tymoshenko void armv7_dcache_inv_range (vm_offset_t, vm_size_t); 424cf1a573fSOleksandr Tymoshenko void armv7_dcache_wb_range (vm_offset_t, vm_size_t); 425cf1a573fSOleksandr Tymoshenko void armv7_cpu_sleep (int); 426cf1a573fSOleksandr Tymoshenko void armv7_setup (char *string); 427cf1a573fSOleksandr Tymoshenko void armv7_context_switch (void); 428cf1a573fSOleksandr Tymoshenko void armv7_drain_writebuf (void); 429cf1a573fSOleksandr Tymoshenko void armv7_sev (void); 4306afdadfdSIan Lepore void armv7_sleep (int unused); 431cf1a573fSOleksandr Tymoshenko u_int armv7_auxctrl (u_int, u_int); 432cf1a573fSOleksandr Tymoshenko void pj4bv7_setup (char *string); 433cf1a573fSOleksandr Tymoshenko void pj4b_config (void); 434cf1a573fSOleksandr Tymoshenko 435cf1a573fSOleksandr Tymoshenko int get_core_id (void); 436cf1a573fSOleksandr Tymoshenko 437cf1a573fSOleksandr Tymoshenko void armadaxp_idcache_wbinv_all (void); 438cf1a573fSOleksandr Tymoshenko 439cf1a573fSOleksandr Tymoshenko void cortexa_setup (char *); 44063b25978SWarner Losh #endif 44163b25978SWarner Losh 442c5f8f894SOleksandr Tymoshenko #if defined(CPU_ARM1136) || defined(CPU_ARM1176) 443c5f8f894SOleksandr Tymoshenko void arm11x6_setttb (u_int); 444c5f8f894SOleksandr Tymoshenko void arm11x6_idcache_wbinv_all (void); 445c5f8f894SOleksandr Tymoshenko void arm11x6_dcache_wbinv_all (void); 446c5f8f894SOleksandr Tymoshenko void arm11x6_icache_sync_all (void); 447c5f8f894SOleksandr Tymoshenko void arm11x6_flush_prefetchbuf (void); 448c5f8f894SOleksandr Tymoshenko void arm11x6_icache_sync_range (vm_offset_t, vm_size_t); 449c5f8f894SOleksandr Tymoshenko void arm11x6_idcache_wbinv_range (vm_offset_t, vm_size_t); 450c5f8f894SOleksandr Tymoshenko void arm11x6_setup (char *string); 451c5f8f894SOleksandr Tymoshenko void arm11x6_sleep (int); /* no ref. for errata */ 452c5f8f894SOleksandr Tymoshenko #endif 453c5f8f894SOleksandr Tymoshenko #if defined(CPU_ARM1136) 454c5f8f894SOleksandr Tymoshenko void arm1136_sleep_rev0 (int); /* for errata 336501 */ 455c5f8f894SOleksandr Tymoshenko #endif 456c5f8f894SOleksandr Tymoshenko 45763b25978SWarner Losh #if defined(CPU_ARM9E) || defined (CPU_ARM10) 45863b25978SWarner Losh void armv5_ec_setttb(u_int); 45963b25978SWarner Losh 46063b25978SWarner Losh void armv5_ec_icache_sync_all(void); 46163b25978SWarner Losh void armv5_ec_icache_sync_range(vm_offset_t, vm_size_t); 46263b25978SWarner Losh 46363b25978SWarner Losh void armv5_ec_dcache_wbinv_all(void); 46463b25978SWarner Losh void armv5_ec_dcache_wbinv_range(vm_offset_t, vm_size_t); 46563b25978SWarner Losh void armv5_ec_dcache_inv_range(vm_offset_t, vm_size_t); 46663b25978SWarner Losh void armv5_ec_dcache_wb_range(vm_offset_t, vm_size_t); 46763b25978SWarner Losh 46863b25978SWarner Losh void armv5_ec_idcache_wbinv_all(void); 46963b25978SWarner Losh void armv5_ec_idcache_wbinv_range(vm_offset_t, vm_size_t); 47063b25978SWarner Losh #endif 47163b25978SWarner Losh 472cf1a573fSOleksandr Tymoshenko #if defined (CPU_ARM10) 47363b25978SWarner Losh void armv5_setttb(u_int); 47463b25978SWarner Losh 47563b25978SWarner Losh void armv5_icache_sync_all(void); 47663b25978SWarner Losh void armv5_icache_sync_range(vm_offset_t, vm_size_t); 47763b25978SWarner Losh 47863b25978SWarner Losh void armv5_dcache_wbinv_all(void); 47963b25978SWarner Losh void armv5_dcache_wbinv_range(vm_offset_t, vm_size_t); 48063b25978SWarner Losh void armv5_dcache_inv_range(vm_offset_t, vm_size_t); 48163b25978SWarner Losh void armv5_dcache_wb_range(vm_offset_t, vm_size_t); 48263b25978SWarner Losh 48363b25978SWarner Losh void armv5_idcache_wbinv_all(void); 48463b25978SWarner Losh void armv5_idcache_wbinv_range(vm_offset_t, vm_size_t); 48563b25978SWarner Losh 48663b25978SWarner Losh extern unsigned armv5_dcache_sets_max; 48763b25978SWarner Losh extern unsigned armv5_dcache_sets_inc; 48863b25978SWarner Losh extern unsigned armv5_dcache_index_max; 48963b25978SWarner Losh extern unsigned armv5_dcache_index_inc; 49063b25978SWarner Losh #endif 49163b25978SWarner Losh 49263b25978SWarner Losh #if defined(CPU_ARM9) || defined(CPU_ARM9E) || defined(CPU_ARM10) || \ 4936fc729afSOlivier Houchard defined(CPU_XSCALE_80200) || defined(CPU_XSCALE_80321) || \ 49464c68f1cSKevin Lo defined(CPU_FA526) || defined(CPU_FA626TE) || \ 49511d1528cSOlivier Houchard defined(CPU_XSCALE_PXA2X0) || defined(CPU_XSCALE_IXP425) || \ 496676b1fbdSOlivier Houchard defined(CPU_XSCALE_80219) || defined(CPU_XSCALE_81342) 4976fc729afSOlivier Houchard 4986fc729afSOlivier Houchard void armv4_tlb_flushID (void); 4996fc729afSOlivier Houchard void armv4_tlb_flushI (void); 5006fc729afSOlivier Houchard void armv4_tlb_flushD (void); 5016fc729afSOlivier Houchard void armv4_tlb_flushD_SE (u_int va); 5026fc729afSOlivier Houchard 5036fc729afSOlivier Houchard void armv4_drain_writebuf (void); 5044b7fcd31SIan Lepore void armv4_idcache_inv_all (void); 5056fc729afSOlivier Houchard #endif 5066fc729afSOlivier Houchard 5076fc729afSOlivier Houchard #if defined(CPU_XSCALE_80200) || defined(CPU_XSCALE_80321) || \ 50811d1528cSOlivier Houchard defined(CPU_XSCALE_PXA2X0) || defined(CPU_XSCALE_IXP425) || \ 509676b1fbdSOlivier Houchard defined(CPU_XSCALE_80219) || defined(CPU_XSCALE_81342) 5106fc729afSOlivier Houchard void xscale_cpwait (void); 5116fc729afSOlivier Houchard 5126fc729afSOlivier Houchard void xscale_cpu_sleep (int mode); 5136fc729afSOlivier Houchard 5146fc729afSOlivier Houchard u_int xscale_control (u_int clear, u_int bic); 5156fc729afSOlivier Houchard 5166fc729afSOlivier Houchard void xscale_setttb (u_int ttb); 5176fc729afSOlivier Houchard 5186fc729afSOlivier Houchard void xscale_tlb_flushID_SE (u_int va); 5196fc729afSOlivier Houchard 5206fc729afSOlivier Houchard void xscale_cache_flushID (void); 5216fc729afSOlivier Houchard void xscale_cache_flushI (void); 5226fc729afSOlivier Houchard void xscale_cache_flushD (void); 5236fc729afSOlivier Houchard void xscale_cache_flushD_SE (u_int entry); 5246fc729afSOlivier Houchard 5256fc729afSOlivier Houchard void xscale_cache_cleanID (void); 5266fc729afSOlivier Houchard void xscale_cache_cleanD (void); 5276fc729afSOlivier Houchard void xscale_cache_cleanD_E (u_int entry); 5286fc729afSOlivier Houchard 5296fc729afSOlivier Houchard void xscale_cache_clean_minidata (void); 5306fc729afSOlivier Houchard 5316fc729afSOlivier Houchard void xscale_cache_purgeID (void); 5326fc729afSOlivier Houchard void xscale_cache_purgeID_E (u_int entry); 5336fc729afSOlivier Houchard void xscale_cache_purgeD (void); 5346fc729afSOlivier Houchard void xscale_cache_purgeD_E (u_int entry); 5356fc729afSOlivier Houchard 5366fc729afSOlivier Houchard void xscale_cache_syncI (void); 5376fc729afSOlivier Houchard void xscale_cache_cleanID_rng (vm_offset_t start, vm_size_t end); 5386fc729afSOlivier Houchard void xscale_cache_cleanD_rng (vm_offset_t start, vm_size_t end); 5396fc729afSOlivier Houchard void xscale_cache_purgeID_rng (vm_offset_t start, vm_size_t end); 5406fc729afSOlivier Houchard void xscale_cache_purgeD_rng (vm_offset_t start, vm_size_t end); 5416fc729afSOlivier Houchard void xscale_cache_syncI_rng (vm_offset_t start, vm_size_t end); 5426fc729afSOlivier Houchard void xscale_cache_flushD_rng (vm_offset_t start, vm_size_t end); 5436fc729afSOlivier Houchard 5446fc729afSOlivier Houchard void xscale_context_switch (void); 5456fc729afSOlivier Houchard 5466fc729afSOlivier Houchard void xscale_setup (char *string); 54711d1528cSOlivier Houchard #endif /* CPU_XSCALE_80200 || CPU_XSCALE_80321 || CPU_XSCALE_PXA2X0 || CPU_XSCALE_IXP425 54811d1528cSOlivier Houchard CPU_XSCALE_80219 */ 5496fc729afSOlivier Houchard 550676b1fbdSOlivier Houchard #ifdef CPU_XSCALE_81342 551676b1fbdSOlivier Houchard 552425b5be3SOlivier Houchard void xscalec3_l2cache_purge (void); 553425b5be3SOlivier Houchard void xscalec3_cache_purgeID (void); 554425b5be3SOlivier Houchard void xscalec3_cache_purgeD (void); 555676b1fbdSOlivier Houchard void xscalec3_cache_cleanID (void); 556676b1fbdSOlivier Houchard void xscalec3_cache_cleanD (void); 557676b1fbdSOlivier Houchard void xscalec3_cache_syncI (void); 558425b5be3SOlivier Houchard 559676b1fbdSOlivier Houchard void xscalec3_cache_purgeID_rng (vm_offset_t start, vm_size_t end); 560676b1fbdSOlivier Houchard void xscalec3_cache_purgeD_rng (vm_offset_t start, vm_size_t end); 561425b5be3SOlivier Houchard void xscalec3_cache_cleanID_rng (vm_offset_t start, vm_size_t end); 562425b5be3SOlivier Houchard void xscalec3_cache_cleanD_rng (vm_offset_t start, vm_size_t end); 563425b5be3SOlivier Houchard void xscalec3_cache_syncI_rng (vm_offset_t start, vm_size_t end); 564425b5be3SOlivier Houchard 565425b5be3SOlivier Houchard void xscalec3_l2cache_flush_rng (vm_offset_t, vm_size_t); 566425b5be3SOlivier Houchard void xscalec3_l2cache_clean_rng (vm_offset_t start, vm_size_t end); 567425b5be3SOlivier Houchard void xscalec3_l2cache_purge_rng (vm_offset_t start, vm_size_t end); 568676b1fbdSOlivier Houchard 569676b1fbdSOlivier Houchard 570676b1fbdSOlivier Houchard void xscalec3_setttb (u_int ttb); 571676b1fbdSOlivier Houchard void xscalec3_context_switch (void); 572676b1fbdSOlivier Houchard 573676b1fbdSOlivier Houchard #endif /* CPU_XSCALE_81342 */ 574676b1fbdSOlivier Houchard 5756fc729afSOlivier Houchard #define tlb_flush cpu_tlb_flushID 5766fc729afSOlivier Houchard #define setttb cpu_setttb 5776fc729afSOlivier Houchard #define drain_writebuf cpu_drain_writebuf 5786fc729afSOlivier Houchard 5796fc729afSOlivier Houchard /* 5806fc729afSOlivier Houchard * Macros for manipulating CPU interrupts 5816fc729afSOlivier Houchard */ 5826fc729afSOlivier Houchard static __inline u_int32_t __set_cpsr_c(u_int bic, u_int eor) __attribute__((__unused__)); 5836fc729afSOlivier Houchard 5846fc729afSOlivier Houchard static __inline u_int32_t 5856fc729afSOlivier Houchard __set_cpsr_c(u_int bic, u_int eor) 5866fc729afSOlivier Houchard { 5876fc729afSOlivier Houchard u_int32_t tmp, ret; 5886fc729afSOlivier Houchard 5896fc729afSOlivier Houchard __asm __volatile( 5906fc729afSOlivier Houchard "mrs %0, cpsr\n" /* Get the CPSR */ 5916fc729afSOlivier Houchard "bic %1, %0, %2\n" /* Clear bits */ 5926fc729afSOlivier Houchard "eor %1, %1, %3\n" /* XOR bits */ 5936fc729afSOlivier Houchard "msr cpsr_c, %1\n" /* Set the control field of CPSR */ 5946fc729afSOlivier Houchard : "=&r" (ret), "=&r" (tmp) 59524e01b0cSOlivier Houchard : "r" (bic), "r" (eor) : "memory"); 5966fc729afSOlivier Houchard 5976fc729afSOlivier Houchard return ret; 5986fc729afSOlivier Houchard } 5996fc729afSOlivier Houchard 600dfad9244SMarcel Moolenaar #define ARM_CPSR_F32 (1 << 6) /* FIQ disable */ 601dfad9244SMarcel Moolenaar #define ARM_CPSR_I32 (1 << 7) /* IRQ disable */ 602dfad9244SMarcel Moolenaar 6036fc729afSOlivier Houchard #define disable_interrupts(mask) \ 604dfad9244SMarcel Moolenaar (__set_cpsr_c((mask) & (ARM_CPSR_I32 | ARM_CPSR_F32), \ 605dfad9244SMarcel Moolenaar (mask) & (ARM_CPSR_I32 | ARM_CPSR_F32))) 6066fc729afSOlivier Houchard 6076fc729afSOlivier Houchard #define enable_interrupts(mask) \ 608dfad9244SMarcel Moolenaar (__set_cpsr_c((mask) & (ARM_CPSR_I32 | ARM_CPSR_F32), 0)) 6096fc729afSOlivier Houchard 6106fc729afSOlivier Houchard #define restore_interrupts(old_cpsr) \ 611dfad9244SMarcel Moolenaar (__set_cpsr_c((ARM_CPSR_I32 | ARM_CPSR_F32), \ 612dfad9244SMarcel Moolenaar (old_cpsr) & (ARM_CPSR_I32 | ARM_CPSR_F32))) 6136fc729afSOlivier Houchard 614dfad9244SMarcel Moolenaar static __inline register_t 615dfad9244SMarcel Moolenaar intr_disable(void) 616dfad9244SMarcel Moolenaar { 617dfad9244SMarcel Moolenaar register_t s; 618dfad9244SMarcel Moolenaar 619dfad9244SMarcel Moolenaar s = disable_interrupts(ARM_CPSR_I32 | ARM_CPSR_F32); 620dfad9244SMarcel Moolenaar return (s); 621dfad9244SMarcel Moolenaar } 622dfad9244SMarcel Moolenaar 623dfad9244SMarcel Moolenaar static __inline void 624dfad9244SMarcel Moolenaar intr_restore(register_t s) 625dfad9244SMarcel Moolenaar { 626dfad9244SMarcel Moolenaar 627dfad9244SMarcel Moolenaar restore_interrupts(s); 628dfad9244SMarcel Moolenaar } 629dfad9244SMarcel Moolenaar 6306fc729afSOlivier Houchard /* Functions to manipulate the CPSR. */ 6316fc729afSOlivier Houchard u_int SetCPSR(u_int bic, u_int eor); 6326fc729afSOlivier Houchard u_int GetCPSR(void); 6336fc729afSOlivier Houchard 6346fc729afSOlivier Houchard /* 6356fc729afSOlivier Houchard * Functions to manipulate cpu r13 6366fc729afSOlivier Houchard * (in arm/arm32/setstack.S) 6376fc729afSOlivier Houchard */ 6386fc729afSOlivier Houchard 6394eaa43e6SKevin Lo void set_stackptr (u_int mode, u_int address); 6404eaa43e6SKevin Lo u_int get_stackptr (u_int mode); 6416fc729afSOlivier Houchard 6426fc729afSOlivier Houchard /* 6436fc729afSOlivier Houchard * Miscellany 6446fc729afSOlivier Houchard */ 6456fc729afSOlivier Houchard 6464eaa43e6SKevin Lo int get_pc_str_offset (void); 6476fc729afSOlivier Houchard 6486fc729afSOlivier Houchard /* 6496fc729afSOlivier Houchard * CPU functions from locore.S 6506fc729afSOlivier Houchard */ 6516fc729afSOlivier Houchard 6524eaa43e6SKevin Lo void cpu_reset (void) __attribute__((__noreturn__)); 6536fc729afSOlivier Houchard 6546fc729afSOlivier Houchard /* 6556fc729afSOlivier Houchard * Cache info variables. 6566fc729afSOlivier Houchard */ 6576fc729afSOlivier Houchard 6586fc729afSOlivier Houchard /* PRIMARY CACHE VARIABLES */ 6596fc729afSOlivier Houchard extern int arm_picache_size; 6606fc729afSOlivier Houchard extern int arm_picache_line_size; 6616fc729afSOlivier Houchard extern int arm_picache_ways; 6626fc729afSOlivier Houchard 6636fc729afSOlivier Houchard extern int arm_pdcache_size; /* and unified */ 6646fc729afSOlivier Houchard extern int arm_pdcache_line_size; 6656fc729afSOlivier Houchard extern int arm_pdcache_ways; 6666fc729afSOlivier Houchard 6676fc729afSOlivier Houchard extern int arm_pcache_type; 6686fc729afSOlivier Houchard extern int arm_pcache_unified; 6696fc729afSOlivier Houchard 6706fc729afSOlivier Houchard extern int arm_dcache_align; 6716fc729afSOlivier Houchard extern int arm_dcache_align_mask; 6726fc729afSOlivier Houchard 673cf1a573fSOleksandr Tymoshenko extern u_int arm_cache_level; 674cf1a573fSOleksandr Tymoshenko extern u_int arm_cache_loc; 675cf1a573fSOleksandr Tymoshenko extern u_int arm_cache_type[14]; 676cf1a573fSOleksandr Tymoshenko 6776fc729afSOlivier Houchard #endif /* _KERNEL */ 6786fc729afSOlivier Houchard #endif /* _MACHINE_CPUFUNC_H_ */ 6796fc729afSOlivier Houchard 6806fc729afSOlivier Houchard /* End of cpufunc.h */ 681