summaryrefslogtreecommitdiff
path: root/mali_kbase/mali_kbase_mem.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_mem.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_mem.c')
-rw-r--r--mali_kbase/mali_kbase_mem.c46
1 files changed, 41 insertions, 5 deletions
diff --git a/mali_kbase/mali_kbase_mem.c b/mali_kbase/mali_kbase_mem.c
index 4589983..278c59b 100644
--- a/mali_kbase/mali_kbase_mem.c
+++ b/mali_kbase/mali_kbase_mem.c
@@ -38,7 +38,7 @@
#include <mali_kbase_config.h>
#include <mali_kbase.h>
-#include <mali_midg_regmap.h>
+#include <gpu/mali_kbase_gpu_regmap.h>
#include <mali_kbase_cache_policy.h>
#include <mali_kbase_hw.h>
#include <mali_kbase_tracepoints.h>
@@ -1015,12 +1015,8 @@ void kbase_mem_term(struct kbase_device *kbdev)
if (kbdev->mgm_dev)
module_put(kbdev->mgm_dev->owner);
}
-
KBASE_EXPORT_TEST_API(kbase_mem_term);
-
-
-
/**
* @brief Allocate a free region object.
*
@@ -3707,6 +3703,46 @@ static void kbase_jd_user_buf_unmap(struct kbase_context *kctx,
alloc->nents = 0;
}
+int kbase_mem_copy_to_pinned_user_pages(struct page **dest_pages,
+ void *src_page, size_t *to_copy, unsigned int nr_pages,
+ unsigned int *target_page_nr, size_t offset)
+{
+ void *target_page = kmap(dest_pages[*target_page_nr]);
+ size_t chunk = PAGE_SIZE-offset;
+
+ if (!target_page) {
+ pr_err("%s: kmap failure", __func__);
+ return -ENOMEM;
+ }
+
+ chunk = min(chunk, *to_copy);
+
+ memcpy(target_page + offset, src_page, chunk);
+ *to_copy -= chunk;
+
+ kunmap(dest_pages[*target_page_nr]);
+
+ *target_page_nr += 1;
+ if (*target_page_nr >= nr_pages || *to_copy == 0)
+ return 0;
+
+ target_page = kmap(dest_pages[*target_page_nr]);
+ if (!target_page) {
+ pr_err("%s: kmap failure", __func__);
+ return -ENOMEM;
+ }
+
+ KBASE_DEBUG_ASSERT(target_page);
+
+ chunk = min(offset, *to_copy);
+ memcpy(target_page, src_page + PAGE_SIZE-offset, chunk);
+ *to_copy -= chunk;
+
+ kunmap(dest_pages[*target_page_nr]);
+
+ return 0;
+}
+
struct kbase_mem_phy_alloc *kbase_map_external_resource(
struct kbase_context *kctx, struct kbase_va_region *reg,
struct mm_struct *locked_mm)