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_mem.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_mem.c')
-rw-r--r-- | mali_kbase/mali_kbase_mem.c | 46 |
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) |