Sync w/ i386 port.

This commit is contained in:
thorpej 1998-06-03 04:20:22 +00:00
parent 50be447da3
commit 2e846b8c1e
3 changed files with 56 additions and 25 deletions

View File

@ -1,4 +1,4 @@
/* $NetBSD: bus_dma.c,v 1.3 1998/06/02 20:41:47 mark Exp $ */
/* $NetBSD: bus_dma.c,v 1.4 1998/06/03 04:20:22 thorpej Exp $ */
/*-
* Copyright (c) 1996, 1997, 1998 The NetBSD Foundation, Inc.
@ -595,7 +595,7 @@ _bus_dmamap_load_buffer(map, buf, buflen, p, flags, lastaddrp, segp, first)
{
bus_size_t sgsize;
bus_addr_t curaddr, lastaddr, baddr, bmask;
caddr_t vaddr = buf;
vm_offset_t vaddr = (vm_offset_t)buf;
int seg;
pmap_t pmap;
@ -616,7 +616,7 @@ _bus_dmamap_load_buffer(map, buf, buflen, p, flags, lastaddrp, segp, first)
/*
* Get the physical address for this segment.
*/
curaddr = (bus_addr_t)pmap_extract(pmap, (vm_offset_t)vaddr);
curaddr = pmap_extract(pmap, (vm_offset_t)vaddr);
/*
* Compute the segment size, and adjust counts.
@ -624,9 +624,12 @@ _bus_dmamap_load_buffer(map, buf, buflen, p, flags, lastaddrp, segp, first)
sgsize = NBPG - ((u_long)vaddr & PGOFSET);
if (buflen < sgsize)
sgsize = buflen;
/* If needed, compute upper boundary line and adjust seg size */
/*
* Make sure we don't cross any boundaries.
*/
if (map->_dm_boundary > 0) {
baddr = ((u_long)curaddr + map->_dm_boundary) & bmask;
baddr = (curaddr + map->_dm_boundary) & bmask;
if (sgsize > (baddr - curaddr))
sgsize = (baddr - curaddr);
}
@ -638,23 +641,22 @@ _bus_dmamap_load_buffer(map, buf, buflen, p, flags, lastaddrp, segp, first)
if (first) {
map->dm_segs[seg].ds_addr = curaddr;
map->dm_segs[seg].ds_len = sgsize;
map->dm_segs[seg].ds_vaddr = (bus_addr_t)vaddr;
map->dm_segs[seg].ds_vaddr = vaddr;
first = 0;
} else {
if (curaddr == lastaddr &&
(map->dm_segs[seg].ds_len + sgsize) <=
map->_dm_maxsegsz &&
(map->_dm_boundary == 0 ||
(map->_dm_boundary == 0 ||
(map->dm_segs[seg].ds_addr & bmask) ==
(curaddr & bmask)))
map->dm_segs[seg].ds_len += sgsize;
else {
seg++;
if (seg >= map->_dm_segcnt)
if (++seg >= map->_dm_segcnt)
break;
map->dm_segs[seg].ds_addr = curaddr;
map->dm_segs[seg].ds_len = sgsize;
map->dm_segs[seg].ds_vaddr = (bus_addr_t)vaddr;
map->dm_segs[seg].ds_vaddr = vaddr;
}
}

View File

@ -1,4 +1,4 @@
/* $NetBSD: bus.c,v 1.6 1998/05/24 19:32:38 is Exp $ */
/* $NetBSD: bus.c,v 1.7 1998/06/03 04:26:34 thorpej Exp $ */
/*-
* Copyright (c) 1998 The NetBSD Foundation, Inc.
@ -573,14 +573,15 @@ _bus_dmamap_load_buffer(t, map, buf, buflen, p, flags, lastaddrp, segp, first)
int first;
{
bus_size_t sgsize;
bus_addr_t curaddr, lastaddr, offset;
caddr_t vaddr = buf;
bus_addr_t curaddr, lastaddr, offset, baddr, bmask;
vm_offset_t vaddr = (vm_offset_t)buf;
int seg;
pmap_t pmap;
if (t == BUS_PCI_DMA_TAG)
offset = 0x80000000; /* XXX */
else offset = 0;
else
offset = 0;
if (p != NULL)
pmap = p->p_vmspace->vm_map.pmap;
@ -588,12 +589,13 @@ _bus_dmamap_load_buffer(t, map, buf, buflen, p, flags, lastaddrp, segp, first)
pmap = pmap_kernel();
lastaddr = *lastaddrp;
bmask = ~(map->_dm_boundary - 1);
for (seg = *segp; buflen > 0 && seg < map->_dm_segcnt; ) {
for (seg = *segp; buflen > 0 ; ) {
/*
* Get the physical address for this segment.
*/
curaddr = (bus_addr_t)pmap_extract(pmap, (vm_offset_t)vaddr);
curaddr = pmap_extract(pmap, vaddr);
/*
* Compute the segment size, and adjust counts.
@ -602,6 +604,15 @@ _bus_dmamap_load_buffer(t, map, buf, buflen, p, flags, lastaddrp, segp, first)
if (buflen < sgsize)
sgsize = buflen;
/*
* Make sure we don't cross any boundaries.
*/
if (map->_dm_boundary > 0) {
baddr = (curaddr + map->_dm_boundary) & bmask;
if (sgsize > (baddr - curaddr))
sgsize = (baddr - curaddr);
}
/*
* Insert chunk into a segment, coalescing with
* previous segment if possible.
@ -613,10 +624,14 @@ _bus_dmamap_load_buffer(t, map, buf, buflen, p, flags, lastaddrp, segp, first)
} else {
if (curaddr == lastaddr &&
(map->dm_segs[seg].ds_len + sgsize) <=
map->_dm_maxsegsz)
map->_dm_maxsegsz &&
(map->_dm_boundary == 0 ||
(map->dm_segs[seg].ds_addr & bmask) ==
(curaddr & bmask)))
map->dm_segs[seg].ds_len += sgsize;
else {
seg++;
if (++seg >= map->_dm_segcnt)
break;
map->dm_segs[seg].ds_addr = curaddr + offset;
map->dm_segs[seg].ds_len = sgsize;
}

View File

@ -1,4 +1,4 @@
/* $NetBSD: bus_dma.c,v 1.10 1998/02/12 01:19:04 sakamoto Exp $ */
/* $NetBSD: bus_dma.c,v 1.11 1998/06/03 04:30:20 thorpej Exp $ */
/*-
* Copyright (c) 1996, 1997, 1998 The NetBSD Foundation, Inc.
@ -513,8 +513,8 @@ _bus_dmamap_load_buffer(map, buf, buflen, p, flags, lastaddrp, segp, first)
int first;
{
bus_size_t sgsize;
bus_addr_t curaddr, lastaddr;
caddr_t vaddr = buf;
bus_addr_t curaddr, lastaddr, baddr, bmask;
vm_offset_t vaddr = (vm_offset_t)buf;
int seg;
pmap_t pmap;
@ -524,12 +524,13 @@ _bus_dmamap_load_buffer(map, buf, buflen, p, flags, lastaddrp, segp, first)
pmap = pmap_kernel();
lastaddr = *lastaddrp;
bmask = ~(map->_dm_boundary - 1);
for (seg = *segp; buflen > 0 && seg < map->_dm_segcnt; ) {
for (seg = *segp; buflen > 0 ; ) {
/*
* Get the physical address for this segment.
*/
curaddr = (bus_addr_t)pmap_extract(pmap, (vm_offset_t)vaddr);
curaddr = pmap_extract(pmap, vaddr);
/*
* Compute the segment size, and adjust counts.
@ -538,6 +539,15 @@ _bus_dmamap_load_buffer(map, buf, buflen, p, flags, lastaddrp, segp, first)
if (buflen < sgsize)
sgsize = buflen;
/*
* Make sure we don't cross any boundaries.
*/
if (map->_dm_boundary > 0) {
baddr = (curaddr + map->_dm_boundary) & bmask;
if (sgsize > (baddr - curaddr))
sgsize = (baddr - curaddr);
}
/*
* Insert chunk into a segment, coalescing with
* previous segment if possible.
@ -549,10 +559,14 @@ _bus_dmamap_load_buffer(map, buf, buflen, p, flags, lastaddrp, segp, first)
} else {
if (curaddr == lastaddr &&
(map->dm_segs[seg].ds_len + sgsize) <=
map->_dm_maxsegsz)
map->_dm_maxsegsz &&
(map->_dm_boundary == 0 ||
(map->dm_segs[seg].ds_addr & bmask) ==
(curaddr & bmask)))
map->dm_segs[seg].ds_len += sgsize;
else {
seg++;
if (++seg >= map->_dm_segcnt)
break;
map->dm_segs[seg].ds_addr = curaddr;
map->dm_segs[seg].ds_len = sgsize;
}