Message ID | 20211122184702.768341-3-jernej.skrabec@gmail.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | media: hantro: add Allwinner H6 support | expand |
W dniu 22.11.2021 o 19:46, Jernej Skrabec pisze: > Some G2 variants need double buffering to be enabled in order to work > correctly, like that found in Allwinner H6 SoC. > > Add platform quirk for that. > > Signed-off-by: Jernej Skrabec <jernej.skrabec@gmail.com> Reviewed-by: Andrzej Pietrasiewicz <andrzej.p@collabora.com> > --- > drivers/staging/media/hantro/hantro.h | 2 ++ > drivers/staging/media/hantro/hantro_g2_regs.h | 1 + > drivers/staging/media/hantro/hantro_g2_vp9_dec.c | 2 ++ > 3 files changed, 5 insertions(+) > > diff --git a/drivers/staging/media/hantro/hantro.h b/drivers/staging/media/hantro/hantro.h > index 33eb3e092cc1..d03824fa3222 100644 > --- a/drivers/staging/media/hantro/hantro.h > +++ b/drivers/staging/media/hantro/hantro.h > @@ -73,6 +73,7 @@ struct hantro_irq { > * @num_clocks: number of clocks in the array > * @reg_names: array of register range names > * @num_regs: number of register range names in the array > + * @double_buffer: core needs double buffering > */ > struct hantro_variant { > unsigned int enc_offset; > @@ -94,6 +95,7 @@ struct hantro_variant { > int num_clocks; > const char * const *reg_names; > int num_regs; > + unsigned int double_buffer : 1; > }; > > /** > diff --git a/drivers/staging/media/hantro/hantro_g2_regs.h b/drivers/staging/media/hantro/hantro_g2_regs.h > index 9c857dd1ad9b..15a391a4650e 100644 > --- a/drivers/staging/media/hantro/hantro_g2_regs.h > +++ b/drivers/staging/media/hantro/hantro_g2_regs.h > @@ -270,6 +270,7 @@ > #define g2_apf_threshold G2_DEC_REG(55, 0, 0xffff) > > #define g2_clk_gate_e G2_DEC_REG(58, 16, 0x1) > +#define g2_double_buffer_e G2_DEC_REG(58, 15, 0x1) > #define g2_buswidth G2_DEC_REG(58, 8, 0x7) > #define g2_max_burst G2_DEC_REG(58, 0, 0xff) > > diff --git a/drivers/staging/media/hantro/hantro_g2_vp9_dec.c b/drivers/staging/media/hantro/hantro_g2_vp9_dec.c > index e04242d10fa2..d4fc649a4da1 100644 > --- a/drivers/staging/media/hantro/hantro_g2_vp9_dec.c > +++ b/drivers/staging/media/hantro/hantro_g2_vp9_dec.c > @@ -847,6 +847,8 @@ config_registers(struct hantro_ctx *ctx, const struct v4l2_ctrl_vp9_frame *dec_p > hantro_reg_write(ctx->dev, &g2_clk_gate_e, 1); > hantro_reg_write(ctx->dev, &g2_max_cb_size, 6); > hantro_reg_write(ctx->dev, &g2_min_cb_size, 3); > + if (ctx->dev->variant->double_buffer) > + hantro_reg_write(ctx->dev, &g2_double_buffer_e, 1); > > config_output(ctx, dst, dec_params); > >
diff --git a/drivers/staging/media/hantro/hantro.h b/drivers/staging/media/hantro/hantro.h index 33eb3e092cc1..d03824fa3222 100644 --- a/drivers/staging/media/hantro/hantro.h +++ b/drivers/staging/media/hantro/hantro.h @@ -73,6 +73,7 @@ struct hantro_irq { * @num_clocks: number of clocks in the array * @reg_names: array of register range names * @num_regs: number of register range names in the array + * @double_buffer: core needs double buffering */ struct hantro_variant { unsigned int enc_offset; @@ -94,6 +95,7 @@ struct hantro_variant { int num_clocks; const char * const *reg_names; int num_regs; + unsigned int double_buffer : 1; }; /** diff --git a/drivers/staging/media/hantro/hantro_g2_regs.h b/drivers/staging/media/hantro/hantro_g2_regs.h index 9c857dd1ad9b..15a391a4650e 100644 --- a/drivers/staging/media/hantro/hantro_g2_regs.h +++ b/drivers/staging/media/hantro/hantro_g2_regs.h @@ -270,6 +270,7 @@ #define g2_apf_threshold G2_DEC_REG(55, 0, 0xffff) #define g2_clk_gate_e G2_DEC_REG(58, 16, 0x1) +#define g2_double_buffer_e G2_DEC_REG(58, 15, 0x1) #define g2_buswidth G2_DEC_REG(58, 8, 0x7) #define g2_max_burst G2_DEC_REG(58, 0, 0xff) diff --git a/drivers/staging/media/hantro/hantro_g2_vp9_dec.c b/drivers/staging/media/hantro/hantro_g2_vp9_dec.c index e04242d10fa2..d4fc649a4da1 100644 --- a/drivers/staging/media/hantro/hantro_g2_vp9_dec.c +++ b/drivers/staging/media/hantro/hantro_g2_vp9_dec.c @@ -847,6 +847,8 @@ config_registers(struct hantro_ctx *ctx, const struct v4l2_ctrl_vp9_frame *dec_p hantro_reg_write(ctx->dev, &g2_clk_gate_e, 1); hantro_reg_write(ctx->dev, &g2_max_cb_size, 6); hantro_reg_write(ctx->dev, &g2_min_cb_size, 3); + if (ctx->dev->variant->double_buffer) + hantro_reg_write(ctx->dev, &g2_double_buffer_e, 1); config_output(ctx, dst, dec_params);
Some G2 variants need double buffering to be enabled in order to work correctly, like that found in Allwinner H6 SoC. Add platform quirk for that. Signed-off-by: Jernej Skrabec <jernej.skrabec@gmail.com> --- drivers/staging/media/hantro/hantro.h | 2 ++ drivers/staging/media/hantro/hantro_g2_regs.h | 1 + drivers/staging/media/hantro/hantro_g2_vp9_dec.c | 2 ++ 3 files changed, 5 insertions(+)