Skip to content

Commit 6a01dda

Browse files
committed
Merge remote-tracking branch tech/mm/video into qcom-next
2 parents eb7f767 + eb43f6a commit 6a01dda

25 files changed

+1193
-235
lines changed

drivers/media/platform/qcom/iris/iris_buffer.c

Lines changed: 31 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -205,6 +205,9 @@ static u32 iris_bitstream_buffer_size(struct iris_inst *inst)
205205
if (num_mbs > NUM_MBS_4K) {
206206
div_factor = 4;
207207
base_res_mbs = caps->max_mbpf;
208+
} else {
209+
if (inst->codec == V4L2_PIX_FMT_VP9)
210+
div_factor = 1;
208211
}
209212

210213
/*
@@ -376,7 +379,7 @@ int iris_destroy_internal_buffer(struct iris_inst *inst, struct iris_buffer *buf
376379
return 0;
377380
}
378381

379-
int iris_destroy_internal_buffers(struct iris_inst *inst, u32 plane)
382+
static int iris_destroy_internal_buffers(struct iris_inst *inst, u32 plane, bool force)
380383
{
381384
const struct iris_platform_data *platform_data = inst->core->iris_platform_data;
382385
struct iris_buffer *buf, *next;
@@ -396,6 +399,14 @@ int iris_destroy_internal_buffers(struct iris_inst *inst, u32 plane)
396399
for (i = 0; i < len; i++) {
397400
buffers = &inst->buffers[internal_buf_type[i]];
398401
list_for_each_entry_safe(buf, next, &buffers->list, list) {
402+
/*
403+
* during stream on, skip destroying internal(DPB) buffer
404+
* if firmware did not return it.
405+
* during close, destroy all buffers irrespectively.
406+
*/
407+
if (!force && buf->attr & BUF_ATTR_QUEUED)
408+
continue;
409+
399410
ret = iris_destroy_internal_buffer(inst, buf);
400411
if (ret)
401412
return ret;
@@ -405,6 +416,16 @@ int iris_destroy_internal_buffers(struct iris_inst *inst, u32 plane)
405416
return 0;
406417
}
407418

419+
int iris_destroy_all_internal_buffers(struct iris_inst *inst, u32 plane)
420+
{
421+
return iris_destroy_internal_buffers(inst, plane, true);
422+
}
423+
424+
int iris_destroy_dequeued_internal_buffers(struct iris_inst *inst, u32 plane)
425+
{
426+
return iris_destroy_internal_buffers(inst, plane, false);
427+
}
428+
408429
static int iris_release_internal_buffers(struct iris_inst *inst,
409430
enum iris_buffer_type buffer_type)
410431
{
@@ -593,10 +614,13 @@ int iris_vb2_buffer_done(struct iris_inst *inst, struct iris_buffer *buf)
593614

594615
vb2 = &vbuf->vb2_buf;
595616

596-
if (buf->flags & V4L2_BUF_FLAG_ERROR)
617+
if (buf->flags & V4L2_BUF_FLAG_ERROR) {
597618
state = VB2_BUF_STATE_ERROR;
598-
else
599-
state = VB2_BUF_STATE_DONE;
619+
vb2_set_plane_payload(vb2, 0, 0);
620+
vb2->timestamp = 0;
621+
v4l2_m2m_buf_done(vbuf, state);
622+
return 0;
623+
}
600624

601625
vbuf->flags |= buf->flags;
602626

@@ -615,7 +639,10 @@ int iris_vb2_buffer_done(struct iris_inst *inst, struct iris_buffer *buf)
615639
v4l2_event_queue_fh(&inst->fh, &ev);
616640
v4l2_m2m_mark_stopped(m2m_ctx);
617641
}
642+
inst->last_buffer_dequeued = true;
618643
}
644+
645+
state = VB2_BUF_STATE_DONE;
619646
vb2->timestamp = buf->timestamp;
620647
v4l2_m2m_buf_done(vbuf, state);
621648

drivers/media/platform/qcom/iris/iris_buffer.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -106,7 +106,8 @@ void iris_get_internal_buffers(struct iris_inst *inst, u32 plane);
106106
int iris_create_internal_buffers(struct iris_inst *inst, u32 plane);
107107
int iris_queue_internal_buffers(struct iris_inst *inst, u32 plane);
108108
int iris_destroy_internal_buffer(struct iris_inst *inst, struct iris_buffer *buffer);
109-
int iris_destroy_internal_buffers(struct iris_inst *inst, u32 plane);
109+
int iris_destroy_all_internal_buffers(struct iris_inst *inst, u32 plane);
110+
int iris_destroy_dequeued_internal_buffers(struct iris_inst *inst, u32 plane);
110111
int iris_alloc_and_queue_persist_bufs(struct iris_inst *inst);
111112
int iris_alloc_and_queue_input_int_bufs(struct iris_inst *inst);
112113
int iris_queue_buffer(struct iris_inst *inst, struct iris_buffer *buf);

drivers/media/platform/qcom/iris/iris_ctrls.c

Lines changed: 25 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -17,12 +17,20 @@ static inline bool iris_valid_cap_id(enum platform_inst_fw_cap_type cap_id)
1717
static enum platform_inst_fw_cap_type iris_get_cap_id(u32 id)
1818
{
1919
switch (id) {
20-
case V4L2_CID_MPEG_VIDEO_DECODER_MPEG4_DEBLOCK_FILTER:
21-
return DEBLOCK;
2220
case V4L2_CID_MPEG_VIDEO_H264_PROFILE:
23-
return PROFILE;
21+
return PROFILE_H264;
22+
case V4L2_CID_MPEG_VIDEO_HEVC_PROFILE:
23+
return PROFILE_HEVC;
24+
case V4L2_CID_MPEG_VIDEO_VP9_PROFILE:
25+
return PROFILE_VP9;
2426
case V4L2_CID_MPEG_VIDEO_H264_LEVEL:
25-
return LEVEL;
27+
return LEVEL_H264;
28+
case V4L2_CID_MPEG_VIDEO_HEVC_LEVEL:
29+
return LEVEL_HEVC;
30+
case V4L2_CID_MPEG_VIDEO_VP9_LEVEL:
31+
return LEVEL_VP9;
32+
case V4L2_CID_MPEG_VIDEO_HEVC_TIER:
33+
return TIER;
2634
default:
2735
return INST_FW_CAP_MAX;
2836
}
@@ -34,12 +42,20 @@ static u32 iris_get_v4l2_id(enum platform_inst_fw_cap_type cap_id)
3442
return 0;
3543

3644
switch (cap_id) {
37-
case DEBLOCK:
38-
return V4L2_CID_MPEG_VIDEO_DECODER_MPEG4_DEBLOCK_FILTER;
39-
case PROFILE:
45+
case PROFILE_H264:
4046
return V4L2_CID_MPEG_VIDEO_H264_PROFILE;
41-
case LEVEL:
47+
case PROFILE_HEVC:
48+
return V4L2_CID_MPEG_VIDEO_HEVC_PROFILE;
49+
case PROFILE_VP9:
50+
return V4L2_CID_MPEG_VIDEO_VP9_PROFILE;
51+
case LEVEL_H264:
4252
return V4L2_CID_MPEG_VIDEO_H264_LEVEL;
53+
case LEVEL_HEVC:
54+
return V4L2_CID_MPEG_VIDEO_HEVC_LEVEL;
55+
case LEVEL_VP9:
56+
return V4L2_CID_MPEG_VIDEO_VP9_LEVEL;
57+
case TIER:
58+
return V4L2_CID_MPEG_VIDEO_HEVC_TIER;
4359
default:
4460
return 0;
4561
}
@@ -84,8 +100,6 @@ int iris_ctrls_init(struct iris_inst *inst)
84100
if (iris_get_v4l2_id(cap[idx].cap_id))
85101
num_ctrls++;
86102
}
87-
if (!num_ctrls)
88-
return -EINVAL;
89103

90104
/* Adding 1 to num_ctrls to include V4L2_CID_MIN_BUFFERS_FOR_CAPTURE */
91105

@@ -163,6 +177,7 @@ void iris_session_init_caps(struct iris_core *core)
163177
core->inst_fw_caps[cap_id].value = caps[i].value;
164178
core->inst_fw_caps[cap_id].flags = caps[i].flags;
165179
core->inst_fw_caps[cap_id].hfi_id = caps[i].hfi_id;
180+
core->inst_fw_caps[cap_id].set = caps[i].set;
166181
}
167182
}
168183

drivers/media/platform/qcom/iris/iris_hfi_common.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -140,6 +140,7 @@ struct hfi_subscription_params {
140140
u32 color_info;
141141
u32 profile;
142142
u32 level;
143+
u32 tier;
143144
};
144145

145146
u32 iris_hfi_get_v4l2_color_primaries(u32 hfi_primaries);

drivers/media/platform/qcom/iris/iris_hfi_gen1_command.c

Lines changed: 29 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -88,16 +88,29 @@ static int iris_hfi_gen1_sys_pc_prep(struct iris_core *core)
8888
static int iris_hfi_gen1_session_open(struct iris_inst *inst)
8989
{
9090
struct hfi_session_open_pkt packet;
91+
u32 codec = 0;
9192
int ret;
9293

9394
if (inst->state != IRIS_INST_DEINIT)
9495
return -EALREADY;
9596

97+
switch (inst->codec) {
98+
case V4L2_PIX_FMT_H264:
99+
codec = HFI_VIDEO_CODEC_H264;
100+
break;
101+
case V4L2_PIX_FMT_HEVC:
102+
codec = HFI_VIDEO_CODEC_HEVC;
103+
break;
104+
case V4L2_PIX_FMT_VP9:
105+
codec = HFI_VIDEO_CODEC_VP9;
106+
break;
107+
}
108+
96109
packet.shdr.hdr.size = sizeof(struct hfi_session_open_pkt);
97110
packet.shdr.hdr.pkt_type = HFI_CMD_SYS_SESSION_INIT;
98111
packet.shdr.session_id = inst->session_id;
99112
packet.session_domain = HFI_SESSION_TYPE_DEC;
100-
packet.session_codec = HFI_VIDEO_CODEC_H264;
113+
packet.session_codec = codec;
101114

102115
reinit_completion(&inst->completion);
103116

@@ -208,8 +221,10 @@ static int iris_hfi_gen1_session_stop(struct iris_inst *inst, u32 plane)
208221
flush_pkt.flush_type = flush_type;
209222

210223
ret = iris_hfi_queue_cmd_write(core, &flush_pkt, flush_pkt.shdr.hdr.size);
211-
if (!ret)
224+
if (!ret) {
225+
inst->flush_responses_pending++;
212226
ret = iris_wait_for_session_response(inst, true);
227+
}
213228
}
214229

215230
return ret;
@@ -386,6 +401,8 @@ static int iris_hfi_gen1_session_drain(struct iris_inst *inst, u32 plane)
386401
ip_pkt.shdr.hdr.pkt_type = HFI_CMD_SESSION_EMPTY_BUFFER;
387402
ip_pkt.shdr.session_id = inst->session_id;
388403
ip_pkt.flags = HFI_BUFFERFLAG_EOS;
404+
if (inst->codec == V4L2_PIX_FMT_VP9)
405+
ip_pkt.packet_buffer = 0xdeadb000;
389406

390407
return iris_hfi_queue_cmd_write(inst->core, &ip_pkt, ip_pkt.shdr.hdr.size);
391408
}
@@ -490,14 +507,6 @@ iris_hfi_gen1_packet_session_set_property(struct hfi_session_set_property_pkt *p
490507
packet->shdr.hdr.size += sizeof(u32) + sizeof(*wm);
491508
break;
492509
}
493-
case HFI_PROPERTY_CONFIG_VDEC_POST_LOOP_DEBLOCKER: {
494-
struct hfi_enable *en = prop_data;
495-
u32 *in = pdata;
496-
497-
en->enable = *in;
498-
packet->shdr.hdr.size += sizeof(u32) + sizeof(*en);
499-
break;
500-
}
501510
default:
502511
return -EINVAL;
503512
}
@@ -546,14 +555,15 @@ static int iris_hfi_gen1_set_resolution(struct iris_inst *inst)
546555
struct hfi_framesize fs;
547556
int ret;
548557

549-
fs.buffer_type = HFI_BUFFER_INPUT;
550-
fs.width = inst->fmt_src->fmt.pix_mp.width;
551-
fs.height = inst->fmt_src->fmt.pix_mp.height;
552-
553-
ret = hfi_gen1_set_property(inst, ptype, &fs, sizeof(fs));
554-
if (ret)
555-
return ret;
558+
if (!iris_drc_pending(inst)) {
559+
fs.buffer_type = HFI_BUFFER_INPUT;
560+
fs.width = inst->fmt_src->fmt.pix_mp.width;
561+
fs.height = inst->fmt_src->fmt.pix_mp.height;
556562

563+
ret = hfi_gen1_set_property(inst, ptype, &fs, sizeof(fs));
564+
if (ret)
565+
return ret;
566+
}
557567
fs.buffer_type = HFI_BUFFER_OUTPUT2;
558568
fs.width = inst->fmt_dst->fmt.pix_mp.width;
559569
fs.height = inst->fmt_dst->fmt.pix_mp.height;
@@ -768,8 +778,8 @@ static int iris_hfi_gen1_session_set_config_params(struct iris_inst *inst, u32 p
768778
iris_hfi_gen1_set_bufsize},
769779
};
770780

771-
config_params = core->iris_platform_data->input_config_params;
772-
config_params_size = core->iris_platform_data->input_config_params_size;
781+
config_params = core->iris_platform_data->input_config_params_default;
782+
config_params_size = core->iris_platform_data->input_config_params_default_size;
773783

774784
if (V4L2_TYPE_IS_OUTPUT(plane)) {
775785
for (i = 0; i < config_params_size; i++) {

drivers/media/platform/qcom/iris/iris_hfi_gen1_defines.h

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,8 @@
1313
#define HFI_SESSION_TYPE_DEC 2
1414

1515
#define HFI_VIDEO_CODEC_H264 0x00000002
16+
#define HFI_VIDEO_CODEC_HEVC 0x00002000
17+
#define HFI_VIDEO_CODEC_VP9 0x00004000
1618

1719
#define HFI_ERR_NONE 0x0
1820

@@ -65,7 +67,6 @@
6567

6668
#define HFI_PROPERTY_CONFIG_BUFFER_REQUIREMENTS 0x202001
6769

68-
#define HFI_PROPERTY_CONFIG_VDEC_POST_LOOP_DEBLOCKER 0x1200001
6970
#define HFI_PROPERTY_PARAM_VDEC_DPB_COUNTS 0x120300e
7071
#define HFI_PROPERTY_CONFIG_VDEC_ENTROPY 0x1204004
7172

@@ -117,6 +118,8 @@
117118
#define HFI_FRAME_NOTCODED 0x7f002000
118119
#define HFI_FRAME_YUV 0x7f004000
119120
#define HFI_UNUSED_PICT 0x10000000
121+
#define HFI_BUFFERFLAG_DATACORRUPT 0x00000008
122+
#define HFI_BUFFERFLAG_DROP_FRAME 0x20000000
120123

121124
struct hfi_pkt_hdr {
122125
u32 size;

drivers/media/platform/qcom/iris/iris_hfi_gen1_response.c

Lines changed: 28 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -200,14 +200,14 @@ static void iris_hfi_gen1_event_seq_changed(struct iris_inst *inst,
200200

201201
iris_hfi_gen1_read_changed_params(inst, pkt);
202202

203-
if (inst->state != IRIS_INST_ERROR) {
204-
reinit_completion(&inst->flush_completion);
203+
if (inst->state != IRIS_INST_ERROR && !(inst->sub_state & IRIS_INST_SUB_FIRST_IPSC)) {
205204

206205
flush_pkt.shdr.hdr.size = sizeof(struct hfi_session_flush_pkt);
207206
flush_pkt.shdr.hdr.pkt_type = HFI_CMD_SESSION_FLUSH;
208207
flush_pkt.shdr.session_id = inst->session_id;
209208
flush_pkt.flush_type = HFI_FLUSH_OUTPUT;
210-
iris_hfi_queue_cmd_write(inst->core, &flush_pkt, flush_pkt.shdr.hdr.size);
209+
if (!iris_hfi_queue_cmd_write(inst->core, &flush_pkt, flush_pkt.shdr.hdr.size))
210+
inst->flush_responses_pending++;
211211
}
212212

213213
iris_vdec_src_change(inst);
@@ -348,6 +348,10 @@ static void iris_hfi_gen1_session_etb_done(struct iris_inst *inst, void *packet)
348348
struct iris_buffer *buf = NULL;
349349
bool found = false;
350350

351+
/* EOS buffer sent via drain won't be in v4l2 buffer list */
352+
if (pkt->packet_buffer == 0xdeadb000)
353+
return;
354+
351355
v4l2_m2m_for_each_src_buf_safe(m2m_ctx, m2m_buffer, n) {
352356
buf = to_iris_buffer(&m2m_buffer->vb);
353357
if (buf->index == pkt->input_tag) {
@@ -408,7 +412,9 @@ static void iris_hfi_gen1_session_ftb_done(struct iris_inst *inst, void *packet)
408412
flush_pkt.shdr.hdr.pkt_type = HFI_CMD_SESSION_FLUSH;
409413
flush_pkt.shdr.session_id = inst->session_id;
410414
flush_pkt.flush_type = HFI_FLUSH_OUTPUT;
411-
iris_hfi_queue_cmd_write(core, &flush_pkt, flush_pkt.shdr.hdr.size);
415+
if (!iris_hfi_queue_cmd_write(core, &flush_pkt, flush_pkt.shdr.hdr.size))
416+
inst->flush_responses_pending++;
417+
412418
iris_inst_sub_state_change_drain_last(inst);
413419

414420
return;
@@ -455,7 +461,12 @@ static void iris_hfi_gen1_session_ftb_done(struct iris_inst *inst, void *packet)
455461
timestamp_us = timestamp_hi;
456462
timestamp_us = (timestamp_us << 32) | timestamp_lo;
457463
} else {
458-
flags |= V4L2_BUF_FLAG_LAST;
464+
if (pkt->stream_id == 1 && !inst->last_buffer_dequeued) {
465+
if (iris_drc_pending(inst)) {
466+
flags |= V4L2_BUF_FLAG_LAST;
467+
inst->last_buffer_dequeued = true;
468+
}
469+
}
459470
}
460471
buf->timestamp = timestamp_us;
461472

@@ -481,6 +492,12 @@ static void iris_hfi_gen1_session_ftb_done(struct iris_inst *inst, void *packet)
481492
buf->attr |= BUF_ATTR_DEQUEUED;
482493
buf->attr |= BUF_ATTR_BUFFER_DONE;
483494

495+
if (hfi_flags & HFI_BUFFERFLAG_DATACORRUPT)
496+
flags |= V4L2_BUF_FLAG_ERROR;
497+
498+
if (hfi_flags & HFI_BUFFERFLAG_DROP_FRAME)
499+
flags |= V4L2_BUF_FLAG_ERROR;
500+
484501
buf->flags |= flags;
485502

486503
iris_vb2_buffer_done(inst, buf);
@@ -558,7 +575,6 @@ static void iris_hfi_gen1_handle_response(struct iris_core *core, void *response
558575
const struct iris_hfi_gen1_response_pkt_info *pkt_info;
559576
struct device *dev = core->dev;
560577
struct hfi_session_pkt *pkt;
561-
struct completion *done;
562578
struct iris_inst *inst;
563579
bool found = false;
564580
u32 i;
@@ -619,9 +635,12 @@ static void iris_hfi_gen1_handle_response(struct iris_core *core, void *response
619635
if (shdr->error_type != HFI_ERR_NONE)
620636
iris_inst_change_state(inst, IRIS_INST_ERROR);
621637

622-
done = pkt_info->pkt == HFI_MSG_SESSION_FLUSH ?
623-
&inst->flush_completion : &inst->completion;
624-
complete(done);
638+
if (pkt_info->pkt == HFI_MSG_SESSION_FLUSH) {
639+
if (!(--inst->flush_responses_pending))
640+
complete(&inst->flush_completion);
641+
} else {
642+
complete(&inst->completion);
643+
}
625644
}
626645
mutex_unlock(&inst->lock);
627646

0 commit comments

Comments
 (0)