Module Name: src Committed By: jmcneill Date: Tue Nov 5 23:29:28 UTC 2019
Modified Files: src/sys/external/bsd/drm2/dist/include/drm: drmP.h drm_gem_cma_helper.h src/sys/external/bsd/drm2/drm: drm_gem_cma_helper.c src/sys/external/bsd/drm2/include/drm: drm_os_netbsd.h Log Message: Add support for DRM GEM/CMA helpers using a driver provided vmem arena. To generate a diff of this commit: cvs rdiff -u -r1.35 -r1.36 src/sys/external/bsd/drm2/dist/include/drm/drmP.h cvs rdiff -u -r1.5 -r1.6 \ src/sys/external/bsd/drm2/dist/include/drm/drm_gem_cma_helper.h cvs rdiff -u -r1.8 -r1.9 src/sys/external/bsd/drm2/drm/drm_gem_cma_helper.c cvs rdiff -u -r1.14 -r1.15 \ src/sys/external/bsd/drm2/include/drm/drm_os_netbsd.h 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/include/drm/drmP.h diff -u src/sys/external/bsd/drm2/dist/include/drm/drmP.h:1.35 src/sys/external/bsd/drm2/dist/include/drm/drmP.h:1.36 --- src/sys/external/bsd/drm2/dist/include/drm/drmP.h:1.35 Fri Dec 21 07:51:18 2018 +++ src/sys/external/bsd/drm2/dist/include/drm/drmP.h Tue Nov 5 23:29:28 2019 @@ -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 @@ struct drm_device { 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 */ Index: src/sys/external/bsd/drm2/dist/include/drm/drm_gem_cma_helper.h diff -u src/sys/external/bsd/drm2/dist/include/drm/drm_gem_cma_helper.h:1.5 src/sys/external/bsd/drm2/dist/include/drm/drm_gem_cma_helper.h:1.6 --- src/sys/external/bsd/drm2/dist/include/drm/drm_gem_cma_helper.h:1.5 Mon Aug 27 15:26:15 2018 +++ src/sys/external/bsd/drm2/dist/include/drm/drm_gem_cma_helper.h Tue Nov 5 23:29:28 2019 @@ -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 @@ struct drm_gem_cma_object { 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 Index: src/sys/external/bsd/drm2/drm/drm_gem_cma_helper.c diff -u src/sys/external/bsd/drm2/drm/drm_gem_cma_helper.c:1.8 src/sys/external/bsd/drm2/drm/drm_gem_cma_helper.c:1.9 --- src/sys/external/bsd/drm2/drm/drm_gem_cma_helper.c:1.8 Tue Nov 5 09:59:16 2019 +++ src/sys/external/bsd/drm2/drm/drm_gem_cma_helper.c Tue Nov 5 23:29:28 2019 @@ -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 <jmcne...@invisible.ca> @@ -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 @@ drm_gem_cma_create_internal(struct drm_d 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 @@ destroy: 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 @@ drm_gem_cma_obj_free(struct drm_gem_cma_ 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)); Index: src/sys/external/bsd/drm2/include/drm/drm_os_netbsd.h diff -u src/sys/external/bsd/drm2/include/drm/drm_os_netbsd.h:1.14 src/sys/external/bsd/drm2/include/drm/drm_os_netbsd.h:1.15 --- src/sys/external/bsd/drm2/include/drm/drm_os_netbsd.h:1.14 Sun Apr 7 20:28:41 2019 +++ src/sys/external/bsd/drm2/include/drm/drm_os_netbsd.h Tue Nov 5 23:29:28 2019 @@ -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_ */