diff options
author | Sidath Senanayake <sidaths@google.com> | 2020-10-27 11:38:49 +0000 |
---|---|---|
committer | Sidath Senanayake <sidaths@google.com> | 2020-10-27 11:38:49 +0000 |
commit | 72f2457ff7355ff0389efe5bc9cec3365362d8c4 (patch) | |
tree | 8f5fb993bd2a8eb181c880b180b6401b46f76620 /mali_kbase/mali_kbase_vinstr.c | |
parent | d4ca6eb7268ee2db9deabd1745b505c6e1c162f9 (diff) | |
download | gpu-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.c | 46 |
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; } |