diff options
author | Marc Aurele La France <tsi@cvs.openbsd.org> | 2007-01-26 16:53:30 +0000 |
---|---|---|
committer | Marc Aurele La France <tsi@cvs.openbsd.org> | 2007-01-26 16:53:30 +0000 |
commit | bebe8c10e5e02a1f829ee1ad4638411fbe2442ec (patch) | |
tree | 4a8ac806692aaa6046e5ab0037b886e0d8141071 /sys/arch/sparc64 | |
parent | 6c075fc6aa36b5e276387bd092751c5dba415add (diff) |
Deal with zero wraparound in DVMA range checks;
Fix default DVMA range for Schizo's with no "virtual-dma" property;
Add TSB size indicator to Schizo & Psycho debugging messages.
ok jason@
Diffstat (limited to 'sys/arch/sparc64')
-rw-r--r-- | sys/arch/sparc64/dev/iommu.c | 24 | ||||
-rw-r--r-- | sys/arch/sparc64/dev/iommureg.h | 8 | ||||
-rw-r--r-- | sys/arch/sparc64/dev/psycho.c | 4 | ||||
-rw-r--r-- | sys/arch/sparc64/dev/schizo.c | 6 |
4 files changed, 20 insertions, 22 deletions
diff --git a/sys/arch/sparc64/dev/iommu.c b/sys/arch/sparc64/dev/iommu.c index 8e78f79b043..2fc6003883e 100644 --- a/sys/arch/sparc64/dev/iommu.c +++ b/sys/arch/sparc64/dev/iommu.c @@ -1,4 +1,4 @@ -/* $OpenBSD: iommu.c,v 1.43 2006/09/01 20:07:57 miod Exp $ */ +/* $OpenBSD: iommu.c,v 1.44 2007/01/26 16:53:28 tsi Exp $ */ /* $NetBSD: iommu.c,v 1.47 2002/02/08 20:03:45 eeh Exp $ */ /* @@ -150,12 +150,12 @@ iommu_init(char *name, struct iommu_state *is, int tsbsize, u_int32_t iovabase) */ is->is_cr = (tsbsize << 16) | IOMMUCR_EN; is->is_tsbsize = tsbsize; - if (iovabase == -1) { + if (iovabase == (u_int32_t)-1) { is->is_dvmabase = IOTSB_VSTART(is->is_tsbsize); is->is_dvmaend = IOTSB_VEND; } else { is->is_dvmabase = iovabase; - is->is_dvmaend = iovabase + IOTSB_VSIZE(tsbsize); + is->is_dvmaend = iovabase + IOTSB_VSIZE(tsbsize) - 1; } /* @@ -211,12 +211,12 @@ iommu_init(char *name, struct iommu_state *is, int tsbsize, u_int32_t iovabase) /* * Now all the hardware's working we need to allocate a dvma map. */ - printf("dvma map %x-%x, ", is->is_dvmabase, is->is_dvmaend - 1); + printf("dvma map %x-%x, ", is->is_dvmabase, is->is_dvmaend); printf("iotdb %llx-%llx", (unsigned long long)is->is_ptsb, (unsigned long long)(is->is_ptsb + size)); is->is_dvmamap = extent_create(name, - is->is_dvmabase, is->is_dvmaend - PAGE_SIZE, + is->is_dvmabase, (u_long)is->is_dvmaend + 1, M_DEVBUF, 0, 0, EX_NOWAIT); /* @@ -297,8 +297,7 @@ iommu_enter(struct iommu_state *is, struct strbuf_ctl *sb, vaddr_t va, volatile int64_t *tte_ptr = &is->is_tsb[IOTSBSLOT(va,is->is_tsbsize)]; #ifdef DIAGNOSTIC - if (va < is->is_dvmabase || round_page(va + PAGE_SIZE) > - is->is_dvmaend + 1) + if (va < is->is_dvmabase || (va + PAGE_MASK) > is->is_dvmaend) panic("iommu_enter: va %#lx not in DVMA space", va); tte = *tte_ptr; @@ -356,8 +355,7 @@ iommu_remove(struct iommu_state *is, struct strbuf_ctl *sb, vaddr_t va) int64_t tte; #ifdef DIAGNOSTIC - if (trunc_page(va) < is->is_dvmabase || round_page(va) > - is->is_dvmaend + 1) + if (va < is->is_dvmabase || (va + PAGE_MASK) > is->is_dvmaend) panic("iommu_remove: va 0x%lx not in DVMA space", (u_long)va); if (va != trunc_page(va)) { printf("iommu_remove: unaligned va: %lx\n", va); @@ -445,7 +443,7 @@ iommu_tsb_entry(struct iommu_state *is, vaddr_t dva) { int64_t tte; - if (dva < is->is_dvmabase && dva > is->is_dvmaend) + if (dva < is->is_dvmabase || dva > is->is_dvmaend) panic("invalid dva: %llx", (long long)dva); tte = is->is_tsb[IOTSBSLOT(dva,is->is_tsbsize)]; @@ -1338,8 +1336,8 @@ iommu_dvmamap_validate_map(bus_dma_tag_t t, struct iommu_state *is, err = 1; } if (map->_dm_dvmastart < is->is_dvmabase || - round_page(map->_dm_dvmastart + map->_dm_dvmasize) > - is->is_dvmaend + 1) { + (round_page(map->_dm_dvmastart + map->_dm_dvmasize) - 1) > + is->is_dvmaend) { printf("dvmaddr %llx len %llx out of range %x - %x\n", map->_dm_dvmastart, map->_dm_dvmasize, is->is_dvmabase, is->is_dvmaend); @@ -1558,7 +1556,7 @@ iommu_dvmamap_sync_range(struct strbuf_ctl *sb, vaddr_t va, bus_size_t len) va &= ~PAGE_MASK; #ifdef DIAGNOSTIC - if (va < is->is_dvmabase || vaend > is->is_dvmaend) + if (va < is->is_dvmabase || (vaend - 1) > is->is_dvmaend) panic("invalid va range: %llx to %llx (%x to %x)", (long long)va, (long long)vaend, is->is_dvmabase, diff --git a/sys/arch/sparc64/dev/iommureg.h b/sys/arch/sparc64/dev/iommureg.h index 219b9e766f4..e5c5ec86109 100644 --- a/sys/arch/sparc64/dev/iommureg.h +++ b/sys/arch/sparc64/dev/iommureg.h @@ -1,4 +1,4 @@ -/* $OpenBSD: iommureg.h,v 1.13 2006/08/27 18:55:57 kettenis Exp $ */ +/* $OpenBSD: iommureg.h,v 1.14 2007/01/26 16:53:28 tsi Exp $ */ /* $NetBSD: iommureg.h,v 1.6 2001/07/20 00:07:13 eeh Exp $ */ /* @@ -128,9 +128,9 @@ struct iommu_strbuf { */ -#define IOTSB_VEND (u_int)(0xffffffffffffffffLL<<PGSHIFT) -#define IOTSB_VSTART(sz) (u_int)(IOTSB_VEND << ((sz)+10)) -#define IOTSB_VSIZE(sz) (u_int)(1 << ((sz)+10+PGSHIFT)) +#define IOTSB_VEND 0xffffffffU +#define IOTSB_VSTART(sz) (u_int)(IOTSB_VEND << ((sz)+10+PGSHIFT)) +#define IOTSB_VSIZE(sz) (u_int)(1 << ((sz)+10+PGSHIFT)) #define MAKEIOTTE(pa,w,c,s) (((pa)&IOTTE_PAMASK)|((w)?IOTTE_W:0)|((c)?IOTTE_C:0)|((s)?IOTTE_STREAM:0)|(IOTTE_V|IOTTE_8K)) #define IOTSBSLOT(va,sz) ((u_int)(((vaddr_t)(va))-(is->is_dvmabase))>>PGSHIFT) diff --git a/sys/arch/sparc64/dev/psycho.c b/sys/arch/sparc64/dev/psycho.c index 34539f093e3..ac0a2b42383 100644 --- a/sys/arch/sparc64/dev/psycho.c +++ b/sys/arch/sparc64/dev/psycho.c @@ -1,4 +1,4 @@ -/* $OpenBSD: psycho.c,v 1.49 2006/12/24 01:25:01 deraadt Exp $ */ +/* $OpenBSD: psycho.c,v 1.50 2007/01/26 16:53:28 tsi Exp $ */ /* $NetBSD: psycho.c,v 1.39 2001/10/07 20:30:41 eeh Exp $ */ /* @@ -835,7 +835,7 @@ psycho_iommu_init(struct psycho_softc *sc, int tsbsize) free(vdma, M_DEVBUF); } else { DPRINTF(PDB_CONF, ("psycho_iommu_init: getprop failed, " - "iobase=0x%x\n", iobase)); + "iobase=0x%x, tsbsize=%d\n", iobase, tsbsize)); } /* give us a nice name.. */ diff --git a/sys/arch/sparc64/dev/schizo.c b/sys/arch/sparc64/dev/schizo.c index 10fc53ba859..9e3de1943fc 100644 --- a/sys/arch/sparc64/dev/schizo.c +++ b/sys/arch/sparc64/dev/schizo.c @@ -1,4 +1,4 @@ -/* $OpenBSD: schizo.c,v 1.44 2007/01/20 16:26:53 kettenis Exp $ */ +/* $OpenBSD: schizo.c,v 1.45 2007/01/26 16:53:29 tsi Exp $ */ /* * Copyright (c) 2002 Jason L. Wright (jason@thought.net) @@ -351,7 +351,7 @@ void schizo_init_iommu(struct schizo_softc *sc, struct schizo_pbm *pbm) { struct iommu_state *is = &pbm->sp_is; - int *vdma = NULL, nitem, tsbsize = 128 * 1024; + int *vdma = NULL, nitem, tsbsize = 7; u_int32_t iobase = -1; vaddr_t va; char *name; @@ -412,7 +412,7 @@ schizo_init_iommu(struct schizo_softc *sc, struct schizo_pbm *pbm) free(vdma, M_DEVBUF); } else { DPRINTF(SDB_BUSMAP, ("schizo_iommu_init: getprop failed, " - "iobase=0x%x\n", iobase)); + "using iobase=0x%x, tsbsize=%d\n", iobase, tsbsize)); } iommu_init(name, is, tsbsize, iobase); |