1010
1111#define UNSPECIFIED_COLOR_FORMAT 5
1212#define NUM_SYS_INIT_PACKETS 8
13+ #define NUM_COMV_AV1 18
1314
1415#define SYS_INIT_PKT_SIZE (sizeof(struct iris_hfi_header) + \
1516 NUM_SYS_INIT_PACKETS * (sizeof(struct iris_hfi_packet) + sizeof(u32)))
@@ -121,6 +122,7 @@ static u32 iris_hfi_gen2_get_port_from_buf_type(struct iris_inst *inst,
121122 case BUF_COMV :
122123 case BUF_NON_COMV :
123124 case BUF_LINE :
125+ case BUF_PARTIAL :
124126 return HFI_PORT_BITSTREAM ;
125127 case BUF_OUTPUT :
126128 case BUF_DPB :
@@ -380,6 +382,9 @@ static int iris_hfi_gen2_set_profile(struct iris_inst *inst, u32 plane)
380382 case V4L2_PIX_FMT_H264 :
381383 profile = inst -> fw_caps [PROFILE_H264 ].value ;
382384 break ;
385+ case V4L2_PIX_FMT_AV1 :
386+ profile = inst -> fw_caps [PROFILE_AV1 ].value ;
387+ break ;
383388 }
384389
385390 inst_hfi_gen2 -> src_subcr_params .profile = profile ;
@@ -409,6 +414,9 @@ static int iris_hfi_gen2_set_level(struct iris_inst *inst, u32 plane)
409414 case V4L2_PIX_FMT_H264 :
410415 level = inst -> fw_caps [LEVEL_H264 ].value ;
411416 break ;
417+ case V4L2_PIX_FMT_AV1 :
418+ level = inst -> fw_caps [LEVEL_AV1 ].value ;
419+ break ;
412420 }
413421
414422 inst_hfi_gen2 -> src_subcr_params .level = level ;
@@ -496,10 +504,12 @@ static int iris_hfi_gen2_set_linear_stride_scanline(struct iris_inst *inst, u32
496504
497505static int iris_hfi_gen2_set_tier (struct iris_inst * inst , u32 plane )
498506{
499- struct iris_inst_hfi_gen2 * inst_hfi_gen2 = to_iris_inst_hfi_gen2 (inst );
500507 u32 port = iris_hfi_gen2_get_port (inst , V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE );
508+ struct iris_inst_hfi_gen2 * inst_hfi_gen2 = to_iris_inst_hfi_gen2 (inst );
501509 u32 tier = inst -> fw_caps [TIER ].value ;
502510
511+ tier = (inst -> codec == V4L2_PIX_FMT_AV1 ) ? inst -> fw_caps [TIER_AV1 ].value :
512+ inst -> fw_caps [TIER ].value ;
503513 inst_hfi_gen2 -> src_subcr_params .tier = tier ;
504514
505515 return iris_hfi_gen2_session_set_property (inst ,
@@ -525,6 +535,40 @@ static int iris_hfi_gen2_set_frame_rate(struct iris_inst *inst, u32 plane)
525535 sizeof (u32 ));
526536}
527537
538+ static int iris_hfi_gen2_set_film_grain (struct iris_inst * inst , u32 plane )
539+ {
540+ u32 port = iris_hfi_gen2_get_port (inst , V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE );
541+ struct iris_inst_hfi_gen2 * inst_hfi_gen2 = to_iris_inst_hfi_gen2 (inst );
542+ u32 film_grain = inst -> fw_caps [FILM_GRAIN ].value ;
543+
544+ inst_hfi_gen2 -> src_subcr_params .film_grain = film_grain ;
545+
546+ return iris_hfi_gen2_session_set_property (inst ,
547+ HFI_PROP_AV1_FILM_GRAIN_PRESENT ,
548+ HFI_HOST_FLAGS_NONE ,
549+ port ,
550+ HFI_PAYLOAD_U32_ENUM ,
551+ & film_grain ,
552+ sizeof (u32 ));
553+ }
554+
555+ static int iris_hfi_gen2_set_super_block (struct iris_inst * inst , u32 plane )
556+ {
557+ u32 port = iris_hfi_gen2_get_port (inst , V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE );
558+ struct iris_inst_hfi_gen2 * inst_hfi_gen2 = to_iris_inst_hfi_gen2 (inst );
559+ u32 super_block = inst -> fw_caps [SUPER_BLOCK ].value ;
560+
561+ inst_hfi_gen2 -> src_subcr_params .super_block = super_block ;
562+
563+ return iris_hfi_gen2_session_set_property (inst ,
564+ HFI_PROP_AV1_SUPER_BLOCK_ENABLED ,
565+ HFI_HOST_FLAGS_NONE ,
566+ port ,
567+ HFI_PAYLOAD_U32_ENUM ,
568+ & super_block ,
569+ sizeof (u32 ));
570+ }
571+
528572static int iris_hfi_gen2_session_set_config_params (struct iris_inst * inst , u32 plane )
529573{
530574 const struct iris_platform_data * pdata = inst -> core -> iris_platform_data ;
@@ -548,6 +592,9 @@ static int iris_hfi_gen2_session_set_config_params(struct iris_inst *inst, u32 p
548592 {HFI_PROP_LINEAR_STRIDE_SCANLINE , iris_hfi_gen2_set_linear_stride_scanline },
549593 {HFI_PROP_TIER , iris_hfi_gen2_set_tier },
550594 {HFI_PROP_FRAME_RATE , iris_hfi_gen2_set_frame_rate },
595+ {HFI_PROP_AV1_FILM_GRAIN_PRESENT , iris_hfi_gen2_set_film_grain },
596+ {HFI_PROP_AV1_SUPER_BLOCK_ENABLED , iris_hfi_gen2_set_super_block },
597+ {HFI_PROP_OPB_ENABLE , iris_hfi_gen2_set_opb_enable },
551598 };
552599
553600 if (inst -> domain == DECODER ) {
@@ -561,6 +608,9 @@ static int iris_hfi_gen2_session_set_config_params(struct iris_inst *inst, u32 p
561608 } else if (inst -> codec == V4L2_PIX_FMT_VP9 ) {
562609 config_params = pdata -> dec_input_config_params_vp9 ;
563610 config_params_size = pdata -> dec_input_config_params_vp9_size ;
611+ } else if (inst -> codec == V4L2_PIX_FMT_AV1 ) {
612+ config_params = pdata -> dec_input_config_params_av1 ;
613+ config_params_size = pdata -> dec_input_config_params_av1_size ;
564614 } else {
565615 return - EINVAL ;
566616 }
@@ -615,6 +665,9 @@ static int iris_hfi_gen2_session_set_codec(struct iris_inst *inst)
615665 break ;
616666 case V4L2_PIX_FMT_VP9 :
617667 codec = HFI_CODEC_DECODE_VP9 ;
668+ break ;
669+ case V4L2_PIX_FMT_AV1 :
670+ codec = HFI_CODEC_DECODE_AV1 ;
618671 }
619672
620673 iris_hfi_gen2_packet_session_property (inst ,
@@ -780,6 +833,11 @@ static int iris_hfi_gen2_subscribe_change_param(struct iris_inst *inst, u32 plan
780833 change_param_size =
781834 core -> iris_platform_data -> dec_input_config_params_vp9_size ;
782835 break ;
836+ case V4L2_PIX_FMT_AV1 :
837+ change_param = core -> iris_platform_data -> dec_input_config_params_av1 ;
838+ change_param_size =
839+ core -> iris_platform_data -> dec_input_config_params_av1_size ;
840+ break ;
783841 }
784842
785843 payload [0 ] = HFI_MODE_PORT_SETTINGS_CHANGE ;
@@ -862,6 +920,16 @@ static int iris_hfi_gen2_subscribe_change_param(struct iris_inst *inst, u32 plan
862920 payload_size = sizeof (u32 );
863921 payload_type = HFI_PAYLOAD_U32 ;
864922 break ;
923+ case HFI_PROP_AV1_FILM_GRAIN_PRESENT :
924+ payload [0 ] = subsc_params .film_grain ;
925+ payload_size = sizeof (u32 );
926+ payload_type = HFI_PAYLOAD_U32 ;
927+ break ;
928+ case HFI_PROP_AV1_SUPER_BLOCK_ENABLED :
929+ payload [0 ] = subsc_params .super_block ;
930+ payload_size = sizeof (u32 );
931+ payload_type = HFI_PAYLOAD_U32 ;
932+ break ;
865933 default :
866934 prop_type = 0 ;
867935 ret = - EINVAL ;
@@ -917,6 +985,11 @@ static int iris_hfi_gen2_subscribe_property(struct iris_inst *inst, u32 plane)
917985 subscribe_prop_size =
918986 core -> iris_platform_data -> dec_output_prop_vp9_size ;
919987 break ;
988+ case V4L2_PIX_FMT_AV1 :
989+ subcribe_prop = core -> iris_platform_data -> dec_output_prop_av1 ;
990+ subscribe_prop_size =
991+ core -> iris_platform_data -> dec_output_prop_av1_size ;
992+ break ;
920993 }
921994 }
922995
@@ -1092,6 +1165,8 @@ static u32 iris_hfi_gen2_buf_type_from_driver(u32 domain, enum iris_buffer_type
10921165 return HFI_BUFFER_ARP ;
10931166 case BUF_VPSS :
10941167 return HFI_BUFFER_VPSS ;
1168+ case BUF_PARTIAL :
1169+ return HFI_BUFFER_PARTIAL_DATA ;
10951170 default :
10961171 return 0 ;
10971172 }
@@ -1104,7 +1179,13 @@ static int iris_set_num_comv(struct iris_inst *inst)
11041179 u32 num_comv ;
11051180
11061181 caps = core -> iris_platform_data -> inst_caps ;
1107- num_comv = caps -> num_comv ;
1182+
1183+ /*
1184+ * AV1 needs more comv buffers than other codecs.
1185+ * Update accordingly.
1186+ */
1187+ num_comv = (inst -> codec == V4L2_PIX_FMT_AV1 ) ?
1188+ NUM_COMV_AV1 : caps -> num_comv ;
11081189
11091190 return core -> hfi_ops -> session_set_property (inst ,
11101191 HFI_PROP_COMV_BUFFER_COUNT ,
0 commit comments