Merge "video: driver: Add support to enable output tx sw fence by default"

Bu işleme şunda yer alıyor:
qctecmdr
2023-06-16 10:01:20 -07:00
işlemeyi yapan: Gerrit - the friendly Code Review server
işleme 7c215be486
12 değiştirilmiş dosya ile 235 ekleme ve 99 silme

Dosyayı Görüntüle

@@ -336,7 +336,6 @@ int msm_vidc_adjust_dec_lowlatency_mode(void *instance, struct v4l2_ctrl *ctrl);
int msm_vidc_adjust_session_priority(void *instance, struct v4l2_ctrl *ctrl);
int msm_vidc_adjust_roi_info(void *instance, struct v4l2_ctrl *ctrl);
int msm_vidc_adjust_all_intra(void *instance, struct v4l2_ctrl *ctrl);
int msm_vidc_adjust_dec_outbuf_fence(void *instance, struct v4l2_ctrl *ctrl);
int msm_vidc_adjust_dec_outbuf_fence_type(void *instance, struct v4l2_ctrl *ctrl);
int msm_vidc_adjust_dec_outbuf_fence_direction(void *instance,
struct v4l2_ctrl *ctrl);

Dosyayı Görüntüle

@@ -247,6 +247,12 @@ enum v4l2_mpeg_vidc_av1_tier {
#define V4L2_CID_MPEG_VIDC_GRID_WIDTH \
(V4L2_CID_MPEG_VIDC_BASE + 0x49)
#define V4L2_CID_MPEG_VIDC_MAX_NUM_REORDER_FRAMES \
(V4L2_CID_MPEG_VIDC_BASE + 0x4A)
#define V4L2_CID_MPEG_VIDC_INTERLACE \
(V4L2_CID_MPEG_VIDC_BASE + 0x4B)
int msm_vidc_adjust_ir_period(void *instance, struct v4l2_ctrl *ctrl);
int msm_vidc_adjust_dec_frame_rate(void *instance, struct v4l2_ctrl *ctrl);
int msm_vidc_adjust_dec_operating_rate(void *instance, struct v4l2_ctrl *ctrl);

Dosyayı Görüntüle

@@ -2234,30 +2234,6 @@ int msm_vidc_adjust_roi_info(void *instance, struct v4l2_ctrl *ctrl)
return 0;
}
int msm_vidc_adjust_dec_outbuf_fence(void *instance, struct v4l2_ctrl *ctrl)
{
struct msm_vidc_inst *inst = (struct msm_vidc_inst *) instance;
u32 adjusted_value = 0;
s32 picture_order = -1;
adjusted_value = ctrl ? ctrl->val : inst->capabilities[META_OUTBUF_FENCE].value;
if (msm_vidc_get_parent_value(inst, META_OUTBUF_FENCE, OUTPUT_ORDER,
&picture_order, __func__))
return -EINVAL;
if (picture_order == 0) {
/* disable outbuf fence */
adjusted_value = MSM_VIDC_META_DISABLE |
MSM_VIDC_META_RX_INPUT;
}
msm_vidc_update_cap_value(inst, META_OUTBUF_FENCE,
adjusted_value, __func__);
return 0;
}
int msm_vidc_adjust_dec_outbuf_fence_type(void *instance, struct v4l2_ctrl *ctrl)
{
struct msm_vidc_inst_cap *capability;

Dosyayı Görüntüle

@@ -546,7 +546,7 @@ static struct msm_platform_inst_capability instance_cap_data_kalama[] = {
0, MSM_VIDC_META_DISABLE,
V4L2_CID_MPEG_VIDC_METADATA_OUTBUF_FENCE,
HFI_PROP_FENCE,
CAP_FLAG_BITMASK | CAP_FLAG_META},
CAP_FLAG_BITMASK | CAP_FLAG_META | CAP_FLAG_DYNAMIC_ALLOWED},
/*
* Client to do set_ctrl with FENCE_ID to set fence_id
@@ -565,6 +565,40 @@ static struct msm_platform_inst_capability instance_cap_data_kalama[] = {
0,
CAP_FLAG_VOLATILE},
/* Fence type for input buffer. Currently unused */
{INBUF_FENCE_TYPE, DEC, H264|HEVC|VP9|AV1,
MSM_VIDC_FENCE_NONE, MSM_VIDC_FENCE_NONE,
BIT(MSM_VIDC_FENCE_NONE),
MSM_VIDC_FENCE_NONE,
0,
HFI_PROP_FENCE_TYPE,
CAP_FLAG_MENU | CAP_FLAG_INPUT_PORT},
{OUTBUF_FENCE_TYPE, DEC, H264|HEVC|VP9|AV1,
MSM_VIDC_FENCE_NONE, MSM_VIDC_SYNX_V2_FENCE,
BIT(MSM_VIDC_FENCE_NONE) | BIT(MSM_VIDC_SW_FENCE),
MSM_VIDC_FENCE_NONE,
0,
HFI_PROP_FENCE_TYPE,
CAP_FLAG_MENU | CAP_FLAG_OUTPUT_PORT},
/* Fence direction for input buffer. Currently unused */
{INBUF_FENCE_DIRECTION, DEC, H264|HEVC|VP9|AV1,
MSM_VIDC_FENCE_DIR_NONE, MSM_VIDC_FENCE_DIR_NONE,
BIT(MSM_VIDC_FENCE_DIR_NONE),
MSM_VIDC_FENCE_DIR_NONE,
0,
HFI_PROP_FENCE_DIRECTION,
CAP_FLAG_MENU | CAP_FLAG_INPUT_PORT},
{OUTBUF_FENCE_DIRECTION, DEC, H264|HEVC|VP9|AV1,
MSM_VIDC_FENCE_DIR_NONE, MSM_VIDC_FENCE_DIR_RX,
BIT(MSM_VIDC_FENCE_DIR_NONE) | BIT(MSM_VIDC_FENCE_DIR_TX),
MSM_VIDC_FENCE_DIR_NONE,
0,
HFI_PROP_FENCE_DIRECTION,
CAP_FLAG_MENU | CAP_FLAG_OUTPUT_PORT},
{TS_REORDER, DEC, H264|HEVC,
0, 1, 1, 0,
V4L2_CID_MPEG_VIDC_TS_REORDER},
@@ -1539,9 +1573,17 @@ static struct msm_platform_inst_capability instance_cap_data_kalama[] = {
0,
HFI_PROP_PIPE},
{POC, DEC, H264, 0, 2, 1, 1,
{POC, DEC, H264,
0, 2, 1, 1,
0,
HFI_PROP_PIC_ORDER_CNT_TYPE},
HFI_PROP_PIC_ORDER_CNT_TYPE,
CAP_FLAG_VOLATILE},
{MAX_NUM_REORDER_FRAMES, DEC, H264 | HEVC,
0, 16, 1, 0,
V4L2_CID_MPEG_VIDC_MAX_NUM_REORDER_FRAMES,
HFI_PROP_MAX_NUM_REORDER_FRAMES,
CAP_FLAG_VOLATILE},
{QUALITY_MODE, ENC, CODECS_ALL,
MSM_VIDC_MAX_QUALITY_MODE,
@@ -1551,8 +1593,9 @@ static struct msm_platform_inst_capability instance_cap_data_kalama[] = {
{CODED_FRAMES, DEC, H264|HEVC|HEIC,
CODED_FRAMES_PROGRESSIVE, CODED_FRAMES_INTERLACE,
1, CODED_FRAMES_PROGRESSIVE,
0,
HFI_PROP_CODED_FRAMES},
V4L2_CID_MPEG_VIDC_INTERLACE,
HFI_PROP_CODED_FRAMES,
CAP_FLAG_VOLATILE},
{BIT_DEPTH, DEC, CODECS_ALL, BIT_DEPTH_8, BIT_DEPTH_10, 1, BIT_DEPTH_8,
0,
@@ -1982,10 +2025,30 @@ static struct msm_platform_inst_cap_dependency instance_cap_dependency_data_kala
msm_vidc_set_u32},
{META_OUTBUF_FENCE, DEC, H264|HEVC|VP9|AV1,
{LOWLATENCY_MODE},
msm_vidc_adjust_dec_outbuf_fence,
{LOWLATENCY_MODE, OUTBUF_FENCE_TYPE, OUTBUF_FENCE_DIRECTION},
NULL,
NULL},
{INBUF_FENCE_TYPE, DEC, H264|HEVC|VP9|AV1,
{0},
NULL,
NULL},
{OUTBUF_FENCE_TYPE, DEC, H264|HEVC|VP9|AV1,
{0},
msm_vidc_adjust_dec_outbuf_fence_type,
msm_vidc_set_outbuf_fence_type},
{INBUF_FENCE_DIRECTION, DEC, H264|HEVC|VP9|AV1,
{0},
NULL,
NULL},
{OUTBUF_FENCE_DIRECTION, DEC, H264|HEVC|VP9|AV1,
{0},
msm_vidc_adjust_dec_outbuf_fence_direction,
msm_vidc_set_outbuf_fence_direction},
{HFLIP, ENC, CODECS_ALL,
{0},
NULL,
@@ -2352,7 +2415,7 @@ static struct msm_platform_inst_cap_dependency instance_cap_dependency_data_kala
NULL},
{OUTPUT_ORDER, DEC, H264|HEVC|VP9|AV1,
{META_OUTBUF_FENCE},
{0},
msm_vidc_adjust_output_order,
msm_vidc_set_u32},

Dosyayı Görüntüle

@@ -607,7 +607,7 @@ static struct msm_platform_inst_capability instance_cap_data_pineapple[] = {
0, MSM_VIDC_META_DISABLE,
V4L2_CID_MPEG_VIDC_METADATA_OUTBUF_FENCE,
HFI_PROP_FENCE,
CAP_FLAG_BITMASK | CAP_FLAG_META},
CAP_FLAG_BITMASK | CAP_FLAG_META | CAP_FLAG_DYNAMIC_ALLOWED},
/*
* Client to do set_ctrl with FENCE_ID to set fence_id
@@ -626,7 +626,7 @@ static struct msm_platform_inst_capability instance_cap_data_pineapple[] = {
0,
CAP_FLAG_VOLATILE},
/* Fence type for input buffer. Currently unsed */
/* Fence type for input buffer. Currently unused */
{INBUF_FENCE_TYPE, DEC, H264|HEVC|VP9|AV1,
MSM_VIDC_FENCE_NONE, MSM_VIDC_FENCE_NONE,
BIT(MSM_VIDC_FENCE_NONE),
@@ -644,7 +644,7 @@ static struct msm_platform_inst_capability instance_cap_data_pineapple[] = {
HFI_PROP_FENCE_TYPE,
CAP_FLAG_MENU | CAP_FLAG_OUTPUT_PORT},
/* Fence direction for input buffer. Currently unsed */
/* Fence direction for input buffer. Currently unused */
{INBUF_FENCE_DIRECTION, DEC, H264|HEVC|VP9|AV1,
MSM_VIDC_FENCE_DIR_NONE, MSM_VIDC_FENCE_DIR_NONE,
BIT(MSM_VIDC_FENCE_DIR_NONE),
@@ -1649,9 +1649,17 @@ static struct msm_platform_inst_capability instance_cap_data_pineapple[] = {
0,
HFI_PROP_PIPE},
{POC, DEC, H264, 0, 2, 1, 1,
{POC, DEC, H264,
0, 2, 1, 1,
0,
HFI_PROP_PIC_ORDER_CNT_TYPE},
HFI_PROP_PIC_ORDER_CNT_TYPE,
CAP_FLAG_VOLATILE},
{MAX_NUM_REORDER_FRAMES, DEC, H264 | HEVC,
0, 16, 1, 0,
V4L2_CID_MPEG_VIDC_MAX_NUM_REORDER_FRAMES,
HFI_PROP_MAX_NUM_REORDER_FRAMES,
CAP_FLAG_VOLATILE},
{QUALITY_MODE, ENC, CODECS_ALL,
MSM_VIDC_MAX_QUALITY_MODE,
@@ -1661,8 +1669,9 @@ static struct msm_platform_inst_capability instance_cap_data_pineapple[] = {
{CODED_FRAMES, DEC, H264|HEVC|HEIC,
CODED_FRAMES_PROGRESSIVE, CODED_FRAMES_INTERLACE,
1, CODED_FRAMES_PROGRESSIVE,
0,
HFI_PROP_CODED_FRAMES},
V4L2_CID_MPEG_VIDC_INTERLACE,
HFI_PROP_CODED_FRAMES,
CAP_FLAG_VOLATILE},
{BIT_DEPTH, DEC, CODECS_ALL, BIT_DEPTH_8, BIT_DEPTH_10, 1, BIT_DEPTH_8,
0,
@@ -1853,7 +1862,7 @@ static struct msm_platform_inst_capability instance_cap_data_pineapple[] = {
0, MSM_VIDC_META_DISABLE,
V4L2_CID_MPEG_VIDC_METADATA_PICTURE_TYPE,
HFI_PROP_PICTURE_TYPE,
CAP_FLAG_BITMASK | CAP_FLAG_META},
CAP_FLAG_BITMASK | CAP_FLAG_META | CAP_FLAG_DYNAMIC_ALLOWED},
{META_SEI_MASTERING_DISP, ENC, HEVC|HEIC,
MSM_VIDC_META_DISABLE,
@@ -1955,7 +1964,7 @@ static struct msm_platform_inst_capability instance_cap_data_pineapple[] = {
0, MSM_VIDC_META_DISABLE,
V4L2_CID_MPEG_VIDC_METADATA_BUFFER_TAG,
HFI_PROP_BUFFER_TAG,
CAP_FLAG_BITMASK | CAP_FLAG_META},
CAP_FLAG_BITMASK | CAP_FLAG_META | CAP_FLAG_DYNAMIC_ALLOWED},
{META_DPB_TAG_LIST, DEC, CODECS_ALL,
MSM_VIDC_META_DISABLE,
@@ -2092,15 +2101,9 @@ static struct msm_platform_inst_cap_dependency instance_cap_dependency_data_pine
NULL,
msm_vidc_set_u32},
{META_OUTBUF_FENCE, DEC, H264|HEVC|AV1,
{LOWLATENCY_MODE, SLICE_DECODE,
OUTBUF_FENCE_TYPE, OUTBUF_FENCE_DIRECTION},
msm_vidc_adjust_dec_outbuf_fence,
NULL},
{META_OUTBUF_FENCE, DEC, VP9,
{META_OUTBUF_FENCE, DEC, H264|HEVC|AV1|VP9,
{LOWLATENCY_MODE, OUTBUF_FENCE_TYPE, OUTBUF_FENCE_DIRECTION},
msm_vidc_adjust_dec_outbuf_fence,
NULL,
NULL},
{INBUF_FENCE_TYPE, DEC, H264|HEVC|VP9|AV1,
@@ -2257,7 +2260,7 @@ static struct msm_platform_inst_cap_dependency instance_cap_dependency_data_pine
NULL},
{LOWLATENCY_MODE, DEC, H264|HEVC|AV1,
{STAGE, SLICE_DECODE},
{STAGE},
msm_vidc_adjust_dec_lowlatency_mode,
NULL},
@@ -2512,13 +2515,8 @@ static struct msm_platform_inst_cap_dependency instance_cap_dependency_data_pine
NULL,
NULL},
{OUTPUT_ORDER, DEC, H264|HEVC|AV1,
{META_OUTBUF_FENCE, SLICE_DECODE},
msm_vidc_adjust_output_order,
msm_vidc_set_u32},
{OUTPUT_ORDER, DEC, VP9,
{META_OUTBUF_FENCE},
{OUTPUT_ORDER, DEC, H264|HEVC|AV1|VP9,
{0},
msm_vidc_adjust_output_order,
msm_vidc_set_u32},
@@ -2794,6 +2792,7 @@ static const u32 pineapple_vdec_psc_hevc[] = {
HFI_PROP_LEVEL,
HFI_PROP_TIER,
HFI_PROP_SIGNAL_COLOR_INFO,
HFI_PROP_MAX_NUM_REORDER_FRAMES,
};
static const u32 pineapple_vdec_psc_vp9[] = {

Dosyayı Görüntüle

@@ -33,6 +33,8 @@ int msm_vdec_start_cmd(struct msm_vidc_inst *inst);
int msm_vdec_handle_release_buffer(struct msm_vidc_inst *inst,
struct msm_vidc_buffer *buf);
int msm_vdec_set_num_comv(struct msm_vidc_inst *inst);
int msm_vdec_subscribe_metadata(struct msm_vidc_inst *inst,
enum msm_vidc_port_type port);
int msm_vdec_get_input_internal_buffers(struct msm_vidc_inst *inst);
int msm_vdec_create_input_internal_buffers(struct msm_vidc_inst *inst);
int msm_vdec_queue_input_internal_buffers(struct msm_vidc_inst *inst);

Dosyayı Görüntüle

@@ -390,6 +390,7 @@ enum msm_vidc_metadata_bits {
CAP(CHROMA_QP_INDEX_OFFSET) \
CAP(PIPE) \
CAP(POC) \
CAP(MAX_NUM_REORDER_FRAMES) \
CAP(CODED_FRAMES) \
CAP(BIT_DEPTH) \
CAP(CODEC_CONFIG) \
@@ -822,6 +823,7 @@ struct msm_vidc_subscription_params {
u32 tier;
u32 av1_film_grain_present;
u32 av1_super_block_enabled;
u32 max_num_reorder_frames;
};
struct msm_vidc_hfi_frame_info {

Dosyayı Görüntüle

@@ -399,6 +399,34 @@ static int msm_vdec_set_picture_order_count(struct msm_vidc_inst *inst,
return rc;
}
static int msm_vdec_set_max_num_reorder_frames(struct msm_vidc_inst *inst,
enum msm_vidc_port_type port)
{
int rc = 0;
u32 reorder_frames = 0;
if (port != INPUT_PORT && port != OUTPUT_PORT) {
i_vpr_e(inst, "%s: invalid port %d\n", __func__, port);
return -EINVAL;
}
reorder_frames = inst->subcr_params[port].max_num_reorder_frames;
i_vpr_h(inst, "%s: max reorder frames count: %d", __func__, reorder_frames);
rc = venus_hfi_session_property(inst,
HFI_PROP_MAX_NUM_REORDER_FRAMES,
HFI_HOST_FLAGS_NONE,
get_hfi_port(inst, port),
HFI_PAYLOAD_U32,
&reorder_frames,
sizeof(u32));
if (rc) {
i_vpr_e(inst, "%s: set property failed\n", __func__);
return rc;
}
return rc;
}
static int msm_vdec_set_colorspace(struct msm_vidc_inst *inst,
enum msm_vidc_port_type port)
{
@@ -693,6 +721,26 @@ static int msm_vdec_set_output_properties(struct msm_vidc_inst *inst)
return rc;
}
static bool msm_vdec_check_outbuf_fence_allowed(struct msm_vidc_inst *inst)
{
/* no need of checking for reordering/interlace for vp9/av1 */
if (inst->codec == MSM_VIDC_VP9 || inst->codec == MSM_VIDC_AV1)
return true;
if (inst->capabilities[CODED_FRAMES].value == CODED_FRAMES_INTERLACE ||
(!inst->capabilities[OUTPUT_ORDER].value &&
inst->capabilities[MAX_NUM_REORDER_FRAMES].value)) {
i_vpr_e(inst,
"%s: outbuf tx fence is unsupported for coded frames %d or output order %d and max num reorder frames %d\n",
__func__, inst->capabilities[CODED_FRAMES].value,
inst->capabilities[OUTPUT_ORDER].value,
inst->capabilities[MAX_NUM_REORDER_FRAMES].value);
return false;
}
return true;
}
int msm_vdec_get_input_internal_buffers(struct msm_vidc_inst *inst)
{
int rc = 0;
@@ -843,6 +891,7 @@ static int msm_vdec_subscribe_input_port_settings_change(struct msm_vidc_inst *i
{HFI_PROP_CODED_FRAMES, msm_vdec_set_coded_frames },
{HFI_PROP_BUFFER_FW_MIN_OUTPUT_COUNT, msm_vdec_set_min_output_count },
{HFI_PROP_PIC_ORDER_CNT_TYPE, msm_vdec_set_picture_order_count },
{HFI_PROP_MAX_NUM_REORDER_FRAMES, msm_vdec_set_max_num_reorder_frames },
{HFI_PROP_SIGNAL_COLOR_INFO, msm_vdec_set_colorspace },
{HFI_PROP_PROFILE, msm_vdec_set_profile },
{HFI_PROP_LEVEL, msm_vdec_set_level },
@@ -1015,14 +1064,14 @@ static int msm_vdec_subscribe_property(struct msm_vidc_inst *inst,
return rc;
}
static int msm_vdec_subscribe_metadata(struct msm_vidc_inst *inst,
int msm_vdec_subscribe_metadata(struct msm_vidc_inst *inst,
enum msm_vidc_port_type port)
{
int rc = 0;
u32 payload[32] = {0};
u32 i, count = 0;
i_vpr_h(inst, "%s()\n", __func__);
i_vpr_h(inst, "%s() port %d\n", __func__, port);
payload[0] = HFI_MODE_METADATA;
if (port == INPUT_PORT) {
@@ -1139,7 +1188,7 @@ static int msm_vdec_set_delivery_mode_property(struct msm_vidc_inst *inst,
};
static const u32 property_input_list[] = {};
i_vpr_h(inst, "%s()\n", __func__);
i_vpr_h(inst, "%s() port %d\n", __func__, port);
payload[0] = HFI_MODE_PROPERTY;
@@ -1153,18 +1202,19 @@ static int msm_vdec_set_delivery_mode_property(struct msm_vidc_inst *inst,
}
} else if (port == OUTPUT_PORT) {
for (i = 0; i < ARRAY_SIZE(property_output_list); i++) {
if (property_output_list[i] == META_OUTBUF_FENCE &&
is_meta_rx_inp_enabled(inst, META_OUTBUF_FENCE)) {
/*
* if output buffer fence enabled via
* META_OUTBUF_FENCE, then driver will send
* fence id via HFI_PROP_FENCE to firmware.
* So enable HFI_PROP_FENCE property as
* delivery mode property.
*/
payload[count + 1] =
inst->capabilities[property_output_list[i]].hfi_id;
count++;
if (property_output_list[i] == META_OUTBUF_FENCE) {
if (is_meta_rx_inp_enabled(inst,
META_OUTBUF_FENCE)) {
/*
* if output buffer fence enabled via
* META_OUTBUF_FENCE, then driver will send
* fence id via HFI_PROP_FENCE to firmware.
* So enable HFI_PROP_FENCE property as
* delivery mode property.
*/
payload[++count] =
inst->capabilities[property_output_list[i]].hfi_id;
}
continue;
}
if (inst->capabilities[property_output_list[i]].value) {
@@ -1239,6 +1289,7 @@ int msm_vdec_init_input_subcr_params(struct msm_vidc_inst *inst)
subsc_params->level = inst->capabilities[LEVEL].value;
subsc_params->tier = inst->capabilities[HEVC_TIER].value;
subsc_params->pic_order_cnt = inst->capabilities[POC].value;
subsc_params->max_num_reorder_frames = inst->capabilities[MAX_NUM_REORDER_FRAMES].value;
subsc_params->bit_depth = inst->capabilities[BIT_DEPTH].value;
if (inst->capabilities[CODED_FRAMES].value ==
CODED_FRAMES_PROGRESSIVE)
@@ -1363,6 +1414,8 @@ static int msm_vdec_read_input_subcr_params(struct msm_vidc_inst *inst)
msm_vidc_update_cap_value(inst, LEVEL, subsc_params.level, __func__);
msm_vidc_update_cap_value(inst, HEVC_TIER, subsc_params.tier, __func__);
msm_vidc_update_cap_value(inst, POC, subsc_params.pic_order_cnt, __func__);
msm_vidc_update_cap_value(inst, MAX_NUM_REORDER_FRAMES,
subsc_params.max_num_reorder_frames, __func__);
if (subsc_params.bit_depth == BIT_DEPTH_8)
msm_vidc_update_cap_value(inst, BIT_DEPTH, BIT_DEPTH_8, __func__);
else
@@ -1378,14 +1431,6 @@ static int msm_vdec_read_input_subcr_params(struct msm_vidc_inst *inst)
subsc_params.av1_super_block_enabled, __func__);
}
/* disable META_OUTBUF_FENCE if session is Interlace type */
if (inst->capabilities[CODED_FRAMES].value ==
CODED_FRAMES_INTERLACE) {
msm_vidc_update_cap_value(inst, META_OUTBUF_FENCE,
MSM_VIDC_META_RX_INPUT |
MSM_VIDC_META_DISABLE, __func__);
}
inst->fw_min_count = subsc_params.fw_min_count;
inst->buffers.output.min_count = call_session_op(core,
min_count, inst, MSM_VIDC_BUF_OUTPUT);
@@ -1700,6 +1745,11 @@ static int msm_vdec_subscribe_output_port_settings_change(struct msm_vidc_inst *
payload_size = sizeof(u32);
payload_type = HFI_PAYLOAD_U32;
break;
case HFI_PROP_MAX_NUM_REORDER_FRAMES:
payload[0] = subsc_params.max_num_reorder_frames;
payload_size = sizeof(u32);
payload_type = HFI_PAYLOAD_U32;
break;
default:
i_vpr_e(inst, "%s: unknown property %#x\n", __func__,
prop_type);
@@ -1788,6 +1838,13 @@ int msm_vdec_streamon_output(struct msm_vidc_inst *inst)
if (rc)
goto error;
if (is_meta_rx_inp_enabled(inst, META_OUTBUF_FENCE)) {
if (!msm_vdec_check_outbuf_fence_allowed(inst)) {
rc = -EINVAL;
goto error;
}
}
if (!inst->opsc_properties_set) {
memcpy(&inst->subcr_params[OUTPUT_PORT],
&inst->subcr_params[INPUT_PORT],
@@ -2130,6 +2187,8 @@ int msm_vdec_start_cmd(struct msm_vidc_inst *inst)
if (is_sub_state(inst, MSM_VIDC_DRC) &&
is_sub_state(inst, MSM_VIDC_DRC_LAST_BUFFER) &&
is_sub_state(inst, MSM_VIDC_INPUT_PAUSE)) {
i_vpr_h(inst, "%s: alloc and queue input internal buffers\n",
__func__);
rc = msm_vidc_alloc_and_queue_input_internal_buffers(inst);
if (rc)
return rc;

Dosyayı Görüntüle

@@ -1225,6 +1225,19 @@ int msm_vidc_process_streamon_output(struct msm_vidc_inst *inst)
rc = msm_vidc_set_pipe(inst, PIPE);
if (rc)
return rc;
/*
* Input port subscription for metadata may be changed.
* For eg: due to IPSC, driver may have disabled tx
* type output fence, hence fence related metadatas
* to recieve on input port will be disabled by HAL.
* Hence, update metadata subscription properties
* on INPUT port before sending RESUME command to FW.
*/
i_vpr_l(inst, "%s: reset input port subscribe metadata\n",
__func__);
rc = msm_vdec_subscribe_metadata(inst, INPUT_PORT);
if (rc)
return rc;
}
/*
@@ -1236,6 +1249,7 @@ int msm_vidc_process_streamon_output(struct msm_vidc_inst *inst)
is_sub_state(inst, MSM_VIDC_DRAIN_LAST_BUFFER);
if (!drain_pending && is_state(inst, MSM_VIDC_INPUT_STREAMING)) {
if (is_sub_state(inst, MSM_VIDC_INPUT_PAUSE)) {
i_vpr_h(inst, "%s: resume input port\n", __func__);
rc = venus_hfi_session_resume(inst, INPUT_PORT,
HFI_CMD_SETTINGS_CHANGE);
if (rc)
@@ -1480,6 +1494,15 @@ int msm_vidc_get_control(struct msm_vidc_inst *inst, struct v4l2_ctrl *ctrl)
i_vpr_l(inst, "%s: fence fd: %d\n",
__func__, ctrl->val);
break;
case MAX_NUM_REORDER_FRAMES:
ctrl->val = inst->capabilities[MAX_NUM_REORDER_FRAMES].value;
i_vpr_h(inst, "%s: max num reorder frames: %d\n",
__func__, ctrl->val);
break;
case CODED_FRAMES:
ctrl->val = inst->capabilities[CODED_FRAMES].value;
i_vpr_h(inst, "%s: coded frames: %d\n", __func__, ctrl->val);
break;
default:
i_vpr_e(inst, "invalid ctrl %s id %d\n",
ctrl->name, ctrl->id);

Dosyayı Görüntüle

@@ -164,7 +164,7 @@ static void msm_vidc_fence_destroy(struct msm_vidc_inst *inst, u64 fence_id)
return;
}
i_vpr_e(inst, "%s: fence %s\n", __func__, fence->name);
i_vpr_l(inst, "%s: fence %s\n", __func__, fence->name);
list_del_init(&fence->list);
dma_fence_set_error(&fence->dma_fence, -EINVAL);
dma_fence_signal(&fence->dma_fence);

Dosyayı Görüntüle

@@ -845,8 +845,8 @@ static int msm_vidc_input_streaming_state(struct msm_vidc_inst *inst,
if (is_decode_session(inst)) {
/* check dynamic allowed if master port is streaming */
if (!(inst->capabilities[cap_id].flags & CAP_FLAG_DYNAMIC_ALLOWED)) {
i_vpr_e(inst, "%s: cap_id %#x not allowed in state %s\n",
__func__, cap_id, state_name(inst->state));
i_vpr_e(inst, "%s: cap_id %#x (%s) not allowed in state %s\n",
__func__, cap_id, cap_name(cap_id), state_name(inst->state));
return -EINVAL;
}
}

Dosyayı Görüntüle

@@ -47,7 +47,7 @@ void print_psc_properties(const char *str, struct msm_vidc_inst *inst,
{
i_vpr_h(inst,
"%s: width %d, height %d, crop offsets[0] %#x, crop offsets[1] %#x, bit depth %#x, coded frames %d "
"fw min count %d, poc %d, color info %d, profile %d, level %d, tier %d, fg present %d, sb enabled %d\n",
"fw min count %d, poc %d, color info %d, profile %d, level %d, tier %d, fg present %d, sb enabled %d max_num_reorder_frames %d\n",
str, (subsc_params.bitstream_resolution & HFI_BITMASK_BITSTREAM_WIDTH) >> 16,
(subsc_params.bitstream_resolution & HFI_BITMASK_BITSTREAM_HEIGHT),
subsc_params.crop_offsets[0], subsc_params.crop_offsets[1],
@@ -55,7 +55,7 @@ void print_psc_properties(const char *str, struct msm_vidc_inst *inst,
subsc_params.fw_min_count, subsc_params.pic_order_cnt,
subsc_params.color_info, subsc_params.profile, subsc_params.level,
subsc_params.tier, subsc_params.av1_film_grain_present,
subsc_params.av1_super_block_enabled);
subsc_params.av1_super_block_enabled, subsc_params.max_num_reorder_frames);
}
static void print_sfr_message(struct msm_vidc_core *core)
@@ -849,11 +849,15 @@ static int msm_vidc_handle_fence_signal(struct msm_vidc_inst *inst,
return -EINVAL;
}
} else {
if (inst->hfi_frame_info.fence_id)
if (!inst->hfi_frame_info.fence_id) {
return 0;
} else {
i_vpr_e(inst,
"%s: fence id is received although fencing is not enabled\n",
__func__);
return 0;
"%s: fence id: %d is received although fencing is not enabled\n",
__func__, inst->hfi_frame_info.fence_id);
signal_error = true;
goto signal;
}
}
if (inst->capabilities[OUTBUF_FENCE_TYPE].value ==
@@ -874,6 +878,7 @@ static int msm_vidc_handle_fence_signal(struct msm_vidc_inst *inst,
return -EINVAL;
}
signal:
/* fence signalling */
if (signal_error) {
/* signal fence error */
@@ -1196,7 +1201,14 @@ static bool is_metabuffer_dequeued(struct msm_vidc_inst *inst,
list_for_each_entry(buffer, &buffers->list, list) {
if (buffer->index == buf->index &&
buffer->attr & MSM_VIDC_ATTR_DEQUEUED) {
(buffer->attr & MSM_VIDC_ATTR_DEQUEUED ||
buffer->attr & MSM_VIDC_ATTR_BUFFER_DONE)) {
/*
* For META_OUTBUF_FENCE case, meta buffers are
* dequeued ahead in time and completed vb2 done
* as well. Hence, check for vb2 buffer done flag since
* dequeued flag is already cleared for such buffers
*/
found = true;
break;
}
@@ -1216,14 +1228,6 @@ static int msm_vidc_check_meta_buffers(struct msm_vidc_inst *inst)
};
for (i = 0; i < ARRAY_SIZE(buffer_type); i++) {
/*
* skip input meta buffers check as meta buffers were
* already delivered if output fence enabled.
*/
if (is_meta_rx_inp_enabled(inst, META_OUTBUF_FENCE)) {
if (buffer_type[i] == MSM_VIDC_BUF_INPUT)
continue;
}
buffers = msm_vidc_get_buffers(inst, buffer_type[i], __func__);
if (!buffers)
return -EINVAL;
@@ -1732,6 +1736,9 @@ static int handle_property_with_payload(struct msm_vidc_inst *inst,
case HFI_PROP_AV1_SUPER_BLOCK_ENABLED:
inst->subcr_params[port].av1_super_block_enabled = payload_ptr[0];
break;
case HFI_PROP_MAX_NUM_REORDER_FRAMES:
inst->subcr_params[port].max_num_reorder_frames = payload_ptr[0];
break;
case HFI_PROP_PICTURE_TYPE:
inst->hfi_frame_info.picture_type = payload_ptr[0];
if (inst->hfi_frame_info.picture_type & HFI_PICTURE_B)