Hi!
Please consider attached patches:
(rump) Implement bus_dmamem_free()
(pci-userspace) Implement rumpcomp_pci_free(), used by
bus_dmamem_free() in RUMP
Thanks
--
Robert Millan
diff --git a/sys/rump/dev/lib/libpci/pci_user.h b/sys/rump/dev/lib/libpci/pci_user.h
index 56cb715..62eb97b 100644
--- a/sys/rump/dev/lib/libpci/pci_user.h
+++ b/sys/rump/dev/lib/libpci/pci_user.h
@@ -7,6 +7,7 @@ void *rumpcomp_pci_irq_establish(unsigned, int (*)(void *), void *);
/* XXX: needs work: support boundary-restricted allocations */
int rumpcomp_pci_dmalloc(size_t, size_t, unsigned long *, unsigned long *);
+void rumpcomp_pci_free(unsigned long, size_t);
struct rumpcomp_pci_dmaseg {
unsigned long ds_pa;
diff --git a/sys/rump/dev/lib/libpci/rumpdev_bus_dma.c b/sys/rump/dev/lib/libpci/rumpdev_bus_dma.c
index bb8352a..cd8033a 100644
--- a/sys/rump/dev/lib/libpci/rumpdev_bus_dma.c
+++ b/sys/rump/dev/lib/libpci/rumpdev_bus_dma.c
@@ -446,8 +446,10 @@ bus_dmamap_sync(bus_dma_tag_t t, bus_dmamap_t map,
void
bus_dmamem_free(bus_dma_tag_t t, bus_dma_segment_t *segs, int nsegs)
{
+ vaddr_t vacookie = segs[0]._ds_vacookie;
+ bus_size_t sizecookie = segs[0]._ds_sizecookie;
- panic("bus_dmamem_free not implemented");
+ rumpcomp_pci_free(vacookie, sizecookie);
}
/*
@@ -509,11 +511,14 @@ bus_dmamem_alloc(bus_dma_tag_t t, bus_size_t size, bus_size_t alignment,
{
paddr_t curaddr, lastaddr, pa;
vaddr_t vacookie;
+ size_t sizecookie;
int curseg, error;
/* Always round the size. */
size = round_page(size);
+ sizecookie = size;
+
/*
* Allocate pages from the VM system.
*/
@@ -536,6 +541,7 @@ bus_dmamem_alloc(bus_dma_tag_t t, bus_size_t size, bus_size_t alignment,
lastaddr = segs[curseg].ds_addr = pa;
segs[curseg].ds_len = PAGE_SIZE;
segs[curseg]._ds_vacookie = vacookie;
+ segs[curseg]._ds_sizecookie = sizecookie;
size -= PAGE_SIZE;
pa += PAGE_SIZE;
vacookie += PAGE_SIZE;
@@ -553,6 +559,7 @@ bus_dmamem_alloc(bus_dma_tag_t t, bus_size_t size, bus_size_t alignment,
segs[curseg].ds_addr = curaddr;
segs[curseg].ds_len = PAGE_SIZE;
segs[curseg]._ds_vacookie = vacookie;
+ segs[curseg]._ds_sizecookie = sizecookie;
}
lastaddr = curaddr;
}
diff --git a/sys/rump/include/sys/bus.h b/sys/rump/include/sys/bus.h
index c547c69..0ef71b9 100644
--- a/sys/rump/include/sys/bus.h
+++ b/sys/rump/include/sys/bus.h
@@ -48,6 +48,7 @@ typedef struct {
bus_addr_t ds_addr;
bus_size_t ds_len;
vaddr_t _ds_vacookie;
+ bus_size_t _ds_sizecookie;
} bus_dma_segment_t;
typedef struct {
diff --git a/src-linux-uio/pci_user-uio_linux.c b/src-linux-uio/pci_user-uio_linux.c
index eb49548..cf6e6a5 100644
--- a/src-linux-uio/pci_user-uio_linux.c
+++ b/src-linux-uio/pci_user-uio_linux.c
@@ -289,6 +289,13 @@ rumpcomp_pci_dmalloc(size_t size, size_t align,
return 0;
}
+void
+rumpcomp_pci_free(unsigned long vap, size_t size)
+{
+ void *v = (void *) vap;
+ munmap(v, size);
+}
+
/*
* "maps" dma memory into virtual address space. For now, we just
* rely on it already being mapped. This means that support for