From 55dccd623492358860ae9bfc27441496e2b048a4 Mon Sep 17 00:00:00 2001 From: Jordan Crouse Date: Mon, 14 Oct 2019 10:41:06 -0600 Subject: [PATCH] msm: kgsl: Fixup kernel API changes Life goes on, and so does the kernel. Update some API changes since msm-4.19 including helper functions for vmfault functions, renaming a memory statistic, updating cmd-db and removing __mutex_user which is not longer available. Change-Id: Ic0dedbad0b24042f3683a4be99888a0aa86baf78 Signed-off-by: Jordan Crouse --- drivers/gpu/msm/adreno_dispatch.c | 4 ++-- drivers/gpu/msm/kgsl.c | 6 ++--- drivers/gpu/msm/kgsl.h | 4 ++-- drivers/gpu/msm/kgsl_gmu.c | 19 +++------------ drivers/gpu/msm/kgsl_pool.c | 12 ++-------- drivers/gpu/msm/kgsl_sharedmem.c | 39 +++++-------------------------- 6 files changed, 18 insertions(+), 66 deletions(-) diff --git a/drivers/gpu/msm/adreno_dispatch.c b/drivers/gpu/msm/adreno_dispatch.c index bed378f56666..f396224fc2a5 100644 --- a/drivers/gpu/msm/adreno_dispatch.c +++ b/drivers/gpu/msm/adreno_dispatch.c @@ -2858,8 +2858,8 @@ int adreno_dispatcher_idle(struct adreno_device *adreno_dev) * Ensure that this function is not called when dispatcher * mutex is held and device is started */ - if (mutex_is_locked(&dispatcher->mutex) && - (__mutex_owner(&dispatcher->mutex) == current)) + + if (WARN_ON(mutex_is_locked(&dispatcher->mutex))) return -EDEADLK; adreno_get_gpu_halt(adreno_dev); diff --git a/drivers/gpu/msm/kgsl.c b/drivers/gpu/msm/kgsl.c index 794ec014e809..9975e1cef2f4 100644 --- a/drivers/gpu/msm/kgsl.c +++ b/drivers/gpu/msm/kgsl.c @@ -4346,7 +4346,7 @@ static vm_fault_t kgsl_gpumem_vm_fault(struct vm_fault *vmf) { struct kgsl_mem_entry *entry = vmf->vma->vm_private_data; - int ret; + vm_fault_t ret; if (!entry) return VM_FAULT_SIGBUS; @@ -4354,7 +4354,7 @@ kgsl_gpumem_vm_fault(struct vm_fault *vmf) return VM_FAULT_SIGBUS; ret = entry->memdesc.ops->vmfault(&entry->memdesc, vmf->vma, vmf); - if ((ret == 0) || (ret == VM_FAULT_NOPAGE)) + if (!ret || ret == VM_FAULT_NOPAGE) entry->priv->gpumem_mapped += PAGE_SIZE; return ret; @@ -4776,7 +4776,7 @@ static int _register_device(struct kgsl_device *device) } device->dev->dma_mask = &dma_mask; - arch_setup_dma_ops(device->dev, 0, 0, NULL, false); + set_dma_ops(device->dev, NULL); dev_set_drvdata(&device->pdev->dev, device); return 0; diff --git a/drivers/gpu/msm/kgsl.h b/drivers/gpu/msm/kgsl.h index 5ad61fc969bc..43b5a4c5c54a 100644 --- a/drivers/gpu/msm/kgsl.h +++ b/drivers/gpu/msm/kgsl.h @@ -163,8 +163,8 @@ struct kgsl_memdesc; struct kgsl_memdesc_ops { unsigned int vmflags; - int (*vmfault)(struct kgsl_memdesc *memdesc, struct vm_area_struct *vma, - struct vm_fault *vmf); + vm_fault_t (*vmfault)(struct kgsl_memdesc *memdesc, + struct vm_area_struct *vma, struct vm_fault *vmf); void (*free)(struct kgsl_memdesc *memdesc); int (*map_kernel)(struct kgsl_memdesc *memdesc); void (*unmap_kernel)(struct kgsl_memdesc *memdesc); diff --git a/drivers/gpu/msm/kgsl_gmu.c b/drivers/gpu/msm/kgsl_gmu.c index f2914236fb21..12acda62c364 100644 --- a/drivers/gpu/msm/kgsl_gmu.c +++ b/drivers/gpu/msm/kgsl_gmu.c @@ -559,7 +559,7 @@ static int gmu_dcvs_set(struct kgsl_device *device, struct rpmh_arc_vals { unsigned int num; - uint16_t val[MAX_GX_LEVELS]; + const u16 *val; }; static const char gfx_res_id[] = "gfx.lvl"; @@ -584,22 +584,9 @@ enum rpmh_vote_type { static int rpmh_arc_cmds(struct gmu_device *gmu, struct rpmh_arc_vals *arc, const char *res_id) { - unsigned int len; + size_t len = 0; - memset(arc, 0, sizeof(*arc)); - - len = cmd_db_read_aux_data_len(res_id); - if (len == 0) - return -EINVAL; - - if (len > (MAX_GX_LEVELS << 1)) { - dev_err(&gmu->pdev->dev, - "gfx cmddb size %d larger than alloc buf %d of %s\n", - len, (MAX_GX_LEVELS << 1), res_id); - return -EINVAL; - } - - cmd_db_read_aux_data(res_id, (uint8_t *)arc->val, len); + arc->val = cmd_db_read_aux_data(res_id, &len); /* * cmd_db_read_aux_data() gives us a zero-padded table of diff --git a/drivers/gpu/msm/kgsl_pool.c b/drivers/gpu/msm/kgsl_pool.c index 00a6466704c5..c7b440f0f342 100644 --- a/drivers/gpu/msm/kgsl_pool.c +++ b/drivers/gpu/msm/kgsl_pool.c @@ -100,7 +100,7 @@ _kgsl_pool_add_page(struct kgsl_page_pool *pool, struct page *p) list_add_tail(&p->lru, &pool->page_list); pool->page_count++; spin_unlock(&pool->list_lock); - mod_node_page_state(page_pgdat(p), NR_INDIRECTLY_RECLAIMABLE_BYTES, + mod_node_page_state(page_pgdat(p), NR_KERNEL_MISC_RECLAIMABLE, (PAGE_SIZE << pool->pool_order)); } @@ -117,7 +117,7 @@ _kgsl_pool_get_page(struct kgsl_page_pool *pool) list_del(&p->lru); } spin_unlock(&pool->list_lock); - mod_node_page_state(page_pgdat(p), NR_INDIRECTLY_RECLAIMABLE_BYTES, + mod_node_page_state(page_pgdat(p), NR_KERNEL_MISC_RECLAIMABLE, -(PAGE_SIZE << pool->pool_order)); return p; } @@ -256,20 +256,12 @@ void kgsl_pool_free_pages(struct page **pages, unsigned int pcount) if (!pages) return; - if (WARN(!kern_addr_valid((unsigned long)pages), - "Address of pages=%pK is not valid\n", pages)) - return; - for (i = 0; i < pcount;) { /* * Free each page or compound page group individually. */ struct page *p = pages[i]; - if (WARN(!kern_addr_valid((unsigned long)p), - "Address of page=%pK is not valid\n", p)) - return; - i += 1 << compound_order(p); kgsl_pool_free_page(p); } diff --git a/drivers/gpu/msm/kgsl_sharedmem.c b/drivers/gpu/msm/kgsl_sharedmem.c index 35b635260c10..bebdda88ef3f 100644 --- a/drivers/gpu/msm/kgsl_sharedmem.c +++ b/drivers/gpu/msm/kgsl_sharedmem.c @@ -357,32 +357,15 @@ kgsl_sharedmem_init_sysfs(void) return sysfs_create_files(&kgsl_driver.virtdev.kobj, drv_attr_list); } -static int kgsl_paged_vmfault(struct kgsl_memdesc *memdesc, +static vm_fault_t kgsl_paged_vmfault(struct kgsl_memdesc *memdesc, struct vm_area_struct *vma, struct vm_fault *vmf) { int pgoff; - unsigned int offset; - offset = vmf->address - vma->vm_start; + pgoff = (vmf->address - vma->vm_start) >> PAGE_SHIFT; - if (offset >= memdesc->size) - return VM_FAULT_SIGBUS; - - pgoff = offset >> PAGE_SHIFT; - - if (pgoff < memdesc->page_count) { - struct page *page = memdesc->pages[pgoff]; - - get_page(page); - vmf->page = page; - - memdesc->mapsize += PAGE_SIZE; - - return 0; - } - - return VM_FAULT_SIGBUS; + return vmf_insert_page(vma, vmf->address, memdesc->pages[pgoff]); } static void kgsl_paged_unmap_kernel(struct kgsl_memdesc *memdesc) @@ -495,27 +478,17 @@ static int kgsl_paged_map_kernel(struct kgsl_memdesc *memdesc) return ret; } -static int kgsl_contiguous_vmfault(struct kgsl_memdesc *memdesc, +static vm_fault_t kgsl_contiguous_vmfault(struct kgsl_memdesc *memdesc, struct vm_area_struct *vma, struct vm_fault *vmf) { unsigned long offset, pfn; - int ret; offset = ((unsigned long) vmf->address - vma->vm_start) >> PAGE_SHIFT; pfn = (memdesc->physaddr >> PAGE_SHIFT) + offset; - ret = vm_insert_pfn(vma, (unsigned long) vmf->address, pfn); - - if (ret == -ENOMEM || ret == -EAGAIN) - return VM_FAULT_OOM; - else if (ret == -EFAULT) - return VM_FAULT_SIGBUS; - - memdesc->mapsize += PAGE_SIZE; - - return VM_FAULT_NOPAGE; + return vmf_insert_pfn(vma, vmf->address, pfn); } #ifdef CONFIG_ARM64 @@ -1054,7 +1027,7 @@ static struct kgsl_memdesc_ops kgsl_secure_pool_ops = { static struct kgsl_memdesc_ops kgsl_pool_ops = { .free = kgsl_free_pool_pages, - .vmflags = VM_DONTDUMP | VM_DONTEXPAND | VM_DONTCOPY, + .vmflags = VM_DONTDUMP | VM_DONTEXPAND | VM_DONTCOPY | VM_MIXEDMAP, .vmfault = kgsl_paged_vmfault, .map_kernel = kgsl_paged_map_kernel, .unmap_kernel = kgsl_paged_unmap_kernel,