From 6b73bf247d3a38b9e254a168c6853d50f5cd26a4 Mon Sep 17 00:00:00 2001 From: Mihir Ganu Date: Fri, 17 Jul 2020 11:20:00 -0700 Subject: [PATCH 01/21] msm: vidc: Check validity of a timestamp before inserting it to list In steady state, the first entry in the linked list of timestamps is always invalid. When adding a new timestamp entry, adding the timestamp which is a duplicate of first entry leads to duplicate linked list nodes. To avoid this, check for validity of an entry before inserting duplicates to the linked list. Change-Id: I47dd8fb06b9e4eb307605df6b0e2b352a2e263fe Signed-off-by: Mihir Ganu --- msm/vidc/msm_vidc_common.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/msm/vidc/msm_vidc_common.c b/msm/vidc/msm_vidc_common.c index 4fd181f268ab..b48c41400867 100644 --- a/msm/vidc/msm_vidc_common.c +++ b/msm/vidc/msm_vidc_common.c @@ -7602,7 +7602,7 @@ int msm_comm_store_timestamp(struct msm_vidc_inst *inst, u64 timestamp_us) duplicate = NULL; list_for_each_entry(node, &inst->timestamps.list, list) { count++; - if (node->timestamp_us == timestamp_us) + if (node->is_valid && node->timestamp_us == timestamp_us) duplicate = node; } From 1fd9cfcf2e671073f688dbe25409dc4fee1c1081 Mon Sep 17 00:00:00 2001 From: Akshata Sahukar Date: Mon, 20 Jul 2020 10:32:32 -0700 Subject: [PATCH 02/21] msm: vidc: Fix to add correct superframe buffer timestamps Avoid adapting driver framerate to camera qbuf rate in superframe enabled case to avoid setting incorrect hfr buffer timestamps. Change-Id: I354e7517b9aeef7f1b01f33089b81bf7122e12e2 Signed-off-by: Akshata Sahukar --- msm/vidc/msm_venc.c | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/msm/vidc/msm_venc.c b/msm/vidc/msm_venc.c index 7e4d638319b6..6030230d3df6 100644 --- a/msm/vidc/msm_venc.c +++ b/msm/vidc/msm_venc.c @@ -2120,6 +2120,7 @@ int msm_venc_store_timestamp(struct msm_vidc_inst *inst, u64 timestamp_us) struct msm_vidc_timestamps *entry, *node, *prev = NULL; int count = 0; int rc = 0; + struct v4l2_ctrl *superframe_ctrl = NULL; if (!inst || !inst->core) { d_vpr_e("%s: invalid parameters\n", __func__); @@ -2172,7 +2173,13 @@ int msm_venc_store_timestamp(struct msm_vidc_inst *inst, u64 timestamp_us) /* if framerate changed and stable for 2 frames, set to firmware */ if (entry->framerate == prev->framerate && entry->framerate != inst->clk_data.frame_rate) { - inst->clk_data.frame_rate = entry->framerate; + superframe_ctrl = get_ctrl(inst, V4L2_CID_MPEG_VIDC_SUPERFRAME); + if (superframe_ctrl->val > 1) + inst->clk_data.frame_rate = entry->framerate * superframe_ctrl->val; + else + inst->clk_data.frame_rate = entry->framerate; + s_vpr_l(inst->sid, "%s: updated fps to %u\n", + __func__, (inst->clk_data.frame_rate >> 16)); msm_venc_set_frame_rate(inst); } From 59ca4e236545aa5dbb4c7d3e57cca1effff68be7 Mon Sep 17 00:00:00 2001 From: Amit Shekhar Date: Mon, 20 Jul 2020 17:12:55 -0700 Subject: [PATCH 03/21] msm: vidc: Fix p-frame count Fix p-frame count during intra-period setting for HEVC session without layer encoding. Change-Id: I796cac16fbb0538012f9fc97262e1877285e1803 CRs-Fixed: 2735233 Signed-off-by: Amit Shekhar --- msm/vidc/msm_venc.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/msm/vidc/msm_venc.c b/msm/vidc/msm_venc.c index 6030230d3df6..48c438b9baae 100644 --- a/msm/vidc/msm_venc.c +++ b/msm/vidc/msm_venc.c @@ -2485,8 +2485,9 @@ int msm_venc_set_intra_period(struct msm_vidc_inst *inst) V4L2_CID_MPEG_VIDC_VIDEO_HEVC_MAX_HIER_CODING_LAYER); codec = get_v4l2_codec(inst); + intra_period.pframes = gop_size->val; + if (!max_layer->val && codec == V4L2_PIX_FMT_H264) { - intra_period.pframes = gop_size->val; /* * At this point we've already made decision on bframe. * Control value gives updated bframe value. From fbc3b10e060aa7072dc1f48af86bafdce0cfaf8b Mon Sep 17 00:00:00 2001 From: Mihir Ganu Date: Sat, 27 Jun 2020 13:20:56 -0700 Subject: [PATCH 04/21] msm: vidc: Update power sequence to match Lahaina HPG steps Update power sequence by removing all resets during power down. Change-Id: I88610e9c71a91a32332626bf6da88f0f64ed1c65 Signed-off-by: Mihir Ganu (cherry picked from commit 5cffae52eacaaf6b0698de06c11397339d904f35) --- msm/vidc/hfi_iris2.c | 4 ---- 1 file changed, 4 deletions(-) diff --git a/msm/vidc/hfi_iris2.c b/msm/vidc/hfi_iris2.c index 4627f8b46871..5ac62b788ea4 100644 --- a/msm/vidc/hfi_iris2.c +++ b/msm/vidc/hfi_iris2.c @@ -243,10 +243,6 @@ skip_aon_mvp_noc: /* HPG 6.1.2 Step 6 */ __disable_unprepare_clks(device); - /* HPG 6.1.2 Step 7 & 8 */ - if (call_venus_op(device, reset_ahb2axi_bridge, device, sid)) - d_vpr_e("%s: Failed to reset ahb2axi\n", __func__); - /* HPG 6.1.2 Step 5 */ if (__disable_regulators(device)) d_vpr_e("%s: Failed to disable regulators\n", __func__); From 4f287b68adf643c37a56a725c97d7a3bcedcc991 Mon Sep 17 00:00:00 2001 From: Priyanka Gujjula Date: Fri, 24 Jul 2020 12:48:34 +0530 Subject: [PATCH 05/21] msm: vidc: disable DCVS for camera encode batching Disable DCVS for encode usecases if the control V4L2_CID_MPEG_VIDC_SUPERFRAME is enabled. Change-Id: I72a4bebbd79c42988867572d69f6833629054cba --- msm/vidc/msm_vidc_clocks.c | 3 ++- msm/vidc/msm_vidc_common.h | 11 +++++++++++ 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/msm/vidc/msm_vidc_clocks.c b/msm/vidc/msm_vidc_clocks.c index c2db722ec8fd..59dfd21a88dc 100644 --- a/msm/vidc/msm_vidc_clocks.c +++ b/msm/vidc/msm_vidc_clocks.c @@ -999,7 +999,8 @@ int msm_dcvs_try_enable(struct msm_vidc_inst *inst) inst->clk_data.low_latency_mode || inst->batch.enable || is_turbo_session(inst) || - inst->rc_type == V4L2_MPEG_VIDEO_BITRATE_MODE_CQ); + inst->rc_type == V4L2_MPEG_VIDEO_BITRATE_MODE_CQ || + is_encode_batching(inst)); s_vpr_hp(inst->sid, "DCVS %s: %pK\n", inst->clk_data.dcvs_mode ? "enabled" : "disabled", inst); diff --git a/msm/vidc/msm_vidc_common.h b/msm/vidc/msm_vidc_common.h index 98287b8570e7..f9fe8cbb098c 100644 --- a/msm/vidc/msm_vidc_common.h +++ b/msm/vidc/msm_vidc_common.h @@ -153,6 +153,17 @@ static inline bool is_encode_session(struct msm_vidc_inst *inst) return inst->session_type == MSM_VIDC_ENCODER; } +static inline bool is_encode_batching(struct msm_vidc_inst *inst) +{ + struct v4l2_ctrl *ctrl; + + if (inst->session_type != MSM_VIDC_ENCODER) + return false; + + ctrl = get_ctrl(inst, V4L2_CID_MPEG_VIDC_SUPERFRAME); + return !!ctrl->val; +} + static inline bool is_primary_output_mode(struct msm_vidc_inst *inst) { return inst->stream_output_mode == HAL_VIDEO_DECODER_PRIMARY; From f8eaa17bf0c87024eb166394206d4fa583074acb Mon Sep 17 00:00:00 2001 From: Mihir Ganu Date: Fri, 24 Jul 2020 16:14:08 -0700 Subject: [PATCH 06/21] msm: vidc: Enable 8-bit chroma QP offset support Enable support for 8-bit chroma QP offset. Change-Id: I296f7a5669439c21d9727b1b731cfce14cbcd529 Signed-off-by: Mihir Ganu --- msm/vidc/msm_venc.c | 4 ---- 1 file changed, 4 deletions(-) diff --git a/msm/vidc/msm_venc.c b/msm/vidc/msm_venc.c index 48c438b9baae..ef75cc28987e 100644 --- a/msm/vidc/msm_venc.c +++ b/msm/vidc/msm_venc.c @@ -3414,10 +3414,6 @@ int msm_venc_set_chroma_qp_offset(struct msm_vidc_inst *inst) chroma_qp.chroma_offset = (chr->val + 12) << 16 | (chr->val + 12); s_vpr_h(inst->sid, "%s: %x\n", __func__, chroma_qp.chroma_offset); - /* TODO: Remove this check after firmware support added for 8-bit */ - if (inst->bit_depth == MSM_VIDC_BIT_DEPTH_8) - return 0; - rc = call_hfi_op(hdev, session_set_property, inst->session, HFI_PROPERTY_PARAM_HEVC_PPS_CB_CR_OFFSET, &chroma_qp, sizeof(chroma_qp)); From e2a2a4a190efe4acf8402e5d85a252ba528e1683 Mon Sep 17 00:00:00 2001 From: Manikanta Kanamarlapudi Date: Sun, 12 Jul 2020 21:29:21 +0530 Subject: [PATCH 07/21] msm: vidc: Copy hfi buf req to hal buf req copy hfi buf req to hal buf req element by element. Due to change in structure sizes, memcpy may lead to memory corruption. CRs-Fixed: 2741030 Change-Id: Ie4a3aeba7cac78af99355eb766a5ead755cf654b Signed-off-by: Manikanta Kanamarlapudi --- msm/vidc/hfi_response_handler.c | 73 +++++++++++++++++---------------- 1 file changed, 37 insertions(+), 36 deletions(-) diff --git a/msm/vidc/hfi_response_handler.c b/msm/vidc/hfi_response_handler.c index fb778e6cded4..9e65e0462498 100644 --- a/msm/vidc/hfi_response_handler.c +++ b/msm/vidc/hfi_response_handler.c @@ -496,11 +496,21 @@ static int hfi_process_sys_rel_resource_done(u32 device_id, return 0; } +static void copy_hfi_to_hal_buf_req(struct hal_buffer_requirements *dst, + struct hfi_buffer_requirements *src) { + dst->buffer_size = src->buffer_size; + dst->buffer_count_min = (u16)src->buffer_count_min; + dst->buffer_count_min_host = (u16)src->buffer_count_min_host; + dst->buffer_count_actual = (u16)src->buffer_count_actual; + dst->buffer_alignment = (u16)src->buffer_alignment; +} + static void hfi_process_sess_get_prop_buf_req( struct hfi_msg_session_property_info_packet *prop, struct buffer_requirements *buffreq, u32 sid) { struct hfi_buffer_requirements *hfi_buf_req; + struct hal_buffer_requirements *hal_buf_req; u32 req_bytes; if (!prop) { @@ -529,79 +539,70 @@ static void hfi_process_sess_get_prop_buf_req( hfi_buf_req->buffer_type); switch (hfi_buf_req->buffer_type) { case HFI_BUFFER_INPUT: - memcpy(&buffreq->buffer[0], hfi_buf_req, - sizeof(struct hfi_buffer_requirements)); - buffreq->buffer[0].buffer_type = HAL_BUFFER_INPUT; + hal_buf_req = &buffreq->buffer[0]; + hal_buf_req->buffer_type = HAL_BUFFER_INPUT; break; case HFI_BUFFER_OUTPUT: - memcpy(&buffreq->buffer[1], hfi_buf_req, - sizeof(struct hfi_buffer_requirements)); - buffreq->buffer[1].buffer_type = HAL_BUFFER_OUTPUT; + hal_buf_req = &buffreq->buffer[1]; + hal_buf_req->buffer_type = HAL_BUFFER_OUTPUT; break; case HFI_BUFFER_OUTPUT2: - memcpy(&buffreq->buffer[2], hfi_buf_req, - sizeof(struct hfi_buffer_requirements)); - buffreq->buffer[2].buffer_type = HAL_BUFFER_OUTPUT2; + hal_buf_req = &buffreq->buffer[2]; + hal_buf_req->buffer_type = HAL_BUFFER_OUTPUT2; break; case HFI_BUFFER_EXTRADATA_INPUT: - memcpy(&buffreq->buffer[3], hfi_buf_req, - sizeof(struct hfi_buffer_requirements)); - buffreq->buffer[3].buffer_type = + hal_buf_req = &buffreq->buffer[3]; + hal_buf_req->buffer_type = HAL_BUFFER_EXTRADATA_INPUT; break; case HFI_BUFFER_EXTRADATA_OUTPUT: - memcpy(&buffreq->buffer[4], hfi_buf_req, - sizeof(struct hfi_buffer_requirements)); - buffreq->buffer[4].buffer_type = + hal_buf_req = &buffreq->buffer[4]; + hal_buf_req->buffer_type = HAL_BUFFER_EXTRADATA_OUTPUT; break; case HFI_BUFFER_EXTRADATA_OUTPUT2: - memcpy(&buffreq->buffer[5], hfi_buf_req, - sizeof(struct hfi_buffer_requirements)); - buffreq->buffer[5].buffer_type = + hal_buf_req = &buffreq->buffer[5]; + hal_buf_req->buffer_type = HAL_BUFFER_EXTRADATA_OUTPUT2; break; case HFI_BUFFER_COMMON_INTERNAL_SCRATCH: - memcpy(&buffreq->buffer[6], hfi_buf_req, - sizeof(struct hfi_buffer_requirements)); - buffreq->buffer[6].buffer_type = + hal_buf_req = &buffreq->buffer[6]; + hal_buf_req->buffer_type = HAL_BUFFER_INTERNAL_SCRATCH; break; case HFI_BUFFER_COMMON_INTERNAL_SCRATCH_1: - memcpy(&buffreq->buffer[7], hfi_buf_req, - sizeof(struct hfi_buffer_requirements)); - buffreq->buffer[7].buffer_type = + hal_buf_req = &buffreq->buffer[7]; + hal_buf_req->buffer_type = HAL_BUFFER_INTERNAL_SCRATCH_1; break; case HFI_BUFFER_COMMON_INTERNAL_SCRATCH_2: - memcpy(&buffreq->buffer[8], hfi_buf_req, - sizeof(struct hfi_buffer_requirements)); - buffreq->buffer[8].buffer_type = + hal_buf_req = &buffreq->buffer[8]; + hal_buf_req->buffer_type = HAL_BUFFER_INTERNAL_SCRATCH_2; break; case HFI_BUFFER_INTERNAL_PERSIST: - memcpy(&buffreq->buffer[9], hfi_buf_req, - sizeof(struct hfi_buffer_requirements)); - buffreq->buffer[9].buffer_type = + hal_buf_req = &buffreq->buffer[9]; + hal_buf_req->buffer_type = HAL_BUFFER_INTERNAL_PERSIST; break; case HFI_BUFFER_INTERNAL_PERSIST_1: - memcpy(&buffreq->buffer[10], hfi_buf_req, - sizeof(struct hfi_buffer_requirements)); - buffreq->buffer[10].buffer_type = + hal_buf_req = &buffreq->buffer[10]; + hal_buf_req->buffer_type = HAL_BUFFER_INTERNAL_PERSIST_1; break; case HFI_BUFFER_COMMON_INTERNAL_RECON: - memcpy(&buffreq->buffer[11], hfi_buf_req, - sizeof(struct hfi_buffer_requirements)); - buffreq->buffer[11].buffer_type = + hal_buf_req = &buffreq->buffer[11]; + hal_buf_req->buffer_type = HAL_BUFFER_INTERNAL_RECON; break; default: + hal_buf_req = NULL; s_vpr_e(sid, "%s: bad_buffer_type: %d\n", __func__, hfi_buf_req->buffer_type); break; } + if (hal_buf_req) + copy_hfi_to_hal_buf_req(hal_buf_req, hfi_buf_req); req_bytes -= sizeof(struct hfi_buffer_requirements); hfi_buf_req++; } From 7ae805aa633f455ffee9af69fcc4ddf2a1483403 Mon Sep 17 00:00:00 2001 From: Manikanta Kanamarlapudi Date: Wed, 15 Jul 2020 22:55:12 +0530 Subject: [PATCH 08/21] msm: vidc: check for cvp support check for cvp support before any cvp related operation. CRs-Fixed: 2741030 Change-Id: I7a457608321f0aa5b93b6f62d7ceb76c0b00fb93 Signed-off-by: Manikanta Kanamarlapudi --- msm/vidc/msm_venc.c | 6 ++++++ msm/vidc/msm_vidc.c | 5 +++++ msm/vidc/msm_vidc_common.h | 5 +++++ msm/vidc/msm_vidc_platform.c | 4 ++++ msm/vidc/msm_vidc_res_parse.c | 2 ++ msm/vidc/msm_vidc_resources.h | 1 + 6 files changed, 23 insertions(+) diff --git a/msm/vidc/msm_venc.c b/msm/vidc/msm_venc.c index ef75cc28987e..cf7b502ce8f5 100644 --- a/msm/vidc/msm_venc.c +++ b/msm/vidc/msm_venc.c @@ -4607,6 +4607,12 @@ int msm_venc_set_cvp_skipratio(struct msm_vidc_inst *inst) d_vpr_e("%s: invalid params %pK\n", __func__, inst); return -EINVAL; } + + if (!is_cvp_supported(inst)) { + s_vpr_h(inst->sid, "%s cvp is not supported", __func__); + return rc; + } + if (!msm_vidc_cvp_usage) return 0; diff --git a/msm/vidc/msm_vidc.c b/msm/vidc/msm_vidc.c index 3f789a4afe46..d0d6b128983a 100644 --- a/msm/vidc/msm_vidc.c +++ b/msm/vidc/msm_vidc.c @@ -794,6 +794,11 @@ static bool msm_vidc_set_cvp_metadata(struct msm_vidc_inst *inst) { return false; } + if (!is_cvp_supported(inst)) { + s_vpr_h(inst->sid, "%s cvp is not supported", __func__); + return true; + } + if (inst->prop.extradata_ctrls & EXTRADATA_ENC_INPUT_CVP) value = 0x1; diff --git a/msm/vidc/msm_vidc_common.h b/msm/vidc/msm_vidc_common.h index 98287b8570e7..7be37c5cb70f 100644 --- a/msm/vidc/msm_vidc_common.h +++ b/msm/vidc/msm_vidc_common.h @@ -59,6 +59,11 @@ static inline bool is_low_power_session(struct msm_vidc_inst *inst) return !!(inst->flags & VIDC_LOW_POWER); } +static inline bool is_cvp_supported(struct msm_vidc_inst *inst) +{ + return inst->core && !inst->core->resources.no_cvp; +} + static inline struct v4l2_ctrl *get_ctrl(struct msm_vidc_inst *inst, u32 id) { diff --git a/msm/vidc/msm_vidc_platform.c b/msm/vidc/msm_vidc_platform.c index f5ea2f69e633..473c3e934208 100644 --- a/msm/vidc/msm_vidc_platform.c +++ b/msm/vidc/msm_vidc_platform.c @@ -1398,6 +1398,10 @@ static struct msm_vidc_common_data holi_common_data[] = { .key = "qcom,fw-vpp-cycles", .value = 225975, }, + { + .key = "qcom,no-cvp", + .value = 1, + }, }; static struct msm_vidc_efuse_data shima_efuse_data[] = { diff --git a/msm/vidc/msm_vidc_res_parse.c b/msm/vidc/msm_vidc_res_parse.c index 0e14602d8f3d..1e17830ff333 100644 --- a/msm/vidc/msm_vidc_res_parse.c +++ b/msm/vidc/msm_vidc_res_parse.c @@ -813,6 +813,8 @@ int read_platform_resources_from_drv_data( "qcom,vpp_delay_supported"); res->enc_auto_dynamic_fps = find_key_value(platform_data, "qcom,enc_auto_dynamic_fps"); + res->no_cvp = find_key_value(platform_data, + "qcom,no-cvp"); res->csc_coeff_data = &platform_data->csc_data; diff --git a/msm/vidc/msm_vidc_resources.h b/msm/vidc/msm_vidc_resources.h index d7c8ee88b887..5add5ec54373 100644 --- a/msm/vidc/msm_vidc_resources.h +++ b/msm/vidc/msm_vidc_resources.h @@ -206,6 +206,7 @@ struct msm_vidc_platform_resources { uint32_t ubwc_stats_in_fbd; uint32_t has_vpp_delay; bool enc_auto_dynamic_fps; + bool no_cvp; }; static inline bool is_iommu_present(struct msm_vidc_platform_resources *res) From e05aff730dbc581bb4e9b8096fd72e94be750e23 Mon Sep 17 00:00:00 2001 From: Qiwei Liu Date: Wed, 29 Jul 2020 11:35:59 +0800 Subject: [PATCH 09/21] msm: vidc: fix less_or_equal resolution check For less_or_equal check, need to meet all the conditions when return true, not only one condition. Change-Id: Icf103721596cdcb6a4a90e1def67f3151140db85 Signed-off-by: Qiwei Liu --- msm/vidc/msm_vidc_clocks.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/msm/vidc/msm_vidc_clocks.c b/msm/vidc/msm_vidc_clocks.c index 59dfd21a88dc..4e2a8958a008 100644 --- a/msm/vidc/msm_vidc_clocks.c +++ b/msm/vidc/msm_vidc_clocks.c @@ -120,8 +120,8 @@ bool res_is_less_than_or_equal_to(u32 width, u32 height, u32 num_mbs = NUM_MBS_PER_FRAME(height, width); u32 max_side = max(ref_width, ref_height); - if (num_mbs <= NUM_MBS_PER_FRAME(ref_height, ref_width) || - width <= max_side || + if (num_mbs <= NUM_MBS_PER_FRAME(ref_height, ref_width) && + width <= max_side && height <= max_side) return true; else From a03df1c59360676143d4f06f1957d712a47af93e Mon Sep 17 00:00:00 2001 From: Mihir Ganu Date: Sun, 2 Aug 2020 20:14:27 -0700 Subject: [PATCH 10/21] msm: vidc: Update timer API Replace the obsolete do_gettimeofday API with ktime API. Change-Id: Id105d2c531f8b9aa3315800ab3312bc6a619b792 Signed-off-by: Mihir Ganu --- msm/vidc/msm_vidc_debug.c | 4 ---- msm/vidc/msm_vidc_debug.h | 6 ++---- 2 files changed, 2 insertions(+), 8 deletions(-) diff --git a/msm/vidc/msm_vidc_debug.c b/msm/vidc/msm_vidc_debug.c index 4b0f6090de40..b692f8c9f05b 100644 --- a/msm/vidc/msm_vidc_debug.c +++ b/msm/vidc/msm_vidc_debug.c @@ -728,10 +728,6 @@ inline bool is_print_allowed(u32 sid, u32 level) } /* Mock all the missing parts for successful compilation starts here */ -void do_gettimeofday(struct timeval *__ddl_tv) -{ -} - #ifndef CONFIG_VIDEOBUF2_CORE void vb2_queue_release(struct vb2_queue *q) { diff --git a/msm/vidc/msm_vidc_debug.h b/msm/vidc/msm_vidc_debug.h index 7b523eddb55f..389b0d9e9eb8 100644 --- a/msm/vidc/msm_vidc_debug.h +++ b/msm/vidc/msm_vidc_debug.h @@ -19,8 +19,6 @@ // void disable_irq_nosync(unsigned int irq); // void enable_irq(unsigned int irq); -void do_gettimeofday(struct timeval *__ddl_tv); - #ifndef CONFIG_VIDEOBUF2_CORE int vb2_reqbufs(struct vb2_queue *q, struct v4l2_requestbuffers *req); int vb2_qbuf(struct vb2_queue *q, struct media_device *mdev, @@ -234,7 +232,7 @@ static inline void tic(struct msm_vidc_inst *i, enum profiling_points p, memcpy(i->debug.pdata[p].name, b, 64); if ((msm_vidc_debug & VIDC_PERF) && i->debug.pdata[p].sampling) { - do_gettimeofday(&__ddl_tv); + __ddl_tv = ktime_to_timeval(ktime_get_real()); i->debug.pdata[p].start = (__ddl_tv.tv_sec * 1000) + (__ddl_tv.tv_usec / 1000); i->debug.pdata[p].sampling = false; @@ -247,7 +245,7 @@ static inline void toc(struct msm_vidc_inst *i, enum profiling_points p) if ((msm_vidc_debug & VIDC_PERF) && !i->debug.pdata[p].sampling) { - do_gettimeofday(&__ddl_tv); + __ddl_tv = ktime_to_timeval(ktime_get_real()); i->debug.pdata[p].stop = (__ddl_tv.tv_sec * 1000) + (__ddl_tv.tv_usec / 1000); i->debug.pdata[p].cumulative += i->debug.pdata[p].stop - From 21cba5ad49a1cf7f2892f5bc1bcae2b9dcb8a543 Mon Sep 17 00:00:00 2001 From: Shi Zhongbo Date: Mon, 3 Aug 2020 16:21:45 +0800 Subject: [PATCH 11/21] msm: vidc: fix time stamp store and fetch Fix to skip time stamp store and fetch for buffers with codec config flag. Change-Id: I867db519c45751ef2dadef5a323c7a4ad2741385 Signed-off-by: Shi Zhongbo --- msm/vidc/msm_vidc.c | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/msm/vidc/msm_vidc.c b/msm/vidc/msm_vidc.c index d0d6b128983a..c2125e6a8330 100644 --- a/msm/vidc/msm_vidc.c +++ b/msm/vidc/msm_vidc.c @@ -437,7 +437,9 @@ int msm_vidc_qbuf(void *instance, struct media_device *mdev, msm_comm_release_timestamps(inst); inst->flush_timestamps = false; - rc = msm_comm_store_timestamp(inst, timestamp_us); + if (!(b->flags & V4L2_BUF_FLAG_CODECCONFIG)) + rc = msm_comm_store_timestamp(inst, timestamp_us); + if (rc) goto unlock; inst->clk_data.frame_rate = msm_comm_get_max_framerate(inst); @@ -508,7 +510,9 @@ int msm_vidc_dqbuf(void *instance, struct v4l2_buffer *b) return -EINVAL; } } - if (is_decode_session(inst) && b->type == OUTPUT_MPLANE) + if (is_decode_session(inst) && + b->type == OUTPUT_MPLANE && + !(b->flags & V4L2_BUF_FLAG_CODECCONFIG)) msm_comm_fetch_ts_framerate(inst, b); return rc; From 912bb52fc15ba63817822188267deea898d1d939 Mon Sep 17 00:00:00 2001 From: Chinmay Sawarkar Date: Fri, 31 Jul 2020 13:58:28 -0700 Subject: [PATCH 12/21] msm: vidc: Update DCVS thresholds for sufficient seq change 1. Sufficient event should use fw min count for DCVS. 2. Input buffer count calculation is independent of Realtime/Non-Realtime. 3. Batching should be disabled if it is non-realtime session. 4. Removed misleading logs and changed buffer count logs to convey the correct meaning. Change-Id: Ieba6fc022549f5e767a833410ead5aa7fb52e14b Signed-off-by: Chinmay Sawarkar --- msm/vidc/msm_vidc.c | 8 +-- msm/vidc/msm_vidc_buffer_calculations.c | 3 +- msm/vidc/msm_vidc_buffer_calculations.h | 4 +- msm/vidc/msm_vidc_clocks.c | 78 ++++++++++++++++--------- msm/vidc/msm_vidc_clocks.h | 1 + msm/vidc/msm_vidc_common.c | 38 ++++++++---- 6 files changed, 86 insertions(+), 46 deletions(-) diff --git a/msm/vidc/msm_vidc.c b/msm/vidc/msm_vidc.c index 3f789a4afe46..f93db252a0a2 100644 --- a/msm/vidc/msm_vidc.c +++ b/msm/vidc/msm_vidc.c @@ -1403,13 +1403,13 @@ static int try_get_ctrl_for_instance(struct msm_vidc_inst *inst, break; case V4L2_CID_MIN_BUFFERS_FOR_CAPTURE: ctrl->val = inst->fmts[OUTPUT_PORT].count_min_host; - s_vpr_h(inst->sid, "g_min: hal_buffer %d min buffers %d\n", - HAL_BUFFER_OUTPUT, ctrl->val); + s_vpr_h(inst->sid, "g_min: OUTPUT_PORT count_min_host %d\n", + ctrl->val); break; case V4L2_CID_MIN_BUFFERS_FOR_OUTPUT: ctrl->val = inst->fmts[INPUT_PORT].count_min_host; - s_vpr_h(inst->sid, "g_min: hal_buffer %d min buffers %d\n", - HAL_BUFFER_INPUT, ctrl->val); + s_vpr_h(inst->sid, "g_min: INPUT_PORT count_min_host %d\n", + ctrl->val); break; case V4L2_CID_MPEG_VIDC_VIDEO_EXTRADATA: ctrl->val = inst->prop.extradata_ctrls; diff --git a/msm/vidc/msm_vidc_buffer_calculations.c b/msm/vidc/msm_vidc_buffer_calculations.c index 63ed34ed17f8..f9feb2fd649b 100644 --- a/msm/vidc/msm_vidc_buffer_calculations.c +++ b/msm/vidc/msm_vidc_buffer_calculations.c @@ -790,11 +790,10 @@ static int msm_vidc_get_extra_input_buff_count(struct msm_vidc_inst *inst) core = inst->core; /* - * For a non-realtime session, extra buffers are not required. * For thumbnail session, extra buffers are not required as * neither dcvs nor batching will be enabled. */ - if (!is_realtime_session(inst) || is_thumbnail_session(inst)) + if (is_thumbnail_session(inst)) return extra_input_count; if (is_decode_session(inst)) { diff --git a/msm/vidc/msm_vidc_buffer_calculations.h b/msm/vidc/msm_vidc_buffer_calculations.h index dce14310991e..e890db526660 100644 --- a/msm/vidc/msm_vidc_buffer_calculations.h +++ b/msm/vidc/msm_vidc_buffer_calculations.h @@ -6,9 +6,9 @@ #ifndef __H_MSM_VIDC_BUFFER_MEM_DEFS_H__ #define __H_MSM_VIDC_BUFFER_MEM_DEFS_H__ -/* extra o/p buffers in case of dcvs */ +/* extra buffers in case of dcvs */ #define DCVS_DEC_EXTRA_OUTPUT_BUFFERS 4 -#define DCVS_ENC_EXTRA_INPUT_BUFFERS DCVS_DEC_EXTRA_OUTPUT_BUFFERS +#define DCVS_ENC_EXTRA_INPUT_BUFFERS 4 struct msm_vidc_dec_buff_size_calculators { u32 (*calculate_scratch_size)(struct msm_vidc_inst *inst, u32 width, diff --git a/msm/vidc/msm_vidc_clocks.c b/msm/vidc/msm_vidc_clocks.c index 59dfd21a88dc..d8681cf26474 100644 --- a/msm/vidc/msm_vidc_clocks.c +++ b/msm/vidc/msm_vidc_clocks.c @@ -1008,6 +1008,53 @@ int msm_dcvs_try_enable(struct msm_vidc_inst *inst) return 0; } +void msm_dcvs_reset(struct msm_vidc_inst *inst) +{ + struct msm_vidc_format *fmt; + struct clock_data *dcvs; + + if (!inst) { + d_vpr_e("%s: Invalid params\n", __func__); + return; + } + + dcvs = &inst->clk_data; + if (inst->session_type == MSM_VIDC_ENCODER) { + fmt = &inst->fmts[INPUT_PORT]; + } else if (inst->session_type == MSM_VIDC_DECODER) { + fmt = &inst->fmts[OUTPUT_PORT]; + } else { + s_vpr_e(inst->sid, "%s: invalid session type %#x\n", + __func__, inst->session_type); + return; + } + + dcvs->min_threshold = fmt->count_min; + if (inst->session_type == MSM_VIDC_ENCODER) + dcvs->max_threshold = + min((fmt->count_min + DCVS_ENC_EXTRA_INPUT_BUFFERS), + fmt->count_actual); + else + dcvs->max_threshold = + min((fmt->count_min + DCVS_DEC_EXTRA_OUTPUT_BUFFERS), + fmt->count_actual); + + dcvs->dcvs_window = + dcvs->max_threshold < dcvs->min_threshold ? 0 : + dcvs->max_threshold - dcvs->min_threshold; + dcvs->nom_threshold = dcvs->min_threshold + + (dcvs->dcvs_window ? + (dcvs->dcvs_window / 2) : 0); + + dcvs->dcvs_flags = 0; + + s_vpr_p(inst->sid, "DCVS: Th[%d %d %d] Flag %#x\n", + dcvs->min_threshold, + dcvs->nom_threshold, dcvs->max_threshold, + dcvs->dcvs_flags); + +} + int msm_comm_init_clocks_and_bus_data(struct msm_vidc_inst *inst) { int rc = 0, j = 0; @@ -1048,8 +1095,6 @@ void msm_clock_data_reset(struct msm_vidc_inst *inst) struct allowed_clock_rates_table *allowed_clks_tbl = NULL; u64 total_freq = 0, rate = 0, load; int cycles; - struct clock_data *dcvs; - struct msm_vidc_format *fmt; if (!inst || !inst->core || !inst->clk_data.entry) { d_vpr_e("%s: Invalid args: Inst = %pK\n", @@ -1059,35 +1104,14 @@ void msm_clock_data_reset(struct msm_vidc_inst *inst) s_vpr_h(inst->sid, "Init DCVS Load\n"); core = inst->core; - dcvs = &inst->clk_data; load = msm_comm_get_inst_load_per_core(inst, LOAD_POWER); cycles = inst->clk_data.entry->vpp_cycles; allowed_clks_tbl = core->resources.allowed_clks_tbl; - if (inst->session_type == MSM_VIDC_ENCODER) { - cycles = inst->flags & VIDC_LOW_POWER ? - inst->clk_data.entry->low_power_cycles : - cycles; + if (inst->session_type == MSM_VIDC_ENCODER && + inst->flags & VIDC_LOW_POWER) + cycles = inst->clk_data.entry->low_power_cycles; - fmt = &inst->fmts[INPUT_PORT]; - } else if (inst->session_type == MSM_VIDC_DECODER) { - fmt = &inst->fmts[OUTPUT_PORT]; - } else { - s_vpr_e(inst->sid, "%s: invalid session type %#x\n", - __func__, inst->session_type); - return; - } - - dcvs->min_threshold = fmt->count_min; - dcvs->max_threshold = - min((fmt->count_min + DCVS_DEC_EXTRA_OUTPUT_BUFFERS), - fmt->count_actual); - - dcvs->dcvs_window = - dcvs->max_threshold < dcvs->min_threshold ? 0 : - dcvs->max_threshold - dcvs->min_threshold; - dcvs->nom_threshold = dcvs->min_threshold + - (dcvs->dcvs_window ? - (dcvs->dcvs_window / 2) : 0); + msm_dcvs_reset(inst); total_freq = cycles * load; diff --git a/msm/vidc/msm_vidc_clocks.h b/msm/vidc/msm_vidc_clocks.h index f32b370849d6..30a2d40a039f 100644 --- a/msm/vidc/msm_vidc_clocks.h +++ b/msm/vidc/msm_vidc_clocks.h @@ -8,6 +8,7 @@ #include "msm_vidc_internal.h" void msm_clock_data_reset(struct msm_vidc_inst *inst); +void msm_dcvs_reset(struct msm_vidc_inst *inst); int msm_vidc_set_clocks(struct msm_vidc_core *core, u32 sid); int msm_comm_vote_bus(struct msm_vidc_inst *inst); int msm_dcvs_try_enable(struct msm_vidc_inst *inst); diff --git a/msm/vidc/msm_vidc_common.c b/msm/vidc/msm_vidc_common.c index 6fcc7be8bba8..90a6605ac539 100644 --- a/msm/vidc/msm_vidc_common.c +++ b/msm/vidc/msm_vidc_common.c @@ -1598,7 +1598,6 @@ static void handle_event_change(enum hal_command_response cmd, void *data) struct hfi_device *hdev; u32 *ptr = NULL; struct msm_vidc_format *fmt; - struct v4l2_format *f; u32 codec; if (!event_notify) { @@ -1650,11 +1649,12 @@ static void handle_event_change(enum hal_command_response cmd, void *data) inst->pic_struct == MSM_VIDC_PIC_STRUCT_MAYBE_INTERLACED)) event_fields_changed = true; - f = &inst->fmts[OUTPUT_PORT].v4l2_fmt; + fmt = &inst->fmts[OUTPUT_PORT]; event_fields_changed |= - (f->fmt.pix_mp.height != event_notify->height); + (fmt->v4l2_fmt.fmt.pix_mp.height != + event_notify->height); event_fields_changed |= - (f->fmt.pix_mp.width != event_notify->width); + (fmt->v4l2_fmt.fmt.pix_mp.width != event_notify->width); if (event_fields_changed) { event = V4L2_EVENT_SEQ_CHANGED_INSUFFICIENT; @@ -1670,6 +1670,10 @@ static void handle_event_change(enum hal_command_response cmd, void *data) "%s: Failed to decide work mode\n", __func__); } + + fmt->count_min = event_notify->fw_min_cnt; + msm_dcvs_reset(inst); + s_vpr_h(inst->sid, "seq: No parameter change continue session\n"); rc = call_hfi_op(hdev, session_continue, @@ -2809,6 +2813,7 @@ bool is_batching_allowed(struct msm_vidc_inst *inst) { u32 op_pixelformat, fps, maxmbs, maxfps; u32 ignore_flags = VIDC_THUMBNAIL; + u32 enable = 0; if (!inst || !inst->core) return false; @@ -2827,17 +2832,23 @@ bool is_batching_allowed(struct msm_vidc_inst *inst) * as sufficient extra buffers (required for batch mode * on both ports) may not have been updated to client. */ - return (inst->batch.enable && + enable = (inst->batch.enable && inst->core->resources.decode_batching && !is_low_latency_hint(inst) && is_single_session(inst, ignore_flags) && is_decode_session(inst) && !is_thumbnail_session(inst) && + is_realtime_session(inst) && !inst->clk_data.low_latency_mode && (op_pixelformat == V4L2_PIX_FMT_NV12_UBWC || op_pixelformat == V4L2_PIX_FMT_NV12_TP10_UBWC) && fps <= maxfps && msm_vidc_get_mbs_per_frame(inst) <= maxmbs); + + s_vpr_hp(inst->sid, "%s: batching %s\n", + __func__, enable ? "enabled" : "disabled"); + + return enable; } static int msm_comm_session_abort(struct msm_vidc_inst *inst) @@ -4941,7 +4952,10 @@ int msm_comm_try_get_bufreqs(struct msm_vidc_inst *inst) for (i = 0; i < HAL_BUFFER_MAX; i++) { struct hal_buffer_requirements req = inst->buff_req.buffer[i]; - if (req.buffer_type != HAL_BUFFER_NONE) { + if (req.buffer_type != HAL_BUFFER_NONE && + req.buffer_type != HAL_BUFFER_INPUT && + req.buffer_type != HAL_BUFFER_OUTPUT && + req.buffer_type != HAL_BUFFER_OUTPUT2) { s_vpr_h(inst->sid, "%15s %8d %8d %8d %8d %8d\n", get_buffer_name(req.buffer_type), req.buffer_count_actual, @@ -5319,7 +5333,7 @@ int msm_comm_release_persist_buffers(struct msm_vidc_inst *inst) } int msm_comm_set_buffer_count(struct msm_vidc_inst *inst, - int host_count, int act_count, enum hal_buffer type) + int min_count, int act_count, enum hal_buffer type) { int rc = 0; struct v4l2_ctrl *ctrl; @@ -5334,20 +5348,22 @@ int msm_comm_set_buffer_count(struct msm_vidc_inst *inst, buf_count.buffer_type = get_hfi_buffer(type, inst->sid); buf_count.buffer_count_actual = act_count; - buf_count.buffer_count_min_host = host_count; + buf_count.buffer_count_min_host = min_count; /* set total superframe buffers count */ ctrl = get_ctrl(inst, V4L2_CID_MPEG_VIDC_SUPERFRAME); if (ctrl->val) buf_count.buffer_count_actual = act_count * ctrl->val; - s_vpr_h(inst->sid, "%s: hal_buffer %d min_host %d actual %d\n", - __func__, type, host_count, act_count); + s_vpr_h(inst->sid, + "%s: hal_buffer %d min %d actual %d superframe %d\n", + __func__, type, min_count, + buf_count.buffer_count_actual, ctrl->val); rc = call_hfi_op(hdev, session_set_property, inst->session, HFI_PROPERTY_PARAM_BUFFER_COUNT_ACTUAL, &buf_count, sizeof(buf_count)); if (rc) s_vpr_e(inst->sid, "Failed to set actual buffer count %d for buffer type %d\n", - act_count, type); + buf_count.buffer_count_actual, type); return rc; } From cd778f698821e409194d3112004a2b2fe4bed133 Mon Sep 17 00:00:00 2001 From: Govindaraj Rajagopal Date: Thu, 30 Jul 2020 09:46:52 +0530 Subject: [PATCH 13/21] msm: vidc: always read fuse value irrespective of sku-index [1] Only one vidc node is maintained, so "sku-index" entry is removed in dtsi. [2] In video driver, always read fuse value if efuse_data entry is populated Change-Id: I86b8c38f1e71491678b54a11783292e1281f90d3 Signed-off-by: Govindaraj Rajagopal --- msm/vidc/msm_vidc_platform.c | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/msm/vidc/msm_vidc_platform.c b/msm/vidc/msm_vidc_platform.c index 473c3e934208..a08af134f47d 100644 --- a/msm/vidc/msm_vidc_platform.c +++ b/msm/vidc/msm_vidc_platform.c @@ -1625,11 +1625,9 @@ void *vidc_get_drv_data(struct device *dev) goto exit; /* Check for sku version */ - if (of_find_property(dev->of_node, "sku-index", NULL)) { - rc = msm_vidc_read_efuse(driver_data, dev); - if (rc) - goto exit; - } + rc = msm_vidc_read_efuse(driver_data, dev); + if (rc) + goto exit; if (!strcmp(match->compatible, "qcom,lahaina-vidc")) { ddr_type = of_fdt_get_ddrtype(); From d36983b6f630a991451867588026787957ce5c7d Mon Sep 17 00:00:00 2001 From: Rakshitha Shakamuri Date: Fri, 7 Aug 2020 14:43:07 -0700 Subject: [PATCH 14/21] Revert "msm: vidc: Update timer API" This reverts commit a03df1c59360676143d4f06f1957d712a47af93e. Change-Id: I65a664bfcb25a534fc71be238dae8560cea3fd6c Signed-off-by: Rakshitha Shakamuri --- msm/vidc/msm_vidc_debug.c | 4 ++++ msm/vidc/msm_vidc_debug.h | 6 ++++-- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/msm/vidc/msm_vidc_debug.c b/msm/vidc/msm_vidc_debug.c index b692f8c9f05b..4b0f6090de40 100644 --- a/msm/vidc/msm_vidc_debug.c +++ b/msm/vidc/msm_vidc_debug.c @@ -728,6 +728,10 @@ inline bool is_print_allowed(u32 sid, u32 level) } /* Mock all the missing parts for successful compilation starts here */ +void do_gettimeofday(struct timeval *__ddl_tv) +{ +} + #ifndef CONFIG_VIDEOBUF2_CORE void vb2_queue_release(struct vb2_queue *q) { diff --git a/msm/vidc/msm_vidc_debug.h b/msm/vidc/msm_vidc_debug.h index 389b0d9e9eb8..7b523eddb55f 100644 --- a/msm/vidc/msm_vidc_debug.h +++ b/msm/vidc/msm_vidc_debug.h @@ -19,6 +19,8 @@ // void disable_irq_nosync(unsigned int irq); // void enable_irq(unsigned int irq); +void do_gettimeofday(struct timeval *__ddl_tv); + #ifndef CONFIG_VIDEOBUF2_CORE int vb2_reqbufs(struct vb2_queue *q, struct v4l2_requestbuffers *req); int vb2_qbuf(struct vb2_queue *q, struct media_device *mdev, @@ -232,7 +234,7 @@ static inline void tic(struct msm_vidc_inst *i, enum profiling_points p, memcpy(i->debug.pdata[p].name, b, 64); if ((msm_vidc_debug & VIDC_PERF) && i->debug.pdata[p].sampling) { - __ddl_tv = ktime_to_timeval(ktime_get_real()); + do_gettimeofday(&__ddl_tv); i->debug.pdata[p].start = (__ddl_tv.tv_sec * 1000) + (__ddl_tv.tv_usec / 1000); i->debug.pdata[p].sampling = false; @@ -245,7 +247,7 @@ static inline void toc(struct msm_vidc_inst *i, enum profiling_points p) if ((msm_vidc_debug & VIDC_PERF) && !i->debug.pdata[p].sampling) { - __ddl_tv = ktime_to_timeval(ktime_get_real()); + do_gettimeofday(&__ddl_tv); i->debug.pdata[p].stop = (__ddl_tv.tv_sec * 1000) + (__ddl_tv.tv_usec / 1000); i->debug.pdata[p].cumulative += i->debug.pdata[p].stop - From 5e7df6ab913136de82b3009cf498ab979c1b6afe Mon Sep 17 00:00:00 2001 From: Govindaraj Rajagopal Date: Mon, 10 Aug 2020 13:24:30 +0530 Subject: [PATCH 15/21] msm: vidc: Deprecate Mpeg2 secure decode support Remove secure deocde support for Mpeg2 codec. Change-Id: Ieec132b0c86aa6be3e382c091acdf734d1e1c31e Signed-off-by: Govindaraj Rajagopal --- msm/vidc/msm_vdec.c | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/msm/vidc/msm_vdec.c b/msm/vidc/msm_vdec.c index c53353abd940..42707e64d3f1 100644 --- a/msm/vidc/msm_vdec.c +++ b/msm/vidc/msm_vdec.c @@ -1195,10 +1195,9 @@ int msm_vdec_set_secure_mode(struct msm_vidc_inst *inst) if (ctrl->val) { if (!(codec == V4L2_PIX_FMT_HEVC || codec == V4L2_PIX_FMT_H264 || - codec == V4L2_PIX_FMT_VP9 || - codec == V4L2_PIX_FMT_MPEG2)) { + codec == V4L2_PIX_FMT_VP9)) { s_vpr_e(inst->sid, - "%s: Secure allowed for HEVC/H264/VP9/MPEG2\n", + "%s: Secure allowed for HEVC/H264/VP9\n", __func__); return -EINVAL; } From 460c45b72ae224d3f136cb0dc1d96584610d793e Mon Sep 17 00:00:00 2001 From: Shi Zhongbo Date: Wed, 5 Aug 2020 14:13:37 +0800 Subject: [PATCH 16/21] msm: vidc: fix time stamp store after EOS for decoders 1. Add a new EOS flag to denote EOS pending status; 2. Set all existed time stamps with EOS flag as true after inserting EOS time stamp; 3. Ignore time stamp sorting to buffers with EOS pending flag as true; Change-Id: I72b041150973e2a28d1039c5f906fdb222a86081 Signed-off-by: Shi Zhongbo --- msm/vidc/msm_vidc.c | 3 ++- msm/vidc/msm_vidc_common.c | 19 +++++++++++++++---- msm/vidc/msm_vidc_common.h | 3 ++- msm/vidc/msm_vidc_internal.h | 1 + 4 files changed, 20 insertions(+), 6 deletions(-) diff --git a/msm/vidc/msm_vidc.c b/msm/vidc/msm_vidc.c index 9d7d8d27257a..8243a1a88737 100644 --- a/msm/vidc/msm_vidc.c +++ b/msm/vidc/msm_vidc.c @@ -438,7 +438,8 @@ int msm_vidc_qbuf(void *instance, struct media_device *mdev, inst->flush_timestamps = false; if (!(b->flags & V4L2_BUF_FLAG_CODECCONFIG)) - rc = msm_comm_store_timestamp(inst, timestamp_us); + rc = msm_comm_store_timestamp(inst, timestamp_us, + b->flags & V4L2_BUF_FLAG_EOS); if (rc) goto unlock; diff --git a/msm/vidc/msm_vidc_common.c b/msm/vidc/msm_vidc_common.c index 90a6605ac539..f92584b6a485 100644 --- a/msm/vidc/msm_vidc_common.c +++ b/msm/vidc/msm_vidc_common.c @@ -7600,7 +7600,8 @@ void msm_comm_release_timestamps(struct msm_vidc_inst *inst) mutex_unlock(&inst->timestamps.lock); } -int msm_comm_store_timestamp(struct msm_vidc_inst *inst, u64 timestamp_us) +int msm_comm_store_timestamp(struct msm_vidc_inst *inst, u64 timestamp_us, + bool is_eos) { struct msm_vidc_timestamps *entry, *node, *prev = NULL; struct msm_vidc_timestamps *duplicate; @@ -7618,7 +7619,8 @@ int msm_comm_store_timestamp(struct msm_vidc_inst *inst, u64 timestamp_us) duplicate = NULL; list_for_each_entry(node, &inst->timestamps.list, list) { count++; - if (node->is_valid && node->timestamp_us == timestamp_us) + if (node->is_valid && node->timestamp_us == timestamp_us && + !node->is_eos) duplicate = node; } @@ -7649,6 +7651,7 @@ int msm_comm_store_timestamp(struct msm_vidc_inst *inst, u64 timestamp_us) entry->timestamp_us = duplicate->timestamp_us; entry->framerate = duplicate->framerate; entry->is_valid = true; + entry->is_eos = is_eos; /* add entry next to duplicate */ list_add(&entry->list, &duplicate->list); goto unlock; @@ -7661,7 +7664,8 @@ int msm_comm_store_timestamp(struct msm_vidc_inst *inst, u64 timestamp_us) prev = NULL; inserted = false; list_for_each_entry(node, &inst->timestamps.list, list) { - if (entry->timestamp_us < node->timestamp_us) { + if (entry->timestamp_us < node->timestamp_us && + !node->is_eos) { /* * if prev available add entry next to prev else * entry is first so add it at head. @@ -7688,7 +7692,8 @@ int msm_comm_store_timestamp(struct msm_vidc_inst *inst, u64 timestamp_us) node->timestamp_us, prev->timestamp_us); break; } - if (node->timestamp_us == entry->timestamp_us) { + if (node->timestamp_us == entry->timestamp_us && + !node->is_eos) { if (prev) node->framerate = msm_comm_calc_framerate(inst, node->timestamp_us, prev->timestamp_us); @@ -7697,6 +7702,12 @@ int msm_comm_store_timestamp(struct msm_vidc_inst *inst, u64 timestamp_us) prev = node; } + /* mark all entries as eos if is_eos is queued */ + if (is_eos) + list_for_each_entry(node, &inst->timestamps.list, list) { + node->is_eos = true; + } + unlock: mutex_unlock(&inst->timestamps.lock); return rc; diff --git a/msm/vidc/msm_vidc_common.h b/msm/vidc/msm_vidc_common.h index 57f30be43c1a..7880f6d7a5d7 100644 --- a/msm/vidc/msm_vidc_common.h +++ b/msm/vidc/msm_vidc_common.h @@ -400,7 +400,8 @@ int msm_comm_set_cvp_skip_ratio(struct msm_vidc_inst *inst, uint32_t capture_rate, uint32_t cvp_rate); int msm_comm_fetch_ts_framerate(struct msm_vidc_inst *inst, struct v4l2_buffer *b); -int msm_comm_store_timestamp(struct msm_vidc_inst *inst, u64 timestamp_us); +int msm_comm_store_timestamp(struct msm_vidc_inst *inst, u64 timestamp_us, + bool is_eos); void msm_comm_release_timestamps(struct msm_vidc_inst *inst); u32 msm_comm_get_max_framerate(struct msm_vidc_inst *inst); u32 msm_comm_calc_framerate(struct msm_vidc_inst *inst, u64 timestamp_us, diff --git a/msm/vidc/msm_vidc_internal.h b/msm/vidc/msm_vidc_internal.h index cd2f35c46852..f57f36e455c9 100644 --- a/msm/vidc/msm_vidc_internal.h +++ b/msm/vidc/msm_vidc_internal.h @@ -239,6 +239,7 @@ struct msm_vidc_timestamps { u64 timestamp_us; u32 framerate; bool is_valid; + bool is_eos; }; enum efuse_purpose { From 4be4e326bfc34a12173199d248f29a510e21cd84 Mon Sep 17 00:00:00 2001 From: Mihir Ganu Date: Thu, 6 Aug 2020 14:31:37 -0700 Subject: [PATCH 17/21] msm: vidc: Fix incorrect VP9 scratch buffer calculation Fix the incorrect VP9 decoder scratch buffer calculation and match it with firmware definition of scratch buffer size. Change-Id: Ie901082760d675153d1eb898cbe665cc6ad59bd1 Signed-off-by: Mihir Ganu --- msm/vidc/msm_vidc_buffer_calculations.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/msm/vidc/msm_vidc_buffer_calculations.c b/msm/vidc/msm_vidc_buffer_calculations.c index f9feb2fd649b..03079a37ee35 100644 --- a/msm/vidc/msm_vidc_buffer_calculations.c +++ b/msm/vidc/msm_vidc_buffer_calculations.c @@ -1349,13 +1349,15 @@ static inline u32 calculate_vpxd_scratch_size(struct msm_vidc_inst *inst, ((BIN_BUFFER_THRESHOLD * 3) >> 1)) * VPX_DECODER_FRAME_CONCURENCY_LVL * VPX_DECODER_FRAME_BIN_HDR_BUDGET_RATIO_NUM / - VPX_DECODER_FRAME_BIN_HDR_BUDGET_RATIO_DEN, + VPX_DECODER_FRAME_BIN_HDR_BUDGET_RATIO_DEN / + num_vpp_pipes, VENUS_DMA_ALIGNMENT); binbuffer2_size = ALIGN(max_t(u32, size_yuv, ((BIN_BUFFER_THRESHOLD * 3) >> 1)) * VPX_DECODER_FRAME_CONCURENCY_LVL * VPX_DECODER_FRAME_BIN_RES_BUDGET_RATIO_NUM / - VPX_DECODER_FRAME_BIN_RES_BUDGET_RATIO_DEN, + VPX_DECODER_FRAME_BIN_RES_BUDGET_RATIO_DEN / + num_vpp_pipes, VENUS_DMA_ALIGNMENT); size = binbuffer1_size + binbuffer2_size; size = size * num_vpp_pipes; From b1a132ad57c384f0d2fe4a22cf0d7de0817b1bc7 Mon Sep 17 00:00:00 2001 From: Shi Zhongbo Date: Mon, 10 Aug 2020 13:52:36 +0800 Subject: [PATCH 18/21] msm: vidc: revise timestamp data type to s64 Revise internal timestamp data type from u64 to s64 in case of negative timestamps. Change-Id: Ib026d504a08ce5ac67d1d962b671c37637761321 Signed-off-by: Shi Zhongbo --- msm/vidc/msm_vidc.c | 4 ++-- msm/vidc/msm_vidc_common.c | 6 +++--- msm/vidc/msm_vidc_common.h | 2 +- msm/vidc/msm_vidc_internal.h | 2 +- 4 files changed, 7 insertions(+), 7 deletions(-) diff --git a/msm/vidc/msm_vidc.c b/msm/vidc/msm_vidc.c index 8243a1a88737..7f78071d585d 100644 --- a/msm/vidc/msm_vidc.c +++ b/msm/vidc/msm_vidc.c @@ -366,7 +366,7 @@ int msm_vidc_qbuf(void *instance, struct media_device *mdev, int rc = 0; unsigned int i = 0; struct buf_queue *q = NULL; - u64 timestamp_us = 0; + s64 timestamp_us = 0; u32 cr = 0; if (!inst || !inst->core || !b || !valid_v4l2_buffer(b, inst)) { @@ -430,7 +430,7 @@ int msm_vidc_qbuf(void *instance, struct media_device *mdev, && b->type == INPUT_MPLANE) b->flags |= V4L2_BUF_FLAG_PERF_MODE; - timestamp_us = (u64)((b->timestamp.tv_sec * 1000000ULL) + + timestamp_us = (s64)((b->timestamp.tv_sec * 1000000) + b->timestamp.tv_usec); if (is_decode_session(inst) && b->type == INPUT_MPLANE) { if (inst->flush_timestamps) diff --git a/msm/vidc/msm_vidc_common.c b/msm/vidc/msm_vidc_common.c index f92584b6a485..652334c646c4 100644 --- a/msm/vidc/msm_vidc_common.c +++ b/msm/vidc/msm_vidc_common.c @@ -7600,7 +7600,7 @@ void msm_comm_release_timestamps(struct msm_vidc_inst *inst) mutex_unlock(&inst->timestamps.lock); } -int msm_comm_store_timestamp(struct msm_vidc_inst *inst, u64 timestamp_us, +int msm_comm_store_timestamp(struct msm_vidc_inst *inst, s64 timestamp_us, bool is_eos) { struct msm_vidc_timestamps *entry, *node, *prev = NULL; @@ -7794,8 +7794,8 @@ int msm_comm_fetch_ts_framerate(struct msm_vidc_inst *inst, if (!(b->flags & V4L2_BUF_FLAG_END_OF_SUBFRAME)) node->is_valid = false; - b->timestamp.tv_sec = node->timestamp_us / 1000000ull; - b->timestamp.tv_usec = node->timestamp_us % 1000000ull; + b->timestamp.tv_sec = node->timestamp_us / 1000000; + b->timestamp.tv_usec = node->timestamp_us % 1000000; b->m.planes[0].reserved[MSM_VIDC_FRAMERATE] = node->framerate; break; } diff --git a/msm/vidc/msm_vidc_common.h b/msm/vidc/msm_vidc_common.h index 7880f6d7a5d7..e46c5bbd9f62 100644 --- a/msm/vidc/msm_vidc_common.h +++ b/msm/vidc/msm_vidc_common.h @@ -400,7 +400,7 @@ int msm_comm_set_cvp_skip_ratio(struct msm_vidc_inst *inst, uint32_t capture_rate, uint32_t cvp_rate); int msm_comm_fetch_ts_framerate(struct msm_vidc_inst *inst, struct v4l2_buffer *b); -int msm_comm_store_timestamp(struct msm_vidc_inst *inst, u64 timestamp_us, +int msm_comm_store_timestamp(struct msm_vidc_inst *inst, s64 timestamp_us, bool is_eos); void msm_comm_release_timestamps(struct msm_vidc_inst *inst); u32 msm_comm_get_max_framerate(struct msm_vidc_inst *inst); diff --git a/msm/vidc/msm_vidc_internal.h b/msm/vidc/msm_vidc_internal.h index f57f36e455c9..e04ac940ace2 100644 --- a/msm/vidc/msm_vidc_internal.h +++ b/msm/vidc/msm_vidc_internal.h @@ -236,7 +236,7 @@ struct msm_vidc_codec { struct msm_vidc_timestamps { struct list_head list; - u64 timestamp_us; + s64 timestamp_us; u32 framerate; bool is_valid; bool is_eos; From be77d74ff10deb720932db7678e4f622bc93c7b6 Mon Sep 17 00:00:00 2001 From: Govindaraj Rajagopal Date: Tue, 11 Aug 2020 20:20:00 +0530 Subject: [PATCH 19/21] msm: vidc: update vsp_cycle entries for shima Updated VSP base cycle entries for Shima to inline with vperf. Change-Id: I26e7a521434765b97cc1a508b714652d14adf2aa Signed-off-by: Govindaraj Rajagopal --- msm/vidc/msm_vidc_platform.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/msm/vidc/msm_vidc_platform.c b/msm/vidc/msm_vidc_platform.c index a08af134f47d..877b7aeebde3 100644 --- a/msm/vidc/msm_vidc_platform.c +++ b/msm/vidc/msm_vidc_platform.c @@ -72,12 +72,12 @@ static struct msm_vidc_codec_data bengal_codec_data[] = { }; static struct msm_vidc_codec_data shima_codec_data[] = { - CODEC_ENTRY(V4L2_PIX_FMT_H264, MSM_VIDC_ENCODER, 0, 675, 320), - CODEC_ENTRY(V4L2_PIX_FMT_HEVC, MSM_VIDC_ENCODER, 0, 675, 320), - CODEC_ENTRY(V4L2_PIX_FMT_MPEG2, MSM_VIDC_DECODER, 0, 200, 200), - CODEC_ENTRY(V4L2_PIX_FMT_H264, MSM_VIDC_DECODER, 0, 200, 200), - CODEC_ENTRY(V4L2_PIX_FMT_HEVC, MSM_VIDC_DECODER, 0, 200, 200), - CODEC_ENTRY(V4L2_PIX_FMT_VP9, MSM_VIDC_DECODER, 0, 200, 200), + CODEC_ENTRY(V4L2_PIX_FMT_H264, MSM_VIDC_ENCODER, 25, 675, 320), + CODEC_ENTRY(V4L2_PIX_FMT_HEVC, MSM_VIDC_ENCODER, 25, 675, 320), + CODEC_ENTRY(V4L2_PIX_FMT_MPEG2, MSM_VIDC_DECODER, 25, 200, 200), + CODEC_ENTRY(V4L2_PIX_FMT_H264, MSM_VIDC_DECODER, 25, 200, 200), + CODEC_ENTRY(V4L2_PIX_FMT_HEVC, MSM_VIDC_DECODER, 25, 200, 200), + CODEC_ENTRY(V4L2_PIX_FMT_VP9, MSM_VIDC_DECODER, 60, 200, 200), }; static struct msm_vidc_codec_data holi_codec_data[] = { From 36d91e66e0fe1e93f1035e16b05d1af894e170a2 Mon Sep 17 00:00:00 2001 From: Govindaraj Rajagopal Date: Tue, 11 Aug 2020 11:50:52 +0530 Subject: [PATCH 20/21] msm: vidc: set chroma_qp_offset only for client set cases Set chroma_qp_offset hfi to firmware only for client set cases. Supported value: 0 & -12 If hfi not set, firmware proceeds with its own default value. 10-bit: default: 0 8-bit : default: Adaptive chroma_qp Change-Id: I40262aae87b2a385c6cd7d60faa19b6adfe8b151 Signed-off-by: Govindaraj Rajagopal --- msm/vidc/msm_venc.c | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/msm/vidc/msm_venc.c b/msm/vidc/msm_venc.c index cf7b502ce8f5..bf3184fe1040 100644 --- a/msm/vidc/msm_venc.c +++ b/msm/vidc/msm_venc.c @@ -32,8 +32,6 @@ #define DEFAULT_QP 0xA #define DEFAULT_QP_PACKED 0xA0A0A #define MIN_CHROMA_QP_OFFSET -12 -#define MAX_CHROMA_QP_OFFSET 0 -#define DEFAULT_CHROMA_QP_OFFSET 0 #define MAX_INTRA_REFRESH_MBS ((7680 * 4320) >> 8) #define MAX_LTR_FRAME_COUNT 10 #define MAX_NUM_B_FRAMES 1 @@ -927,8 +925,8 @@ static struct msm_vidc_ctrl msm_venc_ctrls[] = { .name = "Chroma QP Index Offset", .type = V4L2_CTRL_TYPE_INTEGER, .minimum = MIN_CHROMA_QP_OFFSET, - .maximum = MAX_CHROMA_QP_OFFSET, - .default_value = DEFAULT_CHROMA_QP_OFFSET, + .maximum = INT_MAX, + .default_value = INT_MAX, .step = 1, }, { @@ -3381,7 +3379,7 @@ int msm_venc_set_chroma_qp_offset(struct msm_vidc_inst *inst) hdev = inst->core->device; chr = get_ctrl(inst, V4L2_CID_MPEG_VIDEO_H264_CHROMA_QP_INDEX_OFFSET); - if (chr->val != MIN_CHROMA_QP_OFFSET) + if (chr->val == INT_MAX || (chr->val != 0 && chr->val != -12)) return 0; f = &inst->fmts[INPUT_PORT].v4l2_fmt; From 5a5d1b28593037876d9c973d8cd2809595a0aae1 Mon Sep 17 00:00:00 2001 From: Mihir Ganu Date: Tue, 11 Aug 2020 15:47:34 -0700 Subject: [PATCH 21/21] msm: vidc: Update VP9 decoder capabilities Revise VP9 decoder capabilities and limits to match the updated Lahaina PRD. Change-Id: I7a92c88b21e19ab44b43a0c829491f58aa1ce492 Signed-off-by: Mihir Ganu --- msm/vidc/msm_vdec.c | 2 +- msm/vidc/msm_vidc_platform.c | 10 ++++++++++ 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/msm/vidc/msm_vdec.c b/msm/vidc/msm_vdec.c index 42707e64d3f1..685f56e6c17b 100644 --- a/msm/vidc/msm_vdec.c +++ b/msm/vidc/msm_vdec.c @@ -17,7 +17,7 @@ #define MIN_NUM_DEC_CAPTURE_BUFFERS 4 /* Y=16(0-9bits), Cb(10-19bits)=Cr(20-29bits)=128, black by default */ #define DEFAULT_VIDEO_CONCEAL_COLOR_BLACK 0x8020010 -#define MAX_VP9D_INST_COUNT 6 +#define MAX_VP9D_INST_COUNT 3 static const char *const mpeg_video_h264_profile[] = { "Baseline", diff --git a/msm/vidc/msm_vidc_platform.c b/msm/vidc/msm_vidc_platform.c index 877b7aeebde3..259c13747682 100644 --- a/msm/vidc/msm_vidc_platform.c +++ b/msm/vidc/msm_vidc_platform.c @@ -358,6 +358,16 @@ static struct msm_vidc_codec_capability lahaina_capabilities[] = { {CAP_FRAMERATE, DEC, MPEG2, 1, 30, 1, 30}, {CAP_BITRATE, DEC, MPEG2, 1, 40000000, 1, 20000000}, + /* VP9 decoder-specific */ + {CAP_FRAME_WIDTH, DEC, VP9, 96, 4096, 1, 1920}, + {CAP_FRAME_HEIGHT, DEC, VP9, 96, 4096, 1, 1080}, + /* (4096 * 2304) / 256 */ + {CAP_MBS_PER_FRAME, DEC, VP9, 36, 36864, 1, 36864}, + /* ((4096 * 2304) / 256) * 60*/ + {CAP_MBS_PER_SECOND, DEC, VP9, 36, 2211840, 1, 2211840}, + {CAP_FRAMERATE, DEC, VP9, 1, 60, 1, 60}, + {CAP_BITRATE, DEC, VP9, 1, 100000000, 1, 20000000}, + /* Secure usecase specific */ {CAP_SECURE_FRAME_WIDTH, DEC, CODECS_ALL, 96, 4096, 1, 1920}, {CAP_SECURE_FRAME_HEIGHT, DEC, CODECS_ALL, 96, 4096, 1, 1080},