From 428a27027d5415ab940d1a2404b26102e9213e9a Mon Sep 17 00:00:00 2001 From: Veera Sundaram Sankaran Date: Tue, 7 Mar 2023 15:55:38 -0800 Subject: [PATCH] disp: msm: sde: avoid VMID_TVM check during buf import in trusted-vm Both trusted-vm and secure-camera preview buffers uses the same VMID_TVM. In primary-vm, the check is used to determine the camera preview usecase and attach it to the correct device. This is not necessary for trusted-vm as it can default to nested trusted-vm context bank. Avoid the check while its in trusted-vm. Change-Id: I4391a4a1da9dca5d1f4b1719733b8d4edc1900a8 Signed-off-by: Veera Sundaram Sankaran --- msm/msm_gem_prime.c | 27 +++++++++++++++------------ msm/msm_kms.h | 3 ++- msm/sde/sde_kms.c | 15 +++++++++++++++ 3 files changed, 32 insertions(+), 13 deletions(-) diff --git a/msm/msm_gem_prime.c b/msm/msm_gem_prime.c index fcb25f0b10..3d98a031d5 100644 --- a/msm/msm_gem_prime.c +++ b/msm/msm_gem_prime.c @@ -157,19 +157,22 @@ struct drm_gem_object *msm_gem_prime_import(struct drm_device *dev, } #if (KERNEL_VERSION(6, 1, 0) <= LINUX_VERSION_CODE) - ret = mem_buf_dma_buf_copy_vmperm(dma_buf, &vmid_list, &perms_list, &nelems); - if (ret) { - DRM_ERROR("get vmid list failure, ret:%d", ret); - goto fail_put; + /* avoid VMID checks in trusted-vm */ + if (!kms->funcs->in_trusted_vm || !kms->funcs->in_trusted_vm(kms)) { + ret = mem_buf_dma_buf_copy_vmperm(dma_buf, &vmid_list, &perms_list, &nelems); + if (ret) { + DRM_ERROR("get vmid list failure, ret:%d", ret); + goto fail_put; + } + + for (i = 0; i < nelems; i++) + if (vmid_list[i] == VMID_TVM) + is_nested_sec_vmid = true; + + /* mem_buf_dma_buf_copy_vmperm uses kmemdup, do kfree to free up the memory */ + kfree(vmid_list); + kfree(perms_list); } - - for (i = 0; i < nelems; i++) - if (vmid_list[i] == VMID_TVM) - is_nested_sec_vmid = true; - - /* mem_buf_dma_buf_copy_vmperm uses kmemdup, do kfree to free up the memory */ - kfree(vmid_list); - kfree(perms_list); #endif /* diff --git a/msm/msm_kms.h b/msm/msm_kms.h index a9e69f482d..99db0db491 100644 --- a/msm/msm_kms.h +++ b/msm/msm_kms.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021-2022 Qualcomm Innovation Center, Inc. All rights reserved. + * Copyright (c) 2021-2023 Qualcomm Innovation Center, Inc. All rights reserved. * Copyright (c) 2016-2021, The Linux Foundation. All rights reserved. * Copyright (C) 2013 Red Hat * Author: Rob Clark @@ -140,6 +140,7 @@ struct msm_kms_funcs { /* topology dsc information */ int (*get_dsc_count)(const struct msm_kms *kms, u32 hdisplay, u32 *num_dsc); + bool (*in_trusted_vm)(const struct msm_kms *kms); }; struct msm_kms { diff --git a/msm/sde/sde_kms.c b/msm/sde/sde_kms.c index fbcc896b8f..f7df67e44d 100644 --- a/msm/sde/sde_kms.c +++ b/msm/sde/sde_kms.c @@ -3857,6 +3857,20 @@ static int sde_kms_get_dsc_count(const struct msm_kms *kms, return 0; } +static bool sde_kms_in_trusted_vm(const struct msm_kms *kms) +{ + struct sde_kms *sde_kms; + + if (!kms) { + SDE_ERROR("invalid kms\n"); + return false; + } + + sde_kms = to_sde_kms(kms); + + return sde_in_trusted_vm(sde_kms); +} + static int _sde_kms_null_commit(struct drm_device *dev, struct drm_encoder *enc) { @@ -4295,6 +4309,7 @@ static const struct msm_kms_funcs kms_funcs = { .trigger_null_flush = sde_kms_trigger_null_flush, .get_mixer_count = sde_kms_get_mixer_count, .get_dsc_count = sde_kms_get_dsc_count, + .in_trusted_vm = sde_kms_in_trusted_vm, }; static int _sde_kms_mmu_destroy(struct sde_kms *sde_kms)