diff options
author | Sidath Senanayake <sidaths@google.com> | 2020-02-03 12:15:52 +0100 |
---|---|---|
committer | Sidath Senanayake <sidaths@google.com> | 2020-02-03 12:15:52 +0100 |
commit | 7ed9a0b8efa3abac35833b55f8012a2a85cc67a1 (patch) | |
tree | 0c297b2906c620d9cab1dd5f06db6909941cd843 /mali_kbase/mali_kbase_softjobs.c | |
parent | 1f3b3ea0d31f66a6ec806e8f6ac5ebee44cb5923 (diff) | |
download | gpu-7ed9a0b8efa3abac35833b55f8012a2a85cc67a1.tar.gz |
Mali Valhall DDK r22p0 KMD
Provenance:
6425105ec (collaborate/EAC/v_r22p0)
VX504X08X-BU-00000-r22p0-01rel0 - Android DDK
VX504X08X-BU-60000-r22p0-01rel0 - Android Document Bundle
Signed-off-by: Sidath Senanayake <sidaths@google.com>
Change-Id: I257ad9ba30a61008e6425d63700356f16009ead7
Diffstat (limited to 'mali_kbase/mali_kbase_softjobs.c')
-rw-r--r-- | mali_kbase/mali_kbase_softjobs.c | 83 |
1 files changed, 20 insertions, 63 deletions
diff --git a/mali_kbase/mali_kbase_softjobs.c b/mali_kbase/mali_kbase_softjobs.c index 6c740c0..537a239 100644 --- a/mali_kbase/mali_kbase_softjobs.c +++ b/mali_kbase/mali_kbase_softjobs.c @@ -719,48 +719,6 @@ out_cleanup: return ret; } -void kbase_mem_copy_from_extres_page(struct kbase_context *kctx, - void *extres_page, struct page **pages, unsigned int nr_pages, - unsigned int *target_page_nr, size_t offset, size_t *to_copy) -{ - void *target_page = kmap(pages[*target_page_nr]); - size_t chunk = PAGE_SIZE-offset; - - lockdep_assert_held(&kctx->reg_lock); - - if (!target_page) { - *target_page_nr += 1; - dev_warn(kctx->kbdev->dev, "kmap failed in debug_copy job."); - return; - } - - chunk = min(chunk, *to_copy); - - memcpy(target_page + offset, extres_page, chunk); - *to_copy -= chunk; - - kunmap(pages[*target_page_nr]); - - *target_page_nr += 1; - if (*target_page_nr >= nr_pages) - return; - - target_page = kmap(pages[*target_page_nr]); - if (!target_page) { - *target_page_nr += 1; - dev_warn(kctx->kbdev->dev, "kmap failed in debug_copy job."); - return; - } - - KBASE_DEBUG_ASSERT(target_page); - - chunk = min(offset, *to_copy); - memcpy(target_page, extres_page + PAGE_SIZE-offset, chunk); - *to_copy -= chunk; - - kunmap(pages[*target_page_nr]); -} - int kbase_mem_copy_from_extres(struct kbase_context *kctx, struct kbase_debug_copy_buffer *buf_data) { @@ -785,22 +743,21 @@ int kbase_mem_copy_from_extres(struct kbase_context *kctx, switch (gpu_alloc->type) { case KBASE_MEM_TYPE_IMPORTED_USER_BUF: { - for (i = 0; i < buf_data->nr_extres_pages; i++) { + for (i = 0; i < buf_data->nr_extres_pages && + target_page_nr < buf_data->nr_pages; i++) { struct page *pg = buf_data->extres_pages[i]; void *extres_page = kmap(pg); - if (extres_page) - kbase_mem_copy_from_extres_page(kctx, - extres_page, pages, + if (extres_page) { + ret = kbase_mem_copy_to_pinned_user_pages( + pages, extres_page, &to_copy, buf_data->nr_pages, - &target_page_nr, - offset, &to_copy); - - kunmap(pg); - if (target_page_nr >= buf_data->nr_pages) - break; + &target_page_nr, offset); + kunmap(pg); + if (ret) + goto out_unlock; + } } - break; } break; case KBASE_MEM_TYPE_IMPORTED_UMM: { @@ -820,20 +777,21 @@ int kbase_mem_copy_from_extres(struct kbase_context *kctx, if (ret) goto out_unlock; - for (i = 0; i < dma_to_copy/PAGE_SIZE; i++) { + for (i = 0; i < dma_to_copy/PAGE_SIZE && + target_page_nr < buf_data->nr_pages; i++) { void *extres_page = dma_buf_kmap(dma_buf, i); - if (extres_page) - kbase_mem_copy_from_extres_page(kctx, - extres_page, pages, + if (extres_page) { + ret = kbase_mem_copy_to_pinned_user_pages( + pages, extres_page, &to_copy, buf_data->nr_pages, - &target_page_nr, - offset, &to_copy); + &target_page_nr, offset); - dma_buf_kunmap(dma_buf, i, extres_page); - if (target_page_nr >= buf_data->nr_pages) - break; + dma_buf_kunmap(dma_buf, i, extres_page); + if (ret) + goto out_unlock; + } } dma_buf_end_cpu_access(dma_buf, #if LINUX_VERSION_CODE < KERNEL_VERSION(4, 6, 0) && !defined(CONFIG_CHROMEOS) @@ -848,7 +806,6 @@ int kbase_mem_copy_from_extres(struct kbase_context *kctx, out_unlock: kbase_gpu_vm_unlock(kctx); return ret; - } static int kbase_debug_copy(struct kbase_jd_atom *katom) |