diff options
| author | Konrad Rzeszutek Wilk <konrad.wilk@oracle.com> | 2010-11-29 13:52:18 -0500 | 
|---|---|---|
| committer | Konrad Rzeszutek Wilk <konrad.wilk@oracle.com> | 2011-01-27 16:02:31 -0500 | 
| commit | f9820a46dd7888b05a36e81166fb1abcc47dcc3f (patch) | |
| tree | c29e32a8fe8b08bc42120ce66c6536afd5c102df /drivers/gpu/drm | |
| parent | e53beacd23d9cb47590da6a7a7f6d417b941a994 (diff) | |
| download | olio-linux-3.10-f9820a46dd7888b05a36e81166fb1abcc47dcc3f.tar.xz olio-linux-3.10-f9820a46dd7888b05a36e81166fb1abcc47dcc3f.zip  | |
ttm: Introduce a placeholder for DMA (bus) addresses.
This is right now limited to only non-pool constructs.
[v2: Fixed indentation issues, add review-by tag]
Reviewed-by: Thomas Hellstrom <thomas@shipmail.org>
Signed-off-by: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
Tested-by: Ian Campbell <ian.campbell@citrix.com>
Diffstat (limited to 'drivers/gpu/drm')
| -rw-r--r-- | drivers/gpu/drm/ttm/ttm_page_alloc.c | 8 | ||||
| -rw-r--r-- | drivers/gpu/drm/ttm/ttm_tt.c | 10 | 
2 files changed, 13 insertions, 5 deletions
diff --git a/drivers/gpu/drm/ttm/ttm_page_alloc.c b/drivers/gpu/drm/ttm/ttm_page_alloc.c index b1e02fffd3c..9d9d92945f8 100644 --- a/drivers/gpu/drm/ttm/ttm_page_alloc.c +++ b/drivers/gpu/drm/ttm/ttm_page_alloc.c @@ -38,6 +38,7 @@  #include <linux/mm.h>  #include <linux/seq_file.h> /* for seq_printf */  #include <linux/slab.h> +#include <linux/dma-mapping.h>  #include <asm/atomic.h> @@ -662,7 +663,8 @@ out:   * cached pages.   */  int ttm_get_pages(struct list_head *pages, int flags, -		enum ttm_caching_state cstate, unsigned count) +		  enum ttm_caching_state cstate, unsigned count, +		  dma_addr_t *dma_address)  {  	struct ttm_page_pool *pool = ttm_get_pool(flags, cstate);  	struct page *p = NULL; @@ -720,7 +722,7 @@ int ttm_get_pages(struct list_head *pages, int flags,  			printk(KERN_ERR TTM_PFX  			       "Failed to allocate extra pages "  			       "for large request."); -			ttm_put_pages(pages, 0, flags, cstate); +			ttm_put_pages(pages, 0, flags, cstate, NULL);  			return r;  		}  	} @@ -731,7 +733,7 @@ int ttm_get_pages(struct list_head *pages, int flags,  /* Put all pages in pages list to correct pool to wait for reuse */  void ttm_put_pages(struct list_head *pages, unsigned page_count, int flags, -		enum ttm_caching_state cstate) +		   enum ttm_caching_state cstate, dma_addr_t *dma_address)  {  	unsigned long irq_flags;  	struct ttm_page_pool *pool = ttm_get_pool(flags, cstate); diff --git a/drivers/gpu/drm/ttm/ttm_tt.c b/drivers/gpu/drm/ttm/ttm_tt.c index af789dc869b..0d39001259f 100644 --- a/drivers/gpu/drm/ttm/ttm_tt.c +++ b/drivers/gpu/drm/ttm/ttm_tt.c @@ -49,12 +49,16 @@ static int ttm_tt_swapin(struct ttm_tt *ttm);  static void ttm_tt_alloc_page_directory(struct ttm_tt *ttm)  {  	ttm->pages = drm_calloc_large(ttm->num_pages, sizeof(*ttm->pages)); +	ttm->dma_address = drm_calloc_large(ttm->num_pages, +					    sizeof(*ttm->dma_address));  }  static void ttm_tt_free_page_directory(struct ttm_tt *ttm)  {  	drm_free_large(ttm->pages);  	ttm->pages = NULL; +	drm_free_large(ttm->dma_address); +	ttm->dma_address = NULL;  }  static void ttm_tt_free_user_pages(struct ttm_tt *ttm) @@ -105,7 +109,8 @@ static struct page *__ttm_tt_get_page(struct ttm_tt *ttm, int index)  		INIT_LIST_HEAD(&h); -		ret = ttm_get_pages(&h, ttm->page_flags, ttm->caching_state, 1); +		ret = ttm_get_pages(&h, ttm->page_flags, ttm->caching_state, 1, +				    &ttm->dma_address[index]);  		if (ret != 0)  			return NULL; @@ -298,7 +303,8 @@ static void ttm_tt_free_alloced_pages(struct ttm_tt *ttm)  			count++;  		}  	} -	ttm_put_pages(&h, count, ttm->page_flags, ttm->caching_state); +	ttm_put_pages(&h, count, ttm->page_flags, ttm->caching_state, +		      ttm->dma_address);  	ttm->state = tt_unpopulated;  	ttm->first_himem_page = ttm->num_pages;  	ttm->last_lomem_page = -1;  |