drm/ttm: isolate dma data from ttm_tt V4
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.
V2 Rebase on top of no memory account changes (where/when is my
delorean when i need it ?)
V3 Make sure page list is initialized empty
V4 typo/syntax fixes
Signed-off-by: Jerome Glisse <jglisse@redhat.com>
Reviewed-by: Thomas Hellstrom <thellstrom@vmware.com>
diff --git a/drivers/gpu/drm/radeon/radeon_ttm.c b/drivers/gpu/drm/radeon/radeon_ttm.c
index f499b2c..e111a38 100644
--- a/drivers/gpu/drm/radeon/radeon_ttm.c
+++ b/drivers/gpu/drm/radeon/radeon_ttm.c
@@ -501,7 +501,7 @@
* TTM backend functions.
*/
struct radeon_ttm_tt {
- struct ttm_tt ttm;
+ struct ttm_dma_tt ttm;
struct radeon_device *rdev;
u64 offset;
};
@@ -509,17 +509,16 @@
static int radeon_ttm_backend_bind(struct ttm_tt *ttm,
struct ttm_mem_reg *bo_mem)
{
- struct radeon_ttm_tt *gtt;
+ struct radeon_ttm_tt *gtt = (void*)ttm;
int r;
- gtt = container_of(ttm, struct radeon_ttm_tt, ttm);
gtt->offset = (unsigned long)(bo_mem->start << PAGE_SHIFT);
if (!ttm->num_pages) {
WARN(1, "nothing to bind %lu pages for mreg %p back %p!\n",
ttm->num_pages, bo_mem, ttm);
}
r = radeon_gart_bind(gtt->rdev, gtt->offset,
- ttm->num_pages, ttm->pages, ttm->dma_address);
+ ttm->num_pages, ttm->pages, gtt->ttm.dma_address);
if (r) {
DRM_ERROR("failed to bind %lu pages at 0x%08X\n",
ttm->num_pages, (unsigned)gtt->offset);
@@ -530,18 +529,17 @@
static int radeon_ttm_backend_unbind(struct ttm_tt *ttm)
{
- struct radeon_ttm_tt *gtt;
+ struct radeon_ttm_tt *gtt = (void *)ttm;
- gtt = container_of(ttm, struct radeon_ttm_tt, ttm);
radeon_gart_unbind(gtt->rdev, gtt->offset, ttm->num_pages);
return 0;
}
static void radeon_ttm_backend_destroy(struct ttm_tt *ttm)
{
- struct radeon_ttm_tt *gtt;
+ struct radeon_ttm_tt *gtt = (void *)ttm;
- gtt = container_of(ttm, struct radeon_ttm_tt, ttm);
+ ttm_dma_tt_fini(>t->ttm);
kfree(gtt);
}
@@ -570,17 +568,19 @@
if (gtt == NULL) {
return NULL;
}
- gtt->ttm.func = &radeon_backend_func;
+ gtt->ttm.ttm.func = &radeon_backend_func;
gtt->rdev = rdev;
- if (ttm_tt_init(>t->ttm, bdev, size, page_flags, dummy_read_page)) {
+ if (ttm_dma_tt_init(>t->ttm, bdev, size, page_flags, dummy_read_page)) {
+ kfree(gtt);
return NULL;
}
- return >t->ttm;
+ return >t->ttm.ttm;
}
static int radeon_ttm_tt_populate(struct ttm_tt *ttm)
{
struct radeon_device *rdev;
+ struct radeon_ttm_tt *gtt = (void *)ttm;
unsigned i;
int r;
@@ -591,7 +591,7 @@
#ifdef CONFIG_SWIOTLB
if (swiotlb_nr_tbl()) {
- return ttm_dma_populate(ttm, rdev->dev);
+ return ttm_dma_populate(>t->ttm, rdev->dev);
}
#endif
@@ -601,14 +601,14 @@
}
for (i = 0; i < ttm->num_pages; i++) {
- ttm->dma_address[i] = pci_map_page(rdev->pdev, ttm->pages[i],
- 0, PAGE_SIZE,
- PCI_DMA_BIDIRECTIONAL);
- if (pci_dma_mapping_error(rdev->pdev, ttm->dma_address[i])) {
+ gtt->ttm.dma_address[i] = pci_map_page(rdev->pdev, ttm->pages[i],
+ 0, PAGE_SIZE,
+ PCI_DMA_BIDIRECTIONAL);
+ if (pci_dma_mapping_error(rdev->pdev, gtt->ttm.dma_address[i])) {
while (--i) {
- pci_unmap_page(rdev->pdev, ttm->dma_address[i],
+ pci_unmap_page(rdev->pdev, gtt->ttm.dma_address[i],
PAGE_SIZE, PCI_DMA_BIDIRECTIONAL);
- ttm->dma_address[i] = 0;
+ gtt->ttm.dma_address[i] = 0;
}
ttm_pool_unpopulate(ttm);
return -EFAULT;
@@ -620,20 +620,21 @@
static void radeon_ttm_tt_unpopulate(struct ttm_tt *ttm)
{
struct radeon_device *rdev;
+ struct radeon_ttm_tt *gtt = (void *)ttm;
unsigned i;
rdev = radeon_get_rdev(ttm->bdev);
#ifdef CONFIG_SWIOTLB
if (swiotlb_nr_tbl()) {
- ttm_dma_unpopulate(ttm, rdev->dev);
+ ttm_dma_unpopulate(>t->ttm, rdev->dev);
return;
}
#endif
for (i = 0; i < ttm->num_pages; i++) {
- if (ttm->dma_address[i]) {
- pci_unmap_page(rdev->pdev, ttm->dma_address[i],
+ if (gtt->ttm.dma_address[i]) {
+ pci_unmap_page(rdev->pdev, gtt->ttm.dma_address[i],
PAGE_SIZE, PCI_DMA_BIDIRECTIONAL);
}
}