blob: 257b935e2c4c540751becd83bd4012e43ea2b4e0 [file] [edit]
/* SPDX-License-Identifier: (GPL-2.0+ OR MIT) */
/*
* drivers/amlogic/media/video_processor/common/vicp/vicp_process.h
*
* Copyright (C) 2017 Amlogic, Inc. All rights reserved.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
* more details.
*
*/
#ifndef _VICP_PROCESS_H_
#define _VICP_PROCESS_H_
#include <linux/amlogic/media/vicp/vicp.h>
#include "vicp_rdma.h"
#include "vicp_hdr.h"
#define ADDR_VALUE_8G 0x200000000
extern u32 print_flag;
extern u32 input_width;
extern u32 input_height;
extern u32 output_width;
extern u32 output_height;
extern u32 input_color_format;
extern u32 output_color_format;
extern u32 input_color_dep;
extern u32 output_color_dep;
extern u32 dump_yuv_flag;
extern u32 scaler_en;
extern u32 hdr_en;
extern u32 crop_en;
extern u32 shrink_en;
extern struct mutex vicp_mutex;
extern int cgain_lut1[65];
extern int cgain_lut0[65];
extern u32 debug_axis_en;
extern struct output_axis_s axis;
extern struct vicp_hdr_data_s *vicp_hdr;
extern u32 rdma_en;
extern u32 debug_rdma_en;
extern u32 fgrain_en;
/* *********************************************************************** */
/* ************************* enum definitions **************************.*/
/* *********************************************************************** */
enum vicp_lossy_compress_mode_e {
LOSSY_COMPRESS_MODE_OFF,
LOSSY_COMPRESS_MODE_QUAN_LUMA,
LOSSY_COMPRESS_MODE_QUAN_CHRMA,
LOSSY_COMPRESS_MODE_QUAN_ALL,
LOSSY_COMPRESS_MODE_CR,
LOSSY_COMPRESS_MODE_MAX,
};
/* *********************************************************************** */
/* ************************* struct definitions **************************.*/
/* *********************************************************************** */
struct vid_cmpr_lossy_compress_s {
u32 compress_mode; //0:close 1:luma loosy 2:chrma loosy 3:luma&&chrma loosy 4:cr loosy
u32 quant_diff_root_leave;
u32 rc_en;
u32 brst_len_add_en;
//0:brst_len_add_en=0&brst_len_add_value=2 2:en=1&value=2 3:en=1&value=3
u32 brst_len_add_value;
u32 ofset_brst4_en;
u32 compress_rate;
};
struct vid_cmpr_hdr_s {
u32 hdr2_en;
enum vframe_signal_fmt_e input_sig_fmt;
enum vframe_signal_fmt_e output_sig_fmt;
};
struct vid_cmpr_top_s {
u32 src_compress;
u32 src_hsize;//input size
u32 src_vsize;
u64 src_head_baddr;
u64 src_body_baddr;
u32 src_fmt_mode;//2 bits default = 2, 0:yuv444 1:yuv422 2:yuv420
u32 src_compbits;//2 bits 0-8bits 1-9bits 2-10bits
u32 src_win_bgn_h;
u32 src_win_end_h;
u32 src_win_bgn_v;
u32 src_win_end_v;
u32 src_pip_src_mode;
struct vframe_s *src_vf;
u32 src_endian;
u32 src_block_mode;
u32 src_burst_len;
u32 src_count;
u32 src_num;
bool rdma_enable;
bool security_en;
enum vicp_skip_mode_e skip_mode;
u32 src_need_swap_cbcr;
// hdr
struct vid_cmpr_hdr_s hdr_config;
// afbce
u32 out_afbce_enable;//open nbit of afbce
u64 out_head_baddr;//head_addr of afbce
u64 out_mmu_info_baddr;//mmu_linear_addr
u32 out_reg_init_ctrl;//pip init frame flag
u32 out_reg_pip_mode;//pip open bit
u32 out_reg_format_mode;//0:444 1:422 2:420
u32 out_reg_compbits;//bits num after compression
u32 out_hsize_in;//input data hsize
u32 out_vsize_in;//input data vsize
u32 out_hsize_bgnd;
u32 out_vsize_bgnd;
u32 out_win_bgn_h;
u32 out_win_end_h;
u32 out_win_bgn_v;
u32 out_win_end_v;
u32 out_rot_en;
u32 out_shrk_en;
u32 out_shrk_mode;//0=2x 1=4x 2=8x
// wrmif
u32 wrmif_en;
u32 wrmif_set_separate_en;// 00 : one canvas 01 : 3 canvas(old 4:2:0).10: 2 canvas. (NV21).
u32 wrmif_fmt_mode;// 00: 4:2:0; 01: 4:2:2; 10: 4:4:4
u32 out_endian;
u32 out_need_swap_cbcr;
// 0:8 bits 1:10 bits 422(old mode,12bit) 2: 10bit 444 3:10bit 422(full pack) or 444
u32 wrmif_bits_mode;
u64 wrmif_canvas0_addr0;//base addr
u64 wrmif_canvas0_addr1;//base addr
u64 wrmif_canvas0_addr2;//base add
// rdmif
u32 rdmif_separate_en;
u64 rdmif_canvas0_addr0;//base addr
u64 rdmif_canvas0_addr1;//base addr
u64 rdmif_canvas0_addr2;//base addr
// rot relative
u32 rot_rev_mode;
u32 rot_hshrk_ratio;//0:no shrink 1:1/2 shrink 2:1/4 shrink
u32 rot_vshrk_ratio;//0:no shrink 1:1/2 shrink 2:1/4 shrink
u32 canvas_width[3];
// film_grain
u32 film_grain_en;
u64 film_lut_addr;
// lossy
struct vid_cmpr_lossy_compress_s src_lossy_compress;
struct vid_cmpr_lossy_compress_s out_lossy_compress;
// afbce mmu_page_size
u32 src_mmu_page_size_mode; //0:mmu_page_size=4096 1:mmu_page_size=8192
};
struct vid_cmpr_mif_s {
u32 luma_x_start0;
u32 luma_x_end0;
u32 luma_y_start0;
u32 luma_y_end0;
u32 chrm_x_start0;
u32 chrm_x_end0;
u32 chrm_y_start0;
u32 chrm_y_end0;
u32 set_separate_en : 2;// 00 : one canvas 01 : 3 canvas(old 4:2:0). 10: 2 canvas. (NV21).
u32 src_field_mode : 1;// 1 frame . 0 field.
u32 fmt_mode : 2;// 00: 4:2:0; 01: 4:2:2; 10: 4:4:4
u32 output_field_num: 1;// 0 top field 1 bottom field.
// 0:8 bits 1:10 bits 422(old mode,12bit) 2: 10bit 444 3:10bit 422(full pack) or 444
u32 bits_mode : 2;
u32 burst_size_y : 2;
u32 burst_size_cb : 2;
u32 burst_size_cr : 2;
u32 swap_cbcr;
u64 canvas0_addr0; //base addr
u64 canvas0_addr1; //base addr
u64 canvas0_addr2; //base addr
u32 stride_y;
u32 stride_cb;
u32 stride_cr;
u32 rev_x;
u32 rev_y;
u32 buf_crop_en;
u32 buf_hsize;
u32 buf_vsize;
u32 endian;
u32 block_mode;
u32 burst_len;
};
struct vid_cmpr_crop_s {
u32 enable;
u32 hold_line;
u32 dimm_layer_en;
u32 dimm_data;
u32 frame_size_h;
u32 frame_size_v;
u32 win_bgn_h;
u32 win_end_h;
u32 win_bgn_v;
u32 win_end_v;
};
struct vid_cmpr_afbce_s {
u64 head_baddr;//head_addr of afbce
u64 table_baddr;//mmu_linear_addr
u32 reg_init_ctrl;//pip init frame flag
u32 reg_pip_mode;//pip open bit
u32 reg_ram_comb;//ram split bit open in di mult write case
u32 reg_format_mode;//0:444 1:422 2:420
u32 reg_compbits_y;//bits num after compression
u32 reg_compbits_c;//bits num after compression
u32 hsize_in;//input data hsize
u32 vsize_in;//input data hsize
u32 hsize_bgnd;//hsize of background
u32 vsize_bgnd;//hsize of background
u32 enc_win_bgn_h;//scope in background buffer
u32 enc_win_end_h;//scope in background buffer
u32 enc_win_bgn_v;//scope in background buffer
u32 enc_win_end_v;//scope in background buffer
u32 rev_mode;//0:normal mode
u32 def_color_0;//def_color
u32 def_color_1;//def_color
u32 def_color_2;//def_color
u32 def_color_3;//def_color
u32 force_444_comb;//def_color
u32 rot_en;
u32 din_swt;
struct vid_cmpr_lossy_compress_s lossy_compress;
u32 mmu_page_size;
};
struct vid_cmpr_afbcd_s {
u32 blk_mem_mode;// 1 bits 1-12x128bit/blk32x4, 0-16x128bit/blk32x4
u32 index;//3bit: 0-5 for di_m0/m5, 6:vd1 7:vd2
u32 hsize;//input size
u32 vsize;
u32 head_baddr;
u32 body_baddr;
u32 compbits_y;//2 bits 0-8bits 1-9bits 2-10bits
u32 compbits_u;//2 bits 0-8bits 1-9bits 2-10bits
u32 compbits_v;//2 bits 0-8bits 1-9bits 2-10bits
u32 fmt_mode;//2 bits default = 2, 0:yuv444 1:yuv422 2:yuv420
u32 ddr_sz_mode;//1 bits 1:mmu mode
u32 fmt444_comb;//1 bits
u32 dos_uncomp;//1 bits 0:afbce 1:dos
u32 h_skip_y;
u32 v_skip_y;
u32 h_skip_uv;
u32 v_skip_uv;
u32 rev_mode;
u32 def_color_y;
u32 def_color_u;
u32 def_color_v;
u32 win_bgn_h;
u32 win_end_h;
u32 win_bgn_v;
u32 win_end_v;
u32 hz_ini_phase; // 4 bits
u32 vt_ini_phase; // 4 bits
u32 hz_rpt_fst0_en; // 1 bits
u32 vt_rpt_fst0_en; // 1 bits
u32 rot_en;
u32 rot_hbgn;
u32 rot_vbgn;
u32 rot_vshrk;
u32 rot_hshrk;
u32 rot_drop_mode;
u32 rot_ofmt_mode;
u32 rot_ocompbit;
u32 pip_src_mode;
struct vid_cmpr_lossy_compress_s lossy_compress;
};
struct vid_cmpr_scaler_s {
u32 device_index;
u32 din_hsize;
u32 din_vsize;
u32 dout_hsize;
u32 dout_vsize;
u32 vert_bank_length;
u32 prehsc_en;// osd_pps has no prehsc
u32 prevsc_en;// osd_pps has no prevsc
u32 prehsc_rate;
u32 prevsc_rate;
u32 high_res_coef_en;
u32 horz_phase_step;
u32 vert_phase_step;
u32 slice_x_st;
u32 slice_x_end[4];
u32 pps_slice;
u32 phase_step_en;
u32 phase_step;
u32 vphase_type_top;
u32 vphase_type_bot;
};
struct vid_cmpr_f2v_vphase_s {
unsigned char rcv_num; //0~15
unsigned char rpt_num; // 0~3
unsigned short phase;
};
struct vid_cmpr_fgrain_s {
bool enable;
u32 is_afbc;
u32 start_x;
u32 end_x;
u32 start_y;
u32 end_y;
u32 color_fmt;
u32 color_depth;
u64 fgs_table_adr;
};
/* **************************************************************************/
/* ************************* function definitions ***************************/
/* **************************************************************************/
irqreturn_t vicp_isr_handle(int irq, void *dev_id);
irqreturn_t vicp_rdma_handle(int irq, void *dev_id);
void vicp_device_init(struct vicp_device_data_s device);
int vicp_process_config(struct vicp_data_config_s *data_config,
struct vid_cmpr_top_s *vid_cmpr_top);
int vicp_process_reset(void);
int vicp_process_task(struct vid_cmpr_top_s *vid_cmpr_top);
void set_vid_cmpr_crop(struct vid_cmpr_crop_s *crop_param);
void set_mif_stride(struct vid_cmpr_mif_s *mif, int *stride_y, int *stride_cb, int *stride_cr);
void set_vid_cmpr_shrink(int is_enable, int size, int mode_h, int mode_v);
void set_vid_cmpr_afbce(int enable, struct vid_cmpr_afbce_s *afbce, bool rdma_en);
void set_vid_cmpr_wmif(struct vid_cmpr_mif_s *wr_mif, int wrmif_en);
void set_vid_cmpr_rmif(struct vid_cmpr_mif_s *rd_mif, int urgent, int hold_line);
void set_vid_cmpr_scale(int is_enable, struct vid_cmpr_scaler_s *scaler);
void set_vid_cmpr_afbcd(int hold_line_num, bool rdma_en, struct vid_cmpr_afbcd_s *afbcd);
void set_vid_cmpr_hdr(struct vid_cmpr_hdr_s config);
#endif //_VICP_PROCESS_H_