summaryrefslogtreecommitdiff
path: root/sys/arch
diff options
context:
space:
mode:
authorMiod Vallat <miod@cvs.openbsd.org>2007-12-04 05:41:49 +0000
committerMiod Vallat <miod@cvs.openbsd.org>2007-12-04 05:41:49 +0000
commit05ea74e4eb25c9e6e7c3e1303099351c159837ad (patch)
tree5e1f7f6092e5515335a1e95077327b8ab478f324 /sys/arch
parent8e5aef49c27d287819a82cc1208d986bf537b16b (diff)
Better cache routines for 88410, will only flush in pages instead of
flushing the whole secondary cache. This does not work around the snooping errata yet, I'm trying to get something not too ugly first.
Diffstat (limited to 'sys/arch')
-rw-r--r--sys/arch/mvme88k/mvme88k/m88110.c72
1 files changed, 48 insertions, 24 deletions
diff --git a/sys/arch/mvme88k/mvme88k/m88110.c b/sys/arch/mvme88k/mvme88k/m88110.c
index 47aaf8d5270..0cec6f53e37 100644
--- a/sys/arch/mvme88k/mvme88k/m88110.c
+++ b/sys/arch/mvme88k/mvme88k/m88110.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: m88110.c,v 1.46 2007/12/02 22:17:36 miod Exp $ */
+/* $OpenBSD: m88110.c,v 1.47 2007/12/04 05:41:48 miod Exp $ */
/*
* Copyright (c) 1998 Steve Murphree, Jr.
* All rights reserved.
@@ -350,7 +350,7 @@ m88110_set_uapr(apr_t ap)
set_dcmd(CMMU_DCMD_INV_UATC);
/* We need to at least invalidate the TIC, as it is va-addressed */
- mc88110_inval_inst();
+ set_icmd(CMMU_ICMD_INV_TIC);
}
/*
@@ -410,7 +410,6 @@ m88110_flush_cache(cpuid_t cpu, paddr_t pa, psize_t size)
set_psr(psr | PSR_IND);
mc88110_inval_inst();
- /* flush all data to avoid errata invalidate */
if (get_dctl() & CMMU_DCTL_CEN)
mc88110_flush_data();
@@ -427,8 +426,9 @@ m88410_flush_cache(cpuid_t cpu, paddr_t pa, psize_t size)
mc88110_inval_inst();
/* flush all data to avoid errata invalidate */
- if (get_dctl() & CMMU_DCTL_CEN)
+ if (get_dctl() & CMMU_DCTL_CEN) {
mc88110_flush_data();
+ }
mc88410_flush();
set_psr(psr);
@@ -568,8 +568,10 @@ m88410_dma_cachectl(pmap_t pmap, vaddr_t _va, vsize_t _size, int op)
switch (op) {
case DMA_CACHE_SYNC:
+#if 0
flusher = m88110_cmmu_sync_cache;
ext_flusher = mc88410_flush;
+#endif
break;
case DMA_CACHE_SYNC_INVAL:
flusher = m88110_cmmu_sync_inval_cache;
@@ -592,22 +594,33 @@ m88410_dma_cachectl(pmap_t pmap, vaddr_t _va, vsize_t _size, int op)
if (!ISSET(get_dctl(), CMMU_DCTL_CEN))
size = 0;
- if (op != DMA_CACHE_SYNC)
+ if (op == DMA_CACHE_SYNC) {
+ va = trunc_page(_va);
+ size = round_page(_va + _size) - va;
+ while (size != 0) {
+ if (pmap_extract(pmap, va, &pa) != FALSE) {
+ m88110_cmmu_sync_cache(pa, PAGE_SIZE);
+ mc88410_flush_page(pa);
+ }
+ va += PAGE_SIZE;
+ size -= PAGE_SIZE;
+ }
+ } else {
mc88110_inval_inst();
- while (size != 0) {
- count = (va & PAGE_MASK) == 0 && size >= PAGE_SIZE ?
- PAGE_SIZE : MC88110_CACHE_LINE;
+ while (size != 0) {
+ count = (va & PAGE_MASK) == 0 && size >= PAGE_SIZE ?
+ PAGE_SIZE : MC88110_CACHE_LINE;
- if (pmap_extract(pmap, va, &pa) != FALSE) {
- (*flusher)(pa, count);
- }
+ if (pmap_extract(pmap, va, &pa) != FALSE) {
+ (*flusher)(pa, count);
+ }
- va += count;
- size -= count;
+ va += count;
+ size -= count;
+ }
+ (*ext_flusher)();
}
- (*ext_flusher)();
-
set_psr(psr);
}
@@ -672,8 +685,10 @@ m88410_dma_cachectl_pa(paddr_t _pa, psize_t _size, int op)
switch (op) {
case DMA_CACHE_SYNC:
+#if 0
flusher = m88110_cmmu_sync_cache;
ext_flusher = mc88410_flush;
+#endif
break;
case DMA_CACHE_SYNC_INVAL:
flusher = m88110_cmmu_sync_inval_cache;
@@ -696,19 +711,28 @@ m88410_dma_cachectl_pa(paddr_t _pa, psize_t _size, int op)
if (!ISSET(get_dctl(), CMMU_DCTL_CEN))
size = 0;
- if (op != DMA_CACHE_SYNC)
+ if (op == DMA_CACHE_SYNC) {
+ pa = trunc_page(_pa);
+ size = round_page(_pa + _size) - pa;
+ while (size != 0) {
+ m88110_cmmu_sync_cache(pa, PAGE_SIZE);
+ mc88410_flush_page(pa);
+ pa += PAGE_SIZE;
+ size -= PAGE_SIZE;
+ }
+ } else {
mc88110_inval_inst();
- while (size != 0) {
- count = (pa & PAGE_MASK) == 0 && size >= PAGE_SIZE ?
- PAGE_SIZE : MC88110_CACHE_LINE;
+ while (size != 0) {
+ count = (pa & PAGE_MASK) == 0 && size >= PAGE_SIZE ?
+ PAGE_SIZE : MC88110_CACHE_LINE;
- (*flusher)(pa, count);
+ (*flusher)(pa, count);
- pa += count;
- size -= count;
+ pa += count;
+ size -= count;
+ }
+ (*ext_flusher)();
}
- (*ext_flusher)();
-
set_psr(psr);
}