16fc729afSOlivier Houchard /* $NetBSD: cpufunc.h,v 1.29 2003/09/06 09:08:35 rearnsha Exp $ */ 26fc729afSOlivier Houchard 3d8315c79SWarner Losh /*- 4*af3dc4a7SPedro F. Giffuni * SPDX-License-Identifier: BSD-4-Clause 5*af3dc4a7SPedro F. Giffuni * 66fc729afSOlivier Houchard * Copyright (c) 1997 Mark Brinicombe. 76fc729afSOlivier Houchard * Copyright (c) 1997 Causality Limited 86fc729afSOlivier Houchard * All rights reserved. 96fc729afSOlivier Houchard * 106fc729afSOlivier Houchard * Redistribution and use in source and binary forms, with or without 116fc729afSOlivier Houchard * modification, are permitted provided that the following conditions 126fc729afSOlivier Houchard * are met: 136fc729afSOlivier Houchard * 1. Redistributions of source code must retain the above copyright 146fc729afSOlivier Houchard * notice, this list of conditions and the following disclaimer. 156fc729afSOlivier Houchard * 2. Redistributions in binary form must reproduce the above copyright 166fc729afSOlivier Houchard * notice, this list of conditions and the following disclaimer in the 176fc729afSOlivier Houchard * documentation and/or other materials provided with the distribution. 186fc729afSOlivier Houchard * 3. All advertising materials mentioning features or use of this software 196fc729afSOlivier Houchard * must display the following acknowledgement: 206fc729afSOlivier Houchard * This product includes software developed by Causality Limited. 216fc729afSOlivier Houchard * 4. The name of Causality Limited may not be used to endorse or promote 226fc729afSOlivier Houchard * products derived from this software without specific prior written 236fc729afSOlivier Houchard * permission. 246fc729afSOlivier Houchard * 256fc729afSOlivier Houchard * THIS SOFTWARE IS PROVIDED BY CAUSALITY LIMITED ``AS IS'' AND ANY EXPRESS 266fc729afSOlivier Houchard * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 276fc729afSOlivier Houchard * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 286fc729afSOlivier Houchard * DISCLAIMED. IN NO EVENT SHALL CAUSALITY LIMITED BE LIABLE FOR ANY DIRECT, 296fc729afSOlivier Houchard * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 306fc729afSOlivier Houchard * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR 316fc729afSOlivier Houchard * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 326fc729afSOlivier Houchard * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 336fc729afSOlivier Houchard * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 346fc729afSOlivier Houchard * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 356fc729afSOlivier Houchard * SUCH DAMAGE. 366fc729afSOlivier Houchard * 376fc729afSOlivier Houchard * RiscBSD kernel project 386fc729afSOlivier Houchard * 396fc729afSOlivier Houchard * cpufunc.h 406fc729afSOlivier Houchard * 416fc729afSOlivier Houchard * Prototypes for cpu, mmu and tlb related functions. 426fc729afSOlivier Houchard * 436fc729afSOlivier Houchard * $FreeBSD$ 446fc729afSOlivier Houchard */ 456fc729afSOlivier Houchard 466fc729afSOlivier Houchard #ifndef _MACHINE_CPUFUNC_H_ 476fc729afSOlivier Houchard #define _MACHINE_CPUFUNC_H_ 486fc729afSOlivier Houchard 496fc729afSOlivier Houchard #ifdef _KERNEL 506fc729afSOlivier Houchard 516fc729afSOlivier Houchard #include <sys/types.h> 525fcbe89aSMichal Meloun #include <machine/armreg.h> 536fc729afSOlivier Houchard 544628245bSOlivier Houchard static __inline void 554628245bSOlivier Houchard breakpoint(void) 564628245bSOlivier Houchard { 573488a2f7SOlivier Houchard __asm(".word 0xe7ffffff"); 584628245bSOlivier Houchard } 59be687a0dSOlivier Houchard 606fc729afSOlivier Houchard struct cpu_functions { 616fc729afSOlivier Houchard 626fc729afSOlivier Houchard /* CPU functions */ 63610d93d8SAndrew Turner #if __ARM_ARCH < 6 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_setttb) (u_int ttb); 706fc729afSOlivier Houchard 716fc729afSOlivier Houchard /* TLB functions */ 726fc729afSOlivier Houchard 736fc729afSOlivier Houchard void (*cf_tlb_flushID) (void); 746fc729afSOlivier Houchard void (*cf_tlb_flushID_SE) (u_int va); 756fc729afSOlivier Houchard void (*cf_tlb_flushD) (void); 766fc729afSOlivier Houchard void (*cf_tlb_flushD_SE) (u_int va); 776fc729afSOlivier Houchard 786fc729afSOlivier Houchard /* 796fc729afSOlivier Houchard * Cache operations: 806fc729afSOlivier Houchard * 816fc729afSOlivier Houchard * We define the following primitives: 826fc729afSOlivier Houchard * 836fc729afSOlivier Houchard * icache_sync_range Synchronize I-cache range 846fc729afSOlivier Houchard * 856fc729afSOlivier Houchard * dcache_wbinv_all Write-back and Invalidate D-cache 866fc729afSOlivier Houchard * dcache_wbinv_range Write-back and Invalidate D-cache range 876fc729afSOlivier Houchard * dcache_inv_range Invalidate D-cache range 886fc729afSOlivier Houchard * dcache_wb_range Write-back D-cache range 896fc729afSOlivier Houchard * 906fc729afSOlivier Houchard * idcache_wbinv_all Write-back and Invalidate D-cache, 916fc729afSOlivier Houchard * Invalidate I-cache 926fc729afSOlivier Houchard * idcache_wbinv_range Write-back and Invalidate D-cache, 936fc729afSOlivier Houchard * Invalidate I-cache range 946fc729afSOlivier Houchard * 956fc729afSOlivier Houchard * Note that the ARM term for "write-back" is "clean". We use 966fc729afSOlivier Houchard * the term "write-back" since it's a more common way to describe 976fc729afSOlivier Houchard * the operation. 986fc729afSOlivier Houchard * 996fc729afSOlivier Houchard * There are some rules that must be followed: 1006fc729afSOlivier Houchard * 1014b7fcd31SIan Lepore * ID-cache Invalidate All: 1024b7fcd31SIan Lepore * Unlike other functions, this one must never write back. 1034b7fcd31SIan Lepore * It is used to intialize the MMU when it is in an unknown 1044b7fcd31SIan Lepore * state (such as when it may have lines tagged as valid 1054b7fcd31SIan Lepore * that belong to a previous set of mappings). 1064b7fcd31SIan Lepore * 107d397c7a0SMichal Meloun * I-cache Sync range: 1086fc729afSOlivier Houchard * The goal is to synchronize the instruction stream, 1096fc729afSOlivier Houchard * so you may beed to write-back dirty D-cache blocks 1106fc729afSOlivier Houchard * first. If a range is requested, and you can't 1116fc729afSOlivier Houchard * synchronize just a range, you have to hit the whole 1126fc729afSOlivier Houchard * thing. 1136fc729afSOlivier Houchard * 1146fc729afSOlivier Houchard * D-cache Write-Back and Invalidate range: 1156fc729afSOlivier Houchard * If you can't WB-Inv a range, you must WB-Inv the 1166fc729afSOlivier Houchard * entire D-cache. 1176fc729afSOlivier Houchard * 1186fc729afSOlivier Houchard * D-cache Invalidate: 1196fc729afSOlivier Houchard * If you can't Inv the D-cache, you must Write-Back 1206fc729afSOlivier Houchard * and Invalidate. Code that uses this operation 1216fc729afSOlivier Houchard * MUST NOT assume that the D-cache will not be written 1226fc729afSOlivier Houchard * back to memory. 1236fc729afSOlivier Houchard * 1246fc729afSOlivier Houchard * D-cache Write-Back: 1256fc729afSOlivier Houchard * If you can't Write-back without doing an Inv, 1266fc729afSOlivier Houchard * that's fine. Then treat this as a WB-Inv. 1276fc729afSOlivier Houchard * Skipping the invalidate is merely an optimization. 1286fc729afSOlivier Houchard * 1296fc729afSOlivier Houchard * All operations: 1306fc729afSOlivier Houchard * Valid virtual addresses must be passed to each 1316fc729afSOlivier Houchard * cache operation. 1326fc729afSOlivier Houchard */ 1336fc729afSOlivier Houchard void (*cf_icache_sync_range) (vm_offset_t, vm_size_t); 1346fc729afSOlivier Houchard 1356fc729afSOlivier Houchard void (*cf_dcache_wbinv_all) (void); 1366fc729afSOlivier Houchard void (*cf_dcache_wbinv_range) (vm_offset_t, vm_size_t); 1376fc729afSOlivier Houchard void (*cf_dcache_inv_range) (vm_offset_t, vm_size_t); 1386fc729afSOlivier Houchard void (*cf_dcache_wb_range) (vm_offset_t, vm_size_t); 1396fc729afSOlivier Houchard 1404b7fcd31SIan Lepore void (*cf_idcache_inv_all) (void); 1416fc729afSOlivier Houchard void (*cf_idcache_wbinv_all) (void); 1426fc729afSOlivier Houchard void (*cf_idcache_wbinv_range) (vm_offset_t, vm_size_t); 143610d93d8SAndrew Turner #endif 144425b5be3SOlivier Houchard void (*cf_l2cache_wbinv_all) (void); 145425b5be3SOlivier Houchard void (*cf_l2cache_wbinv_range) (vm_offset_t, vm_size_t); 146425b5be3SOlivier Houchard void (*cf_l2cache_inv_range) (vm_offset_t, vm_size_t); 147425b5be3SOlivier Houchard void (*cf_l2cache_wb_range) (vm_offset_t, vm_size_t); 148b07d0cbcSIan Lepore void (*cf_l2cache_drain_writebuf) (void); 1496fc729afSOlivier Houchard 1506fc729afSOlivier Houchard /* Other functions */ 1516fc729afSOlivier Houchard 1529567accaSMichal Meloun #if __ARM_ARCH < 6 1536fc729afSOlivier Houchard void (*cf_drain_writebuf) (void); 1549567accaSMichal Meloun #endif 1556fc729afSOlivier Houchard 1566fc729afSOlivier Houchard void (*cf_sleep) (int mode); 1576fc729afSOlivier Houchard 158610d93d8SAndrew Turner #if __ARM_ARCH < 6 1596fc729afSOlivier Houchard /* Soft functions */ 1606fc729afSOlivier Houchard 1616fc729afSOlivier Houchard void (*cf_context_switch) (void); 162610d93d8SAndrew Turner #endif 1636fc729afSOlivier Houchard 1649a25f3e8SAndrew Turner void (*cf_setup) (void); 1656fc729afSOlivier Houchard }; 1666fc729afSOlivier Houchard 1676fc729afSOlivier Houchard extern struct cpu_functions cpufuncs; 1686fc729afSOlivier Houchard extern u_int cputype; 1696fc729afSOlivier Houchard 170a89156f5SMichal Meloun #if __ARM_ARCH < 6 1716fc729afSOlivier Houchard #define cpu_cpwait() cpufuncs.cf_cpwait() 1726fc729afSOlivier Houchard 1736fc729afSOlivier Houchard #define cpu_control(c, e) cpufuncs.cf_control(c, e) 1746fc729afSOlivier Houchard #define cpu_setttb(t) cpufuncs.cf_setttb(t) 1756fc729afSOlivier Houchard 1766fc729afSOlivier Houchard #define cpu_tlb_flushID() cpufuncs.cf_tlb_flushID() 1776fc729afSOlivier Houchard #define cpu_tlb_flushID_SE(e) cpufuncs.cf_tlb_flushID_SE(e) 1786fc729afSOlivier Houchard #define cpu_tlb_flushD() cpufuncs.cf_tlb_flushD() 1796fc729afSOlivier Houchard #define cpu_tlb_flushD_SE(e) cpufuncs.cf_tlb_flushD_SE(e) 1806fc729afSOlivier Houchard 1816fc729afSOlivier Houchard #define cpu_icache_sync_range(a, s) cpufuncs.cf_icache_sync_range((a), (s)) 1826fc729afSOlivier Houchard 1836fc729afSOlivier Houchard #define cpu_dcache_wbinv_all() cpufuncs.cf_dcache_wbinv_all() 1846fc729afSOlivier Houchard #define cpu_dcache_wbinv_range(a, s) cpufuncs.cf_dcache_wbinv_range((a), (s)) 1856fc729afSOlivier Houchard #define cpu_dcache_inv_range(a, s) cpufuncs.cf_dcache_inv_range((a), (s)) 1866fc729afSOlivier Houchard #define cpu_dcache_wb_range(a, s) cpufuncs.cf_dcache_wb_range((a), (s)) 1876fc729afSOlivier Houchard 1884b7fcd31SIan Lepore #define cpu_idcache_inv_all() cpufuncs.cf_idcache_inv_all() 1896fc729afSOlivier Houchard #define cpu_idcache_wbinv_all() cpufuncs.cf_idcache_wbinv_all() 1906fc729afSOlivier Houchard #define cpu_idcache_wbinv_range(a, s) cpufuncs.cf_idcache_wbinv_range((a), (s)) 191a89156f5SMichal Meloun #endif 192c5bf621bSAndrew Turner 193425b5be3SOlivier Houchard #define cpu_l2cache_wbinv_all() cpufuncs.cf_l2cache_wbinv_all() 194425b5be3SOlivier Houchard #define cpu_l2cache_wb_range(a, s) cpufuncs.cf_l2cache_wb_range((a), (s)) 195425b5be3SOlivier Houchard #define cpu_l2cache_inv_range(a, s) cpufuncs.cf_l2cache_inv_range((a), (s)) 196425b5be3SOlivier Houchard #define cpu_l2cache_wbinv_range(a, s) cpufuncs.cf_l2cache_wbinv_range((a), (s)) 197b07d0cbcSIan Lepore #define cpu_l2cache_drain_writebuf() cpufuncs.cf_l2cache_drain_writebuf() 1986fc729afSOlivier Houchard 199a89156f5SMichal Meloun #if __ARM_ARCH < 6 2006fc729afSOlivier Houchard #define cpu_drain_writebuf() cpufuncs.cf_drain_writebuf() 201a89156f5SMichal Meloun #endif 2026fc729afSOlivier Houchard #define cpu_sleep(m) cpufuncs.cf_sleep(m) 2036fc729afSOlivier Houchard 2049a25f3e8SAndrew Turner #define cpu_setup() cpufuncs.cf_setup() 2056fc729afSOlivier Houchard 2066fc729afSOlivier Houchard int set_cpufuncs (void); 2076fc729afSOlivier Houchard #define ARCHITECTURE_NOT_PRESENT 1 /* known but not configured */ 2086fc729afSOlivier Houchard #define ARCHITECTURE_NOT_SUPPORTED 2 /* not known */ 2096fc729afSOlivier Houchard 2106fc729afSOlivier Houchard void cpufunc_nullop (void); 211bf488b9dSMichal Meloun u_int cpu_ident (void); 2126fc729afSOlivier Houchard u_int cpufunc_control (u_int clear, u_int bic); 213bf488b9dSMichal Meloun void cpu_domains (u_int domains); 214bf488b9dSMichal Meloun u_int cpu_faultstatus (void); 215bf488b9dSMichal Meloun u_int cpu_faultaddress (void); 2160b5afe4aSMichal Meloun u_int cpu_get_control (void); 217cf1a573fSOleksandr Tymoshenko u_int cpu_pfr (int); 2186fc729afSOlivier Houchard 219303c8079SAndrew Turner #if defined(CPU_FA526) 2209a25f3e8SAndrew Turner void fa526_setup (void); 221381a19ccSRui Paulo void fa526_setttb (u_int ttb); 222381a19ccSRui Paulo void fa526_context_switch (void); 223381a19ccSRui Paulo void fa526_cpu_sleep (int); 224381a19ccSRui Paulo void fa526_tlb_flushID_SE (u_int); 225381a19ccSRui Paulo 226381a19ccSRui Paulo void fa526_icache_sync_range(vm_offset_t start, vm_size_t end); 227381a19ccSRui Paulo void fa526_dcache_wbinv_all (void); 228381a19ccSRui Paulo void fa526_dcache_wbinv_range(vm_offset_t start, vm_size_t end); 229381a19ccSRui Paulo void fa526_dcache_inv_range (vm_offset_t start, vm_size_t end); 230381a19ccSRui Paulo void fa526_dcache_wb_range (vm_offset_t start, vm_size_t end); 231381a19ccSRui Paulo void fa526_idcache_wbinv_all(void); 232381a19ccSRui Paulo void fa526_idcache_wbinv_range(vm_offset_t start, vm_size_t end); 233381a19ccSRui Paulo #endif 234381a19ccSRui Paulo 235381a19ccSRui Paulo 236e3f95afdSMichal Meloun #if defined(CPU_ARM9) || defined(CPU_ARM9E) 2376fc729afSOlivier Houchard void arm9_setttb (u_int); 2386fc729afSOlivier Houchard void arm9_tlb_flushID_SE (u_int va); 239e3f95afdSMichal Meloun void arm9_context_switch (void); 240e3f95afdSMichal Meloun #endif 2416fc729afSOlivier Houchard 242e3f95afdSMichal Meloun #if defined(CPU_ARM9) 2434eaa43e6SKevin Lo void arm9_icache_sync_range (vm_offset_t, vm_size_t); 2446fc729afSOlivier Houchard 2454eaa43e6SKevin Lo void arm9_dcache_wbinv_all (void); 2464eaa43e6SKevin Lo void arm9_dcache_wbinv_range (vm_offset_t, vm_size_t); 2474eaa43e6SKevin Lo void arm9_dcache_inv_range (vm_offset_t, vm_size_t); 2484eaa43e6SKevin Lo void arm9_dcache_wb_range (vm_offset_t, vm_size_t); 2496fc729afSOlivier Houchard 2504eaa43e6SKevin Lo void arm9_idcache_wbinv_all (void); 2514eaa43e6SKevin Lo void arm9_idcache_wbinv_range (vm_offset_t, vm_size_t); 2526fc729afSOlivier Houchard 2539a25f3e8SAndrew Turner void arm9_setup (void); 254094df973SOlivier Houchard 255094df973SOlivier Houchard extern unsigned arm9_dcache_sets_max; 256094df973SOlivier Houchard extern unsigned arm9_dcache_sets_inc; 257094df973SOlivier Houchard extern unsigned arm9_dcache_index_max; 258094df973SOlivier Houchard extern unsigned arm9_dcache_index_inc; 2596fc729afSOlivier Houchard #endif 2606fc729afSOlivier Houchard 2617a959e49SAndrew Turner #if defined(CPU_ARM9E) 2629a25f3e8SAndrew Turner void arm10_setup (void); 2636fc729afSOlivier Houchard 2641ee5b3b4SRafal Jaworowski u_int sheeva_control_ext (u_int, u_int); 265cfa892b5SAlexander Motin void sheeva_cpu_sleep (int); 2661ee5b3b4SRafal Jaworowski void sheeva_setttb (u_int); 2671ee5b3b4SRafal Jaworowski void sheeva_dcache_wbinv_range (vm_offset_t, vm_size_t); 2681ee5b3b4SRafal Jaworowski void sheeva_dcache_inv_range (vm_offset_t, vm_size_t); 2691ee5b3b4SRafal Jaworowski void sheeva_dcache_wb_range (vm_offset_t, vm_size_t); 2701ee5b3b4SRafal Jaworowski void sheeva_idcache_wbinv_range (vm_offset_t, vm_size_t); 271ba6faad6SRafal Jaworowski 2721ee5b3b4SRafal Jaworowski void sheeva_l2cache_wbinv_range (vm_offset_t, vm_size_t); 2731ee5b3b4SRafal Jaworowski void sheeva_l2cache_inv_range (vm_offset_t, vm_size_t); 2741ee5b3b4SRafal Jaworowski void sheeva_l2cache_wb_range (vm_offset_t, vm_size_t); 2751ee5b3b4SRafal Jaworowski void sheeva_l2cache_wbinv_all (void); 2766fc729afSOlivier Houchard #endif 2776fc729afSOlivier Houchard 27865328620SAndrew Turner #if defined(CPU_MV_PJ4B) 279cf1a573fSOleksandr Tymoshenko void armv6_idcache_wbinv_all (void); 28065328620SAndrew Turner #endif 28193a065e7SMichal Meloun #if defined(CPU_CORTEXA) || defined(CPU_MV_PJ4B) || defined(CPU_KRAIT) 282cf1a573fSOleksandr Tymoshenko void armv7_idcache_wbinv_all (void); 283cf1a573fSOleksandr Tymoshenko void armv7_cpu_sleep (int); 2849a25f3e8SAndrew Turner void armv7_setup (void); 285cf1a573fSOleksandr Tymoshenko void armv7_drain_writebuf (void); 286cf1a573fSOleksandr Tymoshenko 2879a25f3e8SAndrew Turner void cortexa_setup (void); 28863b25978SWarner Losh #endif 28937b25ee6SAndrew Turner #if defined(CPU_MV_PJ4B) 29037b25ee6SAndrew Turner void pj4b_config (void); 29137b25ee6SAndrew Turner void pj4bv7_setup (void); 29237b25ee6SAndrew Turner #endif 29363b25978SWarner Losh 294930798f3SAndrew Turner #if defined(CPU_ARM1176) 29565328620SAndrew Turner void arm11_drain_writebuf (void); 29665328620SAndrew Turner 2979a25f3e8SAndrew Turner void arm11x6_setup (void); 298c5f8f894SOleksandr Tymoshenko void arm11x6_sleep (int); /* no ref. for errata */ 299c5f8f894SOleksandr Tymoshenko #endif 300c5f8f894SOleksandr Tymoshenko 3017a959e49SAndrew Turner #if defined(CPU_ARM9E) 30263b25978SWarner Losh void armv5_ec_setttb(u_int); 30363b25978SWarner Losh 30463b25978SWarner Losh void armv5_ec_icache_sync_range(vm_offset_t, vm_size_t); 30563b25978SWarner Losh 30663b25978SWarner Losh void armv5_ec_dcache_wbinv_all(void); 30763b25978SWarner Losh void armv5_ec_dcache_wbinv_range(vm_offset_t, vm_size_t); 30863b25978SWarner Losh void armv5_ec_dcache_inv_range(vm_offset_t, vm_size_t); 30963b25978SWarner Losh void armv5_ec_dcache_wb_range(vm_offset_t, vm_size_t); 31063b25978SWarner Losh 31163b25978SWarner Losh void armv5_ec_idcache_wbinv_all(void); 31263b25978SWarner Losh void armv5_ec_idcache_wbinv_range(vm_offset_t, vm_size_t); 31363b25978SWarner Losh #endif 31463b25978SWarner Losh 3157a959e49SAndrew Turner #if defined(CPU_ARM9) || defined(CPU_ARM9E) || \ 316303c8079SAndrew Turner defined(CPU_FA526) || \ 31711d1528cSOlivier Houchard defined(CPU_XSCALE_PXA2X0) || defined(CPU_XSCALE_IXP425) || \ 318afdcfee4SMichal Meloun defined(CPU_XSCALE_81342) 3196fc729afSOlivier Houchard 3206fc729afSOlivier Houchard void armv4_tlb_flushID (void); 3216fc729afSOlivier Houchard void armv4_tlb_flushD (void); 3226fc729afSOlivier Houchard void armv4_tlb_flushD_SE (u_int va); 3236fc729afSOlivier Houchard 3246fc729afSOlivier Houchard void armv4_drain_writebuf (void); 3254b7fcd31SIan Lepore void armv4_idcache_inv_all (void); 3266fc729afSOlivier Houchard #endif 3276fc729afSOlivier Houchard 328afdcfee4SMichal Meloun #if defined(CPU_XSCALE_PXA2X0) || defined(CPU_XSCALE_IXP425) || \ 329afdcfee4SMichal Meloun defined(CPU_XSCALE_81342) 3306fc729afSOlivier Houchard void xscale_cpwait (void); 3316fc729afSOlivier Houchard 3326fc729afSOlivier Houchard void xscale_cpu_sleep (int mode); 3336fc729afSOlivier Houchard 3346fc729afSOlivier Houchard u_int xscale_control (u_int clear, u_int bic); 3356fc729afSOlivier Houchard 3366fc729afSOlivier Houchard void xscale_setttb (u_int ttb); 3376fc729afSOlivier Houchard 3386fc729afSOlivier Houchard void xscale_tlb_flushID_SE (u_int va); 3396fc729afSOlivier Houchard 3406fc729afSOlivier Houchard void xscale_cache_flushID (void); 3416fc729afSOlivier Houchard void xscale_cache_flushI (void); 3426fc729afSOlivier Houchard void xscale_cache_flushD (void); 3436fc729afSOlivier Houchard void xscale_cache_flushD_SE (u_int entry); 3446fc729afSOlivier Houchard 3456fc729afSOlivier Houchard void xscale_cache_cleanID (void); 3466fc729afSOlivier Houchard void xscale_cache_cleanD (void); 3476fc729afSOlivier Houchard void xscale_cache_cleanD_E (u_int entry); 3486fc729afSOlivier Houchard 3496fc729afSOlivier Houchard void xscale_cache_clean_minidata (void); 3506fc729afSOlivier Houchard 3516fc729afSOlivier Houchard void xscale_cache_purgeID (void); 3526fc729afSOlivier Houchard void xscale_cache_purgeID_E (u_int entry); 3536fc729afSOlivier Houchard void xscale_cache_purgeD (void); 3546fc729afSOlivier Houchard void xscale_cache_purgeD_E (u_int entry); 3556fc729afSOlivier Houchard 3566fc729afSOlivier Houchard void xscale_cache_syncI (void); 3576fc729afSOlivier Houchard void xscale_cache_cleanID_rng (vm_offset_t start, vm_size_t end); 3586fc729afSOlivier Houchard void xscale_cache_cleanD_rng (vm_offset_t start, vm_size_t end); 3596fc729afSOlivier Houchard void xscale_cache_purgeID_rng (vm_offset_t start, vm_size_t end); 3606fc729afSOlivier Houchard void xscale_cache_purgeD_rng (vm_offset_t start, vm_size_t end); 3616fc729afSOlivier Houchard void xscale_cache_syncI_rng (vm_offset_t start, vm_size_t end); 3626fc729afSOlivier Houchard void xscale_cache_flushD_rng (vm_offset_t start, vm_size_t end); 3636fc729afSOlivier Houchard 3646fc729afSOlivier Houchard void xscale_context_switch (void); 3656fc729afSOlivier Houchard 3669a25f3e8SAndrew Turner void xscale_setup (void); 367afdcfee4SMichal Meloun #endif /* CPU_XSCALE_PXA2X0 || CPU_XSCALE_IXP425 */ 3686fc729afSOlivier Houchard 369676b1fbdSOlivier Houchard #ifdef CPU_XSCALE_81342 370676b1fbdSOlivier Houchard 371425b5be3SOlivier Houchard void xscalec3_l2cache_purge (void); 372425b5be3SOlivier Houchard void xscalec3_cache_purgeID (void); 373425b5be3SOlivier Houchard void xscalec3_cache_purgeD (void); 374676b1fbdSOlivier Houchard void xscalec3_cache_cleanID (void); 375676b1fbdSOlivier Houchard void xscalec3_cache_cleanD (void); 376676b1fbdSOlivier Houchard void xscalec3_cache_syncI (void); 377425b5be3SOlivier Houchard 378676b1fbdSOlivier Houchard void xscalec3_cache_purgeID_rng (vm_offset_t start, vm_size_t end); 379676b1fbdSOlivier Houchard void xscalec3_cache_purgeD_rng (vm_offset_t start, vm_size_t end); 380425b5be3SOlivier Houchard void xscalec3_cache_cleanID_rng (vm_offset_t start, vm_size_t end); 381425b5be3SOlivier Houchard void xscalec3_cache_cleanD_rng (vm_offset_t start, vm_size_t end); 382425b5be3SOlivier Houchard void xscalec3_cache_syncI_rng (vm_offset_t start, vm_size_t end); 383425b5be3SOlivier Houchard 384425b5be3SOlivier Houchard void xscalec3_l2cache_flush_rng (vm_offset_t, vm_size_t); 385425b5be3SOlivier Houchard void xscalec3_l2cache_clean_rng (vm_offset_t start, vm_size_t end); 386425b5be3SOlivier Houchard void xscalec3_l2cache_purge_rng (vm_offset_t start, vm_size_t end); 387676b1fbdSOlivier Houchard 388676b1fbdSOlivier Houchard 389676b1fbdSOlivier Houchard void xscalec3_setttb (u_int ttb); 390676b1fbdSOlivier Houchard void xscalec3_context_switch (void); 391676b1fbdSOlivier Houchard 392676b1fbdSOlivier Houchard #endif /* CPU_XSCALE_81342 */ 393676b1fbdSOlivier Houchard 3946fc729afSOlivier Houchard /* 3956fc729afSOlivier Houchard * Macros for manipulating CPU interrupts 3966fc729afSOlivier Houchard */ 3975fcbe89aSMichal Meloun #if __ARM_ARCH < 6 3985fcbe89aSMichal Meloun #define __ARM_INTR_BITS (PSR_I | PSR_F) 3995fcbe89aSMichal Meloun #else 4005fcbe89aSMichal Meloun #define __ARM_INTR_BITS (PSR_I | PSR_F | PSR_A) 4015fcbe89aSMichal Meloun #endif 4026fc729afSOlivier Houchard 4035fcbe89aSMichal Meloun static __inline uint32_t 4045fcbe89aSMichal Meloun __set_cpsr(uint32_t bic, uint32_t eor) 4056fc729afSOlivier Houchard { 4065fcbe89aSMichal Meloun uint32_t tmp, ret; 4076fc729afSOlivier Houchard 4086fc729afSOlivier Houchard __asm __volatile( 4096fc729afSOlivier Houchard "mrs %0, cpsr\n" /* Get the CPSR */ 4106fc729afSOlivier Houchard "bic %1, %0, %2\n" /* Clear bits */ 4116fc729afSOlivier Houchard "eor %1, %1, %3\n" /* XOR bits */ 4125fcbe89aSMichal Meloun "msr cpsr_xc, %1\n" /* Set the CPSR */ 4136fc729afSOlivier Houchard : "=&r" (ret), "=&r" (tmp) 41424e01b0cSOlivier Houchard : "r" (bic), "r" (eor) : "memory"); 4156fc729afSOlivier Houchard 4166fc729afSOlivier Houchard return ret; 4176fc729afSOlivier Houchard } 4186fc729afSOlivier Houchard 4195fcbe89aSMichal Meloun static __inline uint32_t 4205fcbe89aSMichal Meloun disable_interrupts(uint32_t mask) 4215fcbe89aSMichal Meloun { 422dfad9244SMarcel Moolenaar 4235fcbe89aSMichal Meloun return (__set_cpsr(mask & __ARM_INTR_BITS, mask & __ARM_INTR_BITS)); 4245fcbe89aSMichal Meloun } 4256fc729afSOlivier Houchard 4265fcbe89aSMichal Meloun static __inline uint32_t 4275fcbe89aSMichal Meloun enable_interrupts(uint32_t mask) 4285fcbe89aSMichal Meloun { 4296fc729afSOlivier Houchard 4305fcbe89aSMichal Meloun return (__set_cpsr(mask & __ARM_INTR_BITS, 0)); 4315fcbe89aSMichal Meloun } 4325fcbe89aSMichal Meloun 4335fcbe89aSMichal Meloun static __inline uint32_t 4345fcbe89aSMichal Meloun restore_interrupts(uint32_t old_cpsr) 4355fcbe89aSMichal Meloun { 4365fcbe89aSMichal Meloun 4375fcbe89aSMichal Meloun return (__set_cpsr(__ARM_INTR_BITS, old_cpsr & __ARM_INTR_BITS)); 4385fcbe89aSMichal Meloun } 4396fc729afSOlivier Houchard 440dfad9244SMarcel Moolenaar static __inline register_t 441dfad9244SMarcel Moolenaar intr_disable(void) 442dfad9244SMarcel Moolenaar { 443dfad9244SMarcel Moolenaar 4445fcbe89aSMichal Meloun return (disable_interrupts(PSR_I | PSR_F)); 445dfad9244SMarcel Moolenaar } 446dfad9244SMarcel Moolenaar 447dfad9244SMarcel Moolenaar static __inline void 448dfad9244SMarcel Moolenaar intr_restore(register_t s) 449dfad9244SMarcel Moolenaar { 450dfad9244SMarcel Moolenaar 451dfad9244SMarcel Moolenaar restore_interrupts(s); 452dfad9244SMarcel Moolenaar } 4535fcbe89aSMichal Meloun #undef __ARM_INTR_BITS 4546fc729afSOlivier Houchard 4556fc729afSOlivier Houchard /* 4566fc729afSOlivier Houchard * Functions to manipulate cpu r13 4576fc729afSOlivier Houchard * (in arm/arm32/setstack.S) 4586fc729afSOlivier Houchard */ 4596fc729afSOlivier Houchard 4604eaa43e6SKevin Lo void set_stackptr (u_int mode, u_int address); 4614eaa43e6SKevin Lo u_int get_stackptr (u_int mode); 4626fc729afSOlivier Houchard 4636fc729afSOlivier Houchard /* 4646fc729afSOlivier Houchard * Miscellany 4656fc729afSOlivier Houchard */ 4666fc729afSOlivier Houchard 4674eaa43e6SKevin Lo int get_pc_str_offset (void); 4686fc729afSOlivier Houchard 4696fc729afSOlivier Houchard /* 4706fc729afSOlivier Houchard * CPU functions from locore.S 4716fc729afSOlivier Houchard */ 4726fc729afSOlivier Houchard 4734eaa43e6SKevin Lo void cpu_reset (void) __attribute__((__noreturn__)); 4746fc729afSOlivier Houchard 4756fc729afSOlivier Houchard /* 4766fc729afSOlivier Houchard * Cache info variables. 4776fc729afSOlivier Houchard */ 4786fc729afSOlivier Houchard 4796fc729afSOlivier Houchard /* PRIMARY CACHE VARIABLES */ 4806fc729afSOlivier Houchard extern int arm_picache_size; 4816fc729afSOlivier Houchard extern int arm_picache_line_size; 4826fc729afSOlivier Houchard extern int arm_picache_ways; 4836fc729afSOlivier Houchard 4846fc729afSOlivier Houchard extern int arm_pdcache_size; /* and unified */ 4856fc729afSOlivier Houchard extern int arm_pdcache_line_size; 4866fc729afSOlivier Houchard extern int arm_pdcache_ways; 4876fc729afSOlivier Houchard 4886fc729afSOlivier Houchard extern int arm_pcache_type; 4896fc729afSOlivier Houchard extern int arm_pcache_unified; 4906fc729afSOlivier Houchard 4916fc729afSOlivier Houchard extern int arm_dcache_align; 4926fc729afSOlivier Houchard extern int arm_dcache_align_mask; 4936fc729afSOlivier Houchard 494cf1a573fSOleksandr Tymoshenko extern u_int arm_cache_level; 495cf1a573fSOleksandr Tymoshenko extern u_int arm_cache_loc; 496cf1a573fSOleksandr Tymoshenko extern u_int arm_cache_type[14]; 497cf1a573fSOleksandr Tymoshenko 4986fc729afSOlivier Houchard #endif /* _KERNEL */ 4996fc729afSOlivier Houchard #endif /* _MACHINE_CPUFUNC_H_ */ 5006fc729afSOlivier Houchard 5016fc729afSOlivier Houchard /* End of cpufunc.h */ 502