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

Reply via email to