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;