diff options
| author | Jerome Glisse <jglisse@redhat.com> | 2012-01-04 02:37:37 +0400 | 
|---|---|---|
| committer | Dave Airlie <airlied@redhat.com> | 2012-01-06 13:34:03 +0400 | 
| commit | dea7e0ac45fd28f90bbc38ff226d36a9f788efbf (patch) | |
| tree | 1130a3d51f0f8aa8ab462f1735423e3dc37835b6 | |
| parent | e11d0b87cde80745afe4712a19cd37bca9924a5b (diff) | |
| download | linux-dea7e0ac45fd28f90bbc38ff226d36a9f788efbf.tar.xz | |
ttm: fix agp since ttm tt rework
ttm tt rework modified the way we allocate and populate the
ttm_tt structure, the AGP side was missing some bit to properly
work. Fix those and fix radeon and nouveau AGP support.
Tested on radeon only so far.
Signed-off-by: Jerome Glisse <jglisse@redhat.com>
Reviewed-by: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
Signed-off-by: Dave Airlie <airlied@redhat.com>
| -rw-r--r-- | drivers/gpu/drm/nouveau/nouveau_bo.c | 13 | ||||
| -rw-r--r-- | drivers/gpu/drm/radeon/radeon_ttm.c | 11 | ||||
| -rw-r--r-- | drivers/gpu/drm/ttm/ttm_agp_backend.c | 17 | ||||
| -rw-r--r-- | drivers/gpu/drm/ttm/ttm_tt.c | 2 | ||||
| -rw-r--r-- | include/drm/ttm/ttm_bo_driver.h | 2 | 
5 files changed, 45 insertions, 0 deletions
| diff --git a/drivers/gpu/drm/nouveau/nouveau_bo.c b/drivers/gpu/drm/nouveau/nouveau_bo.c index 8cf4a48f872e..724b41a2b9e9 100644 --- a/drivers/gpu/drm/nouveau/nouveau_bo.c +++ b/drivers/gpu/drm/nouveau/nouveau_bo.c @@ -1066,6 +1066,12 @@ nouveau_ttm_tt_populate(struct ttm_tt *ttm)  	dev_priv = nouveau_bdev(ttm->bdev);  	dev = dev_priv->dev; +#if __OS_HAS_AGP +	if (dev_priv->gart_info.type == NOUVEAU_GART_AGP) { +		return ttm_agp_tt_populate(ttm); +	} +#endif +  #ifdef CONFIG_SWIOTLB  	if (swiotlb_nr_tbl()) {  		return ttm_dma_populate((void *)ttm, dev->dev); @@ -1105,6 +1111,13 @@ nouveau_ttm_tt_unpopulate(struct ttm_tt *ttm)  	dev_priv = nouveau_bdev(ttm->bdev);  	dev = dev_priv->dev; +#if __OS_HAS_AGP +	if (dev_priv->gart_info.type == NOUVEAU_GART_AGP) { +		ttm_agp_tt_unpopulate(ttm); +		return; +	} +#endif +  #ifdef CONFIG_SWIOTLB  	if (swiotlb_nr_tbl()) {  		ttm_dma_unpopulate((void *)ttm, dev->dev); diff --git a/drivers/gpu/drm/radeon/radeon_ttm.c b/drivers/gpu/drm/radeon/radeon_ttm.c index 1882025a9dc8..c421e77ace71 100644 --- a/drivers/gpu/drm/radeon/radeon_ttm.c +++ b/drivers/gpu/drm/radeon/radeon_ttm.c @@ -618,6 +618,11 @@ static int radeon_ttm_tt_populate(struct ttm_tt *ttm)  		return 0;  	rdev = radeon_get_rdev(ttm->bdev); +#if __OS_HAS_AGP +	if (rdev->flags & RADEON_IS_AGP) { +		return ttm_agp_tt_populate(ttm); +	} +#endif  #ifdef CONFIG_SWIOTLB  	if (swiotlb_nr_tbl()) { @@ -654,6 +659,12 @@ static void radeon_ttm_tt_unpopulate(struct ttm_tt *ttm)  	unsigned i;  	rdev = radeon_get_rdev(ttm->bdev); +#if __OS_HAS_AGP +	if (rdev->flags & RADEON_IS_AGP) { +		ttm_agp_tt_unpopulate(ttm); +		return; +	} +#endif  #ifdef CONFIG_SWIOTLB  	if (swiotlb_nr_tbl()) { diff --git a/drivers/gpu/drm/ttm/ttm_agp_backend.c b/drivers/gpu/drm/ttm/ttm_agp_backend.c index 14ebd3650aa9..747c1413fc95 100644 --- a/drivers/gpu/drm/ttm/ttm_agp_backend.c +++ b/drivers/gpu/drm/ttm/ttm_agp_backend.c @@ -31,6 +31,7 @@  #include "ttm/ttm_module.h"  #include "ttm/ttm_bo_driver.h" +#include "ttm/ttm_page_alloc.h"  #ifdef TTM_HAS_AGP  #include "ttm/ttm_placement.h"  #include <linux/agp_backend.h> @@ -97,6 +98,7 @@ static void ttm_agp_destroy(struct ttm_tt *ttm)  	if (agp_be->mem)  		ttm_agp_unbind(ttm); +	ttm_tt_fini(ttm);  	kfree(agp_be);  } @@ -129,4 +131,19 @@ struct ttm_tt *ttm_agp_tt_create(struct ttm_bo_device *bdev,  }  EXPORT_SYMBOL(ttm_agp_tt_create); +int ttm_agp_tt_populate(struct ttm_tt *ttm) +{ +	if (ttm->state != tt_unpopulated) +		return 0; + +	return ttm_pool_populate(ttm); +} +EXPORT_SYMBOL(ttm_agp_tt_populate); + +void ttm_agp_tt_unpopulate(struct ttm_tt *ttm) +{ +	ttm_pool_unpopulate(ttm); +} +EXPORT_SYMBOL(ttm_agp_tt_unpopulate); +  #endif diff --git a/drivers/gpu/drm/ttm/ttm_tt.c b/drivers/gpu/drm/ttm/ttm_tt.c index 58e1fa14fe3a..2f75d203a2bf 100644 --- a/drivers/gpu/drm/ttm/ttm_tt.c +++ b/drivers/gpu/drm/ttm/ttm_tt.c @@ -191,6 +191,7 @@ int ttm_tt_init(struct ttm_tt *ttm, struct ttm_bo_device *bdev,  	ttm->page_flags = page_flags;  	ttm->dummy_read_page = dummy_read_page;  	ttm->state = tt_unpopulated; +	ttm->swap_storage = NULL;  	ttm_tt_alloc_page_directory(ttm);  	if (!ttm->pages) { @@ -222,6 +223,7 @@ int ttm_dma_tt_init(struct ttm_dma_tt *ttm_dma, struct ttm_bo_device *bdev,  	ttm->page_flags = page_flags;  	ttm->dummy_read_page = dummy_read_page;  	ttm->state = tt_unpopulated; +	ttm->swap_storage = NULL;  	INIT_LIST_HEAD(&ttm_dma->pages_list);  	ttm_dma_tt_alloc_page_directory(ttm_dma); diff --git a/include/drm/ttm/ttm_bo_driver.h b/include/drm/ttm/ttm_bo_driver.h index 2be889161b4c..d43e892307ff 100644 --- a/include/drm/ttm/ttm_bo_driver.h +++ b/include/drm/ttm/ttm_bo_driver.h @@ -1030,6 +1030,8 @@ extern struct ttm_tt *ttm_agp_tt_create(struct ttm_bo_device *bdev,  					struct agp_bridge_data *bridge,  					unsigned long size, uint32_t page_flags,  					struct page *dummy_read_page); +int ttm_agp_tt_populate(struct ttm_tt *ttm); +void ttm_agp_tt_unpopulate(struct ttm_tt *ttm);  #endif  #endif | 
