Module Name:    src
Committed By:   riastradh
Date:           Tue Oct 25 23:32:04 UTC 2022

Modified Files:
        src/sys/external/bsd/drm2/dist/drm/vmwgfx: vmwgfx_cmdbuf.c

Log Message:
vmwgfx(4): dma_alloc/free_coherent -> bus_dma_*


To generate a diff of this commit:
cvs rdiff -u -r1.4 -r1.5 \
    src/sys/external/bsd/drm2/dist/drm/vmwgfx/vmwgfx_cmdbuf.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/sys/external/bsd/drm2/dist/drm/vmwgfx/vmwgfx_cmdbuf.c
diff -u src/sys/external/bsd/drm2/dist/drm/vmwgfx/vmwgfx_cmdbuf.c:1.4 src/sys/external/bsd/drm2/dist/drm/vmwgfx/vmwgfx_cmdbuf.c:1.5
--- src/sys/external/bsd/drm2/dist/drm/vmwgfx/vmwgfx_cmdbuf.c:1.4	Thu Feb 17 01:21:02 2022
+++ src/sys/external/bsd/drm2/dist/drm/vmwgfx/vmwgfx_cmdbuf.c	Tue Oct 25 23:32:04 2022
@@ -1,4 +1,4 @@
-/*	$NetBSD: vmwgfx_cmdbuf.c,v 1.4 2022/02/17 01:21:02 riastradh Exp $	*/
+/*	$NetBSD: vmwgfx_cmdbuf.c,v 1.5 2022/10/25 23:32:04 riastradh Exp $	*/
 
 // SPDX-License-Identifier: GPL-2.0 OR MIT
 /**************************************************************************
@@ -28,7 +28,7 @@
  **************************************************************************/
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: vmwgfx_cmdbuf.c,v 1.4 2022/02/17 01:21:02 riastradh Exp $");
+__KERNEL_RCSID(0, "$NetBSD: vmwgfx_cmdbuf.c,v 1.5 2022/10/25 23:32:04 riastradh Exp $");
 
 #include <linux/dmapool.h>
 #include <linux/pci.h>
@@ -137,6 +137,10 @@ struct vmw_cmdbuf_man {
 	bool irq_on;
 	bool using_mob;
 	bool has_pool;
+#ifdef __NetBSD__
+	bus_dmamap_t dmamap;
+	bus_dma_segment_t dmaseg;
+#endif
 	dma_addr_t handle;
 	size_t size;
 	u32 num_contexts;
@@ -1237,8 +1241,46 @@ int vmw_cmdbuf_set_pool_size(struct vmw_
 
 	/* First, try to allocate a huge chunk of DMA memory */
 	size = PAGE_ALIGN(size);
+#ifdef __NetBSD__
+	int error, nseg, alloced = 0,  mapped = 0, loaded = 0;
+
+	do {
+		error = bus_dmamap_create(dev_priv->dev->dmat, size, 1, size,
+		    0, BUS_DMA_ALLOCNOW|BUS_DMA_WAITOK, &man->dmamap);
+		if (error)
+			break;
+		error = bus_dmamem_alloc(dev_priv->dev->dmat, size, 1, 0,
+		    &man->dmaseg, 1, &nseg, BUS_DMA_WAITOK);
+		if (error)
+			break;
+		KASSERT(nseg == 1);
+		alloced = 1;
+		error = bus_dmamem_map(dev_priv->dev->dmat, &man->dmaseg, 1,
+		    size, (void *)&man->map, BUS_DMA_COHERENT|BUS_DMA_WAITOK);
+		if (error)
+			break;
+		mapped = 1;
+		error = bus_dmamap_load(dev_priv->dev->dmat, man->dmamap,
+		    man->map, size, NULL, BUS_DMA_WAITOK);
+		if (error)
+			break;
+		loaded = 1;
+	} while (0);
+	if (error) {
+		if (loaded)
+			bus_dmamap_unload(dev_priv->dev->dmat, man->dmamap);
+		if (mapped)
+			bus_dmamem_unmap(dev_priv->dev->dmat, man->map, size);
+		if (alloced)
+			bus_dmamem_free(dev_priv->dev->dmat, &man->dmaseg, 1);
+		if (man->dmamap)
+			bus_dmamap_destroy(dev_priv->dev->dmat, man->dmamap);
+		man->map = NULL;
+	}
+#else
 	man->map = dma_alloc_coherent(&dev_priv->dev->pdev->dev, size,
 				      &man->handle, GFP_KERNEL);
+#endif
 	if (man->map) {
 		man->using_mob = false;
 	} else {
@@ -1393,8 +1435,16 @@ void vmw_cmdbuf_remove_pool(struct vmw_c
 		ttm_bo_put(man->cmd_space);
 		man->cmd_space = NULL;
 	} else {
+#ifdef __NetBSD__
+		const bus_dma_tag_t dmat = man->dev_priv->dev->dmat;
+		bus_dmamap_unload(dmat, man->dmamap);
+		bus_dmamem_unmap(dmat, man->map, man->size);
+		bus_dmamem_free(dmat, &man->dmaseg, 1);
+		bus_dmamap_destroy(dmat, man->dmamap);
+#else
 		dma_free_coherent(&man->dev_priv->dev->pdev->dev,
 				  man->size, man->map, man->handle);
+#endif
 	}
 }
 

Reply via email to