version 1.1, 2014/04/04 12:53:59 |
version 1.1.2.1, 2014/08/10 06:56:50 |
|
|
int _bus_dmamap_load_buffer (bus_dma_tag_t, bus_dmamap_t, void *, |
int _bus_dmamap_load_buffer (bus_dma_tag_t, bus_dmamap_t, void *, |
bus_size_t, struct vmspace *, int, paddr_t *, int *, int); |
bus_size_t, struct vmspace *, int, paddr_t *, int *, int); |
|
|
#undef PHYS_TO_BUS_MEM |
|
#define PHYS_TO_BUS_MEM(_t_, _a_) rumpcomp_pci_virt_to_mach((void *)_a_) |
|
#undef BUS_MEM_TO_PHYS |
|
#define BUS_MEM_TO_PHYS(_t_, _a_) rumpcomp_pci_mach_to_virt(_a_) |
|
|
|
/* |
/* |
* Common function for DMA map creation. May be called by bus-specific |
* Common function for DMA map creation. May be called by bus-specific |
* DMA map creation functions. |
* DMA map creation functions. |
Line 212 _bus_dmamap_load_buffer(bus_dma_tag_t t, |
|
Line 207 _bus_dmamap_load_buffer(bus_dma_tag_t t, |
|
* the previous segment if possible. |
* the previous segment if possible. |
*/ |
*/ |
if (first) { |
if (first) { |
map->dm_segs[seg].ds_addr = PHYS_TO_BUS_MEM(t, curaddr); |
map->dm_segs[seg].ds_addr |
|
= rumpcomp_pci_virt_to_mach((void *)curaddr); |
map->dm_segs[seg].ds_len = sgsize; |
map->dm_segs[seg].ds_len = sgsize; |
first = 0; |
first = 0; |
} else { |
} else { |
Line 221 _bus_dmamap_load_buffer(bus_dma_tag_t t, |
|
Line 217 _bus_dmamap_load_buffer(bus_dma_tag_t t, |
|
map->dm_maxsegsz && |
map->dm_maxsegsz && |
(map->_dm_boundary == 0 || |
(map->_dm_boundary == 0 || |
(map->dm_segs[seg].ds_addr & bmask) == |
(map->dm_segs[seg].ds_addr & bmask) == |
(PHYS_TO_BUS_MEM(t, curaddr) & bmask))) |
(rumpcomp_pci_virt_to_mach((void*)curaddr)&bmask))) |
map->dm_segs[seg].ds_len += sgsize; |
map->dm_segs[seg].ds_len += sgsize; |
else { |
else { |
if (++seg >= map->_dm_segcnt) |
if (++seg >= map->_dm_segcnt) |
break; |
break; |
map->dm_segs[seg].ds_addr = |
map->dm_segs[seg].ds_addr = |
PHYS_TO_BUS_MEM(t, curaddr); |
rumpcomp_pci_virt_to_mach((void *)curaddr); |
map->dm_segs[seg].ds_len = sgsize; |
map->dm_segs[seg].ds_len = sgsize; |
} |
} |
} |
} |
Line 334 bus_dmamap_load_mbuf(bus_dma_tag_t t, bu |
|
Line 330 bus_dmamap_load_mbuf(bus_dma_tag_t t, bu |
|
continue; |
continue; |
} |
} |
map->dm_segs[seg].ds_addr = |
map->dm_segs[seg].ds_addr = |
PHYS_TO_BUS_MEM(t, lastaddr); |
rumpcomp_pci_virt_to_mach((void *)lastaddr); |
map->dm_segs[seg].ds_len = m->m_len; |
map->dm_segs[seg].ds_len = m->m_len; |
lastaddr += m->m_len; |
lastaddr += m->m_len; |
continue; |
continue; |
|
|
bus_dmamem_map(bus_dma_tag_t t, bus_dma_segment_t *segs, int nsegs, |
bus_dmamem_map(bus_dma_tag_t t, bus_dma_segment_t *segs, int nsegs, |
size_t size, void **kvap, int flags) |
size_t size, void **kvap, int flags) |
{ |
{ |
|
struct rumpcomp_pci_dmaseg *dss; |
|
size_t allocsize = nsegs * sizeof(*dss); |
|
int rv, i; |
|
|
if (nsegs != 1) |
/* |
panic("bus_dmamem_map: only nsegs == 1 supported"); |
* Though rumpcomp_pci_dmaseg "accidentally" matches the |
*kvap = rumpcomp_pci_mach_to_virt(segs[0].ds_addr); |
* bus_dma segment descriptor (at least for now), act |
|
* proper and actually translate it. |
|
*/ |
|
dss = kmem_alloc(allocsize, KM_SLEEP); |
|
for (i = 0; i < nsegs; i++) { |
|
dss[i].ds_pa = segs[i].ds_addr; |
|
dss[i].ds_len = segs[i].ds_len; |
|
dss[i].ds_vacookie = segs[i]._ds_vacookie; |
|
} |
|
rv = rumpcomp_pci_dmamem_map(dss, nsegs, size, kvap); |
|
kmem_free(dss, allocsize); |
|
|
return 0; |
return rv; |
} |
} |
|
|
/* |
/* |
Line 499 bus_dmamem_alloc(bus_dma_tag_t t, bus_si |
|
Line 508 bus_dmamem_alloc(bus_dma_tag_t t, bus_si |
|
int flags) |
int flags) |
{ |
{ |
paddr_t curaddr, lastaddr, pa; |
paddr_t curaddr, lastaddr, pa; |
|
vaddr_t vacookie; |
int curseg, error; |
int curseg, error; |
|
|
/* Always round the size. */ |
/* Always round the size. */ |
Line 513 bus_dmamem_alloc(bus_dma_tag_t t, bus_si |
|
Line 523 bus_dmamem_alloc(bus_dma_tag_t t, bus_si |
|
#else |
#else |
/* XXX: ignores boundary, nsegs, etc. */ |
/* XXX: ignores boundary, nsegs, etc. */ |
//printf("dma allocation %lx %lx %d\n", alignment, boundary, nsegs); |
//printf("dma allocation %lx %lx %d\n", alignment, boundary, nsegs); |
error = rumpcomp_pci_dmalloc(size, alignment, &pa); |
error = rumpcomp_pci_dmalloc(size, alignment, &pa, &vacookie); |
#endif |
#endif |
if (error) |
if (error) |
return (error); |
return (error); |
Line 525 bus_dmamem_alloc(bus_dma_tag_t t, bus_si |
|
Line 535 bus_dmamem_alloc(bus_dma_tag_t t, bus_si |
|
curseg = 0; |
curseg = 0; |
lastaddr = segs[curseg].ds_addr = pa; |
lastaddr = segs[curseg].ds_addr = pa; |
segs[curseg].ds_len = PAGE_SIZE; |
segs[curseg].ds_len = PAGE_SIZE; |
|
segs[curseg]._ds_vacookie = vacookie; |
size -= PAGE_SIZE; |
size -= PAGE_SIZE; |
pa += PAGE_SIZE; |
pa += PAGE_SIZE; |
|
vacookie += PAGE_SIZE; |
|
|
for (; size; pa += PAGE_SIZE, size -= PAGE_SIZE) { |
for (; size; |
|
pa += PAGE_SIZE, vacookie += PAGE_SIZE, size -= PAGE_SIZE) { |
curaddr = pa; |
curaddr = pa; |
if (curaddr == (lastaddr + PAGE_SIZE) && |
if (curaddr == (lastaddr + PAGE_SIZE) && |
(lastaddr & boundary) == (curaddr & boundary)) { |
(lastaddr & boundary) == (curaddr & boundary)) { |
Line 539 bus_dmamem_alloc(bus_dma_tag_t t, bus_si |
|
Line 552 bus_dmamem_alloc(bus_dma_tag_t t, bus_si |
|
return EFBIG; |
return EFBIG; |
segs[curseg].ds_addr = curaddr; |
segs[curseg].ds_addr = curaddr; |
segs[curseg].ds_len = PAGE_SIZE; |
segs[curseg].ds_len = PAGE_SIZE; |
|
segs[curseg]._ds_vacookie = vacookie; |
} |
} |
lastaddr = curaddr; |
lastaddr = curaddr; |
} |
} |