video: driver: fix for fence support

- Add METADATA_PICTURE_TYPE support.
- some fixes for fence support.

Change-Id: Icd2285aa9fef57775122e9d2433f1e5d708ccdd3
Signed-off-by: Akshata Sahukar <quic_asahukar@quicinc.com>
Tento commit je obsažen v:
Akshata Sahukar
2022-03-22 18:03:15 -07:00
rodič f1918f5314
revize 0abd877e95
9 změnil soubory, kde provedl 55 přidání a 20 odebrání

Zobrazit soubor

@@ -1752,7 +1752,7 @@ static struct msm_platform_inst_capability instance_data_kalama[] = {
HFI_PROP_CONEALED_MB_COUNT,
CAP_FLAG_BITMASK},
{META_HIST_INFO, DEC, CODECS_ALL,
{META_HIST_INFO, DEC, HEVC|AV1|VP9,
V4L2_MPEG_VIDC_META_DISABLE,
V4L2_MPEG_VIDC_META_ENABLE | V4L2_MPEG_VIDC_META_RX_OUTPUT,
0, V4L2_MPEG_VIDC_META_DISABLE,
@@ -1760,6 +1760,14 @@ static struct msm_platform_inst_capability instance_data_kalama[] = {
HFI_PROP_HISTOGRAM_INFO,
CAP_FLAG_BITMASK},
{META_PICTURE_TYPE, DEC, CODECS_ALL,
V4L2_MPEG_VIDC_META_DISABLE,
V4L2_MPEG_VIDC_META_ENABLE | V4L2_MPEG_VIDC_META_RX_INPUT,
0, V4L2_MPEG_VIDC_META_DISABLE,
V4L2_CID_MPEG_VIDC_METADATA_PICTURE_TYPE,
HFI_PROP_PICTURE_TYPE,
CAP_FLAG_BITMASK},
{META_SEI_MASTERING_DISP, ENC, HEVC|HEIC,
V4L2_MPEG_VIDC_META_DISABLE,
V4L2_MPEG_VIDC_META_ENABLE | V4L2_MPEG_VIDC_META_TX_INPUT,
@@ -1868,17 +1876,6 @@ static struct msm_platform_inst_capability instance_data_kalama[] = {
HFI_PROP_ENC_QP_METADATA,
CAP_FLAG_BITMASK},
{META_ROI_INFO, ENC, CODECS_ALL,
V4L2_MPEG_VIDC_META_DISABLE,
V4L2_MPEG_VIDC_META_ENABLE | V4L2_MPEG_VIDC_META_TX_INPUT,
0, V4L2_MPEG_VIDC_META_DISABLE,
V4L2_CID_MPEG_VIDC_METADATA_ROI_INFO,
HFI_PROP_ROI_INFO,
CAP_FLAG_INPUT_PORT | CAP_FLAG_BITMASK,
{BITRATE_MODE, PIX_FMTS},
{0},
msm_vidc_adjust_roi_info, NULL},
{META_ROI_INFO, ENC, H264|HEVC,
V4L2_MPEG_VIDC_META_DISABLE,
V4L2_MPEG_VIDC_META_ENABLE | V4L2_MPEG_VIDC_META_TX_INPUT,

Zobrazit soubor

@@ -368,6 +368,7 @@ enum msm_vidc_inst_capability_type {
META_TIMESTAMP,
META_CONCEALED_MB_CNT,
META_HIST_INFO,
META_PICTURE_TYPE,
META_SEI_MASTERING_DISP,
META_SEI_CLL,
META_HDR10PLUS,

Zobrazit soubor

@@ -1435,6 +1435,10 @@ int msm_vdec_streamon_input(struct msm_vidc_inst *inst)
if (rc)
return rc;
rc = msm_vdec_subscribe_metadata(inst, INPUT_PORT);
if (rc)
return rc;
rc = msm_vdec_set_delivery_mode_metadata(inst, INPUT_PORT);
if (rc)
return rc;

Zobrazit soubor

@@ -707,7 +707,8 @@ void msm_vidc_add_volatile_flag(struct v4l2_ctrl *ctrl)
{
if (ctrl->id == V4L2_CID_MIN_BUFFERS_FOR_OUTPUT ||
ctrl->id == V4L2_CID_MIN_BUFFERS_FOR_CAPTURE ||
ctrl->id == V4L2_CID_MPEG_VIDC_AV1D_FILM_GRAIN_PRESENT)
ctrl->id == V4L2_CID_MPEG_VIDC_AV1D_FILM_GRAIN_PRESENT ||
ctrl->id == V4L2_CID_MPEG_VIDC_SW_FENCE_FD)
ctrl->flags |= V4L2_CTRL_FLAG_VOLATILE;
}

Zobrazit soubor

@@ -68,6 +68,7 @@ static const struct msm_vidc_cap_name cap_name_arr[] = {
{META_TIMESTAMP, "META_TIMESTAMP" },
{META_CONCEALED_MB_CNT, "META_CONCEALED_MB_CNT" },
{META_HIST_INFO, "META_HIST_INFO" },
{META_PICTURE_TYPE, "META_PICTURE_TYPE" },
{META_SEI_MASTERING_DISP, "META_SEI_MASTERING_DISP" },
{META_SEI_CLL, "META_SEI_CLL" },
{META_HDR10PLUS, "META_HDR10PLUS" },
@@ -1320,6 +1321,7 @@ bool msm_vidc_allow_s_ctrl(struct msm_vidc_inst *inst, u32 id)
case V4L2_CID_MPEG_VIDC_INPUT_METADATA_FD:
case V4L2_CID_MPEG_VIDC_FRAME_RATE:
case V4L2_CID_MPEG_VIDC_OPERATING_RATE:
case V4L2_CID_MPEG_VIDC_SW_FENCE_ID:
allow = true;
break;
default:
@@ -1408,6 +1410,7 @@ bool msm_vidc_allow_metadata_subscription(struct msm_vidc_inst *inst, u32 cap_id
case META_SEI_MASTERING_DISP:
case META_SEI_CLL:
case META_HDR10PLUS:
case META_PICTURE_TYPE:
if (!is_meta_rx_inp_enabled(inst, META_OUTBUF_FENCE)) {
i_vpr_h(inst,
"%s: cap: %24s not allowed as output buffer fence is disabled\n",
@@ -2098,9 +2101,8 @@ int msm_vidc_get_fence_fd(struct msm_vidc_inst *inst, int *fence_fd)
}
if (!found) {
i_vpr_e(inst, "%s: could not find matching fence for fence id: %d\n",
i_vpr_h(inst, "%s: could not find matching fence for fence id: %d\n",
__func__, inst->capabilities->cap[FENCE_ID].value);
rc = -EINVAL;
goto exit;
}
@@ -3893,6 +3895,9 @@ static int msm_vidc_v4l2_buffer_event(struct msm_vidc_inst *inst,
event_data = (struct v4l2_event_vidc_metadata *)event.u.data;
event_data->type = INPUT_META_PLANE;
event_data->fd = buf->fd;
event_data->index = buf->index;
event_data->bytesused = buf->data_size;
event_data->offset = buf->data_offset;
v4l2_event_queue_fh(&inst->event_handler, &event);

Zobrazit soubor

@@ -106,8 +106,10 @@ int msm_vidc_create_fence_fd(struct msm_vidc_inst *inst,
goto err_sync_file;
}
fd_install(fence->fd, fence->sync_file->file);
i_vpr_l(inst, "%s: created fd %d for fence %s id: %llu\n", __func__,
fence->fd, fence->name, fence->dma_fence.seqno);
i_vpr_l(inst, "%s: created fd %d for fence %s\n", __func__,
fence->fd, fence->name);
return rc;
err_sync_file:
put_unused_fd(fence->fd);

Zobrazit soubor

@@ -3525,6 +3525,11 @@ int venus_hfi_queue_buffer(struct msm_vidc_inst *inst,
if (is_meta_rx_inp_enabled(inst, META_OUTBUF_FENCE) &&
is_output_buffer(buffer->type)) {
if (!buffer->fence_id) {
i_vpr_e(inst, "%s: fence id cannot be 0\n", __func__);
rc = -EINVAL;
goto unlock;
}
rc = hfi_create_packet(inst->packet,
inst->packet_size,
HFI_PROP_FENCE,

Zobrazit soubor

@@ -1063,6 +1063,14 @@ 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;
@@ -1116,7 +1124,13 @@ static int handle_dequeue_buffers(struct msm_vidc_inst *inst)
"vb2 done already", inst, buf);
} else {
buf->attr |= MSM_VIDC_ATTR_BUFFER_DONE;
msm_vidc_buffer_done(inst, buf);
rc = msm_vidc_buffer_done(inst, buf);
if (rc) {
print_vidc_buffer(VIDC_HIGH, "err ",
"vb2 done failed", inst, buf);
/* ignore the error */
rc = 0;
}
}
msm_vidc_put_driver_buf(inst, buf);
}
@@ -1734,12 +1748,12 @@ static int __handle_session_response(struct msm_vidc_inst *inst,
}
}
memset(&inst->hfi_frame_info, 0, sizeof(struct msm_vidc_hfi_frame_info));
if (dequeue) {
rc = handle_dequeue_buffers(inst);
if (rc)
return rc;
}
memset(&inst->hfi_frame_info, 0, sizeof(struct msm_vidc_hfi_frame_info));
return rc;
}

Zobrazit soubor

@@ -227,6 +227,8 @@ enum v4l2_mpeg_video_av1_tier {
*/
#define V4L2_CID_MPEG_VIDC_SW_FENCE_FD \
(V4L2_CID_MPEG_VIDC_BASE + 0x3A)
#define V4L2_CID_MPEG_VIDC_METADATA_PICTURE_TYPE \
(V4L2_CID_MPEG_VIDC_BASE + 0x3B)
/* add new controls above this line */
/* Deprecate below controls once availble in gki and gsi bionic header */
@@ -355,6 +357,7 @@ enum v4l2_mpeg_vidc_metadata {
METADATA_TIMESTAMP = 0x0300015c,
METADATA_CONCEALED_MB_COUNT = 0x0300015f,
METADATA_HISTOGRAM_INFO = 0x03000161,
METADATA_PICTURE_TYPE = 0x03000162,
METADATA_SEI_MASTERING_DISPLAY_COLOUR = 0x03000163,
METADATA_SEI_CONTENT_LIGHT_LEVEL = 0x03000164,
METADATA_HDR10PLUS = 0x03000165,
@@ -403,7 +406,10 @@ enum meta_interlace_info {
struct v4l2_event_vidc_metadata {
__u32 type;
__s32 fd;
__u8 reserved[56];
__u32 index;
__u32 bytesused;
__u32 offset;
__u8 reserved[44];
};
/* vendor events end */