Source-Changes-HG archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
[src/trunk]: src/sys/external/bsd/drm2 Add support for DRM GEM/CMA helpers us...
details: https://anonhg.NetBSD.org/src/rev/08a320e05108
branches: trunk
changeset: 460839:08a320e05108
user: jmcneill <jmcneill%NetBSD.org@localhost>
date: Tue Nov 05 23:29:28 2019 +0000
description:
Add support for DRM GEM/CMA helpers using a driver provided vmem arena.
diffstat:
sys/external/bsd/drm2/dist/include/drm/drmP.h | 3 +-
sys/external/bsd/drm2/dist/include/drm/drm_gem_cma_helper.h | 4 +-
sys/external/bsd/drm2/drm/drm_gem_cma_helper.c | 34 +++++++++++-
sys/external/bsd/drm2/include/drm/drm_os_netbsd.h | 4 +-
4 files changed, 37 insertions(+), 8 deletions(-)
diffs (123 lines):
diff -r 0d86473c0f78 -r 08a320e05108 sys/external/bsd/drm2/dist/include/drm/drmP.h
--- a/sys/external/bsd/drm2/dist/include/drm/drmP.h Tue Nov 05 23:27:23 2019 +0000
+++ b/sys/external/bsd/drm2/dist/include/drm/drmP.h Tue Nov 05 23:29:28 2019 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: drmP.h,v 1.35 2018/12/21 07:51:18 maya Exp $ */
+/* $NetBSD: drmP.h,v 1.36 2019/11/05 23:29:28 jmcneill Exp $ */
/*
* Internal Header for the Direct Rendering Manager
@@ -931,6 +931,7 @@
bool dmat_subregion_p;
bus_addr_t dmat_subregion_min;
bus_addr_t dmat_subregion_max;
+ vmem_t *cma_pool;
#endif
struct drm_sg_mem *sg; /**< Scatter gather memory */
diff -r 0d86473c0f78 -r 08a320e05108 sys/external/bsd/drm2/dist/include/drm/drm_gem_cma_helper.h
--- a/sys/external/bsd/drm2/dist/include/drm/drm_gem_cma_helper.h Tue Nov 05 23:27:23 2019 +0000
+++ b/sys/external/bsd/drm2/dist/include/drm/drm_gem_cma_helper.h Tue Nov 05 23:29:28 2019 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: drm_gem_cma_helper.h,v 1.5 2018/08/27 15:26:15 riastradh Exp $ */
+/* $NetBSD: drm_gem_cma_helper.h,v 1.6 2019/11/05 23:29:28 jmcneill Exp $ */
#ifndef __DRM_GEM_CMA_HELPER_H__
#define __DRM_GEM_CMA_HELPER_H__
@@ -20,6 +20,8 @@
bus_dma_segment_t dmasegs[1];
bus_size_t dmasize;
bus_dmamap_t dmamap;
+ vmem_t *vmem_pool;
+ vmem_addr_t vmem_addr;
#else
dma_addr_t paddr;
#endif
diff -r 0d86473c0f78 -r 08a320e05108 sys/external/bsd/drm2/drm/drm_gem_cma_helper.c
--- a/sys/external/bsd/drm2/drm/drm_gem_cma_helper.c Tue Nov 05 23:27:23 2019 +0000
+++ b/sys/external/bsd/drm2/drm/drm_gem_cma_helper.c Tue Nov 05 23:29:28 2019 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: drm_gem_cma_helper.c,v 1.8 2019/11/05 09:59:16 jmcneill Exp $ */
+/* $NetBSD: drm_gem_cma_helper.c,v 1.9 2019/11/05 23:29:28 jmcneill Exp $ */
/*-
* Copyright (c) 2015-2017 Jared McNeill <jmcneill%invisible.ca@localhost>
@@ -27,10 +27,11 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: drm_gem_cma_helper.c,v 1.8 2019/11/05 09:59:16 jmcneill Exp $");
+__KERNEL_RCSID(0, "$NetBSD: drm_gem_cma_helper.c,v 1.9 2019/11/05 23:29:28 jmcneill Exp $");
#include <drm/drmP.h>
#include <drm/drm_gem_cma_helper.h>
+#include <drm/bus_dma_hacks.h>
#include <uvm/uvm.h>
@@ -49,8 +50,24 @@
error = -drm_prime_sg_to_bus_dmamem(obj->dmat, obj->dmasegs, 1,
&nsegs, sgt);
} else {
- error = bus_dmamem_alloc(obj->dmat, obj->dmasize, PAGE_SIZE, 0,
- obj->dmasegs, 1, &nsegs, BUS_DMA_WAITOK);
+ if (ddev->cma_pool != NULL) {
+ error = vmem_xalloc(ddev->cma_pool, obj->dmasize,
+ PAGE_SIZE, 0, 0, VMEM_ADDR_MIN, VMEM_ADDR_MAX,
+ VM_BESTFIT | VM_NOSLEEP, &obj->vmem_addr);
+ if (!error) {
+ obj->vmem_pool = ddev->cma_pool;
+ obj->dmasegs[0].ds_addr =
+ PHYS_TO_BUS_MEM(obj->dmat, obj->vmem_addr);
+ obj->dmasegs[0].ds_len =
+ roundup(obj->dmasize, PAGE_SIZE);
+ nsegs = 1;
+ }
+ }
+ if (obj->vmem_pool == NULL) {
+ error = bus_dmamem_alloc(obj->dmat, obj->dmasize,
+ PAGE_SIZE, 0, obj->dmasegs, 1, &nsegs,
+ BUS_DMA_WAITOK);
+ }
}
if (error)
goto failed;
@@ -80,7 +97,12 @@
unmap:
bus_dmamem_unmap(obj->dmat, obj->vaddr, obj->dmasize);
free:
- bus_dmamem_free(obj->dmat, obj->dmasegs, nsegs);
+ if (obj->sgt)
+ drm_prime_sg_free(obj->sgt);
+ else if (obj->vmem_pool)
+ vmem_xfree(obj->vmem_pool, obj->vmem_addr, obj->dmasize);
+ else
+ bus_dmamem_free(obj->dmat, obj->dmasegs, nsegs);
failed:
kmem_free(obj, sizeof(*obj));
@@ -103,6 +125,8 @@
bus_dmamem_unmap(obj->dmat, obj->vaddr, obj->dmasize);
if (obj->sgt)
drm_prime_sg_free(obj->sgt);
+ else if (obj->vmem_pool)
+ vmem_xfree(obj->vmem_pool, obj->vmem_addr, obj->dmasize);
else
bus_dmamem_free(obj->dmat, obj->dmasegs, 1);
kmem_free(obj, sizeof(*obj));
diff -r 0d86473c0f78 -r 08a320e05108 sys/external/bsd/drm2/include/drm/drm_os_netbsd.h
--- a/sys/external/bsd/drm2/include/drm/drm_os_netbsd.h Tue Nov 05 23:27:23 2019 +0000
+++ b/sys/external/bsd/drm2/include/drm/drm_os_netbsd.h Tue Nov 05 23:29:28 2019 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: drm_os_netbsd.h,v 1.14 2019/04/07 20:28:41 maya Exp $ */
+/* $NetBSD: drm_os_netbsd.h,v 1.15 2019/11/05 23:29:28 jmcneill Exp $ */
/*-
* Copyright (c) 2013 The NetBSD Foundation, Inc.
@@ -72,4 +72,6 @@
#include <drm/drm_irq_netbsd.h>
#include <drm/drm_wait_netbsd.h>
+#include <sys/vmem.h>
+
#endif /* _DRM_DRM_OS_NETBSD_H_ */
Home |
Main Index |
Thread Index |
Old Index