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>
This commit is contained in:
parent
e11d0b87cd
commit
dea7e0ac45
@ -1066,6 +1066,12 @@ nouveau_ttm_tt_populate(struct ttm_tt *ttm)
|
|||||||
dev_priv = nouveau_bdev(ttm->bdev);
|
dev_priv = nouveau_bdev(ttm->bdev);
|
||||||
dev = dev_priv->dev;
|
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
|
#ifdef CONFIG_SWIOTLB
|
||||||
if (swiotlb_nr_tbl()) {
|
if (swiotlb_nr_tbl()) {
|
||||||
return ttm_dma_populate((void *)ttm, dev->dev);
|
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_priv = nouveau_bdev(ttm->bdev);
|
||||||
dev = dev_priv->dev;
|
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
|
#ifdef CONFIG_SWIOTLB
|
||||||
if (swiotlb_nr_tbl()) {
|
if (swiotlb_nr_tbl()) {
|
||||||
ttm_dma_unpopulate((void *)ttm, dev->dev);
|
ttm_dma_unpopulate((void *)ttm, dev->dev);
|
||||||
|
@ -618,6 +618,11 @@ static int radeon_ttm_tt_populate(struct ttm_tt *ttm)
|
|||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
rdev = radeon_get_rdev(ttm->bdev);
|
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
|
#ifdef CONFIG_SWIOTLB
|
||||||
if (swiotlb_nr_tbl()) {
|
if (swiotlb_nr_tbl()) {
|
||||||
@ -654,6 +659,12 @@ static void radeon_ttm_tt_unpopulate(struct ttm_tt *ttm)
|
|||||||
unsigned i;
|
unsigned i;
|
||||||
|
|
||||||
rdev = radeon_get_rdev(ttm->bdev);
|
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
|
#ifdef CONFIG_SWIOTLB
|
||||||
if (swiotlb_nr_tbl()) {
|
if (swiotlb_nr_tbl()) {
|
||||||
|
@ -31,6 +31,7 @@
|
|||||||
|
|
||||||
#include "ttm/ttm_module.h"
|
#include "ttm/ttm_module.h"
|
||||||
#include "ttm/ttm_bo_driver.h"
|
#include "ttm/ttm_bo_driver.h"
|
||||||
|
#include "ttm/ttm_page_alloc.h"
|
||||||
#ifdef TTM_HAS_AGP
|
#ifdef TTM_HAS_AGP
|
||||||
#include "ttm/ttm_placement.h"
|
#include "ttm/ttm_placement.h"
|
||||||
#include <linux/agp_backend.h>
|
#include <linux/agp_backend.h>
|
||||||
@ -97,6 +98,7 @@ static void ttm_agp_destroy(struct ttm_tt *ttm)
|
|||||||
|
|
||||||
if (agp_be->mem)
|
if (agp_be->mem)
|
||||||
ttm_agp_unbind(ttm);
|
ttm_agp_unbind(ttm);
|
||||||
|
ttm_tt_fini(ttm);
|
||||||
kfree(agp_be);
|
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);
|
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
|
#endif
|
||||||
|
@ -191,6 +191,7 @@ int ttm_tt_init(struct ttm_tt *ttm, struct ttm_bo_device *bdev,
|
|||||||
ttm->page_flags = page_flags;
|
ttm->page_flags = page_flags;
|
||||||
ttm->dummy_read_page = dummy_read_page;
|
ttm->dummy_read_page = dummy_read_page;
|
||||||
ttm->state = tt_unpopulated;
|
ttm->state = tt_unpopulated;
|
||||||
|
ttm->swap_storage = NULL;
|
||||||
|
|
||||||
ttm_tt_alloc_page_directory(ttm);
|
ttm_tt_alloc_page_directory(ttm);
|
||||||
if (!ttm->pages) {
|
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->page_flags = page_flags;
|
||||||
ttm->dummy_read_page = dummy_read_page;
|
ttm->dummy_read_page = dummy_read_page;
|
||||||
ttm->state = tt_unpopulated;
|
ttm->state = tt_unpopulated;
|
||||||
|
ttm->swap_storage = NULL;
|
||||||
|
|
||||||
INIT_LIST_HEAD(&ttm_dma->pages_list);
|
INIT_LIST_HEAD(&ttm_dma->pages_list);
|
||||||
ttm_dma_tt_alloc_page_directory(ttm_dma);
|
ttm_dma_tt_alloc_page_directory(ttm_dma);
|
||||||
|
@ -1030,6 +1030,8 @@ extern struct ttm_tt *ttm_agp_tt_create(struct ttm_bo_device *bdev,
|
|||||||
struct agp_bridge_data *bridge,
|
struct agp_bridge_data *bridge,
|
||||||
unsigned long size, uint32_t page_flags,
|
unsigned long size, uint32_t page_flags,
|
||||||
struct page *dummy_read_page);
|
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
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
Loading…
x
Reference in New Issue
Block a user