Commit 8635784a authored by Dave Airlie's avatar Dave Airlie
parent a68bb193
...@@ -668,6 +668,33 @@ nouveau_ttm_tt_create(struct ttm_buffer_object *bo, uint32_t page_flags) ...@@ -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, ...@@ -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 = { ...@@ -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 { ...@@ -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) ...@@ -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 ...@@ -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 *); ...@@ -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
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment