From: Yi Zhou Date: Wed, 8 Aug 2018 08:45:26 +0000 (+0800) Subject: hdmitx: add dynamic hdr info to vpp X-Git-Tag: khadas-vims-v0.9.6-release~1554 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=2a2a5305a7b00ff33b91c9f8ed926bdb731889d3;p=platform%2Fkernel%2Flinux-amlogic.git hdmitx: add dynamic hdr info to vpp PD#171350: hdmitx: add dynamic hdr info to vpp cat /sys/class/amhdmitx/amhdmitx/hdr_cap cat /sys/class/display/vinfo Change-Id: I0d42c33e33ccc1f8d56545df25efc2cc60e08f58 Signed-off-by: Yi Zhou --- diff --git a/drivers/amlogic/media/vout/hdmitx/hdmi_tx_20/hdmi_tx_edid.c b/drivers/amlogic/media/vout/hdmitx/hdmi_tx_20/hdmi_tx_edid.c index 79a5ab6..ca3c978 100644 --- a/drivers/amlogic/media/vout/hdmitx/hdmi_tx_20/hdmi_tx_edid.c +++ b/drivers/amlogic/media/vout/hdmitx/hdmi_tx_20/hdmi_tx_edid.c @@ -58,7 +58,12 @@ #define EXTENSION_VENDOR_SPECIFIC 0x1 #define EXTENSION_COLORMETRY_TAG 0x5 /* DRM stands for "Dynamic Range and Mastering " */ -#define EXTENSION_DRM_TAG 0x6 +#define EXTENSION_DRM_STATIC_TAG 0x6 +#define EXTENSION_DRM_DYNAMIC_TAG 0x7 + #define TYPE_1_HDR_METADATA_TYPE 0x0001 + #define TS_103_433_SPEC_TYPE 0x0002 + #define ITU_T_H265_SPEC_TYPE 0x0003 + #define TYPE_4_HDR_METADATA_TYPE 0x0004 /* Video Format Preference Data block */ #define EXTENSION_VFPDB_TAG 0xd #define EXTENSION_Y420_VDB_TAG 0xe @@ -943,7 +948,7 @@ INVALID_Y420VDB: return -1; } -static int Edid_ParsingDRMBlock(struct rx_cap *pRXCap, +static int Edid_ParsingDRMStaticBlock(struct rx_cap *pRXCap, unsigned char *buf) { unsigned char tag = 0, ext_tag = 0, data_end = 0; @@ -954,8 +959,8 @@ static int Edid_ParsingDRMBlock(struct rx_cap *pRXCap, pos++; ext_tag = buf[pos]; if ((tag != HDMI_EDID_BLOCK_TYPE_EXTENDED_TAG) - || (ext_tag != EXTENSION_DRM_TAG)) - goto INVALID_DRM; + || (ext_tag != EXTENSION_DRM_STATIC_TAG)) + goto INVALID_DRM_STATIC; pos++; pRXCap->hdr_sup_eotf_sdr = !!(buf[pos] & (0x1 << 0)); pRXCap->hdr_sup_eotf_hdr = !!(buf[pos] & (0x1 << 1)); @@ -982,8 +987,66 @@ static int Edid_ParsingDRMBlock(struct rx_cap *pRXCap, return 0; } return 0; -INVALID_DRM: - pr_info("[%s] it's not a valid DRM\n", __func__); +INVALID_DRM_STATIC: + pr_info("[%s] it's not a valid DRM STATIC BLOCK\n", __func__); + return -1; +} + +static int Edid_ParsingDRMDynamicBlock(struct rx_cap *pRXCap, + unsigned char *buf) +{ + unsigned char tag = 0, ext_tag = 0, data_end = 0; + unsigned int pos = 0; + unsigned int type; + unsigned int type_length; + unsigned int i; + unsigned int num; + + tag = (buf[pos] >> 5) & 0x7; + data_end = (buf[pos] & 0x1f); + pos++; + ext_tag = buf[pos]; + if ((tag != HDMI_EDID_BLOCK_TYPE_EXTENDED_TAG) + || (ext_tag != EXTENSION_DRM_DYNAMIC_TAG)) + goto INVALID_DRM_DYNAMIC; + pos++; + data_end--;/*extended tag code byte doesn't need*/ + + while (data_end) { + type_length = buf[pos]; + pos++; + type = (buf[pos + 1] << 8) | buf[pos]; + pos += 2; + switch (type) { + case TS_103_433_SPEC_TYPE: + num = 1; + break; + case ITU_T_H265_SPEC_TYPE: + num = 2; + break; + case TYPE_4_HDR_METADATA_TYPE: + num = 3; + break; + case TYPE_1_HDR_METADATA_TYPE: + default: + num = 0; + break; + } + pRXCap->hdr_dynamic_info[num].hd_len = type_length; + pRXCap->hdr_dynamic_info[num].type = type; + pRXCap->hdr_dynamic_info[num].support_flags = buf[pos]; + pos++; + for (i = 0; i < type_length - 3; i++) { + pRXCap->hdr_dynamic_info[num].optional_fields[i] + = buf[pos]; + pos++; + } + data_end = data_end - (type_length + 1); + } + + return 0; +INVALID_DRM_DYNAMIC: + pr_info("[%s] it's not a valid DRM DYNAMIC BLOCK\n", __func__); return -1; } @@ -1449,12 +1512,16 @@ static int hdmitx_edid_block_parse(struct hdmitx_dev *hdmitx_device, pRXCap->colorimetry_data = BlockBuf[offset + 2]; break; - case EXTENSION_DRM_TAG: - Edid_ParsingDRMBlock(pRXCap, + case EXTENSION_DRM_STATIC_TAG: + Edid_ParsingDRMStaticBlock(pRXCap, &BlockBuf[offset]); rx_set_hdr_lumi(&BlockBuf[offset], (BlockBuf[offset] & 0x1f) + 1); break; + case EXTENSION_DRM_DYNAMIC_TAG: + Edid_ParsingDRMDynamicBlock(pRXCap, + &BlockBuf[offset]); + break; case EXTENSION_VFPDB_TAG: /* Just record VFPDB offset address, call Edid_ParsingVFPDB() after DTD * parsing, in case that @@ -1819,6 +1886,41 @@ next: } else dump_dtd_info(t); } +static void hdrinfo_to_vinfo(struct vinfo_s *info, struct rx_cap *pRXCap) +{ + unsigned int k, l; + + info->hdr_info.hdr_support = + (pRXCap->hdr_sup_eotf_sdr << 0) | + (pRXCap->hdr_sup_eotf_hdr << 1) | + (pRXCap->hdr_sup_eotf_smpte_st_2084 << 2) | + (pRXCap->hdr_sup_eotf_hlg << 3); + for (l = 0; l < 4; l++) { + if (pRXCap->hdr_dynamic_info[l].type == 0) { + memset(&info->hdr_info.dynamic_info[l], + 0, sizeof(struct hdr_dynamic)); + continue; + } + info->hdr_info.dynamic_info[l].type = + pRXCap->hdr_dynamic_info[l].type; + info->hdr_info.dynamic_info[l].of_len = + pRXCap->hdr_dynamic_info[l].hd_len - 3; + info->hdr_info.dynamic_info[l].support_flags = + pRXCap->hdr_dynamic_info[l].support_flags; + for (k = 0; k < (pRXCap->hdr_dynamic_info[l].hd_len - 3); k++) { + info->hdr_info.dynamic_info[l].optional_fields[k] = + pRXCap->hdr_dynamic_info[l].optional_fields[k]; + } + } + info->hdr_info.colorimetry_support = + pRXCap->colorimetry_data; + info->hdr_info.lumi_max = pRXCap->hdr_lum_max; + info->hdr_info.lumi_avg = pRXCap->hdr_lum_avg; + info->hdr_info.lumi_min = pRXCap->hdr_lum_min; + pr_info(EDID "update rx hdr info %x at edid parsing\n", + info->hdr_info.hdr_support); +} + int hdmitx_edid_parse(struct hdmitx_dev *hdmitx_device) { @@ -2015,20 +2117,8 @@ int hdmitx_edid_parse(struct hdmitx_dev *hdmitx_device) if (info) { if (!((strncmp(info->name, "480cvbs", 7) == 0) || (strncmp(info->name, "576cvbs", 7) == 0) || - (strncmp(info->name, "null", 4) == 0))) { - info->hdr_info.hdr_support = - (pRXCap->hdr_sup_eotf_sdr << 0) | - (pRXCap->hdr_sup_eotf_hdr << 1) | - (pRXCap->hdr_sup_eotf_smpte_st_2084 << 2) | - (pRXCap->hdr_sup_eotf_hlg << 3); - info->hdr_info.colorimetry_support = - pRXCap->colorimetry_data; - info->hdr_info.lumi_max = pRXCap->hdr_lum_max; - info->hdr_info.lumi_avg = pRXCap->hdr_lum_avg; - info->hdr_info.lumi_min = pRXCap->hdr_lum_min; - pr_info(EDID "update rx hdr info %x at edid parsing\n", - info->hdr_info.hdr_support); - } + (strncmp(info->name, "null", 4) == 0))) + hdrinfo_to_vinfo(info, pRXCap); } return 0; diff --git a/drivers/amlogic/media/vout/hdmitx/hdmi_tx_20/hdmi_tx_main.c b/drivers/amlogic/media/vout/hdmitx/hdmi_tx_20/hdmi_tx_main.c index dbbc209..c1d4cc1 100644 --- a/drivers/amlogic/media/vout/hdmitx/hdmi_tx_20/hdmi_tx_main.c +++ b/drivers/amlogic/media/vout/hdmitx/hdmi_tx_20/hdmi_tx_main.c @@ -389,9 +389,44 @@ static void hdmi_physcial_size_update(struct hdmitx_dev *hdev) } +static void hdrinfo_to_vinfo(struct vinfo_s *info, struct hdmitx_dev *hdev) +{ + unsigned int i, j; + + info->hdr_info.hdr_support = (hdev->RXCap.hdr_sup_eotf_sdr << 0) + | (hdev->RXCap.hdr_sup_eotf_hdr << 1) + | (hdev->RXCap.hdr_sup_eotf_smpte_st_2084 << 2) + | (hdev->RXCap.hdr_sup_eotf_hlg << 3); + for (i = 0; i < 4; i++) { + if (hdev->RXCap.hdr_dynamic_info[i].type == 0) { + memset(&info->hdr_info.dynamic_info[i], + 0, sizeof(struct hdr_dynamic)); + continue; + } + info->hdr_info.dynamic_info[i].type = + hdev->RXCap.hdr_dynamic_info[i].type; + info->hdr_info.dynamic_info[i].of_len = + hdev->RXCap.hdr_dynamic_info[i].hd_len - 3; + info->hdr_info.dynamic_info[i].support_flags = + hdev->RXCap.hdr_dynamic_info[i].support_flags; + + for (j = 0; j < hdev->RXCap.hdr_dynamic_info[i].hd_len - 3; j++) + info->hdr_info.dynamic_info[i].optional_fields[j] = + hdev->RXCap.hdr_dynamic_info[i].optional_fields[j]; + } + info->hdr_info.colorimetry_support = + hdev->RXCap.colorimetry_data; + info->hdr_info.lumi_max = hdev->RXCap.hdr_lum_max; + info->hdr_info.lumi_avg = hdev->RXCap.hdr_lum_avg; + info->hdr_info.lumi_min = hdev->RXCap.hdr_lum_min; + pr_info(SYS "update rx hdr info %x\n", + info->hdr_info.hdr_support); +} + static int set_disp_mode_auto(void) { int ret = -1; + struct vinfo_s *info = NULL; struct hdmitx_dev *hdev = &hdmitx_device; struct hdmi_format_para *para = NULL; @@ -412,19 +447,9 @@ static int set_disp_mode_auto(void) if (!((strncmp(info->name, "480cvbs", 7) == 0) || (strncmp(info->name, "576cvbs", 7) == 0) || - (strncmp(info->name, "null", 4) == 0))) { - info->hdr_info.hdr_support = (hdev->RXCap.hdr_sup_eotf_sdr << 0) - | (hdev->RXCap.hdr_sup_eotf_hdr << 1) - | (hdev->RXCap.hdr_sup_eotf_smpte_st_2084 << 2) - | (hdev->RXCap.hdr_sup_eotf_hlg << 3); - info->hdr_info.colorimetry_support = - hdev->RXCap.colorimetry_data; - info->hdr_info.lumi_max = hdev->RXCap.hdr_lum_max; - info->hdr_info.lumi_avg = hdev->RXCap.hdr_lum_avg; - info->hdr_info.lumi_min = hdev->RXCap.hdr_lum_min; - pr_info(SYS "update rx hdr info %x\n", - info->hdr_info.hdr_support); - } + (strncmp(info->name, "null", 4) == 0))) + hdrinfo_to_vinfo(info, hdev); + hdmi_physcial_size_update(hdev); /* If info->name equals to cvbs, then set mode to I mode to hdmi @@ -2217,27 +2242,47 @@ static ssize_t show_hdr_cap(struct device *dev, struct device_attribute *attr, char *buf) { int pos = 0; + unsigned int i, j; struct rx_cap *pRXCap = &(hdmitx_device.RXCap); - - pos += snprintf(buf + pos, PAGE_SIZE, "Supported EOTF:\n"); - pos += snprintf(buf + pos, PAGE_SIZE, " Traditional SDR: %d\n", + pos += snprintf(buf + pos, PAGE_SIZE, "HDR Static Metadata:\n"); + pos += snprintf(buf + pos, PAGE_SIZE, " Supported EOTF:\n"); + pos += snprintf(buf + pos, PAGE_SIZE, " Traditional SDR: %d\n", pRXCap->hdr_sup_eotf_sdr); - pos += snprintf(buf + pos, PAGE_SIZE, " Traditional HDR: %d\n", + pos += snprintf(buf + pos, PAGE_SIZE, " Traditional HDR: %d\n", pRXCap->hdr_sup_eotf_hdr); - pos += snprintf(buf + pos, PAGE_SIZE, " SMPTE ST 2084: %d\n", + pos += snprintf(buf + pos, PAGE_SIZE, " SMPTE ST 2084: %d\n", pRXCap->hdr_sup_eotf_smpte_st_2084); - pos += snprintf(buf + pos, PAGE_SIZE, " Hybrif Log-Gamma: %d\n", + pos += snprintf(buf + pos, PAGE_SIZE, " Hybrif Log-Gamma: %d\n", pRXCap->hdr_sup_eotf_hlg); - pos += snprintf(buf + pos, PAGE_SIZE, "Supported SMD type1: %d\n", + pos += snprintf(buf + pos, PAGE_SIZE, " Supported SMD type1: %d\n", pRXCap->hdr_sup_SMD_type1); - pos += snprintf(buf + pos, PAGE_SIZE, "Luminance Data\n"); - pos += snprintf(buf + pos, PAGE_SIZE, " Max: %d\n", + pos += snprintf(buf + pos, PAGE_SIZE, " Luminance Data\n"); + pos += snprintf(buf + pos, PAGE_SIZE, " Max: %d\n", pRXCap->hdr_lum_max); - pos += snprintf(buf + pos, PAGE_SIZE, " Avg: %d\n", + pos += snprintf(buf + pos, PAGE_SIZE, " Avg: %d\n", pRXCap->hdr_lum_avg); - pos += snprintf(buf + pos, PAGE_SIZE, " Min: %d\n", + pos += snprintf(buf + pos, PAGE_SIZE, " Min: %d\n\n", pRXCap->hdr_lum_min); - pos += snprintf(buf + pos, PAGE_SIZE, " colorimetry_data: %x\n", + pos += snprintf(buf + pos, PAGE_SIZE, "HDR Dynamic Metadata:"); + + for (i = 0; i < 4; i++) { + if (pRXCap->hdr_dynamic_info[i].type == 0) + continue; + pos += snprintf(buf + pos, PAGE_SIZE, + "\n metadata_version: %x\n", + pRXCap->hdr_dynamic_info[i].type); + pos += snprintf(buf + pos, PAGE_SIZE, + " support_flags: %x\n", + pRXCap->hdr_dynamic_info[i].support_flags); + pos += snprintf(buf + pos, PAGE_SIZE, + " optional_fields:"); + for (j = 0; j < + (pRXCap->hdr_dynamic_info[i].hd_len - 3); j++) + pos += snprintf(buf + pos, PAGE_SIZE, " %x", + pRXCap->hdr_dynamic_info[i].optional_fields[j]); + } + + pos += snprintf(buf + pos, PAGE_SIZE, "\n\ncolorimetry_data: %x\n", pRXCap->colorimetry_data); return pos; @@ -3060,11 +3105,8 @@ static enum hdmi_audio_fs aud_samp_rate_map(unsigned int rate) int i = 0; for (i = 0; i < ARRAY_SIZE(map_fs); i++) { - if (map_fs[i].rate == rate) { - pr_info(AUD "aout notify rate %d\n", - rate); + if (map_fs[i].rate == rate) return map_fs[i].fs; - } } pr_info(AUD "get FS_MAX\n"); return FS_MAX; @@ -3102,11 +3144,8 @@ static enum hdmi_audio_sampsize aud_size_map(unsigned int bits) int i; for (i = 0; i < ARRAY_SIZE(aud_size_map_ss); i++) { - if (bits == aud_size_map_ss[i].sample_bits) { - pr_info(AUD "aout notify size %d\n", - bits); + if (bits == aud_size_map_ss[i].sample_bits) return aud_size_map_ss[i].ss; - } } pr_info(AUD "get SS_MAX\n"); return SS_MAX; @@ -3173,7 +3212,7 @@ static int hdmitx_notify_callback_a(struct notifier_block *block, } } if (hdmitx_device.audio_param_update_flag == 0) - pr_info(AUD "no update\n"); + ; else hdmitx_device.audio_notify_flag = 1; @@ -3284,9 +3323,12 @@ static void hdmitx_hpd_plugin_handler(struct work_struct *work) static void clear_hdr_info(struct hdmitx_dev *hdev) { struct vinfo_s *info = hdmitx_get_current_vinfo(); - + unsigned int i; if (info) { info->hdr_info.hdr_support = 0; + for (i = 0; i < 4; i++) + memset(&(info->hdr_info.dynamic_info[i]), + 0, sizeof(struct hdr_dynamic)); info->hdr_info.colorimetry_support = 0; info->hdr_info.lumi_max = 0; info->hdr_info.lumi_avg = 0; diff --git a/drivers/amlogic/media/vout/vout_serve/vout2_serve.c b/drivers/amlogic/media/vout/vout_serve/vout2_serve.c index 18818ca..667c32e 100644 --- a/drivers/amlogic/media/vout/vout_serve/vout2_serve.c +++ b/drivers/amlogic/media/vout/vout_serve/vout2_serve.c @@ -360,6 +360,7 @@ static ssize_t vout2_vinfo_show(struct class *class, { const struct vinfo_s *info = NULL; ssize_t len = 0; + unsigned int i, j; info = get_current_vinfo2(); if (info == NULL) @@ -409,7 +410,7 @@ static ssize_t vout2_vinfo_show(struct class *class, info->master_display_info.white_point[1], info->master_display_info.luminance[0], info->master_display_info.luminance[1]); - len += sprintf(buf+len, "hdr_info:\n" + len += sprintf(buf+len, "hdr_static_info:\n" " hdr_support %d\n" " lumi_max %d\n" " lumi_avg %d\n" @@ -418,6 +419,22 @@ static ssize_t vout2_vinfo_show(struct class *class, info->hdr_info.lumi_max, info->hdr_info.lumi_avg, info->hdr_info.lumi_min); + len += sprintf(buf+len, "hdr_dynamic_info:"); + for (i = 0; i < 4; i++) { + len += sprintf(buf+len, + "\n metadata_version: %x\n" + " support_flags: %x\n", + info->hdr_info.dynamic_info[i].type, + info->hdr_info.dynamic_info[i].support_flags); + len += sprintf(buf+len, " optional_fields: "); + for (j = 0; j < info-> + hdr_info.dynamic_info[i].of_len; j++) { + len += sprintf(buf+len, " %x", + info->hdr_info.dynamic_info[i]. + optional_fields[j]); + } + } + len += sprintf(buf+len, "\n"); return len; } @@ -523,7 +540,6 @@ static long vout2_ioctl(struct file *file, unsigned int cmd, unsigned long arg) baseinfo.screen_real_height = info->screen_real_height; baseinfo.video_clk = info->video_clk; baseinfo.viu_color_fmt = info->viu_color_fmt; - baseinfo.hdr_info = info->hdr_info; if (copy_to_user(argp, &baseinfo, sizeof(struct vinfo_base_s))) ret = -EFAULT; diff --git a/drivers/amlogic/media/vout/vout_serve/vout_serve.c b/drivers/amlogic/media/vout/vout_serve/vout_serve.c index fb083f6..be91fcf 100644 --- a/drivers/amlogic/media/vout/vout_serve/vout_serve.c +++ b/drivers/amlogic/media/vout/vout_serve/vout_serve.c @@ -434,6 +434,7 @@ static ssize_t vout_vinfo_show(struct class *class, { const struct vinfo_s *info = NULL; ssize_t len = 0; + unsigned int i, j; info = get_current_vinfo(); if (info == NULL) @@ -484,7 +485,7 @@ static ssize_t vout_vinfo_show(struct class *class, info->master_display_info.white_point[1], info->master_display_info.luminance[0], info->master_display_info.luminance[1]); - len += sprintf(buf+len, "hdr_info:\n" + len += sprintf(buf+len, "hdr_static_info:\n" " hdr_support %d\n" " lumi_max %d\n" " lumi_avg %d\n" @@ -493,6 +494,22 @@ static ssize_t vout_vinfo_show(struct class *class, info->hdr_info.lumi_max, info->hdr_info.lumi_avg, info->hdr_info.lumi_min); + len += sprintf(buf+len, "hdr_dynamic_info:"); + for (i = 0; i < 4; i++) { + len += sprintf(buf+len, + "\n metadata_version: %x\n" + " support_flags: %x\n", + info->hdr_info.dynamic_info[i].type, + info->hdr_info.dynamic_info[i].support_flags); + len += sprintf(buf+len, " optional_fields: "); + for (j = 0; j < + info->hdr_info.dynamic_info[i].of_len; j++) { + len += sprintf(buf+len, " %x", + info->hdr_info.dynamic_info[i]. + optional_fields[j]); + } + } + len += sprintf(buf+len, "\n"); return len; } @@ -598,7 +615,6 @@ static long vout_ioctl(struct file *file, unsigned int cmd, unsigned long arg) baseinfo.screen_real_height = info->screen_real_height; baseinfo.video_clk = info->video_clk; baseinfo.viu_color_fmt = info->viu_color_fmt; - baseinfo.hdr_info = info->hdr_info; if (copy_to_user(argp, &baseinfo, sizeof(struct vinfo_base_s))) ret = -EFAULT; diff --git a/include/linux/amlogic/media/vout/hdmi_tx/hdmi_tx_module.h b/include/linux/amlogic/media/vout/hdmi_tx/hdmi_tx_module.h index 2a82aa8..1e4184d 100644 --- a/include/linux/amlogic/media/vout/hdmi_tx/hdmi_tx_module.h +++ b/include/linux/amlogic/media/vout/hdmi_tx/hdmi_tx_module.h @@ -27,7 +27,7 @@ #include /* HDMITX driver version */ -#define HDMITX_VER "20180702" +#define HDMITX_VER "20180808" /* chip type */ #define MESON_CPU_ID_M8B 0 @@ -69,6 +69,13 @@ enum hd_ctrl { VID_EN, VID_DIS, AUD_EN, AUD_DIS, EDID_EN, EDID_DIS, HDCP_EN, HDCP_DIS, }; +struct hdr_dynamic_struct { + unsigned int type; + unsigned int hd_len;/*hdr_dynamic_length*/ + unsigned char support_flags; + unsigned char optional_fields[20]; +}; + struct rx_cap { unsigned int native_Mode; /*video*/ @@ -104,6 +111,7 @@ struct rx_cap { unsigned char hdr_lum_max; unsigned char hdr_lum_avg; unsigned char hdr_lum_min; + struct hdr_dynamic_struct hdr_dynamic_info[4]; unsigned char IDManufacturerName[4]; unsigned char IDProductCode[2]; unsigned char IDSerialNumber[4]; diff --git a/include/linux/amlogic/media/vout/vinfo.h b/include/linux/amlogic/media/vout/vinfo.h index a1198c3..2033a31 100644 --- a/include/linux/amlogic/media/vout/vinfo.h +++ b/include/linux/amlogic/media/vout/vinfo.h @@ -65,11 +65,34 @@ struct master_display_info_s { u32 max_content; /* Maximum Content Light Level */ u32 max_frame_average; /* Maximum Frame-average Light Level */ }; +/* + *hdr_dynamic_type + * 0x0001: type_1_hdr_metadata_version + * 0x0002: ts_103_433_spec_version + * 0x0003: itu_t_h265_spec_version + * 0x0004: type_4_hdr_metadata_version + */ +struct hdr_dynamic { + unsigned int type; + unsigned char support_flags; + unsigned int of_len; /*optional_fields length*/ + unsigned char optional_fields[28]; +}; struct hdr_info { - u32 hdr_support; /* RX EDID hdr support types */ - /*bit7:BT2020RGB bit6:BT2020YCC bit5:BT2020cYCC bit4:adobeRGB*/ - /*bit3:adobeYCC601 bit2:sYCC601 bit1:xvYCC709 bit0:xvYCC601*/ +/* RX EDID hdr support types */ + u32 hdr_support; +/* + *dynamic_info[0] expresses type1's parameters certainly + *dynamic_info[1] expresses type2's parameters certainly + *dynamic_info[2] expresses type3's parameters certainly + *dynamic_info[3] expresses type4's parameters certainly + *if some types don't exist, the corresponding dynamic_info + *is zero instead of inexistence + */ + struct hdr_dynamic dynamic_info[4]; +/*bit7:BT2020RGB bit6:BT2020YCC bit5:BT2020cYCC bit4:adobeRGB*/ +/*bit3:adobeYCC601 bit2:sYCC601 bit1:xvYCC709 bit0:xvYCC601*/ u8 colorimetry_support; /* RX EDID colorimetry support types */ u32 lumi_max; /* RX EDID Lumi Max value */ u32 lumi_avg; /* RX EDID Lumi Avg value */ @@ -177,7 +200,6 @@ struct vinfo_base_s { u32 screen_real_height; u32 video_clk; enum color_fmt_e viu_color_fmt; - struct hdr_info hdr_info; }; struct vinfo_s {