xref: /rockchip-linux_mpp/mpp/hal/vpu/av1d/hal_av1d_vdpu.c (revision 437bfbeb9567cca9cd9080e3f6954aa9d6a94f18)
1*437bfbebSnyanmisaka /*
2*437bfbebSnyanmisaka  * Copyright 2020 Rockchip Electronics Co. LTD
3*437bfbebSnyanmisaka  *
4*437bfbebSnyanmisaka  * Licensed under the Apache License, Version 2.0 (the "License");
5*437bfbebSnyanmisaka  * you may not use this file except in compliance with the License.
6*437bfbebSnyanmisaka  * You may obtain a copy of the License at
7*437bfbebSnyanmisaka  *
8*437bfbebSnyanmisaka  *      http://www.apache.org/licenses/LICENSE-2.0
9*437bfbebSnyanmisaka  *
10*437bfbebSnyanmisaka  * Unless required by applicable law or agreed to in writing, software
11*437bfbebSnyanmisaka  * distributed under the License is distributed on an "AS IS" BASIS,
12*437bfbebSnyanmisaka  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*437bfbebSnyanmisaka  * See the License for the specific language governing permissions and
14*437bfbebSnyanmisaka  * limitations under the License.
15*437bfbebSnyanmisaka  */
16*437bfbebSnyanmisaka 
17*437bfbebSnyanmisaka #define MODULE_TAG "hal_av1d_vdpu"
18*437bfbebSnyanmisaka 
19*437bfbebSnyanmisaka #include <stdio.h>
20*437bfbebSnyanmisaka #include <stdlib.h>
21*437bfbebSnyanmisaka #include <string.h>
22*437bfbebSnyanmisaka 
23*437bfbebSnyanmisaka #include "rk_type.h"
24*437bfbebSnyanmisaka #include "mpp_err.h"
25*437bfbebSnyanmisaka #include "mpp_mem.h"
26*437bfbebSnyanmisaka #include "mpp_common.h"
27*437bfbebSnyanmisaka #include "mpp_bitput.h"
28*437bfbebSnyanmisaka #include "mpp_hal.h"
29*437bfbebSnyanmisaka #include "mpp_dec_cb_param.h"
30*437bfbebSnyanmisaka #include "mpp_device.h"
31*437bfbebSnyanmisaka #include "hal_bufs.h"
32*437bfbebSnyanmisaka 
33*437bfbebSnyanmisaka #include "hal_av1d_vdpu_reg.h"
34*437bfbebSnyanmisaka #include "hal_av1d_common.h"
35*437bfbebSnyanmisaka #include "av1d_syntax.h"
36*437bfbebSnyanmisaka #include "film_grain_noise_table.h"
37*437bfbebSnyanmisaka #include "av1d_common.h"
38*437bfbebSnyanmisaka 
39*437bfbebSnyanmisaka #define VDPU_FAST_REG_SET_CNT    3
40*437bfbebSnyanmisaka #define AV1_MAX_TILES 128
41*437bfbebSnyanmisaka #define AV1_TILE_INFO_SIZE AV1_MAX_TILES * 16
42*437bfbebSnyanmisaka #define GM_GLOBAL_MODELS_PER_FRAME 7
43*437bfbebSnyanmisaka #define GLOBAL_MODEL_TOTAL_SIZE (6 * 4 + 4 * 2)
44*437bfbebSnyanmisaka #define GLOBAL_MODEL_SIZE GM_GLOBAL_MODELS_PER_FRAME * GLOBAL_MODEL_TOTAL_SIZE
45*437bfbebSnyanmisaka #define MaxTiles 128
46*437bfbebSnyanmisaka 
47*437bfbebSnyanmisaka #define DUMP_AV1_DATAS 0
48*437bfbebSnyanmisaka 
49*437bfbebSnyanmisaka typedef enum AV1D_FILT_TYPE_E {
50*437bfbebSnyanmisaka     DB_DATA_COL,
51*437bfbebSnyanmisaka     DB_CTRL_COL,
52*437bfbebSnyanmisaka     CDEF_COL,
53*437bfbebSnyanmisaka     SR_COL,
54*437bfbebSnyanmisaka     LR_COL,
55*437bfbebSnyanmisaka     RFC_COL,
56*437bfbebSnyanmisaka     FILT_TYPE_BUT,
57*437bfbebSnyanmisaka } Av1dFiltType_e;
58*437bfbebSnyanmisaka 
59*437bfbebSnyanmisaka typedef struct filt_info_t {
60*437bfbebSnyanmisaka     RK_U32 size;
61*437bfbebSnyanmisaka     RK_U32 offset;
62*437bfbebSnyanmisaka } filtInfo;
63*437bfbebSnyanmisaka 
64*437bfbebSnyanmisaka typedef struct av1d_rkv_buf_t {
65*437bfbebSnyanmisaka     RK_U32              valid;
66*437bfbebSnyanmisaka     VdpuAv1dRegSet  *regs;
67*437bfbebSnyanmisaka } av1dVdpuBuf;
68*437bfbebSnyanmisaka 
69*437bfbebSnyanmisaka typedef struct VdpuAv1dRegCtx_t {
70*437bfbebSnyanmisaka     av1dVdpuBuf     reg_buf[VDPU_FAST_REG_SET_CNT];
71*437bfbebSnyanmisaka     MppBuffer       prob_tbl_base;
72*437bfbebSnyanmisaka     MppBuffer       prob_tbl_out_base;
73*437bfbebSnyanmisaka     MppBuffer       tile_info;
74*437bfbebSnyanmisaka     MppBuffer       film_grain_mem;
75*437bfbebSnyanmisaka     MppBuffer       global_model;
76*437bfbebSnyanmisaka     MppBuffer       filter_mem;
77*437bfbebSnyanmisaka     MppBuffer       tile_buf;
78*437bfbebSnyanmisaka     filtInfo        filt_info[FILT_TYPE_BUT];
79*437bfbebSnyanmisaka 
80*437bfbebSnyanmisaka     AV1CDFs         *cdfs;
81*437bfbebSnyanmisaka     MvCDFs          *cdfs_ndvc;
82*437bfbebSnyanmisaka     AV1CDFs         default_cdfs;
83*437bfbebSnyanmisaka     MvCDFs          default_cdfs_ndvc;
84*437bfbebSnyanmisaka     AV1CDFs         cdfs_last[NUM_REF_FRAMES];
85*437bfbebSnyanmisaka     MvCDFs          cdfs_last_ndvc[NUM_REF_FRAMES];
86*437bfbebSnyanmisaka     RK_U32          refresh_frame_flags;
87*437bfbebSnyanmisaka 
88*437bfbebSnyanmisaka     RK_U32          width;
89*437bfbebSnyanmisaka     RK_U32          height;
90*437bfbebSnyanmisaka     RK_S32          hor_stride;
91*437bfbebSnyanmisaka     RK_S32          ver_stride;
92*437bfbebSnyanmisaka     RK_U32          luma_size ;
93*437bfbebSnyanmisaka     RK_U32          chroma_size;
94*437bfbebSnyanmisaka 
95*437bfbebSnyanmisaka     FilmGrainMemory fgsmem;
96*437bfbebSnyanmisaka 
97*437bfbebSnyanmisaka     RK_S8           prev_out_buffer_i;
98*437bfbebSnyanmisaka     RK_U8           fbc_en;
99*437bfbebSnyanmisaka     RK_U8           resolution_change;
100*437bfbebSnyanmisaka     RK_U8           tile_transpose;
101*437bfbebSnyanmisaka     RK_U32          ref_frame_sign_bias[AV1_REF_LIST_SIZE];
102*437bfbebSnyanmisaka 
103*437bfbebSnyanmisaka     VdpuAv1dRegSet  *regs;
104*437bfbebSnyanmisaka     HalBufs         tile_out_bufs;
105*437bfbebSnyanmisaka     RK_U32          tile_out_count;
106*437bfbebSnyanmisaka     size_t          tile_out_size;
107*437bfbebSnyanmisaka 
108*437bfbebSnyanmisaka     RK_U32          num_tile_cols;
109*437bfbebSnyanmisaka } VdpuAv1dRegCtx;
110*437bfbebSnyanmisaka 
rkv_ver_align(RK_U32 val)111*437bfbebSnyanmisaka static RK_U32 rkv_ver_align(RK_U32 val)
112*437bfbebSnyanmisaka {
113*437bfbebSnyanmisaka     return MPP_ALIGN(val, 8);
114*437bfbebSnyanmisaka }
115*437bfbebSnyanmisaka 
rkv_hor_align(RK_U32 val)116*437bfbebSnyanmisaka static RK_U32 rkv_hor_align(RK_U32 val)
117*437bfbebSnyanmisaka {
118*437bfbebSnyanmisaka     return MPP_ALIGN(val, 16);
119*437bfbebSnyanmisaka }
120*437bfbebSnyanmisaka 
rkv_len_align(RK_U32 val)121*437bfbebSnyanmisaka static RK_U32 rkv_len_align(RK_U32 val)
122*437bfbebSnyanmisaka {
123*437bfbebSnyanmisaka     return (2 * MPP_ALIGN(val, 128));
124*437bfbebSnyanmisaka }
125*437bfbebSnyanmisaka 
rkv_len_align_422(RK_U32 val)126*437bfbebSnyanmisaka static RK_U32 rkv_len_align_422(RK_U32 val)
127*437bfbebSnyanmisaka {
128*437bfbebSnyanmisaka     return ((5 * MPP_ALIGN(val, 64)) / 2);
129*437bfbebSnyanmisaka }
130*437bfbebSnyanmisaka 
hal_av1d_alloc_res(void * hal)131*437bfbebSnyanmisaka static MPP_RET hal_av1d_alloc_res(void *hal)
132*437bfbebSnyanmisaka {
133*437bfbebSnyanmisaka     MPP_RET ret = MPP_OK;
134*437bfbebSnyanmisaka     Av1dHalCtx *p_hal = (Av1dHalCtx *)hal;
135*437bfbebSnyanmisaka     RK_U32 max_cnt = p_hal->fast_mode ? VDPU_FAST_REG_SET_CNT : 1;
136*437bfbebSnyanmisaka     RK_U32 i = 0;
137*437bfbebSnyanmisaka     INP_CHECK(ret, NULL == p_hal);
138*437bfbebSnyanmisaka 
139*437bfbebSnyanmisaka     MEM_CHECK(ret, p_hal->reg_ctx = mpp_calloc_size(void, sizeof(VdpuAv1dRegCtx)));
140*437bfbebSnyanmisaka     VdpuAv1dRegCtx *reg_ctx = (VdpuAv1dRegCtx *)p_hal->reg_ctx;
141*437bfbebSnyanmisaka 
142*437bfbebSnyanmisaka     //!< malloc buffers
143*437bfbebSnyanmisaka     for (i = 0; i < max_cnt; i++) {
144*437bfbebSnyanmisaka         reg_ctx->reg_buf[i].regs = mpp_calloc(VdpuAv1dRegSet, 1);
145*437bfbebSnyanmisaka         memset(reg_ctx->reg_buf[i].regs, 0, sizeof(VdpuAv1dRegSet));
146*437bfbebSnyanmisaka     }
147*437bfbebSnyanmisaka 
148*437bfbebSnyanmisaka     if (!p_hal->fast_mode) {
149*437bfbebSnyanmisaka         reg_ctx->regs = reg_ctx->reg_buf[0].regs;
150*437bfbebSnyanmisaka     }
151*437bfbebSnyanmisaka 
152*437bfbebSnyanmisaka     BUF_CHECK(ret, mpp_buffer_get(p_hal->buf_group, &reg_ctx->prob_tbl_base, MPP_ALIGN(sizeof(AV1CDFs), 2048)));
153*437bfbebSnyanmisaka     BUF_CHECK(ret, mpp_buffer_get(p_hal->buf_group, &reg_ctx->prob_tbl_out_base, MPP_ALIGN(sizeof(AV1CDFs), 2048)));
154*437bfbebSnyanmisaka     BUF_CHECK(ret, mpp_buffer_get(p_hal->buf_group, &reg_ctx->tile_info, AV1_TILE_INFO_SIZE));
155*437bfbebSnyanmisaka     BUF_CHECK(ret, mpp_buffer_get(p_hal->buf_group, &reg_ctx->film_grain_mem, MPP_ALIGN(sizeof(AV1FilmGrainMemory), 2048)));
156*437bfbebSnyanmisaka     BUF_CHECK(ret, mpp_buffer_get(p_hal->buf_group, &reg_ctx->global_model, MPP_ALIGN(GLOBAL_MODEL_SIZE, 2048)));
157*437bfbebSnyanmisaka     BUF_CHECK(ret, mpp_buffer_get(p_hal->buf_group, &reg_ctx->tile_buf, MPP_ALIGN(32 * MaxTiles, 4096)));
158*437bfbebSnyanmisaka 
159*437bfbebSnyanmisaka __RETURN:
160*437bfbebSnyanmisaka     return ret;
161*437bfbebSnyanmisaka __FAILED:
162*437bfbebSnyanmisaka     return ret;
163*437bfbebSnyanmisaka }
164*437bfbebSnyanmisaka 
vdpu_av1d_filtermem_release(VdpuAv1dRegCtx * ctx)165*437bfbebSnyanmisaka static void vdpu_av1d_filtermem_release(VdpuAv1dRegCtx *ctx)
166*437bfbebSnyanmisaka {
167*437bfbebSnyanmisaka     BUF_PUT(ctx->filter_mem);
168*437bfbebSnyanmisaka }
169*437bfbebSnyanmisaka 
vdpu_av1d_filtermem_alloc(Av1dHalCtx * p_hal,VdpuAv1dRegCtx * ctx,DXVA_PicParams_AV1 * dxva)170*437bfbebSnyanmisaka static MPP_RET vdpu_av1d_filtermem_alloc(Av1dHalCtx *p_hal, VdpuAv1dRegCtx *ctx, DXVA_PicParams_AV1 *dxva)
171*437bfbebSnyanmisaka {
172*437bfbebSnyanmisaka     RK_U32 size = 0;
173*437bfbebSnyanmisaka     RK_U32 pic_height = MPP_ALIGN(dxva->height, 64);
174*437bfbebSnyanmisaka     RK_U32 height_in_sb = pic_height / 64;
175*437bfbebSnyanmisaka     RK_U32 stripe_num = ((pic_height + 8) + 63) / 64;
176*437bfbebSnyanmisaka     RK_U32 max_bit_depth = 10;
177*437bfbebSnyanmisaka     RK_U32 num_tile_cols = 1 << dxva->tile_cols_log2;//dxva->tiles.cols;
178*437bfbebSnyanmisaka     filtInfo *filt_info = ctx->filt_info;
179*437bfbebSnyanmisaka 
180*437bfbebSnyanmisaka     /* db tile col data buffer */
181*437bfbebSnyanmisaka     // asic_buff->db_data_col_offset = 0;
182*437bfbebSnyanmisaka     // asic_buff->db_data_col_tsize = NEXT_MULTIPLE(pic_height * 12 * max_bit_depth / 8, 128);
183*437bfbebSnyanmisaka     // size = asic_buff->db_data_col_tsize * num_tile_cols;
184*437bfbebSnyanmisaka     // asic_buff->db_ctrl_col_offset = size;
185*437bfbebSnyanmisaka 
186*437bfbebSnyanmisaka     filt_info[DB_DATA_COL].offset = 0;
187*437bfbebSnyanmisaka     filt_info[DB_DATA_COL].size = MPP_ALIGN(pic_height * 12 * max_bit_depth / 8, 128);
188*437bfbebSnyanmisaka     size += filt_info[DB_DATA_COL].size * num_tile_cols;
189*437bfbebSnyanmisaka 
190*437bfbebSnyanmisaka 
191*437bfbebSnyanmisaka     /* db tile col ctrl buffer */
192*437bfbebSnyanmisaka     filt_info[DB_CTRL_COL].offset = size;
193*437bfbebSnyanmisaka     filt_info[DB_CTRL_COL].size = MPP_ALIGN(pic_height * 2 * 16 / 4, 128);
194*437bfbebSnyanmisaka     size += filt_info[DB_CTRL_COL].size * num_tile_cols;
195*437bfbebSnyanmisaka 
196*437bfbebSnyanmisaka     // size += asic_buff->db_ctrl_col_tsize * num_tile_cols;
197*437bfbebSnyanmisaka     // asic_buff->cdef_col_offset = size;
198*437bfbebSnyanmisaka 
199*437bfbebSnyanmisaka     /* cdef tile col buffer */
200*437bfbebSnyanmisaka     filt_info[CDEF_COL].offset = size;
201*437bfbebSnyanmisaka     filt_info[CDEF_COL].size = MPP_ALIGN(height_in_sb * 44 * max_bit_depth * 16 / 8, 128);
202*437bfbebSnyanmisaka     size += filt_info[CDEF_COL].size * num_tile_cols;
203*437bfbebSnyanmisaka     // asic_buff->cdef_col_tsize = NEXT_MULTIPLE(height_in_sb * 44 * max_bit_depth * 16 / 8, 128);
204*437bfbebSnyanmisaka     // size += asic_buff->cdef_col_tsize * num_tile_cols;
205*437bfbebSnyanmisaka     // asic_buff->sr_col_offset = size;
206*437bfbebSnyanmisaka 
207*437bfbebSnyanmisaka     /* sr tile col buffer */
208*437bfbebSnyanmisaka     filt_info[SR_COL].offset = size;
209*437bfbebSnyanmisaka     filt_info[SR_COL].size = MPP_ALIGN(height_in_sb * (3040 + 1280), 128);
210*437bfbebSnyanmisaka     size += filt_info[SR_COL].size * num_tile_cols;
211*437bfbebSnyanmisaka     // asic_buff->sr_col_tsize = NEXT_MULTIPLE(height_in_sb * (3040 + 1280), 128);
212*437bfbebSnyanmisaka     // size += asic_buff->sr_col_tsize * num_tile_cols;
213*437bfbebSnyanmisaka     // asic_buff->lr_col_offset = size;
214*437bfbebSnyanmisaka 
215*437bfbebSnyanmisaka     /* lr tile col buffer */
216*437bfbebSnyanmisaka     filt_info[LR_COL].offset = size;
217*437bfbebSnyanmisaka     filt_info[LR_COL].size = MPP_ALIGN(stripe_num * 1536 * max_bit_depth / 8, 128);
218*437bfbebSnyanmisaka     size += filt_info[LR_COL].size * num_tile_cols;
219*437bfbebSnyanmisaka     // asic_buff->lr_col_tsize = NEXT_MULTIPLE(stripe_num * 1536 * max_bit_depth / 8, 128);
220*437bfbebSnyanmisaka     // size += asic_buff->lr_col_tsize * num_tile_cols;
221*437bfbebSnyanmisaka     // if (dec_cont->use_multicore) {
222*437bfbebSnyanmisaka     //     asic_buff->rfc_col_offset = size;
223*437bfbebSnyanmisaka     //     asic_buff->rfc_col_size = NEXT_MULTIPLE(asic_buff->height, 8) / 8 * 16 * 2;
224*437bfbebSnyanmisaka     //     size += asic_buff->rfc_col_size * num_tile_cols;
225*437bfbebSnyanmisaka     // }
226*437bfbebSnyanmisaka     if (!mpp_buffer_get(p_hal->buf_group, &ctx->filter_mem, MPP_ALIGN(size, SZ_4K)))
227*437bfbebSnyanmisaka         return MPP_NOK;
228*437bfbebSnyanmisaka 
229*437bfbebSnyanmisaka     return MPP_OK;
230*437bfbebSnyanmisaka }
231*437bfbebSnyanmisaka 
hal_av1d_release_res(void * hal)232*437bfbebSnyanmisaka static void hal_av1d_release_res(void *hal)
233*437bfbebSnyanmisaka {
234*437bfbebSnyanmisaka     Av1dHalCtx *p_hal = (Av1dHalCtx *)hal;
235*437bfbebSnyanmisaka     VdpuAv1dRegCtx *reg_ctx = (VdpuAv1dRegCtx *)p_hal->reg_ctx;
236*437bfbebSnyanmisaka     RK_U32 i = 0;
237*437bfbebSnyanmisaka     RK_U32 loop = p_hal->fast_mode ? MPP_ARRAY_ELEMS(reg_ctx->reg_buf) : 1;
238*437bfbebSnyanmisaka 
239*437bfbebSnyanmisaka     for (i = 0; i < loop; i++)
240*437bfbebSnyanmisaka         MPP_FREE(reg_ctx->reg_buf[i].regs);
241*437bfbebSnyanmisaka 
242*437bfbebSnyanmisaka     BUF_PUT(reg_ctx->prob_tbl_base);
243*437bfbebSnyanmisaka     BUF_PUT(reg_ctx->prob_tbl_out_base);
244*437bfbebSnyanmisaka     BUF_PUT(reg_ctx->tile_info);
245*437bfbebSnyanmisaka     BUF_PUT(reg_ctx->film_grain_mem);
246*437bfbebSnyanmisaka     BUF_PUT(reg_ctx->global_model);
247*437bfbebSnyanmisaka     BUF_PUT(reg_ctx->tile_buf);
248*437bfbebSnyanmisaka     vdpu_av1d_filtermem_release(reg_ctx);
249*437bfbebSnyanmisaka     hal_bufs_deinit(reg_ctx->tile_out_bufs);
250*437bfbebSnyanmisaka 
251*437bfbebSnyanmisaka     MPP_FREE(p_hal->reg_ctx);
252*437bfbebSnyanmisaka }
253*437bfbebSnyanmisaka 
vdpu_av1d_deinit(void * hal)254*437bfbebSnyanmisaka MPP_RET vdpu_av1d_deinit(void *hal)
255*437bfbebSnyanmisaka {
256*437bfbebSnyanmisaka     hal_av1d_release_res(hal);
257*437bfbebSnyanmisaka 
258*437bfbebSnyanmisaka     return MPP_OK;
259*437bfbebSnyanmisaka }
260*437bfbebSnyanmisaka 
vdpu_av1d_init(void * hal,MppHalCfg * cfg)261*437bfbebSnyanmisaka MPP_RET vdpu_av1d_init(void *hal, MppHalCfg *cfg)
262*437bfbebSnyanmisaka {
263*437bfbebSnyanmisaka     MPP_RET ret = MPP_OK;
264*437bfbebSnyanmisaka     Av1dHalCtx *p_hal = (Av1dHalCtx *)hal;
265*437bfbebSnyanmisaka     INP_CHECK(ret, NULL == p_hal);
266*437bfbebSnyanmisaka 
267*437bfbebSnyanmisaka     FUN_CHECK(hal_av1d_alloc_res(hal));
268*437bfbebSnyanmisaka 
269*437bfbebSnyanmisaka     {
270*437bfbebSnyanmisaka         VdpuAv1dRegCtx *reg_ctx = (VdpuAv1dRegCtx *)p_hal->reg_ctx;
271*437bfbebSnyanmisaka 
272*437bfbebSnyanmisaka         reg_ctx->cdfs = &reg_ctx->default_cdfs;
273*437bfbebSnyanmisaka         reg_ctx->cdfs_ndvc = &reg_ctx->default_cdfs_ndvc;
274*437bfbebSnyanmisaka         reg_ctx->tile_transpose = 1;
275*437bfbebSnyanmisaka     }
276*437bfbebSnyanmisaka 
277*437bfbebSnyanmisaka     mpp_slots_set_prop(p_hal->slots, SLOTS_HOR_ALIGN, rkv_hor_align);
278*437bfbebSnyanmisaka     mpp_slots_set_prop(p_hal->slots, SLOTS_VER_ALIGN, rkv_ver_align);
279*437bfbebSnyanmisaka     mpp_slots_set_prop(p_hal->slots, SLOTS_LEN_ALIGN, rkv_len_align);
280*437bfbebSnyanmisaka 
281*437bfbebSnyanmisaka     (void)cfg;
282*437bfbebSnyanmisaka __RETURN:
283*437bfbebSnyanmisaka     return MPP_OK;
284*437bfbebSnyanmisaka __FAILED:
285*437bfbebSnyanmisaka     vdpu_av1d_deinit(hal);
286*437bfbebSnyanmisaka 
287*437bfbebSnyanmisaka     return ret;
288*437bfbebSnyanmisaka }
289*437bfbebSnyanmisaka 
set_ref_width(VdpuAv1dRegSet * regs,RK_S32 i,RK_S32 val)290*437bfbebSnyanmisaka static void set_ref_width(VdpuAv1dRegSet *regs, RK_S32 i, RK_S32 val)
291*437bfbebSnyanmisaka {
292*437bfbebSnyanmisaka     if (i == 0) {
293*437bfbebSnyanmisaka         regs->swreg33.sw_ref0_width = val;
294*437bfbebSnyanmisaka     } else if (i == 1) {
295*437bfbebSnyanmisaka         regs->swreg34.sw_ref1_width = val;
296*437bfbebSnyanmisaka     } else if (i == 2) {
297*437bfbebSnyanmisaka         regs->swreg35.sw_ref2_width = val;
298*437bfbebSnyanmisaka     } else if (i == 3) {
299*437bfbebSnyanmisaka         regs->swreg43.sw_ref3_width = val;
300*437bfbebSnyanmisaka     } else if (i == 4) {
301*437bfbebSnyanmisaka         regs->swreg44.sw_ref4_width = val;
302*437bfbebSnyanmisaka     } else if (i == 5) {
303*437bfbebSnyanmisaka         regs->swreg45.sw_ref5_width = val;
304*437bfbebSnyanmisaka     } else if (i == 6) {
305*437bfbebSnyanmisaka         regs->swreg46.sw_ref6_width = val;
306*437bfbebSnyanmisaka     } else {
307*437bfbebSnyanmisaka         mpp_err("Error: trying to set invalid reference index.");
308*437bfbebSnyanmisaka     }
309*437bfbebSnyanmisaka }
310*437bfbebSnyanmisaka 
set_ref_height(VdpuAv1dRegSet * regs,RK_S32 i,RK_S32 val)311*437bfbebSnyanmisaka static void set_ref_height(VdpuAv1dRegSet *regs, RK_S32 i, RK_S32 val)
312*437bfbebSnyanmisaka {
313*437bfbebSnyanmisaka     if (i == 0) {
314*437bfbebSnyanmisaka         regs->swreg33.sw_ref0_height = val;
315*437bfbebSnyanmisaka     } else if (i == 1) {
316*437bfbebSnyanmisaka         regs->swreg34.sw_ref1_height = val;
317*437bfbebSnyanmisaka     } else if (i == 2) {
318*437bfbebSnyanmisaka         regs->swreg35.sw_ref2_height = val;
319*437bfbebSnyanmisaka     } else if (i == 3) {
320*437bfbebSnyanmisaka         regs->swreg43.sw_ref3_height = val;
321*437bfbebSnyanmisaka     } else if (i == 4) {
322*437bfbebSnyanmisaka         regs->swreg44.sw_ref4_height = val;
323*437bfbebSnyanmisaka     } else if (i == 5) {
324*437bfbebSnyanmisaka         regs->swreg45.sw_ref5_height = val;
325*437bfbebSnyanmisaka     } else if (i == 6) {
326*437bfbebSnyanmisaka         regs->swreg46.sw_ref6_height = val;
327*437bfbebSnyanmisaka     } else {
328*437bfbebSnyanmisaka         mpp_err("Error: trying to set invalid reference index.");
329*437bfbebSnyanmisaka     }
330*437bfbebSnyanmisaka }
331*437bfbebSnyanmisaka 
set_ref_hor_scale(VdpuAv1dRegSet * regs,RK_S32 i,RK_S32 val)332*437bfbebSnyanmisaka static void set_ref_hor_scale(VdpuAv1dRegSet *regs, RK_S32 i, RK_S32 val)
333*437bfbebSnyanmisaka {
334*437bfbebSnyanmisaka     if (i == 0) {
335*437bfbebSnyanmisaka         regs->swreg36.sw_ref0_hor_scale = val;
336*437bfbebSnyanmisaka     } else if (i == 1) {
337*437bfbebSnyanmisaka         regs->swreg37.sw_ref1_hor_scale = val;
338*437bfbebSnyanmisaka     } else if (i == 2) {
339*437bfbebSnyanmisaka         regs->swreg38.sw_ref2_hor_scale = val;
340*437bfbebSnyanmisaka     } else if (i == 3) {
341*437bfbebSnyanmisaka         regs->swreg39.sw_ref3_hor_scale = val;
342*437bfbebSnyanmisaka     } else if (i == 4) {
343*437bfbebSnyanmisaka         regs->swreg40.sw_ref4_hor_scale = val;
344*437bfbebSnyanmisaka     } else if (i == 5) {
345*437bfbebSnyanmisaka         regs->swreg41.sw_ref5_hor_scale = val;
346*437bfbebSnyanmisaka     } else if (i == 6) {
347*437bfbebSnyanmisaka         regs->swreg42.sw_ref6_hor_scale = val;
348*437bfbebSnyanmisaka     } else {
349*437bfbebSnyanmisaka         mpp_err("Error: trying to set invalid reference index.");
350*437bfbebSnyanmisaka     }
351*437bfbebSnyanmisaka }
352*437bfbebSnyanmisaka 
set_ref_ver_scale(VdpuAv1dRegSet * regs,RK_S32 i,RK_S32 val)353*437bfbebSnyanmisaka static void set_ref_ver_scale(VdpuAv1dRegSet *regs, RK_S32 i, RK_S32 val)
354*437bfbebSnyanmisaka {
355*437bfbebSnyanmisaka     if (i == 0) {
356*437bfbebSnyanmisaka         regs->swreg36.sw_ref0_ver_scale = val;
357*437bfbebSnyanmisaka     } else if (i == 1) {
358*437bfbebSnyanmisaka         regs->swreg37.sw_ref1_ver_scale = val;
359*437bfbebSnyanmisaka     } else if (i == 2) {
360*437bfbebSnyanmisaka         regs->swreg38.sw_ref2_ver_scale = val;
361*437bfbebSnyanmisaka     } else if (i == 3) {
362*437bfbebSnyanmisaka         regs->swreg39.sw_ref3_ver_scale = val;
363*437bfbebSnyanmisaka     } else if (i == 4) {
364*437bfbebSnyanmisaka         regs->swreg40.sw_ref4_ver_scale = val;
365*437bfbebSnyanmisaka     } else if (i == 5) {
366*437bfbebSnyanmisaka         regs->swreg41.sw_ref5_ver_scale = val;
367*437bfbebSnyanmisaka     } else if (i == 6) {
368*437bfbebSnyanmisaka         regs->swreg42.sw_ref6_ver_scale = val;
369*437bfbebSnyanmisaka     } else {
370*437bfbebSnyanmisaka         mpp_err("Error: trying to set invalid reference index.");
371*437bfbebSnyanmisaka     }
372*437bfbebSnyanmisaka }
373*437bfbebSnyanmisaka 
set_ref_lum_base(VdpuAv1dRegSet * regs,RK_S32 i,RK_S32 val,HalBufs bufs)374*437bfbebSnyanmisaka static void set_ref_lum_base(VdpuAv1dRegSet *regs, RK_S32 i, RK_S32 val, HalBufs bufs)
375*437bfbebSnyanmisaka {
376*437bfbebSnyanmisaka     HalBuf *tile_out_buf;
377*437bfbebSnyanmisaka     tile_out_buf = hal_bufs_get_buf(bufs, val);
378*437bfbebSnyanmisaka     // MppBuffer framebuf = NULL;
379*437bfbebSnyanmisaka     // mpp_buf_slot_get_prop(slots, val, SLOT_BUFFER, &framebuf);
380*437bfbebSnyanmisaka     if (tile_out_buf == NULL) {
381*437bfbebSnyanmisaka         mpp_err_f("get slots frame buff fail");
382*437bfbebSnyanmisaka         return;
383*437bfbebSnyanmisaka     }
384*437bfbebSnyanmisaka     val =  mpp_buffer_get_fd(tile_out_buf->buf[0]);
385*437bfbebSnyanmisaka     if (i == 0) {
386*437bfbebSnyanmisaka         regs->addr_cfg.swreg67.sw_refer0_ybase_lsb = val;
387*437bfbebSnyanmisaka     } else if (i == 1) {
388*437bfbebSnyanmisaka         regs->addr_cfg.swreg69.sw_refer1_ybase_lsb = val;
389*437bfbebSnyanmisaka     } else if (i == 2) {
390*437bfbebSnyanmisaka         regs->addr_cfg.swreg71.sw_refer2_ybase_lsb = val;
391*437bfbebSnyanmisaka     } else if (i == 3) {
392*437bfbebSnyanmisaka         regs->addr_cfg.swreg73.sw_refer3_ybase_lsb = val;
393*437bfbebSnyanmisaka     } else if (i == 4) {
394*437bfbebSnyanmisaka         regs->addr_cfg.swreg75.sw_refer4_ybase_lsb = val;
395*437bfbebSnyanmisaka     } else if (i == 5) {
396*437bfbebSnyanmisaka         regs->addr_cfg.swreg77.sw_refer5_ybase_lsb = val;
397*437bfbebSnyanmisaka     } else if (i == 6) {
398*437bfbebSnyanmisaka         regs->addr_cfg.swreg79.sw_refer6_ybase_lsb = val;
399*437bfbebSnyanmisaka     } else {
400*437bfbebSnyanmisaka         mpp_err( "Error: trying to set invalid reference index.");
401*437bfbebSnyanmisaka     }
402*437bfbebSnyanmisaka }
403*437bfbebSnyanmisaka 
set_ref_lum_base_msb(VdpuAv1dRegSet * regs,RK_S32 i,RK_S32 val)404*437bfbebSnyanmisaka static void set_ref_lum_base_msb(VdpuAv1dRegSet *regs, RK_S32 i, RK_S32 val)
405*437bfbebSnyanmisaka {
406*437bfbebSnyanmisaka     if (i == 0) {
407*437bfbebSnyanmisaka         regs->addr_cfg.swreg66.sw_refer0_ybase_msb = val;
408*437bfbebSnyanmisaka     } else if (i == 1) {
409*437bfbebSnyanmisaka         regs->addr_cfg.swreg68.sw_refer1_ybase_msb = val;
410*437bfbebSnyanmisaka     } else if (i == 2) {
411*437bfbebSnyanmisaka         regs->addr_cfg.swreg70.sw_refer2_ybase_msb = val;
412*437bfbebSnyanmisaka     } else if (i == 3) {
413*437bfbebSnyanmisaka         regs->addr_cfg.swreg72.sw_refer3_ybase_msb = val;
414*437bfbebSnyanmisaka     } else if (i == 4) {
415*437bfbebSnyanmisaka         regs->addr_cfg.swreg74.sw_refer4_ybase_msb = val;
416*437bfbebSnyanmisaka     } else if (i == 5) {
417*437bfbebSnyanmisaka         regs->addr_cfg.swreg76.sw_refer5_ybase_msb = val;
418*437bfbebSnyanmisaka     } else if (i == 6) {
419*437bfbebSnyanmisaka         regs->addr_cfg.swreg78.sw_refer6_ybase_msb = val;
420*437bfbebSnyanmisaka     } else {
421*437bfbebSnyanmisaka         mpp_err("Error: trying to set invalid reference index.");
422*437bfbebSnyanmisaka     }
423*437bfbebSnyanmisaka }
424*437bfbebSnyanmisaka 
set_ref_cb_base(Av1dHalCtx * p_hal,RK_S32 i,RK_S32 val,HalBufs bufs,RK_U32 offset)425*437bfbebSnyanmisaka static void set_ref_cb_base(Av1dHalCtx *p_hal, RK_S32 i, RK_S32 val, HalBufs bufs, RK_U32 offset)
426*437bfbebSnyanmisaka {
427*437bfbebSnyanmisaka     VdpuAv1dRegCtx *ctx = (VdpuAv1dRegCtx *)p_hal->reg_ctx;
428*437bfbebSnyanmisaka     VdpuAv1dRegSet *regs = ctx->regs;
429*437bfbebSnyanmisaka     HalBuf *tile_out_buf;
430*437bfbebSnyanmisaka     tile_out_buf = hal_bufs_get_buf(bufs, val);
431*437bfbebSnyanmisaka     // MppBuffer framebuf = NULL;
432*437bfbebSnyanmisaka 
433*437bfbebSnyanmisaka     // mpp_buf_slot_get_prop(slots, val, SLOT_BUFFER, &framebuf);
434*437bfbebSnyanmisaka     if (tile_out_buf == NULL) {
435*437bfbebSnyanmisaka         mpp_err_f("get slots frame buff fail");
436*437bfbebSnyanmisaka         return;
437*437bfbebSnyanmisaka     }
438*437bfbebSnyanmisaka     val =  mpp_buffer_get_fd(tile_out_buf->buf[0]);
439*437bfbebSnyanmisaka 
440*437bfbebSnyanmisaka     if (i == 0) {
441*437bfbebSnyanmisaka         mpp_dev_set_reg_offset(p_hal->dev, 101, offset);
442*437bfbebSnyanmisaka         regs->addr_cfg.swreg101.sw_refer0_cbase_lsb  = val;
443*437bfbebSnyanmisaka     } else if (i == 1) {
444*437bfbebSnyanmisaka         mpp_dev_set_reg_offset(p_hal->dev, 103, offset);
445*437bfbebSnyanmisaka         regs->addr_cfg.swreg103.sw_refer1_cbase_lsb  = val;
446*437bfbebSnyanmisaka     } else if (i == 2) {
447*437bfbebSnyanmisaka         mpp_dev_set_reg_offset(p_hal->dev, 105, offset);
448*437bfbebSnyanmisaka         regs->addr_cfg.swreg105.sw_refer2_cbase_lsb  = val;
449*437bfbebSnyanmisaka     } else if (i == 3) {
450*437bfbebSnyanmisaka         mpp_dev_set_reg_offset(p_hal->dev, 107, offset);
451*437bfbebSnyanmisaka         regs->addr_cfg.swreg107.sw_refer3_cbase_lsb  = val;
452*437bfbebSnyanmisaka     } else if (i == 4) {
453*437bfbebSnyanmisaka         mpp_dev_set_reg_offset(p_hal->dev, 109, offset);
454*437bfbebSnyanmisaka         regs->addr_cfg.swreg109.sw_refer4_cbase_lsb  = val;
455*437bfbebSnyanmisaka     } else if (i == 5) {
456*437bfbebSnyanmisaka         mpp_dev_set_reg_offset(p_hal->dev, 111, offset);
457*437bfbebSnyanmisaka         regs->addr_cfg.swreg111.sw_refer5_cbase_lsb  = val;
458*437bfbebSnyanmisaka     } else if (i == 6) {
459*437bfbebSnyanmisaka         mpp_dev_set_reg_offset(p_hal->dev, 113, offset);
460*437bfbebSnyanmisaka         regs->addr_cfg.swreg113.sw_refer6_cbase_lsb  = val;
461*437bfbebSnyanmisaka     } else {
462*437bfbebSnyanmisaka         mpp_err("Error: trying to set invalid reference index.");
463*437bfbebSnyanmisaka     }
464*437bfbebSnyanmisaka }
465*437bfbebSnyanmisaka 
set_ref_cb_base_msb(VdpuAv1dRegSet * regs,RK_S32 i,RK_S32 val)466*437bfbebSnyanmisaka static void set_ref_cb_base_msb(VdpuAv1dRegSet *regs, RK_S32 i, RK_S32 val)
467*437bfbebSnyanmisaka {
468*437bfbebSnyanmisaka     if (i == 0) {
469*437bfbebSnyanmisaka         regs->addr_cfg.swreg100.sw_refer0_cbase_msb = val;
470*437bfbebSnyanmisaka     } else if (i == 1) {
471*437bfbebSnyanmisaka         regs->addr_cfg.swreg102.sw_refer1_cbase_msb = val;
472*437bfbebSnyanmisaka     } else if (i == 2) {
473*437bfbebSnyanmisaka         regs->addr_cfg.swreg104.sw_refer2_cbase_msb = val;
474*437bfbebSnyanmisaka     } else if (i == 3) {
475*437bfbebSnyanmisaka         regs->addr_cfg.swreg106.sw_refer3_cbase_msb = val;
476*437bfbebSnyanmisaka     } else if (i == 4) {
477*437bfbebSnyanmisaka         regs->addr_cfg.swreg108.sw_refer4_cbase_msb = val;
478*437bfbebSnyanmisaka     } else if (i == 5) {
479*437bfbebSnyanmisaka         regs->addr_cfg.swreg110.sw_refer5_cbase_msb = val;
480*437bfbebSnyanmisaka     } else if (i == 6) {
481*437bfbebSnyanmisaka         regs->addr_cfg.swreg112.sw_refer6_cbase_msb = val;
482*437bfbebSnyanmisaka     } else {
483*437bfbebSnyanmisaka         mpp_err("Error: trying to set invalid reference index.");
484*437bfbebSnyanmisaka     }
485*437bfbebSnyanmisaka }
486*437bfbebSnyanmisaka 
487*437bfbebSnyanmisaka 
set_ref_dbase(Av1dHalCtx * p_hal,RK_S32 i,RK_S32 val,HalBufs bufs,RK_U32 offset)488*437bfbebSnyanmisaka static void set_ref_dbase(Av1dHalCtx *p_hal, RK_S32 i, RK_S32 val,  HalBufs bufs, RK_U32 offset)
489*437bfbebSnyanmisaka {
490*437bfbebSnyanmisaka     VdpuAv1dRegCtx *ctx = (VdpuAv1dRegCtx *)p_hal->reg_ctx;
491*437bfbebSnyanmisaka     VdpuAv1dRegSet *regs = ctx->regs;
492*437bfbebSnyanmisaka     HalBuf *tile_out_buf;
493*437bfbebSnyanmisaka     tile_out_buf = hal_bufs_get_buf(bufs, val);
494*437bfbebSnyanmisaka     // MppBuffer framebuf = NULL;
495*437bfbebSnyanmisaka 
496*437bfbebSnyanmisaka     // mpp_buf_slot_get_prop(slots, val, SLOT_BUFFER, &framebuf);
497*437bfbebSnyanmisaka     if (tile_out_buf == NULL) {
498*437bfbebSnyanmisaka         mpp_err_f("get slots frame buff fail");
499*437bfbebSnyanmisaka         return;
500*437bfbebSnyanmisaka     }
501*437bfbebSnyanmisaka     val =  mpp_buffer_get_fd(tile_out_buf->buf[0]);
502*437bfbebSnyanmisaka     if (i == 0) {
503*437bfbebSnyanmisaka         mpp_dev_set_reg_offset(p_hal->dev, 135, offset);
504*437bfbebSnyanmisaka         regs->addr_cfg.swreg135.sw_refer0_dbase_lsb = val;
505*437bfbebSnyanmisaka     } else if (i == 1) {
506*437bfbebSnyanmisaka         mpp_dev_set_reg_offset(p_hal->dev, 137, offset);
507*437bfbebSnyanmisaka         regs->addr_cfg.swreg137.sw_refer1_dbase_lsb = val;
508*437bfbebSnyanmisaka     } else if (i == 2) {
509*437bfbebSnyanmisaka         mpp_dev_set_reg_offset(p_hal->dev, 139, offset);
510*437bfbebSnyanmisaka         regs->addr_cfg.swreg139.sw_refer2_dbase_lsb = val;
511*437bfbebSnyanmisaka     } else if (i == 3) {
512*437bfbebSnyanmisaka         mpp_dev_set_reg_offset(p_hal->dev, 141, offset);
513*437bfbebSnyanmisaka         regs->addr_cfg.swreg141.sw_refer3_dbase_lsb = val;
514*437bfbebSnyanmisaka     } else if (i == 4) {
515*437bfbebSnyanmisaka         mpp_dev_set_reg_offset(p_hal->dev, 143, offset);
516*437bfbebSnyanmisaka         regs->addr_cfg.swreg143.sw_refer4_dbase_lsb = val;
517*437bfbebSnyanmisaka     } else if (i == 5) {
518*437bfbebSnyanmisaka         mpp_dev_set_reg_offset(p_hal->dev, 145, offset);
519*437bfbebSnyanmisaka         regs->addr_cfg.swreg145.sw_refer5_dbase_lsb = val;
520*437bfbebSnyanmisaka     } else if (i == 6) {
521*437bfbebSnyanmisaka         mpp_dev_set_reg_offset(p_hal->dev, 147, offset);
522*437bfbebSnyanmisaka         regs->addr_cfg.swreg147.sw_refer6_dbase_lsb = val;
523*437bfbebSnyanmisaka     } else {
524*437bfbebSnyanmisaka         mpp_err("Error: trying to set invalid reference index.");
525*437bfbebSnyanmisaka     }
526*437bfbebSnyanmisaka }
527*437bfbebSnyanmisaka 
set_ref_dbase_msb(VdpuAv1dRegSet * regs,RK_S32 i,RK_S32 val)528*437bfbebSnyanmisaka static void set_ref_dbase_msb(VdpuAv1dRegSet *regs, RK_S32 i, RK_S32 val)
529*437bfbebSnyanmisaka {
530*437bfbebSnyanmisaka     if (i == 0) {
531*437bfbebSnyanmisaka         regs->addr_cfg.swreg134.sw_refer0_dbase_msb = val;
532*437bfbebSnyanmisaka     } else if (i == 1) {
533*437bfbebSnyanmisaka         regs->addr_cfg.swreg136.sw_refer1_dbase_msb = val;
534*437bfbebSnyanmisaka     } else if (i == 2) {
535*437bfbebSnyanmisaka         regs->addr_cfg.swreg138.sw_refer2_dbase_msb = val;
536*437bfbebSnyanmisaka     } else if (i == 3) {
537*437bfbebSnyanmisaka         regs->addr_cfg.swreg140.sw_refer3_dbase_msb = val;
538*437bfbebSnyanmisaka     } else if (i == 4) {
539*437bfbebSnyanmisaka         regs->addr_cfg.swreg142.sw_refer4_dbase_msb = val;
540*437bfbebSnyanmisaka     } else if (i == 5) {
541*437bfbebSnyanmisaka         regs->addr_cfg.swreg144.sw_refer5_dbase_msb = val;
542*437bfbebSnyanmisaka     } else if (i == 6) {
543*437bfbebSnyanmisaka         regs->addr_cfg.swreg146.sw_refer6_dbase_msb = val;
544*437bfbebSnyanmisaka     } else {
545*437bfbebSnyanmisaka         mpp_err("Error: trying to set invalid reference index.");
546*437bfbebSnyanmisaka     }
547*437bfbebSnyanmisaka }
548*437bfbebSnyanmisaka 
set_ref_ty_base(VdpuAv1dRegSet * regs,RK_S32 i,RK_S32 val,HalBufs bufs)549*437bfbebSnyanmisaka static void set_ref_ty_base(VdpuAv1dRegSet *regs, RK_S32 i, RK_S32 val, HalBufs bufs)
550*437bfbebSnyanmisaka {
551*437bfbebSnyanmisaka     // MppBuffer framebuf = NULL;
552*437bfbebSnyanmisaka     // mpp_buf_slot_get_prop(slots, val, SLOT_BUFFER, &framebuf);
553*437bfbebSnyanmisaka     HalBuf *tile_out_buf;
554*437bfbebSnyanmisaka     tile_out_buf = hal_bufs_get_buf(bufs, val);
555*437bfbebSnyanmisaka 
556*437bfbebSnyanmisaka     if (tile_out_buf == NULL) {
557*437bfbebSnyanmisaka         mpp_err_f("get slots frame buff fail");
558*437bfbebSnyanmisaka     }
559*437bfbebSnyanmisaka     val =  mpp_buffer_get_fd(tile_out_buf->buf[0]);
560*437bfbebSnyanmisaka 
561*437bfbebSnyanmisaka     if (i == 0) {
562*437bfbebSnyanmisaka         regs->swreg192.sw_refer0_tybase_lsb = val;
563*437bfbebSnyanmisaka     } else if (i == 1) {
564*437bfbebSnyanmisaka         regs->swreg194.sw_refer1_tybase_lsb = val;
565*437bfbebSnyanmisaka     } else if (i == 2) {
566*437bfbebSnyanmisaka         regs->swreg196.sw_refer2_tybase_lsb = val;
567*437bfbebSnyanmisaka     } else if (i == 3) {
568*437bfbebSnyanmisaka         regs->swreg198.sw_refer3_tybase_lsb = val;
569*437bfbebSnyanmisaka     } else if (i == 4) {
570*437bfbebSnyanmisaka         regs->swreg200.sw_refer4_tybase_lsb = val;
571*437bfbebSnyanmisaka     } else if (i == 5) {
572*437bfbebSnyanmisaka         regs->swreg202.sw_refer5_tybase_lsb = val;
573*437bfbebSnyanmisaka     } else if (i == 6) {
574*437bfbebSnyanmisaka         regs->swreg204.sw_refer6_tybase_lsb = val;
575*437bfbebSnyanmisaka     } else {
576*437bfbebSnyanmisaka         mpp_err("Error: trying to set invalid reference index.");
577*437bfbebSnyanmisaka     }
578*437bfbebSnyanmisaka }
579*437bfbebSnyanmisaka 
set_ref_ty_base_msb(VdpuAv1dRegSet * regs,RK_S32 i,RK_S32 val)580*437bfbebSnyanmisaka static void set_ref_ty_base_msb(VdpuAv1dRegSet *regs, RK_S32 i, RK_S32 val)
581*437bfbebSnyanmisaka {
582*437bfbebSnyanmisaka     if (i == 0) {
583*437bfbebSnyanmisaka         regs->swreg191.sw_refer0_tybase_msb = val;
584*437bfbebSnyanmisaka     } else if (i == 1) {
585*437bfbebSnyanmisaka         regs->swreg193.sw_refer1_tybase_msb = val;
586*437bfbebSnyanmisaka     } else if (i == 2) {
587*437bfbebSnyanmisaka         regs->swreg195.sw_refer2_tybase_msb = val;
588*437bfbebSnyanmisaka     } else if (i == 3) {
589*437bfbebSnyanmisaka         regs->swreg197.sw_refer3_tybase_msb = val;
590*437bfbebSnyanmisaka     } else if (i == 4) {
591*437bfbebSnyanmisaka         regs->swreg199.sw_refer4_tybase_msb = val;
592*437bfbebSnyanmisaka     } else if (i == 5) {
593*437bfbebSnyanmisaka         regs->swreg201.sw_refer5_tybase_msb = val;
594*437bfbebSnyanmisaka     } else if (i == 6) {
595*437bfbebSnyanmisaka         regs->swreg203.sw_refer6_tybase_msb = val;
596*437bfbebSnyanmisaka     } else {
597*437bfbebSnyanmisaka         mpp_err(" trying to set invalid reference index.");
598*437bfbebSnyanmisaka     }
599*437bfbebSnyanmisaka }
600*437bfbebSnyanmisaka 
set_ref_tc_base(VdpuAv1dRegSet * regs,RK_S32 i,RK_S32 val,HalBufs bufs)601*437bfbebSnyanmisaka static void set_ref_tc_base(VdpuAv1dRegSet *regs, RK_S32 i, RK_S32 val, HalBufs bufs)
602*437bfbebSnyanmisaka {
603*437bfbebSnyanmisaka     // MppBuffer framebuf = NULL;
604*437bfbebSnyanmisaka     // mpp_buf_slot_get_prop(slots, val, SLOT_BUFFER, &framebuf);
605*437bfbebSnyanmisaka     HalBuf *tile_out_buf;
606*437bfbebSnyanmisaka     tile_out_buf = hal_bufs_get_buf(bufs, val);
607*437bfbebSnyanmisaka 
608*437bfbebSnyanmisaka     if (tile_out_buf == NULL) {
609*437bfbebSnyanmisaka         mpp_err_f("get slots frame buff fail");
610*437bfbebSnyanmisaka     }
611*437bfbebSnyanmisaka     val =  mpp_buffer_get_fd(tile_out_buf->buf[0]);
612*437bfbebSnyanmisaka 
613*437bfbebSnyanmisaka     if (i == 0) {
614*437bfbebSnyanmisaka         regs->swreg226.sw_refer0_tcbase_lsb = val;
615*437bfbebSnyanmisaka     } else if (i == 1) {
616*437bfbebSnyanmisaka         regs->swreg228.sw_refer1_tcbase_lsb = val;
617*437bfbebSnyanmisaka     } else if (i == 2) {
618*437bfbebSnyanmisaka         regs->swreg230.sw_refer2_tcbase_lsb = val;
619*437bfbebSnyanmisaka     } else if (i == 3) {
620*437bfbebSnyanmisaka         regs->swreg232.sw_refer3_tcbase_lsb = val;
621*437bfbebSnyanmisaka     } else if (i == 4) {
622*437bfbebSnyanmisaka         regs->swreg234.sw_refer4_tcbase_lsb = val;
623*437bfbebSnyanmisaka     } else if (i == 5) {
624*437bfbebSnyanmisaka         regs->swreg236.sw_refer5_tcbase_lsb = val;
625*437bfbebSnyanmisaka     } else if (i == 6) {
626*437bfbebSnyanmisaka         regs->swreg238.sw_refer6_tcbase_lsb = val;
627*437bfbebSnyanmisaka     } else {
628*437bfbebSnyanmisaka         mpp_err("Error: trying to set invalid reference index.");
629*437bfbebSnyanmisaka     }
630*437bfbebSnyanmisaka }
631*437bfbebSnyanmisaka 
632*437bfbebSnyanmisaka 
set_ref_tc_base_msb(VdpuAv1dRegSet * regs,RK_S32 i,RK_S32 val)633*437bfbebSnyanmisaka static void set_ref_tc_base_msb(VdpuAv1dRegSet *regs, RK_S32 i, RK_S32 val)
634*437bfbebSnyanmisaka {
635*437bfbebSnyanmisaka     if (i == 0) {
636*437bfbebSnyanmisaka         regs->swreg225.sw_refer0_tcbase_msb = val;
637*437bfbebSnyanmisaka     } else if (i == 1) {
638*437bfbebSnyanmisaka         regs->swreg227.sw_refer1_tcbase_msb = val;
639*437bfbebSnyanmisaka     } else if (i == 2) {
640*437bfbebSnyanmisaka         regs->swreg229.sw_refer2_tcbase_msb = val;
641*437bfbebSnyanmisaka     } else if (i == 3) {
642*437bfbebSnyanmisaka         regs->swreg231.sw_refer3_tcbase_msb = val;
643*437bfbebSnyanmisaka     } else if (i == 4) {
644*437bfbebSnyanmisaka         regs->swreg233.sw_refer4_tcbase_msb = val;
645*437bfbebSnyanmisaka     } else if (i == 5) {
646*437bfbebSnyanmisaka         regs->swreg235.sw_refer5_tcbase_msb = val;
647*437bfbebSnyanmisaka     } else if (i == 6) {
648*437bfbebSnyanmisaka         regs->swreg237.sw_refer6_tcbase_msb = val;
649*437bfbebSnyanmisaka     } else {
650*437bfbebSnyanmisaka         mpp_err("Error: trying to set invalid reference index.");
651*437bfbebSnyanmisaka     }
652*437bfbebSnyanmisaka }
653*437bfbebSnyanmisaka 
set_ref_sign_bias(VdpuAv1dRegSet * regs,RK_S32 i,RK_S32 val)654*437bfbebSnyanmisaka static void set_ref_sign_bias(VdpuAv1dRegSet *regs, RK_S32 i, RK_S32 val)
655*437bfbebSnyanmisaka {
656*437bfbebSnyanmisaka     if (i == 0) {
657*437bfbebSnyanmisaka         regs->swreg59.sw_ref0_sign_bias = val;
658*437bfbebSnyanmisaka     } else if (i == 1) {
659*437bfbebSnyanmisaka         regs->swreg59.sw_ref1_sign_bias = val;
660*437bfbebSnyanmisaka     } else if (i == 2) {
661*437bfbebSnyanmisaka         regs->swreg59.sw_ref2_sign_bias = val;
662*437bfbebSnyanmisaka     } else if (i == 3) {
663*437bfbebSnyanmisaka         regs->swreg59.sw_ref3_sign_bias = val;
664*437bfbebSnyanmisaka     } else if (i == 4) {
665*437bfbebSnyanmisaka         regs->swreg9.sw_ref4_sign_bias = val;
666*437bfbebSnyanmisaka     } else if (i == 5) {
667*437bfbebSnyanmisaka         regs->swreg9.sw_ref5_sign_bias = val;
668*437bfbebSnyanmisaka     } else if (i == 6) {
669*437bfbebSnyanmisaka         regs->swreg9.sw_ref6_sign_bias = val;
670*437bfbebSnyanmisaka     } else {
671*437bfbebSnyanmisaka         mpp_err("Error: trying to set invalid reference index.");
672*437bfbebSnyanmisaka     }
673*437bfbebSnyanmisaka }
674*437bfbebSnyanmisaka 
675*437bfbebSnyanmisaka #define MAX_FRAME_DISTANCE 31
676*437bfbebSnyanmisaka #define MAX_ACTIVE_REFS AV1_ACTIVE_REFS_EX
677*437bfbebSnyanmisaka 
GetRelativeDist(DXVA_PicParams_AV1 * dxva,RK_S32 a,RK_S32 b)678*437bfbebSnyanmisaka static RK_S32 GetRelativeDist(DXVA_PicParams_AV1 *dxva, RK_S32 a, RK_S32 b)
679*437bfbebSnyanmisaka {
680*437bfbebSnyanmisaka     if (!dxva->order_hint_bits) return 0;
681*437bfbebSnyanmisaka     const RK_S32 bits = dxva->order_hint_bits - 1;
682*437bfbebSnyanmisaka 
683*437bfbebSnyanmisaka     RK_S32 diff = a - b;
684*437bfbebSnyanmisaka     RK_S32 m = 1 << bits;
685*437bfbebSnyanmisaka     diff = (diff & (m - 1)) - (diff & m);
686*437bfbebSnyanmisaka     return diff;
687*437bfbebSnyanmisaka }
688*437bfbebSnyanmisaka 
689*437bfbebSnyanmisaka #define POPULATE_REF_OFFSET(index)                                               \
690*437bfbebSnyanmisaka  {                                                                               \
691*437bfbebSnyanmisaka     RK_S32 ref_offset[MAX_REF_FRAMES_EX - 1];                                    \
692*437bfbebSnyanmisaka     RK_S32 idx = refs_selected[(index) - 1];                                     \
693*437bfbebSnyanmisaka     ref_offset[0] = GetRelativeDist(dxva, dxva->frame_refs[idx].order_hint,      \
694*437bfbebSnyanmisaka                                     dxva->frame_refs[idx].lst_frame_offset);     \
695*437bfbebSnyanmisaka     ref_offset[1] = GetRelativeDist(dxva, dxva->frame_refs[idx].order_hint,      \
696*437bfbebSnyanmisaka                                     dxva->frame_refs[idx].lst2_frame_offset);    \
697*437bfbebSnyanmisaka     ref_offset[2] = GetRelativeDist(dxva, dxva->frame_refs[idx].order_hint,      \
698*437bfbebSnyanmisaka                                     dxva->frame_refs[idx].lst3_frame_offset);    \
699*437bfbebSnyanmisaka     ref_offset[3] = GetRelativeDist(dxva, dxva->frame_refs[idx].order_hint,      \
700*437bfbebSnyanmisaka                                     dxva->frame_refs[idx].gld_frame_offset);     \
701*437bfbebSnyanmisaka     ref_offset[4] = GetRelativeDist(dxva, dxva->frame_refs[idx].order_hint,      \
702*437bfbebSnyanmisaka                                     dxva->frame_refs[idx].bwd_frame_offset);     \
703*437bfbebSnyanmisaka     ref_offset[5] = GetRelativeDist(dxva, dxva->frame_refs[idx].order_hint,      \
704*437bfbebSnyanmisaka                                     dxva->frame_refs[idx].alt2_frame_offset);    \
705*437bfbebSnyanmisaka     ref_offset[6] = GetRelativeDist(dxva, dxva->frame_refs[idx].order_hint,      \
706*437bfbebSnyanmisaka                                     dxva->frame_refs[idx].alt_frame_offset);     \
707*437bfbebSnyanmisaka     if(index == 1) {                                                             \
708*437bfbebSnyanmisaka         regs->swreg20.sw_mf1_last_offset = ref_offset[0];                        \
709*437bfbebSnyanmisaka         regs->swreg21.sw_mf1_last2_offset = ref_offset[1];                       \
710*437bfbebSnyanmisaka         regs->swreg22.sw_mf1_last3_offset = ref_offset[2];                       \
711*437bfbebSnyanmisaka         regs->swreg23.sw_mf1_golden_offset = ref_offset[3];                      \
712*437bfbebSnyanmisaka         regs->swreg24.sw_mf1_bwdref_offset = ref_offset[4];                      \
713*437bfbebSnyanmisaka         regs->swreg25.sw_mf1_altref2_offset = ref_offset[5];                     \
714*437bfbebSnyanmisaka         regs->swreg26.sw_mf1_altref_offset = ref_offset[6];                      \
715*437bfbebSnyanmisaka     }else if(index == 2) {                                                       \
716*437bfbebSnyanmisaka         regs->swreg27.sw_mf2_last_offset = ref_offset[0];                        \
717*437bfbebSnyanmisaka         regs->swreg47.sw_mf2_last2_offset = ref_offset[1];                       \
718*437bfbebSnyanmisaka         regs->swreg47.sw_mf2_last3_offset = ref_offset[2];                       \
719*437bfbebSnyanmisaka         regs->swreg47.sw_mf2_golden_offset = ref_offset[3];                      \
720*437bfbebSnyanmisaka         regs->swreg48.sw_mf2_bwdref_offset = ref_offset[4];                      \
721*437bfbebSnyanmisaka         regs->swreg48.sw_mf2_altref2_offset = ref_offset[5];                     \
722*437bfbebSnyanmisaka         regs->swreg48.sw_mf2_altref_offset = ref_offset[6];                      \
723*437bfbebSnyanmisaka     }else {                                                                      \
724*437bfbebSnyanmisaka         regs->swreg184.sw_mf3_last_offset = ref_offset[0];                       \
725*437bfbebSnyanmisaka         regs->swreg185.sw_mf3_last2_offset = ref_offset[1];                      \
726*437bfbebSnyanmisaka         regs->swreg186.sw_mf3_last3_offset = ref_offset[2];                      \
727*437bfbebSnyanmisaka         regs->swreg187.sw_mf3_golden_offset = ref_offset[3];                     \
728*437bfbebSnyanmisaka         regs->swreg188.sw_mf3_bwdref_offset = ref_offset[4];                     \
729*437bfbebSnyanmisaka         regs->swreg257.sw_mf3_altref2_offset = ref_offset[5];                    \
730*437bfbebSnyanmisaka         regs->swreg262.sw_mf3_altref_offset = ref_offset[6];                     \
731*437bfbebSnyanmisaka     }                                                                            \
732*437bfbebSnyanmisaka }
733*437bfbebSnyanmisaka 
734*437bfbebSnyanmisaka 
set_frame_sign_bias(Av1dHalCtx * p_hal,DXVA_PicParams_AV1 * dxva)735*437bfbebSnyanmisaka static void set_frame_sign_bias(Av1dHalCtx *p_hal, DXVA_PicParams_AV1 *dxva)
736*437bfbebSnyanmisaka {
737*437bfbebSnyanmisaka     RK_U32 i = 0;
738*437bfbebSnyanmisaka     VdpuAv1dRegCtx *reg_ctx = (VdpuAv1dRegCtx *)p_hal->reg_ctx;
739*437bfbebSnyanmisaka     if (!dxva->order_hint_bits || dxva->format.frame_type == AV1_FRAME_INTRA_ONLY ||
740*437bfbebSnyanmisaka         dxva->format.frame_type == AV1_FRAME_KEY) {
741*437bfbebSnyanmisaka         for (i = 0; i < AV1_REF_LIST_SIZE; i++) {
742*437bfbebSnyanmisaka             reg_ctx->ref_frame_sign_bias[i] = 0;
743*437bfbebSnyanmisaka         }
744*437bfbebSnyanmisaka         return;
745*437bfbebSnyanmisaka     }
746*437bfbebSnyanmisaka 
747*437bfbebSnyanmisaka     // Identify the nearest forward and backward references.
748*437bfbebSnyanmisaka     for (i = 0; i < AV1_ACTIVE_REFS_EX; i++) {
749*437bfbebSnyanmisaka         if (dxva->frame_refs[i].Index >= 0) {
750*437bfbebSnyanmisaka             RK_S32 ref_frame_offset = dxva->frame_refs[i].order_hint;
751*437bfbebSnyanmisaka             RK_S32 rel_off = GetRelativeDist(dxva, ref_frame_offset, dxva->order_hint);
752*437bfbebSnyanmisaka             reg_ctx->ref_frame_sign_bias[i + 1] = (rel_off <= 0) ? 0 : 1;
753*437bfbebSnyanmisaka             AV1D_DBG(AV1D_DBG_LOG, "frame_refs[%d] order_hint %d ref_frame_offset %d\n",
754*437bfbebSnyanmisaka                      i, dxva->order_hint, ref_frame_offset);
755*437bfbebSnyanmisaka         }
756*437bfbebSnyanmisaka     }
757*437bfbebSnyanmisaka }
758*437bfbebSnyanmisaka 
vdpu_av1d_set_prob(Av1dHalCtx * p_hal,DXVA_PicParams_AV1 * dxva)759*437bfbebSnyanmisaka static void vdpu_av1d_set_prob(Av1dHalCtx *p_hal, DXVA_PicParams_AV1 *dxva)
760*437bfbebSnyanmisaka {
761*437bfbebSnyanmisaka     VdpuAv1dRegCtx *reg_ctx = (VdpuAv1dRegCtx *)p_hal->reg_ctx;
762*437bfbebSnyanmisaka     const int mv_cdf_offset = offsetof(AV1CDFs, mv_cdf);
763*437bfbebSnyanmisaka     void* prob_base = mpp_buffer_get_ptr(reg_ctx->prob_tbl_base);
764*437bfbebSnyanmisaka     VdpuAv1dRegSet *regs = reg_ctx->regs;
765*437bfbebSnyanmisaka 
766*437bfbebSnyanmisaka     memcpy(prob_base, dxva->cdfs, sizeof(AV1CDFs));
767*437bfbebSnyanmisaka     if (dxva->format.frame_type == AV1_FRAME_INTRA_ONLY ||
768*437bfbebSnyanmisaka         dxva->format.frame_type == AV1_FRAME_KEY) {
769*437bfbebSnyanmisaka         // Overwrite MV context area with intrabc MV context
770*437bfbebSnyanmisaka         memcpy(prob_base + mv_cdf_offset, dxva->cdfs_ndvc, sizeof(MvCDFs));
771*437bfbebSnyanmisaka     }
772*437bfbebSnyanmisaka     mpp_buffer_sync_end(reg_ctx->prob_tbl_base);
773*437bfbebSnyanmisaka 
774*437bfbebSnyanmisaka     regs->addr_cfg.swreg171.sw_prob_tab_out_base_lsb    = mpp_buffer_get_fd(reg_ctx->prob_tbl_out_base);
775*437bfbebSnyanmisaka     regs->addr_cfg.swreg173.sw_prob_tab_base_lsb        = mpp_buffer_get_fd(reg_ctx->prob_tbl_base);
776*437bfbebSnyanmisaka }
777*437bfbebSnyanmisaka 
vdpu_av1d_set_reference_frames(Av1dHalCtx * p_hal,VdpuAv1dRegCtx * ctx,DXVA_PicParams_AV1 * dxva)778*437bfbebSnyanmisaka static void vdpu_av1d_set_reference_frames(Av1dHalCtx *p_hal, VdpuAv1dRegCtx *ctx, DXVA_PicParams_AV1 *dxva)
779*437bfbebSnyanmisaka {
780*437bfbebSnyanmisaka     RK_U32 tmp1, tmp2, i;
781*437bfbebSnyanmisaka     RK_U32 cur_height, cur_width;
782*437bfbebSnyanmisaka     RK_U8  max_ref_frames = MAX_REF_FRAMES_EX;
783*437bfbebSnyanmisaka     RK_U8 prev_valid = 0;
784*437bfbebSnyanmisaka 
785*437bfbebSnyanmisaka     VdpuAv1dRegSet *regs = ctx->regs;
786*437bfbebSnyanmisaka     RK_S32 ref_count[AV1DEC_MAX_PIC_BUFFERS] = {0};
787*437bfbebSnyanmisaka 
788*437bfbebSnyanmisaka     RK_U32 ref_scale_e = 0;
789*437bfbebSnyanmisaka     RK_U32 y_stride = ctx->luma_size;
790*437bfbebSnyanmisaka     RK_U32 uv_stride = y_stride / 2;
791*437bfbebSnyanmisaka     RK_U32 mv_offset = ctx->luma_size + ctx->chroma_size + 64;
792*437bfbebSnyanmisaka 
793*437bfbebSnyanmisaka     if (!dxva->coding.intrabc) {
794*437bfbebSnyanmisaka         for (i = 0; i < AV1_REF_LIST_SIZE - 1; i++) {
795*437bfbebSnyanmisaka             if (dxva->frame_refs[i].Index >= 0)
796*437bfbebSnyanmisaka                 ref_count[dxva->frame_refs[i].Index]++;
797*437bfbebSnyanmisaka         }
798*437bfbebSnyanmisaka 
799*437bfbebSnyanmisaka         for (i = 0; i < AV1DEC_MAX_PIC_BUFFERS; i++) {
800*437bfbebSnyanmisaka             if (ref_count[i])
801*437bfbebSnyanmisaka                 regs->swreg4.sw_ref_frames++;
802*437bfbebSnyanmisaka         }
803*437bfbebSnyanmisaka     } else
804*437bfbebSnyanmisaka         regs->swreg4.sw_ref_frames = 1;
805*437bfbebSnyanmisaka 
806*437bfbebSnyanmisaka     cur_width = dxva->width;
807*437bfbebSnyanmisaka     cur_height = dxva->height;
808*437bfbebSnyanmisaka 
809*437bfbebSnyanmisaka     set_frame_sign_bias(p_hal, dxva);
810*437bfbebSnyanmisaka 
811*437bfbebSnyanmisaka     for (i = LAST_FRAME; i < max_ref_frames; i++) {
812*437bfbebSnyanmisaka         RK_U32 ref = i - 1;
813*437bfbebSnyanmisaka         RK_S32 idx = 0;
814*437bfbebSnyanmisaka         if (dxva->coding.intrabc) {
815*437bfbebSnyanmisaka             idx = dxva->CurrPicTextureIndex;
816*437bfbebSnyanmisaka             tmp1 = cur_width;
817*437bfbebSnyanmisaka             tmp2 = cur_height;
818*437bfbebSnyanmisaka         } else {
819*437bfbebSnyanmisaka             tmp1 =  dxva->frame_refs[ref].width;
820*437bfbebSnyanmisaka             tmp2 =  dxva->frame_refs[ref].height;
821*437bfbebSnyanmisaka             if (dxva->frame_refs[ref].Index > 0) {
822*437bfbebSnyanmisaka                 idx = dxva->frame_refs[ref].Index;
823*437bfbebSnyanmisaka             }
824*437bfbebSnyanmisaka         }
825*437bfbebSnyanmisaka 
826*437bfbebSnyanmisaka         set_ref_width(regs, ref, tmp1);
827*437bfbebSnyanmisaka         set_ref_height(regs, ref, tmp2);
828*437bfbebSnyanmisaka         tmp1 = ((tmp1 << AV1_REF_SCALE_SHIFT) + cur_width / 2) / cur_width;
829*437bfbebSnyanmisaka         tmp2 = ((tmp2 << AV1_REF_SCALE_SHIFT) + cur_height / 2) / cur_height;
830*437bfbebSnyanmisaka 
831*437bfbebSnyanmisaka         set_ref_hor_scale(regs, ref, tmp1);
832*437bfbebSnyanmisaka         set_ref_ver_scale(regs, ref, tmp2);
833*437bfbebSnyanmisaka         if (tmp1 != (1 << AV1_REF_SCALE_SHIFT) ||
834*437bfbebSnyanmisaka             tmp2 != (1 << AV1_REF_SCALE_SHIFT)) {
835*437bfbebSnyanmisaka             ref_scale_e = 1;
836*437bfbebSnyanmisaka         }
837*437bfbebSnyanmisaka 
838*437bfbebSnyanmisaka         if (idx == ctx->prev_out_buffer_i) {
839*437bfbebSnyanmisaka             prev_valid = 1;
840*437bfbebSnyanmisaka         }
841*437bfbebSnyanmisaka 
842*437bfbebSnyanmisaka         set_ref_lum_base(regs, ref, idx, ctx->tile_out_bufs);
843*437bfbebSnyanmisaka         set_ref_cb_base(p_hal,  ref, idx, ctx->tile_out_bufs, y_stride);
844*437bfbebSnyanmisaka         set_ref_dbase  (p_hal,  ref, idx, ctx->tile_out_bufs, mv_offset);
845*437bfbebSnyanmisaka 
846*437bfbebSnyanmisaka         set_ref_lum_base_msb(regs, ref, 0);
847*437bfbebSnyanmisaka         set_ref_cb_base_msb(regs,  ref, 0);
848*437bfbebSnyanmisaka         set_ref_dbase_msb  (regs,  ref, 0);
849*437bfbebSnyanmisaka 
850*437bfbebSnyanmisaka         if (0) {
851*437bfbebSnyanmisaka             set_ref_ty_base(regs,  ref, idx, ctx->tile_out_bufs);
852*437bfbebSnyanmisaka             set_ref_tc_base(regs,  ref, idx, ctx->tile_out_bufs);
853*437bfbebSnyanmisaka             set_ref_ty_base_msb(regs,  ref, 0);
854*437bfbebSnyanmisaka             set_ref_tc_base_msb(regs,  ref, 0);
855*437bfbebSnyanmisaka         }
856*437bfbebSnyanmisaka         set_ref_sign_bias(regs, ref, ctx->ref_frame_sign_bias[i]);
857*437bfbebSnyanmisaka     }
858*437bfbebSnyanmisaka 
859*437bfbebSnyanmisaka     regs->swreg184.sw_ref0_gm_mode                 = dxva->frame_refs[0].wmtype;
860*437bfbebSnyanmisaka     regs->swreg185.sw_ref1_gm_mode                 = dxva->frame_refs[1].wmtype;
861*437bfbebSnyanmisaka     regs->swreg186.sw_ref2_gm_mode                 = dxva->frame_refs[2].wmtype;
862*437bfbebSnyanmisaka     regs->swreg187.sw_ref3_gm_mode                 = dxva->frame_refs[3].wmtype;
863*437bfbebSnyanmisaka     regs->swreg188.sw_ref4_gm_mode                 = dxva->frame_refs[4].wmtype;
864*437bfbebSnyanmisaka     regs->swreg257.sw_ref5_gm_mode                 = dxva->frame_refs[5].wmtype;
865*437bfbebSnyanmisaka     regs->swreg262.sw_ref6_gm_mode                 = dxva->frame_refs[6].wmtype;
866*437bfbebSnyanmisaka 
867*437bfbebSnyanmisaka 
868*437bfbebSnyanmisaka     if (dxva->coding.intrabc) {
869*437bfbebSnyanmisaka         ctx->prev_out_buffer_i = dxva->CurrPicTextureIndex;
870*437bfbebSnyanmisaka     } else if (!prev_valid) {
871*437bfbebSnyanmisaka         ctx->prev_out_buffer_i = dxva->frame_refs[0].Index;  // LAST
872*437bfbebSnyanmisaka     }
873*437bfbebSnyanmisaka 
874*437bfbebSnyanmisaka     {
875*437bfbebSnyanmisaka         RK_S32 gld_buf_idx = GOLDEN_FRAME_EX - LAST_FRAME;
876*437bfbebSnyanmisaka         RK_S32 alt_buf_idx = ALTREF_FRAME_EX - LAST_FRAME;
877*437bfbebSnyanmisaka         RK_S32 lst_buf_idx = LAST_FRAME - LAST_FRAME;
878*437bfbebSnyanmisaka         RK_S32 bwd_buf_idx = BWDREF_FRAME_EX - LAST_FRAME;
879*437bfbebSnyanmisaka         RK_S32 alt2_buf_idx = ALTREF2_FRAME_EX - LAST_FRAME;
880*437bfbebSnyanmisaka         RK_S32 lst2_buf_idx = LAST2_FRAME_EX - LAST_FRAME;
881*437bfbebSnyanmisaka 
882*437bfbebSnyanmisaka         RK_S32 cur_frame_offset = dxva->order_hint;
883*437bfbebSnyanmisaka         RK_S32 alt_frame_offset = 0;
884*437bfbebSnyanmisaka         RK_S32 gld_frame_offset = 0;
885*437bfbebSnyanmisaka         RK_S32 bwd_frame_offset = 0;
886*437bfbebSnyanmisaka         RK_S32 alt2_frame_offset = 0;
887*437bfbebSnyanmisaka         RK_S32 refs_selected[3] = {0, 0, 0};
888*437bfbebSnyanmisaka         RK_S32 cur_mi_cols = (dxva->width + 7) >> 3;
889*437bfbebSnyanmisaka         RK_S32 cur_mi_rows = (dxva->height + 7) >> 3;
890*437bfbebSnyanmisaka         RK_U8 mf_types[3] = {0, 0, 0};
891*437bfbebSnyanmisaka         RK_S32 ref_stamp = 2;
892*437bfbebSnyanmisaka         RK_S32 ref_ind = 0;
893*437bfbebSnyanmisaka         RK_S32 rf;
894*437bfbebSnyanmisaka 
895*437bfbebSnyanmisaka         if (dxva->frame_refs[alt_buf_idx].Index >= 0)
896*437bfbebSnyanmisaka             alt_frame_offset = dxva->frame_refs[alt_buf_idx].order_hint;
897*437bfbebSnyanmisaka         if (dxva->frame_refs[gld_buf_idx].Index >= 0)
898*437bfbebSnyanmisaka             gld_frame_offset = dxva->frame_refs[gld_buf_idx].order_hint;
899*437bfbebSnyanmisaka         if (dxva->frame_refs[bwd_buf_idx].Index >= 0)
900*437bfbebSnyanmisaka             bwd_frame_offset = dxva->frame_refs[bwd_buf_idx].order_hint;
901*437bfbebSnyanmisaka         if (dxva->frame_refs[alt2_buf_idx].Index >= 0)
902*437bfbebSnyanmisaka             alt2_frame_offset = dxva->frame_refs[alt2_buf_idx].order_hint;
903*437bfbebSnyanmisaka 
904*437bfbebSnyanmisaka         AV1D_DBG(AV1D_DBG_LOG, "frame_offset[%d %d %d %d] lst_idx %d alt_off %d\n",
905*437bfbebSnyanmisaka                  alt_frame_offset,
906*437bfbebSnyanmisaka                  gld_frame_offset,
907*437bfbebSnyanmisaka                  bwd_frame_offset,
908*437bfbebSnyanmisaka                  alt2_frame_offset,
909*437bfbebSnyanmisaka                  dxva->frame_refs[lst_buf_idx].Index,
910*437bfbebSnyanmisaka                  dxva->frame_refs[lst_buf_idx].alt_frame_offset);
911*437bfbebSnyanmisaka 
912*437bfbebSnyanmisaka         if (dxva->frame_refs[lst_buf_idx].Index >= 0) {
913*437bfbebSnyanmisaka             const RK_S32 alt_frame_offset_in_lst =
914*437bfbebSnyanmisaka                 dxva->frame_refs[lst_buf_idx].alt_frame_offset;
915*437bfbebSnyanmisaka 
916*437bfbebSnyanmisaka             const RK_S32 is_lst_overlay = (alt_frame_offset_in_lst == gld_frame_offset);
917*437bfbebSnyanmisaka             if (!is_lst_overlay) {
918*437bfbebSnyanmisaka                 RK_S32 lst_mi_cols =
919*437bfbebSnyanmisaka                     (dxva->frame_refs[lst_buf_idx].width + 7) >> 3;
920*437bfbebSnyanmisaka                 RK_S32 lst_mi_rows =
921*437bfbebSnyanmisaka                     (dxva->frame_refs[lst_buf_idx].height + 7) >> 3;
922*437bfbebSnyanmisaka                 // TODO(stan): what's the difference btw key_frame and intra_only?
923*437bfbebSnyanmisaka                 RK_S32 lst_intra_only =
924*437bfbebSnyanmisaka                     dxva->frame_refs[lst_buf_idx].intra_only ||
925*437bfbebSnyanmisaka                     dxva->frame_refs[lst_buf_idx].is_intra_frame;
926*437bfbebSnyanmisaka                 if (lst_mi_cols == cur_mi_cols && lst_mi_rows == cur_mi_rows &&
927*437bfbebSnyanmisaka                     !lst_intra_only) {
928*437bfbebSnyanmisaka                     mf_types[ref_ind] = LAST_FRAME;
929*437bfbebSnyanmisaka                     refs_selected[ref_ind++] = lst_buf_idx;
930*437bfbebSnyanmisaka                 }
931*437bfbebSnyanmisaka             }
932*437bfbebSnyanmisaka             ref_stamp--;
933*437bfbebSnyanmisaka         }
934*437bfbebSnyanmisaka 
935*437bfbebSnyanmisaka         if (GetRelativeDist(dxva, bwd_frame_offset, cur_frame_offset) > 0) {
936*437bfbebSnyanmisaka             RK_S32 bwd_mi_cols =
937*437bfbebSnyanmisaka                 (dxva->frame_refs[bwd_buf_idx].width + 7) >> 3;
938*437bfbebSnyanmisaka             RK_S32 bwd_mi_rows =
939*437bfbebSnyanmisaka                 (dxva->frame_refs[bwd_buf_idx].height + 7) >> 3;
940*437bfbebSnyanmisaka             RK_S32 bwd_intra_only = dxva->frame_refs[bwd_buf_idx].intra_only ||
941*437bfbebSnyanmisaka                                     dxva->frame_refs[bwd_buf_idx].is_intra_frame;
942*437bfbebSnyanmisaka             if (bwd_mi_cols == cur_mi_cols && bwd_mi_rows == cur_mi_rows &&
943*437bfbebSnyanmisaka                 !bwd_intra_only) {
944*437bfbebSnyanmisaka                 mf_types[ref_ind] = BWDREF_FRAME_EX;
945*437bfbebSnyanmisaka                 refs_selected[ref_ind++] = bwd_buf_idx;
946*437bfbebSnyanmisaka                 ref_stamp--;
947*437bfbebSnyanmisaka             }
948*437bfbebSnyanmisaka         }
949*437bfbebSnyanmisaka 
950*437bfbebSnyanmisaka         if (GetRelativeDist(dxva, alt2_frame_offset, cur_frame_offset) > 0) {
951*437bfbebSnyanmisaka             RK_S32 alt2_mi_cols =
952*437bfbebSnyanmisaka                 (dxva->frame_refs[alt2_buf_idx].width + 7) >> 3;
953*437bfbebSnyanmisaka             RK_S32 alt2_mi_rows =
954*437bfbebSnyanmisaka                 (dxva->frame_refs[alt2_buf_idx].height + 7) >> 3;
955*437bfbebSnyanmisaka             RK_S32 alt2_intra_only =
956*437bfbebSnyanmisaka                 dxva->frame_refs[alt2_buf_idx].intra_only ||
957*437bfbebSnyanmisaka                 dxva->frame_refs[alt2_buf_idx].is_intra_frame;
958*437bfbebSnyanmisaka             if (alt2_mi_cols == cur_mi_cols && alt2_mi_rows == cur_mi_rows &&
959*437bfbebSnyanmisaka                 !alt2_intra_only) {
960*437bfbebSnyanmisaka                 mf_types[ref_ind] = ALTREF2_FRAME_EX;
961*437bfbebSnyanmisaka                 refs_selected[ref_ind++] = alt2_buf_idx;
962*437bfbebSnyanmisaka                 ref_stamp--;
963*437bfbebSnyanmisaka             }
964*437bfbebSnyanmisaka         }
965*437bfbebSnyanmisaka 
966*437bfbebSnyanmisaka         if (GetRelativeDist(dxva, alt_frame_offset, cur_frame_offset) > 0 &&
967*437bfbebSnyanmisaka             ref_stamp >= 0) {
968*437bfbebSnyanmisaka             RK_S32 alt_mi_cols =
969*437bfbebSnyanmisaka                 (dxva->frame_refs[alt_buf_idx].width + 7) >> 3;
970*437bfbebSnyanmisaka             RK_S32 alt_mi_rows =
971*437bfbebSnyanmisaka                 (dxva->frame_refs[alt_buf_idx].height + 7) >> 3;
972*437bfbebSnyanmisaka             RK_S32 alt_intra_only = dxva->frame_refs[alt_buf_idx].intra_only ||
973*437bfbebSnyanmisaka                                     dxva->frame_refs[alt_buf_idx].is_intra_frame;
974*437bfbebSnyanmisaka             if (alt_mi_cols == cur_mi_cols && alt_mi_rows == cur_mi_rows &&
975*437bfbebSnyanmisaka                 !alt_intra_only) {
976*437bfbebSnyanmisaka                 mf_types[ref_ind] = ALTREF_FRAME_EX;
977*437bfbebSnyanmisaka                 refs_selected[ref_ind++] = alt_buf_idx;
978*437bfbebSnyanmisaka                 ref_stamp--;
979*437bfbebSnyanmisaka             }
980*437bfbebSnyanmisaka         }
981*437bfbebSnyanmisaka 
982*437bfbebSnyanmisaka         if (ref_stamp >= 0 && dxva->frame_refs[lst2_buf_idx].Index >= 0) {
983*437bfbebSnyanmisaka             RK_S32 lst2_mi_cols =
984*437bfbebSnyanmisaka                 (dxva->frame_refs[lst2_buf_idx].width + 7) >> 3;
985*437bfbebSnyanmisaka             RK_S32 lst2_mi_rows =
986*437bfbebSnyanmisaka                 (dxva->frame_refs[lst2_buf_idx].height + 7) >> 3;
987*437bfbebSnyanmisaka             RK_S32 lst2_intra_only =
988*437bfbebSnyanmisaka                 dxva->frame_refs[lst2_buf_idx].intra_only ||
989*437bfbebSnyanmisaka                 dxva->frame_refs[lst2_buf_idx].is_intra_frame;
990*437bfbebSnyanmisaka             if (lst2_mi_cols == cur_mi_cols && lst2_mi_rows == cur_mi_rows &&
991*437bfbebSnyanmisaka                 !lst2_intra_only) {
992*437bfbebSnyanmisaka                 mf_types[ref_ind] = LAST2_FRAME_EX;
993*437bfbebSnyanmisaka                 refs_selected[ref_ind++] = lst2_buf_idx;
994*437bfbebSnyanmisaka                 ref_stamp--;
995*437bfbebSnyanmisaka             }
996*437bfbebSnyanmisaka         }
997*437bfbebSnyanmisaka 
998*437bfbebSnyanmisaka         RK_S32 cur_offset[MAX_REF_FRAMES_EX - 1];
999*437bfbebSnyanmisaka         RK_S32 cur_roffset[MAX_REF_FRAMES_EX - 1];
1000*437bfbebSnyanmisaka         for ( rf = 0; rf < MAX_REF_FRAMES_EX - 1; ++rf) {
1001*437bfbebSnyanmisaka             RK_S32 buf_idx = dxva->frame_refs[rf].Index;
1002*437bfbebSnyanmisaka             if (buf_idx >= 0) {
1003*437bfbebSnyanmisaka                 cur_offset[rf] =
1004*437bfbebSnyanmisaka                     GetRelativeDist(dxva, cur_frame_offset,
1005*437bfbebSnyanmisaka                                     dxva->frame_refs[rf].order_hint);
1006*437bfbebSnyanmisaka                 cur_roffset[rf] =
1007*437bfbebSnyanmisaka                     GetRelativeDist(dxva, dxva->frame_refs[rf].order_hint,
1008*437bfbebSnyanmisaka                                     cur_frame_offset);
1009*437bfbebSnyanmisaka                 AV1D_DBG(AV1D_DBG_LOG, "buf_idx[%d]=%d offset[%d : %d] hin %d\n", rf, buf_idx, cur_offset[rf], cur_roffset[rf], dxva->frame_refs[rf].order_hint);
1010*437bfbebSnyanmisaka             } else {
1011*437bfbebSnyanmisaka                 cur_offset[rf] = 0;
1012*437bfbebSnyanmisaka                 cur_roffset[rf] = 0;
1013*437bfbebSnyanmisaka             }
1014*437bfbebSnyanmisaka         }
1015*437bfbebSnyanmisaka 
1016*437bfbebSnyanmisaka         regs->swreg11.sw_use_temporal0_mvs = 0;
1017*437bfbebSnyanmisaka         regs->swreg11.sw_use_temporal1_mvs = 0;
1018*437bfbebSnyanmisaka         regs->swreg11.sw_use_temporal2_mvs = 0;
1019*437bfbebSnyanmisaka         regs->swreg11.sw_use_temporal3_mvs = 0;
1020*437bfbebSnyanmisaka 
1021*437bfbebSnyanmisaka         if (dxva->coding.use_ref_frame_mvs && ref_ind > 0 &&
1022*437bfbebSnyanmisaka             cur_offset[mf_types[0] - LAST_FRAME] <= MAX_FRAME_DISTANCE &&
1023*437bfbebSnyanmisaka             cur_offset[mf_types[0] - LAST_FRAME] >= -MAX_FRAME_DISTANCE) {
1024*437bfbebSnyanmisaka             regs->swreg11.sw_use_temporal0_mvs = 1;
1025*437bfbebSnyanmisaka             POPULATE_REF_OFFSET(1)
1026*437bfbebSnyanmisaka         }
1027*437bfbebSnyanmisaka 
1028*437bfbebSnyanmisaka         if (dxva->coding.use_ref_frame_mvs && ref_ind > 1 &&
1029*437bfbebSnyanmisaka             cur_offset[mf_types[1] - LAST_FRAME] <= MAX_FRAME_DISTANCE &&
1030*437bfbebSnyanmisaka             cur_offset[mf_types[1] - LAST_FRAME] >= -MAX_FRAME_DISTANCE) {
1031*437bfbebSnyanmisaka             regs->swreg11.sw_use_temporal1_mvs = 1;
1032*437bfbebSnyanmisaka             POPULATE_REF_OFFSET(2)
1033*437bfbebSnyanmisaka         }
1034*437bfbebSnyanmisaka 
1035*437bfbebSnyanmisaka         if (dxva->coding.use_ref_frame_mvs && ref_ind > 2 &&
1036*437bfbebSnyanmisaka             cur_offset[mf_types[2] - LAST_FRAME] <= MAX_FRAME_DISTANCE &&
1037*437bfbebSnyanmisaka             cur_offset[mf_types[2] - LAST_FRAME] >= -MAX_FRAME_DISTANCE) {
1038*437bfbebSnyanmisaka             regs->swreg11.sw_use_temporal2_mvs = 1;
1039*437bfbebSnyanmisaka             POPULATE_REF_OFFSET(3)
1040*437bfbebSnyanmisaka         }
1041*437bfbebSnyanmisaka 
1042*437bfbebSnyanmisaka         // Pass one additional frame that will contain the segment information
1043*437bfbebSnyanmisaka         if (dxva->segmentation.enabled &&
1044*437bfbebSnyanmisaka             dxva->primary_ref_frame < ALLOWED_REFS_PER_FRAME_EX) {
1045*437bfbebSnyanmisaka             // Primary ref frame is zero based
1046*437bfbebSnyanmisaka             RK_S32 prim_buf_idx = dxva->frame_refs[dxva->primary_ref_frame].Index;
1047*437bfbebSnyanmisaka 
1048*437bfbebSnyanmisaka             if (prim_buf_idx >= 0) {
1049*437bfbebSnyanmisaka                 HalBuf *tile_out_buf;
1050*437bfbebSnyanmisaka 
1051*437bfbebSnyanmisaka                 y_stride = ctx->luma_size ;
1052*437bfbebSnyanmisaka                 uv_stride = y_stride / 2;
1053*437bfbebSnyanmisaka                 mv_offset = y_stride + uv_stride + 64;
1054*437bfbebSnyanmisaka 
1055*437bfbebSnyanmisaka                 tile_out_buf = hal_bufs_get_buf(ctx->tile_out_bufs, prim_buf_idx);
1056*437bfbebSnyanmisaka                 regs->addr_cfg.swreg80.sw_segment_read_base_msb = 0;
1057*437bfbebSnyanmisaka                 regs->addr_cfg.swreg81.sw_segment_read_base_lsb = mpp_buffer_get_fd(tile_out_buf->buf[0]);
1058*437bfbebSnyanmisaka                 mpp_dev_set_reg_offset(p_hal->dev, 81, mv_offset);
1059*437bfbebSnyanmisaka                 regs->swreg11.sw_use_temporal3_mvs = 1;
1060*437bfbebSnyanmisaka             }
1061*437bfbebSnyanmisaka         }
1062*437bfbebSnyanmisaka         if (dxva->primary_ref_frame < ALLOWED_REFS_PER_FRAME_EX) {
1063*437bfbebSnyanmisaka             RK_S32 prim_buf_idx = dxva->primary_ref_frame;
1064*437bfbebSnyanmisaka             ctx->resolution_change =
1065*437bfbebSnyanmisaka                 cur_mi_cols !=
1066*437bfbebSnyanmisaka                 (RK_S32)((dxva->frame_refs[prim_buf_idx].width + 7) >>
1067*437bfbebSnyanmisaka                          3) ||
1068*437bfbebSnyanmisaka                 cur_mi_rows !=
1069*437bfbebSnyanmisaka                 (RK_S32)((dxva->frame_refs[prim_buf_idx].height + 7) >>
1070*437bfbebSnyanmisaka                          3);
1071*437bfbebSnyanmisaka         }
1072*437bfbebSnyanmisaka 
1073*437bfbebSnyanmisaka         regs->swreg184.sw_cur_last_offset              = cur_offset[0];
1074*437bfbebSnyanmisaka         regs->swreg185.sw_cur_last2_offset             = cur_offset[1];
1075*437bfbebSnyanmisaka         regs->swreg186.sw_cur_last3_offset             = cur_offset[2];
1076*437bfbebSnyanmisaka         regs->swreg187.sw_cur_golden_offset            = cur_offset[3];
1077*437bfbebSnyanmisaka         regs->swreg188.sw_cur_bwdref_offset            = cur_offset[4];
1078*437bfbebSnyanmisaka         regs->swreg257.sw_cur_altref2_offset           = cur_offset[5];
1079*437bfbebSnyanmisaka         regs->swreg262.sw_cur_altref_offset            = cur_offset[6];
1080*437bfbebSnyanmisaka 
1081*437bfbebSnyanmisaka         regs->swreg184.sw_cur_last_roffset             = cur_roffset[0];
1082*437bfbebSnyanmisaka         regs->swreg185.sw_cur_last2_roffset            = cur_roffset[1];
1083*437bfbebSnyanmisaka         regs->swreg186.sw_cur_last3_roffset            = cur_roffset[2];
1084*437bfbebSnyanmisaka         regs->swreg187.sw_cur_golden_roffset           = cur_roffset[3];
1085*437bfbebSnyanmisaka         regs->swreg188.sw_cur_bwdref_roffset           = cur_roffset[4];
1086*437bfbebSnyanmisaka         regs->swreg257.sw_cur_altref2_roffset          = cur_roffset[5];
1087*437bfbebSnyanmisaka         regs->swreg262.sw_cur_altref_roffset           = cur_roffset[6];
1088*437bfbebSnyanmisaka 
1089*437bfbebSnyanmisaka         /* Index start from 0 */
1090*437bfbebSnyanmisaka         regs->swreg9.sw_mf1_type  = mf_types[0] - LAST_FRAME;
1091*437bfbebSnyanmisaka         regs->swreg9.sw_mf2_type  = mf_types[1] - LAST_FRAME;
1092*437bfbebSnyanmisaka         regs->swreg9.sw_mf3_type  = mf_types[2] - LAST_FRAME;
1093*437bfbebSnyanmisaka         AV1D_DBG(AV1D_DBG_LOG, "mf_types[%d %d %d]\n", mf_types[0], mf_types[1], mf_types[2]);
1094*437bfbebSnyanmisaka     }
1095*437bfbebSnyanmisaka     regs->swreg5.sw_ref_scaling_enable = ref_scale_e;
1096*437bfbebSnyanmisaka }
1097*437bfbebSnyanmisaka #undef MAX_FRAME_DISTANCE
1098*437bfbebSnyanmisaka 
vdpu_av1d_superres_params(Av1dHalCtx * p_hal,DXVA_PicParams_AV1 * dxva)1099*437bfbebSnyanmisaka static void vdpu_av1d_superres_params(Av1dHalCtx *p_hal, DXVA_PicParams_AV1 *dxva)
1100*437bfbebSnyanmisaka {
1101*437bfbebSnyanmisaka     // Compute and store scaling paramers needed for superres
1102*437bfbebSnyanmisaka #define SUPERRES_SCALE_BITS 3
1103*437bfbebSnyanmisaka #define SCALE_NUMERATOR 8
1104*437bfbebSnyanmisaka #define SUPERRES_SCALE_DENOMINATOR_MIN (SCALE_NUMERATOR + 1)
1105*437bfbebSnyanmisaka 
1106*437bfbebSnyanmisaka #define RS_SUBPEL_BITS 6
1107*437bfbebSnyanmisaka #define RS_SUBPEL_MASK ((1 << RS_SUBPEL_BITS) - 1)
1108*437bfbebSnyanmisaka #define RS_SCALE_SUBPEL_BITS 14
1109*437bfbebSnyanmisaka #define RS_SCALE_SUBPEL_MASK ((1 << RS_SCALE_SUBPEL_BITS) - 1)
1110*437bfbebSnyanmisaka #define RS_SCALE_EXTRA_BITS (RS_SCALE_SUBPEL_BITS - RS_SUBPEL_BITS)
1111*437bfbebSnyanmisaka #define RS_SCALE_EXTRA_OFF (1 << (RS_SCALE_EXTRA_BITS - 1))
1112*437bfbebSnyanmisaka     VdpuAv1dRegCtx *ctx = p_hal->reg_ctx;
1113*437bfbebSnyanmisaka     VdpuAv1dRegSet *regs = ctx->regs;
1114*437bfbebSnyanmisaka     RK_U8 superres_scale_denominator = SCALE_NUMERATOR;
1115*437bfbebSnyanmisaka     RK_U32 superres_luma_step = 0;
1116*437bfbebSnyanmisaka     RK_U32 superres_chroma_step = 0;
1117*437bfbebSnyanmisaka     RK_U32 superres_luma_step_invra = 0;
1118*437bfbebSnyanmisaka     RK_U32 superres_chroma_step_invra = 0;
1119*437bfbebSnyanmisaka     RK_U32 superres_init_luma_subpel_x = 0;
1120*437bfbebSnyanmisaka     RK_U32 superres_init_chroma_subpel_x = 0;
1121*437bfbebSnyanmisaka     RK_U32 superres_is_scaled = 1;
1122*437bfbebSnyanmisaka     RK_U32 width = 0;
1123*437bfbebSnyanmisaka     if (dxva->coding.superres) {
1124*437bfbebSnyanmisaka         superres_scale_denominator = regs->swreg9.sw_scale_denom_minus9 + 9;
1125*437bfbebSnyanmisaka     }
1126*437bfbebSnyanmisaka 
1127*437bfbebSnyanmisaka     if (superres_scale_denominator > SCALE_NUMERATOR) {
1128*437bfbebSnyanmisaka         width = (dxva->upscaled_width * SCALE_NUMERATOR +
1129*437bfbebSnyanmisaka                  (superres_scale_denominator / 2)) /
1130*437bfbebSnyanmisaka                 superres_scale_denominator;
1131*437bfbebSnyanmisaka         RK_U32 min_w = MPP_MIN(16, dxva->upscaled_width);
1132*437bfbebSnyanmisaka         if (width < min_w) width = min_w;
1133*437bfbebSnyanmisaka         if (width == dxva->upscaled_width) {
1134*437bfbebSnyanmisaka             superres_is_scaled = 0;
1135*437bfbebSnyanmisaka             superres_luma_step = RS_SCALE_SUBPEL_BITS;
1136*437bfbebSnyanmisaka             superres_chroma_step = RS_SCALE_SUBPEL_BITS;
1137*437bfbebSnyanmisaka             superres_luma_step_invra = RS_SCALE_SUBPEL_BITS;
1138*437bfbebSnyanmisaka             superres_chroma_step_invra = RS_SCALE_SUBPEL_BITS;
1139*437bfbebSnyanmisaka             superres_init_luma_subpel_x = 0;
1140*437bfbebSnyanmisaka             superres_init_chroma_subpel_x = 0;
1141*437bfbebSnyanmisaka             goto end;
1142*437bfbebSnyanmisaka         }
1143*437bfbebSnyanmisaka         {
1144*437bfbebSnyanmisaka             RK_S32 upscaledLumaPlaneW = dxva->upscaled_width;
1145*437bfbebSnyanmisaka             RK_S32 downscaledLumaPlaneW = width;
1146*437bfbebSnyanmisaka 
1147*437bfbebSnyanmisaka             RK_S32 downscaledChromaPlaneW = (downscaledLumaPlaneW + 1) >> 1;
1148*437bfbebSnyanmisaka             RK_S32 upscaledChromaPlaneW = (upscaledLumaPlaneW + 1) >> 1;
1149*437bfbebSnyanmisaka 
1150*437bfbebSnyanmisaka             RK_S32 stepLumaX = ((downscaledLumaPlaneW << RS_SCALE_SUBPEL_BITS) +
1151*437bfbebSnyanmisaka                                 (upscaledLumaPlaneW / 2)) /
1152*437bfbebSnyanmisaka                                upscaledLumaPlaneW;
1153*437bfbebSnyanmisaka             RK_S32 stepChromaX = ((downscaledChromaPlaneW << RS_SCALE_SUBPEL_BITS) +
1154*437bfbebSnyanmisaka                                   (upscaledChromaPlaneW / 2)) /
1155*437bfbebSnyanmisaka                                  upscaledChromaPlaneW;
1156*437bfbebSnyanmisaka             RK_S32 errLuma = (upscaledLumaPlaneW * stepLumaX) -
1157*437bfbebSnyanmisaka                              (downscaledLumaPlaneW << RS_SCALE_SUBPEL_BITS);
1158*437bfbebSnyanmisaka             RK_S32  errChroma = (upscaledChromaPlaneW * stepChromaX) -
1159*437bfbebSnyanmisaka                                 (downscaledChromaPlaneW << RS_SCALE_SUBPEL_BITS);
1160*437bfbebSnyanmisaka             RK_S32 initialLumaSubpelX =
1161*437bfbebSnyanmisaka                 ((-((upscaledLumaPlaneW - downscaledLumaPlaneW)
1162*437bfbebSnyanmisaka                     << (RS_SCALE_SUBPEL_BITS - 1)) +
1163*437bfbebSnyanmisaka                   upscaledLumaPlaneW / 2) /
1164*437bfbebSnyanmisaka                  upscaledLumaPlaneW +
1165*437bfbebSnyanmisaka                  (1 << (RS_SCALE_EXTRA_BITS - 1)) - errLuma / 2) &
1166*437bfbebSnyanmisaka                 RS_SCALE_SUBPEL_MASK;
1167*437bfbebSnyanmisaka             RK_S32 initialChromaSubpelX =
1168*437bfbebSnyanmisaka                 ((-((upscaledChromaPlaneW - downscaledChromaPlaneW)
1169*437bfbebSnyanmisaka                     << (RS_SCALE_SUBPEL_BITS - 1)) +
1170*437bfbebSnyanmisaka                   upscaledChromaPlaneW / 2) /
1171*437bfbebSnyanmisaka                  upscaledChromaPlaneW +
1172*437bfbebSnyanmisaka                  (1 << (RS_SCALE_EXTRA_BITS - 1)) - errChroma / 2) &
1173*437bfbebSnyanmisaka                 RS_SCALE_SUBPEL_MASK;
1174*437bfbebSnyanmisaka 
1175*437bfbebSnyanmisaka             superres_luma_step = stepLumaX;
1176*437bfbebSnyanmisaka             superres_chroma_step = stepChromaX;
1177*437bfbebSnyanmisaka             superres_luma_step_invra =
1178*437bfbebSnyanmisaka                 ((upscaledLumaPlaneW << RS_SCALE_SUBPEL_BITS) +
1179*437bfbebSnyanmisaka                  (downscaledLumaPlaneW / 2)) /
1180*437bfbebSnyanmisaka                 downscaledLumaPlaneW;
1181*437bfbebSnyanmisaka             superres_chroma_step_invra =
1182*437bfbebSnyanmisaka                 ((upscaledChromaPlaneW << RS_SCALE_SUBPEL_BITS) +
1183*437bfbebSnyanmisaka                  (downscaledChromaPlaneW / 2)) /
1184*437bfbebSnyanmisaka                 downscaledChromaPlaneW;
1185*437bfbebSnyanmisaka             superres_init_luma_subpel_x = initialLumaSubpelX;
1186*437bfbebSnyanmisaka             superres_init_chroma_subpel_x = initialChromaSubpelX;
1187*437bfbebSnyanmisaka         }
1188*437bfbebSnyanmisaka     } else {
1189*437bfbebSnyanmisaka         superres_luma_step = RS_SCALE_SUBPEL_BITS;
1190*437bfbebSnyanmisaka         superres_chroma_step = RS_SCALE_SUBPEL_BITS;
1191*437bfbebSnyanmisaka         superres_luma_step_invra = RS_SCALE_SUBPEL_BITS;
1192*437bfbebSnyanmisaka         superres_chroma_step_invra = RS_SCALE_SUBPEL_BITS;
1193*437bfbebSnyanmisaka         superres_init_luma_subpel_x = 0;
1194*437bfbebSnyanmisaka         superres_init_chroma_subpel_x = 0;
1195*437bfbebSnyanmisaka         superres_is_scaled = 0;
1196*437bfbebSnyanmisaka     }
1197*437bfbebSnyanmisaka end:
1198*437bfbebSnyanmisaka     regs->swreg51.sw_superres_luma_step = superres_luma_step;
1199*437bfbebSnyanmisaka     regs->swreg51.sw_superres_chroma_step = superres_chroma_step;
1200*437bfbebSnyanmisaka     regs->swreg298.sw_superres_luma_step_invra = superres_luma_step_invra;
1201*437bfbebSnyanmisaka     regs->swreg298.sw_superres_chroma_step_invra = superres_chroma_step_invra;
1202*437bfbebSnyanmisaka     regs->swreg52.sw_superres_init_luma_subpel_x = superres_init_luma_subpel_x;
1203*437bfbebSnyanmisaka     regs->swreg52.sw_superres_init_chroma_subpel_x = superres_init_chroma_subpel_x;
1204*437bfbebSnyanmisaka     regs->swreg5.sw_superres_is_scaled = superres_is_scaled;
1205*437bfbebSnyanmisaka 
1206*437bfbebSnyanmisaka     regs->addr_cfg.swreg89.sw_superres_colbuf_base_lsb = mpp_buffer_get_fd(ctx->filter_mem);
1207*437bfbebSnyanmisaka     mpp_dev_set_reg_offset(p_hal->dev, 89, ctx->filt_info[SR_COL].offset);
1208*437bfbebSnyanmisaka }
1209*437bfbebSnyanmisaka 
1210*437bfbebSnyanmisaka 
vdpu_av1d_set_picture_dimensions(Av1dHalCtx * p_hal,DXVA_PicParams_AV1 * dxva)1211*437bfbebSnyanmisaka static void vdpu_av1d_set_picture_dimensions(Av1dHalCtx *p_hal, DXVA_PicParams_AV1 *dxva)
1212*437bfbebSnyanmisaka {
1213*437bfbebSnyanmisaka     /* Write dimensions for the current picture
1214*437bfbebSnyanmisaka        (This is needed when scaling is used) */
1215*437bfbebSnyanmisaka     VdpuAv1dRegCtx *ctx = p_hal->reg_ctx;
1216*437bfbebSnyanmisaka     VdpuAv1dRegSet *regs = ctx->regs;
1217*437bfbebSnyanmisaka 
1218*437bfbebSnyanmisaka     regs->swreg4.sw_pic_width_in_cbs    = MPP_ALIGN(dxva->width, 8) >> 3;
1219*437bfbebSnyanmisaka     regs->swreg4.sw_pic_height_in_cbs   = MPP_ALIGN(dxva->height, 8) >> 3;
1220*437bfbebSnyanmisaka     regs->swreg12.sw_pic_width_pad    = MPP_ALIGN(dxva->width, 8) - dxva->width;
1221*437bfbebSnyanmisaka     regs->swreg12.sw_pic_height_pad   = MPP_ALIGN(dxva->height, 8) - dxva->height;
1222*437bfbebSnyanmisaka 
1223*437bfbebSnyanmisaka     regs->swreg8.sw_superres_pic_width = dxva->upscaled_width;
1224*437bfbebSnyanmisaka     regs->swreg9.sw_scale_denom_minus9 = dxva->superres_denom;
1225*437bfbebSnyanmisaka 
1226*437bfbebSnyanmisaka     vdpu_av1d_superres_params(p_hal, dxva);
1227*437bfbebSnyanmisaka }
1228*437bfbebSnyanmisaka 
vdpu_av1d_set_segmentation(VdpuAv1dRegCtx * ctx,DXVA_PicParams_AV1 * dxva)1229*437bfbebSnyanmisaka static void vdpu_av1d_set_segmentation(VdpuAv1dRegCtx *ctx, DXVA_PicParams_AV1 *dxva)
1230*437bfbebSnyanmisaka {
1231*437bfbebSnyanmisaka     RK_U32 segval[MAX_MB_SEGMENTS][SEG_AV1_LVL_MAX];
1232*437bfbebSnyanmisaka     VdpuAv1dRegSet *regs = ctx->regs;
1233*437bfbebSnyanmisaka     RK_U8 s, i, j;
1234*437bfbebSnyanmisaka     RK_U8 segsign = 0;
1235*437bfbebSnyanmisaka     RK_U8 preskip_segid = 0;
1236*437bfbebSnyanmisaka     RK_U8 last_active_seg = 0;
1237*437bfbebSnyanmisaka     /* Segmentation */
1238*437bfbebSnyanmisaka     regs->swreg13.sw_segment_temp_upd_e   = dxva->segmentation.temporal_update;
1239*437bfbebSnyanmisaka     regs->swreg13.sw_segment_upd_e        = dxva->segmentation.update_map;
1240*437bfbebSnyanmisaka     regs->swreg13.sw_segment_e            = dxva->segmentation.enabled;
1241*437bfbebSnyanmisaka 
1242*437bfbebSnyanmisaka     //dec->error_resilient || dec->resolution_change;
1243*437bfbebSnyanmisaka     regs->swreg5.sw_error_resilient     =  dxva->coding.error_resilient_mode;
1244*437bfbebSnyanmisaka 
1245*437bfbebSnyanmisaka     if ((!dxva->format.frame_type ||  dxva->format.frame_type == AV1_FRAME_INTRA_ONLY)
1246*437bfbebSnyanmisaka         || regs->swreg5.sw_error_resilient) {
1247*437bfbebSnyanmisaka         regs->swreg11.sw_use_temporal3_mvs = 0;
1248*437bfbebSnyanmisaka     }
1249*437bfbebSnyanmisaka 
1250*437bfbebSnyanmisaka     regs->swreg14.sw_filt_level0   = dxva->loop_filter.filter_level[0];
1251*437bfbebSnyanmisaka     regs->swreg15.sw_filt_level1   = dxva->loop_filter.filter_level[1];
1252*437bfbebSnyanmisaka     regs->swreg16.sw_filt_level2   = dxva->loop_filter.filter_level_u;
1253*437bfbebSnyanmisaka     regs->swreg17.sw_filt_level3   = dxva->loop_filter.filter_level_v;
1254*437bfbebSnyanmisaka 
1255*437bfbebSnyanmisaka     /* Set filter level and QP for every segment ID. Initialize all
1256*437bfbebSnyanmisaka     * segments with default QP and filter level. */
1257*437bfbebSnyanmisaka     for (s = 0; s < MAX_MB_SEGMENTS; s++) {
1258*437bfbebSnyanmisaka         segval[s][SEG_AV1_LVL_ALT_Q] = 0;
1259*437bfbebSnyanmisaka         segval[s][SEG_AV1_LVL_ALT_LF_Y_V] = 0;
1260*437bfbebSnyanmisaka         segval[s][SEG_AV1_LVL_ALT_LF_Y_H] = 0;
1261*437bfbebSnyanmisaka         segval[s][SEG_AV1_LVL_ALT_LF_U] = 0;
1262*437bfbebSnyanmisaka         segval[s][SEG_AV1_LVL_ALT_LF_V] = 0;
1263*437bfbebSnyanmisaka         segval[s][SEG_AV1_LVL_REF_FRAME] = 0; /* segment ref_frame disabled */
1264*437bfbebSnyanmisaka         segval[s][SEG_AV1_LVL_SKIP] = 0;      /* segment skip disabled */
1265*437bfbebSnyanmisaka         segval[s][SEG_AV1_LVL_GLOBALMV] = 0;  /* global motion */
1266*437bfbebSnyanmisaka     }
1267*437bfbebSnyanmisaka     /* If a feature is enabled for a segment, overwrite the default. */
1268*437bfbebSnyanmisaka     if (dxva->segmentation.enabled) {
1269*437bfbebSnyanmisaka         RK_S32 (*segdata)[SEG_AV1_LVL_MAX] = dxva->segmentation.feature_data;
1270*437bfbebSnyanmisaka 
1271*437bfbebSnyanmisaka         for (s = 0; s < MAX_MB_SEGMENTS; s++) {
1272*437bfbebSnyanmisaka             if (dxva->segmentation.feature_mask[s] & (1 << SEG_AV1_LVL_ALT_Q)) {
1273*437bfbebSnyanmisaka                 segval[s][SEG_AV1_LVL_ALT_Q] =
1274*437bfbebSnyanmisaka                     MPP_CLIP3(0, 255, MPP_ABS(segdata[s][SEG_AV1_LVL_ALT_Q]));
1275*437bfbebSnyanmisaka                 segsign |= (segdata[s][SEG_AV1_LVL_ALT_Q] < 0) << s;
1276*437bfbebSnyanmisaka             }
1277*437bfbebSnyanmisaka 
1278*437bfbebSnyanmisaka             if (dxva->segmentation.feature_mask[s] & (1 << SEG_AV1_LVL_ALT_LF_Y_V))
1279*437bfbebSnyanmisaka                 segval[s][SEG_AV1_LVL_ALT_LF_Y_V] =
1280*437bfbebSnyanmisaka                     MPP_CLIP3(-63, 63, segdata[s][SEG_AV1_LVL_ALT_LF_Y_V]);
1281*437bfbebSnyanmisaka 
1282*437bfbebSnyanmisaka             if (dxva->segmentation.feature_mask[s] & (1 << SEG_AV1_LVL_ALT_LF_Y_H))
1283*437bfbebSnyanmisaka                 segval[s][SEG_AV1_LVL_ALT_LF_Y_H] =
1284*437bfbebSnyanmisaka                     MPP_CLIP3(-63, 63, segdata[s][SEG_AV1_LVL_ALT_LF_Y_H]);
1285*437bfbebSnyanmisaka 
1286*437bfbebSnyanmisaka             if (dxva->segmentation.feature_mask[s] & (1 << SEG_AV1_LVL_ALT_LF_U))
1287*437bfbebSnyanmisaka                 segval[s][SEG_AV1_LVL_ALT_LF_U] =
1288*437bfbebSnyanmisaka                     MPP_CLIP3(-63, 63, segdata[s][SEG_AV1_LVL_ALT_LF_U]);
1289*437bfbebSnyanmisaka 
1290*437bfbebSnyanmisaka             if (dxva->segmentation.feature_mask[s] & (1 << SEG_AV1_LVL_ALT_LF_V))
1291*437bfbebSnyanmisaka                 segval[s][SEG_AV1_LVL_ALT_LF_V] =
1292*437bfbebSnyanmisaka                     MPP_CLIP3(-63, 63, segdata[s][SEG_AV1_LVL_ALT_LF_V]);
1293*437bfbebSnyanmisaka 
1294*437bfbebSnyanmisaka             if (dxva->format.frame_type &&
1295*437bfbebSnyanmisaka                 dxva->segmentation.feature_mask[s] & (1 << SEG_AV1_LVL_REF_FRAME))
1296*437bfbebSnyanmisaka                 segval[s][SEG_AV1_LVL_REF_FRAME] =
1297*437bfbebSnyanmisaka                     segdata[s][SEG_AV1_LVL_REF_FRAME] + 1;
1298*437bfbebSnyanmisaka 
1299*437bfbebSnyanmisaka             if (dxva->segmentation.feature_mask[s] & (1 << SEG_AV1_LVL_SKIP))
1300*437bfbebSnyanmisaka                 segval[s][SEG_AV1_LVL_SKIP] = 1;
1301*437bfbebSnyanmisaka             if (dxva->segmentation.feature_mask[s] & (1 << SEG_AV1_LVL_GLOBALMV))
1302*437bfbebSnyanmisaka                 segval[s][SEG_AV1_LVL_GLOBALMV] = 1;
1303*437bfbebSnyanmisaka         }
1304*437bfbebSnyanmisaka     }
1305*437bfbebSnyanmisaka 
1306*437bfbebSnyanmisaka     for (i = 0; i < MAX_MB_SEGMENTS; i++) {
1307*437bfbebSnyanmisaka         for (j = 0; j < SEG_AV1_LVL_MAX; j++) {
1308*437bfbebSnyanmisaka             if (dxva->segmentation.feature_mask[i] & (1 << j)) {
1309*437bfbebSnyanmisaka                 preskip_segid |= j >= SEG_AV1_LVL_REF_FRAME;
1310*437bfbebSnyanmisaka                 last_active_seg = MPP_MAX(i, last_active_seg);
1311*437bfbebSnyanmisaka             }
1312*437bfbebSnyanmisaka         }
1313*437bfbebSnyanmisaka     }
1314*437bfbebSnyanmisaka 
1315*437bfbebSnyanmisaka     regs->swreg9.sw_last_active_seg = last_active_seg;
1316*437bfbebSnyanmisaka     regs->swreg5.sw_preskip_segid   = preskip_segid;
1317*437bfbebSnyanmisaka 
1318*437bfbebSnyanmisaka     regs->swreg12.sw_seg_quant_sign = segsign;
1319*437bfbebSnyanmisaka     /* Write QP, filter level, ref frame and skip for every segment */
1320*437bfbebSnyanmisaka     regs->swreg14.sw_quant_seg0 = segval[0][SEG_AV1_LVL_ALT_Q];
1321*437bfbebSnyanmisaka     regs->swreg14.sw_filt_level_delta0_seg0 = segval[0][SEG_AV1_LVL_ALT_LF_Y_V];
1322*437bfbebSnyanmisaka     regs->swreg20.sw_filt_level_delta1_seg0 = segval[0][SEG_AV1_LVL_ALT_LF_Y_H];
1323*437bfbebSnyanmisaka     regs->swreg20.sw_filt_level_delta2_seg0 = segval[0][SEG_AV1_LVL_ALT_LF_U];
1324*437bfbebSnyanmisaka     regs->swreg20.sw_filt_level_delta3_seg0 = segval[0][SEG_AV1_LVL_ALT_LF_V];
1325*437bfbebSnyanmisaka     regs->swreg14.sw_refpic_seg0 = segval[0][SEG_AV1_LVL_REF_FRAME];
1326*437bfbebSnyanmisaka     regs->swreg14.sw_skip_seg0 = segval[0][SEG_AV1_LVL_SKIP];
1327*437bfbebSnyanmisaka     regs->swreg20.sw_global_mv_seg0 = segval[0][SEG_AV1_LVL_GLOBALMV];
1328*437bfbebSnyanmisaka 
1329*437bfbebSnyanmisaka     regs->swreg15.sw_quant_seg1 = segval[1][SEG_AV1_LVL_ALT_Q];
1330*437bfbebSnyanmisaka     regs->swreg15.sw_filt_level_delta0_seg1 = segval[1][SEG_AV1_LVL_ALT_LF_Y_V];
1331*437bfbebSnyanmisaka     regs->swreg21.sw_filt_level_delta1_seg1 = segval[1][SEG_AV1_LVL_ALT_LF_Y_H];
1332*437bfbebSnyanmisaka     regs->swreg21.sw_filt_level_delta2_seg1 = segval[1][SEG_AV1_LVL_ALT_LF_U];
1333*437bfbebSnyanmisaka     regs->swreg21.sw_filt_level_delta3_seg1 = segval[1][SEG_AV1_LVL_ALT_LF_V];
1334*437bfbebSnyanmisaka     regs->swreg15.sw_refpic_seg1 = segval[1][SEG_AV1_LVL_REF_FRAME];
1335*437bfbebSnyanmisaka     regs->swreg15.sw_skip_seg1 = segval[1][SEG_AV1_LVL_SKIP];
1336*437bfbebSnyanmisaka     regs->swreg21.sw_global_mv_seg1 = segval[1][SEG_AV1_LVL_GLOBALMV];
1337*437bfbebSnyanmisaka 
1338*437bfbebSnyanmisaka     regs->swreg16.sw_quant_seg2 = segval[2][SEG_AV1_LVL_ALT_Q];
1339*437bfbebSnyanmisaka     regs->swreg16.sw_filt_level_delta0_seg2 = segval[2][SEG_AV1_LVL_ALT_LF_Y_V];
1340*437bfbebSnyanmisaka     regs->swreg22.sw_filt_level_delta1_seg2 = segval[2][SEG_AV1_LVL_ALT_LF_Y_H];
1341*437bfbebSnyanmisaka     regs->swreg22.sw_filt_level_delta2_seg2 = segval[2][SEG_AV1_LVL_ALT_LF_U];
1342*437bfbebSnyanmisaka     regs->swreg22.sw_filt_level_delta3_seg2 = segval[2][SEG_AV1_LVL_ALT_LF_V];
1343*437bfbebSnyanmisaka     regs->swreg16.sw_refpic_seg2 = segval[2][SEG_AV1_LVL_REF_FRAME];
1344*437bfbebSnyanmisaka     regs->swreg16.sw_skip_seg2 = segval[2][SEG_AV1_LVL_SKIP];
1345*437bfbebSnyanmisaka     regs->swreg22.sw_global_mv_seg2 = segval[2][SEG_AV1_LVL_GLOBALMV];
1346*437bfbebSnyanmisaka 
1347*437bfbebSnyanmisaka     regs->swreg17.sw_quant_seg3 = segval[3][SEG_AV1_LVL_ALT_Q];
1348*437bfbebSnyanmisaka     regs->swreg17.sw_filt_level_delta0_seg3 = segval[3][SEG_AV1_LVL_ALT_LF_Y_V];
1349*437bfbebSnyanmisaka     regs->swreg23.sw_filt_level_delta1_seg3 = segval[3][SEG_AV1_LVL_ALT_LF_Y_H];
1350*437bfbebSnyanmisaka     regs->swreg23.sw_filt_level_delta2_seg3 = segval[3][SEG_AV1_LVL_ALT_LF_U];
1351*437bfbebSnyanmisaka     regs->swreg23.sw_filt_level_delta3_seg3 = segval[3][SEG_AV1_LVL_ALT_LF_V];
1352*437bfbebSnyanmisaka     regs->swreg17.sw_refpic_seg3 = segval[3][SEG_AV1_LVL_REF_FRAME];
1353*437bfbebSnyanmisaka     regs->swreg17.sw_skip_seg3 = segval[3][SEG_AV1_LVL_SKIP];
1354*437bfbebSnyanmisaka     regs->swreg23.sw_global_mv_seg3 = segval[3][SEG_AV1_LVL_GLOBALMV];
1355*437bfbebSnyanmisaka 
1356*437bfbebSnyanmisaka     regs->swreg18.sw_quant_seg4 = segval[4][SEG_AV1_LVL_ALT_Q];
1357*437bfbebSnyanmisaka     regs->swreg18.sw_filt_level_delta0_seg4 = segval[4][SEG_AV1_LVL_ALT_LF_Y_V];
1358*437bfbebSnyanmisaka     regs->swreg24.sw_filt_level_delta1_seg4 = segval[4][SEG_AV1_LVL_ALT_LF_Y_H];
1359*437bfbebSnyanmisaka     regs->swreg24.sw_filt_level_delta2_seg4 = segval[4][SEG_AV1_LVL_ALT_LF_U];
1360*437bfbebSnyanmisaka     regs->swreg24.sw_filt_level_delta3_seg4 = segval[4][SEG_AV1_LVL_ALT_LF_V];
1361*437bfbebSnyanmisaka     regs->swreg18.sw_refpic_seg4 = segval[4][SEG_AV1_LVL_REF_FRAME];
1362*437bfbebSnyanmisaka     regs->swreg18.sw_skip_seg4 = segval[4][SEG_AV1_LVL_SKIP];
1363*437bfbebSnyanmisaka     regs->swreg24.sw_global_mv_seg4 = segval[4][SEG_AV1_LVL_GLOBALMV];
1364*437bfbebSnyanmisaka 
1365*437bfbebSnyanmisaka     regs->swreg19.sw_quant_seg5 = segval[5][SEG_AV1_LVL_ALT_Q];
1366*437bfbebSnyanmisaka     regs->swreg19.sw_filt_level_delta0_seg5 = segval[5][SEG_AV1_LVL_ALT_LF_Y_V];
1367*437bfbebSnyanmisaka     regs->swreg25.sw_filt_level_delta1_seg5 = segval[5][SEG_AV1_LVL_ALT_LF_Y_H];
1368*437bfbebSnyanmisaka     regs->swreg25.sw_filt_level_delta2_seg5 = segval[5][SEG_AV1_LVL_ALT_LF_U];
1369*437bfbebSnyanmisaka     regs->swreg25.sw_filt_level_delta3_seg5 = segval[5][SEG_AV1_LVL_ALT_LF_V];
1370*437bfbebSnyanmisaka     regs->swreg19.sw_refpic_seg5 = segval[5][SEG_AV1_LVL_REF_FRAME];
1371*437bfbebSnyanmisaka     regs->swreg19.sw_skip_seg5 = segval[5][SEG_AV1_LVL_SKIP];
1372*437bfbebSnyanmisaka     regs->swreg25.sw_global_mv_seg5 = segval[5][SEG_AV1_LVL_GLOBALMV];
1373*437bfbebSnyanmisaka 
1374*437bfbebSnyanmisaka     regs->swreg31.sw_quant_seg6 = segval[6][SEG_AV1_LVL_ALT_Q];
1375*437bfbebSnyanmisaka     regs->swreg31.sw_filt_level_delta0_seg6 = segval[6][SEG_AV1_LVL_ALT_LF_Y_V];
1376*437bfbebSnyanmisaka     regs->swreg26.sw_filt_level_delta1_seg6 = segval[6][SEG_AV1_LVL_ALT_LF_Y_H];
1377*437bfbebSnyanmisaka     regs->swreg26.sw_filt_level_delta2_seg6 = segval[6][SEG_AV1_LVL_ALT_LF_U];
1378*437bfbebSnyanmisaka     regs->swreg26.sw_filt_level_delta3_seg6 = segval[6][SEG_AV1_LVL_ALT_LF_V];
1379*437bfbebSnyanmisaka     regs->swreg31.sw_refpic_seg6 = segval[6][SEG_AV1_LVL_REF_FRAME];
1380*437bfbebSnyanmisaka     regs->swreg31.sw_skip_seg6 = segval[6][SEG_AV1_LVL_SKIP];
1381*437bfbebSnyanmisaka     regs->swreg26.sw_global_mv_seg6 = segval[6][SEG_AV1_LVL_GLOBALMV];
1382*437bfbebSnyanmisaka 
1383*437bfbebSnyanmisaka     regs->swreg32.sw_quant_seg7 = segval[7][SEG_AV1_LVL_ALT_Q];
1384*437bfbebSnyanmisaka     regs->swreg32.sw_filt_level_delta0_seg7 = segval[7][SEG_AV1_LVL_ALT_LF_Y_V];
1385*437bfbebSnyanmisaka     regs->swreg27.sw_filt_level_delta1_seg7 = segval[7][SEG_AV1_LVL_ALT_LF_Y_H];
1386*437bfbebSnyanmisaka     regs->swreg27.sw_filt_level_delta2_seg7 = segval[7][SEG_AV1_LVL_ALT_LF_U];
1387*437bfbebSnyanmisaka     regs->swreg27.sw_filt_level_delta3_seg7 = segval[7][SEG_AV1_LVL_ALT_LF_V];
1388*437bfbebSnyanmisaka     regs->swreg32.sw_refpic_seg7 = segval[7][SEG_AV1_LVL_REF_FRAME];
1389*437bfbebSnyanmisaka     regs->swreg32.sw_skip_seg7 = segval[7][SEG_AV1_LVL_SKIP];
1390*437bfbebSnyanmisaka     regs->swreg27.sw_global_mv_seg7 = segval[7][SEG_AV1_LVL_GLOBALMV];
1391*437bfbebSnyanmisaka }
1392*437bfbebSnyanmisaka 
vdpu_av1d_set_loopfilter(Av1dHalCtx * p_hal,DXVA_PicParams_AV1 * dxva)1393*437bfbebSnyanmisaka static void vdpu_av1d_set_loopfilter(Av1dHalCtx *p_hal, DXVA_PicParams_AV1 *dxva)
1394*437bfbebSnyanmisaka {
1395*437bfbebSnyanmisaka     VdpuAv1dRegCtx *ctx = p_hal->reg_ctx;
1396*437bfbebSnyanmisaka     VdpuAv1dRegSet *regs = ctx->regs;
1397*437bfbebSnyanmisaka     regs->swreg3.sw_filtering_dis      = (dxva->loop_filter.filter_level[0] == 0) && (dxva->loop_filter.filter_level[1] == 0);
1398*437bfbebSnyanmisaka     regs->swreg5.sw_filt_level_base_gt32    = dxva->loop_filter.filter_level[0] > 32;
1399*437bfbebSnyanmisaka     regs->swreg30.sw_filt_sharpness         = dxva->loop_filter.sharpness_level;
1400*437bfbebSnyanmisaka     if (dxva->loop_filter.mode_ref_delta_enabled) {
1401*437bfbebSnyanmisaka         regs->swreg59.sw_filt_ref_adj_0 = dxva->loop_filter.ref_deltas[0];
1402*437bfbebSnyanmisaka         regs->swreg59.sw_filt_ref_adj_1 = dxva->loop_filter.ref_deltas[1];
1403*437bfbebSnyanmisaka         regs->swreg59.sw_filt_ref_adj_2 = dxva->loop_filter.ref_deltas[2];
1404*437bfbebSnyanmisaka         regs->swreg59.sw_filt_ref_adj_3 = dxva->loop_filter.ref_deltas[3];
1405*437bfbebSnyanmisaka         regs->swreg30.sw_filt_ref_adj_4 = dxva->loop_filter.ref_deltas[4];
1406*437bfbebSnyanmisaka         regs->swreg30.sw_filt_ref_adj_5 = dxva->loop_filter.ref_deltas[5];
1407*437bfbebSnyanmisaka         regs->swreg49.sw_filt_ref_adj_7 = dxva->loop_filter.ref_deltas[6];
1408*437bfbebSnyanmisaka         regs->swreg49.sw_filt_ref_adj_6 = dxva->loop_filter.ref_deltas[7];
1409*437bfbebSnyanmisaka         regs->swreg30.sw_filt_mb_adj_0  = dxva->loop_filter.mode_deltas[0];
1410*437bfbebSnyanmisaka         regs->swreg30.sw_filt_mb_adj_1  = dxva->loop_filter.mode_deltas[1];
1411*437bfbebSnyanmisaka     } else {
1412*437bfbebSnyanmisaka         regs->swreg59.sw_filt_ref_adj_0 = 0;
1413*437bfbebSnyanmisaka         regs->swreg59.sw_filt_ref_adj_1 = 0;
1414*437bfbebSnyanmisaka         regs->swreg59.sw_filt_ref_adj_2 = 0;
1415*437bfbebSnyanmisaka         regs->swreg59.sw_filt_ref_adj_3 = 0;
1416*437bfbebSnyanmisaka         regs->swreg30.sw_filt_ref_adj_4 = 0;
1417*437bfbebSnyanmisaka         regs->swreg30.sw_filt_ref_adj_5 = 0;
1418*437bfbebSnyanmisaka         regs->swreg49.sw_filt_ref_adj_7 = 0;
1419*437bfbebSnyanmisaka         regs->swreg49.sw_filt_ref_adj_6 = 0;
1420*437bfbebSnyanmisaka         regs->swreg30.sw_filt_mb_adj_0  = 0;
1421*437bfbebSnyanmisaka         regs->swreg30.sw_filt_mb_adj_1  = 0;
1422*437bfbebSnyanmisaka     }
1423*437bfbebSnyanmisaka 
1424*437bfbebSnyanmisaka     regs->addr_cfg.swreg179.sw_dec_vert_filt_base_lsb = mpp_buffer_get_fd(ctx->filter_mem);
1425*437bfbebSnyanmisaka     regs->addr_cfg.swreg183.sw_dec_bsd_ctrl_base_lsb = mpp_buffer_get_fd(ctx->filter_mem);
1426*437bfbebSnyanmisaka     mpp_dev_set_reg_offset(p_hal->dev, 183, ctx->filt_info[DB_CTRL_COL].offset);
1427*437bfbebSnyanmisaka }
1428*437bfbebSnyanmisaka 
vdpu_av1d_set_global_model(Av1dHalCtx * p_hal,DXVA_PicParams_AV1 * dxva)1429*437bfbebSnyanmisaka static void vdpu_av1d_set_global_model(Av1dHalCtx *p_hal, DXVA_PicParams_AV1 *dxva)
1430*437bfbebSnyanmisaka {
1431*437bfbebSnyanmisaka     VdpuAv1dRegCtx *ctx = p_hal->reg_ctx;
1432*437bfbebSnyanmisaka     VdpuAv1dRegSet *regs = ctx->regs;
1433*437bfbebSnyanmisaka     RK_U8 *dst = (RK_U8 *) mpp_buffer_get_ptr(ctx->global_model);
1434*437bfbebSnyanmisaka     RK_S32 ref_frame, i;
1435*437bfbebSnyanmisaka 
1436*437bfbebSnyanmisaka     for (ref_frame = 0; ref_frame < GM_GLOBAL_MODELS_PER_FRAME; ++ref_frame) {
1437*437bfbebSnyanmisaka         mpp_assert(dxva->frame_refs[ref_frame].wmtype <= 3);
1438*437bfbebSnyanmisaka 
1439*437bfbebSnyanmisaka         /* In DDR wmmat order is 0, 1, 3, 2, 4, 5 */
1440*437bfbebSnyanmisaka         for (i = 0; i < 6; ++i) {
1441*437bfbebSnyanmisaka             if (i == 2)
1442*437bfbebSnyanmisaka                 *(RK_S32 *)(dst) = dxva->frame_refs[ref_frame].wmmat[3];
1443*437bfbebSnyanmisaka             else if (i == 3)
1444*437bfbebSnyanmisaka                 *(RK_S32 *)(dst) = dxva->frame_refs[ref_frame].wmmat[2];
1445*437bfbebSnyanmisaka             else
1446*437bfbebSnyanmisaka                 *(RK_S32 *)(dst) = dxva->frame_refs[ref_frame].wmmat[i];
1447*437bfbebSnyanmisaka             dst += 4;
1448*437bfbebSnyanmisaka         }
1449*437bfbebSnyanmisaka 
1450*437bfbebSnyanmisaka         *(RK_S16 *)(dst) = dxva->frame_refs[ref_frame].alpha;//-32768;
1451*437bfbebSnyanmisaka         dst += 2;
1452*437bfbebSnyanmisaka         *(RK_S16 *)(dst) = dxva->frame_refs[ref_frame].beta;//-32768;
1453*437bfbebSnyanmisaka         dst += 2;
1454*437bfbebSnyanmisaka         *(RK_S16 *)(dst) = dxva->frame_refs[ref_frame].gamma;//-32768;
1455*437bfbebSnyanmisaka         dst += 2;
1456*437bfbebSnyanmisaka         *(RK_S16 *)(dst) = dxva->frame_refs[ref_frame].delta;//-32768;
1457*437bfbebSnyanmisaka         dst += 2;
1458*437bfbebSnyanmisaka         AV1D_DBG(AV1D_DBG_LOG, "ref_frame[%d] alpa %d beta %d gamma %d delta %d\n",
1459*437bfbebSnyanmisaka                  ref_frame,
1460*437bfbebSnyanmisaka                  dxva->frame_refs[ref_frame].alpha,
1461*437bfbebSnyanmisaka                  dxva->frame_refs[ref_frame].beta,
1462*437bfbebSnyanmisaka                  dxva->frame_refs[ref_frame].gamma,
1463*437bfbebSnyanmisaka                  dxva->frame_refs[ref_frame].delta);
1464*437bfbebSnyanmisaka     }
1465*437bfbebSnyanmisaka     mpp_buffer_sync_end(ctx->global_model);
1466*437bfbebSnyanmisaka 
1467*437bfbebSnyanmisaka     regs->addr_cfg.swreg82.sw_global_model_base_msb = 0;
1468*437bfbebSnyanmisaka     regs->addr_cfg.swreg83.sw_global_model_base_lsb = mpp_buffer_get_fd(ctx->global_model);
1469*437bfbebSnyanmisaka }
1470*437bfbebSnyanmisaka 
vdpu_av1d_set_tile_info_regs(VdpuAv1dRegCtx * ctx,DXVA_PicParams_AV1 * dxva)1471*437bfbebSnyanmisaka static void vdpu_av1d_set_tile_info_regs(VdpuAv1dRegCtx *ctx, DXVA_PicParams_AV1 *dxva)
1472*437bfbebSnyanmisaka {
1473*437bfbebSnyanmisaka     int transpose = ctx->tile_transpose;
1474*437bfbebSnyanmisaka     VdpuAv1dRegSet *regs = ctx->regs;
1475*437bfbebSnyanmisaka     size_t context_update_tile_id =  dxva->tiles.context_update_id;
1476*437bfbebSnyanmisaka     size_t context_update_y = context_update_tile_id / dxva->tiles.cols;
1477*437bfbebSnyanmisaka     size_t context_update_x = context_update_tile_id % dxva->tiles.cols;
1478*437bfbebSnyanmisaka 
1479*437bfbebSnyanmisaka     regs->swreg11.sw_multicore_expect_context_update = (0 == context_update_x);
1480*437bfbebSnyanmisaka     if (transpose) {
1481*437bfbebSnyanmisaka         context_update_tile_id =
1482*437bfbebSnyanmisaka             context_update_x * dxva->tiles.rows + context_update_y;
1483*437bfbebSnyanmisaka     }
1484*437bfbebSnyanmisaka     regs->swreg10.sw_tile_enable = (dxva->tiles.cols > 1) || (dxva->tiles.rows > 1);
1485*437bfbebSnyanmisaka     regs->swreg10.sw_num_tile_cols_8k       = dxva->tiles.cols;
1486*437bfbebSnyanmisaka     regs->swreg10.sw_num_tile_rows_8k_av1   = dxva->tiles.rows;
1487*437bfbebSnyanmisaka     regs->swreg9.sw_context_update_tile_id  = context_update_tile_id;
1488*437bfbebSnyanmisaka     regs->swreg10.sw_tile_transpose         = transpose;
1489*437bfbebSnyanmisaka     regs->swreg11.sw_dec_tile_size_mag      = dxva->tiles.tile_sz_mag;
1490*437bfbebSnyanmisaka     if (regs->swreg10.sw_tile_enable) AV1D_DBG(AV1D_DBG_LOG, "NOTICE: tile enabled.\n");
1491*437bfbebSnyanmisaka 
1492*437bfbebSnyanmisaka     regs->addr_cfg.swreg167.sw_tile_base_lsb = mpp_buffer_get_fd(ctx->tile_info);//
1493*437bfbebSnyanmisaka     regs->addr_cfg.swreg166.sw_tile_base_msb = 0;
1494*437bfbebSnyanmisaka }
1495*437bfbebSnyanmisaka 
check_tile_width(DXVA_PicParams_AV1 * dxva,RK_S32 width,RK_S32 leftmost)1496*437bfbebSnyanmisaka static int check_tile_width(DXVA_PicParams_AV1 *dxva, RK_S32 width, RK_S32 leftmost)
1497*437bfbebSnyanmisaka {
1498*437bfbebSnyanmisaka     RK_S32 valid = 1;
1499*437bfbebSnyanmisaka     if (!leftmost && dxva->coding.use_128x128_superblock == 0 && dxva->coding.superres && width == 1) {
1500*437bfbebSnyanmisaka         AV1D_DBG(AV1D_DBG_LOG, "WARNING: Superres used and tile width == 64\n");
1501*437bfbebSnyanmisaka         valid = 0;
1502*437bfbebSnyanmisaka     }
1503*437bfbebSnyanmisaka 
1504*437bfbebSnyanmisaka     const RK_S32 sb_size_log2 = dxva->coding.use_128x128_superblock ? 7 : 6;
1505*437bfbebSnyanmisaka     RK_S32 tile_width_pixels = (width << sb_size_log2);
1506*437bfbebSnyanmisaka     if (dxva->coding.superres) {
1507*437bfbebSnyanmisaka         tile_width_pixels =
1508*437bfbebSnyanmisaka             (tile_width_pixels * (9 + dxva->superres_denom) + 4) / 8;
1509*437bfbebSnyanmisaka     }
1510*437bfbebSnyanmisaka     if (tile_width_pixels > 4096) {
1511*437bfbebSnyanmisaka         if (dxva->coding.superres)
1512*437bfbebSnyanmisaka             AV1D_LOG("WARNING: Tile width after superres > 4096\n");
1513*437bfbebSnyanmisaka         else
1514*437bfbebSnyanmisaka             AV1D_LOG("WARNING: Tile width > 4096\n");
1515*437bfbebSnyanmisaka         valid = 0;
1516*437bfbebSnyanmisaka     }
1517*437bfbebSnyanmisaka     return valid;
1518*437bfbebSnyanmisaka }
1519*437bfbebSnyanmisaka 
vdpu_av1d_set_tile_info_mem(Av1dHalCtx * p_hal,DXVA_PicParams_AV1 * dxva)1520*437bfbebSnyanmisaka static void vdpu_av1d_set_tile_info_mem(Av1dHalCtx *p_hal, DXVA_PicParams_AV1 *dxva)
1521*437bfbebSnyanmisaka {
1522*437bfbebSnyanmisaka     VdpuAv1dRegCtx *ctx = (VdpuAv1dRegCtx *)p_hal->reg_ctx;
1523*437bfbebSnyanmisaka 
1524*437bfbebSnyanmisaka     RK_S32 transpose = ctx->tile_transpose;
1525*437bfbebSnyanmisaka     RK_S32 tmp = dxva->frame_tag_size + dxva->offset_to_dct_parts;
1526*437bfbebSnyanmisaka     RK_U32 stream_len =  p_hal->strm_len - tmp;
1527*437bfbebSnyanmisaka     RK_U8  *p1 = (RK_U8*)mpp_buffer_get_ptr(ctx->tile_info);
1528*437bfbebSnyanmisaka     RK_S32 size0 = transpose ?  dxva->tiles.cols : dxva->tiles.rows;
1529*437bfbebSnyanmisaka     RK_S32 size1 = transpose ? dxva->tiles.rows  :  dxva->tiles.cols;
1530*437bfbebSnyanmisaka     RK_S32 tile0, tile1;
1531*437bfbebSnyanmisaka     RK_U32 not_valid_tile_dimension = 0;
1532*437bfbebSnyanmisaka     RK_U32 tiles[2][64];
1533*437bfbebSnyanmisaka 
1534*437bfbebSnyanmisaka     /* convert to per tile position */
1535*437bfbebSnyanmisaka     {
1536*437bfbebSnyanmisaka         RK_U8 val = 0, i;
1537*437bfbebSnyanmisaka 
1538*437bfbebSnyanmisaka         for (i = 0; i < dxva->tiles.cols; i++) {
1539*437bfbebSnyanmisaka             tiles[0][i] = val;
1540*437bfbebSnyanmisaka             val += dxva->tiles.widths[i];
1541*437bfbebSnyanmisaka         }
1542*437bfbebSnyanmisaka         tiles[0][i] = val;
1543*437bfbebSnyanmisaka 
1544*437bfbebSnyanmisaka         val = 0;
1545*437bfbebSnyanmisaka         for (i = 0; i < dxva->tiles.rows; i++) {
1546*437bfbebSnyanmisaka             tiles[1][i] = val;
1547*437bfbebSnyanmisaka             val += dxva->tiles.heights[i];
1548*437bfbebSnyanmisaka         }
1549*437bfbebSnyanmisaka         tiles[1][i] = val;
1550*437bfbebSnyanmisaka     }
1551*437bfbebSnyanmisaka 
1552*437bfbebSnyanmisaka     // Write tile dimensions
1553*437bfbebSnyanmisaka     for (tile0 = 0; tile0 < size0; tile0++) {
1554*437bfbebSnyanmisaka         for (tile1 = 0; tile1 < size1; tile1++) {
1555*437bfbebSnyanmisaka             RK_S32 tile_y = transpose ? tile1 : tile0;
1556*437bfbebSnyanmisaka             RK_S32 tile_x = transpose ? tile0 : tile1;
1557*437bfbebSnyanmisaka             RK_S32 tile_id = transpose ? tile1 * size0 + tile0 : tile0 * size1 + tile1;
1558*437bfbebSnyanmisaka             RK_U32 start, end;
1559*437bfbebSnyanmisaka 
1560*437bfbebSnyanmisaka             RK_U32 y0 = tiles[1][tile_y];
1561*437bfbebSnyanmisaka             RK_U32 y1 = tiles[1][tile_y + 1];
1562*437bfbebSnyanmisaka             RK_U32 x0 = tiles[0][tile_x];
1563*437bfbebSnyanmisaka             RK_U32 x1 = tiles[0][tile_x + 1];
1564*437bfbebSnyanmisaka 
1565*437bfbebSnyanmisaka             RK_U8 leftmost = (tile_x == dxva->tiles.cols - 1);
1566*437bfbebSnyanmisaka             if (!not_valid_tile_dimension)
1567*437bfbebSnyanmisaka                 not_valid_tile_dimension = !check_tile_width(dxva, x1 - x0, leftmost);
1568*437bfbebSnyanmisaka             if ((x0 << (dxva->coding.use_128x128_superblock ? 7 : 6)) >= dxva->width ||
1569*437bfbebSnyanmisaka                 (y0 << (dxva->coding.use_128x128_superblock ? 7 : 6)) >= dxva->height)
1570*437bfbebSnyanmisaka                 not_valid_tile_dimension = 1;
1571*437bfbebSnyanmisaka 
1572*437bfbebSnyanmisaka             // tile size in SB units (width,height)
1573*437bfbebSnyanmisaka             *p1++ = x1 - x0;
1574*437bfbebSnyanmisaka             *p1++ = 0;
1575*437bfbebSnyanmisaka             *p1++ = 0;
1576*437bfbebSnyanmisaka             *p1++ = 0;
1577*437bfbebSnyanmisaka             *p1++ = y1 - y0;
1578*437bfbebSnyanmisaka             *p1++ = 0;
1579*437bfbebSnyanmisaka             *p1++ = 0;
1580*437bfbebSnyanmisaka             *p1++ = 0;
1581*437bfbebSnyanmisaka 
1582*437bfbebSnyanmisaka             // tile start position (offset from sw_stream0_base)
1583*437bfbebSnyanmisaka             start = dxva->tiles.tile_offset_start[tile_id];
1584*437bfbebSnyanmisaka             *p1++ = start & 255;
1585*437bfbebSnyanmisaka             *p1++ = (start >> 8) & 255;
1586*437bfbebSnyanmisaka             *p1++ = (start >> 16) & 255;
1587*437bfbebSnyanmisaka             *p1++ = (start >> 24) & 255;
1588*437bfbebSnyanmisaka             if (!not_valid_tile_dimension) {
1589*437bfbebSnyanmisaka                 if ((start + 1) > stream_len)
1590*437bfbebSnyanmisaka                     not_valid_tile_dimension = 1;
1591*437bfbebSnyanmisaka             }
1592*437bfbebSnyanmisaka 
1593*437bfbebSnyanmisaka             // # of bytes in tile data
1594*437bfbebSnyanmisaka             end = dxva->tiles.tile_offset_end[tile_id];
1595*437bfbebSnyanmisaka             *p1++ = end & 255;
1596*437bfbebSnyanmisaka             *p1++ = (end >> 8) & 255;
1597*437bfbebSnyanmisaka             *p1++ = (end >> 16) & 255;
1598*437bfbebSnyanmisaka             *p1++ = (end >> 24) & 255;
1599*437bfbebSnyanmisaka             if (!not_valid_tile_dimension) {
1600*437bfbebSnyanmisaka                 if (end > stream_len)
1601*437bfbebSnyanmisaka                     not_valid_tile_dimension = 1;
1602*437bfbebSnyanmisaka             }
1603*437bfbebSnyanmisaka             AV1D_DBG(AV1D_DBG_LOG, "tile_info[%d][%d]: start=%08x end=%08x x0:x1=%d:%d y0:y1=%d:%d\n",
1604*437bfbebSnyanmisaka                      tile0, tile1, start, end, x0, x1, y0, y1);
1605*437bfbebSnyanmisaka         }
1606*437bfbebSnyanmisaka     }
1607*437bfbebSnyanmisaka     mpp_buffer_sync_end(ctx->tile_info);
1608*437bfbebSnyanmisaka }
1609*437bfbebSnyanmisaka 
vdpu_av1d_set_cdef(Av1dHalCtx * p_hal,DXVA_PicParams_AV1 * dxva)1610*437bfbebSnyanmisaka static void vdpu_av1d_set_cdef(Av1dHalCtx *p_hal, DXVA_PicParams_AV1 *dxva)
1611*437bfbebSnyanmisaka {
1612*437bfbebSnyanmisaka     RK_U32 luma_pri_strength = 0;
1613*437bfbebSnyanmisaka     RK_U16 luma_sec_strength = 0;
1614*437bfbebSnyanmisaka     RK_U32 chroma_pri_strength = 0;
1615*437bfbebSnyanmisaka     RK_U16 chroma_sec_strength = 0;
1616*437bfbebSnyanmisaka     VdpuAv1dRegCtx *ctx = p_hal->reg_ctx;
1617*437bfbebSnyanmisaka     VdpuAv1dRegSet *regs = ctx->regs;
1618*437bfbebSnyanmisaka     RK_S32 i;
1619*437bfbebSnyanmisaka 
1620*437bfbebSnyanmisaka     /* CDEF */
1621*437bfbebSnyanmisaka     regs->swreg7.sw_cdef_bits           = dxva->cdef.bits;
1622*437bfbebSnyanmisaka     regs->swreg7.sw_cdef_damping        = dxva->cdef.damping;
1623*437bfbebSnyanmisaka 
1624*437bfbebSnyanmisaka     for (i = 0; i < 8; i++) {
1625*437bfbebSnyanmisaka         if (i == (1 << (dxva->cdef.bits))) break;
1626*437bfbebSnyanmisaka         luma_pri_strength |= dxva->cdef.y_strengths[i].primary << (i * 4);
1627*437bfbebSnyanmisaka         luma_sec_strength |= dxva->cdef.y_strengths[i].secondary << (i * 2);
1628*437bfbebSnyanmisaka         chroma_pri_strength |= dxva->cdef.uv_strengths[i].primary << (i * 4);
1629*437bfbebSnyanmisaka         chroma_sec_strength |= dxva->cdef.uv_strengths[i].secondary << (i * 2);
1630*437bfbebSnyanmisaka     }
1631*437bfbebSnyanmisaka 
1632*437bfbebSnyanmisaka     regs->swreg263.sw_cdef_luma_primary_strength = luma_pri_strength;
1633*437bfbebSnyanmisaka     regs->swreg53.sw_cdef_luma_secondary_strength = luma_sec_strength;
1634*437bfbebSnyanmisaka     regs->swreg264.sw_cdef_chroma_primary_strength = chroma_pri_strength;
1635*437bfbebSnyanmisaka     regs->swreg53.sw_cdef_chroma_secondary_strength = chroma_sec_strength;
1636*437bfbebSnyanmisaka 
1637*437bfbebSnyanmisaka     // tile column buffer; repurpose some encoder specific base
1638*437bfbebSnyanmisaka     regs->addr_cfg.swreg85.sw_cdef_colbuf_base_lsb = mpp_buffer_get_fd(ctx->filter_mem);
1639*437bfbebSnyanmisaka     mpp_dev_set_reg_offset(p_hal->dev, 85, ctx->filt_info[CDEF_COL].offset);
1640*437bfbebSnyanmisaka }
1641*437bfbebSnyanmisaka 
vdpu_av1d_set_lr(Av1dHalCtx * p_hal,DXVA_PicParams_AV1 * dxva)1642*437bfbebSnyanmisaka static void vdpu_av1d_set_lr(Av1dHalCtx *p_hal, DXVA_PicParams_AV1 *dxva)
1643*437bfbebSnyanmisaka {
1644*437bfbebSnyanmisaka     VdpuAv1dRegCtx *ctx = p_hal->reg_ctx;
1645*437bfbebSnyanmisaka     VdpuAv1dRegSet *regs = ctx->regs;
1646*437bfbebSnyanmisaka     RK_U16 lr_type = 0;
1647*437bfbebSnyanmisaka     RK_U16 lr_unit_size = 0;
1648*437bfbebSnyanmisaka     RK_S32 i = 0;
1649*437bfbebSnyanmisaka 
1650*437bfbebSnyanmisaka     for (i = 0; i < 3; i++) {
1651*437bfbebSnyanmisaka         lr_type |= dxva->loop_filter.frame_restoration_type[i] << (i * 2);
1652*437bfbebSnyanmisaka         lr_unit_size |= dxva->loop_filter.log2_restoration_unit_size[i] << (i * 2);
1653*437bfbebSnyanmisaka     }
1654*437bfbebSnyanmisaka     regs->swreg18.sw_lr_type = lr_type;
1655*437bfbebSnyanmisaka     regs->swreg19.sw_lr_unit_size = lr_unit_size;
1656*437bfbebSnyanmisaka     regs->addr_cfg.swreg91.sw_lr_colbuf_base_lsb = mpp_buffer_get_fd(ctx->filter_mem);
1657*437bfbebSnyanmisaka     mpp_dev_set_reg_offset(p_hal->dev, 91, ctx->filt_info[LR_COL].offset);
1658*437bfbebSnyanmisaka }
1659*437bfbebSnyanmisaka 
init_scaling_function(RK_U8 scaling_points[][2],RK_U8 num_points,RK_U8 scaling_lut[])1660*437bfbebSnyanmisaka static void init_scaling_function(RK_U8 scaling_points[][2], RK_U8 num_points,
1661*437bfbebSnyanmisaka                                   RK_U8 scaling_lut[])
1662*437bfbebSnyanmisaka {
1663*437bfbebSnyanmisaka     RK_S32 i, point;
1664*437bfbebSnyanmisaka 
1665*437bfbebSnyanmisaka     if (num_points == 0) {
1666*437bfbebSnyanmisaka         memset(scaling_lut, 0, 256);
1667*437bfbebSnyanmisaka         return;
1668*437bfbebSnyanmisaka     }
1669*437bfbebSnyanmisaka 
1670*437bfbebSnyanmisaka     for (i = 0; i < scaling_points[0][0]; i++)
1671*437bfbebSnyanmisaka         scaling_lut[i] = scaling_points[0][1];
1672*437bfbebSnyanmisaka 
1673*437bfbebSnyanmisaka     for (point = 0; point < num_points - 1; point++) {
1674*437bfbebSnyanmisaka         RK_S32 x ;
1675*437bfbebSnyanmisaka         RK_S32 delta_y = scaling_points[point + 1][1] - scaling_points[point][1];
1676*437bfbebSnyanmisaka         RK_S32 delta_x = scaling_points[point + 1][0] - scaling_points[point][0];
1677*437bfbebSnyanmisaka         RK_S64 delta =
1678*437bfbebSnyanmisaka             delta_x ? delta_y * ((65536 + (delta_x >> 1)) / delta_x) : 0;
1679*437bfbebSnyanmisaka         for (x = 0; x < delta_x; x++) {
1680*437bfbebSnyanmisaka             scaling_lut[scaling_points[point][0] + x] =
1681*437bfbebSnyanmisaka                 scaling_points[point][1] + (RK_S32)((x * delta + 32768) >> 16);
1682*437bfbebSnyanmisaka         }
1683*437bfbebSnyanmisaka     }
1684*437bfbebSnyanmisaka 
1685*437bfbebSnyanmisaka     for (i = scaling_points[num_points - 1][0]; i < 256; i++)
1686*437bfbebSnyanmisaka         scaling_lut[i] = scaling_points[num_points - 1][1];
1687*437bfbebSnyanmisaka }
1688*437bfbebSnyanmisaka 
vdpu_av1d_set_fgs(VdpuAv1dRegCtx * ctx,DXVA_PicParams_AV1 * dxva)1689*437bfbebSnyanmisaka static void vdpu_av1d_set_fgs(VdpuAv1dRegCtx *ctx, DXVA_PicParams_AV1 *dxva)
1690*437bfbebSnyanmisaka {
1691*437bfbebSnyanmisaka     VdpuAv1dRegSet *regs = ctx->regs;
1692*437bfbebSnyanmisaka     RK_S32 ar_coeffs_y[24];
1693*437bfbebSnyanmisaka     RK_S32 ar_coeffs_cb[25];
1694*437bfbebSnyanmisaka     RK_S32 ar_coeffs_cr[25];
1695*437bfbebSnyanmisaka     RK_S32 luma_grain_block[73][82];
1696*437bfbebSnyanmisaka     RK_S32 cb_grain_block[38][44];
1697*437bfbebSnyanmisaka     RK_S32 cr_grain_block[38][44];
1698*437bfbebSnyanmisaka     RK_S32 ar_coeff_lag;
1699*437bfbebSnyanmisaka     RK_S32 ar_coeff_shift;
1700*437bfbebSnyanmisaka     RK_S32 grain_scale_shift;
1701*437bfbebSnyanmisaka     RK_S32 bitdepth;
1702*437bfbebSnyanmisaka     RK_S32 grain_center;
1703*437bfbebSnyanmisaka     RK_S32 grain_min;
1704*437bfbebSnyanmisaka     RK_S32 grain_max;
1705*437bfbebSnyanmisaka     RK_S32 i, j;
1706*437bfbebSnyanmisaka     RK_U8 *ptr = mpp_buffer_get_ptr(ctx->film_grain_mem);
1707*437bfbebSnyanmisaka     if (!dxva->film_grain.apply_grain) {
1708*437bfbebSnyanmisaka         regs->swreg7.sw_apply_grain = 0;
1709*437bfbebSnyanmisaka         // store reset params
1710*437bfbebSnyanmisaka         //   asic_buff->fg_params[asic_buff->out_buffer_i] = dec->fg_params;
1711*437bfbebSnyanmisaka         return;
1712*437bfbebSnyanmisaka     }
1713*437bfbebSnyanmisaka     /*   struct Av1FilmGrainParams *fg_params = &dec->fg_params;
1714*437bfbebSnyanmisaka        if (!dec->update_parameters) {
1715*437bfbebSnyanmisaka            RK_S32 active_ref = dec->film_grain_params_ref_idx;
1716*437bfbebSnyanmisaka            RK_S32 index_ref = Av1BufferQueueGetRef(dec_cont->bq, active_ref);
1717*437bfbebSnyanmisaka            u16 random_seed = fg_params->random_seed;
1718*437bfbebSnyanmisaka            *fg_params = asic_buff->fg_params[index_ref];
1719*437bfbebSnyanmisaka            fg_params->random_seed = random_seed;
1720*437bfbebSnyanmisaka        }
1721*437bfbebSnyanmisaka        asic_buff->fg_params[asic_buff->out_buffer_i] = *fg_params;*/
1722*437bfbebSnyanmisaka 
1723*437bfbebSnyanmisaka     // film grain applied on secondary output
1724*437bfbebSnyanmisaka     //  sw_ctrl->sw_apply_grain = dec_cont->pp_enabled ? 1 : 0;
1725*437bfbebSnyanmisaka     regs->swreg7.sw_num_y_points_b = dxva->film_grain.num_y_points > 0;
1726*437bfbebSnyanmisaka     regs->swreg7.sw_num_cb_points_b = dxva->film_grain.num_cb_points > 0;
1727*437bfbebSnyanmisaka     regs->swreg7.sw_num_cr_points_b = dxva->film_grain.num_cr_points > 0;
1728*437bfbebSnyanmisaka     regs->swreg8.sw_scaling_shift =  dxva->film_grain.scaling_shift_minus8 + 8;
1729*437bfbebSnyanmisaka     if (! dxva->film_grain.chroma_scaling_from_luma) {
1730*437bfbebSnyanmisaka         regs->swreg28.sw_cb_mult = dxva->film_grain.cb_mult - 128;
1731*437bfbebSnyanmisaka         regs->swreg28.sw_cb_luma_mult = dxva->film_grain.cb_luma_mult - 128;
1732*437bfbebSnyanmisaka         regs->swreg28.sw_cb_offset = dxva->film_grain.cb_offset - 256;
1733*437bfbebSnyanmisaka         regs->swreg29.sw_cr_mult = dxva->film_grain.cr_mult - 128;
1734*437bfbebSnyanmisaka         regs->swreg29.sw_cr_luma_mult = dxva->film_grain.cr_luma_mult - 128;
1735*437bfbebSnyanmisaka         regs->swreg29.sw_cr_offset = dxva->film_grain.cr_offset - 256;
1736*437bfbebSnyanmisaka     } else {
1737*437bfbebSnyanmisaka         regs->swreg28.sw_cb_mult = 0;
1738*437bfbebSnyanmisaka         regs->swreg28.sw_cb_luma_mult = 64;
1739*437bfbebSnyanmisaka         regs->swreg28.sw_cb_offset = 0;
1740*437bfbebSnyanmisaka         regs->swreg29.sw_cr_mult = 0;
1741*437bfbebSnyanmisaka         regs->swreg29.sw_cr_luma_mult = 64;
1742*437bfbebSnyanmisaka         regs->swreg29.sw_cr_offset = 0;
1743*437bfbebSnyanmisaka     }
1744*437bfbebSnyanmisaka     regs->swreg7.sw_overlap_flag = dxva->film_grain.overlap_flag;
1745*437bfbebSnyanmisaka     regs->swreg7.sw_clip_to_restricted_range = dxva->film_grain.clip_to_restricted_range;
1746*437bfbebSnyanmisaka     regs->swreg7.sw_chroma_scaling_from_luma = dxva->film_grain.chroma_scaling_from_luma;
1747*437bfbebSnyanmisaka     regs->swreg7.sw_random_seed = dxva->film_grain.grain_seed;
1748*437bfbebSnyanmisaka 
1749*437bfbebSnyanmisaka     init_scaling_function(dxva->film_grain.scaling_points_y, dxva->film_grain.num_y_points,
1750*437bfbebSnyanmisaka                           ctx->fgsmem.scaling_lut_y);
1751*437bfbebSnyanmisaka 
1752*437bfbebSnyanmisaka     if (dxva->film_grain.chroma_scaling_from_luma) {
1753*437bfbebSnyanmisaka         memcpy(ctx->fgsmem.scaling_lut_cb, ctx->fgsmem.scaling_lut_y,
1754*437bfbebSnyanmisaka                sizeof(*ctx->fgsmem.scaling_lut_y) * 256);
1755*437bfbebSnyanmisaka         memcpy(ctx->fgsmem.scaling_lut_cr, ctx->fgsmem.scaling_lut_y,
1756*437bfbebSnyanmisaka                sizeof(*ctx->fgsmem.scaling_lut_y) * 256);
1757*437bfbebSnyanmisaka     } else {
1758*437bfbebSnyanmisaka         init_scaling_function(dxva->film_grain.scaling_points_cb,
1759*437bfbebSnyanmisaka                               dxva->film_grain.num_cb_points, ctx->fgsmem.scaling_lut_cb);
1760*437bfbebSnyanmisaka         init_scaling_function(dxva->film_grain.scaling_points_cr,
1761*437bfbebSnyanmisaka                               dxva->film_grain.num_cr_points, ctx->fgsmem.scaling_lut_cr);
1762*437bfbebSnyanmisaka     }
1763*437bfbebSnyanmisaka 
1764*437bfbebSnyanmisaka 
1765*437bfbebSnyanmisaka     for (i = 0; i < 25; i++) {
1766*437bfbebSnyanmisaka         if (i < 24) {
1767*437bfbebSnyanmisaka             ar_coeffs_y[i] = dxva->film_grain.ar_coeffs_y[i] - 128;
1768*437bfbebSnyanmisaka         }
1769*437bfbebSnyanmisaka         ar_coeffs_cb[i] = dxva->film_grain.ar_coeffs_cb[i] - 128;
1770*437bfbebSnyanmisaka         ar_coeffs_cr[i] = dxva->film_grain.ar_coeffs_cr[i] - 128;
1771*437bfbebSnyanmisaka     }
1772*437bfbebSnyanmisaka 
1773*437bfbebSnyanmisaka     ar_coeff_lag = dxva->film_grain.ar_coeff_lag;
1774*437bfbebSnyanmisaka     ar_coeff_shift = dxva->film_grain.ar_coeff_shift_minus6 + 6;
1775*437bfbebSnyanmisaka     grain_scale_shift = dxva->film_grain.grain_scale_shift;
1776*437bfbebSnyanmisaka     bitdepth =  dxva->bitdepth;
1777*437bfbebSnyanmisaka     grain_center = 128 << (bitdepth - 8);
1778*437bfbebSnyanmisaka     grain_min = 0 - grain_center;
1779*437bfbebSnyanmisaka     grain_max = (256 << (bitdepth - 8)) - 1 - grain_center;
1780*437bfbebSnyanmisaka 
1781*437bfbebSnyanmisaka     GenerateLumaGrainBlock(luma_grain_block, bitdepth, dxva->film_grain.num_y_points,
1782*437bfbebSnyanmisaka                            grain_scale_shift, ar_coeff_lag, ar_coeffs_y,
1783*437bfbebSnyanmisaka                            ar_coeff_shift, grain_min, grain_max,
1784*437bfbebSnyanmisaka                            dxva->film_grain.grain_seed);
1785*437bfbebSnyanmisaka 
1786*437bfbebSnyanmisaka     GenerateChromaGrainBlock(
1787*437bfbebSnyanmisaka         luma_grain_block, cb_grain_block, cr_grain_block, bitdepth,
1788*437bfbebSnyanmisaka         dxva->film_grain.num_y_points, dxva->film_grain.num_cb_points,
1789*437bfbebSnyanmisaka         dxva->film_grain.num_cr_points, grain_scale_shift, ar_coeff_lag, ar_coeffs_cb,
1790*437bfbebSnyanmisaka         ar_coeffs_cr, ar_coeff_shift, grain_min, grain_max,
1791*437bfbebSnyanmisaka         dxva->film_grain.chroma_scaling_from_luma, dxva->film_grain.grain_seed);
1792*437bfbebSnyanmisaka 
1793*437bfbebSnyanmisaka     for (i = 0; i < 64; i++) {
1794*437bfbebSnyanmisaka         for (j = 0; j < 64; j++) {
1795*437bfbebSnyanmisaka             ctx->fgsmem.cropped_luma_grain_block[i * 64 + j] =
1796*437bfbebSnyanmisaka                 luma_grain_block[i + 9][j + 9];
1797*437bfbebSnyanmisaka         }
1798*437bfbebSnyanmisaka     }
1799*437bfbebSnyanmisaka 
1800*437bfbebSnyanmisaka     for (i = 0; i < 32; i++) {
1801*437bfbebSnyanmisaka         for (j = 0; j < 32; j++) {
1802*437bfbebSnyanmisaka             ctx->fgsmem.cropped_chroma_grain_block[i * 64 + 2 * j] =
1803*437bfbebSnyanmisaka                 cb_grain_block[i + 6][j + 6];
1804*437bfbebSnyanmisaka             ctx->fgsmem.cropped_chroma_grain_block[i * 64 + 2 * j + 1] =
1805*437bfbebSnyanmisaka                 cr_grain_block[i + 6][j + 6];
1806*437bfbebSnyanmisaka         }
1807*437bfbebSnyanmisaka     }
1808*437bfbebSnyanmisaka 
1809*437bfbebSnyanmisaka     memcpy(ptr, &ctx->fgsmem, sizeof(FilmGrainMemory));
1810*437bfbebSnyanmisaka     mpp_buffer_sync_end(ctx->film_grain_mem);
1811*437bfbebSnyanmisaka 
1812*437bfbebSnyanmisaka     regs->addr_cfg.swreg94.sw_filmgrain_base_msb = 0;
1813*437bfbebSnyanmisaka     regs->addr_cfg.swreg95.sw_filmgrain_base_lsb = mpp_buffer_get_fd(ctx->film_grain_mem);
1814*437bfbebSnyanmisaka 
1815*437bfbebSnyanmisaka     if (regs->swreg7.sw_apply_grain) AV1D_DBG(AV1D_DBG_LOG, "NOTICE: filmgrain enabled.\n");
1816*437bfbebSnyanmisaka }
1817*437bfbebSnyanmisaka 
vdpu_av1d_setup_tile_bufs(void * hal,DXVA_PicParams_AV1 * dxva)1818*437bfbebSnyanmisaka static MPP_RET vdpu_av1d_setup_tile_bufs(void *hal, DXVA_PicParams_AV1 *dxva)
1819*437bfbebSnyanmisaka {
1820*437bfbebSnyanmisaka     Av1dHalCtx *p_hal = (Av1dHalCtx *)hal;
1821*437bfbebSnyanmisaka     VdpuAv1dRegCtx *ctx = (VdpuAv1dRegCtx *)p_hal->reg_ctx;
1822*437bfbebSnyanmisaka     RK_U32 out_w = MPP_ALIGN(dxva->max_width * dxva->bitdepth, 16 * 8) / 8;
1823*437bfbebSnyanmisaka     RK_U32 num_sbs = (MPP_ALIGN(dxva->max_width, 64) / 64 + 1) * (MPP_ALIGN(dxva->max_height, 64) / 64  + 1);
1824*437bfbebSnyanmisaka     RK_U32 dir_mvs_size = MPP_ALIGN(num_sbs * 24 * 128 / 8, 16) * 2;
1825*437bfbebSnyanmisaka     RK_U32 out_h = MPP_ALIGN(dxva->max_height, 16);
1826*437bfbebSnyanmisaka     RK_U32 luma_size = out_w * out_h;
1827*437bfbebSnyanmisaka     RK_U32 chroma_size = luma_size >> 1;
1828*437bfbebSnyanmisaka     RK_U32 tile_out_size = luma_size + chroma_size + dir_mvs_size + 512;
1829*437bfbebSnyanmisaka 
1830*437bfbebSnyanmisaka     if (tile_out_size <= ctx->tile_out_size)
1831*437bfbebSnyanmisaka         return MPP_OK;
1832*437bfbebSnyanmisaka 
1833*437bfbebSnyanmisaka     ctx->hor_stride = out_w;
1834*437bfbebSnyanmisaka     ctx->luma_size = luma_size;
1835*437bfbebSnyanmisaka     ctx->chroma_size = chroma_size;
1836*437bfbebSnyanmisaka     ctx->tile_out_size = tile_out_size;
1837*437bfbebSnyanmisaka 
1838*437bfbebSnyanmisaka     if (ctx->tile_out_bufs) {
1839*437bfbebSnyanmisaka         hal_bufs_deinit(ctx->tile_out_bufs);
1840*437bfbebSnyanmisaka         ctx->tile_out_bufs = NULL;
1841*437bfbebSnyanmisaka     }
1842*437bfbebSnyanmisaka     hal_bufs_init(&ctx->tile_out_bufs);
1843*437bfbebSnyanmisaka     if (!ctx->tile_out_bufs) {
1844*437bfbebSnyanmisaka         mpp_err_f("tile out bufs init fail\n");
1845*437bfbebSnyanmisaka         return MPP_ERR_NOMEM;
1846*437bfbebSnyanmisaka     }
1847*437bfbebSnyanmisaka     ctx->tile_out_count = mpp_buf_slot_get_count(p_hal->slots);
1848*437bfbebSnyanmisaka     hal_bufs_setup(ctx->tile_out_bufs, ctx->tile_out_count, 1, &ctx->tile_out_size);
1849*437bfbebSnyanmisaka 
1850*437bfbebSnyanmisaka     return MPP_OK;
1851*437bfbebSnyanmisaka }
1852*437bfbebSnyanmisaka 
vdpu_av1d_gen_regs(void * hal,HalTaskInfo * task)1853*437bfbebSnyanmisaka MPP_RET vdpu_av1d_gen_regs(void *hal, HalTaskInfo *task)
1854*437bfbebSnyanmisaka {
1855*437bfbebSnyanmisaka     MPP_RET ret = MPP_ERR_UNKNOW;
1856*437bfbebSnyanmisaka     Av1dHalCtx *p_hal = (Av1dHalCtx *)hal;
1857*437bfbebSnyanmisaka     VdpuAv1dRegCtx *ctx = (VdpuAv1dRegCtx *)p_hal->reg_ctx;
1858*437bfbebSnyanmisaka     VdpuAv1dRegSet *regs;
1859*437bfbebSnyanmisaka     DXVA_PicParams_AV1 *dxva = (DXVA_PicParams_AV1*)task->dec.syntax.data;
1860*437bfbebSnyanmisaka     MppFrame mframe;
1861*437bfbebSnyanmisaka     MppBuffer buffer = NULL;
1862*437bfbebSnyanmisaka     MppBuffer streambuf = NULL;
1863*437bfbebSnyanmisaka     RK_U32 height = dxva->height;
1864*437bfbebSnyanmisaka     RK_U32 width = dxva->width;
1865*437bfbebSnyanmisaka     RK_U32 hor_stride;
1866*437bfbebSnyanmisaka     RK_U32 ver_stride;
1867*437bfbebSnyanmisaka     HalBuf *tile_out_buf;
1868*437bfbebSnyanmisaka     RK_U32 num_tile_cols = 1 << dxva->tile_cols_log2;
1869*437bfbebSnyanmisaka 
1870*437bfbebSnyanmisaka     INP_CHECK(ret, NULL == p_hal);
1871*437bfbebSnyanmisaka 
1872*437bfbebSnyanmisaka     ctx->refresh_frame_flags = dxva->refresh_frame_flags;
1873*437bfbebSnyanmisaka 
1874*437bfbebSnyanmisaka     if (task->dec.flags.parse_err ||
1875*437bfbebSnyanmisaka         task->dec.flags.ref_err) {
1876*437bfbebSnyanmisaka         mpp_err_f("parse err %d ref err %d\n",
1877*437bfbebSnyanmisaka                   task->dec.flags.parse_err, task->dec.flags.ref_err);
1878*437bfbebSnyanmisaka         goto __RETURN;
1879*437bfbebSnyanmisaka     }
1880*437bfbebSnyanmisaka 
1881*437bfbebSnyanmisaka     if (p_hal->fast_mode) {
1882*437bfbebSnyanmisaka         RK_U32 i = 0;
1883*437bfbebSnyanmisaka 
1884*437bfbebSnyanmisaka         for (i = 0; i <  MPP_ARRAY_ELEMS(ctx->reg_buf); i++) {
1885*437bfbebSnyanmisaka             if (!ctx->reg_buf[i].valid) {
1886*437bfbebSnyanmisaka                 task->dec.reg_index = i;
1887*437bfbebSnyanmisaka                 ctx->regs = ctx->reg_buf[i].regs;
1888*437bfbebSnyanmisaka                 ctx->reg_buf[i].valid = 1;
1889*437bfbebSnyanmisaka                 break;
1890*437bfbebSnyanmisaka             }
1891*437bfbebSnyanmisaka         }
1892*437bfbebSnyanmisaka     }
1893*437bfbebSnyanmisaka 
1894*437bfbebSnyanmisaka     regs = ctx->regs;
1895*437bfbebSnyanmisaka     memset(regs, 0, sizeof(*regs));
1896*437bfbebSnyanmisaka 
1897*437bfbebSnyanmisaka     vdpu_av1d_setup_tile_bufs(p_hal, dxva);
1898*437bfbebSnyanmisaka 
1899*437bfbebSnyanmisaka     if (!ctx->filter_mem || height > ctx->height || num_tile_cols > ctx->num_tile_cols) {
1900*437bfbebSnyanmisaka         if (ctx->filter_mem)
1901*437bfbebSnyanmisaka             vdpu_av1d_filtermem_release(ctx);
1902*437bfbebSnyanmisaka         ret = vdpu_av1d_filtermem_alloc(p_hal, ctx, dxva);
1903*437bfbebSnyanmisaka         if (!ret) {
1904*437bfbebSnyanmisaka             mpp_err("filt buffer get fail\n");
1905*437bfbebSnyanmisaka             vdpu_av1d_filtermem_release(ctx);
1906*437bfbebSnyanmisaka         }
1907*437bfbebSnyanmisaka     }
1908*437bfbebSnyanmisaka 
1909*437bfbebSnyanmisaka     ctx->width = width;
1910*437bfbebSnyanmisaka     ctx->height = height;
1911*437bfbebSnyanmisaka     ctx->num_tile_cols = num_tile_cols;
1912*437bfbebSnyanmisaka     mpp_buf_slot_get_prop(p_hal->slots, task->dec.output, SLOT_FRAME_PTR, &mframe);
1913*437bfbebSnyanmisaka     mpp_buf_slot_get_prop(p_hal ->slots, task->dec.output, SLOT_BUFFER, &buffer);
1914*437bfbebSnyanmisaka     mpp_buf_slot_get_prop(p_hal ->packet_slots, task->dec.input, SLOT_BUFFER, &streambuf);
1915*437bfbebSnyanmisaka     tile_out_buf = hal_bufs_get_buf(ctx->tile_out_bufs, task->dec.output);
1916*437bfbebSnyanmisaka     hor_stride = mpp_frame_get_hor_stride(mframe);
1917*437bfbebSnyanmisaka     ver_stride = mpp_frame_get_ver_stride(mframe);
1918*437bfbebSnyanmisaka 
1919*437bfbebSnyanmisaka     ctx->ver_stride = ver_stride;
1920*437bfbebSnyanmisaka 
1921*437bfbebSnyanmisaka     p_hal->strm_len = (RK_S32)mpp_packet_get_length(task->dec.input_packet);
1922*437bfbebSnyanmisaka 
1923*437bfbebSnyanmisaka     ctx->fbc_en = !!MPP_FRAME_FMT_IS_FBC(mpp_frame_get_fmt(mframe));
1924*437bfbebSnyanmisaka 
1925*437bfbebSnyanmisaka     AV1D_DBG(AV1D_DBG_LOG, "bitdepth %d fmt %d [%d : %d] wxh [%d : %d] uxv [%d : %d]\n",
1926*437bfbebSnyanmisaka              dxva->bitdepth, mpp_frame_get_fmt(mframe),
1927*437bfbebSnyanmisaka              dxva->format.subsampling_x, dxva->format.subsampling_y,
1928*437bfbebSnyanmisaka              ctx->width, ctx->height,
1929*437bfbebSnyanmisaka              ctx->hor_stride, ctx->ver_stride);
1930*437bfbebSnyanmisaka 
1931*437bfbebSnyanmisaka     regs->swreg1.sw_dec_abort_e     = 0;
1932*437bfbebSnyanmisaka     regs->swreg1.sw_dec_e           = 1;
1933*437bfbebSnyanmisaka     regs->swreg1.sw_dec_tile_int_e  = 0;
1934*437bfbebSnyanmisaka     regs->swreg2.sw_dec_clk_gate_e = 1;
1935*437bfbebSnyanmisaka 
1936*437bfbebSnyanmisaka     regs->swreg3.sw_dec_mode           = 17; // av1 mode
1937*437bfbebSnyanmisaka     regs->swreg3.sw_skip_mode          = dxva->coding.skip_mode;
1938*437bfbebSnyanmisaka     regs->swreg3.sw_dec_out_ec_byte_word = 0; // word align
1939*437bfbebSnyanmisaka     regs->swreg3.sw_write_mvs_e        = 1;
1940*437bfbebSnyanmisaka     regs->swreg3.sw_dec_out_ec_bypass  = 1;
1941*437bfbebSnyanmisaka 
1942*437bfbebSnyanmisaka     regs->swreg5.sw_tempor_mvp_e        = dxva->coding.use_ref_frame_mvs;
1943*437bfbebSnyanmisaka     regs->swreg5.sw_delta_lf_res_log    = dxva->loop_filter.delta_lf_res;
1944*437bfbebSnyanmisaka     regs->swreg5.sw_delta_lf_multi      = dxva->loop_filter.delta_lf_multi;
1945*437bfbebSnyanmisaka     regs->swreg5.sw_delta_lf_present    = dxva->loop_filter.delta_lf_present;
1946*437bfbebSnyanmisaka     regs->swreg5.sw_disable_cdf_update  = dxva->coding.disable_cdf_update;
1947*437bfbebSnyanmisaka     regs->swreg5.sw_allow_warp          = dxva->coding.warped_motion;
1948*437bfbebSnyanmisaka     regs->swreg5.sw_show_frame          = dxva->format.show_frame;
1949*437bfbebSnyanmisaka     regs->swreg5.sw_switchable_motion_mode  = dxva->coding.switchable_motion_mode;
1950*437bfbebSnyanmisaka     regs->swreg5.sw_enable_cdef         = !(dxva->cdef.bits == 0 && dxva->cdef.damping == 0 &&
1951*437bfbebSnyanmisaka                                             dxva->cdef.y_strengths[0].primary == 0 &&
1952*437bfbebSnyanmisaka                                             dxva->cdef.y_strengths[0].secondary == 0 &&
1953*437bfbebSnyanmisaka                                             dxva->cdef.uv_strengths[0].primary == 0 &&
1954*437bfbebSnyanmisaka                                             dxva->cdef.uv_strengths[0].secondary == 0);
1955*437bfbebSnyanmisaka     regs->swreg5.sw_allow_masked_compound   = dxva->coding.masked_compound;
1956*437bfbebSnyanmisaka     regs->swreg5.sw_allow_interintra    = dxva->coding.interintra_compound;
1957*437bfbebSnyanmisaka     regs->swreg5.sw_enable_intra_edge_filter = dxva->coding.intra_edge_filter;
1958*437bfbebSnyanmisaka     regs->swreg5.sw_allow_filter_intra  = dxva->coding.filter_intra;
1959*437bfbebSnyanmisaka     regs->swreg5.sw_enable_jnt_comp     = dxva->coding.jnt_comp;
1960*437bfbebSnyanmisaka     regs->swreg5.sw_enable_dual_filter  = dxva->coding.dual_filter;
1961*437bfbebSnyanmisaka     regs->swreg5.sw_reduced_tx_set_used = dxva->coding.reduced_tx_set;
1962*437bfbebSnyanmisaka     regs->swreg5.sw_allow_screen_content_tools = dxva->coding.screen_content_tools;
1963*437bfbebSnyanmisaka     regs->swreg5.sw_allow_intrabc       = dxva->coding.intrabc;
1964*437bfbebSnyanmisaka 
1965*437bfbebSnyanmisaka     regs->swreg5.sw_force_interger_mv   = dxva->coding.integer_mv;
1966*437bfbebSnyanmisaka 
1967*437bfbebSnyanmisaka     vdpu_av1d_set_global_model(p_hal, dxva);
1968*437bfbebSnyanmisaka     vdpu_av1d_set_tile_info_mem(p_hal, dxva);
1969*437bfbebSnyanmisaka 
1970*437bfbebSnyanmisaka     if ((dxva->format.frame_type && (dxva->format.frame_type != AV1_FRAME_INTRA_ONLY))
1971*437bfbebSnyanmisaka         || dxva->coding.intrabc) {
1972*437bfbebSnyanmisaka         vdpu_av1d_set_reference_frames(p_hal, ctx, dxva);
1973*437bfbebSnyanmisaka     }
1974*437bfbebSnyanmisaka     vdpu_av1d_set_segmentation(ctx, dxva);
1975*437bfbebSnyanmisaka     vdpu_av1d_set_loopfilter(p_hal, dxva);
1976*437bfbebSnyanmisaka     vdpu_av1d_set_picture_dimensions(p_hal, dxva);
1977*437bfbebSnyanmisaka     vdpu_av1d_set_cdef(p_hal, dxva);
1978*437bfbebSnyanmisaka     vdpu_av1d_set_lr(p_hal, dxva);
1979*437bfbebSnyanmisaka     vdpu_av1d_set_fgs(ctx, dxva);
1980*437bfbebSnyanmisaka     vdpu_av1d_set_prob(p_hal, dxva);
1981*437bfbebSnyanmisaka     vdpu_av1d_set_tile_info_regs(ctx, dxva);
1982*437bfbebSnyanmisaka 
1983*437bfbebSnyanmisaka #if DUMP_AV1_DATAS/* dump buffer */
1984*437bfbebSnyanmisaka     {
1985*437bfbebSnyanmisaka         char name[128];
1986*437bfbebSnyanmisaka         char *path = "/data/video";
1987*437bfbebSnyanmisaka         static int g_frame_num = 0;
1988*437bfbebSnyanmisaka         FILE *fp;
1989*437bfbebSnyanmisaka         RK_U32 i;
1990*437bfbebSnyanmisaka         RK_U32 *data;
1991*437bfbebSnyanmisaka         RK_U32 size;
1992*437bfbebSnyanmisaka 
1993*437bfbebSnyanmisaka         data = mpp_buffer_get_ptr(ctx->global_model);
1994*437bfbebSnyanmisaka         size = MPP_ALIGN(GLOBAL_MODEL_SIZE, 2048);
1995*437bfbebSnyanmisaka         memset(name, 0, sizeof(name));
1996*437bfbebSnyanmisaka         sprintf(name, "%s/global_mode_%d.txt", path, g_frame_num);
1997*437bfbebSnyanmisaka         fp = fopen(name, "wb");
1998*437bfbebSnyanmisaka         for ( i = 0; i < size / 4; i++)
1999*437bfbebSnyanmisaka             fprintf(fp, "%08x\n", data[i]);
2000*437bfbebSnyanmisaka         fflush(fp);
2001*437bfbebSnyanmisaka         fclose(fp);
2002*437bfbebSnyanmisaka 
2003*437bfbebSnyanmisaka         data = mpp_buffer_get_ptr(ctx->tile_info);
2004*437bfbebSnyanmisaka         size = AV1_TILE_INFO_SIZE;
2005*437bfbebSnyanmisaka         memset(name, 0, sizeof(name));
2006*437bfbebSnyanmisaka         sprintf(name, "%s/tile_info_%d.txt", path, g_frame_num);
2007*437bfbebSnyanmisaka         fp = fopen(name, "wb");
2008*437bfbebSnyanmisaka         for ( i = 0; i < size / 4; i++)
2009*437bfbebSnyanmisaka             fprintf(fp, "%08x\n", data[i]);
2010*437bfbebSnyanmisaka         fflush(fp);
2011*437bfbebSnyanmisaka         fclose(fp);
2012*437bfbebSnyanmisaka 
2013*437bfbebSnyanmisaka         data = mpp_buffer_get_ptr(streambuf);
2014*437bfbebSnyanmisaka         size = MPP_ALIGN(p_hal->strm_len, 1);
2015*437bfbebSnyanmisaka         memset(name, 0, sizeof(name));
2016*437bfbebSnyanmisaka         sprintf(name, "%s/stream_%d.txt", path, g_frame_num);
2017*437bfbebSnyanmisaka         fp = fopen(name, "wb");
2018*437bfbebSnyanmisaka         fwrite((RK_U8*)data, 1, size, fp);
2019*437bfbebSnyanmisaka         fflush(fp);
2020*437bfbebSnyanmisaka         fclose(fp);
2021*437bfbebSnyanmisaka 
2022*437bfbebSnyanmisaka         data = mpp_buffer_get_ptr(ctx->film_grain_mem);
2023*437bfbebSnyanmisaka         size = MPP_ALIGN(sizeof(AV1FilmGrainMemory), 2048);
2024*437bfbebSnyanmisaka         memset(name, 0, sizeof(name));
2025*437bfbebSnyanmisaka         sprintf(name, "%s/film_grain_mem_%d.txt", path, g_frame_num);
2026*437bfbebSnyanmisaka         fp = fopen(name, "wb");
2027*437bfbebSnyanmisaka         for ( i = 0; i < size / 4; i++)
2028*437bfbebSnyanmisaka             fprintf(fp, "%08x\n", data[i]);
2029*437bfbebSnyanmisaka         fflush(fp);
2030*437bfbebSnyanmisaka         fclose(fp);
2031*437bfbebSnyanmisaka 
2032*437bfbebSnyanmisaka         data = mpp_buffer_get_ptr(ctx->prob_tbl_base);
2033*437bfbebSnyanmisaka         size = MPP_ALIGN(sizeof(AV1CDFs), 2048);
2034*437bfbebSnyanmisaka         memset(name, 0, sizeof(name));
2035*437bfbebSnyanmisaka         sprintf(name, "%s/prob_tbl_%d.txt", path, g_frame_num);
2036*437bfbebSnyanmisaka         fp = fopen(name, "wb");
2037*437bfbebSnyanmisaka         for ( i = 0; i < size / 4; i++)
2038*437bfbebSnyanmisaka             fprintf(fp, "%08x\n", data[i]);
2039*437bfbebSnyanmisaka         fflush(fp);
2040*437bfbebSnyanmisaka         fclose(fp);
2041*437bfbebSnyanmisaka 
2042*437bfbebSnyanmisaka         data = mpp_buffer_get_ptr(ctx->prob_tbl_out_base);
2043*437bfbebSnyanmisaka         size = MPP_ALIGN(sizeof(AV1CDFs), 2048);
2044*437bfbebSnyanmisaka         memset(name, 0, sizeof(name));
2045*437bfbebSnyanmisaka         sprintf(name, "%s/prob_tbl_out_%d.txt", path, g_frame_num);
2046*437bfbebSnyanmisaka         fp = fopen(name, "wb");
2047*437bfbebSnyanmisaka         for ( i = 0; i < size / 4; i++)
2048*437bfbebSnyanmisaka             fprintf(fp, "%08x\n", data[i]);
2049*437bfbebSnyanmisaka         fflush(fp);
2050*437bfbebSnyanmisaka         fclose(fp);
2051*437bfbebSnyanmisaka 
2052*437bfbebSnyanmisaka         g_frame_num ++;
2053*437bfbebSnyanmisaka     }
2054*437bfbebSnyanmisaka #endif
2055*437bfbebSnyanmisaka 
2056*437bfbebSnyanmisaka     regs->swreg7.sw_blackwhite_e    = dxva->format.mono_chrome;
2057*437bfbebSnyanmisaka     regs->swreg7.sw_clip_to_restricted_range  = dxva->film_grain.clip_to_restricted_range;
2058*437bfbebSnyanmisaka     regs->swreg7.sw_delta_q_res_log     = dxva->quantization.delta_q_res;
2059*437bfbebSnyanmisaka     regs->swreg7.sw_delta_q_present     = dxva->quantization.delta_q_present;
2060*437bfbebSnyanmisaka 
2061*437bfbebSnyanmisaka     regs->swreg8.sw_idr_pic_e           = dxva->format.frame_type == AV1_FRAME_KEY ||
2062*437bfbebSnyanmisaka                                           dxva->format.frame_type == AV1_FRAME_INTRA_ONLY;
2063*437bfbebSnyanmisaka     regs->swreg8.sw_quant_base_qindex   = dxva->quantization.base_qindex;
2064*437bfbebSnyanmisaka     regs->swreg8.sw_bit_depth_y_minus8  = dxva->bitdepth - 8;
2065*437bfbebSnyanmisaka     regs->swreg8.sw_bit_depth_c_minus8  = dxva->bitdepth - 8;
2066*437bfbebSnyanmisaka 
2067*437bfbebSnyanmisaka     regs->swreg11.sw_mcomp_filt_type    = dxva->interp_filter;
2068*437bfbebSnyanmisaka     regs->swreg11.sw_high_prec_mv_e     = dxva->coding.high_precision_mv;
2069*437bfbebSnyanmisaka     regs->swreg11.sw_comp_pred_mode     = dxva->coding.reference_mode ? 2 : 0;
2070*437bfbebSnyanmisaka     regs->swreg11.sw_transform_mode     = dxva->coding.tx_mode ? (dxva->coding.tx_mode + 2) : 0;
2071*437bfbebSnyanmisaka     regs->swreg12.sw_max_cb_size        = dxva->coding.use_128x128_superblock ? 7 : 6;;
2072*437bfbebSnyanmisaka     regs->swreg12.sw_min_cb_size        = 3;
2073*437bfbebSnyanmisaka 
2074*437bfbebSnyanmisaka     /* unused in comdel */
2075*437bfbebSnyanmisaka     regs->swreg12.sw_av1_comp_pred_fixed_ref    = 0;
2076*437bfbebSnyanmisaka     regs->swreg13.sw_comp_pred_var_ref0_av1     = 0;
2077*437bfbebSnyanmisaka     regs->swreg13.sw_comp_pred_var_ref1_av1     = 0;
2078*437bfbebSnyanmisaka     regs->swreg14.sw_filt_level_seg0            = 0;
2079*437bfbebSnyanmisaka     regs->swreg15.sw_filt_level_seg1            = 0;
2080*437bfbebSnyanmisaka     regs->swreg16.sw_filt_level_seg2            = 0;
2081*437bfbebSnyanmisaka     regs->swreg17.sw_filt_level_seg3            = 0;
2082*437bfbebSnyanmisaka     regs->swreg18.sw_filt_level_seg4            = 0;
2083*437bfbebSnyanmisaka     regs->swreg19.sw_filt_level_seg5            = 0;
2084*437bfbebSnyanmisaka     regs->swreg31.sw_filt_level_seg6            = 0;
2085*437bfbebSnyanmisaka     regs->swreg32.sw_filt_level_seg7            = 0;
2086*437bfbebSnyanmisaka 
2087*437bfbebSnyanmisaka 
2088*437bfbebSnyanmisaka     regs->swreg13.sw_qp_delta_y_dc_av1          = dxva->quantization.y_dc_delta_q;
2089*437bfbebSnyanmisaka     regs->swreg13.sw_qp_delta_ch_dc_av1         = dxva->quantization.u_dc_delta_q;
2090*437bfbebSnyanmisaka     regs->swreg13.sw_qp_delta_ch_ac_av1         = dxva->quantization.u_ac_delta_q;
2091*437bfbebSnyanmisaka     regs->swreg47.sw_qmlevel_y                  = dxva->quantization.qm_y;
2092*437bfbebSnyanmisaka     regs->swreg48.sw_qmlevel_u                  = dxva->quantization.qm_u;
2093*437bfbebSnyanmisaka     regs->swreg49.sw_qmlevel_v                  = dxva->quantization.qm_v;
2094*437bfbebSnyanmisaka 
2095*437bfbebSnyanmisaka     regs->swreg13.sw_lossless_e                 = dxva->coded_lossless;
2096*437bfbebSnyanmisaka     regs->swreg28.sw_quant_delta_v_dc           = dxva->quantization.v_dc_delta_q;
2097*437bfbebSnyanmisaka     regs->swreg29.sw_quant_delta_v_ac           = dxva->quantization.v_ac_delta_q;
2098*437bfbebSnyanmisaka 
2099*437bfbebSnyanmisaka     regs->swreg31.sw_skip_ref0              = dxva->skip_ref0 ? dxva->skip_ref0 : 1;
2100*437bfbebSnyanmisaka     regs->swreg32.sw_skip_ref1              = dxva->skip_ref1 ? dxva->skip_ref1 : 1;
2101*437bfbebSnyanmisaka 
2102*437bfbebSnyanmisaka     /*input out put buf cfg*/
2103*437bfbebSnyanmisaka     {
2104*437bfbebSnyanmisaka         // RK_U32 out_w = MPP_ALIGN(4 * width * bit_depth, 128) / 8;
2105*437bfbebSnyanmisaka         // RK_U32 out_h = height / 4;
2106*437bfbebSnyanmisaka         // RK_U32 y_stride = out_w * out_h;
2107*437bfbebSnyanmisaka         // RK_U32 uv_stride = y_stride / 2;
2108*437bfbebSnyanmisaka 
2109*437bfbebSnyanmisaka         RK_U32 y_stride = ctx->luma_size;
2110*437bfbebSnyanmisaka         RK_U32 uv_stride = y_stride / 2;
2111*437bfbebSnyanmisaka         RK_U32 mv_offset = y_stride + uv_stride + 64;
2112*437bfbebSnyanmisaka         RK_U32 offset = (dxva->frame_tag_size & (~0xf));
2113*437bfbebSnyanmisaka 
2114*437bfbebSnyanmisaka         regs->addr_cfg.swreg65.sw_dec_out_ybase_lsb = mpp_buffer_get_fd(tile_out_buf->buf[0]);//mpp_buffer_get_fd(buffer);
2115*437bfbebSnyanmisaka         regs->addr_cfg.swreg99.sw_dec_out_cbase_lsb = mpp_buffer_get_fd(tile_out_buf->buf[0]);
2116*437bfbebSnyanmisaka         mpp_dev_set_reg_offset(p_hal->dev, 99, y_stride);
2117*437bfbebSnyanmisaka         regs->addr_cfg.swreg133.sw_dec_out_dbase_lsb = mpp_buffer_get_fd(tile_out_buf->buf[0]);
2118*437bfbebSnyanmisaka         mpp_dev_set_reg_offset(p_hal->dev, 133, mv_offset);
2119*437bfbebSnyanmisaka 
2120*437bfbebSnyanmisaka         /*  if (ctx->fbc_en) {
2121*437bfbebSnyanmisaka               regs->swreg190.sw_dec_out_tybase_lsb = 0;// TODO:
2122*437bfbebSnyanmisaka               regs->swreg224.sw_dec_out_tcbase_lsb = 0;// TODO:
2123*437bfbebSnyanmisaka           }*/
2124*437bfbebSnyanmisaka 
2125*437bfbebSnyanmisaka         regs->swreg258.sw_strm_buffer_len = MPP_ALIGN(p_hal->strm_len, 128);//
2126*437bfbebSnyanmisaka         regs->swreg5.sw_strm_start_bit    =  (dxva->frame_tag_size & 0xf) * 8; // bit start to decode
2127*437bfbebSnyanmisaka         regs->swreg6.sw_stream_len  = MPP_ALIGN(p_hal->strm_len, 128);//p_hal->strm_len - offset;
2128*437bfbebSnyanmisaka         regs->swreg259.sw_strm_start_offset = 0;
2129*437bfbebSnyanmisaka         regs->addr_cfg.swreg168.sw_stream_base_msb = 0;
2130*437bfbebSnyanmisaka         regs->addr_cfg.swreg169.sw_stream_base_lsb = mpp_buffer_get_fd(streambuf);
2131*437bfbebSnyanmisaka         mpp_dev_set_reg_offset(p_hal->dev, 169, offset);
2132*437bfbebSnyanmisaka 
2133*437bfbebSnyanmisaka         AV1D_DBG(AV1D_DBG_LOG, "stream len %d\n", p_hal->strm_len);
2134*437bfbebSnyanmisaka         AV1D_DBG(AV1D_DBG_LOG, "stream offset %d\n", offset);
2135*437bfbebSnyanmisaka         AV1D_DBG(AV1D_DBG_LOG, "stream tag_size %d\n", dxva->frame_tag_size);
2136*437bfbebSnyanmisaka         AV1D_DBG(AV1D_DBG_LOG, "stream start_bit %d\n", regs->swreg5.sw_strm_start_bit);
2137*437bfbebSnyanmisaka     }
2138*437bfbebSnyanmisaka     regs->swreg314.sw_dec_alignment = 64;
2139*437bfbebSnyanmisaka 
2140*437bfbebSnyanmisaka     regs->addr_cfg.swreg175.sw_mc_sync_curr_base_lsb = mpp_buffer_get_fd(ctx->tile_buf);
2141*437bfbebSnyanmisaka     regs->addr_cfg.swreg177.sw_mc_sync_left_base_lsb = mpp_buffer_get_fd(ctx->tile_buf);
2142*437bfbebSnyanmisaka 
2143*437bfbebSnyanmisaka     regs->swreg55.sw_apf_disable = 0;
2144*437bfbebSnyanmisaka     regs->swreg55.sw_apf_threshold = 8;
2145*437bfbebSnyanmisaka     regs->swreg58.sw_dec_buswidth = 2;
2146*437bfbebSnyanmisaka     regs->swreg58.sw_dec_max_burst = 16;
2147*437bfbebSnyanmisaka     regs->swreg266.sw_error_conceal_e                     = 0;
2148*437bfbebSnyanmisaka     regs->swreg265.sw_axi_rd_ostd_threshold               = 64;
2149*437bfbebSnyanmisaka     regs->swreg265.sw_axi_wr_ostd_threshold               = 64;
2150*437bfbebSnyanmisaka 
2151*437bfbebSnyanmisaka     regs->swreg318.sw_ext_timeout_cycles                  = 0xfffffff;
2152*437bfbebSnyanmisaka     regs->swreg318.sw_ext_timeout_override_e              = 1;
2153*437bfbebSnyanmisaka     regs->swreg319.sw_timeout_cycles                      = 0xfffffff;
2154*437bfbebSnyanmisaka     regs->swreg319.sw_timeout_override_e                  = 1;
2155*437bfbebSnyanmisaka 
2156*437bfbebSnyanmisaka     /* pp cfg */
2157*437bfbebSnyanmisaka     regs->vdpu_av1d_pp_cfg.swreg320.sw_pp_out_e = 1;
2158*437bfbebSnyanmisaka     regs->vdpu_av1d_pp_cfg.swreg322.sw_pp_in_format = 0;
2159*437bfbebSnyanmisaka     regs->vdpu_av1d_pp_cfg.swreg394.sw_pp0_dup_hor = 1;
2160*437bfbebSnyanmisaka     regs->vdpu_av1d_pp_cfg.swreg394.sw_pp0_dup_ver = 1;
2161*437bfbebSnyanmisaka     regs->vdpu_av1d_pp_cfg.swreg331.sw_pp_in_height = height / 2;
2162*437bfbebSnyanmisaka     regs->vdpu_av1d_pp_cfg.swreg331.sw_pp_in_width = width / 2;
2163*437bfbebSnyanmisaka     regs->vdpu_av1d_pp_cfg.swreg332.sw_pp_out_height = height;
2164*437bfbebSnyanmisaka     regs->vdpu_av1d_pp_cfg.swreg332.sw_pp_out_width = width;
2165*437bfbebSnyanmisaka     regs->vdpu_av1d_pp_cfg.swreg329.sw_pp_out_y_stride = hor_stride;
2166*437bfbebSnyanmisaka     regs->vdpu_av1d_pp_cfg.swreg329.sw_pp_out_c_stride = hor_stride;
2167*437bfbebSnyanmisaka 
2168*437bfbebSnyanmisaka     // regs->vdpu_av1d_pp_cfg.swreg337.sw_pp_in_y_stride = hor_stride;
2169*437bfbebSnyanmisaka     // regs->vdpu_av1d_pp_cfg.swreg337.sw_pp_in_c_stride = hor_stride;
2170*437bfbebSnyanmisaka     if (ctx->fbc_en) {
2171*437bfbebSnyanmisaka         RK_U32 vir_left = 0, vir_right = 0, vir_top = 0, vir_bottom = 0;
2172*437bfbebSnyanmisaka         RK_U32 bypass_filter = !regs->swreg5.sw_superres_is_scaled &&
2173*437bfbebSnyanmisaka                                !regs->swreg5.sw_enable_cdef &&
2174*437bfbebSnyanmisaka                                !regs->swreg14.sw_filt_level0 &&
2175*437bfbebSnyanmisaka                                !regs->swreg15.sw_filt_level1 &&
2176*437bfbebSnyanmisaka                                !regs->swreg18.sw_lr_type;
2177*437bfbebSnyanmisaka 
2178*437bfbebSnyanmisaka         regs->vdpu_av1d_pp_cfg.swreg329.sw_pp_out_y_stride = dxva->bitdepth > 8 ?
2179*437bfbebSnyanmisaka                                                              width * 2 : width;
2180*437bfbebSnyanmisaka         regs->vdpu_av1d_pp_cfg.swreg329.sw_pp_out_c_stride = dxva->bitdepth > 8 ?
2181*437bfbebSnyanmisaka                                                              width * 2 : width;
2182*437bfbebSnyanmisaka         regs->swreg58.sw_dec_axi_wd_id_e = 1;
2183*437bfbebSnyanmisaka         regs->swreg58.sw_dec_axi_rd_id_e = 1;
2184*437bfbebSnyanmisaka         regs->vdpu_av1d_pp_cfg.swreg320.sw_pp_out_tile_e = 1;
2185*437bfbebSnyanmisaka         regs->vdpu_av1d_pp_cfg.swreg321.sw_pp_tile_size = 2;
2186*437bfbebSnyanmisaka 
2187*437bfbebSnyanmisaka         vir_left = 0;
2188*437bfbebSnyanmisaka         if (((vir_left + width) % 16))
2189*437bfbebSnyanmisaka             vir_right = 16 - ((vir_left + width) % 16);
2190*437bfbebSnyanmisaka         else
2191*437bfbebSnyanmisaka             vir_right = 0;
2192*437bfbebSnyanmisaka 
2193*437bfbebSnyanmisaka         if (!bypass_filter)
2194*437bfbebSnyanmisaka             vir_top = 8;
2195*437bfbebSnyanmisaka         else
2196*437bfbebSnyanmisaka             vir_top = 0;
2197*437bfbebSnyanmisaka 
2198*437bfbebSnyanmisaka         if (((vir_top + height) % 16))
2199*437bfbebSnyanmisaka             vir_bottom = 16 - ((vir_top + height) % 16);
2200*437bfbebSnyanmisaka         else
2201*437bfbebSnyanmisaka             vir_bottom = 0;
2202*437bfbebSnyanmisaka 
2203*437bfbebSnyanmisaka         regs->vdpu_av1d_pp_cfg.swreg503.sw_pp0_virtual_top = vir_top;
2204*437bfbebSnyanmisaka         regs->vdpu_av1d_pp_cfg.swreg503.sw_pp0_virtual_left = vir_left;
2205*437bfbebSnyanmisaka         regs->vdpu_av1d_pp_cfg.swreg503.sw_pp0_virtual_bottom = vir_bottom;
2206*437bfbebSnyanmisaka         regs->vdpu_av1d_pp_cfg.swreg503.sw_pp0_virtual_right = vir_right;
2207*437bfbebSnyanmisaka         mpp_frame_set_offset_y(mframe, vir_top);
2208*437bfbebSnyanmisaka         mpp_frame_set_ver_stride(mframe, vir_top + height + vir_bottom);
2209*437bfbebSnyanmisaka         regs->vdpu_av1d_pp_cfg.swreg322.sw_pp_out_format = 0;
2210*437bfbebSnyanmisaka         regs->vdpu_av1d_pp_cfg.swreg326.sw_pp_out_lu_base_lsb = mpp_buffer_get_fd(buffer);
2211*437bfbebSnyanmisaka         regs->vdpu_av1d_pp_cfg.swreg328.sw_pp_out_ch_base_lsb = mpp_buffer_get_fd(buffer);
2212*437bfbebSnyanmisaka         regs->vdpu_av1d_pp_cfg.swreg505.sw_pp0_afbc_tile_base_lsb = mpp_buffer_get_fd(buffer);
2213*437bfbebSnyanmisaka     } else {
2214*437bfbebSnyanmisaka         RK_U32 out_w = hor_stride;
2215*437bfbebSnyanmisaka         RK_U32 out_h = ver_stride;
2216*437bfbebSnyanmisaka         RK_U32 y_stride = out_w * out_h;
2217*437bfbebSnyanmisaka         RK_U32 out_fmt = 0;
2218*437bfbebSnyanmisaka 
2219*437bfbebSnyanmisaka         if ((mpp_frame_get_fmt(mframe) & MPP_FRAME_FMT_MASK) == MPP_FMT_YUV420SP)
2220*437bfbebSnyanmisaka             out_fmt = 3;
2221*437bfbebSnyanmisaka 
2222*437bfbebSnyanmisaka         /*
2223*437bfbebSnyanmisaka          * out_fmt:
2224*437bfbebSnyanmisaka          * 0 is 8bit or 10bit output by syntax
2225*437bfbebSnyanmisaka          * 3 is force 8bit output
2226*437bfbebSnyanmisaka          */
2227*437bfbebSnyanmisaka         regs->vdpu_av1d_pp_cfg.swreg322.sw_pp_out_format = out_fmt;
2228*437bfbebSnyanmisaka         regs->vdpu_av1d_pp_cfg.swreg326.sw_pp_out_lu_base_lsb = mpp_buffer_get_fd(buffer);
2229*437bfbebSnyanmisaka         regs->vdpu_av1d_pp_cfg.swreg328.sw_pp_out_ch_base_lsb = mpp_buffer_get_fd(buffer);
2230*437bfbebSnyanmisaka         mpp_dev_set_reg_offset(p_hal->dev, 328, y_stride);
2231*437bfbebSnyanmisaka     }
2232*437bfbebSnyanmisaka 
2233*437bfbebSnyanmisaka __RETURN:
2234*437bfbebSnyanmisaka     return ret = MPP_OK;
2235*437bfbebSnyanmisaka }
2236*437bfbebSnyanmisaka 
vdpu_av1d_start(void * hal,HalTaskInfo * task)2237*437bfbebSnyanmisaka MPP_RET vdpu_av1d_start(void *hal, HalTaskInfo *task)
2238*437bfbebSnyanmisaka {
2239*437bfbebSnyanmisaka     MPP_RET ret = MPP_ERR_UNKNOW;
2240*437bfbebSnyanmisaka     Av1dHalCtx *p_hal = (Av1dHalCtx *)hal;
2241*437bfbebSnyanmisaka     INP_CHECK(ret, NULL == p_hal);
2242*437bfbebSnyanmisaka     if (task->dec.flags.parse_err ||
2243*437bfbebSnyanmisaka         task->dec.flags.ref_err) {
2244*437bfbebSnyanmisaka         goto __RETURN;
2245*437bfbebSnyanmisaka     }
2246*437bfbebSnyanmisaka 
2247*437bfbebSnyanmisaka     VdpuAv1dRegCtx *reg_ctx = (VdpuAv1dRegCtx *)p_hal->reg_ctx;
2248*437bfbebSnyanmisaka     VdpuAv1dRegSet *regs = p_hal->fast_mode ?
2249*437bfbebSnyanmisaka                            reg_ctx->reg_buf[task->dec.reg_index].regs :
2250*437bfbebSnyanmisaka                            reg_ctx->regs;
2251*437bfbebSnyanmisaka     MppDev dev = p_hal->dev;
2252*437bfbebSnyanmisaka #if DUMP_AV1_DATAS
2253*437bfbebSnyanmisaka     {
2254*437bfbebSnyanmisaka         RK_U32 i = 0;
2255*437bfbebSnyanmisaka         RK_U32 *p = (RK_U32*)regs;
2256*437bfbebSnyanmisaka         char fname[128];
2257*437bfbebSnyanmisaka         FILE *fp_in = NULL;
2258*437bfbebSnyanmisaka         static RK_U32 g_frame_no = 0;
2259*437bfbebSnyanmisaka 
2260*437bfbebSnyanmisaka         sprintf(fname, "/data/video/reg_%d_in.txt", g_frame_no++);
2261*437bfbebSnyanmisaka         fp_in = fopen(fname, "wb");
2262*437bfbebSnyanmisaka         for (i = 0; i < sizeof(*regs) / 4; i++, p++)
2263*437bfbebSnyanmisaka             fprintf(fp_in, "reg[%3d] = %08x\n", i, *p);
2264*437bfbebSnyanmisaka 
2265*437bfbebSnyanmisaka         fflush(fp_in);
2266*437bfbebSnyanmisaka         fclose(fp_in);
2267*437bfbebSnyanmisaka     }
2268*437bfbebSnyanmisaka #endif
2269*437bfbebSnyanmisaka     do {
2270*437bfbebSnyanmisaka         MppDevRegWrCfg wr_cfg;
2271*437bfbebSnyanmisaka         MppDevRegRdCfg rd_cfg;
2272*437bfbebSnyanmisaka 
2273*437bfbebSnyanmisaka         wr_cfg.reg = regs;
2274*437bfbebSnyanmisaka         wr_cfg.size = sizeof(*regs);
2275*437bfbebSnyanmisaka         wr_cfg.offset = 0;
2276*437bfbebSnyanmisaka         ret = mpp_dev_ioctl(dev, MPP_DEV_REG_WR, &wr_cfg);
2277*437bfbebSnyanmisaka         if (ret) {
2278*437bfbebSnyanmisaka             mpp_err_f("set register write failed %d\n", ret);
2279*437bfbebSnyanmisaka             break;
2280*437bfbebSnyanmisaka         }
2281*437bfbebSnyanmisaka 
2282*437bfbebSnyanmisaka         rd_cfg.reg      = regs;
2283*437bfbebSnyanmisaka         rd_cfg.size     = sizeof(*regs);
2284*437bfbebSnyanmisaka         rd_cfg.offset   = 0;
2285*437bfbebSnyanmisaka 
2286*437bfbebSnyanmisaka         ret = mpp_dev_ioctl(dev, MPP_DEV_REG_RD, &rd_cfg);
2287*437bfbebSnyanmisaka         if (ret) {
2288*437bfbebSnyanmisaka             mpp_err_f("set register read failed %d\n", ret);
2289*437bfbebSnyanmisaka             break;
2290*437bfbebSnyanmisaka         }
2291*437bfbebSnyanmisaka         /* send request to hardware */
2292*437bfbebSnyanmisaka         ret = mpp_dev_ioctl(dev, MPP_DEV_CMD_SEND, NULL);
2293*437bfbebSnyanmisaka         if (ret) {
2294*437bfbebSnyanmisaka             mpp_err_f("send cmd failed %d\n", ret);
2295*437bfbebSnyanmisaka             break;
2296*437bfbebSnyanmisaka         }
2297*437bfbebSnyanmisaka     } while (0);
2298*437bfbebSnyanmisaka 
2299*437bfbebSnyanmisaka __RETURN:
2300*437bfbebSnyanmisaka     return ret = MPP_OK;
2301*437bfbebSnyanmisaka }
2302*437bfbebSnyanmisaka 
vdpu_av1d_wait(void * hal,HalTaskInfo * task)2303*437bfbebSnyanmisaka MPP_RET vdpu_av1d_wait(void *hal, HalTaskInfo *task)
2304*437bfbebSnyanmisaka {
2305*437bfbebSnyanmisaka     MPP_RET ret = MPP_ERR_UNKNOW;
2306*437bfbebSnyanmisaka     Av1dHalCtx *p_hal = (Av1dHalCtx *)hal;
2307*437bfbebSnyanmisaka 
2308*437bfbebSnyanmisaka     INP_CHECK(ret, NULL == p_hal);
2309*437bfbebSnyanmisaka     VdpuAv1dRegCtx *reg_ctx = (VdpuAv1dRegCtx *)p_hal->reg_ctx;
2310*437bfbebSnyanmisaka     VdpuAv1dRegSet *p_regs = p_hal->fast_mode ?
2311*437bfbebSnyanmisaka                              reg_ctx->reg_buf[task->dec.reg_index].regs :
2312*437bfbebSnyanmisaka                              reg_ctx->regs;
2313*437bfbebSnyanmisaka 
2314*437bfbebSnyanmisaka     if (task->dec.flags.parse_err ||
2315*437bfbebSnyanmisaka         task->dec.flags.ref_err) {
2316*437bfbebSnyanmisaka         goto __SKIP_HARD;
2317*437bfbebSnyanmisaka     }
2318*437bfbebSnyanmisaka 
2319*437bfbebSnyanmisaka     ret = mpp_dev_ioctl(p_hal->dev, MPP_DEV_CMD_POLL, NULL);
2320*437bfbebSnyanmisaka     if (ret)
2321*437bfbebSnyanmisaka         mpp_err_f("poll cmd failed %d\n", ret);
2322*437bfbebSnyanmisaka #if DUMP_AV1_DATAS
2323*437bfbebSnyanmisaka     {
2324*437bfbebSnyanmisaka         char fname[128];
2325*437bfbebSnyanmisaka         FILE *fp_in = NULL;
2326*437bfbebSnyanmisaka         static RK_U32 g_frame_no = 0;
2327*437bfbebSnyanmisaka         RK_U32 *p = (RK_U32*)p_regs;
2328*437bfbebSnyanmisaka         RK_U32 i;
2329*437bfbebSnyanmisaka 
2330*437bfbebSnyanmisaka         sprintf(fname, "/data/video/reg_%d_out.txt", g_frame_no++);
2331*437bfbebSnyanmisaka         fp_in = fopen(fname, "wb");
2332*437bfbebSnyanmisaka         for (i = 0; i < sizeof(*p_regs) / 4; i++, p++)
2333*437bfbebSnyanmisaka             fprintf(fp_in, "reg[%3d] = %08x\n", i, *p);
2334*437bfbebSnyanmisaka 
2335*437bfbebSnyanmisaka         fflush(fp_in);
2336*437bfbebSnyanmisaka         fclose(fp_in);
2337*437bfbebSnyanmisaka     }
2338*437bfbebSnyanmisaka #endif
2339*437bfbebSnyanmisaka 
2340*437bfbebSnyanmisaka __SKIP_HARD:
2341*437bfbebSnyanmisaka     if (p_hal->dec_cb) {
2342*437bfbebSnyanmisaka         DecCbHalDone m_ctx;
2343*437bfbebSnyanmisaka         RK_U32 *prob_out = (RK_U32*)mpp_buffer_get_ptr(reg_ctx->prob_tbl_out_base);
2344*437bfbebSnyanmisaka 
2345*437bfbebSnyanmisaka         mpp_buffer_sync_ro_begin(reg_ctx->prob_tbl_out_base);
2346*437bfbebSnyanmisaka         m_ctx.task = mpp_buffer_get_ptr(reg_ctx->prob_tbl_out_base);//(void *)&task->dec;
2347*437bfbebSnyanmisaka         m_ctx.regs = (RK_U32 *)prob_out;
2348*437bfbebSnyanmisaka         if (!p_regs->swreg1.sw_dec_rdy_int/* decode err */)
2349*437bfbebSnyanmisaka             m_ctx.hard_err = 1;
2350*437bfbebSnyanmisaka         else
2351*437bfbebSnyanmisaka             m_ctx.hard_err = 0;
2352*437bfbebSnyanmisaka 
2353*437bfbebSnyanmisaka         mpp_callback(p_hal->dec_cb, &m_ctx);
2354*437bfbebSnyanmisaka     }
2355*437bfbebSnyanmisaka     if (p_hal->fast_mode)
2356*437bfbebSnyanmisaka         reg_ctx->reg_buf[task->dec.reg_index].valid = 0;
2357*437bfbebSnyanmisaka 
2358*437bfbebSnyanmisaka     (void)task;
2359*437bfbebSnyanmisaka __RETURN:
2360*437bfbebSnyanmisaka     return ret = MPP_OK;
2361*437bfbebSnyanmisaka }
2362*437bfbebSnyanmisaka 
vdpu_av1d_reset(void * hal)2363*437bfbebSnyanmisaka MPP_RET vdpu_av1d_reset(void *hal)
2364*437bfbebSnyanmisaka {
2365*437bfbebSnyanmisaka     MPP_RET ret = MPP_ERR_UNKNOW;
2366*437bfbebSnyanmisaka     Av1dHalCtx *p_hal = (Av1dHalCtx *)hal;
2367*437bfbebSnyanmisaka 
2368*437bfbebSnyanmisaka     INP_CHECK(ret, NULL == p_hal);
2369*437bfbebSnyanmisaka 
2370*437bfbebSnyanmisaka 
2371*437bfbebSnyanmisaka __RETURN:
2372*437bfbebSnyanmisaka     return ret = MPP_OK;
2373*437bfbebSnyanmisaka }
2374*437bfbebSnyanmisaka 
vdpu_av1d_flush(void * hal)2375*437bfbebSnyanmisaka MPP_RET vdpu_av1d_flush(void *hal)
2376*437bfbebSnyanmisaka {
2377*437bfbebSnyanmisaka     MPP_RET ret = MPP_ERR_UNKNOW;
2378*437bfbebSnyanmisaka     Av1dHalCtx *p_hal = (Av1dHalCtx *)hal;
2379*437bfbebSnyanmisaka 
2380*437bfbebSnyanmisaka     INP_CHECK(ret, NULL == p_hal);
2381*437bfbebSnyanmisaka 
2382*437bfbebSnyanmisaka __RETURN:
2383*437bfbebSnyanmisaka     return ret = MPP_OK;
2384*437bfbebSnyanmisaka }
2385*437bfbebSnyanmisaka 
vdpu_av1d_control(void * hal,MpiCmd cmd_type,void * param)2386*437bfbebSnyanmisaka MPP_RET vdpu_av1d_control(void *hal, MpiCmd cmd_type, void *param)
2387*437bfbebSnyanmisaka {
2388*437bfbebSnyanmisaka     MPP_RET ret = MPP_ERR_UNKNOW;
2389*437bfbebSnyanmisaka     Av1dHalCtx *p_hal = (Av1dHalCtx *)hal;
2390*437bfbebSnyanmisaka 
2391*437bfbebSnyanmisaka     INP_CHECK(ret, NULL == p_hal);
2392*437bfbebSnyanmisaka 
2393*437bfbebSnyanmisaka     switch ((MpiCmd)cmd_type) {
2394*437bfbebSnyanmisaka     case MPP_DEC_SET_FRAME_INFO: {
2395*437bfbebSnyanmisaka         MppFrameFormat fmt = mpp_frame_get_fmt((MppFrame)param);
2396*437bfbebSnyanmisaka         RK_U32 imgwidth = mpp_frame_get_width((MppFrame)param);
2397*437bfbebSnyanmisaka         RK_U32 imgheight = mpp_frame_get_height((MppFrame)param);
2398*437bfbebSnyanmisaka 
2399*437bfbebSnyanmisaka         AV1D_DBG(AV1D_DBG_LOG, "control info: fmt %d, w %d, h %d\n", fmt, imgwidth, imgheight);
2400*437bfbebSnyanmisaka         if ((fmt & MPP_FRAME_FMT_MASK) == MPP_FMT_YUV422SP) {
2401*437bfbebSnyanmisaka             mpp_slots_set_prop(p_hal->slots, SLOTS_LEN_ALIGN, rkv_len_align_422);
2402*437bfbebSnyanmisaka         }
2403*437bfbebSnyanmisaka         break;
2404*437bfbebSnyanmisaka     }
2405*437bfbebSnyanmisaka     case MPP_DEC_SET_OUTPUT_FORMAT: {
2406*437bfbebSnyanmisaka 
2407*437bfbebSnyanmisaka     } break;
2408*437bfbebSnyanmisaka     default:
2409*437bfbebSnyanmisaka         break;
2410*437bfbebSnyanmisaka     }
2411*437bfbebSnyanmisaka 
2412*437bfbebSnyanmisaka __RETURN:
2413*437bfbebSnyanmisaka     return ret = MPP_OK;
2414*437bfbebSnyanmisaka }
2415*437bfbebSnyanmisaka 
2416*437bfbebSnyanmisaka const MppHalApi hal_av1d_vdpu = {
2417*437bfbebSnyanmisaka     .name       = "av1d_vdpu",
2418*437bfbebSnyanmisaka     .type       = MPP_CTX_DEC,
2419*437bfbebSnyanmisaka     .coding     = MPP_VIDEO_CodingAV1,
2420*437bfbebSnyanmisaka     .ctx_size   = sizeof(VdpuAv1dRegCtx),
2421*437bfbebSnyanmisaka     .flag       = 0,
2422*437bfbebSnyanmisaka     .init       = vdpu_av1d_init,
2423*437bfbebSnyanmisaka     .deinit     = vdpu_av1d_deinit,
2424*437bfbebSnyanmisaka     .reg_gen    = vdpu_av1d_gen_regs,
2425*437bfbebSnyanmisaka     .start      = vdpu_av1d_start,
2426*437bfbebSnyanmisaka     .wait       = vdpu_av1d_wait,
2427*437bfbebSnyanmisaka     .reset      = vdpu_av1d_reset,
2428*437bfbebSnyanmisaka     .flush      = vdpu_av1d_flush,
2429*437bfbebSnyanmisaka     .control    = vdpu_av1d_control,
2430*437bfbebSnyanmisaka };
2431