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
}
}