summaryrefslogtreecommitdiff
path: root/mali_kbase/mali_kbase_softjobs.c
diff options
context:
space:
mode:
authorSidath Senanayake <sidaths@google.com>2020-02-03 12:15:52 +0100
committerSidath Senanayake <sidaths@google.com>2020-02-03 12:15:52 +0100
commit7ed9a0b8efa3abac35833b55f8012a2a85cc67a1 (patch)
tree0c297b2906c620d9cab1dd5f06db6909941cd843 /mali_kbase/mali_kbase_softjobs.c
parent1f3b3ea0d31f66a6ec806e8f6ac5ebee44cb5923 (diff)
downloadgpu-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.c83
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)