Add a few more cpu-specific cacheop functions.
This commit is contained in:
parent
7fa549e8d4
commit
0d7cafd74b
|
@ -1,4 +1,4 @@
|
|||
/* $NetBSD: cacheops.h,v 1.1 2002/07/05 13:31:56 scw Exp $ */
|
||||
/* $NetBSD: cacheops.h,v 1.2 2002/09/10 11:56:32 scw Exp $ */
|
||||
|
||||
/*
|
||||
* Copyright 2002 Wasabi Systems, Inc.
|
||||
|
@ -38,7 +38,10 @@
|
|||
#ifndef __SH5_CACHEOPS_H
|
||||
#define __SH5_CACHEOPS_H
|
||||
|
||||
extern void (*__cpu_cache_purge)(vaddr_t, vsize_t);
|
||||
extern void (*__cpu_cache_invalidate)(vaddr_t, vsize_t);
|
||||
extern void (*__cpu_cache_dpurge)(vaddr_t, vsize_t);
|
||||
extern void (*__cpu_cache_dpurge_iinv)(vaddr_t, vsize_t);
|
||||
extern void (*__cpu_cache_dinv)(vaddr_t, vsize_t);
|
||||
extern void (*__cpu_cache_dinv_iinv)(vaddr_t, vsize_t);
|
||||
extern void (*__cpu_cache_iinv)(vaddr_t, vsize_t);
|
||||
|
||||
#endif /* __SH5_CACHEOPS_H */
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
/* $NetBSD: stb1_locore.S,v 1.5 2002/09/04 13:58:36 scw Exp $ */
|
||||
/* $NetBSD: stb1_locore.S,v 1.6 2002/09/10 11:56:33 scw Exp $ */
|
||||
|
||||
/*
|
||||
* Copyright 2002 Wasabi Systems, Inc.
|
||||
|
@ -68,16 +68,14 @@
|
|||
* virtual address space until pmap_bootstrap has been called.
|
||||
*/
|
||||
Lsh5_stb1_init:
|
||||
addz.l r2, r63, r2 /* Clear the upper 32-bits of r2 */
|
||||
movi 2, r1
|
||||
add.l r2, r63, r2 /* Sign-extend the upper 32bits of r2 */
|
||||
movi 3, r1 /* Inv/Enable the Caches */
|
||||
LDC32(0x01600000, r0) /* Instruction Cache Control Register */
|
||||
putcfg r0, 0, r1 /* Invalidate instruction cache */
|
||||
putcfg r0, 0, r1 /* Inv & Enable instruction cache */
|
||||
putcfg r0, 1, r63
|
||||
synci
|
||||
LDC32(0x01e00000, r0) /* Operand Cache Control Register */
|
||||
putcfg r0, 0, r1 /* Invalidate operand cache */
|
||||
putcfg r0, 0, r1 /* Inv & Enable operand cache */
|
||||
putcfg r0, 1, r63
|
||||
synco
|
||||
|
||||
pta/u 1f, tr0 /* Pre-load branches */
|
||||
LDC32(0x00800000 + (16 * 63), r0) /* Top of DTLB */
|
||||
|
@ -95,12 +93,12 @@ Lsh5_stb1_init:
|
|||
putcfg r1, 0, r63
|
||||
|
||||
/* Fix up KSEG0 physical page and attributes in ITLB */
|
||||
movi SH5_PTEL_CB_NOCACHE | SH5_PTEL_SZ_512MB | SH5_PTEL_PR_X, r3
|
||||
movi SH5_PTEL_CB_WRITEBACK | SH5_PTEL_SZ_512MB | SH5_PTEL_PR_X, r3
|
||||
or r2, r3, r3
|
||||
putcfg r1, 1, r3
|
||||
|
||||
/* Ditto for DTLB */
|
||||
movi SH5_PTEL_CB_NOCACHE | SH5_PTEL_SZ_512MB | SH5_PTEL_PR_R | SH5_PTEL_PR_W, r3
|
||||
movi SH5_PTEL_CB_WRITEBACK | SH5_PTEL_SZ_512MB | SH5_PTEL_PR_R | SH5_PTEL_PR_W, r3
|
||||
or r2, r3, r3
|
||||
putcfg r0, 1, r3
|
||||
|
||||
|
@ -114,8 +112,8 @@ Lsh5_stb1_init:
|
|||
putcfg r1, 0, r2
|
||||
|
||||
/*
|
||||
* The TLB is primed, the cache is clean. All we have to do now
|
||||
* is enable the MMU and FPU before returning to the caller.
|
||||
* The TLB is primed, the cache is clean and enabled. All we have
|
||||
* to do now is enable the MMU and FPU before returning to the caller.
|
||||
*/
|
||||
getcon sr, r0
|
||||
LDUC32(SH5_CONREG_SR_ASID_MASK << SH5_CONREG_SR_ASID_SHIFT, r1)
|
||||
|
@ -155,12 +153,11 @@ Lsh5_stb1_init:
|
|||
*/
|
||||
ENTRY_NOPROFILE(_sh5_stb1_tlbinv)
|
||||
getcon sr, r5
|
||||
LDC32(SH5_CONREG_SR_BL, r4)
|
||||
ori r2, SH5_PTEH_V, r2 /* Only check valid entries */
|
||||
ori r3, SH5_PTEH_V, r3
|
||||
addz.l r2, r63, r2 /* Zero-extend PTEH */
|
||||
addz.l r3, r63, r3 /* Zero-extend PTEL */
|
||||
or r4, r5, r4 /* Block exceptions */
|
||||
ori r5, SH5_CONREG_SR_IMASK_ALL, r4 /* Block interrupts */
|
||||
putcon r4, sr
|
||||
|
||||
ptabs/u r18, tr1 /* Get return address to tr1 */
|
||||
|
@ -195,7 +192,7 @@ ENTRY_NOPROFILE(_sh5_stb1_tlbinv)
|
|||
addi r0, 16, r0 /* Next ITLB entry */
|
||||
bge/l r1, r63, tr0 /* Back if not done and not found */
|
||||
|
||||
putcon r5, sr /* Re-enable exceptions */
|
||||
putcon r5, sr /* Restore interrupt mask */
|
||||
blink tr1, r63
|
||||
|
||||
|
||||
|
@ -313,18 +310,27 @@ ENTRY_NOPROFILE(_sh5_stb1_tlbinv_cookie)
|
|||
*
|
||||
* Callable from C code.
|
||||
*
|
||||
* Invalidate all instruction and data TLB entries (except [DI]TLB#0,
|
||||
* which maps the kernel in KSEG0).
|
||||
* Invalidate all instruction and data TLB entries with non-zero ASIDs.
|
||||
*/
|
||||
ENTRY_NOPROFILE(_sh5_stb1_tlbinv_all)
|
||||
pta/u 1f, tr0 /* Pre-load branches */
|
||||
ptabs/u r18, tr1 /* Get return address to tr1 */
|
||||
LDC32(0x00800000 + (16 * 63), r0) /* DTLB Top */
|
||||
movi (16 * 63), r1 /* ITLB Top */
|
||||
1: putcfg r0, 0, r63 /* Invalidate DTLB entry */
|
||||
movi (SH5_PTEH_ASID_MASK << SH5_PTEH_ASID_SHIFT), r2
|
||||
|
||||
1: getcfg r0, 0, r3 /* Fetch DTLB entry */
|
||||
and r3, r2, r4 /* Keep ASID */
|
||||
cmvne r4, r63, r3 /* If ASID != 0, clear r3 */
|
||||
putcfg r0, 0, r3 /* Invalidate DTLB entry */
|
||||
addi r0, -16, r0 /* Next DTLB slot */
|
||||
|
||||
getcfg r1, 0, r3 /* Fetch ITLB entry */
|
||||
and r3, r2, r4 /* Keep asid */
|
||||
cmvne r4, r63, r3 /* If ASID != 0, clear r3 */
|
||||
putcfg r1, 0, r63 /* Invalidate ITLB entry */
|
||||
addi r1, -16, r1 /* Next ITLB slot */
|
||||
|
||||
bne/l r1, r63, tr0 /* Back until all checked */
|
||||
blink tr1, r63
|
||||
|
||||
|
@ -439,28 +445,76 @@ ENTRY_NOPROFILE(_sh5_stb1_tlbload)
|
|||
|
||||
/******************************************************************************
|
||||
*
|
||||
* void _sh5_stb1_cache_purge(vaddr_t start, vsize_t len)
|
||||
* void _sh5_stb1_cache_dpurge(vaddr_t start, vsize_t len)
|
||||
*/
|
||||
ENTRY_NOPROFILE(_sh5_stb1_cache_purge)
|
||||
ENTRY_NOPROFILE(_sh5_stb1_cache_dpurge)
|
||||
pta/l 1f, tr0
|
||||
ptabs/l r18, tr1
|
||||
add r2, r3, r3
|
||||
1: ocbp r2, 0
|
||||
addi r2, 32, r2
|
||||
addi r3, -32, r3
|
||||
bgt/l r3, r63, tr0
|
||||
bgtu/l r3, r2, tr0
|
||||
synco
|
||||
synci
|
||||
blink tr1, r63
|
||||
|
||||
/******************************************************************************
|
||||
*
|
||||
* void _sh5_stb1_cache_invalidate(vaddr_t start, vsize_t len)
|
||||
* void _sh5_stb1_cache_dpurge_iinv(vaddr_t start, vsize_t len)
|
||||
*/
|
||||
ENTRY_NOPROFILE(_sh5_stb1_cache_invalidate)
|
||||
ENTRY_NOPROFILE(_sh5_stb1_cache_dpurge_iinv)
|
||||
pta/l 1f, tr0
|
||||
ptabs/l r18, tr1
|
||||
add r2, r3, r3
|
||||
1: ocbp r2, 0
|
||||
icbi r2, 0
|
||||
addi r2, 32, r2
|
||||
bgtu/l r3, r2, tr0
|
||||
synco
|
||||
synci
|
||||
blink tr1, r63
|
||||
|
||||
/******************************************************************************
|
||||
*
|
||||
* void _sh5_stb1_cache_dinv(vaddr_t start, vsize_t len)
|
||||
*/
|
||||
ENTRY_NOPROFILE(_sh5_stb1_cache_dinv)
|
||||
pta/l 1f, tr0
|
||||
ptabs/l r18, tr0
|
||||
add r2, r3, r3
|
||||
1: ocbi r2, 0
|
||||
addi r2, 32, r2
|
||||
addi r3, -32, r3
|
||||
bgt/l r3, r63, tr0
|
||||
bgtu/l r3, r2, tr0
|
||||
synco
|
||||
synci
|
||||
blink tr0, r63
|
||||
|
||||
/******************************************************************************
|
||||
*
|
||||
* void _sh5_stb1_cache_dinv_iinv(vaddr_t start, vsize_t len)
|
||||
*/
|
||||
ENTRY_NOPROFILE(_sh5_stb1_cache_dinv_iinv)
|
||||
pta/l 1f, tr0
|
||||
ptabs/l r18, tr0
|
||||
add r2, r3, r3
|
||||
1: ocbi r2, 0
|
||||
icbi r2, 0
|
||||
addi r2, 32, r2
|
||||
bgtu/l r3, r2, tr0
|
||||
synco
|
||||
synci
|
||||
blink tr0, r63
|
||||
|
||||
/******************************************************************************
|
||||
*
|
||||
* void _sh5_stb1_cache_iinv(vaddr_t start, vsize_t len)
|
||||
*/
|
||||
ENTRY_NOPROFILE(_sh5_stb1_cache_iinv)
|
||||
pta/l 1f, tr0
|
||||
ptabs/l r18, tr0
|
||||
add r2, r3, r3
|
||||
1: icbi r2, 0
|
||||
addi r2, 32, r2
|
||||
bgtu/l r3, r2, tr0
|
||||
synci
|
||||
blink tr0, r63
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
/* $NetBSD: stb1var.h,v 1.1 2002/07/05 13:32:07 scw Exp $ */
|
||||
/* $NetBSD: stb1var.h,v 1.2 2002/09/10 11:56:33 scw Exp $ */
|
||||
|
||||
/*
|
||||
* Copyright 2002 Wasabi Systems, Inc.
|
||||
|
@ -44,7 +44,10 @@ extern void _sh5_stb1_tlbinv(pteh_t, pteh_t);
|
|||
extern void _sh5_stb1_tlbinv_cookie(pteh_t, u_int);
|
||||
extern void _sh5_stb1_tlbinv_all(void);
|
||||
extern void _sh5_stb1_tlbload(void);
|
||||
extern void _sh5_stb1_cache_purge(vaddr_t, vsize_t);
|
||||
extern void _sh5_stb1_cache_invalidate(vaddr_t, vsize_t);
|
||||
extern void _sh5_stb1_cache_dpurge(vaddr_t, vsize_t);
|
||||
extern void _sh5_stb1_cache_dpurge_iinv(vaddr_t, vsize_t);
|
||||
extern void _sh5_stb1_cache_dinv(vaddr_t, vsize_t);
|
||||
extern void _sh5_stb1_cache_dinv_iinv(vaddr_t, vsize_t);
|
||||
extern void _sh5_stb1_cache_iinv(vaddr_t, vsize_t);
|
||||
|
||||
#endif /* _STB1VAR_H */
|
||||
|
|
Loading…
Reference in New Issue