@@ -150,7 +150,8 @@ static void config_output(struct hantro_ctx *ctx,
150150 dma_addr_t luma_addr , chroma_addr , mv_addr ;
151151
152152 hantro_reg_write (ctx -> dev , & g2_out_dis , 0 );
153- hantro_reg_write (ctx -> dev , & g2_output_format , 0 );
153+ if (!ctx -> dev -> variant -> legacy_regs )
154+ hantro_reg_write (ctx -> dev , & g2_output_format , 0 );
154155
155156 luma_addr = hantro_get_dec_buf_addr (ctx , & dst -> base .vb .vb2_buf );
156157 hantro_write_addr (ctx -> dev , G2_OUT_LUMA_ADDR , luma_addr );
@@ -327,6 +328,7 @@ config_tiles(struct hantro_ctx *ctx,
327328 struct hantro_aux_buf * tile_edge = & vp9_ctx -> tile_edge ;
328329 dma_addr_t addr ;
329330 unsigned short * tile_mem ;
331+ unsigned int rows , cols ;
330332
331333 addr = misc -> dma + vp9_ctx -> tile_info_offset ;
332334 hantro_write_addr (ctx -> dev , G2_TILE_SIZES_ADDR , addr );
@@ -344,17 +346,24 @@ config_tiles(struct hantro_ctx *ctx,
344346
345347 fill_tile_info (ctx , tile_r , tile_c , sbs_r , sbs_c , tile_mem );
346348
349+ cols = tile_c ;
350+ rows = tile_r ;
347351 hantro_reg_write (ctx -> dev , & g2_tile_e , 1 );
348- hantro_reg_write (ctx -> dev , & g2_num_tile_cols , tile_c );
349- hantro_reg_write (ctx -> dev , & g2_num_tile_rows , tile_r );
350-
351352 } else {
352353 tile_mem [0 ] = hantro_vp9_num_sbs (dst -> vp9 .width );
353354 tile_mem [1 ] = hantro_vp9_num_sbs (dst -> vp9 .height );
354355
356+ cols = 1 ;
357+ rows = 1 ;
355358 hantro_reg_write (ctx -> dev , & g2_tile_e , 0 );
356- hantro_reg_write (ctx -> dev , & g2_num_tile_cols , 1 );
357- hantro_reg_write (ctx -> dev , & g2_num_tile_rows , 1 );
359+ }
360+
361+ if (ctx -> dev -> variant -> legacy_regs ) {
362+ hantro_reg_write (ctx -> dev , & g2_num_tile_cols_old , cols );
363+ hantro_reg_write (ctx -> dev , & g2_num_tile_rows_old , rows );
364+ } else {
365+ hantro_reg_write (ctx -> dev , & g2_num_tile_cols , cols );
366+ hantro_reg_write (ctx -> dev , & g2_num_tile_rows , rows );
358367 }
359368
360369 /* provide aux buffers even if no tiles are used */
@@ -505,8 +514,22 @@ static void config_picture_dimensions(struct hantro_ctx *ctx, struct hantro_deco
505514static void
506515config_bit_depth (struct hantro_ctx * ctx , const struct v4l2_ctrl_vp9_frame * dec_params )
507516{
508- hantro_reg_write (ctx -> dev , & g2_bit_depth_y_minus8 , dec_params -> bit_depth - 8 );
509- hantro_reg_write (ctx -> dev , & g2_bit_depth_c_minus8 , dec_params -> bit_depth - 8 );
517+ if (ctx -> dev -> variant -> legacy_regs ) {
518+ u8 pp_shift = 0 ;
519+
520+ hantro_reg_write (ctx -> dev , & g2_bit_depth_y , dec_params -> bit_depth );
521+ hantro_reg_write (ctx -> dev , & g2_bit_depth_c , dec_params -> bit_depth );
522+ hantro_reg_write (ctx -> dev , & g2_rs_out_bit_depth , dec_params -> bit_depth );
523+
524+ if (dec_params -> bit_depth > 8 )
525+ pp_shift = 16 - dec_params -> bit_depth ;
526+
527+ hantro_reg_write (ctx -> dev , & g2_pp_pix_shift , pp_shift );
528+ hantro_reg_write (ctx -> dev , & g2_pix_shift , 0 );
529+ } else {
530+ hantro_reg_write (ctx -> dev , & g2_bit_depth_y_minus8 , dec_params -> bit_depth - 8 );
531+ hantro_reg_write (ctx -> dev , & g2_bit_depth_c_minus8 , dec_params -> bit_depth - 8 );
532+ }
510533}
511534
512535static inline bool is_lossless (const struct v4l2_vp9_quantization * quant )
@@ -784,20 +807,26 @@ config_source(struct hantro_ctx *ctx, const struct v4l2_ctrl_vp9_frame *dec_para
784807 + dec_params -> compressed_header_size ;
785808
786809 stream_base = vb2_dma_contig_plane_dma_addr (& vb2_src -> vb2_buf , 0 );
787- hantro_write_addr (ctx -> dev , G2_STREAM_ADDR , stream_base );
788810
789811 tmp_addr = stream_base + headres_size ;
812+ if (ctx -> dev -> variant -> legacy_regs )
813+ hantro_write_addr (ctx -> dev , G2_STREAM_ADDR , (tmp_addr & ~0xf ));
814+ else
815+ hantro_write_addr (ctx -> dev , G2_STREAM_ADDR , stream_base );
816+
790817 start_bit = (tmp_addr & 0xf ) * 8 ;
791818 hantro_reg_write (ctx -> dev , & g2_start_bit , start_bit );
792819
793820 src_len = vb2_get_plane_payload (& vb2_src -> vb2_buf , 0 );
794821 src_len += start_bit / 8 - headres_size ;
795822 hantro_reg_write (ctx -> dev , & g2_stream_len , src_len );
796823
797- tmp_addr &= ~0xf ;
798- hantro_reg_write (ctx -> dev , & g2_strm_start_offset , tmp_addr - stream_base );
799- src_buf_len = vb2_plane_size (& vb2_src -> vb2_buf , 0 );
800- hantro_reg_write (ctx -> dev , & g2_strm_buffer_len , src_buf_len );
824+ if (!ctx -> dev -> variant -> legacy_regs ) {
825+ tmp_addr &= ~0xf ;
826+ hantro_reg_write (ctx -> dev , & g2_strm_start_offset , tmp_addr - stream_base );
827+ src_buf_len = vb2_plane_size (& vb2_src -> vb2_buf , 0 );
828+ hantro_reg_write (ctx -> dev , & g2_strm_buffer_len , src_buf_len );
829+ }
801830}
802831
803832static void
@@ -837,13 +866,24 @@ config_registers(struct hantro_ctx *ctx, const struct v4l2_ctrl_vp9_frame *dec_p
837866
838867 /* configure basic registers */
839868 hantro_reg_write (ctx -> dev , & g2_mode , VP9_DEC_MODE );
840- hantro_reg_write (ctx -> dev , & g2_strm_swap , 0xf );
841- hantro_reg_write (ctx -> dev , & g2_dirmv_swap , 0xf );
842- hantro_reg_write (ctx -> dev , & g2_compress_swap , 0xf );
869+ if (!ctx -> dev -> variant -> legacy_regs ) {
870+ hantro_reg_write (ctx -> dev , & g2_strm_swap , 0xf );
871+ hantro_reg_write (ctx -> dev , & g2_dirmv_swap , 0xf );
872+ hantro_reg_write (ctx -> dev , & g2_compress_swap , 0xf );
873+ hantro_reg_write (ctx -> dev , & g2_ref_compress_bypass , 1 );
874+ } else {
875+ hantro_reg_write (ctx -> dev , & g2_strm_swap_old , 0x1f );
876+ hantro_reg_write (ctx -> dev , & g2_pic_swap , 0x10 );
877+ hantro_reg_write (ctx -> dev , & g2_dirmv_swap_old , 0x10 );
878+ hantro_reg_write (ctx -> dev , & g2_tab0_swap_old , 0x10 );
879+ hantro_reg_write (ctx -> dev , & g2_tab1_swap_old , 0x10 );
880+ hantro_reg_write (ctx -> dev , & g2_tab2_swap_old , 0x10 );
881+ hantro_reg_write (ctx -> dev , & g2_tab3_swap_old , 0x10 );
882+ hantro_reg_write (ctx -> dev , & g2_rscan_swap , 0x10 );
883+ }
843884 hantro_reg_write (ctx -> dev , & g2_buswidth , BUS_WIDTH_128 );
844885 hantro_reg_write (ctx -> dev , & g2_max_burst , 16 );
845886 hantro_reg_write (ctx -> dev , & g2_apf_threshold , 8 );
846- hantro_reg_write (ctx -> dev , & g2_ref_compress_bypass , 1 );
847887 hantro_reg_write (ctx -> dev , & g2_clk_gate_e , 1 );
848888 hantro_reg_write (ctx -> dev , & g2_max_cb_size , 6 );
849889 hantro_reg_write (ctx -> dev , & g2_min_cb_size , 3 );
0 commit comments