Annotation of sys/arch/arm/include/cpufunc.h, Revision 1.1
1.1 ! nbrk 1: /* $OpenBSD: cpufunc.h,v 1.3 2006/07/12 17:29:55 miod Exp $ */
! 2: /* $NetBSD: cpufunc.h,v 1.29 2003/09/06 09:08:35 rearnsha Exp $ */
! 3:
! 4: /*
! 5: * Copyright (c) 1997 Mark Brinicombe.
! 6: * Copyright (c) 1997 Causality Limited
! 7: * All rights reserved.
! 8: *
! 9: * Redistribution and use in source and binary forms, with or without
! 10: * modification, are permitted provided that the following conditions
! 11: * are met:
! 12: * 1. Redistributions of source code must retain the above copyright
! 13: * notice, this list of conditions and the following disclaimer.
! 14: * 2. Redistributions in binary form must reproduce the above copyright
! 15: * notice, this list of conditions and the following disclaimer in the
! 16: * documentation and/or other materials provided with the distribution.
! 17: * 3. All advertising materials mentioning features or use of this software
! 18: * must display the following acknowledgement:
! 19: * This product includes software developed by Causality Limited.
! 20: * 4. The name of Causality Limited may not be used to endorse or promote
! 21: * products derived from this software without specific prior written
! 22: * permission.
! 23: *
! 24: * THIS SOFTWARE IS PROVIDED BY CAUSALITY LIMITED ``AS IS'' AND ANY EXPRESS
! 25: * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
! 26: * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
! 27: * DISCLAIMED. IN NO EVENT SHALL CAUSALITY LIMITED BE LIABLE FOR ANY DIRECT,
! 28: * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
! 29: * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
! 30: * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
! 31: * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
! 32: * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
! 33: * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
! 34: * SUCH DAMAGE.
! 35: *
! 36: * RiscBSD kernel project
! 37: *
! 38: * cpufunc.h
! 39: *
! 40: * Prototypes for cpu, mmu and tlb related functions.
! 41: */
! 42:
! 43: #ifndef _ARM32_CPUFUNC_H_
! 44: #define _ARM32_CPUFUNC_H_
! 45:
! 46: #ifdef _KERNEL
! 47:
! 48: #include <sys/types.h>
! 49: #include <arm/cpuconf.h>
! 50:
! 51: struct cpu_functions {
! 52:
! 53: /* CPU functions */
! 54:
! 55: u_int (*cf_id) (void);
! 56: void (*cf_cpwait) (void);
! 57:
! 58: /* MMU functions */
! 59:
! 60: u_int (*cf_control) (u_int bic, u_int eor);
! 61: void (*cf_domains) (u_int domains);
! 62: void (*cf_setttb) (u_int ttb);
! 63: u_int (*cf_faultstatus) (void);
! 64: u_int (*cf_faultaddress) (void);
! 65:
! 66: /* TLB functions */
! 67:
! 68: void (*cf_tlb_flushID) (void);
! 69: void (*cf_tlb_flushID_SE) (u_int va);
! 70: void (*cf_tlb_flushI) (void);
! 71: void (*cf_tlb_flushI_SE) (u_int va);
! 72: void (*cf_tlb_flushD) (void);
! 73: void (*cf_tlb_flushD_SE) (u_int va);
! 74:
! 75: /*
! 76: * Cache operations:
! 77: *
! 78: * We define the following primitives:
! 79: *
! 80: * icache_sync_all Synchronize I-cache
! 81: * icache_sync_range Synchronize I-cache range
! 82: *
! 83: * dcache_wbinv_all Write-back and Invalidate D-cache
! 84: * dcache_wbinv_range Write-back and Invalidate D-cache range
! 85: * dcache_inv_range Invalidate D-cache range
! 86: * dcache_wb_range Write-back D-cache range
! 87: *
! 88: * idcache_wbinv_all Write-back and Invalidate D-cache,
! 89: * Invalidate I-cache
! 90: * idcache_wbinv_range Write-back and Invalidate D-cache,
! 91: * Invalidate I-cache range
! 92: *
! 93: * Note that the ARM term for "write-back" is "clean". We use
! 94: * the term "write-back" since it's a more common way to describe
! 95: * the operation.
! 96: *
! 97: * There are some rules that must be followed:
! 98: *
! 99: * I-cache Synch (all or range):
! 100: * The goal is to synchronize the instruction stream,
! 101: * so you may beed to write-back dirty D-cache blocks
! 102: * first. If a range is requested, and you can't
! 103: * synchronize just a range, you have to hit the whole
! 104: * thing.
! 105: *
! 106: * D-cache Write-Back and Invalidate range:
! 107: * If you can't WB-Inv a range, you must WB-Inv the
! 108: * entire D-cache.
! 109: *
! 110: * D-cache Invalidate:
! 111: * If you can't Inv the D-cache, you must Write-Back
! 112: * and Invalidate. Code that uses this operation
! 113: * MUST NOT assume that the D-cache will not be written
! 114: * back to memory.
! 115: *
! 116: * D-cache Write-Back:
! 117: * If you can't Write-back without doing an Inv,
! 118: * that's fine. Then treat this as a WB-Inv.
! 119: * Skipping the invalidate is merely an optimization.
! 120: *
! 121: * All operations:
! 122: * Valid virtual addresses must be passed to each
! 123: * cache operation.
! 124: */
! 125: void (*cf_icache_sync_all) (void);
! 126: void (*cf_icache_sync_range) (vaddr_t, vsize_t);
! 127:
! 128: void (*cf_dcache_wbinv_all) (void);
! 129: void (*cf_dcache_wbinv_range) (vaddr_t, vsize_t);
! 130: void (*cf_dcache_inv_range) (vaddr_t, vsize_t);
! 131: void (*cf_dcache_wb_range) (vaddr_t, vsize_t);
! 132:
! 133: void (*cf_idcache_wbinv_all) (void);
! 134: void (*cf_idcache_wbinv_range) (vaddr_t, vsize_t);
! 135:
! 136: /* Other functions */
! 137:
! 138: void (*cf_flush_prefetchbuf) (void);
! 139: void (*cf_drain_writebuf) (void);
! 140: void (*cf_flush_brnchtgt_C) (void);
! 141: void (*cf_flush_brnchtgt_E) (u_int va);
! 142:
! 143: void (*cf_sleep) (int mode);
! 144:
! 145: /* Soft functions */
! 146:
! 147: int (*cf_dataabt_fixup) (void *arg);
! 148: int (*cf_prefetchabt_fixup) (void *arg);
! 149:
! 150: void (*cf_context_switch) (void);
! 151:
! 152: void (*cf_setup) (char *string);
! 153: };
! 154:
! 155: extern struct cpu_functions cpufuncs;
! 156: extern u_int cputype;
! 157:
! 158: #define cpu_id() cpufuncs.cf_id()
! 159: #define cpu_cpwait() cpufuncs.cf_cpwait()
! 160:
! 161: #define cpu_control(c, e) cpufuncs.cf_control(c, e)
! 162: #define cpu_domains(d) cpufuncs.cf_domains(d)
! 163: #define cpu_setttb(t) cpufuncs.cf_setttb(t)
! 164: #define cpu_faultstatus() cpufuncs.cf_faultstatus()
! 165: #define cpu_faultaddress() cpufuncs.cf_faultaddress()
! 166:
! 167: #define cpu_tlb_flushID() cpufuncs.cf_tlb_flushID()
! 168: #define cpu_tlb_flushID_SE(e) cpufuncs.cf_tlb_flushID_SE(e)
! 169: #define cpu_tlb_flushI() cpufuncs.cf_tlb_flushI()
! 170: #define cpu_tlb_flushI_SE(e) cpufuncs.cf_tlb_flushI_SE(e)
! 171: #define cpu_tlb_flushD() cpufuncs.cf_tlb_flushD()
! 172: #define cpu_tlb_flushD_SE(e) cpufuncs.cf_tlb_flushD_SE(e)
! 173:
! 174: #define cpu_icache_sync_all() cpufuncs.cf_icache_sync_all()
! 175: #define cpu_icache_sync_range(a, s) cpufuncs.cf_icache_sync_range((a), (s))
! 176:
! 177: #define cpu_dcache_wbinv_all() cpufuncs.cf_dcache_wbinv_all()
! 178: #define cpu_dcache_wbinv_range(a, s) cpufuncs.cf_dcache_wbinv_range((a), (s))
! 179: #define cpu_dcache_inv_range(a, s) cpufuncs.cf_dcache_inv_range((a), (s))
! 180: #define cpu_dcache_wb_range(a, s) cpufuncs.cf_dcache_wb_range((a), (s))
! 181:
! 182: #define cpu_idcache_wbinv_all() cpufuncs.cf_idcache_wbinv_all()
! 183: #define cpu_idcache_wbinv_range(a, s) cpufuncs.cf_idcache_wbinv_range((a), (s))
! 184:
! 185: #define cpu_flush_prefetchbuf() cpufuncs.cf_flush_prefetchbuf()
! 186: #define cpu_drain_writebuf() cpufuncs.cf_drain_writebuf()
! 187: #define cpu_flush_brnchtgt_C() cpufuncs.cf_flush_brnchtgt_C()
! 188: #define cpu_flush_brnchtgt_E(e) cpufuncs.cf_flush_brnchtgt_E(e)
! 189:
! 190: #define cpu_sleep(m) cpufuncs.cf_sleep(m)
! 191:
! 192: #define cpu_dataabt_fixup(a) cpufuncs.cf_dataabt_fixup(a)
! 193: #define cpu_prefetchabt_fixup(a) cpufuncs.cf_prefetchabt_fixup(a)
! 194: #define ABORT_FIXUP_OK 0 /* fixup succeeded */
! 195: #define ABORT_FIXUP_FAILED 1 /* fixup failed */
! 196: #define ABORT_FIXUP_RETURN 2 /* abort handler should return */
! 197:
! 198: #define cpu_setup(a) cpufuncs.cf_setup(a)
! 199:
! 200: int set_cpufuncs (void);
! 201: #define ARCHITECTURE_NOT_PRESENT 1 /* known but not configured */
! 202: #define ARCHITECTURE_NOT_SUPPORTED 2 /* not known */
! 203:
! 204: void cpufunc_nullop (void);
! 205: int cpufunc_null_fixup (void *);
! 206: int early_abort_fixup (void *);
! 207: int late_abort_fixup (void *);
! 208: u_int cpufunc_id (void);
! 209: u_int cpufunc_control (u_int clear, u_int bic);
! 210: void cpufunc_domains (u_int domains);
! 211: u_int cpufunc_faultstatus (void);
! 212: u_int cpufunc_faultaddress (void);
! 213:
! 214: #ifdef CPU_ARM3
! 215: u_int arm3_control (u_int clear, u_int bic);
! 216: void arm3_cache_flush (void);
! 217: #endif /* CPU_ARM3 */
! 218:
! 219: #if defined(CPU_ARM6) || defined(CPU_ARM7)
! 220: void arm67_setttb (u_int ttb);
! 221: void arm67_tlb_flush (void);
! 222: void arm67_tlb_purge (u_int va);
! 223: void arm67_cache_flush (void);
! 224: void arm67_context_switch (void);
! 225: #endif /* CPU_ARM6 || CPU_ARM7 */
! 226:
! 227: #ifdef CPU_ARM6
! 228: void arm6_setup (char *string);
! 229: #endif /* CPU_ARM6 */
! 230:
! 231: #ifdef CPU_ARM7
! 232: void arm7_setup (char *string);
! 233: #endif /* CPU_ARM7 */
! 234:
! 235: #ifdef CPU_ARM7TDMI
! 236: int arm7_dataabt_fixup (void *arg);
! 237: void arm7tdmi_setup (char *string);
! 238: void arm7tdmi_setttb (u_int ttb);
! 239: void arm7tdmi_tlb_flushID (void);
! 240: void arm7tdmi_tlb_flushID_SE (u_int va);
! 241: void arm7tdmi_cache_flushID (void);
! 242: void arm7tdmi_context_switch (void);
! 243: #endif /* CPU_ARM7TDMI */
! 244:
! 245: #ifdef CPU_ARM8
! 246: void arm8_setttb (u_int ttb);
! 247: void arm8_tlb_flushID (void);
! 248: void arm8_tlb_flushID_SE (u_int va);
! 249: void arm8_cache_flushID (void);
! 250: void arm8_cache_flushID_E (u_int entry);
! 251: void arm8_cache_cleanID (void);
! 252: void arm8_cache_cleanID_E (u_int entry);
! 253: void arm8_cache_purgeID (void);
! 254: void arm8_cache_purgeID_E (u_int entry);
! 255:
! 256: void arm8_cache_syncI (void);
! 257: void arm8_cache_cleanID_rng (vaddr_t start, vsize_t end);
! 258: void arm8_cache_cleanD_rng (vaddr_t start, vsize_t end);
! 259: void arm8_cache_purgeID_rng (vaddr_t start, vsize_t end);
! 260: void arm8_cache_purgeD_rng (vaddr_t start, vsize_t end);
! 261: void arm8_cache_syncI_rng (vaddr_t start, vsize_t end);
! 262:
! 263: void arm8_context_switch (void);
! 264:
! 265: void arm8_setup (char *string);
! 266:
! 267: u_int arm8_clock_config (u_int, u_int);
! 268: #endif
! 269:
! 270: #ifdef CPU_SA110
! 271: void sa110_setup (char *string);
! 272: void sa110_context_switch (void);
! 273: #endif /* CPU_SA110 */
! 274:
! 275: #if defined(CPU_SA1100) || defined(CPU_SA1110)
! 276: void sa11x0_drain_readbuf (void);
! 277:
! 278: void sa11x0_context_switch (void);
! 279: void sa11x0_cpu_sleep (int mode);
! 280:
! 281: void sa11x0_setup (char *string);
! 282: #endif
! 283:
! 284: #if defined(CPU_SA110) || defined(CPU_SA1100) || defined(CPU_SA1110)
! 285: void sa1_setttb (u_int ttb);
! 286:
! 287: void sa1_tlb_flushID_SE (u_int va);
! 288:
! 289: void sa1_cache_flushID (void);
! 290: void sa1_cache_flushI (void);
! 291: void sa1_cache_flushD (void);
! 292: void sa1_cache_flushD_SE (u_int entry);
! 293:
! 294: void sa1_cache_cleanID (void);
! 295: void sa1_cache_cleanD (void);
! 296: void sa1_cache_cleanD_E (u_int entry);
! 297:
! 298: void sa1_cache_purgeID (void);
! 299: void sa1_cache_purgeID_E (u_int entry);
! 300: void sa1_cache_purgeD (void);
! 301: void sa1_cache_purgeD_E (u_int entry);
! 302:
! 303: void sa1_cache_syncI (void);
! 304: void sa1_cache_cleanID_rng (vaddr_t start, vsize_t end);
! 305: void sa1_cache_cleanD_rng (vaddr_t start, vsize_t end);
! 306: void sa1_cache_purgeID_rng (vaddr_t start, vsize_t end);
! 307: void sa1_cache_purgeD_rng (vaddr_t start, vsize_t end);
! 308: void sa1_cache_syncI_rng (vaddr_t start, vsize_t end);
! 309:
! 310: #endif
! 311:
! 312: #ifdef CPU_ARM9
! 313: void arm9_setttb (u_int);
! 314:
! 315: void arm9_tlb_flushID_SE (u_int va);
! 316:
! 317: void arm9_cache_flushID (void);
! 318: void arm9_cache_flushID_SE (u_int);
! 319: void arm9_cache_flushI (void);
! 320: void arm9_cache_flushI_SE (u_int);
! 321: void arm9_cache_flushD (void);
! 322: void arm9_cache_flushD_SE (u_int);
! 323:
! 324: void arm9_cache_cleanID (void);
! 325:
! 326: void arm9_cache_syncI (void);
! 327: void arm9_cache_flushID_rng (vaddr_t, vsize_t);
! 328: void arm9_cache_flushD_rng (vaddr_t, vsize_t);
! 329: void arm9_cache_syncI_rng (vaddr_t, vsize_t);
! 330:
! 331: void arm9_context_switch (void);
! 332:
! 333: void arm9_setup (char *string);
! 334: #endif
! 335:
! 336: #ifdef CPU_ARM10
! 337: void arm10_setttb (u_int);
! 338:
! 339: void arm10_tlb_flushID_SE (u_int);
! 340: void arm10_tlb_flushI_SE (u_int);
! 341:
! 342: void arm10_icache_sync_all (void);
! 343: void arm10_icache_sync_range (vaddr_t, vsize_t);
! 344:
! 345: void arm10_dcache_wbinv_all (void);
! 346: void arm10_dcache_wbinv_range (vaddr_t, vsize_t);
! 347: void arm10_dcache_inv_range (vaddr_t, vsize_t);
! 348: void arm10_dcache_wb_range (vaddr_t, vsize_t);
! 349:
! 350: void arm10_idcache_wbinv_all (void);
! 351: void arm10_idcache_wbinv_range (vaddr_t, vsize_t);
! 352:
! 353: void arm10_context_switch (void);
! 354:
! 355: void arm10_setup (char *string);
! 356:
! 357: extern unsigned arm10_dcache_sets_max;
! 358: extern unsigned arm10_dcache_sets_inc;
! 359: extern unsigned arm10_dcache_index_max;
! 360: extern unsigned arm10_dcache_index_inc;
! 361: #endif
! 362:
! 363: #if defined(CPU_ARM9) || defined(CPU_ARM10) || defined(CPU_SA110) || \
! 364: defined(CPU_SA1100) || defined(CPU_SA1110) || \
! 365: defined(CPU_XSCALE_80200) || defined(CPU_XSCALE_80321) || \
! 366: defined(CPU_XSCALE_PXA2X0) || defined(CPU_XSCALE_IXP425)
! 367:
! 368: void armv4_tlb_flushID (void);
! 369: void armv4_tlb_flushI (void);
! 370: void armv4_tlb_flushD (void);
! 371: void armv4_tlb_flushD_SE (u_int va);
! 372:
! 373: void armv4_drain_writebuf (void);
! 374: #endif
! 375:
! 376: #if defined(CPU_IXP12X0)
! 377: void ixp12x0_drain_readbuf (void);
! 378: void ixp12x0_context_switch (void);
! 379: void ixp12x0_setup (char *string);
! 380: #endif
! 381:
! 382: #if defined(CPU_XSCALE_80200) || defined(CPU_XSCALE_80321) || \
! 383: defined(CPU_XSCALE_PXA2X0) || defined(CPU_XSCALE_IXP425) || \
! 384: (ARM_MMU_XSCALE == 1)
! 385: void xscale_cpwait (void);
! 386:
! 387: void xscale_cpu_sleep (int mode);
! 388:
! 389: u_int xscale_control (u_int clear, u_int bic);
! 390:
! 391: void xscale_setttb (u_int ttb);
! 392:
! 393: void xscale_tlb_flushID_SE (u_int va);
! 394:
! 395: void xscale_cache_flushID (void);
! 396: void xscale_cache_flushI (void);
! 397: void xscale_cache_flushD (void);
! 398: void xscale_cache_flushD_SE (u_int entry);
! 399:
! 400: void xscale_cache_cleanID (void);
! 401: void xscale_cache_cleanD (void);
! 402: void xscale_cache_cleanD_E (u_int entry);
! 403:
! 404: void xscale_cache_clean_minidata (void);
! 405:
! 406: void xscale_cache_purgeID (void);
! 407: void xscale_cache_purgeID_E (u_int entry);
! 408: void xscale_cache_purgeD (void);
! 409: void xscale_cache_purgeD_E (u_int entry);
! 410:
! 411: void xscale_cache_syncI (void);
! 412: void xscale_cache_cleanID_rng (vaddr_t start, vsize_t end);
! 413: void xscale_cache_cleanD_rng (vaddr_t start, vsize_t end);
! 414: void xscale_cache_purgeID_rng (vaddr_t start, vsize_t end);
! 415: void xscale_cache_purgeD_rng (vaddr_t start, vsize_t end);
! 416: void xscale_cache_syncI_rng (vaddr_t start, vsize_t end);
! 417: void xscale_cache_flushD_rng (vaddr_t start, vsize_t end);
! 418:
! 419: void xscale_context_switch (void);
! 420:
! 421: void xscale_setup (char *string);
! 422: #endif /* CPU_XSCALE_80200 || CPU_XSCALE_80321 || CPU_XSCALE_PXA2X0 || CPU_XSCALE_IXP425 */
! 423:
! 424: #define tlb_flush cpu_tlb_flushID
! 425: #define setttb cpu_setttb
! 426: #define drain_writebuf cpu_drain_writebuf
! 427:
! 428: /*
! 429: * Macros for manipulating CPU interrupts
! 430: */
! 431: #ifdef __PROG32
! 432: /* Functions to manipulate the CPSR. */
! 433: static __inline u_int32_t __set_cpsr_c(u_int bic, u_int eor);
! 434: static __inline u_int32_t __get_cpsr(void);
! 435:
! 436: static __inline u_int32_t
! 437: __set_cpsr_c(u_int bic, u_int eor)
! 438: {
! 439: u_int32_t tmp, ret;
! 440:
! 441: __asm __volatile(
! 442: "mrs %0, cpsr\n" /* Get the CPSR */
! 443: "bic %1, %0, %2\n" /* Clear bits */
! 444: "eor %1, %1, %3\n" /* XOR bits */
! 445: "msr cpsr_c, %1\n" /* Set the control field of CPSR */
! 446: : "=&r" (ret), "=&r" (tmp)
! 447: : "r" (bic), "r" (eor));
! 448:
! 449: return ret;
! 450: }
! 451:
! 452: static __inline u_int32_t
! 453: __get_cpsr()
! 454: {
! 455: u_int32_t ret;
! 456:
! 457: __asm __volatile("mrs %0, cpsr" : "=&r" (ret));
! 458:
! 459: return ret;
! 460: }
! 461:
! 462: #define disable_interrupts(mask) \
! 463: (__set_cpsr_c((mask) & (I32_bit | F32_bit), \
! 464: (mask) & (I32_bit | F32_bit)))
! 465:
! 466: #define enable_interrupts(mask) \
! 467: (__set_cpsr_c((mask) & (I32_bit | F32_bit), 0))
! 468:
! 469: #define restore_interrupts(old_cpsr) \
! 470: (__set_cpsr_c((I32_bit | F32_bit), (old_cpsr) & (I32_bit | F32_bit)))
! 471: #else /* ! __PROG32 */
! 472: #define disable_interrupts(mask) \
! 473: (set_r15((mask) & (R15_IRQ_DISABLE | R15_FIQ_DISABLE), \
! 474: (mask) & (R15_IRQ_DISABLE | R15_FIQ_DISABLE)))
! 475:
! 476: #define enable_interrupts(mask) \
! 477: (set_r15((mask) & (R15_IRQ_DISABLE | R15_FIQ_DISABLE), 0))
! 478:
! 479: #define restore_interrupts(old_r15) \
! 480: (set_r15((R15_IRQ_DISABLE | R15_FIQ_DISABLE), \
! 481: (old_r15) & (R15_IRQ_DISABLE | R15_FIQ_DISABLE)))
! 482:
! 483: /* Functions to manipulate the processor control bits in r15. */
! 484: u_int set_r15(u_int bic, u_int eor);
! 485: u_int get_r15(void);
! 486: #endif /* __PROG32 */
! 487:
! 488: /*
! 489: * Functions to manipulate cpu r13
! 490: * (in arm/arm/setstack.S)
! 491: */
! 492:
! 493: void set_stackptr (u_int mode, u_int address);
! 494: u_int get_stackptr (u_int mode);
! 495:
! 496: /*
! 497: * Miscellany
! 498: */
! 499:
! 500: int get_pc_str_offset (void);
! 501:
! 502: /*
! 503: * CPU functions from locore.S
! 504: */
! 505:
! 506: void cpu_reset (void) __attribute__((__noreturn__));
! 507:
! 508: /*
! 509: * Cache info variables.
! 510: */
! 511:
! 512: /* PRIMARY CACHE VARIABLES */
! 513: extern int arm_picache_size;
! 514: extern int arm_picache_line_size;
! 515: extern int arm_picache_ways;
! 516:
! 517: extern int arm_pdcache_size; /* and unified */
! 518: extern int arm_pdcache_line_size;
! 519: extern int arm_pdcache_ways;
! 520:
! 521: extern int arm_pcache_type;
! 522: extern int arm_pcache_unified;
! 523:
! 524: extern int arm_dcache_align;
! 525: extern int arm_dcache_align_mask;
! 526:
! 527: #endif /* _KERNEL */
! 528: #endif /* _ARM32_CPUFUNC_H_ */
! 529:
! 530: /* End of cpufunc.h */
CVSweb