blob: 08ad1d99d65ba8e6059539eb358446130842c57e [file]
/* SPDX-License-Identifier: (GPL-2.0+ OR MIT) */
/*
* Copyright (c) 2019 Amlogic, Inc. All rights reserved.
*/
#ifndef CUVA_ALG_H
#define CUVA_ALG_H
/*cuva hdr metadata(dynamic) parse, default windows num = 1*/
struct cuva_hdr_dynamic_metadata_s {
int system_start_code;
int min_maxrgb_pq;
int avg_maxrgb_pq;
int var_maxrgb_pq;
int max_maxrgb_pq;
int tm_enable_mode_flag;
int tm_param_en_num;
int tgt_system_dsp_max_luma_pq[2];
int base_en_flag[2];
/*if (base_en_flag)*/
int base_param_m_p[2];
int base_param_m_m[2];
int base_param_m_a[2];
int base_param_m_b[2];
int base_param_m_n[2];
int base_param_m_k1[2];
int base_param_m_k2[2];
int base_param_m_k3[2];
int base_param_delta_en_mode[2];
int base_param_en_delta[2];
int spline_en_flag[2];
int spline_en_num[2];
int spline_th_en_mode[2][2];
int spline_th_en_mb[2][2];
int spline_th_enable[2][2];
int spline_th_en_delta1[2][2];
int spline_th_en_delta2[2][2];
int spline_en_strength[2][2];
int color_sat_mapping_flag;
int color_sat_num;
int clor_sat_gain[8];
};
struct aml_gain_reg {
s64 *ogain_lut;
s64 *cgain_lut;
};
struct aml_dm_cuva_reg_sw {
int minimum_maxrgb; //12bit >> 12bit
int average_maxrgb; //12bit >> 12bit
int variance_maxrgb; //12bit >> 12bit
int maximum_maxrgb; //12bit >> 12bit
int tone_mapping_mode_flag; //2bit
int tone_mapping_param_num; //2bit
int targeted_system_display_maximum_luminance; //12bit >> 12bi
int base_flag; //1bit 0-1
int m_p; // 10bit 7bit = 1 0-10
int m_m; // 6bit 0-6.3
int m_a; // 10bit
int m_b; // 14bit = 1 0-0.25
int m_n; // 6bit 0-6.3
int k1; // 2bit
int k2; // 2bit
int k3; // 16bit 12bit = 1 0-31
int base_param_delta_mode; // 3bit
int base_param_delta; // 8bit 7bit = 1 -1~1
int spline3_flag; // 1bit 0-1
int spline3_num; // 3bit 0-1
int spline3_th_mode[2]; // 4bit
int spline3_th_mb[2]; // 13bit 12bit = 1 0-1.1
int spline3_th_base_offset[2]; //12bit = 1
int spline3_th[2][3]; // 12bit = 1
int spline3_strength[2]; // 7bit = 1
int color_saturation_mapping_flag; // 1bit 0-1
int color_saturation_num; // 3bit 0-7
int color_saturation_gain[8]; // 7bit = 1
};
struct aml_static_reg_sw {
s64 max_display_mastering_luminance; //16bit
s64 min_display_mastering_luminance; //16bit
s64 max_content_light_level;
s64 max_picture_average_light_level;
};
struct aml_cuva_reg_sw {
int itp;
int cuva_en;
int maxlum_adj_min; //12bit >> 12bit
int maxlum_adj_a; //10bit >> 10bit
int maxlum_adj_b; //10bit >> 10bit
int base_curve_generate_0_pvh0; //16bit >> 12bit
int base_curve_generate_0_pvl0; //16bit >> 12bit
int base_curve_generate_0_tph0; //12bit >> 12bit
int base_curve_generate_0_tpl0; //12bit >> 12bit
int base_curve_generate_0_pdh1; //12bit >> 12bit
int base_curve_generate_0_pdl1; //12bit >> 12bit
int base_curve_generate_0_tph1; //12bit >> 12bit
int base_curve_generate_0_tpl1; //12bit >> 12bit
int base_curve_generate_0_n; //8bit
int base_curve_generate_0_m; //8bit
int base_curve_adj_1_n; //8bit
int base_curve_adj_2_n; //8bit
int spline1_generate_0_hlmaxh2; //12bit >> 12bit
int spline1_generate_0_hlmaxl2; //12bit >> 12bit
int spline1_generate_0_tdmaxh2; //12bit >> 12bit
int spline1_generate_0_tdmaxl2; //12bit >> 12bit
int spline1_generate_0_avmaxh3; //12bit >> 12bit
int spline1_generate_0_avmaxl3; //12bit >> 12bit
int spline1_generate_0_sdmaxh3; //12bit >> 12bit
int spline1_generate_0_sdmaxl3; //12bit >> 12bit
int spline1_generate_0_n; //8bit
int spline1_generate_0_m; //8bit
int spline1_adj_0_n1; //8bit
int spline1_adj_0_n2; //8bit
int spline3_generate_0_b; //12bit >> 12bit
int spline3_generate_0_c; //12bit >> 12bit
int spline3_generate_0_d; //12bit >> 12bit
int spline1_generate_sdr_0_avmaxh6; //12bit >> 12bit
int spline1_generate_sdr_0_avmaxl6; //12bit >> 12bit
int spline1_generate_sdr_0_sdmaxh6; //12bit >> 12bit
int spline1_generate_sdr_0_sdmaxl6; //12bit >> 12bit
int spline1_generate_sdr_0_n; //8bit
int spline3_generate_sdr_0_b; //12bit >> 12bit
int spline3_generate_sdr_0_c; //12bit >> 12bit
int spline3_generate_sdr_0_d; //12bit >> 12bit
int sca_adj_a; //12bit >> 12bit
int sca_adj_b; //12bit >> 12bit
int sca_satr; //12bit >> 12bit
int hdrsdrth; //12bit
};
struct aml_cuva_curve_reg_sw {
int m_p;
int m_m;
int m_a;
int m_b;
int m_n;
int k1;
int k2;
int k3;
s64 mb00;
s64 th30;
s64 mb01;
s64 mb11;
s64 ma01;
s64 ma11;
s64 mc01;
s64 mc11;
s64 md01;
s64 md11;
s64 th11;
s64 th21;
s64 th31;
s64 mb02;
s64 mb12;
s64 ma02;
s64 ma12;
s64 mc02;
s64 mc12;
s64 md02;
s64 md12;
s64 th12;
s64 th22;
s64 th32;
};
enum ic_type_e {
IC_OTHER = 0,
IC_G12A = 1
};
struct aml_cuva_data_s {
enum ic_type_e ic_type;
int max_panel_e;
int min_panel_e;
struct aml_cuva_reg_sw *cuva_reg;
struct aml_static_reg_sw *static_reg;
struct aml_gain_reg *aml_vm_regs;
struct cuva_hdr_dynamic_metadata_s *cuva_md;
void (*cuva_hdr_alg)(struct aml_cuva_data_s *aml_cuva_data);
};
enum cuva_func_e {
CUVA_HDR2SDR = 0,
CUVA_HDR2HDR10,
CUVA_HLG2SDR,
CUVA_HLG2HLG,
CUVA_HLG2HDR10
};
struct aml_cuva_data_s *get_cuva_data(void);
#endif