xref: /rockchip-linux_mpp/mpp/hal/rkdec/vdpu383_com.c (revision 437bfbeb9567cca9cd9080e3f6954aa9d6a94f18)
1*437bfbebSnyanmisaka /* SPDX-License-Identifier: Apache-2.0 OR MIT */
2*437bfbebSnyanmisaka /*
3*437bfbebSnyanmisaka  * Copyright (c) 2024 Rockchip Electronics Co., Ltd.
4*437bfbebSnyanmisaka  */
5*437bfbebSnyanmisaka 
6*437bfbebSnyanmisaka #define MODULE_TAG "vdpu383_com"
7*437bfbebSnyanmisaka 
8*437bfbebSnyanmisaka #include <string.h>
9*437bfbebSnyanmisaka 
10*437bfbebSnyanmisaka #include "mpp_log.h"
11*437bfbebSnyanmisaka #include "mpp_buffer.h"
12*437bfbebSnyanmisaka #include "mpp_common.h"
13*437bfbebSnyanmisaka #include "mpp_compat_impl.h"
14*437bfbebSnyanmisaka #include "mpp_frame_impl.h"
15*437bfbebSnyanmisaka 
16*437bfbebSnyanmisaka #include "vdpu383_com.h"
17*437bfbebSnyanmisaka 
18*437bfbebSnyanmisaka static RK_U32 rcb_coeff[RCB_BUF_COUNT] = {
19*437bfbebSnyanmisaka     [RCB_STRMD_ROW]                 = 3,
20*437bfbebSnyanmisaka     [RCB_STRMD_TILE_ROW]            = 3,
21*437bfbebSnyanmisaka     [RCB_INTER_ROW]                 = 6,
22*437bfbebSnyanmisaka     [RCB_INTER_TILE_ROW]            = 6,
23*437bfbebSnyanmisaka     [RCB_INTRA_ROW]                 = 5,
24*437bfbebSnyanmisaka     [RCB_INTRA_TILE_ROW]            = 5,
25*437bfbebSnyanmisaka     [RCB_FILTERD_ROW]               = 60,
26*437bfbebSnyanmisaka     [RCB_FILTERD_PROTECT_ROW]       = 60,
27*437bfbebSnyanmisaka     [RCB_FILTERD_TILE_ROW]          = 60,
28*437bfbebSnyanmisaka     [RCB_FILTERD_TILE_COL]          = 90,
29*437bfbebSnyanmisaka     [RCB_FILTERD_AV1_UP_TILE_COL]   = 0,
30*437bfbebSnyanmisaka };
31*437bfbebSnyanmisaka 
update_size_offset(Vdpu383RcbInfo * info,RK_U32 reg_idx,RK_S32 offset,RK_S32 len,RK_S32 idx)32*437bfbebSnyanmisaka static RK_S32 update_size_offset(Vdpu383RcbInfo *info, RK_U32 reg_idx,
33*437bfbebSnyanmisaka                                  RK_S32 offset, RK_S32 len, RK_S32 idx)
34*437bfbebSnyanmisaka {
35*437bfbebSnyanmisaka     RK_S32 buf_size = 0;
36*437bfbebSnyanmisaka 
37*437bfbebSnyanmisaka     buf_size = 2 * MPP_ALIGN(len * rcb_coeff[idx], RCB_ALLINE_SIZE);
38*437bfbebSnyanmisaka     info[idx].reg_idx = reg_idx;
39*437bfbebSnyanmisaka     info[idx].offset = offset;
40*437bfbebSnyanmisaka     info[idx].size = buf_size;
41*437bfbebSnyanmisaka 
42*437bfbebSnyanmisaka     return buf_size;
43*437bfbebSnyanmisaka }
44*437bfbebSnyanmisaka 
vdpu383_get_rcb_buf_size(Vdpu383RcbInfo * info,RK_S32 width,RK_S32 height)45*437bfbebSnyanmisaka RK_S32 vdpu383_get_rcb_buf_size(Vdpu383RcbInfo *info, RK_S32 width, RK_S32 height)
46*437bfbebSnyanmisaka {
47*437bfbebSnyanmisaka     RK_S32 offset = 0;
48*437bfbebSnyanmisaka 
49*437bfbebSnyanmisaka     offset += update_size_offset(info, 140, offset, width, RCB_STRMD_ROW);
50*437bfbebSnyanmisaka     offset += update_size_offset(info, 142, offset, width, RCB_STRMD_TILE_ROW);
51*437bfbebSnyanmisaka     offset += update_size_offset(info, 144, offset, width, RCB_INTER_ROW);
52*437bfbebSnyanmisaka     offset += update_size_offset(info, 146, offset, width, RCB_INTER_TILE_ROW);
53*437bfbebSnyanmisaka     offset += update_size_offset(info, 148, offset, width, RCB_INTRA_ROW);
54*437bfbebSnyanmisaka     offset += update_size_offset(info, 150, offset, width, RCB_INTRA_TILE_ROW);
55*437bfbebSnyanmisaka     offset += update_size_offset(info, 152, offset, width, RCB_FILTERD_ROW);
56*437bfbebSnyanmisaka     offset += update_size_offset(info, 154, offset, width, RCB_FILTERD_PROTECT_ROW);
57*437bfbebSnyanmisaka     offset += update_size_offset(info, 156, offset, width, RCB_FILTERD_TILE_ROW);
58*437bfbebSnyanmisaka     offset += update_size_offset(info, 158, offset, height, RCB_FILTERD_TILE_COL);
59*437bfbebSnyanmisaka     offset += update_size_offset(info, 160, offset, height, RCB_FILTERD_AV1_UP_TILE_COL);
60*437bfbebSnyanmisaka 
61*437bfbebSnyanmisaka     return offset;
62*437bfbebSnyanmisaka }
63*437bfbebSnyanmisaka 
vdpu383_setup_rcb(Vdpu383RegCommonAddr * reg,MppDev dev,MppBuffer buf,Vdpu383RcbInfo * info)64*437bfbebSnyanmisaka void vdpu383_setup_rcb(Vdpu383RegCommonAddr *reg, MppDev dev,
65*437bfbebSnyanmisaka                        MppBuffer buf, Vdpu383RcbInfo *info)
66*437bfbebSnyanmisaka {
67*437bfbebSnyanmisaka     RK_U32 i;
68*437bfbebSnyanmisaka 
69*437bfbebSnyanmisaka     reg->reg140_rcb_strmd_row_offset           = mpp_buffer_get_fd(buf);
70*437bfbebSnyanmisaka     reg->reg142_rcb_strmd_tile_row_offset      = mpp_buffer_get_fd(buf);
71*437bfbebSnyanmisaka     reg->reg144_rcb_inter_row_offset           = mpp_buffer_get_fd(buf);
72*437bfbebSnyanmisaka     reg->reg146_rcb_inter_tile_row_offset      = mpp_buffer_get_fd(buf);
73*437bfbebSnyanmisaka     reg->reg148_rcb_intra_row_offset           = mpp_buffer_get_fd(buf);
74*437bfbebSnyanmisaka     reg->reg150_rcb_intra_tile_row_offset      = mpp_buffer_get_fd(buf);
75*437bfbebSnyanmisaka     reg->reg152_rcb_filterd_row_offset         = mpp_buffer_get_fd(buf);
76*437bfbebSnyanmisaka     reg->reg154_rcb_filterd_protect_row_offset = mpp_buffer_get_fd(buf);
77*437bfbebSnyanmisaka     reg->reg156_rcb_filterd_tile_row_offset    = mpp_buffer_get_fd(buf);
78*437bfbebSnyanmisaka     reg->reg158_rcb_filterd_tile_col_offset    = mpp_buffer_get_fd(buf);
79*437bfbebSnyanmisaka     reg->reg160_rcb_filterd_av1_upscale_tile_col_offset = mpp_buffer_get_fd(buf);
80*437bfbebSnyanmisaka 
81*437bfbebSnyanmisaka     reg->reg141_rcb_strmd_row_len            =  info[RCB_STRMD_ROW].size          ;
82*437bfbebSnyanmisaka     reg->reg143_rcb_strmd_tile_row_len       =  info[RCB_STRMD_TILE_ROW].size     ;
83*437bfbebSnyanmisaka     reg->reg145_rcb_inter_row_len            =  info[RCB_INTER_ROW].size          ;
84*437bfbebSnyanmisaka     reg->reg147_rcb_inter_tile_row_len       =  info[RCB_INTER_TILE_ROW].size     ;
85*437bfbebSnyanmisaka     reg->reg149_rcb_intra_row_len            =  info[RCB_INTRA_ROW].size          ;
86*437bfbebSnyanmisaka     reg->reg151_rcb_intra_tile_row_len       =  info[RCB_INTRA_TILE_ROW].size     ;
87*437bfbebSnyanmisaka     reg->reg153_rcb_filterd_row_len          =  info[RCB_FILTERD_ROW].size        ;
88*437bfbebSnyanmisaka     reg->reg155_rcb_filterd_protect_row_len  =  info[RCB_FILTERD_PROTECT_ROW].size;
89*437bfbebSnyanmisaka     reg->reg157_rcb_filterd_tile_row_len     =  info[RCB_FILTERD_TILE_ROW].size   ;
90*437bfbebSnyanmisaka     reg->reg159_rcb_filterd_tile_col_len     =  info[RCB_FILTERD_TILE_COL].size   ;
91*437bfbebSnyanmisaka     reg->reg161_rcb_filterd_av1_upscale_tile_col_len = info[RCB_FILTERD_AV1_UP_TILE_COL].size;
92*437bfbebSnyanmisaka 
93*437bfbebSnyanmisaka     for (i = 0; i < RCB_BUF_COUNT; i++) {
94*437bfbebSnyanmisaka         if (info[i].offset)
95*437bfbebSnyanmisaka             mpp_dev_set_reg_offset(dev, info[i].reg_idx, info[i].offset);
96*437bfbebSnyanmisaka     }
97*437bfbebSnyanmisaka }
98*437bfbebSnyanmisaka 
vdpu383_compare_rcb_size(const void * a,const void * b)99*437bfbebSnyanmisaka RK_S32 vdpu383_compare_rcb_size(const void *a, const void *b)
100*437bfbebSnyanmisaka {
101*437bfbebSnyanmisaka     RK_S32 val = 0;
102*437bfbebSnyanmisaka     Vdpu383RcbInfo *p0 = (Vdpu383RcbInfo *)a;
103*437bfbebSnyanmisaka     Vdpu383RcbInfo *p1 = (Vdpu383RcbInfo *)b;
104*437bfbebSnyanmisaka 
105*437bfbebSnyanmisaka     val = (p0->size > p1->size) ? -1 : 1;
106*437bfbebSnyanmisaka 
107*437bfbebSnyanmisaka     return val;
108*437bfbebSnyanmisaka }
109*437bfbebSnyanmisaka 
vdpu383_setup_statistic(Vdpu383CtrlReg * ctrl_regs)110*437bfbebSnyanmisaka void vdpu383_setup_statistic(Vdpu383CtrlReg *ctrl_regs)
111*437bfbebSnyanmisaka {
112*437bfbebSnyanmisaka     ctrl_regs->reg28.axi_perf_work_e = 1;
113*437bfbebSnyanmisaka     ctrl_regs->reg28.axi_cnt_type = 1;
114*437bfbebSnyanmisaka     ctrl_regs->reg28.rd_latency_id = 11;
115*437bfbebSnyanmisaka 
116*437bfbebSnyanmisaka     ctrl_regs->reg29.addr_align_type     = 1;
117*437bfbebSnyanmisaka     ctrl_regs->reg29.ar_cnt_id_type      = 0;
118*437bfbebSnyanmisaka     ctrl_regs->reg29.aw_cnt_id_type      = 1;
119*437bfbebSnyanmisaka     ctrl_regs->reg29.ar_count_id         = 17;
120*437bfbebSnyanmisaka     ctrl_regs->reg29.aw_count_id         = 0;
121*437bfbebSnyanmisaka     ctrl_regs->reg29.rd_band_width_mode  = 0;
122*437bfbebSnyanmisaka 
123*437bfbebSnyanmisaka     /* set hurry */
124*437bfbebSnyanmisaka     ctrl_regs->reg30.axi_wr_qos = 0;
125*437bfbebSnyanmisaka     ctrl_regs->reg30.axi_rd_qos = 0;
126*437bfbebSnyanmisaka }
127*437bfbebSnyanmisaka 
vdpu383_afbc_align_calc(MppBufSlots slots,MppFrame frame,RK_U32 expand)128*437bfbebSnyanmisaka void vdpu383_afbc_align_calc(MppBufSlots slots, MppFrame frame, RK_U32 expand)
129*437bfbebSnyanmisaka {
130*437bfbebSnyanmisaka     RK_U32 ver_stride = 0;
131*437bfbebSnyanmisaka     RK_U32 img_height = mpp_frame_get_height(frame);
132*437bfbebSnyanmisaka     RK_U32 img_width = mpp_frame_get_width(frame);
133*437bfbebSnyanmisaka     RK_U32 hdr_stride = (*compat_ext_fbc_hdr_256_odd) ?
134*437bfbebSnyanmisaka                         (MPP_ALIGN(img_width, 256) | 256) :
135*437bfbebSnyanmisaka                         (MPP_ALIGN(img_width, 64));
136*437bfbebSnyanmisaka 
137*437bfbebSnyanmisaka     mpp_slots_set_prop(slots, SLOTS_HOR_ALIGN, mpp_align_64);
138*437bfbebSnyanmisaka     mpp_slots_set_prop(slots, SLOTS_VER_ALIGN, mpp_align_16);
139*437bfbebSnyanmisaka 
140*437bfbebSnyanmisaka     mpp_frame_set_fbc_hdr_stride(frame, hdr_stride);
141*437bfbebSnyanmisaka 
142*437bfbebSnyanmisaka     ver_stride = mpp_align_16(img_height);
143*437bfbebSnyanmisaka     if (*compat_ext_fbc_buf_size) {
144*437bfbebSnyanmisaka         ver_stride += expand;
145*437bfbebSnyanmisaka     }
146*437bfbebSnyanmisaka     mpp_frame_set_ver_stride(frame, ver_stride);
147*437bfbebSnyanmisaka }
148*437bfbebSnyanmisaka 
vdpu383_set_rcbinfo(MppDev dev,Vdpu383RcbInfo * rcb_info)149*437bfbebSnyanmisaka RK_S32 vdpu383_set_rcbinfo(MppDev dev, Vdpu383RcbInfo *rcb_info)
150*437bfbebSnyanmisaka {
151*437bfbebSnyanmisaka     MppDevRcbInfoCfg rcb_cfg;
152*437bfbebSnyanmisaka     RK_U32 i;
153*437bfbebSnyanmisaka 
154*437bfbebSnyanmisaka     Vdpu383RcbSetMode_e set_rcb_mode = RCB_SET_BY_PRIORITY_MODE;
155*437bfbebSnyanmisaka 
156*437bfbebSnyanmisaka     RK_U32 rcb_priority[RCB_BUF_COUNT] = {
157*437bfbebSnyanmisaka         RCB_FILTERD_ROW,
158*437bfbebSnyanmisaka         RCB_INTER_ROW,
159*437bfbebSnyanmisaka         RCB_INTRA_ROW,
160*437bfbebSnyanmisaka         RCB_STRMD_ROW,
161*437bfbebSnyanmisaka         RCB_INTER_TILE_ROW,
162*437bfbebSnyanmisaka         RCB_INTRA_TILE_ROW,
163*437bfbebSnyanmisaka         RCB_STRMD_TILE_ROW,
164*437bfbebSnyanmisaka         RCB_FILTERD_TILE_ROW,
165*437bfbebSnyanmisaka         RCB_FILTERD_TILE_COL,
166*437bfbebSnyanmisaka         RCB_FILTERD_AV1_UP_TILE_COL,
167*437bfbebSnyanmisaka         RCB_FILTERD_PROTECT_ROW,
168*437bfbebSnyanmisaka     };
169*437bfbebSnyanmisaka     /*
170*437bfbebSnyanmisaka      * RCB_SET_BY_SIZE_SORT_MODE: by size sort
171*437bfbebSnyanmisaka      * RCB_SET_BY_PRIORITY_MODE: by priority
172*437bfbebSnyanmisaka      */
173*437bfbebSnyanmisaka 
174*437bfbebSnyanmisaka     switch (set_rcb_mode) {
175*437bfbebSnyanmisaka     case RCB_SET_BY_SIZE_SORT_MODE : {
176*437bfbebSnyanmisaka         Vdpu383RcbInfo info[RCB_BUF_COUNT];
177*437bfbebSnyanmisaka 
178*437bfbebSnyanmisaka         memcpy(info, rcb_info, sizeof(info));
179*437bfbebSnyanmisaka         qsort(info, MPP_ARRAY_ELEMS(info),
180*437bfbebSnyanmisaka               sizeof(info[0]), vdpu383_compare_rcb_size);
181*437bfbebSnyanmisaka 
182*437bfbebSnyanmisaka         for (i = 0; i < MPP_ARRAY_ELEMS(info); i++) {
183*437bfbebSnyanmisaka             rcb_cfg.reg_idx = info[i].reg_idx;
184*437bfbebSnyanmisaka             rcb_cfg.size = info[i].size;
185*437bfbebSnyanmisaka             if (rcb_cfg.size > 0) {
186*437bfbebSnyanmisaka                 mpp_dev_ioctl(dev, MPP_DEV_RCB_INFO, &rcb_cfg);
187*437bfbebSnyanmisaka             } else
188*437bfbebSnyanmisaka                 break;
189*437bfbebSnyanmisaka         }
190*437bfbebSnyanmisaka     } break;
191*437bfbebSnyanmisaka     case RCB_SET_BY_PRIORITY_MODE : {
192*437bfbebSnyanmisaka         Vdpu383RcbInfo *info = rcb_info;
193*437bfbebSnyanmisaka         RK_U32 index = 0;
194*437bfbebSnyanmisaka 
195*437bfbebSnyanmisaka         for (i = 0; i < MPP_ARRAY_ELEMS(rcb_priority); i ++) {
196*437bfbebSnyanmisaka             index = rcb_priority[i];
197*437bfbebSnyanmisaka 
198*437bfbebSnyanmisaka             rcb_cfg.reg_idx = info[index].reg_idx;
199*437bfbebSnyanmisaka             rcb_cfg.size = info[index].size;
200*437bfbebSnyanmisaka             if (rcb_cfg.size > 0) {
201*437bfbebSnyanmisaka                 mpp_dev_ioctl(dev, MPP_DEV_RCB_INFO, &rcb_cfg);
202*437bfbebSnyanmisaka             }
203*437bfbebSnyanmisaka         }
204*437bfbebSnyanmisaka     } break;
205*437bfbebSnyanmisaka     default:
206*437bfbebSnyanmisaka         break;
207*437bfbebSnyanmisaka     }
208*437bfbebSnyanmisaka 
209*437bfbebSnyanmisaka     return 0;
210*437bfbebSnyanmisaka }
211*437bfbebSnyanmisaka 
vdpu383_update_thumbnail_frame_info(MppFrame frame)212*437bfbebSnyanmisaka void vdpu383_update_thumbnail_frame_info(MppFrame frame)
213*437bfbebSnyanmisaka {
214*437bfbebSnyanmisaka     RK_U32 down_scale_height = mpp_frame_get_height(frame) >> 1;
215*437bfbebSnyanmisaka     RK_U32 down_scale_width = mpp_frame_get_width(frame) >> 1;
216*437bfbebSnyanmisaka     RK_U32 down_scale_ver = MPP_ALIGN(down_scale_height, 16);
217*437bfbebSnyanmisaka     RK_U32 down_scale_hor = MPP_ALIGN(down_scale_width, 16);
218*437bfbebSnyanmisaka     RK_U32 down_scale_buf_size = 0;
219*437bfbebSnyanmisaka 
220*437bfbebSnyanmisaka     if (!MPP_FRAME_FMT_IS_FBC(mpp_frame_get_fmt(frame))) {
221*437bfbebSnyanmisaka         down_scale_hor = mpp_align_128_odd_plus_64(down_scale_hor);
222*437bfbebSnyanmisaka         down_scale_ver = mpp_frame_get_ver_stride(frame) >> 1;
223*437bfbebSnyanmisaka     }
224*437bfbebSnyanmisaka 
225*437bfbebSnyanmisaka     down_scale_buf_size = down_scale_hor * down_scale_ver *  3 / 2;
226*437bfbebSnyanmisaka     /*
227*437bfbebSnyanmisaka      *  no matter what format, scale down image will output as 8bit raster format;
228*437bfbebSnyanmisaka      */
229*437bfbebSnyanmisaka     mpp_frame_set_fmt(frame, MPP_FMT_YUV420SP);
230*437bfbebSnyanmisaka     mpp_frame_set_width(frame, down_scale_width);
231*437bfbebSnyanmisaka     mpp_frame_set_height(frame, down_scale_height);
232*437bfbebSnyanmisaka     mpp_frame_set_hor_stride(frame, down_scale_hor);
233*437bfbebSnyanmisaka     mpp_frame_set_ver_stride(frame, down_scale_ver);
234*437bfbebSnyanmisaka     mpp_frame_set_buf_size(frame, down_scale_buf_size);
235*437bfbebSnyanmisaka }
236*437bfbebSnyanmisaka 
vdpu383_setup_down_scale(MppFrame frame,MppDev dev,Vdpu383CtrlReg * com,void * comParas)237*437bfbebSnyanmisaka void vdpu383_setup_down_scale(MppFrame frame, MppDev dev, Vdpu383CtrlReg *com, void* comParas)
238*437bfbebSnyanmisaka {
239*437bfbebSnyanmisaka     RK_U32 down_scale_height = mpp_frame_get_height(frame) >> 1;
240*437bfbebSnyanmisaka     RK_U32 down_scale_width = mpp_frame_get_width(frame) >> 1;
241*437bfbebSnyanmisaka     RK_U32 down_scale_ver = MPP_ALIGN(down_scale_height, 16);
242*437bfbebSnyanmisaka     RK_U32 down_scale_hor = MPP_ALIGN(down_scale_width, 16);
243*437bfbebSnyanmisaka 
244*437bfbebSnyanmisaka     Vdpu383RegCommParas* paras = (Vdpu383RegCommParas*)comParas;
245*437bfbebSnyanmisaka     MppFrameFormat fmt = mpp_frame_get_fmt(frame);
246*437bfbebSnyanmisaka     MppMeta meta = mpp_frame_get_meta(frame);
247*437bfbebSnyanmisaka     RK_U32 down_scale_y_offset = 0;
248*437bfbebSnyanmisaka     RK_U32 down_scale_uv_offset = 0;
249*437bfbebSnyanmisaka     RK_U32 down_scale_y_virstride = down_scale_ver * down_scale_hor;
250*437bfbebSnyanmisaka     RK_U32 downscale_buf_size;
251*437bfbebSnyanmisaka 
252*437bfbebSnyanmisaka     if (!MPP_FRAME_FMT_IS_FBC(mpp_frame_get_fmt(frame))) {
253*437bfbebSnyanmisaka         down_scale_hor = mpp_align_128_odd_plus_64(down_scale_hor);
254*437bfbebSnyanmisaka         down_scale_ver = mpp_frame_get_ver_stride(frame) >> 1;
255*437bfbebSnyanmisaka         down_scale_y_virstride = down_scale_ver * down_scale_hor;
256*437bfbebSnyanmisaka     }
257*437bfbebSnyanmisaka     /*
258*437bfbebSnyanmisaka      *  no matter what format, scale down image will output as 8bit raster format;
259*437bfbebSnyanmisaka      *  down_scale image buffer size was already added to the buf_size of mpp_frame,
260*437bfbebSnyanmisaka      *  which was calculated in mpp_buf_slot.cpp: (size = original_size + scaledown_size)
261*437bfbebSnyanmisaka      */
262*437bfbebSnyanmisaka     switch ((fmt & MPP_FRAME_FMT_MASK)) {
263*437bfbebSnyanmisaka     case MPP_FMT_YUV400 : {
264*437bfbebSnyanmisaka         downscale_buf_size = down_scale_y_virstride;
265*437bfbebSnyanmisaka     } break;
266*437bfbebSnyanmisaka     case MPP_FMT_YUV420SP_10BIT :
267*437bfbebSnyanmisaka     case MPP_FMT_YUV420SP : {
268*437bfbebSnyanmisaka         downscale_buf_size = down_scale_y_virstride * 3 / 2;
269*437bfbebSnyanmisaka     } break;
270*437bfbebSnyanmisaka     case MPP_FMT_YUV422SP_10BIT :
271*437bfbebSnyanmisaka     case MPP_FMT_YUV422SP : {
272*437bfbebSnyanmisaka         downscale_buf_size = down_scale_y_virstride * 2;
273*437bfbebSnyanmisaka     } break;
274*437bfbebSnyanmisaka     case MPP_FMT_YUV444SP : {
275*437bfbebSnyanmisaka         downscale_buf_size = down_scale_y_virstride * 3;
276*437bfbebSnyanmisaka     } break;
277*437bfbebSnyanmisaka     default : {
278*437bfbebSnyanmisaka         downscale_buf_size = down_scale_y_virstride * 3 / 2;
279*437bfbebSnyanmisaka     } break;
280*437bfbebSnyanmisaka     }
281*437bfbebSnyanmisaka     downscale_buf_size = MPP_ALIGN(downscale_buf_size, 16);
282*437bfbebSnyanmisaka 
283*437bfbebSnyanmisaka     down_scale_y_offset = MPP_ALIGN((mpp_frame_get_buf_size(frame) - downscale_buf_size), 16);
284*437bfbebSnyanmisaka     down_scale_uv_offset = down_scale_y_offset + down_scale_y_virstride;
285*437bfbebSnyanmisaka 
286*437bfbebSnyanmisaka     com->reg9.scale_down_en = 1;
287*437bfbebSnyanmisaka     com->reg9.av1_fgs_en = 0;
288*437bfbebSnyanmisaka     paras->reg71_scl_ref_hor_virstride = down_scale_hor >> 4;
289*437bfbebSnyanmisaka     paras->reg72_scl_ref_raster_uv_hor_virstride = down_scale_hor >> 4;
290*437bfbebSnyanmisaka     if ((fmt & MPP_FRAME_FMT_MASK) == MPP_FMT_YUV444SP)
291*437bfbebSnyanmisaka         paras->reg72_scl_ref_raster_uv_hor_virstride = down_scale_hor >> 3;
292*437bfbebSnyanmisaka     paras->reg73_scl_ref_virstride = down_scale_y_virstride >> 4;
293*437bfbebSnyanmisaka     if (mpp_frame_get_thumbnail_en(frame) == MPP_FRAME_THUMBNAIL_MIXED) {
294*437bfbebSnyanmisaka         mpp_dev_set_reg_offset(dev, 133, down_scale_y_offset);
295*437bfbebSnyanmisaka         mpp_meta_set_s32(meta, KEY_DEC_TBN_Y_OFFSET, down_scale_y_offset);
296*437bfbebSnyanmisaka         mpp_meta_set_s32(meta, KEY_DEC_TBN_UV_OFFSET, down_scale_uv_offset);
297*437bfbebSnyanmisaka     }
298*437bfbebSnyanmisaka }
299*437bfbebSnyanmisaka 
300*437bfbebSnyanmisaka #ifdef DUMP_VDPU383_DATAS
301*437bfbebSnyanmisaka RK_U32 dump_cur_frame = 0;
302*437bfbebSnyanmisaka char dump_cur_dir[128];
303*437bfbebSnyanmisaka char dump_cur_fname_path[512];
304*437bfbebSnyanmisaka 
flip_string(char * str)305*437bfbebSnyanmisaka MPP_RET flip_string(char *str)
306*437bfbebSnyanmisaka {
307*437bfbebSnyanmisaka     RK_U32 len = strlen(str);
308*437bfbebSnyanmisaka     RK_U32 i, j;
309*437bfbebSnyanmisaka 
310*437bfbebSnyanmisaka     for (i = 0, j = len - 1; i <= j; i++, j--) {
311*437bfbebSnyanmisaka         // swapping characters
312*437bfbebSnyanmisaka         char c = str[i];
313*437bfbebSnyanmisaka         str[i] = str[j];
314*437bfbebSnyanmisaka         str[j] = c;
315*437bfbebSnyanmisaka     }
316*437bfbebSnyanmisaka 
317*437bfbebSnyanmisaka     return MPP_OK;
318*437bfbebSnyanmisaka }
319*437bfbebSnyanmisaka 
dump_data_to_file(char * fname_path,void * data,RK_U32 data_bit_size,RK_U32 line_bits,RK_U32 big_end)320*437bfbebSnyanmisaka MPP_RET dump_data_to_file(char *fname_path, void *data, RK_U32 data_bit_size,
321*437bfbebSnyanmisaka                           RK_U32 line_bits, RK_U32 big_end)
322*437bfbebSnyanmisaka {
323*437bfbebSnyanmisaka     RK_U8 *buf_p = (RK_U8 *)data;
324*437bfbebSnyanmisaka     RK_U8 cur_data;
325*437bfbebSnyanmisaka     RK_U32 i;
326*437bfbebSnyanmisaka     RK_U32 loop_cnt;
327*437bfbebSnyanmisaka     FILE *dump_fp = NULL;
328*437bfbebSnyanmisaka     char line_tmp[256];
329*437bfbebSnyanmisaka     RK_U32 str_idx = 0;
330*437bfbebSnyanmisaka 
331*437bfbebSnyanmisaka     dump_fp = fopen(fname_path, "w+");
332*437bfbebSnyanmisaka     if (!dump_fp) {
333*437bfbebSnyanmisaka         mpp_err_f("open file: %s error!\n", fname_path);
334*437bfbebSnyanmisaka         return MPP_NOK;
335*437bfbebSnyanmisaka     }
336*437bfbebSnyanmisaka 
337*437bfbebSnyanmisaka     if ((data_bit_size % 4 != 0) || (line_bits % 8 != 0)) {
338*437bfbebSnyanmisaka         mpp_err_f("line bits not align to 4!\n");
339*437bfbebSnyanmisaka         return MPP_NOK;
340*437bfbebSnyanmisaka     }
341*437bfbebSnyanmisaka 
342*437bfbebSnyanmisaka     loop_cnt = data_bit_size / 8;
343*437bfbebSnyanmisaka     for (i = 0; i < loop_cnt; i++) {
344*437bfbebSnyanmisaka         cur_data = buf_p[i];
345*437bfbebSnyanmisaka 
346*437bfbebSnyanmisaka         sprintf(&line_tmp[str_idx++], "%0x", cur_data & 0xf);
347*437bfbebSnyanmisaka         if ((i * 8 + 4) % line_bits == 0) {
348*437bfbebSnyanmisaka             line_tmp[str_idx++] = '\0';
349*437bfbebSnyanmisaka             str_idx = 0;
350*437bfbebSnyanmisaka             if (!big_end)
351*437bfbebSnyanmisaka                 flip_string(line_tmp);
352*437bfbebSnyanmisaka             fprintf(dump_fp, "%s\n", line_tmp);
353*437bfbebSnyanmisaka         }
354*437bfbebSnyanmisaka         sprintf(&line_tmp[str_idx++], "%0x", (cur_data >> 4) & 0xf);
355*437bfbebSnyanmisaka         if ((i * 8 + 8) % line_bits == 0) {
356*437bfbebSnyanmisaka             line_tmp[str_idx++] = '\0';
357*437bfbebSnyanmisaka             str_idx = 0;
358*437bfbebSnyanmisaka             if (!big_end)
359*437bfbebSnyanmisaka                 flip_string(line_tmp);
360*437bfbebSnyanmisaka             fprintf(dump_fp, "%s\n", line_tmp);
361*437bfbebSnyanmisaka         }
362*437bfbebSnyanmisaka     }
363*437bfbebSnyanmisaka 
364*437bfbebSnyanmisaka     // last line
365*437bfbebSnyanmisaka     if (data_bit_size % 4) {
366*437bfbebSnyanmisaka         cur_data = buf_p[i];
367*437bfbebSnyanmisaka         sprintf(&line_tmp[str_idx++], "%0x", cur_data & 0xf);
368*437bfbebSnyanmisaka         if ((i * 8 + 8) % line_bits == 0) {
369*437bfbebSnyanmisaka             line_tmp[str_idx++] = '\0';
370*437bfbebSnyanmisaka             str_idx = 0;
371*437bfbebSnyanmisaka             if (!big_end)
372*437bfbebSnyanmisaka                 flip_string(line_tmp);
373*437bfbebSnyanmisaka             fprintf(dump_fp, "%s\n", line_tmp);
374*437bfbebSnyanmisaka         }
375*437bfbebSnyanmisaka     }
376*437bfbebSnyanmisaka     if (data_bit_size % line_bits) {
377*437bfbebSnyanmisaka         loop_cnt = (line_bits - (data_bit_size % line_bits)) / 4;
378*437bfbebSnyanmisaka         for (i = 0; i < loop_cnt; i++)
379*437bfbebSnyanmisaka             sprintf(&line_tmp[str_idx++], "%0x", 0);
380*437bfbebSnyanmisaka         line_tmp[str_idx++] = '\0';
381*437bfbebSnyanmisaka         str_idx = 0;
382*437bfbebSnyanmisaka         if (!big_end)
383*437bfbebSnyanmisaka             flip_string(line_tmp);
384*437bfbebSnyanmisaka         fprintf(dump_fp, "%s\n", line_tmp);
385*437bfbebSnyanmisaka     }
386*437bfbebSnyanmisaka 
387*437bfbebSnyanmisaka     fclose(dump_fp);
388*437bfbebSnyanmisaka 
389*437bfbebSnyanmisaka     return MPP_OK;
390*437bfbebSnyanmisaka }
391*437bfbebSnyanmisaka #endif