blob: 91b325348700f16c09182f1878e28a88ffb97020 [file]
/* SPDX-License-Identifier: (GPL-2.0+ OR MIT) */
/*
* Copyright (c) 2019 Amlogic, Inc. All rights reserved.
*/
#ifndef _AMDV_H_
#define _AMDV_H_
/*#define V2_4_3*/
/* driver version */
#define DRIVER_VER "20240205"
#include <linux/types.h>
#include "amdv_pq_config.h"
#define DOLBY_VISION_LL_DISABLE 0
#define DOLBY_VISION_LL_YUV422 1
#define DOLBY_VISION_LL_RGB444 2
#define BYPASS_PROCESS 0
#define SDR_PROCESS 1
#define HDR_PROCESS 2
#define DV_PROCESS 3
#define HLG_PROCESS 4
#define DV_CORE1_RECONFIG_CNT 2
#define DV_CORE2_RECONFIG_CNT 120
#define EXT_MD_LEVEL_1 BIT(0)
#define EXT_MD_LEVEL_2 BIT(1)
#define EXT_MD_LEVEL_4 BIT(2)
#define EXT_MD_LEVEL_5 BIT(3)
#define EXT_MD_LEVEL_6 BIT(4)
#define EXT_MD_LEVEL_255 BIT(31)
#define TUNING_MODE_FORCE_ABSOLUTE 0x1
#define TUNING_MODE_EXTLEVEL_1_DISABLE 0x2
#define TUNING_MODE_EXTLEVEL_2_DISABLE 0x4
#define TUNING_MODE_EXTLEVEL_4_DISABLE 0x8
#define TUNING_MODE_EXTLEVEL_5_DISABLE 0x10
#define TUNING_MODE_EL_FORCE_DISABLE 0x20
#define VPP_VD1_DSC_CTRL 0x1a83
#define VIU_VD1_PATH_CTRL 0x1a73
#define VPP_VD2_DSC_CTRL 0x1a84
#define VPP_VD3_DSC_CTRL 0x1a85
#define AMDV_PATH_SWAP_CTRL1 0x1a70
#define AMDV_PATH_SWAP_CTRL2 0x1a71
#define MALI_AFBCD_TOP_CTRL 0x1a0f
#define MALI_AFBCD1_TOP_CTRL 0x1a55
#define FLAG_FORCE_CVM 0x01
#define FLAG_BYPASS_CVM 0x02
#define FLAG_BYPASS_VPP 0x04
#define FLAG_USE_SINK_MIN_MAX 0x08
#define FLAG_CLKGATE_WHEN_LOAD_LUT 0x10
#define FLAG_SINGLE_STEP 0x20
#define FLAG_CERTIFICATION 0x40
#define FLAG_CHANGE_SEQ_HEAD 0x80
#define FLAG_DISABLE_COMPOSER 0x100
#define FLAG_BYPASS_CSC 0x200
#define FLAG_CHECK_ES_PTS 0x400
#define FLAG_DISABE_CORE_SETTING 0x800
#define FLAG_DISABLE_DMA_UPDATE 0x1000
#define FLAG_DISABLE_DV_OUT 0x2000
#define FLAG_FORCE_DV_LL 0x4000
#define FLAG_FORCE_RGB_OUTPUT 0x8000
#define FLAG_DOVI2HDR10_NOMAPPING 0x100000
#define FLAG_PRIORITY_GRAPHIC 0x200000
#define FLAG_DISABLE_LOAD_VSVDB 0x400000
#define FLAG_DISABLE_CRC 0x800000
#define FLAG_ENABLE_EL 0x1000000
#define FLAG_DEBUG_CORE2_TIMING 0x2000000
#define FLAG_MUTE 0x4000000
#define FLAG_FORCE_HDMI_PKT 0x8000000
#define FLAG_SINGLE_STEP_PIP 0x10000000
#define FLAG_RX_EMP_VSEM 0x20000000
#define FLAG_TOGGLE_FRAME 0x80000000
#define VSEM_IF_BUF_SIZE 4096
#define VSEM_PKT_SIZE 31
#define DMA_BUF_CNT 2
#define TOP1_REG_NUM 211 /*real reg 209*/
#define TOP1B_REG_NUM 12 /*real reg 11*/
#define TOP2_REG_NUM 617 /*real reg 615*/
#define TOP1_LUT_NUM 149
#define TOP2_LUT_NUM 424
#define EXT_DM_SIZE 80812
#define PYRAMID_SW_RST 1 /*NO need set pylevel before vsync*/
#define PYRAMID_BUF_CNT 3
#define DEBUG_HW5_RESET_EACH_VSYNC 0x1
#define DEBUG_HW5_TOGGLE_EACH_VSYNC 0x2
#define DEBUG_HW5_NO_LEVEL 0x4
#define DEBUG_HW5_SEVEN_LEVEL 0x8
#define DEBUG_ENABLE_TOP2_INT 0x10
#define DEBUG_FIXED_LUT 0x20
#define DEBUG_FIXED_REG 0x40
#define DEBUG_5065_RGB_BUG 0x80
#define DEBUG_SDR2020_FORCE_HLG 0x100
#define DEBUG_FORCE_BYPASS_PRECISION_RENDERING 0x200
#define DEBUG_FORCE_ZERO_PYRAMID 0x400
#define DEBUG_AUTOMATICALLY_PYRAMID 0x800
#define DEBUG_FORCE_BYPASS_TOP2 0x1000
#define HDMI_ONLY_UPDATE_HIST_FOR_NEW_FRAME 0x2000 /*case5351 5356*/
#define FORCE_ONE_SLICE 0x4000 /*case5011b 5055a 5055b*/
#define DEBUG_IGNORE_IOCTL 0x8000
#define MAX_CFG_SIZE (1024 * 10)
#define MAX_BIN_SIZE (1024 * 150)
#define HLG_MIN 1310
#define HLG_MAX 262144000
enum core1_switch_type {
NO_SWITCH = 0,
SWITCH_BEFORE_DVCORE_1,
SWITCH_BEFORE_DVCORE_2,
SWITCH_AFTER_DVCORE,
};
enum core3_switch_type {
CORE3_AFTER_WM = 0,
CORE3_AFTER_OSD1_HDR,
CORE3_AFTER_VD2_HDR,
};
enum core_type {
AMDV_TVCORE = 0,
AMDV_CORE1A,
AMDV_CORE1B,
AMDV_CORE1C,
AMDV_CORE2A,
AMDV_CORE2B,
AMDV_CORE2C,
AMDV_HW5,
};
enum input_mode_enum {
IN_MODE_OTT = 0,
IN_MODE_HDMI = 1,
IN_MODE_GRAPHICS = 2
};
struct ui_menu_params {
u16 u16_backlight_ui_val;
u16 u16_brightness_ui_val;
u16 u16_contrast_ui_val;
};
enum signal_format_enum {
FORMAT_INVALID = -1,
FORMAT_DOVI = 0,
FORMAT_HDR10 = 1,
FORMAT_SDR = 2,/*FORMAT_SDR8*/
FORMAT_DOVI_LL = 3,
FORMAT_HLG = 4,
FORMAT_HDR10PLUS = 5,
FORMAT_SDR_2020 = 6,
FORMAT_MVC = 7,
FORMAT_SDR10 = 8,
FORMAT_HDR8 = 9,
FORMAT_CUVA = 10,
FORMAT_PRIMESL = 11
};
enum priority_mode_enum {
V_PRIORITY = 0,
G_PRIORITY = 1,
VIDEO_PRIORITY_DELAY = 2
};
enum cp_chroma_format_enum {
CP_P420 = 0,
CP_UYVY = 1,
CP_P444 = 2,
CP_I444 = 3
};
enum cp_signal_range_enum {
SIGNAL_RANGE_SMPTE = 0,
SIGNAL_RANGE_FULL = 1,
SIGNAL_RANGE_SDI = 2
};
enum cp_clr_enum {
CP_YUV = 0,
CP_RGB = 1,
CP_IPT = 2
};
enum graphics_format_enum {
G_SDR_YUV = 0,
G_SDR_RGB = 1,
G_HDR_YUV = 2,
G_HDR_RGB = 3
};
enum dv_type_enum {
DV_TYPE_DOVI = 0,
DV_TYPE_ATSC = 1,
DV_TYPE_DVB = 2
};
enum cfg_cap {
CFG_NONE = 0,
CFG_ENABLE_PRECISION,
CFG_ENABLE_L1L4,
};
struct dm_reg_ipcore2 {
u32 s_range;
u32 s_range_inverse;
u32 y2rgb_coeff1;
u32 y2rgb_coeff2;
u32 y2rgb_coeff3;
u32 y2rgb_coeff4;
u32 y2rgb_coeff5;
u32 y2rgb_off1;
u32 y2rgb_off2;
u32 y2rgb_off3;
u32 frame_fmt;
u32 eotf;
u32 a2b_coeff1;
u32 a2b_coeff2;
u32 a2b_coeff3;
u32 a2b_coeff4;
u32 a2b_coeff5;
u32 c2d_coeff1;
u32 c2d_coeff2;
u32 c2d_coeff3;
u32 c2d_coeff4;
u32 c2d_coeff5;
u32 c2d_off;
u32 vdr_res;
};
struct dm_reg_ipcore3 {
u32 d2c_coeff1;
u32 d2c_coeff2;
u32 d2c_coeff3;
u32 d2c_coeff4;
u32 d2c_coeff5;
u32 b2a_coeff1;
u32 b2a_coeff2;
u32 b2a_coeff3;
u32 b2a_coeff4;
u32 b2a_coeff5;
u32 eotf_param1;
u32 eotf_param2;
u32 ipt_scale;
u32 ipt_off1;
u32 ipt_off2;
u32 ipt_off3;
u32 output_range1;
u32 output_range2;
u32 rgb2yuv_coeff_reg1;
u32 rgb2yuv_coeff_reg2;
u32 rgb2yuv_coeff_reg3;
u32 rgb2yuv_coeff_reg4;
u32 rgb2yuv_coeff_reg5;
u32 rgb2yuv_off0;
u32 rgb2yuv_off1;
u32 rgb2yuv_off2;
};
/*hdmi metadata for core3 */
struct md_reg_ipcore3 {
u32 raw_metadata[512];
u32 size;
};
struct hdr10_infoframe {
u8 type_code;
u8 version_number;
u8 len_of_info_frame;
u8 data_byte1;
u8 data_byte2;
u8 primaries_x_0_lsb;
u8 primaries_x_0_msb;
u8 primaries_y_0_lsb;
u8 primaries_y_0_msb;
u8 primaries_x_1_lsb;
u8 primaries_x_1_msb;
u8 primaries_y_1_lsb;
u8 primaries_y_1_msb;
u8 primaries_x_2_lsb;
u8 primaries_x_2_msb;
u8 primaries_y_2_lsb;
u8 primaries_y_2_msb;
u8 white_point_x_lsb;
u8 white_point_x_msb;
u8 white_point_y_lsb;
u8 white_point_y_msb;
u8 max_display_mastering_lum_lsb;
u8 max_display_mastering_lum_msb;
u8 min_display_mastering_lum_lsb;
u8 min_display_mastering_lum_msb;
u8 max_content_light_level_lsb;
u8 max_content_light_level_msb;
u8 max_frame_avg_light_level_lsb;
u8 max_frame_avg_light_level_msb;
};
struct hdr10_parameter {
u32 min_display_mastering_lum;
u32 max_display_mastering_lum;
u16 r_x;
u16 r_y;
u16 g_x;
u16 g_y;
u16 b_x;
u16 b_y;
u16 w_x;
u16 w_y;
u16 max_content_light_level;
u16 max_frame_avg_light_level;
};
struct ext_level_1 {
u8 min_pq_h;
u8 min_pq_l;
u8 max_pq_h;
u8 max_pq_l;
u8 avg_pq_h;
u8 avg_pq_l;
};
struct ext_level_2 {
u8 target_max_pq_h;
u8 target_max_pq_l;
u8 trim_slope_h;
u8 trim_slope_l;
u8 trim_off_h;
u8 trim_off_l;
u8 trim_power_h;
u8 trim_power_l;
u8 trim_chroma_weight_h;
u8 trim_chroma_weight_l;
u8 trim_sat_gain_h;
u8 trim_sat_gain_l;
u8 ms_weight_h;
u8 ms_weight_l;
};
struct ext_level_4 {
u8 anchor_pq_h;
u8 anchor_pq_l;
u8 anchor_power_h;
u8 anchor_power_l;
};
struct ext_level_5 {
u8 active_area_left_off_h;
u8 active_area_left_off_l;
u8 active_area_right_off_h;
u8 active_area_right_off_l;
u8 active_area_top_off_h;
u8 active_area_top_off_l;
u8 active_area_bot_off_h;
u8 active_area_bot_off_l;
};
struct ext_level_6 {
u8 max_display_mastering_lum_h;
u8 max_display_mastering_lum_l;
u8 min_display_mastering_lum_h;
u8 min_display_mastering_lum_l;
u8 max_content_light_level_h;
u8 max_content_light_level_l;
u8 max_frame_avg_light_level_h;
u8 max_frame_avg_light_level_l;
};
struct ext_level_254 {
u8 mode;
u8 version_index;
};
struct ext_level_255 {
u8 run_mode;
u8 run_version;
u8 dm_debug_0;
u8 dm_debug_1;
u8 dm_debug_2;
u8 dm_debug_3;
};
struct ext_md_s {
u32 avail_level_mask;
struct ext_level_1 level_1;
struct ext_level_2 level_2;
struct ext_level_4 level_4;
struct ext_level_5 level_5;
struct ext_level_6 level_6;
struct ext_level_255 level_255;
};
struct dovi_setting_s {
struct composer_reg_ipcore comp_reg;
struct dm_reg_ipcore1 dm_reg1;
struct dm_reg_ipcore2 dm_reg2;
struct dm_reg_ipcore3 dm_reg3;
struct dm_lut_ipcore dm_lut1;
struct dm_lut_ipcore dm_lut2;
/* for dovi output */
struct md_reg_ipcore3 md_reg3;
/* for hdr10 output */
struct hdr10_infoframe hdr_info;
/* current process */
enum signal_format_enum src_format;
enum signal_format_enum dst_format;
/* enhanced layer */
bool el_flag;
bool el_halfsize_flag;
/* frame width & height */
u32 video_width;
u32 video_height;
/* use for stb 2.4 */
enum graphics_format_enum g_format;
u32 g_bitdepth;
u32 dovi2hdr10_nomapping;
u32 use_ll_flag;
u32 ll_rgb_desired;
u32 diagnostic_enable;
u32 diagnostic_mux_select;
u32 dovi_ll_enable;
u32 vout_width;
u32 vout_height;
u8 vsvdb_tbl[32];
struct ext_md_s ext_md;
u32 vsvdb_len;
u32 vsvdb_changed;
u32 mode_changed;
};
#define NUM_INST 15
#define NUM_IPCORE1 2
#define NUM_IPCORE2 1
#define IPCORE2_ID NUM_IPCORE1
#define OUTPUT_CONTROL_DATA_SIZE 0x1000
#define TOP2_NUM_MAX 1
#define CASE0_TOP1_READFROM_ARRAY 1
#define CASE0_TOP1_READFROM_FILE 2
#define CASE5344_TOP1_READFROM_FILE 3
#define CASE5363_TOP1_READFROM_FILE 4
struct dovi_setting_video_s {
struct composer_reg_ipcore comp_reg;
struct dm_reg_ipcore1 dm_reg;
struct dm_lut_ipcore dm_lut;
};
struct private_info_s {
int valid; /*1: input is valid; 0: input is invalid*/
enum signal_format_enum src_format;
/* enhanced layer */
bool el_flag;
bool el_halfsize_flag;
/* frame width & height */
u32 video_width;
u32 video_height;
/* Dovi LL or non Dovi */
int set_bit_depth;
enum cp_chroma_format_enum set_chroma_format;
enum cp_signal_range_enum set_yuv_range;
enum cp_clr_enum color_format;
char *in_comp;
int in_comp_size;
char *in_md;
int in_md_size;
char *vsem_if;
int vsem_if_size;
enum input_mode_enum input_mode;
int use_primaries_for_dv;
struct hdr10_parameter *p_hdr10_param;
};
enum ctrl_data_type_enum {
TYPE_INVALID = -1,
TYPE_VSIF = 0,
TYPE_VSEM = 1
};
enum cp_dv_type_eunm {
SRC_TYPE_NONDOVI = 0x0, /*output is not amdv*/
SRC_TYPE_DV = 0x1, /*input is dv content, and output is amdv. */
SRC_TYPE_HDR10 = 0x3, /*input is HDR10, and output is a amdv. */
SRC_TYPE_SDR = 0x5, /*input is SDR, and output is a amdv*/
SRC_TYPE_HLG = 0x7 /*input is HLG, and output is a amdv */
};
struct vsif_parameter_s {
int lowlatency;
int backlight_ctrl_md_present;
int src_dm_version;
int eff_tmax_pq;
enum cp_dv_type_eunm dobly_vision_signal;
int auxi_md_present;
int l11_md_present;
u8 auxi_runmode;
u8 auxi_runversion;
u8 auxi_debug0;
u8 content_type;
u8 intended_white_point;
u8 l11_byte2;
u8 l11_byte3;
int bt2020_container;
};
struct content_info_s {
u8 content_type_info;
u8 white_point;
u8 l11_byte2;
u8 l11_byte3;
};
struct m_dovi_setting_s {
/*input to dv lib*/
int num_input;
int num_video;
int pri_input;
int enable_multi_core1;
int enable_debug;
enum priority_mode_enum set_priority;
u32 dovi2hdr10_nomapping;
u32 use_ll_flag;
u32 ll_rgb_desired;
u32 vout_width;
u32 vout_height;
u8 vsvdb_tbl[32];
u32 vsvdb_len;
u32 vsvdb_changed;
u32 mode_changed;
enum signal_format_enum dst_format;
/*private info for each instance*/
struct private_info_s input[NUM_IPCORE1 + NUM_IPCORE2];
/*only used for graphic*/
int set_graphic_min_lum;
int set_graphic_max_lum;
int set_target_min_lum;
int set_target_max_lum;
/*get from dv lib*/
struct dovi_setting_video_s core1[NUM_IPCORE1];
struct dm_reg_ipcore2 dm_reg2;
struct dm_reg_ipcore3 dm_reg3;
struct dm_lut_ipcore dm_lut2;
/* for dovi output */
struct md_reg_ipcore3 md_reg3;
/* for hdr10 output */
struct hdr10_infoframe hdr_info;
u32 diagnostic_enable;
u32 diagnostic_mux_select;
u32 dovi_ll_enable;
struct ext_md_s ext_md;
/*output vsif info from cp*/
struct vsif_parameter_s output_vsif;
u8 *output_ctrl_data; /* vsem or vsif */
u32 output_ctrl_data_len;
enum ctrl_data_type_enum ctrl_data_type;
struct content_info_s content_info;/*copy src content infos*/
/*reserved*/
u32 reserved[128];/*user_l11+content_type+wp+byte2+byte3*/
};
struct dv_inst_s {
char *md_buf[2];
char *comp_buf[2];
int current_id;/*metadata id*/
u32 last_total_md_size;
u32 last_total_comp_size;
bool last_mel_mode;
struct hdr10_parameter hdr10_param;
struct vframe_s *dv_vf[16][2];
u32 frame_count;
u32 amdv_src_format;/*kernel side*/
enum signal_format_enum src_format;/*ko side*/
int amdv_wait_count;
bool amdv_wait_init;
bool dv_unique_drm;
void *metadata_parser;
bool mapped;
int layer_id;/*display on vd1 or vd2*/
int valid;
/* enhanced layer */
bool el_flag;
bool el_halfsize_flag;
/* frame width & height */
u32 video_width;
u32 video_height;
/* Dovi LL or non Dovi */
int set_bit_depth;
enum cp_chroma_format_enum set_chroma_format;
enum cp_signal_range_enum set_yuv_range;
enum cp_clr_enum color_format;
char *in_comp;
int in_comp_size;
char *in_md;
int in_md_size;
char *vsem_if;
int vsem_if_size;
enum input_mode_enum input_mode;
u32 err_parse_cnt;
};
/*hw5 video info*/
struct video_inst_s {
char *md_buf[2];
char *comp_buf[2];
int current_id;/*metadata id*/
u32 last_total_md_size;
u32 last_total_comp_size;
bool last_mel_mode;
struct hdr10_parameter hdr10_param;
struct vframe_s *dv_vf[16][2];
u32 frame_count;
u32 amdv_src_format;/*kernel side*/
enum signal_format_enum src_format;/*ko side*/
int amdv_wait_count;
bool amdv_wait_init;
bool dv_unique_drm;
void *metadata_parser;
/* enhanced layer */
bool el_flag;
/* frame width & height */
u32 video_width;
u32 video_height;
/* Dovi LL or non Dovi */
int set_bit_depth;
enum input_mode_enum input_mode;
bool tv_dovi_setting_change_flag;
u32 last_play_id;
};
struct dv_core1_inst_s {
bool core1_on;
bool amdv_setting_video_flag;
u32 core1_on_cnt;
u32 run_mode_count;
u32 core1_disp_hsize;
u32 core1_disp_vsize;
};
struct core_inst_s {
bool core_on;
bool amdv_setting_video_flag;
u32 core_on_cnt;
u32 run_mode_count;
u32 core_disp_hsize;
u32 core_disp_vsize;
u32 py_level;
};
struct tv_input_info_s {
s16 brightness_off[8][2];
s32 content_fps;
s32 gd_rf_adjust;
s32 tid;
u8 content_type;
u8 white_point;
u8 L11_byte2;
u8 L11_byte3;
int enable_debug;
int enable_hlg_src_max_set;
s32 debug_buf[494];
};
/* top1 output L1/L4*/
struct l1l4_stats {
u16 l1_min;
u16 l1_max;
u16 l1_mid;
u16 l4_std;
};
/* top1 output L1/L4 and Histogram */
struct top1_stats_info {
struct l1l4_stats top1_l1l4;
u16 hist[128];
bool enable;
};
struct backlight_info {
u32 value;
bool set_flag;
};
#define MAX_BL_COUNT 30
#define PREFIX_SEI_NUT_NAL 39
#define SUFFIX_SEI_NUT_NAL 40
#define SEI_ITU_T_T35 4
#define SEI_TYPE_MASTERING_DISP_COLOUR_VOLUME 137
#define ATSC_T35_PROV_CODE 0x0031
#define DVB_T35_PROV_CODE 0x003B
#define ATSC_USER_ID_CODE 0x47413934
#define DVB_USER_ID_CODE 0x00000000
#define DM_MD_USER_TYPE_CODE 0x09
#define MAX_LEN_2086_SEI 256
#define MAX_LEN_2094_SEI 256
/* vui params for ATSC 3.0*/
struct dv_vui_parameters {
s32 video_fmt_i;
s32 video_fullrange_b;
s32 color_description_b;
s32 color_primaries_i;
s32 trans_characteristic_i;
s32 matrix_coeff_i;
};
/* atsc related params.*/
struct dv_atsc {
struct dv_vui_parameters vui_param;
u32 len_2086_sei;
u8 sei_2086[MAX_LEN_2086_SEI];
u32 len_2094_sei;
u8 sei_2094[MAX_LEN_2094_SEI];
};
enum cpu_id_e {
_CPU_MAJOR_ID_GXM,
_CPU_MAJOR_ID_TXLX,
_CPU_MAJOR_ID_G12,
_CPU_MAJOR_ID_TM2,
_CPU_MAJOR_ID_TM2_REVB,
_CPU_MAJOR_ID_SC2,
_CPU_MAJOR_ID_T7,
_CPU_MAJOR_ID_T3,
_CPU_MAJOR_ID_S4D,
_CPU_MAJOR_ID_T5W,
_CPU_MAJOR_ID_T5M,
_CPU_MAJOR_ID_S5,
_CPU_MAJOR_ID_T3X,
_CPU_MAJOR_ID_S7D,
_CPU_MAJOR_ID_S6,
_CPU_MAJOR_ID_UNKNOWN,
};
enum top2_source {
FROM_VDIN0 = 0,
FROM_VD1 = 1,
FROM_DI = 2,
FROM_VDIN1 = 3
};
struct top1_pyramid_addr {
void *py_vaddr[7];
dma_addr_t top1_py_paddr[7];
u32 top1_py_size[7];
};
struct ovlp_win_para {
u32 ovlp_win_en;
u32 ovlp_win_hsize;
u32 ovlp_win_vsize;
u32 ovlp_win_hbgn;
u32 ovlp_win_hend;
u32 ovlp_win_vbgn;
u32 ovlp_win_vend;
};
struct dv_device_data_s {
enum cpu_id_e cpu_id;
};
struct amdolby_vision_port_t {
const char *name;
struct device *dev;
const struct file_operations *fops;
void *runtime;
};
struct lut_dma_info_s {
u32 dma_total_size;
u32 dma_top2_size;
dma_addr_t dma_paddr;
dma_addr_t dma_paddr_top2;
void *dma_vaddr;
void *dma_vaddr_top2;
};
/***extern****/
extern const struct dolby_vision_func_s *p_funcs_stb;
extern const struct dolby_vision_func_s *p_funcs_tv;
extern const struct dolby_vision_func_s *p_funcs_m_stb;
extern bool force_stb_mode;
extern unsigned int debug_dolby;
extern unsigned int dolby_vision_flags;
extern uint amdv_mask;
extern bool dolby_vision_on;
extern bool amdv_core1_on;
extern u32 amdv_core1_on_cnt;
extern u32 amdv_core2_on_cnt[2];
extern uint amdv_on_count;
extern struct dv_core1_inst_s dv_core1[NUM_IPCORE1];
extern uint amdv_run_mode;
extern uint amdv_run_mode_delay;
extern struct tv_dovi_setting_s *tv_dovi_setting;
extern struct dovi_setting_s dovi_setting;
extern struct dovi_setting_s new_dovi_setting;
extern struct m_dovi_setting_s m_dovi_setting;
extern struct m_dovi_setting_s new_m_dovi_setting;
extern struct m_dovi_setting_s invalid_m_dovi_setting;
extern bool multi_dv_mode;
extern u32 dolby_vision_mode;
extern u32 dolby_vision_status;
extern u32 amdv_reset;
extern u32 amdv_target_mode;
extern u32 dolby_vision_request_mode;
extern u32 dolby_vision_policy;
extern u32 dolby_vision_ll_policy;
extern u32 last_dolby_vision_ll_policy;
extern bool amdv_setting_video_flag;
extern u32 bl_delay_cnt;
extern struct backlight_info tv_backlight[MAX_BL_COUNT];
extern bool tv_backlight_changed;
extern bool tv_backlight_force_update;
extern u32 crc_count;
extern u32 setting_update_count;
extern void *pq_config_fake;
extern void *pq_config_dvp_fake;
extern void *pq_config_dvp_fake_top1;
extern struct dv_inst_s dv_inst[NUM_INST];
extern int hdmi_path_id;
extern u32 dv_cert_graphic_width;
extern u32 dv_cert_graphic_height;
extern bool force_set_lut;
extern int use_target_lum_from_cfg;
extern s16 brightness_off[8][2];
extern bool disable_aoi;
extern u32 aoi_info[2][4];
extern int debug_disable_aoi;
extern bool update_aoi_info;
extern int debug_dma_start_line;
extern unsigned int debug_vpotch;
extern int copy_core1a;
extern int core2_sel;
extern bool force_bypass_from_prebld_to_vadj1;
extern struct hdr10_parameter hdr10_param;
extern int cur_valid_video_num;
extern struct vpp_post_info_t core3_slice_info;
//extern int (*get_osd_status)(u32 index);
extern char *vsem_if_buf;
extern char *vsem_md_buf;
extern int enable_vf_check;
extern int force_hdmin_fmt;
extern char dv_provider[2][32];
extern unsigned int force_mel;
extern int force_hdmin_fmt;
extern bool amdv_el_disable;
extern bool amdv_wait_on;
extern bool force_runmode;
extern struct tv_input_info_s *tv_input_info;
extern u32 amdv_tuning_mode;
extern bool ambient_update;
extern struct ambient_cfg_s ambient_config_new;
extern u32 ambient_test_mode;
extern int gd_rf_adjust;
extern bool pq_config_set_flag;
extern bool best_pq_config_set_flag;
extern u32 force_best_pq;
extern bool tv_dovi_setting_change_flag;
extern bool dovi_setting_update_flag;
extern struct ui_menu_params menu_param;
extern struct ambient_cfg_s ambient_darkdetail;
extern u32 hdmi_frame_count;
extern u32 sdr_ref_mode;
extern bool need_update_cfg;
extern u32 debug_ko;
extern int debug_cp_res;
extern u32 force_update_reg;
extern const char *input_str[11];
extern bool module_installed;
extern struct top1_pyramid_addr top1_py_addr;
extern void *top1_reg_buf;
extern void *top1b_reg_buf;
extern void *top1_lut_buf;
extern void *top2_reg_buf;
extern void *top2_lut_buf;
extern u32 top1_reg_num;
extern u32 top1b_reg_num;
extern u32 top1_lut_num;
extern u32 top2_reg_num;
extern u32 top2_lut_num;
extern struct lut_dma_info_s lut_dma_info[DMA_BUF_CNT];
extern bool lut_dma_support;
extern int cur_dmabuf_id;
extern bool enable_top1;//todo
extern bool top1_done;
extern struct core_inst_s top1_info;
extern struct core_inst_s top2_info;
extern struct tv_hw5_setting_s *tv_hw5_setting;
extern struct tv_hw5_setting_s *invalid_hw5_setting;
extern struct tv_hw5_setting_s *last_tv_hw5_setting;
extern u32 hw5_reg_from_file;
extern u32 test_dv;
extern struct video_inst_s top1_v_info;/*video info*/
extern struct video_inst_s top2_v_info;/*video info*/
extern struct top1_pyramid_addr py_addr[PYRAMID_BUF_CNT];
extern u8 py_wr_id;
extern u8 py_rd_id;
extern struct dolby5_top1_md_hist dv5_md_hist;
extern int force_top1_enable;
extern u32 fix_data;
extern u8 *y_vaddr;
extern u8 *uv_vaddr;
extern bool force_enable_top12_lut;
extern u32 content_fps;
extern u32 variable_fps_mode;
extern u32 num_downsamplers;
extern u32 force_sdr10;
extern u32 need_pps;
extern u32 trace_amdv_isr;
extern u32 force_top1_vskip;
extern int pyramid_read_urgent;
extern bool py_enabled;
extern bool l1l4_enabled;
extern u32 l1l4_distance;
extern bool ignore_top1_result;
extern bool force_ignore_top1_result;
extern u8 force_drm[32];
extern bool dv_unique_drm;
extern char *cfg_data;
extern char *bin_data;
extern int cfg_size;
extern int bin_size;
extern u32 vpp_vsync_id;
extern int force_vsync_id;
extern bool force_bypass_precision;
extern bool force_bypass_pd_level0;
extern bool force_bypass_precision_once;
extern bool miss_top1_and_bypass_pr_once;
extern bool update_top2_control_path_flag;
extern bool disable_detunnel;
extern u32 top1_scale;
extern bool enable_top1_scale;
extern bool wait_first_frame_top1;
extern const char level_str[4][10];
extern bool update_top2_cfg;
extern u32 last_top2_ro5;
extern u32 last_top2_ro4;
extern u32 last_top2_ro3;
extern u32 last_top2_ro2;
extern u32 last_top2_ro1;
extern u32 last_top2_ro0;
extern u32 last_top1_ro6;
extern u32 last_top1_ro5;
extern u32 last_top1_ro4;
extern u32 last_top1_ro3;
extern u32 last_top1_ro2;
extern u32 last_top1_ro1;
extern u32 last_top1_ro0;
extern u32 enable_ro_check;
extern bool force_core2c_on;
extern bool bypass_detunnel;
extern u32 lightsense_test_mode;
extern u32 hlg_max;
extern u32 hlg_min;
extern unsigned int bypass_core1a_composer;
extern unsigned int bypass_core1b_composer;
extern unsigned int core1_bypass;
extern unsigned int vtotal_add;
extern unsigned int g_vtiming;
extern uint debug_rdmif;
/************/
#define pr_dv_dbg(fmt, args...)\
do {\
if (debug_dolby)\
pr_info("AMDV: " fmt, ## args);\
} while (0)
#define pr_dv_error(fmt, args...)\
pr_info("AMDV ERROR: " fmt, ## args)
int control_path
(enum signal_format_enum in_format,
enum signal_format_enum out_format,
char *in_comp, int in_comp_size,
char *in_md, int in_md_size,
enum priority_mode_enum set_priority,
int set_bit_depth, int set_chroma_format, int set_yuv_range,
int set_graphic_min_lum, int set_graphic_max_lum,
int set_target_min_lum, int set_target_max_lum,
int set_no_el,
struct hdr10_parameter *hdr10_param,
struct dovi_setting_s *output);
int multi_control_path(struct m_dovi_setting_s *cp_para);
struct tv_dovi_setting_s {
u64 core1_reg_lut[3754];
/* current process */
enum signal_format_enum src_format;
enum signal_format_enum dst_format;
/* enhanced layer */
bool el_flag;
bool el_halfsize_flag;
/* frame width & height */
u32 video_width;
u32 video_height;
enum input_mode_enum input_mode;
u16 backlight;
};
int tv_control_path
(enum signal_format_enum in_format,
enum input_mode_enum in_mode,
char *in_comp, int in_comp_size,
char *in_md, int in_md_size,
int set_bit_depth, int set_chroma_format, int set_yuv_range,
struct pq_config *pq_config,
struct ui_menu_params *menu_param,
int set_no_el,
struct hdr10_parameter *hdr10_param,
struct tv_dovi_setting_s *output,
char *vsem_if, int vsem_if_size,
struct ambient_cfg_s *ambient_cfg,
struct tv_input_info_s *input_info);
struct video_info_s {
int valid; /*1: input is valid; 0: input is invalid*/
/* frame width & height */
u32 video_width;
u32 video_height;
int src_format;
int input_mode;
char *in_comp;
int in_comp_size;
char *in_md;
int in_md_size;
int set_bit_depth;
int set_chroma_format;
int set_yuv_range;
int color_format;
char *vsem_if;
int vsem_if_size;
/* enhanced layer */
bool el_flag;
};
struct tv_hw5_setting_s {
/*input to dv lib*/
int num_input;
int num_video;
int pri_input;
int enable_multi_top2;
int enable_debug;
int dither_bdp;
int force_num_slices;
int num_ext_downsamplers;
int L1L4_distance;
int analyzer;/*for top1*/
/*input video private info*/
struct video_info_s top1;
struct video_info_s top2;
/*input shared info*/
struct hdr10_parameter *hdr10_param;
struct pq_config_dvp *pq_config;
struct ui_menu_params *menu_param;
struct dynamic_cfg_s *dynamic_cfg;
struct tv_input_info_s *input_info;
int use_primaries_for_dv;
s32 bt2020_container;
s32 hdr_ui;
int frame_rate;
/*top1 l1l4 and histogram*/
struct top1_stats_info top1_stats;
/*output*/
u64 top1_reg[TOP1_REG_NUM];
u64 top1b_reg[TOP1B_REG_NUM];
u64 top2_reg[TOP2_REG_NUM];
u64 top1_lut[TOP1_LUT_NUM * 2];
u64 top2_lut[TOP2_LUT_NUM * 2];
u8 *top1_ext;
u8 *top2_ext;
u16 backlight;
/*reserved*/
u32 reserved[128];
};
struct dv5_top1_vd_info {
u32 width;
u32 height;
u32 compWidth;
u32 compHeight;
u32 buf_width;
u32 buf_height;
int bitdepth;
int type;
u32 plane;
u32 blk_mode;
u32 linear_mode;
u32 burst_len;
ulong canvasaddr[3];
ulong compHeadAddr;
ulong compBodyAddr;
};
extern struct dv5_top1_vd_info top1_vd_info;
int tv_hw5_control_path(struct tv_hw5_setting_s *cp_para);
int tv_hw5_control_path_analyzer(struct tv_hw5_setting_s *cp_para);
struct dolby_vision_func_s {
const char *version_info;
void * (*metadata_parser_init)(int flag);
/*flag: bit0 flag, bit1 0->dv, 1->atsc*/
int (*metadata_parser_reset)(int flag);
int (*metadata_parser_process)(char *src_rpu,
int rpu_len,
char *dst_comp,
int *comp_len,
char *dst_md,
int *md_len,
bool src_eos);
void (*metadata_parser_release)(void);
int (*control_path)(enum signal_format_enum in_format,
enum signal_format_enum out_format,
char *in_comp, int in_comp_size,
char *in_md, int in_md_size,
enum priority_mode_enum set_priority,
int set_bit_depth, int set_chroma_format,
int set_yuv_range, int set_graphic_min_lum,
int set_graphic_max_lum,
int set_target_min_lum,
int set_target_max_lum,
int set_no_el,
struct hdr10_parameter *hdr10_param,
struct dovi_setting_s *output);
int (*tv_control_path)(enum signal_format_enum in_format,
enum input_mode_enum in_mode,
char *in_comp, int in_comp_size,
char *in_md, int in_md_size,
int set_bit_depth, int set_chroma_format,
int set_yuv_range,
struct pq_config *pq_config,
struct ui_menu_params *menu_param,
int set_no_el,
struct hdr10_parameter *hdr10_param,
struct tv_dovi_setting_s *output,
char *vsem_if, int vsem_if_size,
struct ambient_cfg_s *ambient_cfg,
struct tv_input_info_s *input_info);
int (*multi_control_path)(struct m_dovi_setting_s *cp_para);
void *(*multi_mp_init)(int flag);
int (*multi_mp_reset)(void *ctx_arg, int flag);
int (*multi_mp_process)(void *ctx_arg,
char *src_rpu, int rpu_len,
char *dst_comp, int *comp_len,
char *dst_md, int *md_len, bool src_eos,
enum dv_type_enum input_format);
void (*multi_mp_release)(void **ctx_arg);
int (*tv_hw5_control_path)(struct tv_hw5_setting_s *cp_para);
int (*tv_hw5_control_path_analyzer)(struct tv_hw5_setting_s *cp_para);
};
int register_dv_functions(const struct dolby_vision_func_s *func);
int unregister_dv_functions(void);
#ifndef CONFIG_AMLOGIC_MEDIA_VSYNC_RDMA
#define VSYNC_WR_MPEG_REG(adr, val) WRITE_VPP_REG(adr, val)
#define VSYNC_RD_MPEG_REG(adr) READ_VPP_REG(adr)
#define VSYNC_WR_MPEG_REG_BITS(adr, val, start, len) \
WRITE_VPP_REG_BITS(adr, val, start, len)
#else
int VSYNC_WR_MPEG_REG_BITS(u32 adr, u32 val, u32 start, u32 len);
u32 VSYNC_RD_MPEG_REG(u32 adr);
int VSYNC_WR_MPEG_REG(u32 adr, u32 val);
#endif
void dv_mem_power_on(enum vpu_mod_e mode);
void dv_mem_power_off(enum vpu_mod_e mode);
int get_dv_mem_power_flag(enum vpu_mod_e mode);
bool is_aml_gxm(void);
bool is_aml_g12(void);
bool is_aml_box(void);
bool is_aml_txlx(void);
bool is_aml_txlx_tvmode(void);
bool is_aml_txlx_stbmode(void);
bool is_aml_tm2(void);
bool is_aml_tm2_tvmode(void);
bool is_aml_tm2_stbmode(void);
bool is_aml_stb_hdmimode(void);
bool is_aml_tvmode(void);
bool is_aml_tm2revb(void);
bool is_aml_sc2(void);
bool is_aml_s4d(void);
bool is_aml_t7(void);
bool is_aml_t7_tvmode(void);
bool is_aml_t7_stbmode(void);
bool is_aml_t3(void);
bool is_aml_t3_tvmode(void);
bool is_aml_t5w(void);
bool is_aml_t5m(void);
bool is_amdv_stb_mode(void);
bool is_aml_s5(void);
bool is_aml_t3x(void);
bool is_aml_hw5(void);
bool is_aml_s7d(void);
bool is_aml_s6(void);
u32 VSYNC_RD_DV_REG(u32 adr);
int VSYNC_WR_DV_REG(u32 adr, u32 val);
int VSYNC_WR_DV_REG_BITS(u32 adr, u32 val, u32 start, u32 len);
u32 READ_VPP_DV_REG(u32 adr);
int WRITE_VPP_DV_REG(u32 adr, const u32 val);
int WRITE_VPP_DV_REG_BITS(u32 adr, const u32 val, u32 start, u32 len);
int tv_dv_core1_set(u64 *dma_data,
dma_addr_t dma_paddr,
int hsize, int vsize,
int bl_enable, int el_enable,
int el_41_mode, int src_chroma_format,
bool hdmi, bool hdr10, bool reset);
void apply_stb_core_settings(dma_addr_t dma_paddr,
bool enable, bool enable_core1_s1,
unsigned int mask, bool reset_core1a,
bool reset_core1b, u32 frame_size,
u32 frame_size_1, u8 pps_state);
void adjust_vpotch(u32 graphics_w, u32 graphics_h);
void adjust_vpotch_tv(void);
void video_effect_bypass(int bypass);
void enable_amdv(int enable);
int get_mute_type(void);
void set_update_cfg(bool flag);
void update_pwm_control(void);
void parse_param_amdv(char *buf_orig, char **parm);
int prepare_stb_dvcore1_reg
(u32 run_mode, u32 *p_core1_dm_regs, u32 *p_core1_comp_regs);
void prepare_stb_dvcore1_lut(u32 base, u32 *p_core1_lut);
bool need_skip_cvm(unsigned int is_graphic);
void set_debug_bypass_vpp_pq(int val);
void set_bypass_all_vpp_pq(int flag);
void update_dma_buf(void);
void set_dovi_setting_update_flag(bool flag);
void set_vsync_count(int val);
void set_force_reset_core2(bool flag, enum OSD_INDEX index);
void set_amdv_wait_on(void);
void clear_dolby_vision_wait(void);
void set_frame_count(int val);
int get_frame_count(void);
void reset_dv_param(void);
void update_stb_core_setting_flag(int flag);
u32 get_graphic_width(u32 index);
u32 get_graphic_height(u32 index);
bool get_core2_enable_info(u32 index);
bool need_send_emp_meta(const struct vinfo_s *vinfo);
void convert_hdmi_metadata(uint32_t *md);
bool get_core1a_core1b_switch(void);
bool core1_detunnel(void);
bool get_disable_video_flag(enum vd_path_e vd_path);
void set_operate_mode(int mode);
int get_operate_mode(void);
void set_dv_control_backlight_status(bool flag);
void set_vf_crc_valid(int val);
void set_vf_crc_valid_top1(int val);
int get_dv_vpu_mem_power_status(enum vpu_mod_e mode);
void calculate_panel_max_pq
(enum signal_format_enum src_format,
const struct vinfo_s *vinfo,
void *config);
int layer_id_to_dv_id(enum vd_path_e vd_path);
bool layerid_valid(int layerid);
bool dv_inst_valid(int id);
struct device *get_amdv_device(void);
void bypass_pps_sr_gamma_gainoff(int flag);
void amdv_core_reset(enum core_type type);
bool check_vf_changed(struct vframe_s *vf);
int vsem_check(unsigned char *control_data, unsigned char *vsem_payload);
void amdv_clear_buf(u8 dv_id);
bool single_step_enable_v2(int inst_id, u8 layer_id);
bool dump_enable_f(int inst_id);
bool check_atsc_dvb(char *p);
void amdvdolby_vision_vf_add(struct vframe_s *vf, struct vframe_s *el_vf);
void prepare_hdr10_param(struct vframe_master_display_colour_s *p_mdc,
struct hdr10_parameter *p_hdr10_param);
bool is_hlg_frame(struct vframe_s *vf);
bool is_hdr10_frame(struct vframe_s *vf);
bool is_mvc_frame(struct vframe_s *vf);
bool is_primesl_frame(struct vframe_s *vf);
bool is_cuva_frame(struct vframe_s *vf);
bool is_hdr10plus_frame(struct vframe_s *vf);
bool vf_is_hlg(struct vframe_s *vf);
bool vf_is_hdr10_plus(struct vframe_s *vf);
bool vf_is_hdr10(struct vframe_s *vf);
bool is_dv_standard_es(int dvel, int mflag, int width);
void calculate_crc(void);
int is_policy_changed(void);
void update_src_format(enum signal_format_enum src_format, struct vframe_s *vf);
int amdv_policy_process(struct vframe_s *vf, int *mode, enum signal_format_enum src_format);
int is_graphics_output_off(void);
void update_aoi_flag(struct vframe_s *vf, u32 display_size);
void dump_tv_setting
(void *p_setting,
int frame_cnt, int debug_flag);
int amdv_vf_check(struct vframe_s *vf);
bool is_hdr10_src_primary_changed(void);
void update_amdv_status(enum signal_format_enum src_format);
int parse_sei_and_meta(struct vframe_s *vf,
void *frame_req,
int *total_comp_size,
int *total_md_size,
enum signal_format_enum *src_format,
int *ret_flags, bool drop_flag, u32 inst_id);
void enable_amdv_hw5(int enable);
int tv_top_set(u64 *top1_reg,
u64 *top1b_reg,
u64 *top2_reg,
int hsize,
int vsize,
int bl_enable,
int src_chroma_format,
bool hdmi,
bool hdr10,
bool reset,
bool toggle,
bool pr_done,
u32 level);
void dolby5_bypass_ctrl(unsigned int en);
int load_reg_and_lut_file(char *fw_name, void **dst_buf);
void read_txt_to_buf(char *reg_txt, void *reg_buf, int reg_num, bool is_reg);
void read_top1_pic_to_buf(char *reg_txt, void *buf, int num, bool flag_64bit);
int dma_lut_init(void);
void dma_lut_uninit(void);
int dma_lut_write(void);
irqreturn_t amdv_isr(int irq, void *dev_id);
void get_l1l4_hist(void);
void update_src_format_hw5(enum signal_format_enum src_format, struct vframe_s *vf);
int amdv_update_src_format_hw5(struct vframe_s *vf, u8 toggle_mode);
int amdv_wait_metadata_hw5(struct vframe_s *vf);
int amdv_parse_metadata_hw5(struct vframe_s *vf,
u8 toggle_mode,
bool bypass_release,
bool drop_flag);
int parse_sei_and_meta_ext_hw5(struct vframe_s *vf,
char *aux_buf,
int aux_size,
int *total_comp_size,
int *total_md_size,
void *fmt,
int *ret_flags,
char *md_buf,
char *comp_buf,
int id);
void update_top1_onoff(struct vframe_s *vf);
u32 get_top1_onoff(void);
void fixed_buf_config(void);
bool is_dv_unique_drm(struct vframe_s *vf);
void dump_top1_frame(int force_w, int force_h);
#ifdef CONFIG_AMLOGIC_MEDIA_FRC
int frc_get_video_latency_for_gd1(void);
#endif
#endif