diff --git a/driver/variant/iris2/src/msm_vidc_iris2.c b/driver/variant/iris2/src/msm_vidc_iris2.c index a6c5c36979..4f71d901bc 100644 --- a/driver/variant/iris2/src/msm_vidc_iris2.c +++ b/driver/variant/iris2/src/msm_vidc_iris2.c @@ -533,34 +533,6 @@ static int __boot_firmware_iris2(struct msm_vidc_core *vidc_core) return rc; } -bool res_is_greater_than(u32 width, u32 height, - u32 ref_width, u32 ref_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 || - height > max_side) - return true; - else - return false; -} - -bool res_is_less_than_or_equal_to(u32 width, u32 height, - u32 ref_width, u32 ref_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 && - height <= max_side) - return true; - else - return false; -} - int msm_vidc_decide_work_mode_iris2(struct msm_vidc_inst* inst) { u32 work_mode; diff --git a/driver/vidc/inc/msm_vidc_driver.h b/driver/vidc/inc/msm_vidc_driver.h index 2e77dcb7cf..9af63f97ee 100644 --- a/driver/vidc/inc/msm_vidc_driver.h +++ b/driver/vidc/inc/msm_vidc_driver.h @@ -405,5 +405,9 @@ int msm_vidc_flush_ts(struct msm_vidc_inst *inst); const char *buf_name(enum msm_vidc_buffer_type type); void msm_vidc_free_capabililty_list(struct msm_vidc_inst *inst, enum msm_vidc_ctrl_list_type list_type); +bool res_is_greater_than(u32 width, u32 height, + u32 ref_width, u32 ref_height); +bool res_is_less_than_or_equal_to(u32 width, u32 height, + u32 ref_width, u32 ref_height); #endif // _MSM_VIDC_DRIVER_H_ diff --git a/driver/vidc/inc/msm_vidc_inst.h b/driver/vidc/inc/msm_vidc_inst.h index 36d7096e0f..a666580500 100644 --- a/driver/vidc/inc/msm_vidc_inst.h +++ b/driver/vidc/inc/msm_vidc_inst.h @@ -153,5 +153,6 @@ struct msm_vidc_inst { bool vb2q_init; u32 max_input_data_size; u32 dpb_list_payload[MAX_DPB_LIST_ARRAY_SIZE]; + u32 max_map_output_count; }; #endif // _MSM_VIDC_INST_H_ diff --git a/driver/vidc/inc/msm_vidc_internal.h b/driver/vidc/inc/msm_vidc_internal.h index 10efeee36e..556c6733b9 100644 --- a/driver/vidc/inc/msm_vidc_internal.h +++ b/driver/vidc/inc/msm_vidc_internal.h @@ -43,7 +43,7 @@ #define MAX_CAP_CHILDREN 16 #define DEFAULT_BITSTREM_ALIGNMENT 16 #define H265_BITSTREM_ALIGNMENT 32 -#define DEFAULT_MAX_HOST_BUF_COUNT 128 +#define DEFAULT_MAX_HOST_BUF_COUNT 64 #define DEFAULT_MAX_HOST_BURST_BUF_COUNT 256 #define BIT_DEPTH_8 (8 << 16 | 8) #define BIT_DEPTH_10 (10 << 16 | 10) @@ -119,14 +119,8 @@ #define HW_RESPONSE_TIMEOUT_VALUE (1000) #define SW_PC_DELAY_VALUE (HW_RESPONSE_TIMEOUT_VALUE + 500) #define FW_UNLOAD_DELAY_VALUE (SW_PC_DELAY_VALUE + 1500) -/* - * MAX_MAPPED_OUTPUT_COUNT: maximum mappings which can - * be present in output map list with refcount 1. These - * mappings exist due to delayed unmap feature. Current - * threshold is kept as 50 to handle vpp usecases - * which might have many output buffers. - */ -#define MAX_MAPPED_OUTPUT_COUNT 64 + +#define MAX_MAP_OUTPUT_COUNT 64 #define MAX_DPB_COUNT 32 /* * max dpb count in firmware = 16 diff --git a/driver/vidc/src/msm_vdec.c b/driver/vidc/src/msm_vdec.c index e27b94dc46..33d7deb82c 100644 --- a/driver/vidc/src/msm_vdec.c +++ b/driver/vidc/src/msm_vdec.c @@ -1625,6 +1625,44 @@ static int msm_vdec_subscribe_output_port_settings_change(struct msm_vidc_inst * return rc; } +static int msm_vdec_update_max_map_output_count(struct msm_vidc_inst *inst) +{ + int rc = 0; + struct v4l2_format *f; + u32 width, height, count; + + if (!inst) { + d_vpr_e("%s: invalid params\n", __func__); + return -EINVAL; + } + + f = &inst->fmts[OUTPUT_PORT]; + width = f->fmt.pix_mp.width; + height = f->fmt.pix_mp.height; + + /* + * adjust max map output count based on resolution + * to enhance performance. + * For 8K session: count = 20 + * For 4K session: count = 32 + * For 1080p session: count = 48 + * For all remaining sessions: count = 64 + */ + if (res_is_greater_than(width, height, 4096, 2160)) + count = 20; + else if (res_is_greater_than(width, height, 1920, 1080)) + count = 32; + else if (res_is_greater_than(width, height, 1280, 720)) + count = 48; + else + count = 64; + + inst->max_map_output_count = count; + i_vpr_h(inst, "%s: count: %d\n", __func__, inst->max_map_output_count); + + return rc; +} + int msm_vdec_streamon_output(struct msm_vidc_inst *inst) { int rc = 0; @@ -1642,6 +1680,10 @@ int msm_vdec_streamon_output(struct msm_vidc_inst *inst) return -EINVAL; } + rc = msm_vdec_update_max_map_output_count(inst); + if (rc) + return rc; + rc = msm_vdec_set_output_properties(inst); if (rc) goto error; @@ -1884,7 +1926,7 @@ static int msm_vidc_unmap_excessive_mappings(struct msm_vidc_inst *inst) refcount_one_bufs_count++; } - if (refcount_one_bufs_count <= MAX_MAPPED_OUTPUT_COUNT) + if (refcount_one_bufs_count <= inst->max_map_output_count) return 0; /* unmap these buffers as they are stale entries */ @@ -2528,6 +2570,7 @@ int msm_vdec_inst_init(struct msm_vidc_inst *inst) inst->buffers.output.min_count + inst->buffers.output.extra_count; inst->buffers.output.size = f->fmt.pix_mp.plane_fmt[0].sizeimage; + inst->max_map_output_count = MAX_MAP_OUTPUT_COUNT; f = &inst->fmts[OUTPUT_META_PORT]; f->type = OUTPUT_META_PLANE; diff --git a/driver/vidc/src/msm_vidc_driver.c b/driver/vidc/src/msm_vidc_driver.c index 6019e44bc8..94aba9d51f 100644 --- a/driver/vidc/src/msm_vidc_driver.c +++ b/driver/vidc/src/msm_vidc_driver.c @@ -1027,6 +1027,34 @@ struct msm_vidc_allocations *msm_vidc_get_allocations( } } +bool res_is_greater_than(u32 width, u32 height, + u32 ref_width, u32 ref_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 || + height > max_side) + return true; + else + return false; +} + +bool res_is_less_than_or_equal_to(u32 width, u32 height, + u32 ref_width, u32 ref_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 && + height <= max_side) + return true; + else + return false; +} + int msm_vidc_change_core_state(struct msm_vidc_core *core, enum msm_vidc_core_state request_state, const char *func) {