diff options
Diffstat (limited to 'drivers/gpu/nvgpu')
-rw-r--r-- | drivers/gpu/nvgpu/gk20a/mm_gk20a.c | 31 | ||||
-rw-r--r-- | drivers/gpu/nvgpu/gk20a/mm_gk20a.h | 2 |
2 files changed, 24 insertions, 9 deletions
diff --git a/drivers/gpu/nvgpu/gk20a/mm_gk20a.c b/drivers/gpu/nvgpu/gk20a/mm_gk20a.c index c9681861..89390c30 100644 --- a/drivers/gpu/nvgpu/gk20a/mm_gk20a.c +++ b/drivers/gpu/nvgpu/gk20a/mm_gk20a.c | |||
@@ -2124,6 +2124,8 @@ int gk20a_vidmem_buf_alloc(struct gk20a *g, size_t bytes) | |||
2124 | if (!buf->mem) | 2124 | if (!buf->mem) |
2125 | goto err_kfree; | 2125 | goto err_kfree; |
2126 | 2126 | ||
2127 | buf->mem->user_mem = true; | ||
2128 | |||
2127 | err = gk20a_gmmu_alloc_vid(g, bytes, buf->mem); | 2129 | err = gk20a_gmmu_alloc_vid(g, bytes, buf->mem); |
2128 | if (err) | 2130 | if (err) |
2129 | goto err_memfree; | 2131 | goto err_memfree; |
@@ -2962,6 +2964,7 @@ int gk20a_gmmu_alloc_attr_vid_at(struct gk20a *g, enum dma_attr attr, | |||
2962 | 2964 | ||
2963 | mem->size = size; | 2965 | mem->size = size; |
2964 | mem->aperture = APERTURE_VIDMEM; | 2966 | mem->aperture = APERTURE_VIDMEM; |
2967 | mem->allocator = vidmem_alloc; | ||
2965 | 2968 | ||
2966 | INIT_LIST_HEAD(&mem->clear_list_entry); | 2969 | INIT_LIST_HEAD(&mem->clear_list_entry); |
2967 | 2970 | ||
@@ -2985,15 +2988,25 @@ static void gk20a_gmmu_free_attr_vid(struct gk20a *g, enum dma_attr attr, | |||
2985 | #if defined(CONFIG_GK20A_VIDMEM) | 2988 | #if defined(CONFIG_GK20A_VIDMEM) |
2986 | bool was_empty; | 2989 | bool was_empty; |
2987 | 2990 | ||
2988 | mutex_lock(&g->mm.vidmem.clear_list_mutex); | 2991 | if (mem->user_mem) { |
2989 | was_empty = list_empty(&g->mm.vidmem.clear_list_head); | 2992 | mutex_lock(&g->mm.vidmem.clear_list_mutex); |
2990 | list_add_tail(&mem->clear_list_entry, | 2993 | was_empty = list_empty(&g->mm.vidmem.clear_list_head); |
2991 | &g->mm.vidmem.clear_list_head); | 2994 | list_add_tail(&mem->clear_list_entry, |
2992 | mutex_unlock(&g->mm.vidmem.clear_list_mutex); | 2995 | &g->mm.vidmem.clear_list_head); |
2996 | mutex_unlock(&g->mm.vidmem.clear_list_mutex); | ||
2997 | |||
2998 | if (was_empty) { | ||
2999 | cancel_work_sync(&g->mm.vidmem_clear_mem_worker); | ||
3000 | schedule_work(&g->mm.vidmem_clear_mem_worker); | ||
3001 | } | ||
3002 | } else { | ||
3003 | /* TODO: clear with PRAMIN here */ | ||
3004 | gk20a_free(mem->allocator, | ||
3005 | sg_dma_address(mem->sgt->sgl)); | ||
3006 | gk20a_free_sgtable(&mem->sgt); | ||
2993 | 3007 | ||
2994 | if (was_empty) { | 3008 | mem->size = 0; |
2995 | cancel_work_sync(&g->mm.vidmem_clear_mem_worker); | 3009 | mem->aperture = APERTURE_INVALID; |
2996 | schedule_work(&g->mm.vidmem_clear_mem_worker); | ||
2997 | } | 3010 | } |
2998 | #endif | 3011 | #endif |
2999 | } | 3012 | } |
@@ -3040,7 +3053,7 @@ static void gk20a_vidmem_clear_mem_worker(struct work_struct *work) | |||
3040 | 3053 | ||
3041 | while ((mem = get_pending_mem_desc(mm)) != NULL) { | 3054 | while ((mem = get_pending_mem_desc(mm)) != NULL) { |
3042 | gk20a_gmmu_clear_vidmem_mem(g, mem); | 3055 | gk20a_gmmu_clear_vidmem_mem(g, mem); |
3043 | gk20a_free(&g->mm.vidmem.allocator, | 3056 | gk20a_free(mem->allocator, |
3044 | sg_dma_address(mem->sgt->sgl)); | 3057 | sg_dma_address(mem->sgt->sgl)); |
3045 | gk20a_free_sgtable(&mem->sgt); | 3058 | gk20a_free_sgtable(&mem->sgt); |
3046 | 3059 | ||
diff --git a/drivers/gpu/nvgpu/gk20a/mm_gk20a.h b/drivers/gpu/nvgpu/gk20a/mm_gk20a.h index 54d3dfd0..32f8ce39 100644 --- a/drivers/gpu/nvgpu/gk20a/mm_gk20a.h +++ b/drivers/gpu/nvgpu/gk20a/mm_gk20a.h | |||
@@ -71,6 +71,8 @@ struct mem_desc { | |||
71 | size_t size; | 71 | size_t size; |
72 | u64 gpu_va; | 72 | u64 gpu_va; |
73 | bool fixed; /* vidmem only */ | 73 | bool fixed; /* vidmem only */ |
74 | bool user_mem; /* vidmem only */ | ||
75 | struct gk20a_allocator *allocator; /* vidmem only */ | ||
74 | struct list_head clear_list_entry; /* vidmem only */ | 76 | struct list_head clear_list_entry; /* vidmem only */ |
75 | }; | 77 | }; |
76 | 78 | ||