summaryrefslogtreecommitdiff
path: root/sys/external
diff options
context:
space:
mode:
authorriastradh <riastradh@NetBSD.org>2021-12-19 12:29:16 +0000
committerriastradh <riastradh@NetBSD.org>2021-12-19 12:29:16 +0000
commit246dfdb859fc359ca9fbc312fc6b6ee2a5b2a3d0 (patch)
tree79527a71f893e498aa988321eedb75386a03be2e /sys/external
parent9785ff9fde336b004783055974e10444d157c7d6 (diff)
drm/ttm: Fix ttm_tt pages and DMA map allocation.
Diffstat (limited to 'sys/external')
-rw-r--r--sys/external/bsd/drm2/dist/drm/ttm/ttm_tt.c80
-rw-r--r--sys/external/bsd/drm2/dist/include/drm/ttm/ttm_tt.h3
2 files changed, 37 insertions, 46 deletions
diff --git a/sys/external/bsd/drm2/dist/drm/ttm/ttm_tt.c b/sys/external/bsd/drm2/dist/drm/ttm/ttm_tt.c
index 1d50adeaea9..38d2b9868bc 100644
--- a/sys/external/bsd/drm2/dist/drm/ttm/ttm_tt.c
+++ b/sys/external/bsd/drm2/dist/drm/ttm/ttm_tt.c
@@ -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(struct ttm_tt *ttm)
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_directory(struct ttm_dma_tt *ttm)
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 *ttm_dma, struct ttm_buffer_object *bo,
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 *ttm_dma)
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);
diff --git a/sys/external/bsd/drm2/dist/include/drm/ttm/ttm_tt.h b/sys/external/bsd/drm2/dist/include/drm/ttm/ttm_tt.h
index 17f965245dd..9d53f8fdcf9 100644
--- a/sys/external/bsd/drm2/dist/include/drm/ttm/ttm_tt.h
+++ b/sys/external/bsd/drm2/dist/include/drm/ttm/ttm_tt.h
@@ -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;