Module Name:    src
Committed By:   riastradh
Date:           Mon Aug 27 15:26:16 UTC 2018

Modified Files:
        src/sys/external/bsd/drm2/dist/include/drm: drm_gem_cma_helper.h
        src/sys/external/bsd/drm2/drm: drm_gem_cma_helper.c

Log Message:
Implement remainder of drm_gem_cma_helper API.


To generate a diff of this commit:
cvs rdiff -u -r1.4 -r1.5 \
    src/sys/external/bsd/drm2/dist/include/drm/drm_gem_cma_helper.h
cvs rdiff -u -r1.2 -r1.3 src/sys/external/bsd/drm2/drm/drm_gem_cma_helper.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/include/drm/drm_gem_cma_helper.h
diff -u src/sys/external/bsd/drm2/dist/include/drm/drm_gem_cma_helper.h:1.4 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.4	Mon Aug 27 06:57:00 2018
+++ src/sys/external/bsd/drm2/dist/include/drm/drm_gem_cma_helper.h	Mon Aug 27 15:26:15 2018
@@ -1,4 +1,4 @@
-/*	$NetBSD: drm_gem_cma_helper.h,v 1.4 2018/08/27 06:57:00 riastradh Exp $	*/
+/*	$NetBSD: drm_gem_cma_helper.h,v 1.5 2018/08/27 15:26:15 riastradh Exp $	*/
 
 #ifndef __DRM_GEM_CMA_HELPER_H__
 #define __DRM_GEM_CMA_HELPER_H__
@@ -22,8 +22,8 @@ struct drm_gem_cma_object {
 	bus_dmamap_t dmamap;
 #else
 	dma_addr_t paddr;
-	struct sg_table *sgt;
 #endif
+	struct sg_table *sgt;
 
 	/* For objects with DMA memory allocated by GEM CMA */
 	void *vaddr;
@@ -72,16 +72,19 @@ extern const struct vm_operations_struct
 void drm_gem_cma_describe(struct drm_gem_cma_object *obj, struct seq_file *m);
 #endif
 
-#ifndef __NetBSD__		/* XXX drm prime */
 struct sg_table *drm_gem_cma_prime_get_sg_table(struct drm_gem_object *obj);
 struct drm_gem_object *
 drm_gem_cma_prime_import_sg_table(struct drm_device *dev,
 				  struct dma_buf_attachment *attach,
 				  struct sg_table *sgt);
+#ifdef __NetBSD__
+int drm_gem_cma_prime_mmap(struct drm_gem_object *, off_t *, size_t, int,
+    int *, int *, struct uvm_object **, int *);
+#else
 int drm_gem_cma_prime_mmap(struct drm_gem_object *obj,
 			   struct vm_area_struct *vma);
+#endif
 void *drm_gem_cma_prime_vmap(struct drm_gem_object *obj);
 void drm_gem_cma_prime_vunmap(struct drm_gem_object *obj, void *vaddr);
-#endif
 
 #endif /* __DRM_GEM_CMA_HELPER_H__ */

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.2 src/sys/external/bsd/drm2/drm/drm_gem_cma_helper.c:1.3
--- src/sys/external/bsd/drm2/drm/drm_gem_cma_helper.c:1.2	Mon Aug 27 06:57:00 2018
+++ src/sys/external/bsd/drm2/drm/drm_gem_cma_helper.c	Mon Aug 27 15:26:16 2018
@@ -1,4 +1,4 @@
-/* $NetBSD: drm_gem_cma_helper.c,v 1.2 2018/08/27 06:57:00 riastradh Exp $ */
+/* $NetBSD: drm_gem_cma_helper.c,v 1.3 2018/08/27 15:26:16 riastradh Exp $ */
 
 /*-
  * Copyright (c) 2015-2017 Jared McNeill <[email protected]>
@@ -27,7 +27,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: drm_gem_cma_helper.c,v 1.2 2018/08/27 06:57:00 riastradh Exp $");
+__KERNEL_RCSID(0, "$NetBSD: drm_gem_cma_helper.c,v 1.3 2018/08/27 15:26:16 riastradh Exp $");
 
 #include <drm/drmP.h>
 #include <drm/drm_gem_cma_helper.h>
@@ -82,10 +82,14 @@ failed:
 static void
 drm_gem_cma_obj_free(struct drm_gem_cma_object *obj)
 {
+
 	bus_dmamap_unload(obj->dmat, obj->dmamap);
 	bus_dmamap_destroy(obj->dmat, obj->dmamap);
 	bus_dmamem_unmap(obj->dmat, obj->vaddr, obj->dmasize);
-	bus_dmamem_free(obj->dmat, obj->dmasegs, 1);
+	if (obj->sgt)
+		drm_prime_sg_free(obj->sgt);
+	else
+		bus_dmamem_free(obj->dmat, obj->dmasegs, 1);
 	kmem_free(obj, sizeof(*obj));
 }
 
@@ -219,3 +223,63 @@ const struct uvm_pagerops drm_gem_cma_uv
 	.pgo_detach = drm_gem_pager_detach,
 	.pgo_fault = drm_gem_cma_fault,
 };
+
+struct sg_table *
+drm_gem_cma_prime_get_sg_table(struct drm_gem_object *gem_obj)
+{
+	struct drm_gem_cma_object *obj = to_drm_gem_cma_obj(gem_obj);
+
+	return drm_prime_bus_dmamem_to_sg(obj->dmasegs, 1);
+}
+
+struct drm_gem_object *
+drm_gem_cma_prime_import_sg_table(struct drm_device *ddev,
+    struct dma_buf_attachment *attach, struct sg_table *sgt)
+{
+	struct drm_gem_cma_object *obj;
+	int error;
+
+	obj = kmem_zalloc(sizeof(*obj), KM_SLEEP);
+	obj->dmat = ddev->dmat;
+	obj->dmasize = drm_prime_sg_size(sgt);
+
+	error = bus_dmamap_create(obj->dmat, obj->dmasize, 1, obj->dmasize, 0,
+	    BUS_DMA_WAITOK, &obj->dmamap);
+	if (error)
+		goto failed;
+	/* XXX errno Linux->NetBSD */
+	error = -drm_prime_bus_dmamap_load_sgt(obj->dmat, obj->dmamap, sgt);
+	if (error)
+		goto destroy;
+	error = -drm_prime_bus_dmamem_map(obj->dmat, sgt, &obj->vaddr,
+	    BUS_DMA_WAITOK | BUS_DMA_COHERENT);
+	if (error)
+		goto unload;
+
+	return &obj->base;
+
+unload:
+	bus_dmamap_unload(obj->dmat, obj->dmamap);
+destroy:
+	bus_dmamap_destroy(obj->dmat, obj->dmamap);
+failed:
+	kmem_free(obj, sizeof(*obj));
+	return ERR_PTR(-error);	/* XXX errno NetBSD->Linux */
+}
+
+void *
+drm_gem_cma_prime_vmap(struct drm_gem_object *gem_obj)
+{
+	struct drm_gem_cma_object *obj = to_drm_gem_cma_obj(gem_obj);
+
+	return obj->vaddr;
+}
+
+void
+drm_gem_cma_prime_vunmap(struct drm_gem_object *gem_obj, void *vaddr)
+{
+	struct drm_gem_cma_object *obj __diagused =
+	    to_drm_gem_cma_obj(gem_obj);
+
+	KASSERT(vaddr == obj->vaddr);
+}

Reply via email to