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