blob: 2d15072ee3ff8abc096e03a79488ffe6556d3d05 [file] [log] [blame]
#ifndef _DV_H_
#define _DV_H_
#include <linux/types.h>
#define BIT(x) (1 << (x))
#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)
enum signal_format_enum {
FORMAT_INVALID = -1,
FORMAT_DOVI = 0,
FORMAT_HDR10 = 1,
FORMAT_SDR = 2,
FORMAT_DOVI_LL = 3
};
enum priority_mode_enum {
V_PRIORITY = 0,
G_PRIORITY = 1
};
enum cp_signal_range_enum {
SIGNAL_RANGE_SMPTE = 0,
SIGNAL_RANGE_FULL = 1,
SIGNAL_RANGE_SDI = 2
};
enum graphics_format_enum {
G_SDR_YUV = 0,
G_SDR_RGB = 1,
G_HDR_YUV = 2,
G_HDR_RGB = 3
};
struct composer_reg_ipcore {
/* offset 0xc8 */
u32 composer_mode;
u32 vdr_resolution;
u32 bit_depth;
u32 coefficient_log2_denominator;
u32 bl_num_pivots_y;
u32 bl_pivot[5];
u32 bl_order;
u32 bl_coefficient_y[8][3];
u32 el_nlq_offset_y;
u32 el_coefficient_y[3];
u32 mapping_idc_u;
u32 bl_num_pivots_u;
u32 bl_pivot_u[3];
u32 bl_order_u;
u32 bl_coefficient_u[4][3];
u32 mmr_coefficient_u[22][2];
u32 mmr_order_u;
u32 el_nlq_offset_u;
u32 el_coefficient_u[3];
u32 mapping_idc_v;
u32 bl_num_pivots_v;
u32 bl_pivot_v[3];
u32 bl_order_v;
u32 bl_coefficient_v[4][3];
u32 mmr_coefficient_v[22][2];
u32 mmr_order_v;
u32 el_nlq_off_v;
u32 el_coefficient_v[3];
};
struct dm_reg_ipcore1 {
u32 s_range;
u32 s_range_inverse;
u32 frame_fmt1;
u32 frame_fmt2;
u32 frame_pixel_def;
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 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 active_left_top;
u32 active_bottom_right;
};
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;
};
/*dm luts for core1 and core2 */
struct dm_lut_ipcore {
u32 tm_lut_i[64 * 4];
u32 tm_lut_s[64 * 4];
u32 sm_lut_i[64 * 4];
u32 sm_lut_s[64 * 4];
u32 g_2_l[256];
};
/*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_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;
};
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);
#endif