2234 lines · c
1// SPDX-License-Identifier: GPL-2.0-only2/*3 * Copyright (c) 2023, Collabora4 *5 * Author: Benjamin Gaignard <benjamin.gaignard@collabora.com>6 */7 8#include <media/v4l2-mem2mem.h>9#include "hantro.h"10#include "hantro_v4l2.h"11#include "rockchip_vpu981_regs.h"12 13#define AV1_DEC_MODE 1714#define GM_GLOBAL_MODELS_PER_FRAME 715#define GLOBAL_MODEL_TOTAL_SIZE (6 * 4 + 4 * 2)16#define GLOBAL_MODEL_SIZE ALIGN(GM_GLOBAL_MODELS_PER_FRAME * GLOBAL_MODEL_TOTAL_SIZE, 2048)17#define AV1_MAX_TILES 12818#define AV1_TILE_INFO_SIZE (AV1_MAX_TILES * 16)19#define AV1DEC_MAX_PIC_BUFFERS 2420#define AV1_REF_SCALE_SHIFT 1421#define AV1_INVALID_IDX -122#define MAX_FRAME_DISTANCE 3123#define AV1_PRIMARY_REF_NONE 724#define AV1_TILE_SIZE ALIGN(32 * 128, 4096)25/*26 * These 3 values aren't defined enum v4l2_av1_segment_feature because27 * they are not part of the specification28 */29#define V4L2_AV1_SEG_LVL_ALT_LF_Y_H 230#define V4L2_AV1_SEG_LVL_ALT_LF_U 331#define V4L2_AV1_SEG_LVL_ALT_LF_V 432 33#define SUPERRES_SCALE_BITS 334#define SCALE_NUMERATOR 835#define SUPERRES_SCALE_DENOMINATOR_MIN (SCALE_NUMERATOR + 1)36 37#define RS_SUBPEL_BITS 638#define RS_SUBPEL_MASK ((1 << RS_SUBPEL_BITS) - 1)39#define RS_SCALE_SUBPEL_BITS 1440#define RS_SCALE_SUBPEL_MASK ((1 << RS_SCALE_SUBPEL_BITS) - 1)41#define RS_SCALE_EXTRA_BITS (RS_SCALE_SUBPEL_BITS - RS_SUBPEL_BITS)42#define RS_SCALE_EXTRA_OFF (1 << (RS_SCALE_EXTRA_BITS - 1))43 44#define IS_INTRA(type) ((type == V4L2_AV1_KEY_FRAME) || (type == V4L2_AV1_INTRA_ONLY_FRAME))45 46#define LST_BUF_IDX (V4L2_AV1_REF_LAST_FRAME - V4L2_AV1_REF_LAST_FRAME)47#define LST2_BUF_IDX (V4L2_AV1_REF_LAST2_FRAME - V4L2_AV1_REF_LAST_FRAME)48#define LST3_BUF_IDX (V4L2_AV1_REF_LAST3_FRAME - V4L2_AV1_REF_LAST_FRAME)49#define GLD_BUF_IDX (V4L2_AV1_REF_GOLDEN_FRAME - V4L2_AV1_REF_LAST_FRAME)50#define BWD_BUF_IDX (V4L2_AV1_REF_BWDREF_FRAME - V4L2_AV1_REF_LAST_FRAME)51#define ALT2_BUF_IDX (V4L2_AV1_REF_ALTREF2_FRAME - V4L2_AV1_REF_LAST_FRAME)52#define ALT_BUF_IDX (V4L2_AV1_REF_ALTREF_FRAME - V4L2_AV1_REF_LAST_FRAME)53 54#define DIV_LUT_PREC_BITS 1455#define DIV_LUT_BITS 856#define DIV_LUT_NUM BIT(DIV_LUT_BITS)57#define WARP_PARAM_REDUCE_BITS 658#define WARPEDMODEL_PREC_BITS 1659 60#define AV1_DIV_ROUND_UP_POW2(value, n) \61({ \62 typeof(n) _n = n; \63 typeof(value) _value = value; \64 (_value + (BIT(_n) >> 1)) >> _n; \65})66 67#define AV1_DIV_ROUND_UP_POW2_SIGNED(value, n) \68({ \69 typeof(n) _n_ = n; \70 typeof(value) _value_ = value; \71 (((_value_) < 0) ? -AV1_DIV_ROUND_UP_POW2(-(_value_), (_n_)) \72 : AV1_DIV_ROUND_UP_POW2((_value_), (_n_))); \73})74 75struct rockchip_av1_film_grain {76 u8 scaling_lut_y[256];77 u8 scaling_lut_cb[256];78 u8 scaling_lut_cr[256];79 s16 cropped_luma_grain_block[4096];80 s16 cropped_chroma_grain_block[1024 * 2];81};82 83static const short div_lut[DIV_LUT_NUM + 1] = {84 16384, 16320, 16257, 16194, 16132, 16070, 16009, 15948, 15888, 15828, 15768,85 15709, 15650, 15592, 15534, 15477, 15420, 15364, 15308, 15252, 15197, 15142,86 15087, 15033, 14980, 14926, 14873, 14821, 14769, 14717, 14665, 14614, 14564,87 14513, 14463, 14413, 14364, 14315, 14266, 14218, 14170, 14122, 14075, 14028,88 13981, 13935, 13888, 13843, 13797, 13752, 13707, 13662, 13618, 13574, 13530,89 13487, 13443, 13400, 13358, 13315, 13273, 13231, 13190, 13148, 13107, 13066,90 13026, 12985, 12945, 12906, 12866, 12827, 12788, 12749, 12710, 12672, 12633,91 12596, 12558, 12520, 12483, 12446, 12409, 12373, 12336, 12300, 12264, 12228,92 12193, 12157, 12122, 12087, 12053, 12018, 11984, 11950, 11916, 11882, 11848,93 11815, 11782, 11749, 11716, 11683, 11651, 11619, 11586, 11555, 11523, 11491,94 11460, 11429, 11398, 11367, 11336, 11305, 11275, 11245, 11215, 11185, 11155,95 11125, 11096, 11067, 11038, 11009, 10980, 10951, 10923, 10894, 10866, 10838,96 10810, 10782, 10755, 10727, 10700, 10673, 10645, 10618, 10592, 10565, 10538,97 10512, 10486, 10460, 10434, 10408, 10382, 10356, 10331, 10305, 10280, 10255,98 10230, 10205, 10180, 10156, 10131, 10107, 10082, 10058, 10034, 10010, 9986,99 9963, 9939, 9916, 9892, 9869, 9846, 9823, 9800, 9777, 9754, 9732,100 9709, 9687, 9664, 9642, 9620, 9598, 9576, 9554, 9533, 9511, 9489,101 9468, 9447, 9425, 9404, 9383, 9362, 9341, 9321, 9300, 9279, 9259,102 9239, 9218, 9198, 9178, 9158, 9138, 9118, 9098, 9079, 9059, 9039,103 9020, 9001, 8981, 8962, 8943, 8924, 8905, 8886, 8867, 8849, 8830,104 8812, 8793, 8775, 8756, 8738, 8720, 8702, 8684, 8666, 8648, 8630,105 8613, 8595, 8577, 8560, 8542, 8525, 8508, 8490, 8473, 8456, 8439,106 8422, 8405, 8389, 8372, 8355, 8339, 8322, 8306, 8289, 8273, 8257,107 8240, 8224, 8208, 8192,108};109 110static int rockchip_vpu981_get_frame_index(struct hantro_ctx *ctx, int ref)111{112 struct hantro_av1_dec_hw_ctx *av1_dec = &ctx->av1_dec;113 struct hantro_av1_dec_ctrls *ctrls = &av1_dec->ctrls;114 const struct v4l2_ctrl_av1_frame *frame = ctrls->frame;115 u64 timestamp;116 int i, idx = frame->ref_frame_idx[ref];117 118 if (idx >= V4L2_AV1_TOTAL_REFS_PER_FRAME || idx < 0)119 return AV1_INVALID_IDX;120 121 timestamp = frame->reference_frame_ts[idx];122 for (i = 0; i < AV1_MAX_FRAME_BUF_COUNT; i++) {123 if (!av1_dec->frame_refs[i].used)124 continue;125 if (av1_dec->frame_refs[i].timestamp == timestamp)126 return i;127 }128 129 return AV1_INVALID_IDX;130}131 132static int rockchip_vpu981_get_order_hint(struct hantro_ctx *ctx, int ref)133{134 struct hantro_av1_dec_hw_ctx *av1_dec = &ctx->av1_dec;135 int idx = rockchip_vpu981_get_frame_index(ctx, ref);136 137 if (idx != AV1_INVALID_IDX)138 return av1_dec->frame_refs[idx].order_hint;139 140 return 0;141}142 143static int rockchip_vpu981_av1_dec_frame_ref(struct hantro_ctx *ctx,144 u64 timestamp)145{146 struct hantro_av1_dec_hw_ctx *av1_dec = &ctx->av1_dec;147 struct hantro_av1_dec_ctrls *ctrls = &av1_dec->ctrls;148 const struct v4l2_ctrl_av1_frame *frame = ctrls->frame;149 int i;150 151 for (i = 0; i < AV1_MAX_FRAME_BUF_COUNT; i++) {152 int j;153 154 if (av1_dec->frame_refs[i].used)155 continue;156 157 av1_dec->frame_refs[i].width = frame->frame_width_minus_1 + 1;158 av1_dec->frame_refs[i].height = frame->frame_height_minus_1 + 1;159 av1_dec->frame_refs[i].mi_cols = DIV_ROUND_UP(frame->frame_width_minus_1 + 1, 8);160 av1_dec->frame_refs[i].mi_rows = DIV_ROUND_UP(frame->frame_height_minus_1 + 1, 8);161 av1_dec->frame_refs[i].timestamp = timestamp;162 av1_dec->frame_refs[i].frame_type = frame->frame_type;163 av1_dec->frame_refs[i].order_hint = frame->order_hint;164 if (!av1_dec->frame_refs[i].vb2_ref)165 av1_dec->frame_refs[i].vb2_ref = hantro_get_dst_buf(ctx);166 167 for (j = 0; j < V4L2_AV1_TOTAL_REFS_PER_FRAME; j++)168 av1_dec->frame_refs[i].order_hints[j] = frame->order_hints[j];169 av1_dec->frame_refs[i].used = true;170 av1_dec->current_frame_index = i;171 172 return i;173 }174 175 return AV1_INVALID_IDX;176}177 178static void rockchip_vpu981_av1_dec_frame_unref(struct hantro_ctx *ctx, int idx)179{180 struct hantro_av1_dec_hw_ctx *av1_dec = &ctx->av1_dec;181 182 if (idx >= 0)183 av1_dec->frame_refs[idx].used = false;184}185 186static void rockchip_vpu981_av1_dec_clean_refs(struct hantro_ctx *ctx)187{188 struct hantro_av1_dec_hw_ctx *av1_dec = &ctx->av1_dec;189 struct hantro_av1_dec_ctrls *ctrls = &av1_dec->ctrls;190 191 int ref, idx;192 193 for (idx = 0; idx < AV1_MAX_FRAME_BUF_COUNT; idx++) {194 u64 timestamp = av1_dec->frame_refs[idx].timestamp;195 bool used = false;196 197 if (!av1_dec->frame_refs[idx].used)198 continue;199 200 for (ref = 0; ref < V4L2_AV1_TOTAL_REFS_PER_FRAME; ref++) {201 if (ctrls->frame->reference_frame_ts[ref] == timestamp)202 used = true;203 }204 205 if (!used)206 rockchip_vpu981_av1_dec_frame_unref(ctx, idx);207 }208}209 210static size_t rockchip_vpu981_av1_dec_luma_size(struct hantro_ctx *ctx)211{212 return ctx->dst_fmt.width * ctx->dst_fmt.height * ctx->bit_depth / 8;213}214 215static size_t rockchip_vpu981_av1_dec_chroma_size(struct hantro_ctx *ctx)216{217 size_t cr_offset = rockchip_vpu981_av1_dec_luma_size(ctx);218 219 return ALIGN((cr_offset * 3) / 2, 64);220}221 222static void rockchip_vpu981_av1_dec_tiles_free(struct hantro_ctx *ctx)223{224 struct hantro_dev *vpu = ctx->dev;225 struct hantro_av1_dec_hw_ctx *av1_dec = &ctx->av1_dec;226 227 if (av1_dec->db_data_col.cpu)228 dma_free_coherent(vpu->dev, av1_dec->db_data_col.size,229 av1_dec->db_data_col.cpu,230 av1_dec->db_data_col.dma);231 av1_dec->db_data_col.cpu = NULL;232 233 if (av1_dec->db_ctrl_col.cpu)234 dma_free_coherent(vpu->dev, av1_dec->db_ctrl_col.size,235 av1_dec->db_ctrl_col.cpu,236 av1_dec->db_ctrl_col.dma);237 av1_dec->db_ctrl_col.cpu = NULL;238 239 if (av1_dec->cdef_col.cpu)240 dma_free_coherent(vpu->dev, av1_dec->cdef_col.size,241 av1_dec->cdef_col.cpu, av1_dec->cdef_col.dma);242 av1_dec->cdef_col.cpu = NULL;243 244 if (av1_dec->sr_col.cpu)245 dma_free_coherent(vpu->dev, av1_dec->sr_col.size,246 av1_dec->sr_col.cpu, av1_dec->sr_col.dma);247 av1_dec->sr_col.cpu = NULL;248 249 if (av1_dec->lr_col.cpu)250 dma_free_coherent(vpu->dev, av1_dec->lr_col.size,251 av1_dec->lr_col.cpu, av1_dec->lr_col.dma);252 av1_dec->lr_col.cpu = NULL;253}254 255static int rockchip_vpu981_av1_dec_tiles_reallocate(struct hantro_ctx *ctx)256{257 struct hantro_dev *vpu = ctx->dev;258 struct hantro_av1_dec_hw_ctx *av1_dec = &ctx->av1_dec;259 struct hantro_av1_dec_ctrls *ctrls = &av1_dec->ctrls;260 const struct v4l2_av1_tile_info *tile_info = &ctrls->frame->tile_info;261 unsigned int num_tile_cols = tile_info->tile_cols;262 unsigned int height = ALIGN(ctrls->frame->frame_height_minus_1 + 1, 64);263 unsigned int height_in_sb = height / 64;264 unsigned int stripe_num = ((height + 8) + 63) / 64;265 size_t size;266 267 if (av1_dec->db_data_col.size >=268 ALIGN(height * 12 * ctx->bit_depth / 8, 128) * num_tile_cols)269 return 0;270 271 rockchip_vpu981_av1_dec_tiles_free(ctx);272 273 size = ALIGN(height * 12 * ctx->bit_depth / 8, 128) * num_tile_cols;274 av1_dec->db_data_col.cpu = dma_alloc_coherent(vpu->dev, size,275 &av1_dec->db_data_col.dma,276 GFP_KERNEL);277 if (!av1_dec->db_data_col.cpu)278 goto buffer_allocation_error;279 av1_dec->db_data_col.size = size;280 281 size = ALIGN(height * 2 * 16 / 4, 128) * num_tile_cols;282 av1_dec->db_ctrl_col.cpu = dma_alloc_coherent(vpu->dev, size,283 &av1_dec->db_ctrl_col.dma,284 GFP_KERNEL);285 if (!av1_dec->db_ctrl_col.cpu)286 goto buffer_allocation_error;287 av1_dec->db_ctrl_col.size = size;288 289 size = ALIGN(height_in_sb * 44 * ctx->bit_depth * 16 / 8, 128) * num_tile_cols;290 av1_dec->cdef_col.cpu = dma_alloc_coherent(vpu->dev, size,291 &av1_dec->cdef_col.dma,292 GFP_KERNEL);293 if (!av1_dec->cdef_col.cpu)294 goto buffer_allocation_error;295 av1_dec->cdef_col.size = size;296 297 size = ALIGN(height_in_sb * (3040 + 1280), 128) * num_tile_cols;298 av1_dec->sr_col.cpu = dma_alloc_coherent(vpu->dev, size,299 &av1_dec->sr_col.dma,300 GFP_KERNEL);301 if (!av1_dec->sr_col.cpu)302 goto buffer_allocation_error;303 av1_dec->sr_col.size = size;304 305 size = ALIGN(stripe_num * 1536 * ctx->bit_depth / 8, 128) * num_tile_cols;306 av1_dec->lr_col.cpu = dma_alloc_coherent(vpu->dev, size,307 &av1_dec->lr_col.dma,308 GFP_KERNEL);309 if (!av1_dec->lr_col.cpu)310 goto buffer_allocation_error;311 av1_dec->lr_col.size = size;312 313 av1_dec->num_tile_cols_allocated = num_tile_cols;314 return 0;315 316buffer_allocation_error:317 rockchip_vpu981_av1_dec_tiles_free(ctx);318 return -ENOMEM;319}320 321void rockchip_vpu981_av1_dec_exit(struct hantro_ctx *ctx)322{323 struct hantro_dev *vpu = ctx->dev;324 struct hantro_av1_dec_hw_ctx *av1_dec = &ctx->av1_dec;325 326 if (av1_dec->global_model.cpu)327 dma_free_coherent(vpu->dev, av1_dec->global_model.size,328 av1_dec->global_model.cpu,329 av1_dec->global_model.dma);330 av1_dec->global_model.cpu = NULL;331 332 if (av1_dec->tile_info.cpu)333 dma_free_coherent(vpu->dev, av1_dec->tile_info.size,334 av1_dec->tile_info.cpu,335 av1_dec->tile_info.dma);336 av1_dec->tile_info.cpu = NULL;337 338 if (av1_dec->film_grain.cpu)339 dma_free_coherent(vpu->dev, av1_dec->film_grain.size,340 av1_dec->film_grain.cpu,341 av1_dec->film_grain.dma);342 av1_dec->film_grain.cpu = NULL;343 344 if (av1_dec->prob_tbl.cpu)345 dma_free_coherent(vpu->dev, av1_dec->prob_tbl.size,346 av1_dec->prob_tbl.cpu, av1_dec->prob_tbl.dma);347 av1_dec->prob_tbl.cpu = NULL;348 349 if (av1_dec->prob_tbl_out.cpu)350 dma_free_coherent(vpu->dev, av1_dec->prob_tbl_out.size,351 av1_dec->prob_tbl_out.cpu,352 av1_dec->prob_tbl_out.dma);353 av1_dec->prob_tbl_out.cpu = NULL;354 355 if (av1_dec->tile_buf.cpu)356 dma_free_coherent(vpu->dev, av1_dec->tile_buf.size,357 av1_dec->tile_buf.cpu, av1_dec->tile_buf.dma);358 av1_dec->tile_buf.cpu = NULL;359 360 rockchip_vpu981_av1_dec_tiles_free(ctx);361}362 363int rockchip_vpu981_av1_dec_init(struct hantro_ctx *ctx)364{365 struct hantro_dev *vpu = ctx->dev;366 struct hantro_av1_dec_hw_ctx *av1_dec = &ctx->av1_dec;367 368 memset(av1_dec, 0, sizeof(*av1_dec));369 370 av1_dec->global_model.cpu = dma_alloc_coherent(vpu->dev, GLOBAL_MODEL_SIZE,371 &av1_dec->global_model.dma,372 GFP_KERNEL);373 if (!av1_dec->global_model.cpu)374 return -ENOMEM;375 av1_dec->global_model.size = GLOBAL_MODEL_SIZE;376 377 av1_dec->tile_info.cpu = dma_alloc_coherent(vpu->dev, AV1_MAX_TILES,378 &av1_dec->tile_info.dma,379 GFP_KERNEL);380 if (!av1_dec->tile_info.cpu)381 return -ENOMEM;382 av1_dec->tile_info.size = AV1_MAX_TILES;383 384 av1_dec->film_grain.cpu = dma_alloc_coherent(vpu->dev,385 ALIGN(sizeof(struct rockchip_av1_film_grain), 2048),386 &av1_dec->film_grain.dma,387 GFP_KERNEL);388 if (!av1_dec->film_grain.cpu)389 return -ENOMEM;390 av1_dec->film_grain.size = ALIGN(sizeof(struct rockchip_av1_film_grain), 2048);391 392 av1_dec->prob_tbl.cpu = dma_alloc_coherent(vpu->dev,393 ALIGN(sizeof(struct av1cdfs), 2048),394 &av1_dec->prob_tbl.dma,395 GFP_KERNEL);396 if (!av1_dec->prob_tbl.cpu)397 return -ENOMEM;398 av1_dec->prob_tbl.size = ALIGN(sizeof(struct av1cdfs), 2048);399 400 av1_dec->prob_tbl_out.cpu = dma_alloc_coherent(vpu->dev,401 ALIGN(sizeof(struct av1cdfs), 2048),402 &av1_dec->prob_tbl_out.dma,403 GFP_KERNEL);404 if (!av1_dec->prob_tbl_out.cpu)405 return -ENOMEM;406 av1_dec->prob_tbl_out.size = ALIGN(sizeof(struct av1cdfs), 2048);407 av1_dec->cdfs = &av1_dec->default_cdfs;408 av1_dec->cdfs_ndvc = &av1_dec->default_cdfs_ndvc;409 410 rockchip_av1_set_default_cdfs(av1_dec->cdfs, av1_dec->cdfs_ndvc);411 412 av1_dec->tile_buf.cpu = dma_alloc_coherent(vpu->dev,413 AV1_TILE_SIZE,414 &av1_dec->tile_buf.dma,415 GFP_KERNEL);416 if (!av1_dec->tile_buf.cpu)417 return -ENOMEM;418 av1_dec->tile_buf.size = AV1_TILE_SIZE;419 420 return 0;421}422 423static int rockchip_vpu981_av1_dec_prepare_run(struct hantro_ctx *ctx)424{425 struct hantro_av1_dec_hw_ctx *av1_dec = &ctx->av1_dec;426 struct hantro_av1_dec_ctrls *ctrls = &av1_dec->ctrls;427 428 ctrls->sequence = hantro_get_ctrl(ctx, V4L2_CID_STATELESS_AV1_SEQUENCE);429 if (WARN_ON(!ctrls->sequence))430 return -EINVAL;431 432 ctrls->tile_group_entry =433 hantro_get_ctrl(ctx, V4L2_CID_STATELESS_AV1_TILE_GROUP_ENTRY);434 if (WARN_ON(!ctrls->tile_group_entry))435 return -EINVAL;436 437 ctrls->frame = hantro_get_ctrl(ctx, V4L2_CID_STATELESS_AV1_FRAME);438 if (WARN_ON(!ctrls->frame))439 return -EINVAL;440 441 ctrls->film_grain =442 hantro_get_ctrl(ctx, V4L2_CID_STATELESS_AV1_FILM_GRAIN);443 444 return rockchip_vpu981_av1_dec_tiles_reallocate(ctx);445}446 447static inline int rockchip_vpu981_av1_dec_get_msb(u32 n)448{449 if (n == 0)450 return 0;451 return 31 ^ __builtin_clz(n);452}453 454static short rockchip_vpu981_av1_dec_resolve_divisor_32(u32 d, short *shift)455{456 int f;457 u64 e;458 459 *shift = rockchip_vpu981_av1_dec_get_msb(d);460 /* e is obtained from D after resetting the most significant 1 bit. */461 e = d - ((u32)1 << *shift);462 /* Get the most significant DIV_LUT_BITS (8) bits of e into f */463 if (*shift > DIV_LUT_BITS)464 f = AV1_DIV_ROUND_UP_POW2(e, *shift - DIV_LUT_BITS);465 else466 f = e << (DIV_LUT_BITS - *shift);467 if (f > DIV_LUT_NUM)468 return -1;469 *shift += DIV_LUT_PREC_BITS;470 /* Use f as lookup into the precomputed table of multipliers */471 return div_lut[f];472}473 474static void475rockchip_vpu981_av1_dec_get_shear_params(const u32 *params, s64 *alpha,476 s64 *beta, s64 *gamma, s64 *delta)477{478 const int *mat = params;479 short shift;480 short y;481 long long gv, dv;482 483 if (mat[2] <= 0)484 return;485 486 *alpha = clamp_val(mat[2] - (1 << WARPEDMODEL_PREC_BITS), S16_MIN, S16_MAX);487 *beta = clamp_val(mat[3], S16_MIN, S16_MAX);488 489 y = rockchip_vpu981_av1_dec_resolve_divisor_32(abs(mat[2]), &shift) * (mat[2] < 0 ? -1 : 1);490 491 gv = ((long long)mat[4] * (1 << WARPEDMODEL_PREC_BITS)) * y;492 493 *gamma = clamp_val((int)AV1_DIV_ROUND_UP_POW2_SIGNED(gv, shift), S16_MIN, S16_MAX);494 495 dv = ((long long)mat[3] * mat[4]) * y;496 *delta = clamp_val(mat[5] -497 (int)AV1_DIV_ROUND_UP_POW2_SIGNED(dv, shift) - (1 << WARPEDMODEL_PREC_BITS),498 S16_MIN, S16_MAX);499 500 *alpha = AV1_DIV_ROUND_UP_POW2_SIGNED(*alpha, WARP_PARAM_REDUCE_BITS)501 * (1 << WARP_PARAM_REDUCE_BITS);502 *beta = AV1_DIV_ROUND_UP_POW2_SIGNED(*beta, WARP_PARAM_REDUCE_BITS)503 * (1 << WARP_PARAM_REDUCE_BITS);504 *gamma = AV1_DIV_ROUND_UP_POW2_SIGNED(*gamma, WARP_PARAM_REDUCE_BITS)505 * (1 << WARP_PARAM_REDUCE_BITS);506 *delta = AV1_DIV_ROUND_UP_POW2_SIGNED(*delta, WARP_PARAM_REDUCE_BITS)507 * (1 << WARP_PARAM_REDUCE_BITS);508}509 510static void rockchip_vpu981_av1_dec_set_global_model(struct hantro_ctx *ctx)511{512 struct hantro_av1_dec_hw_ctx *av1_dec = &ctx->av1_dec;513 struct hantro_av1_dec_ctrls *ctrls = &av1_dec->ctrls;514 const struct v4l2_ctrl_av1_frame *frame = ctrls->frame;515 const struct v4l2_av1_global_motion *gm = &frame->global_motion;516 u8 *dst = av1_dec->global_model.cpu;517 struct hantro_dev *vpu = ctx->dev;518 int ref_frame, i;519 520 memset(dst, 0, GLOBAL_MODEL_SIZE);521 for (ref_frame = 0; ref_frame < V4L2_AV1_REFS_PER_FRAME; ++ref_frame) {522 s64 alpha = 0, beta = 0, gamma = 0, delta = 0;523 524 for (i = 0; i < 6; ++i) {525 if (i == 2)526 *(s32 *)dst =527 gm->params[V4L2_AV1_REF_LAST_FRAME + ref_frame][3];528 else if (i == 3)529 *(s32 *)dst =530 gm->params[V4L2_AV1_REF_LAST_FRAME + ref_frame][2];531 else532 *(s32 *)dst =533 gm->params[V4L2_AV1_REF_LAST_FRAME + ref_frame][i];534 dst += 4;535 }536 537 if (gm->type[V4L2_AV1_REF_LAST_FRAME + ref_frame] <= V4L2_AV1_WARP_MODEL_AFFINE)538 rockchip_vpu981_av1_dec_get_shear_params(&gm->params[V4L2_AV1_REF_LAST_FRAME + ref_frame][0],539 &alpha, &beta, &gamma, &delta);540 541 *(s16 *)dst = alpha;542 dst += 2;543 *(s16 *)dst = beta;544 dst += 2;545 *(s16 *)dst = gamma;546 dst += 2;547 *(s16 *)dst = delta;548 dst += 2;549 }550 551 hantro_write_addr(vpu, AV1_GLOBAL_MODEL, av1_dec->global_model.dma);552}553 554static int rockchip_vpu981_av1_tile_log2(int target)555{556 int k;557 558 /*559 * returns the smallest value for k such that 1 << k is greater560 * than or equal to target561 */562 for (k = 0; (1 << k) < target; k++);563 564 return k;565}566 567static void rockchip_vpu981_av1_dec_set_tile_info(struct hantro_ctx *ctx)568{569 struct hantro_av1_dec_hw_ctx *av1_dec = &ctx->av1_dec;570 struct hantro_av1_dec_ctrls *ctrls = &av1_dec->ctrls;571 const struct v4l2_av1_tile_info *tile_info = &ctrls->frame->tile_info;572 const struct v4l2_ctrl_av1_tile_group_entry *group_entry =573 ctrls->tile_group_entry;574 int context_update_y =575 tile_info->context_update_tile_id / tile_info->tile_cols;576 int context_update_x =577 tile_info->context_update_tile_id % tile_info->tile_cols;578 int context_update_tile_id =579 context_update_x * tile_info->tile_rows + context_update_y;580 u8 *dst = av1_dec->tile_info.cpu;581 struct hantro_dev *vpu = ctx->dev;582 int tile0, tile1;583 584 memset(dst, 0, av1_dec->tile_info.size);585 586 for (tile0 = 0; tile0 < tile_info->tile_cols; tile0++) {587 for (tile1 = 0; tile1 < tile_info->tile_rows; tile1++) {588 int tile_id = tile1 * tile_info->tile_cols + tile0;589 u32 start, end;590 u32 y0 =591 tile_info->height_in_sbs_minus_1[tile1] + 1;592 u32 x0 = tile_info->width_in_sbs_minus_1[tile0] + 1;593 594 /* tile size in SB units (width,height) */595 *dst++ = x0;596 *dst++ = 0;597 *dst++ = 0;598 *dst++ = 0;599 *dst++ = y0;600 *dst++ = 0;601 *dst++ = 0;602 *dst++ = 0;603 604 /* tile start position */605 start = group_entry[tile_id].tile_offset - group_entry[0].tile_offset;606 *dst++ = start & 255;607 *dst++ = (start >> 8) & 255;608 *dst++ = (start >> 16) & 255;609 *dst++ = (start >> 24) & 255;610 611 /* number of bytes in tile data */612 end = start + group_entry[tile_id].tile_size;613 *dst++ = end & 255;614 *dst++ = (end >> 8) & 255;615 *dst++ = (end >> 16) & 255;616 *dst++ = (end >> 24) & 255;617 }618 }619 620 hantro_reg_write(vpu, &av1_multicore_expect_context_update, !!(context_update_x == 0));621 hantro_reg_write(vpu, &av1_tile_enable,622 !!((tile_info->tile_cols > 1) || (tile_info->tile_rows > 1)));623 hantro_reg_write(vpu, &av1_num_tile_cols_8k, tile_info->tile_cols);624 hantro_reg_write(vpu, &av1_num_tile_rows_8k, tile_info->tile_rows);625 hantro_reg_write(vpu, &av1_context_update_tile_id, context_update_tile_id);626 hantro_reg_write(vpu, &av1_tile_transpose, 1);627 if (rockchip_vpu981_av1_tile_log2(tile_info->tile_cols) ||628 rockchip_vpu981_av1_tile_log2(tile_info->tile_rows))629 hantro_reg_write(vpu, &av1_dec_tile_size_mag, tile_info->tile_size_bytes - 1);630 else631 hantro_reg_write(vpu, &av1_dec_tile_size_mag, 3);632 633 hantro_write_addr(vpu, AV1_TILE_BASE, av1_dec->tile_info.dma);634}635 636static int rockchip_vpu981_av1_dec_get_dist(struct hantro_ctx *ctx,637 int a, int b)638{639 struct hantro_av1_dec_hw_ctx *av1_dec = &ctx->av1_dec;640 struct hantro_av1_dec_ctrls *ctrls = &av1_dec->ctrls;641 int bits = ctrls->sequence->order_hint_bits - 1;642 int diff, m;643 644 if (!ctrls->sequence->order_hint_bits)645 return 0;646 647 diff = a - b;648 m = 1 << bits;649 diff = (diff & (m - 1)) - (diff & m);650 651 return diff;652}653 654static void rockchip_vpu981_av1_dec_set_frame_sign_bias(struct hantro_ctx *ctx)655{656 struct hantro_av1_dec_hw_ctx *av1_dec = &ctx->av1_dec;657 struct hantro_av1_dec_ctrls *ctrls = &av1_dec->ctrls;658 const struct v4l2_ctrl_av1_frame *frame = ctrls->frame;659 const struct v4l2_ctrl_av1_sequence *sequence = ctrls->sequence;660 int i;661 662 if (!sequence->order_hint_bits || IS_INTRA(frame->frame_type)) {663 for (i = 0; i < V4L2_AV1_TOTAL_REFS_PER_FRAME; i++)664 av1_dec->ref_frame_sign_bias[i] = 0;665 666 return;667 }668 // Identify the nearest forward and backward references.669 for (i = 0; i < V4L2_AV1_TOTAL_REFS_PER_FRAME - 1; i++) {670 if (rockchip_vpu981_get_frame_index(ctx, i) >= 0) {671 int rel_off =672 rockchip_vpu981_av1_dec_get_dist(ctx,673 rockchip_vpu981_get_order_hint(ctx, i),674 frame->order_hint);675 av1_dec->ref_frame_sign_bias[i + 1] = (rel_off <= 0) ? 0 : 1;676 }677 }678}679 680static bool681rockchip_vpu981_av1_dec_set_ref(struct hantro_ctx *ctx, int ref, int idx,682 int width, int height)683{684 struct hantro_av1_dec_hw_ctx *av1_dec = &ctx->av1_dec;685 struct hantro_av1_dec_ctrls *ctrls = &av1_dec->ctrls;686 const struct v4l2_ctrl_av1_frame *frame = ctrls->frame;687 struct hantro_dev *vpu = ctx->dev;688 struct hantro_decoded_buffer *dst;689 dma_addr_t luma_addr, chroma_addr, mv_addr = 0;690 size_t cr_offset = rockchip_vpu981_av1_dec_luma_size(ctx);691 size_t mv_offset = rockchip_vpu981_av1_dec_chroma_size(ctx);692 int cur_width = frame->frame_width_minus_1 + 1;693 int cur_height = frame->frame_height_minus_1 + 1;694 int scale_width =695 ((width << AV1_REF_SCALE_SHIFT) + cur_width / 2) / cur_width;696 int scale_height =697 ((height << AV1_REF_SCALE_SHIFT) + cur_height / 2) / cur_height;698 699 switch (ref) {700 case 0:701 hantro_reg_write(vpu, &av1_ref0_height, height);702 hantro_reg_write(vpu, &av1_ref0_width, width);703 hantro_reg_write(vpu, &av1_ref0_ver_scale, scale_width);704 hantro_reg_write(vpu, &av1_ref0_hor_scale, scale_height);705 break;706 case 1:707 hantro_reg_write(vpu, &av1_ref1_height, height);708 hantro_reg_write(vpu, &av1_ref1_width, width);709 hantro_reg_write(vpu, &av1_ref1_ver_scale, scale_width);710 hantro_reg_write(vpu, &av1_ref1_hor_scale, scale_height);711 break;712 case 2:713 hantro_reg_write(vpu, &av1_ref2_height, height);714 hantro_reg_write(vpu, &av1_ref2_width, width);715 hantro_reg_write(vpu, &av1_ref2_ver_scale, scale_width);716 hantro_reg_write(vpu, &av1_ref2_hor_scale, scale_height);717 break;718 case 3:719 hantro_reg_write(vpu, &av1_ref3_height, height);720 hantro_reg_write(vpu, &av1_ref3_width, width);721 hantro_reg_write(vpu, &av1_ref3_ver_scale, scale_width);722 hantro_reg_write(vpu, &av1_ref3_hor_scale, scale_height);723 break;724 case 4:725 hantro_reg_write(vpu, &av1_ref4_height, height);726 hantro_reg_write(vpu, &av1_ref4_width, width);727 hantro_reg_write(vpu, &av1_ref4_ver_scale, scale_width);728 hantro_reg_write(vpu, &av1_ref4_hor_scale, scale_height);729 break;730 case 5:731 hantro_reg_write(vpu, &av1_ref5_height, height);732 hantro_reg_write(vpu, &av1_ref5_width, width);733 hantro_reg_write(vpu, &av1_ref5_ver_scale, scale_width);734 hantro_reg_write(vpu, &av1_ref5_hor_scale, scale_height);735 break;736 case 6:737 hantro_reg_write(vpu, &av1_ref6_height, height);738 hantro_reg_write(vpu, &av1_ref6_width, width);739 hantro_reg_write(vpu, &av1_ref6_ver_scale, scale_width);740 hantro_reg_write(vpu, &av1_ref6_hor_scale, scale_height);741 break;742 default:743 pr_warn("AV1 invalid reference frame index\n");744 }745 746 dst = vb2_to_hantro_decoded_buf(&av1_dec->frame_refs[idx].vb2_ref->vb2_buf);747 luma_addr = hantro_get_dec_buf_addr(ctx, &dst->base.vb.vb2_buf);748 chroma_addr = luma_addr + cr_offset;749 mv_addr = luma_addr + mv_offset;750 751 hantro_write_addr(vpu, AV1_REFERENCE_Y(ref), luma_addr);752 hantro_write_addr(vpu, AV1_REFERENCE_CB(ref), chroma_addr);753 hantro_write_addr(vpu, AV1_REFERENCE_MV(ref), mv_addr);754 755 return (scale_width != (1 << AV1_REF_SCALE_SHIFT)) ||756 (scale_height != (1 << AV1_REF_SCALE_SHIFT));757}758 759static void rockchip_vpu981_av1_dec_set_sign_bias(struct hantro_ctx *ctx,760 int ref, int val)761{762 struct hantro_dev *vpu = ctx->dev;763 764 switch (ref) {765 case 0:766 hantro_reg_write(vpu, &av1_ref0_sign_bias, val);767 break;768 case 1:769 hantro_reg_write(vpu, &av1_ref1_sign_bias, val);770 break;771 case 2:772 hantro_reg_write(vpu, &av1_ref2_sign_bias, val);773 break;774 case 3:775 hantro_reg_write(vpu, &av1_ref3_sign_bias, val);776 break;777 case 4:778 hantro_reg_write(vpu, &av1_ref4_sign_bias, val);779 break;780 case 5:781 hantro_reg_write(vpu, &av1_ref5_sign_bias, val);782 break;783 case 6:784 hantro_reg_write(vpu, &av1_ref6_sign_bias, val);785 break;786 default:787 pr_warn("AV1 invalid sign bias index\n");788 break;789 }790}791 792static void rockchip_vpu981_av1_dec_set_segmentation(struct hantro_ctx *ctx)793{794 struct hantro_av1_dec_hw_ctx *av1_dec = &ctx->av1_dec;795 struct hantro_av1_dec_ctrls *ctrls = &av1_dec->ctrls;796 const struct v4l2_ctrl_av1_frame *frame = ctrls->frame;797 const struct v4l2_av1_segmentation *seg = &frame->segmentation;798 u32 segval[V4L2_AV1_MAX_SEGMENTS][V4L2_AV1_SEG_LVL_MAX] = { 0 };799 struct hantro_dev *vpu = ctx->dev;800 u8 segsign = 0, preskip_segid = 0, last_active_seg = 0, i, j;801 802 if (!!(seg->flags & V4L2_AV1_SEGMENTATION_FLAG_ENABLED) &&803 frame->primary_ref_frame < V4L2_AV1_REFS_PER_FRAME) {804 int idx = rockchip_vpu981_get_frame_index(ctx, frame->primary_ref_frame);805 806 if (idx >= 0) {807 dma_addr_t luma_addr, mv_addr = 0;808 struct hantro_decoded_buffer *seg;809 size_t mv_offset = rockchip_vpu981_av1_dec_chroma_size(ctx);810 811 seg = vb2_to_hantro_decoded_buf(&av1_dec->frame_refs[idx].vb2_ref->vb2_buf);812 luma_addr = hantro_get_dec_buf_addr(ctx, &seg->base.vb.vb2_buf);813 mv_addr = luma_addr + mv_offset;814 815 hantro_write_addr(vpu, AV1_SEGMENTATION, mv_addr);816 hantro_reg_write(vpu, &av1_use_temporal3_mvs, 1);817 }818 }819 820 hantro_reg_write(vpu, &av1_segment_temp_upd_e,821 !!(seg->flags & V4L2_AV1_SEGMENTATION_FLAG_TEMPORAL_UPDATE));822 hantro_reg_write(vpu, &av1_segment_upd_e,823 !!(seg->flags & V4L2_AV1_SEGMENTATION_FLAG_UPDATE_MAP));824 hantro_reg_write(vpu, &av1_segment_e,825 !!(seg->flags & V4L2_AV1_SEGMENTATION_FLAG_ENABLED));826 827 hantro_reg_write(vpu, &av1_error_resilient,828 !!(frame->flags & V4L2_AV1_FRAME_FLAG_ERROR_RESILIENT_MODE));829 830 if (IS_INTRA(frame->frame_type) ||831 !!(frame->flags & V4L2_AV1_FRAME_FLAG_ERROR_RESILIENT_MODE)) {832 hantro_reg_write(vpu, &av1_use_temporal3_mvs, 0);833 }834 835 if (seg->flags & V4L2_AV1_SEGMENTATION_FLAG_ENABLED) {836 int s;837 838 for (s = 0; s < V4L2_AV1_MAX_SEGMENTS; s++) {839 if (seg->feature_enabled[s] &840 V4L2_AV1_SEGMENT_FEATURE_ENABLED(V4L2_AV1_SEG_LVL_ALT_Q)) {841 segval[s][V4L2_AV1_SEG_LVL_ALT_Q] =842 clamp(abs(seg->feature_data[s][V4L2_AV1_SEG_LVL_ALT_Q]),843 0, 255);844 segsign |=845 (seg->feature_data[s][V4L2_AV1_SEG_LVL_ALT_Q] < 0) << s;846 }847 848 if (seg->feature_enabled[s] &849 V4L2_AV1_SEGMENT_FEATURE_ENABLED(V4L2_AV1_SEG_LVL_ALT_LF_Y_V))850 segval[s][V4L2_AV1_SEG_LVL_ALT_LF_Y_V] =851 clamp(abs(seg->feature_data[s][V4L2_AV1_SEG_LVL_ALT_LF_Y_V]),852 -63, 63);853 854 if (seg->feature_enabled[s] &855 V4L2_AV1_SEGMENT_FEATURE_ENABLED(V4L2_AV1_SEG_LVL_ALT_LF_Y_H))856 segval[s][V4L2_AV1_SEG_LVL_ALT_LF_Y_H] =857 clamp(abs(seg->feature_data[s][V4L2_AV1_SEG_LVL_ALT_LF_Y_H]),858 -63, 63);859 860 if (seg->feature_enabled[s] &861 V4L2_AV1_SEGMENT_FEATURE_ENABLED(V4L2_AV1_SEG_LVL_ALT_LF_U))862 segval[s][V4L2_AV1_SEG_LVL_ALT_LF_U] =863 clamp(abs(seg->feature_data[s][V4L2_AV1_SEG_LVL_ALT_LF_U]),864 -63, 63);865 866 if (seg->feature_enabled[s] &867 V4L2_AV1_SEGMENT_FEATURE_ENABLED(V4L2_AV1_SEG_LVL_ALT_LF_V))868 segval[s][V4L2_AV1_SEG_LVL_ALT_LF_V] =869 clamp(abs(seg->feature_data[s][V4L2_AV1_SEG_LVL_ALT_LF_V]),870 -63, 63);871 872 if (frame->frame_type && seg->feature_enabled[s] &873 V4L2_AV1_SEGMENT_FEATURE_ENABLED(V4L2_AV1_SEG_LVL_REF_FRAME))874 segval[s][V4L2_AV1_SEG_LVL_REF_FRAME]++;875 876 if (seg->feature_enabled[s] &877 V4L2_AV1_SEGMENT_FEATURE_ENABLED(V4L2_AV1_SEG_LVL_REF_SKIP))878 segval[s][V4L2_AV1_SEG_LVL_REF_SKIP] = 1;879 880 if (seg->feature_enabled[s] &881 V4L2_AV1_SEGMENT_FEATURE_ENABLED(V4L2_AV1_SEG_LVL_REF_GLOBALMV))882 segval[s][V4L2_AV1_SEG_LVL_REF_GLOBALMV] = 1;883 }884 }885 886 for (i = 0; i < V4L2_AV1_MAX_SEGMENTS; i++) {887 for (j = 0; j < V4L2_AV1_SEG_LVL_MAX; j++) {888 if (seg->feature_enabled[i]889 & V4L2_AV1_SEGMENT_FEATURE_ENABLED(j)) {890 preskip_segid |= (j >= V4L2_AV1_SEG_LVL_REF_FRAME);891 last_active_seg = max(i, last_active_seg);892 }893 }894 }895 896 hantro_reg_write(vpu, &av1_last_active_seg, last_active_seg);897 hantro_reg_write(vpu, &av1_preskip_segid, preskip_segid);898 899 hantro_reg_write(vpu, &av1_seg_quant_sign, segsign);900 901 /* Write QP, filter level, ref frame and skip for every segment */902 hantro_reg_write(vpu, &av1_quant_seg0,903 segval[0][V4L2_AV1_SEG_LVL_ALT_Q]);904 hantro_reg_write(vpu, &av1_filt_level_delta0_seg0,905 segval[0][V4L2_AV1_SEG_LVL_ALT_LF_Y_V]);906 hantro_reg_write(vpu, &av1_filt_level_delta1_seg0,907 segval[0][V4L2_AV1_SEG_LVL_ALT_LF_Y_H]);908 hantro_reg_write(vpu, &av1_filt_level_delta2_seg0,909 segval[0][V4L2_AV1_SEG_LVL_ALT_LF_U]);910 hantro_reg_write(vpu, &av1_filt_level_delta3_seg0,911 segval[0][V4L2_AV1_SEG_LVL_ALT_LF_V]);912 hantro_reg_write(vpu, &av1_refpic_seg0,913 segval[0][V4L2_AV1_SEG_LVL_REF_FRAME]);914 hantro_reg_write(vpu, &av1_skip_seg0,915 segval[0][V4L2_AV1_SEG_LVL_REF_SKIP]);916 hantro_reg_write(vpu, &av1_global_mv_seg0,917 segval[0][V4L2_AV1_SEG_LVL_REF_GLOBALMV]);918 919 hantro_reg_write(vpu, &av1_quant_seg1,920 segval[1][V4L2_AV1_SEG_LVL_ALT_Q]);921 hantro_reg_write(vpu, &av1_filt_level_delta0_seg1,922 segval[1][V4L2_AV1_SEG_LVL_ALT_LF_Y_V]);923 hantro_reg_write(vpu, &av1_filt_level_delta1_seg1,924 segval[1][V4L2_AV1_SEG_LVL_ALT_LF_Y_H]);925 hantro_reg_write(vpu, &av1_filt_level_delta2_seg1,926 segval[1][V4L2_AV1_SEG_LVL_ALT_LF_U]);927 hantro_reg_write(vpu, &av1_filt_level_delta3_seg1,928 segval[1][V4L2_AV1_SEG_LVL_ALT_LF_V]);929 hantro_reg_write(vpu, &av1_refpic_seg1,930 segval[1][V4L2_AV1_SEG_LVL_REF_FRAME]);931 hantro_reg_write(vpu, &av1_skip_seg1,932 segval[1][V4L2_AV1_SEG_LVL_REF_SKIP]);933 hantro_reg_write(vpu, &av1_global_mv_seg1,934 segval[1][V4L2_AV1_SEG_LVL_REF_GLOBALMV]);935 936 hantro_reg_write(vpu, &av1_quant_seg2,937 segval[2][V4L2_AV1_SEG_LVL_ALT_Q]);938 hantro_reg_write(vpu, &av1_filt_level_delta0_seg2,939 segval[2][V4L2_AV1_SEG_LVL_ALT_LF_Y_V]);940 hantro_reg_write(vpu, &av1_filt_level_delta1_seg2,941 segval[2][V4L2_AV1_SEG_LVL_ALT_LF_Y_H]);942 hantro_reg_write(vpu, &av1_filt_level_delta2_seg2,943 segval[2][V4L2_AV1_SEG_LVL_ALT_LF_U]);944 hantro_reg_write(vpu, &av1_filt_level_delta3_seg2,945 segval[2][V4L2_AV1_SEG_LVL_ALT_LF_V]);946 hantro_reg_write(vpu, &av1_refpic_seg2,947 segval[2][V4L2_AV1_SEG_LVL_REF_FRAME]);948 hantro_reg_write(vpu, &av1_skip_seg2,949 segval[2][V4L2_AV1_SEG_LVL_REF_SKIP]);950 hantro_reg_write(vpu, &av1_global_mv_seg2,951 segval[2][V4L2_AV1_SEG_LVL_REF_GLOBALMV]);952 953 hantro_reg_write(vpu, &av1_quant_seg3,954 segval[3][V4L2_AV1_SEG_LVL_ALT_Q]);955 hantro_reg_write(vpu, &av1_filt_level_delta0_seg3,956 segval[3][V4L2_AV1_SEG_LVL_ALT_LF_Y_V]);957 hantro_reg_write(vpu, &av1_filt_level_delta1_seg3,958 segval[3][V4L2_AV1_SEG_LVL_ALT_LF_Y_H]);959 hantro_reg_write(vpu, &av1_filt_level_delta2_seg3,960 segval[3][V4L2_AV1_SEG_LVL_ALT_LF_U]);961 hantro_reg_write(vpu, &av1_filt_level_delta3_seg3,962 segval[3][V4L2_AV1_SEG_LVL_ALT_LF_V]);963 hantro_reg_write(vpu, &av1_refpic_seg3,964 segval[3][V4L2_AV1_SEG_LVL_REF_FRAME]);965 hantro_reg_write(vpu, &av1_skip_seg3,966 segval[3][V4L2_AV1_SEG_LVL_REF_SKIP]);967 hantro_reg_write(vpu, &av1_global_mv_seg3,968 segval[3][V4L2_AV1_SEG_LVL_REF_GLOBALMV]);969 970 hantro_reg_write(vpu, &av1_quant_seg4,971 segval[4][V4L2_AV1_SEG_LVL_ALT_Q]);972 hantro_reg_write(vpu, &av1_filt_level_delta0_seg4,973 segval[4][V4L2_AV1_SEG_LVL_ALT_LF_Y_V]);974 hantro_reg_write(vpu, &av1_filt_level_delta1_seg4,975 segval[4][V4L2_AV1_SEG_LVL_ALT_LF_Y_H]);976 hantro_reg_write(vpu, &av1_filt_level_delta2_seg4,977 segval[4][V4L2_AV1_SEG_LVL_ALT_LF_U]);978 hantro_reg_write(vpu, &av1_filt_level_delta3_seg4,979 segval[4][V4L2_AV1_SEG_LVL_ALT_LF_V]);980 hantro_reg_write(vpu, &av1_refpic_seg4,981 segval[4][V4L2_AV1_SEG_LVL_REF_FRAME]);982 hantro_reg_write(vpu, &av1_skip_seg4,983 segval[4][V4L2_AV1_SEG_LVL_REF_SKIP]);984 hantro_reg_write(vpu, &av1_global_mv_seg4,985 segval[4][V4L2_AV1_SEG_LVL_REF_GLOBALMV]);986 987 hantro_reg_write(vpu, &av1_quant_seg5,988 segval[5][V4L2_AV1_SEG_LVL_ALT_Q]);989 hantro_reg_write(vpu, &av1_filt_level_delta0_seg5,990 segval[5][V4L2_AV1_SEG_LVL_ALT_LF_Y_V]);991 hantro_reg_write(vpu, &av1_filt_level_delta1_seg5,992 segval[5][V4L2_AV1_SEG_LVL_ALT_LF_Y_H]);993 hantro_reg_write(vpu, &av1_filt_level_delta2_seg5,994 segval[5][V4L2_AV1_SEG_LVL_ALT_LF_U]);995 hantro_reg_write(vpu, &av1_filt_level_delta3_seg5,996 segval[5][V4L2_AV1_SEG_LVL_ALT_LF_V]);997 hantro_reg_write(vpu, &av1_refpic_seg5,998 segval[5][V4L2_AV1_SEG_LVL_REF_FRAME]);999 hantro_reg_write(vpu, &av1_skip_seg5,1000 segval[5][V4L2_AV1_SEG_LVL_REF_SKIP]);1001 hantro_reg_write(vpu, &av1_global_mv_seg5,1002 segval[5][V4L2_AV1_SEG_LVL_REF_GLOBALMV]);1003 1004 hantro_reg_write(vpu, &av1_quant_seg6,1005 segval[6][V4L2_AV1_SEG_LVL_ALT_Q]);1006 hantro_reg_write(vpu, &av1_filt_level_delta0_seg6,1007 segval[6][V4L2_AV1_SEG_LVL_ALT_LF_Y_V]);1008 hantro_reg_write(vpu, &av1_filt_level_delta1_seg6,1009 segval[6][V4L2_AV1_SEG_LVL_ALT_LF_Y_H]);1010 hantro_reg_write(vpu, &av1_filt_level_delta2_seg6,1011 segval[6][V4L2_AV1_SEG_LVL_ALT_LF_U]);1012 hantro_reg_write(vpu, &av1_filt_level_delta3_seg6,1013 segval[6][V4L2_AV1_SEG_LVL_ALT_LF_V]);1014 hantro_reg_write(vpu, &av1_refpic_seg6,1015 segval[6][V4L2_AV1_SEG_LVL_REF_FRAME]);1016 hantro_reg_write(vpu, &av1_skip_seg6,1017 segval[6][V4L2_AV1_SEG_LVL_REF_SKIP]);1018 hantro_reg_write(vpu, &av1_global_mv_seg6,1019 segval[6][V4L2_AV1_SEG_LVL_REF_GLOBALMV]);1020 1021 hantro_reg_write(vpu, &av1_quant_seg7,1022 segval[7][V4L2_AV1_SEG_LVL_ALT_Q]);1023 hantro_reg_write(vpu, &av1_filt_level_delta0_seg7,1024 segval[7][V4L2_AV1_SEG_LVL_ALT_LF_Y_V]);1025 hantro_reg_write(vpu, &av1_filt_level_delta1_seg7,1026 segval[7][V4L2_AV1_SEG_LVL_ALT_LF_Y_H]);1027 hantro_reg_write(vpu, &av1_filt_level_delta2_seg7,1028 segval[7][V4L2_AV1_SEG_LVL_ALT_LF_U]);1029 hantro_reg_write(vpu, &av1_filt_level_delta3_seg7,1030 segval[7][V4L2_AV1_SEG_LVL_ALT_LF_V]);1031 hantro_reg_write(vpu, &av1_refpic_seg7,1032 segval[7][V4L2_AV1_SEG_LVL_REF_FRAME]);1033 hantro_reg_write(vpu, &av1_skip_seg7,1034 segval[7][V4L2_AV1_SEG_LVL_REF_SKIP]);1035 hantro_reg_write(vpu, &av1_global_mv_seg7,1036 segval[7][V4L2_AV1_SEG_LVL_REF_GLOBALMV]);1037}1038 1039static bool rockchip_vpu981_av1_dec_is_lossless(struct hantro_ctx *ctx)1040{1041 struct hantro_av1_dec_hw_ctx *av1_dec = &ctx->av1_dec;1042 struct hantro_av1_dec_ctrls *ctrls = &av1_dec->ctrls;1043 const struct v4l2_ctrl_av1_frame *frame = ctrls->frame;1044 const struct v4l2_av1_segmentation *segmentation = &frame->segmentation;1045 const struct v4l2_av1_quantization *quantization = &frame->quantization;1046 int i;1047 1048 for (i = 0; i < V4L2_AV1_MAX_SEGMENTS; i++) {1049 int qindex = quantization->base_q_idx;1050 1051 if (segmentation->feature_enabled[i] &1052 V4L2_AV1_SEGMENT_FEATURE_ENABLED(V4L2_AV1_SEG_LVL_ALT_Q)) {1053 qindex += segmentation->feature_data[i][V4L2_AV1_SEG_LVL_ALT_Q];1054 }1055 qindex = clamp(qindex, 0, 255);1056 1057 if (qindex ||1058 quantization->delta_q_y_dc ||1059 quantization->delta_q_u_dc ||1060 quantization->delta_q_u_ac ||1061 quantization->delta_q_v_dc ||1062 quantization->delta_q_v_ac)1063 return false;1064 }1065 return true;1066}1067 1068static void rockchip_vpu981_av1_dec_set_loopfilter(struct hantro_ctx *ctx)1069{1070 struct hantro_av1_dec_hw_ctx *av1_dec = &ctx->av1_dec;1071 struct hantro_av1_dec_ctrls *ctrls = &av1_dec->ctrls;1072 const struct v4l2_ctrl_av1_frame *frame = ctrls->frame;1073 const struct v4l2_av1_loop_filter *loop_filter = &frame->loop_filter;1074 bool filtering_dis = (loop_filter->level[0] == 0) && (loop_filter->level[1] == 0);1075 struct hantro_dev *vpu = ctx->dev;1076 1077 hantro_reg_write(vpu, &av1_filtering_dis, filtering_dis);1078 hantro_reg_write(vpu, &av1_filt_level_base_gt32, loop_filter->level[0] > 32);1079 hantro_reg_write(vpu, &av1_filt_sharpness, loop_filter->sharpness);1080 1081 hantro_reg_write(vpu, &av1_filt_level0, loop_filter->level[0]);1082 hantro_reg_write(vpu, &av1_filt_level1, loop_filter->level[1]);1083 hantro_reg_write(vpu, &av1_filt_level2, loop_filter->level[2]);1084 hantro_reg_write(vpu, &av1_filt_level3, loop_filter->level[3]);1085 1086 if (loop_filter->flags & V4L2_AV1_LOOP_FILTER_FLAG_DELTA_ENABLED &&1087 !rockchip_vpu981_av1_dec_is_lossless(ctx) &&1088 !(frame->flags & V4L2_AV1_FRAME_FLAG_ALLOW_INTRABC)) {1089 hantro_reg_write(vpu, &av1_filt_ref_adj_0,1090 loop_filter->ref_deltas[0]);1091 hantro_reg_write(vpu, &av1_filt_ref_adj_1,1092 loop_filter->ref_deltas[1]);1093 hantro_reg_write(vpu, &av1_filt_ref_adj_2,1094 loop_filter->ref_deltas[2]);1095 hantro_reg_write(vpu, &av1_filt_ref_adj_3,1096 loop_filter->ref_deltas[3]);1097 hantro_reg_write(vpu, &av1_filt_ref_adj_4,1098 loop_filter->ref_deltas[4]);1099 hantro_reg_write(vpu, &av1_filt_ref_adj_5,1100 loop_filter->ref_deltas[5]);1101 hantro_reg_write(vpu, &av1_filt_ref_adj_6,1102 loop_filter->ref_deltas[6]);1103 hantro_reg_write(vpu, &av1_filt_ref_adj_7,1104 loop_filter->ref_deltas[7]);1105 hantro_reg_write(vpu, &av1_filt_mb_adj_0,1106 loop_filter->mode_deltas[0]);1107 hantro_reg_write(vpu, &av1_filt_mb_adj_1,1108 loop_filter->mode_deltas[1]);1109 } else {1110 hantro_reg_write(vpu, &av1_filt_ref_adj_0, 0);1111 hantro_reg_write(vpu, &av1_filt_ref_adj_1, 0);1112 hantro_reg_write(vpu, &av1_filt_ref_adj_2, 0);1113 hantro_reg_write(vpu, &av1_filt_ref_adj_3, 0);1114 hantro_reg_write(vpu, &av1_filt_ref_adj_4, 0);1115 hantro_reg_write(vpu, &av1_filt_ref_adj_5, 0);1116 hantro_reg_write(vpu, &av1_filt_ref_adj_6, 0);1117 hantro_reg_write(vpu, &av1_filt_ref_adj_7, 0);1118 hantro_reg_write(vpu, &av1_filt_mb_adj_0, 0);1119 hantro_reg_write(vpu, &av1_filt_mb_adj_1, 0);1120 }1121 1122 hantro_write_addr(vpu, AV1_DB_DATA_COL, av1_dec->db_data_col.dma);1123 hantro_write_addr(vpu, AV1_DB_CTRL_COL, av1_dec->db_ctrl_col.dma);1124}1125 1126static void rockchip_vpu981_av1_dec_update_prob(struct hantro_ctx *ctx)1127{1128 struct hantro_av1_dec_hw_ctx *av1_dec = &ctx->av1_dec;1129 struct hantro_av1_dec_ctrls *ctrls = &av1_dec->ctrls;1130 const struct v4l2_ctrl_av1_frame *frame = ctrls->frame;1131 bool frame_is_intra = IS_INTRA(frame->frame_type);1132 struct av1cdfs *out_cdfs = (struct av1cdfs *)av1_dec->prob_tbl_out.cpu;1133 int i;1134 1135 if (frame->flags & V4L2_AV1_FRAME_FLAG_DISABLE_FRAME_END_UPDATE_CDF)1136 return;1137 1138 for (i = 0; i < NUM_REF_FRAMES; i++) {1139 if (frame->refresh_frame_flags & BIT(i)) {1140 struct mvcdfs stored_mv_cdf;1141 1142 rockchip_av1_get_cdfs(ctx, i);1143 stored_mv_cdf = av1_dec->cdfs->mv_cdf;1144 *av1_dec->cdfs = *out_cdfs;1145 if (frame_is_intra) {1146 av1_dec->cdfs->mv_cdf = stored_mv_cdf;1147 *av1_dec->cdfs_ndvc = out_cdfs->mv_cdf;1148 }1149 rockchip_av1_store_cdfs(ctx,1150 frame->refresh_frame_flags);1151 break;1152 }1153 }1154}1155 1156void rockchip_vpu981_av1_dec_done(struct hantro_ctx *ctx)1157{1158 rockchip_vpu981_av1_dec_update_prob(ctx);1159}1160 1161static void rockchip_vpu981_av1_dec_set_prob(struct hantro_ctx *ctx)1162{1163 struct hantro_av1_dec_hw_ctx *av1_dec = &ctx->av1_dec;1164 struct hantro_av1_dec_ctrls *ctrls = &av1_dec->ctrls;1165 const struct v4l2_ctrl_av1_frame *frame = ctrls->frame;1166 const struct v4l2_av1_quantization *quantization = &frame->quantization;1167 struct hantro_dev *vpu = ctx->dev;1168 bool error_resilient_mode =1169 !!(frame->flags & V4L2_AV1_FRAME_FLAG_ERROR_RESILIENT_MODE);1170 bool frame_is_intra = IS_INTRA(frame->frame_type);1171 1172 if (error_resilient_mode || frame_is_intra ||1173 frame->primary_ref_frame == AV1_PRIMARY_REF_NONE) {1174 av1_dec->cdfs = &av1_dec->default_cdfs;1175 av1_dec->cdfs_ndvc = &av1_dec->default_cdfs_ndvc;1176 rockchip_av1_default_coeff_probs(quantization->base_q_idx,1177 av1_dec->cdfs);1178 } else {1179 rockchip_av1_get_cdfs(ctx, frame->ref_frame_idx[frame->primary_ref_frame]);1180 }1181 rockchip_av1_store_cdfs(ctx, frame->refresh_frame_flags);1182 1183 memcpy(av1_dec->prob_tbl.cpu, av1_dec->cdfs, sizeof(struct av1cdfs));1184 1185 if (frame_is_intra) {1186 int mv_offset = offsetof(struct av1cdfs, mv_cdf);1187 /* Overwrite MV context area with intrabc MV context */1188 memcpy(av1_dec->prob_tbl.cpu + mv_offset, av1_dec->cdfs_ndvc,1189 sizeof(struct mvcdfs));1190 }1191 1192 hantro_write_addr(vpu, AV1_PROP_TABLE_OUT, av1_dec->prob_tbl_out.dma);1193 hantro_write_addr(vpu, AV1_PROP_TABLE, av1_dec->prob_tbl.dma);1194}1195 1196static void1197rockchip_vpu981_av1_dec_init_scaling_function(const u8 *values, const u8 *scaling,1198 u8 num_points, u8 *scaling_lut)1199{1200 int i, point;1201 1202 if (num_points == 0) {1203 memset(scaling_lut, 0, 256);1204 return;1205 }1206 1207 for (point = 0; point < num_points - 1; point++) {1208 int x;1209 s32 delta_y = scaling[point + 1] - scaling[point];1210 s32 delta_x = values[point + 1] - values[point];1211 s64 delta =1212 delta_x ? delta_y * ((65536 + (delta_x >> 1)) /1213 delta_x) : 0;1214 1215 for (x = 0; x < delta_x; x++) {1216 scaling_lut[values[point] + x] =1217 scaling[point] +1218 (s32)((x * delta + 32768) >> 16);1219 }1220 }1221 1222 for (i = values[num_points - 1]; i < 256; i++)1223 scaling_lut[i] = scaling[num_points - 1];1224}1225 1226static void rockchip_vpu981_av1_dec_set_fgs(struct hantro_ctx *ctx)1227{1228 struct hantro_av1_dec_hw_ctx *av1_dec = &ctx->av1_dec;1229 struct hantro_av1_dec_ctrls *ctrls = &av1_dec->ctrls;1230 const struct v4l2_ctrl_av1_film_grain *film_grain = ctrls->film_grain;1231 struct rockchip_av1_film_grain *fgmem = av1_dec->film_grain.cpu;1232 struct hantro_dev *vpu = ctx->dev;1233 bool scaling_from_luma =1234 !!(film_grain->flags & V4L2_AV1_FILM_GRAIN_FLAG_CHROMA_SCALING_FROM_LUMA);1235 s32 (*ar_coeffs_y)[24];1236 s32 (*ar_coeffs_cb)[25];1237 s32 (*ar_coeffs_cr)[25];1238 s32 (*luma_grain_block)[73][82];1239 s32 (*cb_grain_block)[38][44];1240 s32 (*cr_grain_block)[38][44];1241 s32 ar_coeff_lag, ar_coeff_shift;1242 s32 grain_scale_shift, bitdepth;1243 s32 grain_center, grain_min, grain_max;1244 int i, j;1245 1246 hantro_reg_write(vpu, &av1_apply_grain, 0);1247 1248 if (!(film_grain->flags & V4L2_AV1_FILM_GRAIN_FLAG_APPLY_GRAIN)) {1249 hantro_reg_write(vpu, &av1_num_y_points_b, 0);1250 hantro_reg_write(vpu, &av1_num_cb_points_b, 0);1251 hantro_reg_write(vpu, &av1_num_cr_points_b, 0);1252 hantro_reg_write(vpu, &av1_scaling_shift, 0);1253 hantro_reg_write(vpu, &av1_cb_mult, 0);1254 hantro_reg_write(vpu, &av1_cb_luma_mult, 0);1255 hantro_reg_write(vpu, &av1_cb_offset, 0);1256 hantro_reg_write(vpu, &av1_cr_mult, 0);1257 hantro_reg_write(vpu, &av1_cr_luma_mult, 0);1258 hantro_reg_write(vpu, &av1_cr_offset, 0);1259 hantro_reg_write(vpu, &av1_overlap_flag, 0);1260 hantro_reg_write(vpu, &av1_clip_to_restricted_range, 0);1261 hantro_reg_write(vpu, &av1_chroma_scaling_from_luma, 0);1262 hantro_reg_write(vpu, &av1_random_seed, 0);1263 hantro_write_addr(vpu, AV1_FILM_GRAIN, 0);1264 return;1265 }1266 1267 ar_coeffs_y = kzalloc(sizeof(int32_t) * 24, GFP_KERNEL);1268 ar_coeffs_cb = kzalloc(sizeof(int32_t) * 25, GFP_KERNEL);1269 ar_coeffs_cr = kzalloc(sizeof(int32_t) * 25, GFP_KERNEL);1270 luma_grain_block = kzalloc(sizeof(int32_t) * 73 * 82, GFP_KERNEL);1271 cb_grain_block = kzalloc(sizeof(int32_t) * 38 * 44, GFP_KERNEL);1272 cr_grain_block = kzalloc(sizeof(int32_t) * 38 * 44, GFP_KERNEL);1273 1274 if (!ar_coeffs_y || !ar_coeffs_cb || !ar_coeffs_cr ||1275 !luma_grain_block || !cb_grain_block || !cr_grain_block) {1276 pr_warn("Fail allocating memory for film grain parameters\n");1277 goto alloc_fail;1278 }1279 1280 hantro_reg_write(vpu, &av1_apply_grain, 1);1281 1282 hantro_reg_write(vpu, &av1_num_y_points_b,1283 film_grain->num_y_points > 0);1284 hantro_reg_write(vpu, &av1_num_cb_points_b,1285 film_grain->num_cb_points > 0);1286 hantro_reg_write(vpu, &av1_num_cr_points_b,1287 film_grain->num_cr_points > 0);1288 hantro_reg_write(vpu, &av1_scaling_shift,1289 film_grain->grain_scaling_minus_8 + 8);1290 1291 if (!scaling_from_luma) {1292 hantro_reg_write(vpu, &av1_cb_mult, film_grain->cb_mult - 128);1293 hantro_reg_write(vpu, &av1_cb_luma_mult, film_grain->cb_luma_mult - 128);1294 hantro_reg_write(vpu, &av1_cb_offset, film_grain->cb_offset - 256);1295 hantro_reg_write(vpu, &av1_cr_mult, film_grain->cr_mult - 128);1296 hantro_reg_write(vpu, &av1_cr_luma_mult, film_grain->cr_luma_mult - 128);1297 hantro_reg_write(vpu, &av1_cr_offset, film_grain->cr_offset - 256);1298 } else {1299 hantro_reg_write(vpu, &av1_cb_mult, 0);1300 hantro_reg_write(vpu, &av1_cb_luma_mult, 0);1301 hantro_reg_write(vpu, &av1_cb_offset, 0);1302 hantro_reg_write(vpu, &av1_cr_mult, 0);1303 hantro_reg_write(vpu, &av1_cr_luma_mult, 0);1304 hantro_reg_write(vpu, &av1_cr_offset, 0);1305 }1306 1307 hantro_reg_write(vpu, &av1_overlap_flag,1308 !!(film_grain->flags & V4L2_AV1_FILM_GRAIN_FLAG_OVERLAP));1309 hantro_reg_write(vpu, &av1_clip_to_restricted_range,1310 !!(film_grain->flags & V4L2_AV1_FILM_GRAIN_FLAG_CLIP_TO_RESTRICTED_RANGE));1311 hantro_reg_write(vpu, &av1_chroma_scaling_from_luma, scaling_from_luma);1312 hantro_reg_write(vpu, &av1_random_seed, film_grain->grain_seed);1313 1314 rockchip_vpu981_av1_dec_init_scaling_function(film_grain->point_y_value,1315 film_grain->point_y_scaling,1316 film_grain->num_y_points,1317 fgmem->scaling_lut_y);1318 1319 if (film_grain->flags &1320 V4L2_AV1_FILM_GRAIN_FLAG_CHROMA_SCALING_FROM_LUMA) {1321 memcpy(fgmem->scaling_lut_cb, fgmem->scaling_lut_y,1322 sizeof(*fgmem->scaling_lut_y) * 256);1323 memcpy(fgmem->scaling_lut_cr, fgmem->scaling_lut_y,1324 sizeof(*fgmem->scaling_lut_y) * 256);1325 } else {1326 rockchip_vpu981_av1_dec_init_scaling_function1327 (film_grain->point_cb_value, film_grain->point_cb_scaling,1328 film_grain->num_cb_points, fgmem->scaling_lut_cb);1329 rockchip_vpu981_av1_dec_init_scaling_function1330 (film_grain->point_cr_value, film_grain->point_cr_scaling,1331 film_grain->num_cr_points, fgmem->scaling_lut_cr);1332 }1333 1334 for (i = 0; i < V4L2_AV1_AR_COEFFS_SIZE; i++) {1335 if (i < 24)1336 (*ar_coeffs_y)[i] = film_grain->ar_coeffs_y_plus_128[i] - 128;1337 (*ar_coeffs_cb)[i] = film_grain->ar_coeffs_cb_plus_128[i] - 128;1338 (*ar_coeffs_cr)[i] = film_grain->ar_coeffs_cr_plus_128[i] - 128;1339 }1340 1341 ar_coeff_lag = film_grain->ar_coeff_lag;1342 ar_coeff_shift = film_grain->ar_coeff_shift_minus_6 + 6;1343 grain_scale_shift = film_grain->grain_scale_shift;1344 bitdepth = ctx->bit_depth;1345 grain_center = 128 << (bitdepth - 8);1346 grain_min = 0 - grain_center;1347 grain_max = (256 << (bitdepth - 8)) - 1 - grain_center;1348 1349 rockchip_av1_generate_luma_grain_block(luma_grain_block, bitdepth,1350 film_grain->num_y_points, grain_scale_shift,1351 ar_coeff_lag, ar_coeffs_y, ar_coeff_shift,1352 grain_min, grain_max, film_grain->grain_seed);1353 1354 rockchip_av1_generate_chroma_grain_block(luma_grain_block, cb_grain_block,1355 cr_grain_block, bitdepth,1356 film_grain->num_y_points,1357 film_grain->num_cb_points,1358 film_grain->num_cr_points,1359 grain_scale_shift, ar_coeff_lag, ar_coeffs_cb,1360 ar_coeffs_cr, ar_coeff_shift, grain_min,1361 grain_max,1362 scaling_from_luma,1363 film_grain->grain_seed);1364 1365 for (i = 0; i < 64; i++) {1366 for (j = 0; j < 64; j++)1367 fgmem->cropped_luma_grain_block[i * 64 + j] =1368 (*luma_grain_block)[i + 9][j + 9];1369 }1370 1371 for (i = 0; i < 32; i++) {1372 for (j = 0; j < 32; j++) {1373 fgmem->cropped_chroma_grain_block[i * 64 + 2 * j] =1374 (*cb_grain_block)[i + 6][j + 6];1375 fgmem->cropped_chroma_grain_block[i * 64 + 2 * j + 1] =1376 (*cr_grain_block)[i + 6][j + 6];1377 }1378 }1379 1380 hantro_write_addr(vpu, AV1_FILM_GRAIN, av1_dec->film_grain.dma);1381 1382alloc_fail:1383 kfree(ar_coeffs_y);1384 kfree(ar_coeffs_cb);1385 kfree(ar_coeffs_cr);1386 kfree(luma_grain_block);1387 kfree(cb_grain_block);1388 kfree(cr_grain_block);1389}1390 1391static void rockchip_vpu981_av1_dec_set_cdef(struct hantro_ctx *ctx)1392{1393 struct hantro_av1_dec_hw_ctx *av1_dec = &ctx->av1_dec;1394 struct hantro_av1_dec_ctrls *ctrls = &av1_dec->ctrls;1395 const struct v4l2_ctrl_av1_frame *frame = ctrls->frame;1396 const struct v4l2_av1_cdef *cdef = &frame->cdef;1397 struct hantro_dev *vpu = ctx->dev;1398 u32 luma_pri_strength = 0;1399 u16 luma_sec_strength = 0;1400 u32 chroma_pri_strength = 0;1401 u16 chroma_sec_strength = 0;1402 int i;1403 1404 hantro_reg_write(vpu, &av1_cdef_bits, cdef->bits);1405 hantro_reg_write(vpu, &av1_cdef_damping, cdef->damping_minus_3);1406 1407 for (i = 0; i < BIT(cdef->bits); i++) {1408 luma_pri_strength |= cdef->y_pri_strength[i] << (i * 4);1409 if (cdef->y_sec_strength[i] == 4)1410 luma_sec_strength |= 3 << (i * 2);1411 else1412 luma_sec_strength |= cdef->y_sec_strength[i] << (i * 2);1413 1414 chroma_pri_strength |= cdef->uv_pri_strength[i] << (i * 4);1415 if (cdef->uv_sec_strength[i] == 4)1416 chroma_sec_strength |= 3 << (i * 2);1417 else1418 chroma_sec_strength |= cdef->uv_sec_strength[i] << (i * 2);1419 }1420 1421 hantro_reg_write(vpu, &av1_cdef_luma_primary_strength,1422 luma_pri_strength);1423 hantro_reg_write(vpu, &av1_cdef_luma_secondary_strength,1424 luma_sec_strength);1425 hantro_reg_write(vpu, &av1_cdef_chroma_primary_strength,1426 chroma_pri_strength);1427 hantro_reg_write(vpu, &av1_cdef_chroma_secondary_strength,1428 chroma_sec_strength);1429 1430 hantro_write_addr(vpu, AV1_CDEF_COL, av1_dec->cdef_col.dma);1431}1432 1433static void rockchip_vpu981_av1_dec_set_lr(struct hantro_ctx *ctx)1434{1435 struct hantro_av1_dec_hw_ctx *av1_dec = &ctx->av1_dec;1436 struct hantro_av1_dec_ctrls *ctrls = &av1_dec->ctrls;1437 const struct v4l2_ctrl_av1_frame *frame = ctrls->frame;1438 const struct v4l2_av1_loop_restoration *loop_restoration =1439 &frame->loop_restoration;1440 struct hantro_dev *vpu = ctx->dev;1441 u16 lr_type = 0, lr_unit_size = 0;1442 u8 restoration_unit_size[V4L2_AV1_NUM_PLANES_MAX] = { 3, 3, 3 };1443 int i;1444 1445 if (loop_restoration->flags & V4L2_AV1_LOOP_RESTORATION_FLAG_USES_LR) {1446 restoration_unit_size[0] = 1 + loop_restoration->lr_unit_shift;1447 restoration_unit_size[1] =1448 1 + loop_restoration->lr_unit_shift - loop_restoration->lr_uv_shift;1449 restoration_unit_size[2] =1450 1 + loop_restoration->lr_unit_shift - loop_restoration->lr_uv_shift;1451 }1452 1453 for (i = 0; i < V4L2_AV1_NUM_PLANES_MAX; i++) {1454 lr_type |=1455 loop_restoration->frame_restoration_type[i] << (i * 2);1456 lr_unit_size |= restoration_unit_size[i] << (i * 2);1457 }1458 1459 hantro_reg_write(vpu, &av1_lr_type, lr_type);1460 hantro_reg_write(vpu, &av1_lr_unit_size, lr_unit_size);1461 hantro_write_addr(vpu, AV1_LR_COL, av1_dec->lr_col.dma);1462}1463 1464static void rockchip_vpu981_av1_dec_set_superres_params(struct hantro_ctx *ctx)1465{1466 struct hantro_av1_dec_hw_ctx *av1_dec = &ctx->av1_dec;1467 struct hantro_av1_dec_ctrls *ctrls = &av1_dec->ctrls;1468 const struct v4l2_ctrl_av1_frame *frame = ctrls->frame;1469 struct hantro_dev *vpu = ctx->dev;1470 u8 superres_scale_denominator = SCALE_NUMERATOR;1471 int superres_luma_step = RS_SCALE_SUBPEL_BITS;1472 int superres_chroma_step = RS_SCALE_SUBPEL_BITS;1473 int superres_luma_step_invra = RS_SCALE_SUBPEL_BITS;1474 int superres_chroma_step_invra = RS_SCALE_SUBPEL_BITS;1475 int superres_init_luma_subpel_x = 0;1476 int superres_init_chroma_subpel_x = 0;1477 int superres_is_scaled = 0;1478 int min_w = min_t(uint32_t, 16, frame->upscaled_width);1479 int upscaled_luma, downscaled_luma;1480 int downscaled_chroma, upscaled_chroma;1481 int step_luma, step_chroma;1482 int err_luma, err_chroma;1483 int initial_luma, initial_chroma;1484 int width = 0;1485 1486 if (frame->flags & V4L2_AV1_FRAME_FLAG_USE_SUPERRES)1487 superres_scale_denominator = frame->superres_denom;1488 1489 if (superres_scale_denominator <= SCALE_NUMERATOR)1490 goto set_regs;1491 1492 width = (frame->upscaled_width * SCALE_NUMERATOR +1493 (superres_scale_denominator / 2)) / superres_scale_denominator;1494 1495 if (width < min_w)1496 width = min_w;1497 1498 if (width == frame->upscaled_width)1499 goto set_regs;1500 1501 superres_is_scaled = 1;1502 upscaled_luma = frame->upscaled_width;1503 downscaled_luma = width;1504 downscaled_chroma = (downscaled_luma + 1) >> 1;1505 upscaled_chroma = (upscaled_luma + 1) >> 1;1506 step_luma =1507 ((downscaled_luma << RS_SCALE_SUBPEL_BITS) +1508 (upscaled_luma / 2)) / upscaled_luma;1509 step_chroma =1510 ((downscaled_chroma << RS_SCALE_SUBPEL_BITS) +1511 (upscaled_chroma / 2)) / upscaled_chroma;1512 err_luma =1513 (upscaled_luma * step_luma)1514 - (downscaled_luma << RS_SCALE_SUBPEL_BITS);1515 err_chroma =1516 (upscaled_chroma * step_chroma)1517 - (downscaled_chroma << RS_SCALE_SUBPEL_BITS);1518 initial_luma =1519 ((-((upscaled_luma - downscaled_luma) << (RS_SCALE_SUBPEL_BITS - 1))1520 + upscaled_luma / 2)1521 / upscaled_luma + (1 << (RS_SCALE_EXTRA_BITS - 1)) - err_luma / 2)1522 & RS_SCALE_SUBPEL_MASK;1523 initial_chroma =1524 ((-((upscaled_chroma - downscaled_chroma) << (RS_SCALE_SUBPEL_BITS - 1))1525 + upscaled_chroma / 2)1526 / upscaled_chroma + (1 << (RS_SCALE_EXTRA_BITS - 1)) - err_chroma / 2)1527 & RS_SCALE_SUBPEL_MASK;1528 superres_luma_step = step_luma;1529 superres_chroma_step = step_chroma;1530 superres_luma_step_invra =1531 ((upscaled_luma << RS_SCALE_SUBPEL_BITS) + (downscaled_luma / 2))1532 / downscaled_luma;1533 superres_chroma_step_invra =1534 ((upscaled_chroma << RS_SCALE_SUBPEL_BITS) + (downscaled_chroma / 2))1535 / downscaled_chroma;1536 superres_init_luma_subpel_x = initial_luma;1537 superres_init_chroma_subpel_x = initial_chroma;1538 1539set_regs:1540 hantro_reg_write(vpu, &av1_superres_pic_width, frame->upscaled_width);1541 1542 if (frame->flags & V4L2_AV1_FRAME_FLAG_USE_SUPERRES)1543 hantro_reg_write(vpu, &av1_scale_denom_minus9,1544 frame->superres_denom - SUPERRES_SCALE_DENOMINATOR_MIN);1545 else1546 hantro_reg_write(vpu, &av1_scale_denom_minus9, frame->superres_denom);1547 1548 hantro_reg_write(vpu, &av1_superres_luma_step, superres_luma_step);1549 hantro_reg_write(vpu, &av1_superres_chroma_step, superres_chroma_step);1550 hantro_reg_write(vpu, &av1_superres_luma_step_invra,1551 superres_luma_step_invra);1552 hantro_reg_write(vpu, &av1_superres_chroma_step_invra,1553 superres_chroma_step_invra);1554 hantro_reg_write(vpu, &av1_superres_init_luma_subpel_x,1555 superres_init_luma_subpel_x);1556 hantro_reg_write(vpu, &av1_superres_init_chroma_subpel_x,1557 superres_init_chroma_subpel_x);1558 hantro_reg_write(vpu, &av1_superres_is_scaled, superres_is_scaled);1559 1560 hantro_write_addr(vpu, AV1_SR_COL, av1_dec->sr_col.dma);1561}1562 1563static void rockchip_vpu981_av1_dec_set_picture_dimensions(struct hantro_ctx *ctx)1564{1565 struct hantro_av1_dec_hw_ctx *av1_dec = &ctx->av1_dec;1566 struct hantro_av1_dec_ctrls *ctrls = &av1_dec->ctrls;1567 const struct v4l2_ctrl_av1_frame *frame = ctrls->frame;1568 struct hantro_dev *vpu = ctx->dev;1569 int pic_width_in_cbs = DIV_ROUND_UP(frame->frame_width_minus_1 + 1, 8);1570 int pic_height_in_cbs = DIV_ROUND_UP(frame->frame_height_minus_1 + 1, 8);1571 int pic_width_pad = ALIGN(frame->frame_width_minus_1 + 1, 8)1572 - (frame->frame_width_minus_1 + 1);1573 int pic_height_pad = ALIGN(frame->frame_height_minus_1 + 1, 8)1574 - (frame->frame_height_minus_1 + 1);1575 1576 hantro_reg_write(vpu, &av1_pic_width_in_cbs, pic_width_in_cbs);1577 hantro_reg_write(vpu, &av1_pic_height_in_cbs, pic_height_in_cbs);1578 hantro_reg_write(vpu, &av1_pic_width_pad, pic_width_pad);1579 hantro_reg_write(vpu, &av1_pic_height_pad, pic_height_pad);1580 1581 rockchip_vpu981_av1_dec_set_superres_params(ctx);1582}1583 1584static void rockchip_vpu981_av1_dec_set_other_frames(struct hantro_ctx *ctx)1585{1586 struct hantro_av1_dec_hw_ctx *av1_dec = &ctx->av1_dec;1587 struct hantro_av1_dec_ctrls *ctrls = &av1_dec->ctrls;1588 const struct v4l2_ctrl_av1_frame *frame = ctrls->frame;1589 struct hantro_dev *vpu = ctx->dev;1590 bool use_ref_frame_mvs =1591 !!(ctrls->frame->flags & V4L2_AV1_FRAME_FLAG_USE_REF_FRAME_MVS);1592 int cur_frame_offset = frame->order_hint;1593 int alt_frame_offset = 0;1594 int gld_frame_offset = 0;1595 int bwd_frame_offset = 0;1596 int alt2_frame_offset = 0;1597 int refs_selected[3] = { 0, 0, 0 };1598 int cur_mi_cols = DIV_ROUND_UP(frame->frame_width_minus_1 + 1, 8);1599 int cur_mi_rows = DIV_ROUND_UP(frame->frame_height_minus_1 + 1, 8);1600 int cur_offset[V4L2_AV1_TOTAL_REFS_PER_FRAME - 1];1601 int cur_roffset[V4L2_AV1_TOTAL_REFS_PER_FRAME - 1];1602 int mf_types[3] = { 0, 0, 0 };1603 int ref_stamp = 2;1604 int ref_ind = 0;1605 int rf, idx;1606 1607 alt_frame_offset = rockchip_vpu981_get_order_hint(ctx, ALT_BUF_IDX);1608 gld_frame_offset = rockchip_vpu981_get_order_hint(ctx, GLD_BUF_IDX);1609 bwd_frame_offset = rockchip_vpu981_get_order_hint(ctx, BWD_BUF_IDX);1610 alt2_frame_offset = rockchip_vpu981_get_order_hint(ctx, ALT2_BUF_IDX);1611 1612 idx = rockchip_vpu981_get_frame_index(ctx, LST_BUF_IDX);1613 if (idx >= 0) {1614 int alt_frame_offset_in_lst =1615 av1_dec->frame_refs[idx].order_hints[V4L2_AV1_REF_ALTREF_FRAME];1616 bool is_lst_overlay =1617 (alt_frame_offset_in_lst == gld_frame_offset);1618 1619 if (!is_lst_overlay) {1620 int lst_mi_cols = av1_dec->frame_refs[idx].mi_cols;1621 int lst_mi_rows = av1_dec->frame_refs[idx].mi_rows;1622 bool lst_intra_only =1623 IS_INTRA(av1_dec->frame_refs[idx].frame_type);1624 1625 if (lst_mi_cols == cur_mi_cols &&1626 lst_mi_rows == cur_mi_rows && !lst_intra_only) {1627 mf_types[ref_ind] = V4L2_AV1_REF_LAST_FRAME;1628 refs_selected[ref_ind++] = LST_BUF_IDX;1629 }1630 }1631 ref_stamp--;1632 }1633 1634 idx = rockchip_vpu981_get_frame_index(ctx, BWD_BUF_IDX);1635 if (rockchip_vpu981_av1_dec_get_dist(ctx, bwd_frame_offset, cur_frame_offset) > 0) {1636 int bwd_mi_cols = av1_dec->frame_refs[idx].mi_cols;1637 int bwd_mi_rows = av1_dec->frame_refs[idx].mi_rows;1638 bool bwd_intra_only =1639 IS_INTRA(av1_dec->frame_refs[idx].frame_type);1640 1641 if (bwd_mi_cols == cur_mi_cols && bwd_mi_rows == cur_mi_rows &&1642 !bwd_intra_only) {1643 mf_types[ref_ind] = V4L2_AV1_REF_BWDREF_FRAME;1644 refs_selected[ref_ind++] = BWD_BUF_IDX;1645 ref_stamp--;1646 }1647 }1648 1649 idx = rockchip_vpu981_get_frame_index(ctx, ALT2_BUF_IDX);1650 if (rockchip_vpu981_av1_dec_get_dist(ctx, alt2_frame_offset, cur_frame_offset) > 0) {1651 int alt2_mi_cols = av1_dec->frame_refs[idx].mi_cols;1652 int alt2_mi_rows = av1_dec->frame_refs[idx].mi_rows;1653 bool alt2_intra_only =1654 IS_INTRA(av1_dec->frame_refs[idx].frame_type);1655 1656 if (alt2_mi_cols == cur_mi_cols && alt2_mi_rows == cur_mi_rows &&1657 !alt2_intra_only) {1658 mf_types[ref_ind] = V4L2_AV1_REF_ALTREF2_FRAME;1659 refs_selected[ref_ind++] = ALT2_BUF_IDX;1660 ref_stamp--;1661 }1662 }1663 1664 idx = rockchip_vpu981_get_frame_index(ctx, ALT_BUF_IDX);1665 if (rockchip_vpu981_av1_dec_get_dist(ctx, alt_frame_offset, cur_frame_offset) > 0 &&1666 ref_stamp >= 0) {1667 int alt_mi_cols = av1_dec->frame_refs[idx].mi_cols;1668 int alt_mi_rows = av1_dec->frame_refs[idx].mi_rows;1669 bool alt_intra_only =1670 IS_INTRA(av1_dec->frame_refs[idx].frame_type);1671 1672 if (alt_mi_cols == cur_mi_cols && alt_mi_rows == cur_mi_rows &&1673 !alt_intra_only) {1674 mf_types[ref_ind] = V4L2_AV1_REF_ALTREF_FRAME;1675 refs_selected[ref_ind++] = ALT_BUF_IDX;1676 ref_stamp--;1677 }1678 }1679 1680 idx = rockchip_vpu981_get_frame_index(ctx, LST2_BUF_IDX);1681 if (idx >= 0 && ref_stamp >= 0) {1682 int lst2_mi_cols = av1_dec->frame_refs[idx].mi_cols;1683 int lst2_mi_rows = av1_dec->frame_refs[idx].mi_rows;1684 bool lst2_intra_only =1685 IS_INTRA(av1_dec->frame_refs[idx].frame_type);1686 1687 if (lst2_mi_cols == cur_mi_cols && lst2_mi_rows == cur_mi_rows &&1688 !lst2_intra_only) {1689 mf_types[ref_ind] = V4L2_AV1_REF_LAST2_FRAME;1690 refs_selected[ref_ind++] = LST2_BUF_IDX;1691 ref_stamp--;1692 }1693 }1694 1695 for (rf = 0; rf < V4L2_AV1_TOTAL_REFS_PER_FRAME - 1; ++rf) {1696 idx = rockchip_vpu981_get_frame_index(ctx, rf);1697 if (idx >= 0) {1698 int rf_order_hint = rockchip_vpu981_get_order_hint(ctx, rf);1699 1700 cur_offset[rf] =1701 rockchip_vpu981_av1_dec_get_dist(ctx, cur_frame_offset, rf_order_hint);1702 cur_roffset[rf] =1703 rockchip_vpu981_av1_dec_get_dist(ctx, rf_order_hint, cur_frame_offset);1704 } else {1705 cur_offset[rf] = 0;1706 cur_roffset[rf] = 0;1707 }1708 }1709 1710 hantro_reg_write(vpu, &av1_use_temporal0_mvs, 0);1711 hantro_reg_write(vpu, &av1_use_temporal1_mvs, 0);1712 hantro_reg_write(vpu, &av1_use_temporal2_mvs, 0);1713 hantro_reg_write(vpu, &av1_use_temporal3_mvs, 0);1714 1715 hantro_reg_write(vpu, &av1_mf1_last_offset, 0);1716 hantro_reg_write(vpu, &av1_mf1_last2_offset, 0);1717 hantro_reg_write(vpu, &av1_mf1_last3_offset, 0);1718 hantro_reg_write(vpu, &av1_mf1_golden_offset, 0);1719 hantro_reg_write(vpu, &av1_mf1_bwdref_offset, 0);1720 hantro_reg_write(vpu, &av1_mf1_altref2_offset, 0);1721 hantro_reg_write(vpu, &av1_mf1_altref_offset, 0);1722 1723 if (use_ref_frame_mvs && ref_ind > 0 &&1724 cur_offset[mf_types[0] - V4L2_AV1_REF_LAST_FRAME] <= MAX_FRAME_DISTANCE &&1725 cur_offset[mf_types[0] - V4L2_AV1_REF_LAST_FRAME] >= -MAX_FRAME_DISTANCE) {1726 int rf = rockchip_vpu981_get_order_hint(ctx, refs_selected[0]);1727 int idx = rockchip_vpu981_get_frame_index(ctx, refs_selected[0]);1728 u32 *oh = av1_dec->frame_refs[idx].order_hints;1729 int val;1730 1731 hantro_reg_write(vpu, &av1_use_temporal0_mvs, 1);1732 1733 val = rockchip_vpu981_av1_dec_get_dist(ctx, rf, oh[V4L2_AV1_REF_LAST_FRAME]);1734 hantro_reg_write(vpu, &av1_mf1_last_offset, val);1735 1736 val = rockchip_vpu981_av1_dec_get_dist(ctx, rf, oh[V4L2_AV1_REF_LAST2_FRAME]);1737 hantro_reg_write(vpu, &av1_mf1_last2_offset, val);1738 1739 val = rockchip_vpu981_av1_dec_get_dist(ctx, rf, oh[V4L2_AV1_REF_LAST3_FRAME]);1740 hantro_reg_write(vpu, &av1_mf1_last3_offset, val);1741 1742 val = rockchip_vpu981_av1_dec_get_dist(ctx, rf, oh[V4L2_AV1_REF_GOLDEN_FRAME]);1743 hantro_reg_write(vpu, &av1_mf1_golden_offset, val);1744 1745 val = rockchip_vpu981_av1_dec_get_dist(ctx, rf, oh[V4L2_AV1_REF_BWDREF_FRAME]);1746 hantro_reg_write(vpu, &av1_mf1_bwdref_offset, val);1747 1748 val = rockchip_vpu981_av1_dec_get_dist(ctx, rf, oh[V4L2_AV1_REF_ALTREF2_FRAME]);1749 hantro_reg_write(vpu, &av1_mf1_altref2_offset, val);1750 1751 val = rockchip_vpu981_av1_dec_get_dist(ctx, rf, oh[V4L2_AV1_REF_ALTREF_FRAME]);1752 hantro_reg_write(vpu, &av1_mf1_altref_offset, val);1753 }1754 1755 hantro_reg_write(vpu, &av1_mf2_last_offset, 0);1756 hantro_reg_write(vpu, &av1_mf2_last2_offset, 0);1757 hantro_reg_write(vpu, &av1_mf2_last3_offset, 0);1758 hantro_reg_write(vpu, &av1_mf2_golden_offset, 0);1759 hantro_reg_write(vpu, &av1_mf2_bwdref_offset, 0);1760 hantro_reg_write(vpu, &av1_mf2_altref2_offset, 0);1761 hantro_reg_write(vpu, &av1_mf2_altref_offset, 0);1762 1763 if (use_ref_frame_mvs && ref_ind > 1 &&1764 cur_offset[mf_types[1] - V4L2_AV1_REF_LAST_FRAME] <= MAX_FRAME_DISTANCE &&1765 cur_offset[mf_types[1] - V4L2_AV1_REF_LAST_FRAME] >= -MAX_FRAME_DISTANCE) {1766 int rf = rockchip_vpu981_get_order_hint(ctx, refs_selected[1]);1767 int idx = rockchip_vpu981_get_frame_index(ctx, refs_selected[1]);1768 u32 *oh = av1_dec->frame_refs[idx].order_hints;1769 int val;1770 1771 hantro_reg_write(vpu, &av1_use_temporal1_mvs, 1);1772 1773 val = rockchip_vpu981_av1_dec_get_dist(ctx, rf, oh[V4L2_AV1_REF_LAST_FRAME]);1774 hantro_reg_write(vpu, &av1_mf2_last_offset, val);1775 1776 val = rockchip_vpu981_av1_dec_get_dist(ctx, rf, oh[V4L2_AV1_REF_LAST2_FRAME]);1777 hantro_reg_write(vpu, &av1_mf2_last2_offset, val);1778 1779 val = rockchip_vpu981_av1_dec_get_dist(ctx, rf, oh[V4L2_AV1_REF_LAST3_FRAME]);1780 hantro_reg_write(vpu, &av1_mf2_last3_offset, val);1781 1782 val = rockchip_vpu981_av1_dec_get_dist(ctx, rf, oh[V4L2_AV1_REF_GOLDEN_FRAME]);1783 hantro_reg_write(vpu, &av1_mf2_golden_offset, val);1784 1785 val = rockchip_vpu981_av1_dec_get_dist(ctx, rf, oh[V4L2_AV1_REF_BWDREF_FRAME]);1786 hantro_reg_write(vpu, &av1_mf2_bwdref_offset, val);1787 1788 val = rockchip_vpu981_av1_dec_get_dist(ctx, rf, oh[V4L2_AV1_REF_ALTREF2_FRAME]);1789 hantro_reg_write(vpu, &av1_mf2_altref2_offset, val);1790 1791 val = rockchip_vpu981_av1_dec_get_dist(ctx, rf, oh[V4L2_AV1_REF_ALTREF_FRAME]);1792 hantro_reg_write(vpu, &av1_mf2_altref_offset, val);1793 }1794 1795 hantro_reg_write(vpu, &av1_mf3_last_offset, 0);1796 hantro_reg_write(vpu, &av1_mf3_last2_offset, 0);1797 hantro_reg_write(vpu, &av1_mf3_last3_offset, 0);1798 hantro_reg_write(vpu, &av1_mf3_golden_offset, 0);1799 hantro_reg_write(vpu, &av1_mf3_bwdref_offset, 0);1800 hantro_reg_write(vpu, &av1_mf3_altref2_offset, 0);1801 hantro_reg_write(vpu, &av1_mf3_altref_offset, 0);1802 1803 if (use_ref_frame_mvs && ref_ind > 2 &&1804 cur_offset[mf_types[2] - V4L2_AV1_REF_LAST_FRAME] <= MAX_FRAME_DISTANCE &&1805 cur_offset[mf_types[2] - V4L2_AV1_REF_LAST_FRAME] >= -MAX_FRAME_DISTANCE) {1806 int rf = rockchip_vpu981_get_order_hint(ctx, refs_selected[2]);1807 int idx = rockchip_vpu981_get_frame_index(ctx, refs_selected[2]);1808 u32 *oh = av1_dec->frame_refs[idx].order_hints;1809 int val;1810 1811 hantro_reg_write(vpu, &av1_use_temporal2_mvs, 1);1812 1813 val = rockchip_vpu981_av1_dec_get_dist(ctx, rf, oh[V4L2_AV1_REF_LAST_FRAME]);1814 hantro_reg_write(vpu, &av1_mf3_last_offset, val);1815 1816 val = rockchip_vpu981_av1_dec_get_dist(ctx, rf, oh[V4L2_AV1_REF_LAST2_FRAME]);1817 hantro_reg_write(vpu, &av1_mf3_last2_offset, val);1818 1819 val = rockchip_vpu981_av1_dec_get_dist(ctx, rf, oh[V4L2_AV1_REF_LAST3_FRAME]);1820 hantro_reg_write(vpu, &av1_mf3_last3_offset, val);1821 1822 val = rockchip_vpu981_av1_dec_get_dist(ctx, rf, oh[V4L2_AV1_REF_GOLDEN_FRAME]);1823 hantro_reg_write(vpu, &av1_mf3_golden_offset, val);1824 1825 val = rockchip_vpu981_av1_dec_get_dist(ctx, rf, oh[V4L2_AV1_REF_BWDREF_FRAME]);1826 hantro_reg_write(vpu, &av1_mf3_bwdref_offset, val);1827 1828 val = rockchip_vpu981_av1_dec_get_dist(ctx, rf, oh[V4L2_AV1_REF_ALTREF2_FRAME]);1829 hantro_reg_write(vpu, &av1_mf3_altref2_offset, val);1830 1831 val = rockchip_vpu981_av1_dec_get_dist(ctx, rf, oh[V4L2_AV1_REF_ALTREF_FRAME]);1832 hantro_reg_write(vpu, &av1_mf3_altref_offset, val);1833 }1834 1835 hantro_reg_write(vpu, &av1_cur_last_offset, cur_offset[0]);1836 hantro_reg_write(vpu, &av1_cur_last2_offset, cur_offset[1]);1837 hantro_reg_write(vpu, &av1_cur_last3_offset, cur_offset[2]);1838 hantro_reg_write(vpu, &av1_cur_golden_offset, cur_offset[3]);1839 hantro_reg_write(vpu, &av1_cur_bwdref_offset, cur_offset[4]);1840 hantro_reg_write(vpu, &av1_cur_altref2_offset, cur_offset[5]);1841 hantro_reg_write(vpu, &av1_cur_altref_offset, cur_offset[6]);1842 1843 hantro_reg_write(vpu, &av1_cur_last_roffset, cur_roffset[0]);1844 hantro_reg_write(vpu, &av1_cur_last2_roffset, cur_roffset[1]);1845 hantro_reg_write(vpu, &av1_cur_last3_roffset, cur_roffset[2]);1846 hantro_reg_write(vpu, &av1_cur_golden_roffset, cur_roffset[3]);1847 hantro_reg_write(vpu, &av1_cur_bwdref_roffset, cur_roffset[4]);1848 hantro_reg_write(vpu, &av1_cur_altref2_roffset, cur_roffset[5]);1849 hantro_reg_write(vpu, &av1_cur_altref_roffset, cur_roffset[6]);1850 1851 hantro_reg_write(vpu, &av1_mf1_type, mf_types[0] - V4L2_AV1_REF_LAST_FRAME);1852 hantro_reg_write(vpu, &av1_mf2_type, mf_types[1] - V4L2_AV1_REF_LAST_FRAME);1853 hantro_reg_write(vpu, &av1_mf3_type, mf_types[2] - V4L2_AV1_REF_LAST_FRAME);1854}1855 1856static void rockchip_vpu981_av1_dec_set_reference_frames(struct hantro_ctx *ctx)1857{1858 struct hantro_av1_dec_hw_ctx *av1_dec = &ctx->av1_dec;1859 struct hantro_av1_dec_ctrls *ctrls = &av1_dec->ctrls;1860 const struct v4l2_ctrl_av1_frame *frame = ctrls->frame;1861 int frame_type = frame->frame_type;1862 bool allow_intrabc = !!(ctrls->frame->flags & V4L2_AV1_FRAME_FLAG_ALLOW_INTRABC);1863 int ref_count[AV1DEC_MAX_PIC_BUFFERS] = { 0 };1864 struct hantro_dev *vpu = ctx->dev;1865 int i, ref_frames = 0;1866 bool scale_enable = false;1867 1868 if (IS_INTRA(frame_type) && !allow_intrabc)1869 return;1870 1871 if (!allow_intrabc) {1872 for (i = 0; i < V4L2_AV1_REFS_PER_FRAME; i++) {1873 int idx = rockchip_vpu981_get_frame_index(ctx, i);1874 1875 if (idx >= 0)1876 ref_count[idx]++;1877 }1878 1879 for (i = 0; i < AV1DEC_MAX_PIC_BUFFERS; i++) {1880 if (ref_count[i])1881 ref_frames++;1882 }1883 } else {1884 ref_frames = 1;1885 }1886 hantro_reg_write(vpu, &av1_ref_frames, ref_frames);1887 1888 rockchip_vpu981_av1_dec_set_frame_sign_bias(ctx);1889 1890 for (i = V4L2_AV1_REF_LAST_FRAME; i < V4L2_AV1_TOTAL_REFS_PER_FRAME; i++) {1891 u32 ref = i - 1;1892 int idx = 0;1893 int width, height;1894 1895 if (allow_intrabc) {1896 idx = av1_dec->current_frame_index;1897 width = frame->frame_width_minus_1 + 1;1898 height = frame->frame_height_minus_1 + 1;1899 } else {1900 if (rockchip_vpu981_get_frame_index(ctx, ref) > 0)1901 idx = rockchip_vpu981_get_frame_index(ctx, ref);1902 width = av1_dec->frame_refs[idx].width;1903 height = av1_dec->frame_refs[idx].height;1904 }1905 1906 scale_enable |=1907 rockchip_vpu981_av1_dec_set_ref(ctx, ref, idx, width,1908 height);1909 1910 rockchip_vpu981_av1_dec_set_sign_bias(ctx, ref,1911 av1_dec->ref_frame_sign_bias[i]);1912 }1913 hantro_reg_write(vpu, &av1_ref_scaling_enable, scale_enable);1914 1915 hantro_reg_write(vpu, &av1_ref0_gm_mode,1916 frame->global_motion.type[V4L2_AV1_REF_LAST_FRAME]);1917 hantro_reg_write(vpu, &av1_ref1_gm_mode,1918 frame->global_motion.type[V4L2_AV1_REF_LAST2_FRAME]);1919 hantro_reg_write(vpu, &av1_ref2_gm_mode,1920 frame->global_motion.type[V4L2_AV1_REF_LAST3_FRAME]);1921 hantro_reg_write(vpu, &av1_ref3_gm_mode,1922 frame->global_motion.type[V4L2_AV1_REF_GOLDEN_FRAME]);1923 hantro_reg_write(vpu, &av1_ref4_gm_mode,1924 frame->global_motion.type[V4L2_AV1_REF_BWDREF_FRAME]);1925 hantro_reg_write(vpu, &av1_ref5_gm_mode,1926 frame->global_motion.type[V4L2_AV1_REF_ALTREF2_FRAME]);1927 hantro_reg_write(vpu, &av1_ref6_gm_mode,1928 frame->global_motion.type[V4L2_AV1_REF_ALTREF_FRAME]);1929 1930 rockchip_vpu981_av1_dec_set_other_frames(ctx);1931}1932 1933static void rockchip_vpu981_av1_dec_set_parameters(struct hantro_ctx *ctx)1934{1935 struct hantro_dev *vpu = ctx->dev;1936 struct hantro_av1_dec_hw_ctx *av1_dec = &ctx->av1_dec;1937 struct hantro_av1_dec_ctrls *ctrls = &av1_dec->ctrls;1938 1939 hantro_reg_write(vpu, &av1_skip_mode,1940 !!(ctrls->frame->flags & V4L2_AV1_FRAME_FLAG_SKIP_MODE_PRESENT));1941 hantro_reg_write(vpu, &av1_tempor_mvp_e,1942 !!(ctrls->frame->flags & V4L2_AV1_FRAME_FLAG_USE_REF_FRAME_MVS));1943 hantro_reg_write(vpu, &av1_delta_lf_res_log,1944 ctrls->frame->loop_filter.delta_lf_res);1945 hantro_reg_write(vpu, &av1_delta_lf_multi,1946 !!(ctrls->frame->loop_filter.flags1947 & V4L2_AV1_LOOP_FILTER_FLAG_DELTA_LF_MULTI));1948 hantro_reg_write(vpu, &av1_delta_lf_present,1949 !!(ctrls->frame->loop_filter.flags1950 & V4L2_AV1_LOOP_FILTER_FLAG_DELTA_LF_PRESENT));1951 hantro_reg_write(vpu, &av1_disable_cdf_update,1952 !!(ctrls->frame->flags & V4L2_AV1_FRAME_FLAG_DISABLE_CDF_UPDATE));1953 hantro_reg_write(vpu, &av1_allow_warp,1954 !!(ctrls->frame->flags & V4L2_AV1_FRAME_FLAG_ALLOW_WARPED_MOTION));1955 hantro_reg_write(vpu, &av1_show_frame,1956 !!(ctrls->frame->flags & V4L2_AV1_FRAME_FLAG_SHOW_FRAME));1957 hantro_reg_write(vpu, &av1_switchable_motion_mode,1958 !!(ctrls->frame->flags & V4L2_AV1_FRAME_FLAG_IS_MOTION_MODE_SWITCHABLE));1959 hantro_reg_write(vpu, &av1_enable_cdef,1960 !!(ctrls->sequence->flags & V4L2_AV1_SEQUENCE_FLAG_ENABLE_CDEF));1961 hantro_reg_write(vpu, &av1_allow_masked_compound,1962 !!(ctrls->sequence->flags1963 & V4L2_AV1_SEQUENCE_FLAG_ENABLE_MASKED_COMPOUND));1964 hantro_reg_write(vpu, &av1_allow_interintra,1965 !!(ctrls->sequence->flags1966 & V4L2_AV1_SEQUENCE_FLAG_ENABLE_INTERINTRA_COMPOUND));1967 hantro_reg_write(vpu, &av1_enable_intra_edge_filter,1968 !!(ctrls->sequence->flags1969 & V4L2_AV1_SEQUENCE_FLAG_ENABLE_INTRA_EDGE_FILTER));1970 hantro_reg_write(vpu, &av1_allow_filter_intra,1971 !!(ctrls->sequence->flags & V4L2_AV1_SEQUENCE_FLAG_ENABLE_FILTER_INTRA));1972 hantro_reg_write(vpu, &av1_enable_jnt_comp,1973 !!(ctrls->sequence->flags & V4L2_AV1_SEQUENCE_FLAG_ENABLE_JNT_COMP));1974 hantro_reg_write(vpu, &av1_enable_dual_filter,1975 !!(ctrls->sequence->flags & V4L2_AV1_SEQUENCE_FLAG_ENABLE_DUAL_FILTER));1976 hantro_reg_write(vpu, &av1_reduced_tx_set_used,1977 !!(ctrls->frame->flags & V4L2_AV1_FRAME_FLAG_REDUCED_TX_SET));1978 hantro_reg_write(vpu, &av1_allow_screen_content_tools,1979 !!(ctrls->frame->flags & V4L2_AV1_FRAME_FLAG_ALLOW_SCREEN_CONTENT_TOOLS));1980 hantro_reg_write(vpu, &av1_allow_intrabc,1981 !!(ctrls->frame->flags & V4L2_AV1_FRAME_FLAG_ALLOW_INTRABC));1982 1983 if (!(ctrls->frame->flags & V4L2_AV1_FRAME_FLAG_ALLOW_SCREEN_CONTENT_TOOLS))1984 hantro_reg_write(vpu, &av1_force_interger_mv, 0);1985 else1986 hantro_reg_write(vpu, &av1_force_interger_mv,1987 !!(ctrls->frame->flags & V4L2_AV1_FRAME_FLAG_FORCE_INTEGER_MV));1988 1989 hantro_reg_write(vpu, &av1_blackwhite_e, 0);1990 hantro_reg_write(vpu, &av1_delta_q_res_log, ctrls->frame->quantization.delta_q_res);1991 hantro_reg_write(vpu, &av1_delta_q_present,1992 !!(ctrls->frame->quantization.flags1993 & V4L2_AV1_QUANTIZATION_FLAG_DELTA_Q_PRESENT));1994 1995 hantro_reg_write(vpu, &av1_idr_pic_e, !ctrls->frame->frame_type);1996 hantro_reg_write(vpu, &av1_quant_base_qindex, ctrls->frame->quantization.base_q_idx);1997 hantro_reg_write(vpu, &av1_bit_depth_y_minus8, ctx->bit_depth - 8);1998 hantro_reg_write(vpu, &av1_bit_depth_c_minus8, ctx->bit_depth - 8);1999 2000 hantro_reg_write(vpu, &av1_mcomp_filt_type, ctrls->frame->interpolation_filter);2001 hantro_reg_write(vpu, &av1_high_prec_mv_e,2002 !!(ctrls->frame->flags & V4L2_AV1_FRAME_FLAG_ALLOW_HIGH_PRECISION_MV));2003 hantro_reg_write(vpu, &av1_comp_pred_mode,2004 (ctrls->frame->flags & V4L2_AV1_FRAME_FLAG_REFERENCE_SELECT) ? 2 : 0);2005 hantro_reg_write(vpu, &av1_transform_mode, (ctrls->frame->tx_mode == 1) ? 3 : 4);2006 hantro_reg_write(vpu, &av1_max_cb_size,2007 (ctrls->sequence->flags2008 & V4L2_AV1_SEQUENCE_FLAG_USE_128X128_SUPERBLOCK) ? 7 : 6);2009 hantro_reg_write(vpu, &av1_min_cb_size, 3);2010 2011 hantro_reg_write(vpu, &av1_comp_pred_fixed_ref, 0);2012 hantro_reg_write(vpu, &av1_comp_pred_var_ref0_av1, 0);2013 hantro_reg_write(vpu, &av1_comp_pred_var_ref1_av1, 0);2014 hantro_reg_write(vpu, &av1_filt_level_seg0, 0);2015 hantro_reg_write(vpu, &av1_filt_level_seg1, 0);2016 hantro_reg_write(vpu, &av1_filt_level_seg2, 0);2017 hantro_reg_write(vpu, &av1_filt_level_seg3, 0);2018 hantro_reg_write(vpu, &av1_filt_level_seg4, 0);2019 hantro_reg_write(vpu, &av1_filt_level_seg5, 0);2020 hantro_reg_write(vpu, &av1_filt_level_seg6, 0);2021 hantro_reg_write(vpu, &av1_filt_level_seg7, 0);2022 2023 hantro_reg_write(vpu, &av1_qp_delta_y_dc_av1, ctrls->frame->quantization.delta_q_y_dc);2024 hantro_reg_write(vpu, &av1_qp_delta_ch_dc_av1, ctrls->frame->quantization.delta_q_u_dc);2025 hantro_reg_write(vpu, &av1_qp_delta_ch_ac_av1, ctrls->frame->quantization.delta_q_u_ac);2026 if (ctrls->frame->quantization.flags & V4L2_AV1_QUANTIZATION_FLAG_USING_QMATRIX) {2027 hantro_reg_write(vpu, &av1_qmlevel_y, ctrls->frame->quantization.qm_y);2028 hantro_reg_write(vpu, &av1_qmlevel_u, ctrls->frame->quantization.qm_u);2029 hantro_reg_write(vpu, &av1_qmlevel_v, ctrls->frame->quantization.qm_v);2030 } else {2031 hantro_reg_write(vpu, &av1_qmlevel_y, 0xff);2032 hantro_reg_write(vpu, &av1_qmlevel_u, 0xff);2033 hantro_reg_write(vpu, &av1_qmlevel_v, 0xff);2034 }2035 2036 hantro_reg_write(vpu, &av1_lossless_e, rockchip_vpu981_av1_dec_is_lossless(ctx));2037 hantro_reg_write(vpu, &av1_quant_delta_v_dc, ctrls->frame->quantization.delta_q_v_dc);2038 hantro_reg_write(vpu, &av1_quant_delta_v_ac, ctrls->frame->quantization.delta_q_v_ac);2039 2040 hantro_reg_write(vpu, &av1_skip_ref0,2041 (ctrls->frame->skip_mode_frame[0]) ? ctrls->frame->skip_mode_frame[0] : 1);2042 hantro_reg_write(vpu, &av1_skip_ref1,2043 (ctrls->frame->skip_mode_frame[1]) ? ctrls->frame->skip_mode_frame[1] : 1);2044 2045 hantro_write_addr(vpu, AV1_MC_SYNC_CURR, av1_dec->tile_buf.dma);2046 hantro_write_addr(vpu, AV1_MC_SYNC_LEFT, av1_dec->tile_buf.dma);2047}2048 2049static void2050rockchip_vpu981_av1_dec_set_input_buffer(struct hantro_ctx *ctx,2051 struct vb2_v4l2_buffer *vb2_src)2052{2053 struct hantro_av1_dec_hw_ctx *av1_dec = &ctx->av1_dec;2054 struct hantro_av1_dec_ctrls *ctrls = &av1_dec->ctrls;2055 const struct v4l2_ctrl_av1_tile_group_entry *group_entry =2056 ctrls->tile_group_entry;2057 struct hantro_dev *vpu = ctx->dev;2058 dma_addr_t src_dma;2059 u32 src_len, src_buf_len;2060 int start_bit, offset;2061 2062 src_dma = vb2_dma_contig_plane_dma_addr(&vb2_src->vb2_buf, 0);2063 src_len = vb2_get_plane_payload(&vb2_src->vb2_buf, 0);2064 src_buf_len = vb2_plane_size(&vb2_src->vb2_buf, 0);2065 2066 start_bit = (group_entry[0].tile_offset & 0xf) * 8;2067 offset = group_entry[0].tile_offset & ~0xf;2068 2069 hantro_reg_write(vpu, &av1_strm_buffer_len, src_buf_len);2070 hantro_reg_write(vpu, &av1_strm_start_bit, start_bit);2071 hantro_reg_write(vpu, &av1_stream_len, src_len);2072 hantro_reg_write(vpu, &av1_strm_start_offset, 0);2073 hantro_write_addr(vpu, AV1_INPUT_STREAM, src_dma + offset);2074}2075 2076static void2077rockchip_vpu981_av1_dec_set_output_buffer(struct hantro_ctx *ctx)2078{2079 struct hantro_av1_dec_hw_ctx *av1_dec = &ctx->av1_dec;2080 struct hantro_dev *vpu = ctx->dev;2081 struct hantro_decoded_buffer *dst;2082 struct vb2_v4l2_buffer *vb2_dst;2083 dma_addr_t luma_addr, chroma_addr, mv_addr = 0;2084 size_t cr_offset = rockchip_vpu981_av1_dec_luma_size(ctx);2085 size_t mv_offset = rockchip_vpu981_av1_dec_chroma_size(ctx);2086 2087 vb2_dst = av1_dec->frame_refs[av1_dec->current_frame_index].vb2_ref;2088 dst = vb2_to_hantro_decoded_buf(&vb2_dst->vb2_buf);2089 luma_addr = hantro_get_dec_buf_addr(ctx, &dst->base.vb.vb2_buf);2090 chroma_addr = luma_addr + cr_offset;2091 mv_addr = luma_addr + mv_offset;2092 2093 hantro_write_addr(vpu, AV1_TILE_OUT_LU, luma_addr);2094 hantro_write_addr(vpu, AV1_TILE_OUT_CH, chroma_addr);2095 hantro_write_addr(vpu, AV1_TILE_OUT_MV, mv_addr);2096}2097 2098int rockchip_vpu981_av1_dec_run(struct hantro_ctx *ctx)2099{2100 struct hantro_dev *vpu = ctx->dev;2101 struct vb2_v4l2_buffer *vb2_src;2102 int ret;2103 2104 hantro_start_prepare_run(ctx);2105 2106 ret = rockchip_vpu981_av1_dec_prepare_run(ctx);2107 if (ret)2108 goto prepare_error;2109 2110 vb2_src = hantro_get_src_buf(ctx);2111 if (!vb2_src) {2112 ret = -EINVAL;2113 goto prepare_error;2114 }2115 2116 rockchip_vpu981_av1_dec_clean_refs(ctx);2117 rockchip_vpu981_av1_dec_frame_ref(ctx, vb2_src->vb2_buf.timestamp);2118 2119 rockchip_vpu981_av1_dec_set_parameters(ctx);2120 rockchip_vpu981_av1_dec_set_global_model(ctx);2121 rockchip_vpu981_av1_dec_set_tile_info(ctx);2122 rockchip_vpu981_av1_dec_set_reference_frames(ctx);2123 rockchip_vpu981_av1_dec_set_segmentation(ctx);2124 rockchip_vpu981_av1_dec_set_loopfilter(ctx);2125 rockchip_vpu981_av1_dec_set_picture_dimensions(ctx);2126 rockchip_vpu981_av1_dec_set_cdef(ctx);2127 rockchip_vpu981_av1_dec_set_lr(ctx);2128 rockchip_vpu981_av1_dec_set_fgs(ctx);2129 rockchip_vpu981_av1_dec_set_prob(ctx);2130 2131 hantro_reg_write(vpu, &av1_dec_mode, AV1_DEC_MODE);2132 hantro_reg_write(vpu, &av1_dec_out_ec_byte_word, 0);2133 hantro_reg_write(vpu, &av1_write_mvs_e, 1);2134 hantro_reg_write(vpu, &av1_dec_out_ec_bypass, 1);2135 hantro_reg_write(vpu, &av1_dec_clk_gate_e, 1);2136 2137 hantro_reg_write(vpu, &av1_dec_abort_e, 0);2138 hantro_reg_write(vpu, &av1_dec_tile_int_e, 0);2139 2140 hantro_reg_write(vpu, &av1_dec_alignment, 64);2141 hantro_reg_write(vpu, &av1_apf_disable, 0);2142 hantro_reg_write(vpu, &av1_apf_threshold, 8);2143 hantro_reg_write(vpu, &av1_dec_buswidth, 2);2144 hantro_reg_write(vpu, &av1_dec_max_burst, 16);2145 hantro_reg_write(vpu, &av1_error_conceal_e, 0);2146 hantro_reg_write(vpu, &av1_axi_rd_ostd_threshold, 64);2147 hantro_reg_write(vpu, &av1_axi_wr_ostd_threshold, 64);2148 2149 hantro_reg_write(vpu, &av1_ext_timeout_cycles, 0xfffffff);2150 hantro_reg_write(vpu, &av1_ext_timeout_override_e, 1);2151 hantro_reg_write(vpu, &av1_timeout_cycles, 0xfffffff);2152 hantro_reg_write(vpu, &av1_timeout_override_e, 1);2153 2154 rockchip_vpu981_av1_dec_set_output_buffer(ctx);2155 rockchip_vpu981_av1_dec_set_input_buffer(ctx, vb2_src);2156 2157 hantro_end_prepare_run(ctx);2158 2159 hantro_reg_write(vpu, &av1_dec_e, 1);2160 2161 return 0;2162 2163prepare_error:2164 hantro_end_prepare_run(ctx);2165 hantro_irq_done(vpu, VB2_BUF_STATE_ERROR);2166 return ret;2167}2168 2169static void rockchip_vpu981_postproc_enable(struct hantro_ctx *ctx)2170{2171 struct hantro_dev *vpu = ctx->dev;2172 int width = ctx->dst_fmt.width;2173 int height = ctx->dst_fmt.height;2174 struct vb2_v4l2_buffer *vb2_dst;2175 size_t chroma_offset;2176 dma_addr_t dst_dma;2177 2178 vb2_dst = hantro_get_dst_buf(ctx);2179 2180 dst_dma = vb2_dma_contig_plane_dma_addr(&vb2_dst->vb2_buf, 0);2181 chroma_offset = ctx->dst_fmt.plane_fmt[0].bytesperline *2182 ctx->dst_fmt.height;2183 2184 /* enable post processor */2185 hantro_reg_write(vpu, &av1_pp_out_e, 1);2186 hantro_reg_write(vpu, &av1_pp_in_format, 0);2187 hantro_reg_write(vpu, &av1_pp0_dup_hor, 1);2188 hantro_reg_write(vpu, &av1_pp0_dup_ver, 1);2189 2190 hantro_reg_write(vpu, &av1_pp_in_height, height / 2);2191 hantro_reg_write(vpu, &av1_pp_in_width, width / 2);2192 hantro_reg_write(vpu, &av1_pp_out_height, height);2193 hantro_reg_write(vpu, &av1_pp_out_width, width);2194 hantro_reg_write(vpu, &av1_pp_out_y_stride,2195 ctx->dst_fmt.plane_fmt[0].bytesperline);2196 hantro_reg_write(vpu, &av1_pp_out_c_stride,2197 ctx->dst_fmt.plane_fmt[0].bytesperline);2198 switch (ctx->dst_fmt.pixelformat) {2199 case V4L2_PIX_FMT_P010:2200 hantro_reg_write(vpu, &av1_pp_out_format, 1);2201 break;2202 case V4L2_PIX_FMT_NV12:2203 hantro_reg_write(vpu, &av1_pp_out_format, 3);2204 break;2205 default:2206 hantro_reg_write(vpu, &av1_pp_out_format, 0);2207 }2208 2209 hantro_reg_write(vpu, &av1_ppd_blend_exist, 0);2210 hantro_reg_write(vpu, &av1_ppd_dith_exist, 0);2211 hantro_reg_write(vpu, &av1_ablend_crop_e, 0);2212 hantro_reg_write(vpu, &av1_pp_format_customer1_e, 0);2213 hantro_reg_write(vpu, &av1_pp_crop_exist, 0);2214 hantro_reg_write(vpu, &av1_pp_up_level, 0);2215 hantro_reg_write(vpu, &av1_pp_down_level, 0);2216 hantro_reg_write(vpu, &av1_pp_exist, 0);2217 2218 hantro_write_addr(vpu, AV1_PP_OUT_LU, dst_dma);2219 hantro_write_addr(vpu, AV1_PP_OUT_CH, dst_dma + chroma_offset);2220}2221 2222static void rockchip_vpu981_postproc_disable(struct hantro_ctx *ctx)2223{2224 struct hantro_dev *vpu = ctx->dev;2225 2226 /* disable post processor */2227 hantro_reg_write(vpu, &av1_pp_out_e, 0);2228}2229 2230const struct hantro_postproc_ops rockchip_vpu981_postproc_ops = {2231 .enable = rockchip_vpu981_postproc_enable,2232 .disable = rockchip_vpu981_postproc_disable,2233};2234