From 83f9b26441a2e42a3830d2f1c65b4a676e93b869 Mon Sep 17 00:00:00 2001 From: Chinmay Sawarkar Date: Fri, 4 Jun 2021 17:54:42 -0700 Subject: [PATCH] video: driver: Set secure mode in encoder Enable HFI_PROP_SECURE when secure session is enabled in encoder. Same behaviour as Decoder. Change-Id: I5edfe3d735fda8edea9e491ae17546945b4431a1 Signed-off-by: Chinmay Sawarkar --- driver/platform/waipio/src/msm_vidc_waipio.c | 2 +- driver/vidc/inc/msm_vidc_driver.h | 1 + driver/vidc/inc/venus_hfi.h | 1 + driver/vidc/src/msm_vdec.c | 25 ----------- driver/vidc/src/msm_vidc_driver.c | 16 +++++++ driver/vidc/src/msm_vidc_vb2.c | 4 ++ driver/vidc/src/venus_hfi.c | 44 ++++++++++++++++++++ 7 files changed, 67 insertions(+), 26 deletions(-) diff --git a/driver/platform/waipio/src/msm_vidc_waipio.c b/driver/platform/waipio/src/msm_vidc_waipio.c index b331acc744..7b16772344 100644 --- a/driver/platform/waipio/src/msm_vidc_waipio.c +++ b/driver/platform/waipio/src/msm_vidc_waipio.c @@ -222,7 +222,7 @@ static struct msm_platform_inst_capability instance_data_waipio[] = { 1, V4L2_MPEG_MSM_VIDC_DISABLE, V4L2_CID_MPEG_VIDC_SECURE, HFI_PROP_SECURE, - CAP_FLAG_ROOT, + CAP_FLAG_NONE, {0}, {0}, NULL, msm_vidc_set_u32}, diff --git a/driver/vidc/inc/msm_vidc_driver.h b/driver/vidc/inc/msm_vidc_driver.h index e4f12ca632..4397e7e4f8 100644 --- a/driver/vidc/inc/msm_vidc_driver.h +++ b/driver/vidc/inc/msm_vidc_driver.h @@ -304,6 +304,7 @@ int msm_vidc_remove_session(struct msm_vidc_inst *inst); int msm_vidc_add_session(struct msm_vidc_inst *inst); int msm_vidc_session_open(struct msm_vidc_inst *inst); int msm_vidc_session_set_codec(struct msm_vidc_inst *inst); +int msm_vidc_session_set_secure_mode(struct msm_vidc_inst *inst); int msm_vidc_session_set_default_header(struct msm_vidc_inst *inst); int msm_vidc_session_streamon(struct msm_vidc_inst *inst, enum msm_vidc_port_type port); diff --git a/driver/vidc/inc/venus_hfi.h b/driver/vidc/inc/venus_hfi.h index 1557ad3312..969971948d 100644 --- a/driver/vidc/inc/venus_hfi.h +++ b/driver/vidc/inc/venus_hfi.h @@ -44,6 +44,7 @@ int venus_hfi_stop(struct msm_vidc_inst *inst, enum msm_vidc_port_type port); int venus_hfi_session_close(struct msm_vidc_inst *inst); int venus_hfi_session_open(struct msm_vidc_inst *inst); int venus_hfi_session_set_codec(struct msm_vidc_inst *inst); +int venus_hfi_session_set_secure_mode(struct msm_vidc_inst *inst); int venus_hfi_core_init(struct msm_vidc_core *core); int venus_hfi_core_deinit(struct msm_vidc_core *core); int venus_hfi_noc_error_info(struct msm_vidc_core *core); diff --git a/driver/vidc/src/msm_vdec.c b/driver/vidc/src/msm_vdec.c index f128e19a79..bd6b6ab716 100644 --- a/driver/vidc/src/msm_vdec.c +++ b/driver/vidc/src/msm_vdec.c @@ -557,27 +557,6 @@ static int msm_vdec_set_output_order(struct msm_vidc_inst *inst, return rc; } -static int msm_vdec_set_secure_mode(struct msm_vidc_inst *inst, - enum msm_vidc_port_type port) -{ - int rc = 0; - u32 secure_mode; - - secure_mode = inst->capabilities->cap[SECURE_MODE].value; - i_vpr_h(inst, "%s: secure mode: %d", __func__, secure_mode); - rc = venus_hfi_session_property(inst, - HFI_PROP_SECURE, - HFI_HOST_FLAGS_NONE, - HFI_PORT_NONE, - HFI_PAYLOAD_U32, - &secure_mode, - sizeof(u32)); - if (rc) - i_vpr_e(inst, "%s: set property failed\n", __func__); - - return rc; -} - static int msm_vdec_set_rap_frame(struct msm_vidc_inst *inst, enum msm_vidc_port_type port) { @@ -718,10 +697,6 @@ static int msm_vdec_set_input_properties(struct msm_vidc_inst *inst) if (rc) return rc; - rc = msm_vdec_set_secure_mode(inst, INPUT_PORT); - if (rc) - return rc; - rc = msm_vdec_set_thumbnail_mode(inst, INPUT_PORT); if (rc) return rc; diff --git a/driver/vidc/src/msm_vidc_driver.c b/driver/vidc/src/msm_vidc_driver.c index 0210601983..13b9290161 100644 --- a/driver/vidc/src/msm_vidc_driver.c +++ b/driver/vidc/src/msm_vidc_driver.c @@ -3641,6 +3641,22 @@ int msm_vidc_session_set_codec(struct msm_vidc_inst *inst) return 0; } +int msm_vidc_session_set_secure_mode(struct msm_vidc_inst *inst) +{ + int rc = 0; + + if (!inst) { + d_vpr_e("%s: invalid params\n", __func__); + return -EINVAL; + } + + rc = venus_hfi_session_set_secure_mode(inst); + if (rc) + return rc; + + return 0; +} + int msm_vidc_session_set_default_header(struct msm_vidc_inst *inst) { int rc = 0; diff --git a/driver/vidc/src/msm_vidc_vb2.c b/driver/vidc/src/msm_vidc_vb2.c index 3a509bf295..6e217bc417 100644 --- a/driver/vidc/src/msm_vidc_vb2.c +++ b/driver/vidc/src/msm_vidc_vb2.c @@ -180,6 +180,10 @@ int msm_vidc_start_streaming(struct vb2_queue *q, unsigned int count) if (rc) return rc; + rc = msm_vidc_session_set_secure_mode(inst); + if (rc) + return rc; + if (is_encode_session(inst)) { rc = msm_vidc_alloc_and_queue_session_internal_buffers(inst, MSM_VIDC_BUF_ARP); diff --git a/driver/vidc/src/venus_hfi.c b/driver/vidc/src/venus_hfi.c index e45643cc59..0d5fb2d7b0 100644 --- a/driver/vidc/src/venus_hfi.c +++ b/driver/vidc/src/venus_hfi.c @@ -3069,6 +3069,50 @@ unlock: return rc; } +int venus_hfi_session_set_secure_mode(struct msm_vidc_inst *inst) +{ + int rc = 0; + struct msm_vidc_core *core; + u32 secure_mode; + + if (!inst || !inst->core || !inst->packet) { + d_vpr_e("%s: invalid params\n", __func__); + return -EINVAL; + } + core = inst->core; + core_lock(core, __func__); + + if (!__valdiate_session(core, inst, __func__)) { + rc = -EINVAL; + goto unlock; + } + + rc = hfi_create_header(inst->packet, inst->packet_size, + inst->session_id, core->header_id++); + if (rc) + goto unlock; + + secure_mode = inst->capabilities->cap[SECURE_MODE].value; + rc = hfi_create_packet(inst->packet, inst->packet_size, + HFI_PROP_SECURE, + HFI_HOST_FLAGS_NONE, + HFI_PAYLOAD_U32, + HFI_PORT_NONE, + core->packet_id++, + &secure_mode, + sizeof(u32)); + if (rc) + goto unlock; + + rc = __iface_cmdq_write(inst->core, inst->packet); + if (rc) + goto unlock; + +unlock: + core_unlock(core, __func__); + return rc; +} + int venus_hfi_session_property(struct msm_vidc_inst *inst, u32 pkt_type, u32 flags, u32 port, u32 payload_type, void *payload, u32 payload_size)