drm/nouveau/ttm: use driver bind/unbind/destroy functions.
Acked-by: Christian König <christian.koenig@amd.com> Reviewed-by: Ben Skeggs <bskeggs@redhat.com> Signed-off-by: Dave Airlie <airlied@redhat.com> Link: https://patchwork.freedesktop.org/patch/msgid/20200907204630.1406528-7-airlied@gmail.com
This commit is contained in:
parent
a68bb1938b
commit
8635784a87
|
@ -668,6 +668,33 @@ nouveau_ttm_tt_create(struct ttm_buffer_object *bo, uint32_t page_flags)
|
||||||
return nouveau_sgdma_create_ttm(bo, page_flags);
|
return nouveau_sgdma_create_ttm(bo, page_flags);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int
|
||||||
|
nouveau_ttm_tt_bind(struct ttm_bo_device *bdev, struct ttm_tt *ttm,
|
||||||
|
struct ttm_resource *reg)
|
||||||
|
{
|
||||||
|
#if IS_ENABLED(CONFIG_AGP)
|
||||||
|
struct nouveau_drm *drm = nouveau_bdev(bdev);
|
||||||
|
|
||||||
|
if (drm->agp.bridge)
|
||||||
|
return ttm_agp_bind(bdev, ttm, reg);
|
||||||
|
#endif
|
||||||
|
return nouveau_sgdma_bind(bdev, ttm, reg);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
nouveau_ttm_tt_unbind(struct ttm_bo_device *bdev, struct ttm_tt *ttm)
|
||||||
|
{
|
||||||
|
#if IS_ENABLED(CONFIG_AGP)
|
||||||
|
struct nouveau_drm *drm = nouveau_bdev(bdev);
|
||||||
|
|
||||||
|
if (drm->agp.bridge) {
|
||||||
|
ttm_agp_unbind(bdev, ttm);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
nouveau_sgdma_unbind(bdev, ttm);
|
||||||
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
nouveau_bo_evict_flags(struct ttm_buffer_object *bo, struct ttm_placement *pl)
|
nouveau_bo_evict_flags(struct ttm_buffer_object *bo, struct ttm_placement *pl)
|
||||||
{
|
{
|
||||||
|
@ -1284,6 +1311,20 @@ nouveau_ttm_tt_unpopulate(struct ttm_bo_device *bdev,
|
||||||
ttm_unmap_and_unpopulate_pages(dev, ttm_dma);
|
ttm_unmap_and_unpopulate_pages(dev, ttm_dma);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
nouveau_ttm_tt_destroy(struct ttm_bo_device *bdev,
|
||||||
|
struct ttm_tt *ttm)
|
||||||
|
{
|
||||||
|
#if IS_ENABLED(CONFIG_AGP)
|
||||||
|
struct nouveau_drm *drm = nouveau_bdev(bdev);
|
||||||
|
if (drm->agp.bridge) {
|
||||||
|
ttm_agp_destroy(bdev, ttm);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
nouveau_sgdma_destroy(bdev, ttm);
|
||||||
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
nouveau_bo_fence(struct nouveau_bo *nvbo, struct nouveau_fence *fence, bool exclusive)
|
nouveau_bo_fence(struct nouveau_bo *nvbo, struct nouveau_fence *fence, bool exclusive)
|
||||||
{
|
{
|
||||||
|
@ -1299,6 +1340,9 @@ struct ttm_bo_driver nouveau_bo_driver = {
|
||||||
.ttm_tt_create = &nouveau_ttm_tt_create,
|
.ttm_tt_create = &nouveau_ttm_tt_create,
|
||||||
.ttm_tt_populate = &nouveau_ttm_tt_populate,
|
.ttm_tt_populate = &nouveau_ttm_tt_populate,
|
||||||
.ttm_tt_unpopulate = &nouveau_ttm_tt_unpopulate,
|
.ttm_tt_unpopulate = &nouveau_ttm_tt_unpopulate,
|
||||||
|
.ttm_tt_bind = &nouveau_ttm_tt_bind,
|
||||||
|
.ttm_tt_unbind = &nouveau_ttm_tt_unbind,
|
||||||
|
.ttm_tt_destroy = &nouveau_ttm_tt_destroy,
|
||||||
.eviction_valuable = ttm_bo_eviction_valuable,
|
.eviction_valuable = ttm_bo_eviction_valuable,
|
||||||
.evict_flags = nouveau_bo_evict_flags,
|
.evict_flags = nouveau_bo_evict_flags,
|
||||||
.move_notify = nouveau_bo_move_ntfy,
|
.move_notify = nouveau_bo_move_ntfy,
|
||||||
|
|
|
@ -14,7 +14,7 @@ struct nouveau_sgdma_be {
|
||||||
struct nouveau_mem *mem;
|
struct nouveau_mem *mem;
|
||||||
};
|
};
|
||||||
|
|
||||||
static void
|
void
|
||||||
nouveau_sgdma_destroy(struct ttm_bo_device *bdev, struct ttm_tt *ttm)
|
nouveau_sgdma_destroy(struct ttm_bo_device *bdev, struct ttm_tt *ttm)
|
||||||
{
|
{
|
||||||
struct nouveau_sgdma_be *nvbe = (struct nouveau_sgdma_be *)ttm;
|
struct nouveau_sgdma_be *nvbe = (struct nouveau_sgdma_be *)ttm;
|
||||||
|
@ -25,10 +25,11 @@ nouveau_sgdma_destroy(struct ttm_bo_device *bdev, struct ttm_tt *ttm)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static int
|
int
|
||||||
nv04_sgdma_bind(struct ttm_bo_device *bdev, struct ttm_tt *ttm, struct ttm_resource *reg)
|
nouveau_sgdma_bind(struct ttm_bo_device *bdev, struct ttm_tt *ttm, struct ttm_resource *reg)
|
||||||
{
|
{
|
||||||
struct nouveau_sgdma_be *nvbe = (struct nouveau_sgdma_be *)ttm;
|
struct nouveau_sgdma_be *nvbe = (struct nouveau_sgdma_be *)ttm;
|
||||||
|
struct nouveau_drm *drm = nouveau_bdev(bdev);
|
||||||
struct nouveau_mem *mem = nouveau_mem(reg);
|
struct nouveau_mem *mem = nouveau_mem(reg);
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
|
@ -36,65 +37,34 @@ nv04_sgdma_bind(struct ttm_bo_device *bdev, struct ttm_tt *ttm, struct ttm_resou
|
||||||
if (ret)
|
if (ret)
|
||||||
return ret;
|
return ret;
|
||||||
|
|
||||||
ret = nouveau_mem_map(mem, &mem->cli->vmm.vmm, &mem->vma[0]);
|
if (drm->client.device.info.family < NV_DEVICE_INFO_V0_TESLA) {
|
||||||
if (ret) {
|
ret = nouveau_mem_map(mem, &mem->cli->vmm.vmm, &mem->vma[0]);
|
||||||
nouveau_mem_fini(mem);
|
if (ret) {
|
||||||
return ret;
|
nouveau_mem_fini(mem);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
nvbe->mem = mem;
|
nvbe->mem = mem;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
void
|
||||||
nv04_sgdma_unbind(struct ttm_bo_device *bdev, struct ttm_tt *ttm)
|
nouveau_sgdma_unbind(struct ttm_bo_device *bdev, struct ttm_tt *ttm)
|
||||||
{
|
{
|
||||||
struct nouveau_sgdma_be *nvbe = (struct nouveau_sgdma_be *)ttm;
|
struct nouveau_sgdma_be *nvbe = (struct nouveau_sgdma_be *)ttm;
|
||||||
nouveau_mem_fini(nvbe->mem);
|
nouveau_mem_fini(nvbe->mem);
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct ttm_backend_func nv04_sgdma_backend = {
|
|
||||||
.bind = nv04_sgdma_bind,
|
|
||||||
.unbind = nv04_sgdma_unbind,
|
|
||||||
.destroy = nouveau_sgdma_destroy
|
|
||||||
};
|
|
||||||
|
|
||||||
static int
|
|
||||||
nv50_sgdma_bind(struct ttm_bo_device *bdev, struct ttm_tt *ttm, struct ttm_resource *reg)
|
|
||||||
{
|
|
||||||
struct nouveau_sgdma_be *nvbe = (struct nouveau_sgdma_be *)ttm;
|
|
||||||
struct nouveau_mem *mem = nouveau_mem(reg);
|
|
||||||
int ret;
|
|
||||||
|
|
||||||
ret = nouveau_mem_host(reg, &nvbe->ttm);
|
|
||||||
if (ret)
|
|
||||||
return ret;
|
|
||||||
|
|
||||||
nvbe->mem = mem;
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
static struct ttm_backend_func nv50_sgdma_backend = {
|
|
||||||
.bind = nv50_sgdma_bind,
|
|
||||||
.unbind = nv04_sgdma_unbind,
|
|
||||||
.destroy = nouveau_sgdma_destroy
|
|
||||||
};
|
|
||||||
|
|
||||||
struct ttm_tt *
|
struct ttm_tt *
|
||||||
nouveau_sgdma_create_ttm(struct ttm_buffer_object *bo, uint32_t page_flags)
|
nouveau_sgdma_create_ttm(struct ttm_buffer_object *bo, uint32_t page_flags)
|
||||||
{
|
{
|
||||||
struct nouveau_drm *drm = nouveau_bdev(bo->bdev);
|
|
||||||
struct nouveau_sgdma_be *nvbe;
|
struct nouveau_sgdma_be *nvbe;
|
||||||
|
|
||||||
nvbe = kzalloc(sizeof(*nvbe), GFP_KERNEL);
|
nvbe = kzalloc(sizeof(*nvbe), GFP_KERNEL);
|
||||||
if (!nvbe)
|
if (!nvbe)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
if (drm->client.device.info.family < NV_DEVICE_INFO_V0_TESLA)
|
|
||||||
nvbe->ttm.ttm.func = &nv04_sgdma_backend;
|
|
||||||
else
|
|
||||||
nvbe->ttm.ttm.func = &nv50_sgdma_backend;
|
|
||||||
|
|
||||||
if (ttm_dma_tt_init(&nvbe->ttm, bo, page_flags)) {
|
if (ttm_dma_tt_init(&nvbe->ttm, bo, page_flags)) {
|
||||||
kfree(nvbe);
|
kfree(nvbe);
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
|
@ -22,4 +22,7 @@ int nouveau_ttm_mmap(struct file *, struct vm_area_struct *);
|
||||||
int nouveau_ttm_global_init(struct nouveau_drm *);
|
int nouveau_ttm_global_init(struct nouveau_drm *);
|
||||||
void nouveau_ttm_global_release(struct nouveau_drm *);
|
void nouveau_ttm_global_release(struct nouveau_drm *);
|
||||||
|
|
||||||
|
int nouveau_sgdma_bind(struct ttm_bo_device *bdev, struct ttm_tt *ttm, struct ttm_resource *reg);
|
||||||
|
void nouveau_sgdma_unbind(struct ttm_bo_device *bdev, struct ttm_tt *ttm);
|
||||||
|
void nouveau_sgdma_destroy(struct ttm_bo_device *bdev, struct ttm_tt *ttm);
|
||||||
#endif
|
#endif
|
||||||
|
|
Loading…
Reference in New Issue