Skip to content

Commit 0dda4c0

Browse files
author
Dikshita Agarwal
committed
FROMLIST: media: iris: Allocate and queue internal buffers for encoder video device
Add support for allocating and queuing internal buffers required by the encoder. The sizes of these buffers are derived from hardware specifications and are essential to meet the encoder's functional and performance requirements. These buffers are not exposed to userspace; they are allocated and managed internally to ensure correct and efficient hardware operation. Link: https://lore.kernel.org/linux-media/[email protected]/ Signed-off-by: Dikshita Agarwal <[email protected]>
1 parent e32b86b commit 0dda4c0

14 files changed

+1071
-57
lines changed

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

Lines changed: 83 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -294,16 +294,30 @@ void iris_get_internal_buffers(struct iris_inst *inst, u32 plane)
294294
const u32 *internal_buf_type;
295295
u32 internal_buffer_count, i;
296296

297-
if (V4L2_TYPE_IS_OUTPUT(plane)) {
298-
internal_buf_type = platform_data->dec_ip_int_buf_tbl;
299-
internal_buffer_count = platform_data->dec_ip_int_buf_tbl_size;
300-
for (i = 0; i < internal_buffer_count; i++)
301-
iris_fill_internal_buf_info(inst, internal_buf_type[i]);
297+
if (inst->domain == DECODER) {
298+
if (V4L2_TYPE_IS_OUTPUT(plane)) {
299+
internal_buf_type = platform_data->dec_ip_int_buf_tbl;
300+
internal_buffer_count = platform_data->dec_ip_int_buf_tbl_size;
301+
for (i = 0; i < internal_buffer_count; i++)
302+
iris_fill_internal_buf_info(inst, internal_buf_type[i]);
303+
} else {
304+
internal_buf_type = platform_data->dec_op_int_buf_tbl;
305+
internal_buffer_count = platform_data->dec_op_int_buf_tbl_size;
306+
for (i = 0; i < internal_buffer_count; i++)
307+
iris_fill_internal_buf_info(inst, internal_buf_type[i]);
308+
}
302309
} else {
303-
internal_buf_type = platform_data->dec_op_int_buf_tbl;
304-
internal_buffer_count = platform_data->dec_op_int_buf_tbl_size;
305-
for (i = 0; i < internal_buffer_count; i++)
306-
iris_fill_internal_buf_info(inst, internal_buf_type[i]);
310+
if (V4L2_TYPE_IS_OUTPUT(plane)) {
311+
internal_buf_type = platform_data->enc_ip_int_buf_tbl;
312+
internal_buffer_count = platform_data->enc_ip_int_buf_tbl_size;
313+
for (i = 0; i < internal_buffer_count; i++)
314+
iris_fill_internal_buf_info(inst, internal_buf_type[i]);
315+
} else {
316+
internal_buf_type = platform_data->enc_op_int_buf_tbl;
317+
internal_buffer_count = platform_data->enc_op_int_buf_tbl_size;
318+
for (i = 0; i < internal_buffer_count; i++)
319+
iris_fill_internal_buf_info(inst, internal_buf_type[i]);
320+
}
307321
}
308322
}
309323

@@ -344,12 +358,22 @@ int iris_create_internal_buffers(struct iris_inst *inst, u32 plane)
344358
const u32 *internal_buf_type;
345359
int ret;
346360

347-
if (V4L2_TYPE_IS_OUTPUT(plane)) {
348-
internal_buf_type = platform_data->dec_ip_int_buf_tbl;
349-
internal_buffer_count = platform_data->dec_ip_int_buf_tbl_size;
361+
if (inst->domain == DECODER) {
362+
if (V4L2_TYPE_IS_OUTPUT(plane)) {
363+
internal_buf_type = platform_data->dec_ip_int_buf_tbl;
364+
internal_buffer_count = platform_data->dec_ip_int_buf_tbl_size;
365+
} else {
366+
internal_buf_type = platform_data->dec_op_int_buf_tbl;
367+
internal_buffer_count = platform_data->dec_op_int_buf_tbl_size;
368+
}
350369
} else {
351-
internal_buf_type = platform_data->dec_op_int_buf_tbl;
352-
internal_buffer_count = platform_data->dec_op_int_buf_tbl_size;
370+
if (V4L2_TYPE_IS_OUTPUT(plane)) {
371+
internal_buf_type = platform_data->enc_ip_int_buf_tbl;
372+
internal_buffer_count = platform_data->enc_ip_int_buf_tbl_size;
373+
} else {
374+
internal_buf_type = platform_data->enc_op_int_buf_tbl;
375+
internal_buffer_count = platform_data->enc_op_int_buf_tbl_size;
376+
}
353377
}
354378

355379
for (i = 0; i < internal_buffer_count; i++) {
@@ -411,12 +435,22 @@ int iris_queue_internal_buffers(struct iris_inst *inst, u32 plane)
411435
u32 internal_buffer_count, i;
412436
int ret;
413437

414-
if (V4L2_TYPE_IS_OUTPUT(plane)) {
415-
internal_buf_type = platform_data->dec_ip_int_buf_tbl;
416-
internal_buffer_count = platform_data->dec_ip_int_buf_tbl_size;
438+
if (inst->domain == DECODER) {
439+
if (V4L2_TYPE_IS_OUTPUT(plane)) {
440+
internal_buf_type = platform_data->dec_ip_int_buf_tbl;
441+
internal_buffer_count = platform_data->dec_ip_int_buf_tbl_size;
442+
} else {
443+
internal_buf_type = platform_data->dec_op_int_buf_tbl;
444+
internal_buffer_count = platform_data->dec_op_int_buf_tbl_size;
445+
}
417446
} else {
418-
internal_buf_type = platform_data->dec_op_int_buf_tbl;
419-
internal_buffer_count = platform_data->dec_op_int_buf_tbl_size;
447+
if (V4L2_TYPE_IS_OUTPUT(plane)) {
448+
internal_buf_type = platform_data->enc_ip_int_buf_tbl;
449+
internal_buffer_count = platform_data->enc_ip_int_buf_tbl_size;
450+
} else {
451+
internal_buf_type = platform_data->enc_op_int_buf_tbl;
452+
internal_buffer_count = platform_data->enc_op_int_buf_tbl_size;
453+
}
420454
}
421455

422456
for (i = 0; i < internal_buffer_count; i++) {
@@ -460,12 +494,22 @@ static int iris_destroy_internal_buffers(struct iris_inst *inst, u32 plane, bool
460494
u32 i, len;
461495
int ret;
462496

463-
if (V4L2_TYPE_IS_OUTPUT(plane)) {
464-
internal_buf_type = platform_data->dec_ip_int_buf_tbl;
465-
len = platform_data->dec_ip_int_buf_tbl_size;
497+
if (inst->domain == DECODER) {
498+
if (V4L2_TYPE_IS_OUTPUT(plane)) {
499+
internal_buf_type = platform_data->dec_ip_int_buf_tbl;
500+
len = platform_data->dec_ip_int_buf_tbl_size;
501+
} else {
502+
internal_buf_type = platform_data->dec_op_int_buf_tbl;
503+
len = platform_data->dec_op_int_buf_tbl_size;
504+
}
466505
} else {
467-
internal_buf_type = platform_data->dec_op_int_buf_tbl;
468-
len = platform_data->dec_op_int_buf_tbl_size;
506+
if (V4L2_TYPE_IS_OUTPUT(plane)) {
507+
internal_buf_type = platform_data->enc_ip_int_buf_tbl;
508+
len = platform_data->enc_ip_int_buf_tbl_size;
509+
} else {
510+
internal_buf_type = platform_data->enc_op_int_buf_tbl;
511+
len = platform_data->enc_op_int_buf_tbl_size;
512+
}
469513
}
470514

471515
for (i = 0; i < len; i++) {
@@ -486,7 +530,10 @@ static int iris_destroy_internal_buffers(struct iris_inst *inst, u32 plane, bool
486530
}
487531

488532
if (force) {
489-
buffers = &inst->buffers[BUF_PERSIST];
533+
if (inst->domain == DECODER)
534+
buffers = &inst->buffers[BUF_PERSIST];
535+
else
536+
buffers = &inst->buffers[BUF_ARP];
490537

491538
list_for_each_entry_safe(buf, next, &buffers->list, list) {
492539
ret = iris_destroy_internal_buffer(inst, buf);
@@ -537,8 +584,13 @@ static int iris_release_input_internal_buffers(struct iris_inst *inst)
537584
u32 internal_buffer_count, i;
538585
int ret;
539586

540-
internal_buf_type = platform_data->dec_ip_int_buf_tbl;
541-
internal_buffer_count = platform_data->dec_ip_int_buf_tbl_size;
587+
if (inst->domain == DECODER) {
588+
internal_buf_type = platform_data->dec_ip_int_buf_tbl;
589+
internal_buffer_count = platform_data->dec_ip_int_buf_tbl_size;
590+
} else {
591+
internal_buf_type = platform_data->enc_ip_int_buf_tbl;
592+
internal_buffer_count = platform_data->enc_ip_int_buf_tbl_size;
593+
}
542594

543595
for (i = 0; i < internal_buffer_count; i++) {
544596
ret = iris_release_internal_buffers(inst, internal_buf_type[i]);
@@ -549,20 +601,20 @@ static int iris_release_input_internal_buffers(struct iris_inst *inst)
549601
return 0;
550602
}
551603

552-
int iris_alloc_and_queue_persist_bufs(struct iris_inst *inst)
604+
int iris_alloc_and_queue_persist_bufs(struct iris_inst *inst, enum iris_buffer_type buffer_type)
553605
{
554-
struct iris_buffers *buffers = &inst->buffers[BUF_PERSIST];
606+
struct iris_buffers *buffers = &inst->buffers[buffer_type];
555607
struct iris_buffer *buffer, *next;
556608
int ret;
557609
u32 i;
558610

559611
if (!list_empty(&buffers->list))
560612
return 0;
561613

562-
iris_fill_internal_buf_info(inst, BUF_PERSIST);
614+
iris_fill_internal_buf_info(inst, buffer_type);
563615

564616
for (i = 0; i < buffers->min_count; i++) {
565-
ret = iris_create_internal_buffer(inst, BUF_PERSIST, i);
617+
ret = iris_create_internal_buffer(inst, buffer_type, i);
566618
if (ret)
567619
return ret;
568620
}

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

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,8 @@ enum iris_buffer_type {
3838
BUF_DPB,
3939
BUF_PERSIST,
4040
BUF_SCRATCH_1,
41+
BUF_SCRATCH_2,
42+
BUF_VPSS,
4143
BUF_TYPE_MAX,
4244
};
4345

@@ -109,7 +111,7 @@ int iris_queue_internal_deferred_buffers(struct iris_inst *inst, enum iris_buffe
109111
int iris_destroy_internal_buffer(struct iris_inst *inst, struct iris_buffer *buffer);
110112
int iris_destroy_all_internal_buffers(struct iris_inst *inst, u32 plane);
111113
int iris_destroy_dequeued_internal_buffers(struct iris_inst *inst, u32 plane);
112-
int iris_alloc_and_queue_persist_bufs(struct iris_inst *inst);
114+
int iris_alloc_and_queue_persist_bufs(struct iris_inst *inst, enum iris_buffer_type buf_type);
113115
int iris_alloc_and_queue_input_int_bufs(struct iris_inst *inst);
114116
int iris_queue_buffer(struct iris_inst *inst, struct iris_buffer *buf);
115117
int iris_queue_deferred_buffers(struct iris_inst *inst, enum iris_buffer_type buf_type);

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

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,10 @@ static u32 iris_hfi_gen1_buf_type_from_driver(enum iris_buffer_type buffer_type)
2121
return HFI_BUFFER_INTERNAL_SCRATCH;
2222
case BUF_SCRATCH_1:
2323
return HFI_BUFFER_INTERNAL_SCRATCH_1;
24+
case BUF_SCRATCH_2:
25+
return HFI_BUFFER_INTERNAL_SCRATCH_2;
26+
case BUF_ARP:
27+
return HFI_BUFFER_INTERNAL_PERSIST;
2428
default:
2529
return -EINVAL;
2630
}
@@ -363,6 +367,8 @@ static int iris_hfi_gen1_session_queue_buffer(struct iris_inst *inst, struct iri
363367
case BUF_PERSIST:
364368
case BUF_BIN:
365369
case BUF_SCRATCH_1:
370+
case BUF_SCRATCH_2:
371+
case BUF_ARP:
366372
return iris_hfi_gen1_queue_internal_buffer(inst, buf);
367373
default:
368374
return -EINVAL;

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

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -74,9 +74,11 @@
7474
#define HFI_BUFFER_INPUT 0x1
7575
#define HFI_BUFFER_OUTPUT 0x2
7676
#define HFI_BUFFER_OUTPUT2 0x3
77+
#define HFI_BUFFER_INTERNAL_PERSIST 0x4
7778
#define HFI_BUFFER_INTERNAL_PERSIST_1 0x5
7879
#define HFI_BUFFER_INTERNAL_SCRATCH 0x6
7980
#define HFI_BUFFER_INTERNAL_SCRATCH_1 0x7
81+
#define HFI_BUFFER_INTERNAL_SCRATCH_2 0x8
8082

8183
#define HFI_PROPERTY_SYS_CODEC_POWER_PLANE_CTRL 0x5
8284
#define HFI_PROPERTY_SYS_IMAGE_VERSION 0x6

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

Lines changed: 40 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -111,21 +111,40 @@ static u32 iris_hfi_gen2_get_port(struct iris_inst *inst, u32 plane)
111111
}
112112
}
113113

114-
static u32 iris_hfi_gen2_get_port_from_buf_type(enum iris_buffer_type buffer_type)
114+
static u32 iris_hfi_gen2_get_port_from_buf_type(struct iris_inst *inst,
115+
enum iris_buffer_type buffer_type)
115116
{
116-
switch (buffer_type) {
117-
case BUF_INPUT:
118-
case BUF_BIN:
119-
case BUF_COMV:
120-
case BUF_NON_COMV:
121-
case BUF_LINE:
122-
return HFI_PORT_BITSTREAM;
123-
case BUF_OUTPUT:
124-
case BUF_DPB:
125-
return HFI_PORT_RAW;
126-
case BUF_PERSIST:
127-
default:
128-
return HFI_PORT_NONE;
117+
if (inst->domain == DECODER) {
118+
switch (buffer_type) {
119+
case BUF_INPUT:
120+
case BUF_BIN:
121+
case BUF_COMV:
122+
case BUF_NON_COMV:
123+
case BUF_LINE:
124+
return HFI_PORT_BITSTREAM;
125+
case BUF_OUTPUT:
126+
case BUF_DPB:
127+
return HFI_PORT_RAW;
128+
case BUF_PERSIST:
129+
default:
130+
return HFI_PORT_NONE;
131+
}
132+
} else {
133+
switch (buffer_type) {
134+
case BUF_INPUT:
135+
case BUF_VPSS:
136+
return HFI_PORT_RAW;
137+
case BUF_OUTPUT:
138+
case BUF_BIN:
139+
case BUF_COMV:
140+
case BUF_NON_COMV:
141+
case BUF_LINE:
142+
case BUF_SCRATCH_2:
143+
return HFI_PORT_BITSTREAM;
144+
case BUF_ARP:
145+
default:
146+
return HFI_PORT_NONE;
147+
}
129148
}
130149
}
131150

@@ -1040,9 +1059,14 @@ static u32 iris_hfi_gen2_buf_type_from_driver(enum iris_buffer_type buffer_type)
10401059
case BUF_LINE:
10411060
return HFI_BUFFER_LINE;
10421061
case BUF_DPB:
1062+
case BUF_SCRATCH_2:
10431063
return HFI_BUFFER_DPB;
10441064
case BUF_PERSIST:
10451065
return HFI_BUFFER_PERSIST;
1066+
case BUF_ARP:
1067+
return HFI_BUFFER_ARP;
1068+
case BUF_VPSS:
1069+
return HFI_BUFFER_VPSS;
10461070
default:
10471071
return 0;
10481072
}
@@ -1098,7 +1122,7 @@ static int iris_hfi_gen2_session_queue_buffer(struct iris_inst *inst, struct iri
10981122
return ret;
10991123
}
11001124

1101-
port = iris_hfi_gen2_get_port_from_buf_type(buffer->type);
1125+
port = iris_hfi_gen2_get_port_from_buf_type(inst, buffer->type);
11021126
iris_hfi_gen2_packet_session_command(inst,
11031127
HFI_CMD_BUFFER,
11041128
HFI_HOST_FLAGS_INTR_REQUIRED,
@@ -1120,7 +1144,7 @@ static int iris_hfi_gen2_session_release_buffer(struct iris_inst *inst, struct i
11201144

11211145
iris_hfi_gen2_get_buffer(buffer, &hfi_buffer);
11221146
hfi_buffer.flags |= HFI_BUF_HOST_FLAG_RELEASE;
1123-
port = iris_hfi_gen2_get_port_from_buf_type(buffer->type);
1147+
port = iris_hfi_gen2_get_port_from_buf_type(inst, buffer->type);
11241148

11251149
iris_hfi_gen2_packet_session_command(inst,
11261150
HFI_CMD_BUFFER,

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

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,8 @@ struct iris_hfi_gen2_packet_handle {
2929
int (*handle)(struct iris_inst *inst, struct iris_hfi_packet *pkt);
3030
};
3131

32-
static u32 iris_hfi_gen2_buf_type_to_driver(enum hfi_buffer_type buf_type)
32+
static u32 iris_hfi_gen2_buf_type_to_driver(struct iris_inst *inst,
33+
enum hfi_buffer_type buf_type)
3334
{
3435
switch (buf_type) {
3536
case HFI_BUFFER_BITSTREAM:
@@ -47,7 +48,10 @@ static u32 iris_hfi_gen2_buf_type_to_driver(enum hfi_buffer_type buf_type)
4748
case HFI_BUFFER_LINE:
4849
return BUF_LINE;
4950
case HFI_BUFFER_DPB:
50-
return BUF_DPB;
51+
if (inst->domain == DECODER)
52+
return BUF_DPB;
53+
else
54+
return BUF_SCRATCH_2;
5155
case HFI_BUFFER_PERSIST:
5256
return BUF_PERSIST;
5357
default:
@@ -421,7 +425,7 @@ static void iris_hfi_gen2_handle_dequeue_buffers(struct iris_inst *inst)
421425
static int iris_hfi_gen2_handle_release_internal_buffer(struct iris_inst *inst,
422426
struct iris_hfi_buffer *buffer)
423427
{
424-
u32 buf_type = iris_hfi_gen2_buf_type_to_driver(buffer->type);
428+
u32 buf_type = iris_hfi_gen2_buf_type_to_driver(inst, buffer->type);
425429
struct iris_buffers *buffers = &inst->buffers[buf_type];
426430
struct iris_buffer *buf, *iter;
427431
bool found = false;

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

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -246,6 +246,10 @@ struct iris_platform_data {
246246
unsigned int dec_ip_int_buf_tbl_size;
247247
const u32 *dec_op_int_buf_tbl;
248248
unsigned int dec_op_int_buf_tbl_size;
249+
const u32 *enc_ip_int_buf_tbl;
250+
unsigned int enc_ip_int_buf_tbl_size;
251+
const u32 *enc_op_int_buf_tbl;
252+
unsigned int enc_op_int_buf_tbl_size;
249253
};
250254

251255
#endif

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

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -706,6 +706,14 @@ static const u32 sm8550_dec_op_int_buf_tbl[] = {
706706
BUF_DPB,
707707
};
708708

709+
static const u32 sm8550_enc_op_int_buf_tbl[] = {
710+
BUF_BIN,
711+
BUF_COMV,
712+
BUF_NON_COMV,
713+
BUF_LINE,
714+
BUF_SCRATCH_2,
715+
};
716+
709717
struct iris_platform_data sm8550_data = {
710718
.get_instance = iris_hfi_gen2_get_instance,
711719
.init_hfi_command_ops = iris_hfi_gen2_command_ops_init,
@@ -783,6 +791,9 @@ struct iris_platform_data sm8550_data = {
783791
.dec_ip_int_buf_tbl_size = ARRAY_SIZE(sm8550_dec_ip_int_buf_tbl),
784792
.dec_op_int_buf_tbl = sm8550_dec_op_int_buf_tbl,
785793
.dec_op_int_buf_tbl_size = ARRAY_SIZE(sm8550_dec_op_int_buf_tbl),
794+
795+
.enc_op_int_buf_tbl = sm8550_enc_op_int_buf_tbl,
796+
.enc_op_int_buf_tbl_size = ARRAY_SIZE(sm8550_enc_op_int_buf_tbl),
786797
};
787798

788799
/*
@@ -871,6 +882,9 @@ struct iris_platform_data sm8650_data = {
871882
.dec_ip_int_buf_tbl_size = ARRAY_SIZE(sm8550_dec_ip_int_buf_tbl),
872883
.dec_op_int_buf_tbl = sm8550_dec_op_int_buf_tbl,
873884
.dec_op_int_buf_tbl_size = ARRAY_SIZE(sm8550_dec_op_int_buf_tbl),
885+
886+
.enc_op_int_buf_tbl = sm8550_enc_op_int_buf_tbl,
887+
.enc_op_int_buf_tbl_size = ARRAY_SIZE(sm8550_enc_op_int_buf_tbl),
874888
};
875889

876890
/*
@@ -955,4 +969,7 @@ struct iris_platform_data qcs8300_data = {
955969
.dec_ip_int_buf_tbl_size = ARRAY_SIZE(sm8550_dec_ip_int_buf_tbl),
956970
.dec_op_int_buf_tbl = sm8550_dec_op_int_buf_tbl,
957971
.dec_op_int_buf_tbl_size = ARRAY_SIZE(sm8550_dec_op_int_buf_tbl),
972+
973+
.enc_op_int_buf_tbl = sm8550_enc_op_int_buf_tbl,
974+
.enc_op_int_buf_tbl_size = ARRAY_SIZE(sm8550_enc_op_int_buf_tbl),
958975
};

0 commit comments

Comments
 (0)