diff options
| author | Alexandre Courbot <acourbot@nvidia.com> | 2014-08-04 05:28:54 -0400 |
|---|---|---|
| committer | Ben Skeggs <bskeggs@redhat.com> | 2014-08-09 11:08:03 -0400 |
| commit | 3d50d4dcb0c4e0e01f45ae15df34ab6a04fb35bb (patch) | |
| tree | e4185162685c07ad2b592cf7c6bcb882cfb660e4 | |
| parent | 7963e9db1b1f842fdc53309baa8714d38e9f5681 (diff) | |
drm/ttm: expose CPU address of DMA-allocated pages
Pages allocated using the DMA API have a coherent memory mapping. Make
this mapping visible to drivers so they can decide to use it instead of
creating their own redundant one.
Signed-off-by: Alexandre Courbot <acourbot@nvidia.com>
Acked-by: David Airlie <airlied@linux.ie>
Signed-off-by: Ben Skeggs <bskeggs@redhat.com>
| -rw-r--r-- | drivers/gpu/drm/ttm/ttm_page_alloc_dma.c | 2 | ||||
| -rw-r--r-- | drivers/gpu/drm/ttm/ttm_tt.c | 13 | ||||
| -rw-r--r-- | include/drm/ttm/ttm_bo_driver.h | 2 |
3 files changed, 12 insertions, 5 deletions
diff --git a/drivers/gpu/drm/ttm/ttm_page_alloc_dma.c b/drivers/gpu/drm/ttm/ttm_page_alloc_dma.c index ca65df144765..c96db433f8af 100644 --- a/drivers/gpu/drm/ttm/ttm_page_alloc_dma.c +++ b/drivers/gpu/drm/ttm/ttm_page_alloc_dma.c | |||
| @@ -848,6 +848,7 @@ static int ttm_dma_pool_get_pages(struct dma_pool *pool, | |||
| 848 | if (count) { | 848 | if (count) { |
| 849 | d_page = list_first_entry(&pool->free_list, struct dma_page, page_list); | 849 | d_page = list_first_entry(&pool->free_list, struct dma_page, page_list); |
| 850 | ttm->pages[index] = d_page->p; | 850 | ttm->pages[index] = d_page->p; |
| 851 | ttm_dma->cpu_address[index] = d_page->vaddr; | ||
| 851 | ttm_dma->dma_address[index] = d_page->dma; | 852 | ttm_dma->dma_address[index] = d_page->dma; |
| 852 | list_move_tail(&d_page->page_list, &ttm_dma->pages_list); | 853 | list_move_tail(&d_page->page_list, &ttm_dma->pages_list); |
| 853 | r = 0; | 854 | r = 0; |
| @@ -979,6 +980,7 @@ void ttm_dma_unpopulate(struct ttm_dma_tt *ttm_dma, struct device *dev) | |||
| 979 | INIT_LIST_HEAD(&ttm_dma->pages_list); | 980 | INIT_LIST_HEAD(&ttm_dma->pages_list); |
| 980 | for (i = 0; i < ttm->num_pages; i++) { | 981 | for (i = 0; i < ttm->num_pages; i++) { |
| 981 | ttm->pages[i] = NULL; | 982 | ttm->pages[i] = NULL; |
| 983 | ttm_dma->cpu_address[i] = 0; | ||
| 982 | ttm_dma->dma_address[i] = 0; | 984 | ttm_dma->dma_address[i] = 0; |
| 983 | } | 985 | } |
| 984 | 986 | ||
diff --git a/drivers/gpu/drm/ttm/ttm_tt.c b/drivers/gpu/drm/ttm/ttm_tt.c index 75f319090043..bf080abc86d1 100644 --- a/drivers/gpu/drm/ttm/ttm_tt.c +++ b/drivers/gpu/drm/ttm/ttm_tt.c | |||
| @@ -55,9 +55,12 @@ static void ttm_tt_alloc_page_directory(struct ttm_tt *ttm) | |||
| 55 | 55 | ||
| 56 | static void ttm_dma_tt_alloc_page_directory(struct ttm_dma_tt *ttm) | 56 | static void ttm_dma_tt_alloc_page_directory(struct ttm_dma_tt *ttm) |
| 57 | { | 57 | { |
| 58 | ttm->ttm.pages = drm_calloc_large(ttm->ttm.num_pages, sizeof(void*)); | 58 | ttm->ttm.pages = drm_calloc_large(ttm->ttm.num_pages, |
| 59 | ttm->dma_address = drm_calloc_large(ttm->ttm.num_pages, | 59 | sizeof(*ttm->ttm.pages) + |
| 60 | sizeof(*ttm->dma_address)); | 60 | sizeof(*ttm->dma_address) + |
| 61 | sizeof(*ttm->cpu_address)); | ||
| 62 | ttm->cpu_address = (void *) (ttm->ttm.pages + ttm->ttm.num_pages); | ||
| 63 | ttm->dma_address = (void *) (ttm->cpu_address + ttm->ttm.num_pages); | ||
| 61 | } | 64 | } |
| 62 | 65 | ||
| 63 | #ifdef CONFIG_X86 | 66 | #ifdef CONFIG_X86 |
| @@ -228,7 +231,7 @@ int ttm_dma_tt_init(struct ttm_dma_tt *ttm_dma, struct ttm_bo_device *bdev, | |||
| 228 | 231 | ||
| 229 | INIT_LIST_HEAD(&ttm_dma->pages_list); | 232 | INIT_LIST_HEAD(&ttm_dma->pages_list); |
| 230 | ttm_dma_tt_alloc_page_directory(ttm_dma); | 233 | ttm_dma_tt_alloc_page_directory(ttm_dma); |
| 231 | if (!ttm->pages || !ttm_dma->dma_address) { | 234 | if (!ttm->pages) { |
| 232 | ttm_tt_destroy(ttm); | 235 | ttm_tt_destroy(ttm); |
| 233 | pr_err("Failed allocating page table\n"); | 236 | pr_err("Failed allocating page table\n"); |
| 234 | return -ENOMEM; | 237 | return -ENOMEM; |
| @@ -243,7 +246,7 @@ void ttm_dma_tt_fini(struct ttm_dma_tt *ttm_dma) | |||
| 243 | 246 | ||
| 244 | drm_free_large(ttm->pages); | 247 | drm_free_large(ttm->pages); |
| 245 | ttm->pages = NULL; | 248 | ttm->pages = NULL; |
| 246 | drm_free_large(ttm_dma->dma_address); | 249 | ttm_dma->cpu_address = NULL; |
| 247 | ttm_dma->dma_address = NULL; | 250 | ttm_dma->dma_address = NULL; |
| 248 | } | 251 | } |
| 249 | EXPORT_SYMBOL(ttm_dma_tt_fini); | 252 | EXPORT_SYMBOL(ttm_dma_tt_fini); |
diff --git a/include/drm/ttm/ttm_bo_driver.h b/include/drm/ttm/ttm_bo_driver.h index 202f0a7171e8..1d9f0f1ff52d 100644 --- a/include/drm/ttm/ttm_bo_driver.h +++ b/include/drm/ttm/ttm_bo_driver.h | |||
| @@ -133,6 +133,7 @@ struct ttm_tt { | |||
| 133 | * struct ttm_dma_tt | 133 | * struct ttm_dma_tt |
| 134 | * | 134 | * |
| 135 | * @ttm: Base ttm_tt struct. | 135 | * @ttm: Base ttm_tt struct. |
| 136 | * @cpu_address: The CPU address of the pages | ||
| 136 | * @dma_address: The DMA (bus) addresses of the pages | 137 | * @dma_address: The DMA (bus) addresses of the pages |
| 137 | * @pages_list: used by some page allocation backend | 138 | * @pages_list: used by some page allocation backend |
| 138 | * | 139 | * |
| @@ -142,6 +143,7 @@ struct ttm_tt { | |||
| 142 | */ | 143 | */ |
| 143 | struct ttm_dma_tt { | 144 | struct ttm_dma_tt { |
| 144 | struct ttm_tt ttm; | 145 | struct ttm_tt ttm; |
| 146 | void **cpu_address; | ||
| 145 | dma_addr_t *dma_address; | 147 | dma_addr_t *dma_address; |
| 146 | struct list_head pages_list; | 148 | struct list_head pages_list; |
| 147 | }; | 149 | }; |
