Module Name:    src
Committed By:   riastradh
Date:           Sun Dec 19 12:29:17 UTC 2021

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

Log Message:
drm/ttm: Fix ttm_tt pages and DMA map allocation.


To generate a diff of this commit:
cvs rdiff -u -r1.17 -r1.18 src/sys/external/bsd/drm2/dist/drm/ttm/ttm_tt.c
cvs rdiff -u -r1.6 -r1.7 \
    src/sys/external/bsd/drm2/dist/include/drm/ttm/ttm_tt.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/drm/ttm/ttm_tt.c
diff -u src/sys/external/bsd/drm2/dist/drm/ttm/ttm_tt.c:1.17 src/sys/external/bsd/drm2/dist/drm/ttm/ttm_tt.c:1.18
--- src/sys/external/bsd/drm2/dist/drm/ttm/ttm_tt.c:1.17	Sun Dec 19 11:32:54 2021
+++ src/sys/external/bsd/drm2/dist/drm/ttm/ttm_tt.c	Sun Dec 19 12:29:16 2021
@@ -1,4 +1,4 @@
-/*	$NetBSD: ttm_tt.c,v 1.17 2021/12/19 11:32:54 riastradh Exp $	*/
+/*	$NetBSD: ttm_tt.c,v 1.18 2021/12/19 12:29:16 riastradh Exp $	*/
 
 /* SPDX-License-Identifier: GPL-2.0 OR MIT */
 /**************************************************************************
@@ -32,7 +32,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: ttm_tt.c,v 1.17 2021/12/19 11:32:54 riastradh Exp $");
+__KERNEL_RCSID(0, "$NetBSD: ttm_tt.c,v 1.18 2021/12/19 12:29:16 riastradh Exp $");
 
 #define pr_fmt(fmt) "[TTM] " fmt
 
@@ -98,8 +98,26 @@ static int ttm_tt_alloc_page_directory(s
 	return 0;
 }
 
+static int ttm_sg_tt_alloc_page_directory(struct ttm_dma_tt *);
+
 static int ttm_dma_tt_alloc_page_directory(struct ttm_dma_tt *ttm)
 {
+#ifdef __NetBSD__
+	int r;
+
+	/* Create array of pages at ttm->ttm.pages.  */
+	r = ttm_tt_alloc_page_directory(&ttm->ttm);
+	if (r)
+		return r;
+
+	/* Create bus DMA map at ttm->dma_address.  */
+	r = ttm_sg_tt_alloc_page_directory(ttm);
+	if (r)
+		return r;
+
+	/* Success!  */
+	return 0;
+#else
 	ttm->ttm.pages = kvmalloc_array(ttm->ttm.num_pages,
 					  sizeof(*ttm->ttm.pages) +
 					  sizeof(*ttm->dma_address),
@@ -108,16 +126,25 @@ static int ttm_dma_tt_alloc_page_directo
 		return -ENOMEM;
 	ttm->dma_address = (void *) (ttm->ttm.pages + ttm->ttm.num_pages);
 	return 0;
+#endif
 }
 
 static int ttm_sg_tt_alloc_page_directory(struct ttm_dma_tt *ttm)
 {
+#ifdef __NetBSD__
+	ttm->dma_address = NULL;
+	/* XXX errno NetBSD->Linux */
+	return -bus_dmamap_create(ttm->ttm.bdev->dmat,
+	    ttm->ttm.num_pages << PAGE_SHIFT, ttm->ttm.num_pages, PAGE_SIZE, 0,
+	    BUS_DMA_WAITOK, &ttm->dma_address);
+#else
 	ttm->dma_address = kvmalloc_array(ttm->ttm.num_pages,
 					  sizeof(*ttm->dma_address),
 					  GFP_KERNEL | __GFP_ZERO);
 	if (!ttm->dma_address)
 		return -ENOMEM;
 	return 0;
+#endif
 }
 
 static int ttm_tt_set_page_caching(struct page *p,
@@ -295,38 +322,7 @@ int ttm_dma_tt_init(struct ttm_dma_tt *t
 		pr_err("Failed allocating page table\n");
 		return -ENOMEM;
 	}
-#ifdef __NetBSD__
-    {
-	int error;
-
-	if (ttm->num_pages > (SIZE_MAX /
-		MIN(sizeof(ttm_dma->dma_segs[0]), PAGE_SIZE))) {
-		error = ENOMEM;
-		goto fail0;
-	}
-	ttm_dma->dma_segs = kmem_alloc((ttm->num_pages *
-		sizeof(ttm_dma->dma_segs[0])), KM_SLEEP);
-	error = bus_dmamap_create(ttm->bdev->dmat,
-	    (ttm->num_pages * PAGE_SIZE), ttm->num_pages, PAGE_SIZE, 0,
-	    BUS_DMA_WAITOK, &ttm_dma->dma_address);
-	if (error)
-		goto fail1;
-
 	return 0;
-
-fail2: __unused
-	bus_dmamap_destroy(ttm->bdev->dmat, ttm_dma->dma_address);
-fail1:	kmem_free(ttm_dma->dma_segs, (ttm->num_pages *
-		sizeof(ttm_dma->dma_segs[0])));
-fail0:	KASSERT(error);
-	drm_free_large(ttm->pages);
-	uao_detach(ttm->swap_storage);
-	/* XXX errno NetBSD->Linux */
-	return -error;
-    }
-#else
-	return 0;
-#endif
 }
 EXPORT_SYMBOL(ttm_dma_tt_init);
 
@@ -357,23 +353,19 @@ void ttm_dma_tt_fini(struct ttm_dma_tt *
 	struct ttm_tt *ttm = &ttm_dma->ttm;
 
 #ifdef __NetBSD__
-	bus_dmamap_destroy(ttm->bdev->dmat, ttm_dma->dma_address);
-	kmem_free(ttm_dma->dma_segs, (ttm->num_pages *
-		sizeof(ttm_dma->dma_segs[0])));
-#endif
-
+	if (ttm_dma->dma_address) {
+		bus_dmamap_destroy(ttm->bdev->dmat, ttm_dma->dma_address);
+		ttm_dma->dma_address = NULL;
+	}
+	ttm_tt_fini(ttm);
+#else
 	if (ttm->pages)
 		kvfree(ttm->pages);
 	else
 		kvfree(ttm_dma->dma_address);
 	ttm->pages = NULL;
-
-#ifdef __NetBSD__
-	uao_detach(ttm->swap_storage);
-	ttm->swap_storage = NULL;
-#endif
-
 	ttm_dma->dma_address = NULL;
+#endif
 }
 EXPORT_SYMBOL(ttm_dma_tt_fini);
 

Index: src/sys/external/bsd/drm2/dist/include/drm/ttm/ttm_tt.h
diff -u src/sys/external/bsd/drm2/dist/include/drm/ttm/ttm_tt.h:1.6 src/sys/external/bsd/drm2/dist/include/drm/ttm/ttm_tt.h:1.7
--- src/sys/external/bsd/drm2/dist/include/drm/ttm/ttm_tt.h:1.6	Sun Dec 19 11:32:54 2021
+++ src/sys/external/bsd/drm2/dist/include/drm/ttm/ttm_tt.h	Sun Dec 19 12:29:16 2021
@@ -1,4 +1,4 @@
-/*	$NetBSD: ttm_tt.h,v 1.6 2021/12/19 11:32:54 riastradh Exp $	*/
+/*	$NetBSD: ttm_tt.h,v 1.7 2021/12/19 12:29:16 riastradh Exp $	*/
 
 /**************************************************************************
  *
@@ -138,7 +138,6 @@ struct ttm_tt {
 struct ttm_dma_tt {
 	struct ttm_tt ttm;
 #ifdef __NetBSD__
-	bus_dma_segment_t *dma_segs;
 	bus_dmamap_t dma_address;
 #else
 	dma_addr_t *dma_address;

Reply via email to