[PATCH 14/14] drm/ttm: isolate dma data from ttm_tt
From: Jerome GlisseMove dma data to a superset ttm_dma_tt structure which herit from ttm_tt. This allow driver that don't use dma functionalities to not have to waste memory for it. Signed-off-by: Jerome Glisse --- drivers/gpu/drm/nouveau/nouveau_bo.c | 18 + drivers/gpu/drm/nouveau/nouveau_sgdma.c | 22 +++ drivers/gpu/drm/radeon/radeon_ttm.c | 43 +++--- drivers/gpu/drm/ttm/ttm_page_alloc.c | 10 +++--- drivers/gpu/drm/ttm/ttm_page_alloc_dma.c | 38 +++- drivers/gpu/drm/ttm/ttm_tt.c | 58 - drivers/gpu/drm/vmwgfx/vmwgfx_buffer.c |2 + include/drm/ttm/ttm_bo_driver.h | 31 +++- include/drm/ttm/ttm_page_alloc.h | 12 ++ 9 files changed, 155 insertions(+), 79 deletions(-) diff --git a/drivers/gpu/drm/nouveau/nouveau_bo.c b/drivers/gpu/drm/nouveau/nouveau_bo.c index 36234a7..df3f19c 100644 --- a/drivers/gpu/drm/nouveau/nouveau_bo.c +++ b/drivers/gpu/drm/nouveau/nouveau_bo.c @@ -1052,6 +1052,7 @@ nouveau_bo_fence(struct nouveau_bo *nvbo, struct nouveau_fence *fence) static int nouveau_ttm_tt_populate(struct ttm_tt *ttm) { + struct ttm_dma_tt *ttm_dma = (void *)ttm; struct drm_nouveau_private *dev_priv; struct drm_device *dev; unsigned i; @@ -1065,7 +1066,7 @@ nouveau_ttm_tt_populate(struct ttm_tt *ttm) #ifdef CONFIG_SWIOTLB if ((dma_get_mask(dev->dev) <= DMA_BIT_MASK(32)) && swiotlb_nr_tbl()) { - return ttm_dma_populate(ttm, dev->dev); + return ttm_dma_populate((void *)ttm, dev->dev); } #endif @@ -1075,14 +1076,14 @@ nouveau_ttm_tt_populate(struct ttm_tt *ttm) } for (i = 0; i < ttm->num_pages; i++) { - ttm->dma_address[i] = pci_map_page(dev->pdev, ttm->pages[i], + ttm_dma->dma_address[i] = pci_map_page(dev->pdev, ttm->pages[i], 0, PAGE_SIZE, PCI_DMA_BIDIRECTIONAL); - if (pci_dma_mapping_error(dev->pdev, ttm->dma_address[i])) { + if (pci_dma_mapping_error(dev->pdev, ttm_dma->dma_address[i])) { while (--i) { - pci_unmap_page(dev->pdev, ttm->dma_address[i], + pci_unmap_page(dev->pdev, ttm_dma->dma_address[i], PAGE_SIZE, PCI_DMA_BIDIRECTIONAL); - ttm->dma_address[i] = 0; + ttm_dma->dma_address[i] = 0; } ttm_page_alloc_ttm_tt_unpopulate(ttm); return -EFAULT; @@ -1094,6 +1095,7 @@ nouveau_ttm_tt_populate(struct ttm_tt *ttm) static void nouveau_ttm_tt_unpopulate(struct ttm_tt *ttm) { + struct ttm_dma_tt *ttm_dma = (void *)ttm; struct drm_nouveau_private *dev_priv; struct drm_device *dev; unsigned i; @@ -1103,14 +1105,14 @@ nouveau_ttm_tt_unpopulate(struct ttm_tt *ttm) #ifdef CONFIG_SWIOTLB if ((dma_get_mask(dev->dev) <= DMA_BIT_MASK(32)) && swiotlb_nr_tbl()) { - ttm_dma_unpopulate(ttm, dev->dev); + ttm_dma_unpopulate((void *)ttm, dev->dev); return; } #endif for (i = 0; i < ttm->num_pages; i++) { - if (ttm->dma_address[i]) { - pci_unmap_page(dev->pdev, ttm->dma_address[i], + if (ttm_dma->dma_address[i]) { + pci_unmap_page(dev->pdev, ttm_dma->dma_address[i], PAGE_SIZE, PCI_DMA_BIDIRECTIONAL); } } diff --git a/drivers/gpu/drm/nouveau/nouveau_sgdma.c b/drivers/gpu/drm/nouveau/nouveau_sgdma.c index ee1eb7c..47f245e 100644 --- a/drivers/gpu/drm/nouveau/nouveau_sgdma.c +++ b/drivers/gpu/drm/nouveau/nouveau_sgdma.c @@ -8,7 +8,10 @@ #define NV_CTXDMA_PAGE_MASK (NV_CTXDMA_PAGE_SIZE - 1) struct nouveau_sgdma_be { - struct ttm_tt ttm; + /* this has to be the first field so populate/unpopulated in +* nouve_bo.c works properly, otherwise have to move them here +*/ + struct ttm_dma_tt ttm; struct drm_device *dev; u64 offset; }; @@ -20,6 +23,7 @@ nouveau_sgdma_destroy(struct ttm_tt *ttm) if (ttm) { NV_DEBUG(nvbe->dev, "\n"); + ttm_dma_tt_fini(>ttm); kfree(nvbe); } } @@ -38,7 +42,7 @@ nv04_sgdma_bind(struct ttm_tt *ttm, struct ttm_mem_reg *mem) nvbe->offset = mem->start << PAGE_SHIFT; pte = (nvbe->offset >> NV_CTXDMA_PAGE_SHIFT) + 2; for (i = 0; i < ttm->num_pages; i++) { - dma_addr_t dma_offset = ttm->dma_address[i]; + dma_addr_t dma_offset = nvbe->ttm.dma_address[i]; uint32_t offset_l = lower_32_bits(dma_offset);
[PATCH 14/14] drm/ttm: isolate dma data from ttm_tt
From: Jerome Glisse jgli...@redhat.com Move dma data to a superset ttm_dma_tt structure which herit from ttm_tt. This allow driver that don't use dma functionalities to not have to waste memory for it. Signed-off-by: Jerome Glisse jgli...@redhat.com --- drivers/gpu/drm/nouveau/nouveau_bo.c | 18 + drivers/gpu/drm/nouveau/nouveau_sgdma.c | 22 +++ drivers/gpu/drm/radeon/radeon_ttm.c | 43 +++--- drivers/gpu/drm/ttm/ttm_page_alloc.c | 10 +++--- drivers/gpu/drm/ttm/ttm_page_alloc_dma.c | 38 +++- drivers/gpu/drm/ttm/ttm_tt.c | 58 - drivers/gpu/drm/vmwgfx/vmwgfx_buffer.c |2 + include/drm/ttm/ttm_bo_driver.h | 31 +++- include/drm/ttm/ttm_page_alloc.h | 12 ++ 9 files changed, 155 insertions(+), 79 deletions(-) diff --git a/drivers/gpu/drm/nouveau/nouveau_bo.c b/drivers/gpu/drm/nouveau/nouveau_bo.c index 36234a7..df3f19c 100644 --- a/drivers/gpu/drm/nouveau/nouveau_bo.c +++ b/drivers/gpu/drm/nouveau/nouveau_bo.c @@ -1052,6 +1052,7 @@ nouveau_bo_fence(struct nouveau_bo *nvbo, struct nouveau_fence *fence) static int nouveau_ttm_tt_populate(struct ttm_tt *ttm) { + struct ttm_dma_tt *ttm_dma = (void *)ttm; struct drm_nouveau_private *dev_priv; struct drm_device *dev; unsigned i; @@ -1065,7 +1066,7 @@ nouveau_ttm_tt_populate(struct ttm_tt *ttm) #ifdef CONFIG_SWIOTLB if ((dma_get_mask(dev-dev) = DMA_BIT_MASK(32)) swiotlb_nr_tbl()) { - return ttm_dma_populate(ttm, dev-dev); + return ttm_dma_populate((void *)ttm, dev-dev); } #endif @@ -1075,14 +1076,14 @@ nouveau_ttm_tt_populate(struct ttm_tt *ttm) } for (i = 0; i ttm-num_pages; i++) { - ttm-dma_address[i] = pci_map_page(dev-pdev, ttm-pages[i], + ttm_dma-dma_address[i] = pci_map_page(dev-pdev, ttm-pages[i], 0, PAGE_SIZE, PCI_DMA_BIDIRECTIONAL); - if (pci_dma_mapping_error(dev-pdev, ttm-dma_address[i])) { + if (pci_dma_mapping_error(dev-pdev, ttm_dma-dma_address[i])) { while (--i) { - pci_unmap_page(dev-pdev, ttm-dma_address[i], + pci_unmap_page(dev-pdev, ttm_dma-dma_address[i], PAGE_SIZE, PCI_DMA_BIDIRECTIONAL); - ttm-dma_address[i] = 0; + ttm_dma-dma_address[i] = 0; } ttm_page_alloc_ttm_tt_unpopulate(ttm); return -EFAULT; @@ -1094,6 +1095,7 @@ nouveau_ttm_tt_populate(struct ttm_tt *ttm) static void nouveau_ttm_tt_unpopulate(struct ttm_tt *ttm) { + struct ttm_dma_tt *ttm_dma = (void *)ttm; struct drm_nouveau_private *dev_priv; struct drm_device *dev; unsigned i; @@ -1103,14 +1105,14 @@ nouveau_ttm_tt_unpopulate(struct ttm_tt *ttm) #ifdef CONFIG_SWIOTLB if ((dma_get_mask(dev-dev) = DMA_BIT_MASK(32)) swiotlb_nr_tbl()) { - ttm_dma_unpopulate(ttm, dev-dev); + ttm_dma_unpopulate((void *)ttm, dev-dev); return; } #endif for (i = 0; i ttm-num_pages; i++) { - if (ttm-dma_address[i]) { - pci_unmap_page(dev-pdev, ttm-dma_address[i], + if (ttm_dma-dma_address[i]) { + pci_unmap_page(dev-pdev, ttm_dma-dma_address[i], PAGE_SIZE, PCI_DMA_BIDIRECTIONAL); } } diff --git a/drivers/gpu/drm/nouveau/nouveau_sgdma.c b/drivers/gpu/drm/nouveau/nouveau_sgdma.c index ee1eb7c..47f245e 100644 --- a/drivers/gpu/drm/nouveau/nouveau_sgdma.c +++ b/drivers/gpu/drm/nouveau/nouveau_sgdma.c @@ -8,7 +8,10 @@ #define NV_CTXDMA_PAGE_MASK (NV_CTXDMA_PAGE_SIZE - 1) struct nouveau_sgdma_be { - struct ttm_tt ttm; + /* this has to be the first field so populate/unpopulated in +* nouve_bo.c works properly, otherwise have to move them here +*/ + struct ttm_dma_tt ttm; struct drm_device *dev; u64 offset; }; @@ -20,6 +23,7 @@ nouveau_sgdma_destroy(struct ttm_tt *ttm) if (ttm) { NV_DEBUG(nvbe-dev, \n); + ttm_dma_tt_fini(nvbe-ttm); kfree(nvbe); } } @@ -38,7 +42,7 @@ nv04_sgdma_bind(struct ttm_tt *ttm, struct ttm_mem_reg *mem) nvbe-offset = mem-start PAGE_SHIFT; pte = (nvbe-offset NV_CTXDMA_PAGE_SHIFT) + 2; for (i = 0; i ttm-num_pages; i++) { - dma_addr_t dma_offset = ttm-dma_address[i]; + dma_addr_t dma_offset = nvbe-ttm.dma_address[i]; uint32_t offset_l = lower_32_bits(dma_offset); for (j =