summaryrefslogtreecommitdiff
path: root/mali_kbase/mali_kbase_vinstr.c
diff options
context:
space:
mode:
authorSidath Senanayake <sidaths@google.com>2020-10-27 11:38:49 +0000
committerSidath Senanayake <sidaths@google.com>2020-10-27 11:38:49 +0000
commit72f2457ff7355ff0389efe5bc9cec3365362d8c4 (patch)
tree8f5fb993bd2a8eb181c880b180b6401b46f76620 /mali_kbase/mali_kbase_vinstr.c
parentd4ca6eb7268ee2db9deabd1745b505c6e1c162f9 (diff)
downloadgpu-72f2457ff7355ff0389efe5bc9cec3365362d8c4.tar.gz
Mali Valhall DDK r27p0 KMD
Provenance: 7e6f74ec1 (collaborate/EAC/v_r27p0) VX504X08X-BU-00000-r27p0-01eac0 - Android DDK VX504X08X-SW-99006-r27p0-01eac0 - Android Renderscript AOSP parts VX504X08X-BU-60000-r27p0-01eac0 - Android Document Bundle VX504X08X-DC-11001-r27p0-01eac0 - Valhall Android DDK Software Errata Signed-off-by: Sidath Senanayake <sidaths@google.com> Change-Id: Ib59de731b034cc7e2631e35f1b0063b8f6894ecc
Diffstat (limited to 'mali_kbase/mali_kbase_vinstr.c')
-rw-r--r--mali_kbase/mali_kbase_vinstr.c46
1 files changed, 23 insertions, 23 deletions
diff --git a/mali_kbase/mali_kbase_vinstr.c b/mali_kbase/mali_kbase_vinstr.c
index 72cec13..3b0e2d6 100644
--- a/mali_kbase/mali_kbase_vinstr.c
+++ b/mali_kbase/mali_kbase_vinstr.c
@@ -83,6 +83,7 @@ struct kbase_vinstr_context {
* @next_dump_time_ns: Time in ns when this client's next periodic dump must
* occur. If 0, not a periodic client.
* @enable_map: Counters enable map.
+ * @tmp_buf: Temporary buffer to use before handing dump to client.
* @dump_bufs: Array of dump buffers allocated by this client.
* @dump_bufs_meta: Metadata of dump buffers.
* @meta_idx: Index of metadata being accessed by userspace.
@@ -97,6 +98,7 @@ struct kbase_vinstr_client {
u64 next_dump_time_ns;
u32 dump_interval_ns;
struct kbase_hwcnt_enable_map enable_map;
+ struct kbase_hwcnt_dump_buffer tmp_buf;
struct kbase_hwcnt_dump_buffer_array dump_bufs;
struct kbase_hwcnt_reader_metadata *dump_bufs_meta;
atomic_t meta_idx;
@@ -182,6 +184,7 @@ static int kbasep_vinstr_client_dump(
u64 ts_end_ns;
unsigned int write_idx;
unsigned int read_idx;
+ struct kbase_hwcnt_dump_buffer *tmp_buf;
struct kbase_hwcnt_dump_buffer *dump_buf;
struct kbase_hwcnt_reader_metadata *meta;
u8 clk_cnt;
@@ -199,19 +202,24 @@ static int kbasep_vinstr_client_dump(
dump_buf = &vcli->dump_bufs.bufs[write_idx];
meta = &vcli->dump_bufs_meta[write_idx];
+ tmp_buf = &vcli->tmp_buf;
errcode = kbase_hwcnt_virtualizer_client_dump(
- vcli->hvcli, &ts_start_ns, &ts_end_ns, dump_buf);
+ vcli->hvcli, &ts_start_ns, &ts_end_ns, tmp_buf);
if (errcode)
return errcode;
/* Patch the dump buf headers, to hide the counters that other hwcnt
* clients are using.
*/
- kbase_hwcnt_gpu_patch_dump_headers(dump_buf, &vcli->enable_map);
+ kbase_hwcnt_gpu_patch_dump_headers(tmp_buf, &vcli->enable_map);
- /* Zero all non-enabled counters (current values are undefined) */
- kbase_hwcnt_dump_buffer_zero_non_enabled(dump_buf, &vcli->enable_map);
+ /* Copy the temp buffer to the userspace visible buffer. The strict
+ * variant will explicitly zero any non-enabled counters to ensure
+ * nothing except exactly what the user asked for is made visible.
+ */
+ kbase_hwcnt_dump_buffer_copy_strict(
+ dump_buf, tmp_buf, &vcli->enable_map);
clk_cnt = vcli->vctx->metadata->clk_cnt;
@@ -371,6 +379,7 @@ static void kbasep_vinstr_client_destroy(struct kbase_vinstr_client *vcli)
kbase_hwcnt_virtualizer_client_destroy(vcli->hvcli);
kfree(vcli->dump_bufs_meta);
kbase_hwcnt_dump_buffer_array_free(&vcli->dump_bufs);
+ kbase_hwcnt_dump_buffer_free(&vcli->tmp_buf);
kbase_hwcnt_enable_map_free(&vcli->enable_map);
kfree(vcli);
}
@@ -416,6 +425,10 @@ static int kbasep_vinstr_client_create(
phys_em.mmu_l2_bm = setup->mmu_l2_bm;
kbase_hwcnt_gpu_enable_map_from_physical(&vcli->enable_map, &phys_em);
+ errcode = kbase_hwcnt_dump_buffer_alloc(vctx->metadata, &vcli->tmp_buf);
+ if (errcode)
+ goto error;
+
/* Enable all the available clk_enable_map. */
vcli->enable_map.clk_enable_map = (1ull << vctx->metadata->clk_cnt) - 1;
@@ -863,26 +876,14 @@ static long kbasep_vinstr_hwcnt_reader_ioctl_get_hwver(
struct kbase_vinstr_client *cli,
u32 __user *hwver)
{
- u32 ver = 0;
+ u32 ver = 5;
const enum kbase_hwcnt_gpu_group_type type =
kbase_hwcnt_metadata_group_type(cli->vctx->metadata, 0);
- switch (type) {
- case KBASE_HWCNT_GPU_GROUP_TYPE_V4:
- ver = 4;
- break;
- case KBASE_HWCNT_GPU_GROUP_TYPE_V5:
- ver = 5;
- break;
- default:
- WARN_ON(true);
- }
-
- if (ver != 0) {
- return put_user(ver, hwver);
- } else {
+ if (WARN_ON(type != KBASE_HWCNT_GPU_GROUP_TYPE_V5))
return -EINVAL;
- }
+
+ return put_user(ver, hwver);
}
/**
@@ -914,9 +915,8 @@ static long kbasep_vinstr_hwcnt_reader_ioctl_get_api_version(
api_version.features |=
KBASE_HWCNT_READER_API_VERSION_FEATURE_CYCLES_SHADER_CORES;
- ret = put_user(api_version,
- (struct kbase_hwcnt_reader_api_version __user *)
- arg);
+ ret = copy_to_user(
+ (void __user *)arg, &api_version, sizeof(api_version));
}
return ret;
}