hdmitx: sync hdmitx_edid_parse.c from kernel 6.12 to uboot [1/2]
PD#SWPL-197049
Problem:
The hdmitx_edid_parse.c of kernel 6.12 and uboot need to be the same
Solution:
sync hdmitx_edid_parse.c from kernel 6.12 to uboot
Verify:
S905Y5-BH201
Change-Id: If5d8ef1f358f367baba70748ab2db90b9487001c
Signed-off-by: ruofei.zhao <ruofei.zhao@amlogic.com>
diff --git a/cmd/amlogic/cmd_hdmitx21.c b/cmd/amlogic/cmd_hdmitx21.c
index 4e6f593..0cba56d 100644
--- a/cmd/amlogic/cmd_hdmitx21.c
+++ b/cmd/amlogic/cmd_hdmitx21.c
@@ -850,6 +850,102 @@
static void aud_cap_show(struct hdmitx_dev *hdev)
{
+ struct rx_cap *prxcap = &hdev->RXCap;
+ int i, j;
+ struct dolby_vsadb_cap *cap = &prxcap->dolby_vsadb_cap;
+ static const char * const aud_ct[] = {
+ "ReferToStreamHeader", "PCM", "AC-3", "MPEG1", "MP3",
+ "MPEG2", "AAC", "DTS", "ATRAC", "OneBitAudio",
+ "Dolby_Digital+", "DTS-HD", "MAT", "DST", "WMA_Pro",
+ "Reserved", NULL};
+ static const char * const aud_sampling_frequency[] = {
+ "ReferToStreamHeader", "32", "44.1", "48", "88.2", "96",
+ "176.4", "192", NULL};
+ const char * const aud_sample_size[] = {"ReferToStreamHeader",
+ "16", "20", "24", NULL};
+
+ printf("\naud_cap\n");
+ printf("CodingType MaxChannels SamplingFreq SampleSize\n");
+ for (i = 0; i < prxcap->AUD_count; i++) {
+ if (prxcap->RxAudioCap[i].audio_format_code == CT_CXT) {
+ if ((prxcap->RxAudioCap[i].cc3 >> 3) == 0xb) {
+ printf("MPEG-H, 8ch, ");
+ for (j = 0; j < 7; j++) {
+ if (prxcap->RxAudioCap[i].freq_cc & (1 << j))
+ printf("%s/", aud_sampling_frequency[j + 1]);
+ }
+ printf(" kHz\n");
+ }
+ continue;
+ }
+ printf("%s", aud_ct[prxcap->RxAudioCap[i].audio_format_code]);
+ if (prxcap->RxAudioCap[i].audio_format_code == CT_DD_P &&
+ (prxcap->RxAudioCap[i].cc3 & 1))
+ printf("/ATMOS");
+ if (prxcap->RxAudioCap[i].audio_format_code != CT_CXT)
+ printf(", %d ch, ", prxcap->RxAudioCap[i].channel_num_max + 1);
+ for (j = 0; j < 7; j++) {
+ if (prxcap->RxAudioCap[i].freq_cc & (1 << j))
+ printf("%s/", aud_sampling_frequency[j + 1]);
+ }
+ printf(" kHz, ");
+ switch (prxcap->RxAudioCap[i].audio_format_code) {
+ case CT_PCM:
+ for (j = 0; j < 3; j++) {
+ if (prxcap->RxAudioCap[i].cc3 & (1 << j))
+ printf("%s/", aud_sample_size[j + 1]);
+ }
+ printf(" bit\n");
+ break;
+ case CT_AC_3:
+ case CT_MPEG1:
+ case CT_MP3:
+ case CT_MPEG2:
+ case CT_AAC:
+ case CT_DTS:
+ case CT_ATRAC:
+ case CT_ONE_BIT_AUDIO:
+ printf("MaxBitRate %dkHz\n", prxcap->RxAudioCap[i].cc3 * 8);
+ break;
+ case CT_DD_P:
+ case CT_DTS_HD:
+ case CT_MAT:
+ case CT_DST:
+ printf("DepValue 0x%x\n", prxcap->RxAudioCap[i].cc3);
+ break;
+ case CT_WMA:
+ default:
+ break;
+ }
+ }
+
+ if (cap->ieeeoui == DOVI_IEEEOUI) {
+ /*
+ * Dolby Vendor Specific:
+ * headphone_playback_only:0,
+ * center_speaker:1,
+ * surround_speaker:1,
+ * height_speaker:1,
+ * Ver:1.0,
+ * MAT_PCM_48kHz_only:1,
+ * e61146d0007001,
+ */
+ printf("Dolby Vendor Specific:\n");
+ if (cap->dolby_vsadb_ver == 0)
+ printf(" Ver:1.0,\n");
+ else
+ printf(" Ver:Reversed,\n");
+ printf(" center_speaker:%d,\n", cap->spk_center);
+ printf(" surround_speaker:%d,\n", cap->spk_surround);
+ printf(" height_speaker:%d,\n", cap->spk_height);
+ printf(" headphone_playback_only:%d,\n", cap->headphone_only);
+ printf(" MAT_PCM_48kHz_only:%d,\n", cap->mat_48k_pcm_only);
+
+ printf(" ");
+ for (i = 0; i < 7; i++)
+ printf("%02x", cap->rawdata[i]);
+ printf(",\n");
+ }
}
static void hdr_cap_show(struct hdmitx_dev *hdev)
@@ -979,16 +1075,12 @@
/*
* printf(
* "EDID block number: 0x%x\n", tx_comm->EDID_buf[0x7e]);
- *
- *
- * printf(
- * "Source Physical Address[a.b.c.d]: %x.%x.%x.%x\n",
- * hdmitx_device->hdmi_info.vsdb_phy_addr.a,
- * hdmitx_device->hdmi_info.vsdb_phy_addr.b,
- * hdmitx_device->hdmi_info.vsdb_phy_addr.c,
- * hdmitx_device->hdmi_info.vsdb_phy_addr.d);
*/
+ printf("Source Physical Address[a.b.c.d]: %x.%x.%x.%x\n",
+ prxcap->vsdb_phy_addr.a, prxcap->vsdb_phy_addr.b,
+ prxcap->vsdb_phy_addr.c, prxcap->vsdb_phy_addr.d);
+
/* TODO native_vic2 */
printf("native Mode %x, VIC (native %d):\n",
prxcap->native_Mode, prxcap->native_vic);
@@ -1367,6 +1459,8 @@
/* parse edid data */
hdmitx_edid_parse(&hdev->RXCap, hdev->rawedid);
+ hdmitx_cec_phy_addr_parse(&hdev->RXCap, hdev->rawedid);
+ hdmitx_audio_parse(&hdev->RXCap, hdev->rawedid);
/* Update the member variables used by the dv running strategy */
hdmitx_update_dv_strategy_info(&hdev->RXCap.dv_info);
diff --git a/drivers/amlogic/media/vout/hdmitx/hdmitx_common/hdmitx_edid_parse.c b/drivers/amlogic/media/vout/hdmitx/hdmitx_common/hdmitx_edid_parse.c
index 928c1f3..1bd37ea 100644
--- a/drivers/amlogic/media/vout/hdmitx/hdmitx_common/hdmitx_edid_parse.c
+++ b/drivers/amlogic/media/vout/hdmitx/hdmitx_common/hdmitx_edid_parse.c
@@ -65,17 +65,108 @@
const struct hdmi_timing *hdmitx_mode_match_timing_name(const char *name);
static void edid_dtd_parsing(struct rx_cap *prxcap, unsigned char *data);
static void hdmitx_edid_set_default_aud(struct rx_cap *prxcap);
+static void edid_check_pcm_declare(struct rx_cap *prxcap);
-static void phy_addr_clear(struct vsdb_phyaddr *vsdb_phy_addr)
+/*
+ * cec_get_edid_spa_location() - find location of the Source Physical Address
+ *
+ * @edid: the EDID
+ * @size: the size of the EDID
+ *
+ * This EDID is expected to be a CEA-861 compliant, which means that there are
+ * at least two blocks and one or more of the extensions blocks are CEA-861
+ * blocks.
+ *
+ * The returned location is guaranteed to be <= size-2.
+ *
+ * This is an inline function since it is used by both CEC and V4L2.
+ * Ideally this would go in a module shared by both, but it is overkill to do
+ * that for just a single function.
+ */
+static unsigned int cec_get_edid_spa_location(const u8 *edid, unsigned int size)
{
- if (!vsdb_phy_addr)
+ unsigned int blocks = size / 128;
+ unsigned int block;
+ u8 d;
+
+ /* Sanity check: at least 2 blocks and a multiple of the block size */
+ if (blocks < 2 || size % 128)
+ return 0;
+
+ /*
+ * If there are fewer extension blocks than the size, then update
+ * 'blocks'. It is allowed to have more extension blocks than the size,
+ * since some hardware can only read e.g. 256 bytes of the EDID, even
+ * though more blocks are present. The first CEA-861 extension block
+ * should normally be in block 1 anyway.
+ */
+ if (edid[0x7e] + 1 < blocks)
+ blocks = edid[0x7e] + 1;
+
+ for (block = 1; block < blocks; block++) {
+ unsigned int offset = block * 128;
+
+ /* Skip any non-CEA-861 extension blocks */
+ if (edid[offset] != 0x02 || edid[offset + 1] != 0x03)
+ continue;
+
+ /* search Vendor Specific Data Block (tag 3) */
+ d = edid[offset + 2] & 0x7f;
+ /* Check if there are Data Blocks */
+ if (d <= 4)
+ continue;
+ if (d > 4) {
+ unsigned int i = offset + 4;
+ unsigned int end = offset + d;
+
+ /* Note: 'end' is always < 'size' */
+ do {
+ u8 tag = edid[i] >> 5;
+ u8 len = edid[i] & 0x1f;
+
+ if (tag == 3 && len >= 5 && i + len <= end &&
+ edid[i + 1] == 0x03 &&
+ edid[i + 2] == 0x0c &&
+ edid[i + 3] == 0x00)
+ return i + 4;
+ i += len + 1;
+ } while (i < end);
+ }
+ }
+ return 0;
+}
+
+static u16 hdmitx_cec_get_edid_phys_addr(const u8 *edid, unsigned int size)
+{
+ unsigned int loc = cec_get_edid_spa_location(edid, size);
+
+ if (loc == 0)
+ return 0xffff;
+ return (edid[loc] << 8) | edid[loc + 1];
+}
+
+void hdmitx_cec_phy_addr_parse(struct rx_cap *prxcap, u8 *edid_buf)
+{
+ u16 pa = 0xffff;
+ unsigned char edid_check = 0;
+
+ if (!prxcap || !edid_buf)
return;
- vsdb_phy_addr->a = 0;
- vsdb_phy_addr->b = 0;
- vsdb_phy_addr->c = 0;
- vsdb_phy_addr->d = 0;
- vsdb_phy_addr->valid = 0;
+ edid_check = prxcap->edid_check;
+ if (hdmitx_edid_check_data_valid(edid_check, edid_buf) == false)
+ return;
+
+ if (edid_buf && edid_buf[0x7e]) {
+ pa = hdmitx_cec_get_edid_phys_addr((const u8 *)edid_buf,
+ 128 * (edid_buf[0x7e] + 1));
+ prxcap->vsdb_phy_addr.a = (pa >> 12) & 0xf;
+ prxcap->vsdb_phy_addr.b = (pa >> 8) & 0xf;
+ prxcap->vsdb_phy_addr.c = (pa >> 4) & 0xf;
+ prxcap->vsdb_phy_addr.d = (pa >> 0) & 0xf;
+ if (pa != 0xffff)
+ prxcap->vsdb_phy_addr.valid = 1;
+ }
}
static bool hdmitx_edid_header_invalid(u8 edid_check, const u8 *buf)
@@ -644,39 +735,6 @@
}
}
-static struct vsdb_phyaddr vsdb_local = {0};
-int get_vsdb_phy_addr(struct vsdb_phyaddr *vsdb)
-{
- if (!vsdb)
- return -1;
-
- vsdb = &vsdb_local;
- return vsdb->valid;
-}
-
-static void set_vsdb_phy_addr(struct rx_cap *prxcap,
- unsigned char *edid_offset)
-{
- int phy_addr;
- struct vsdb_phyaddr *vsdb;
-
- if (!prxcap || !edid_offset)
- return;
- vsdb = &prxcap->vsdb_phy_addr;
- vsdb->a = (edid_offset[0] >> 4) & 0xf;
- vsdb->b = (edid_offset[0] >> 0) & 0xf;
- vsdb->c = (edid_offset[1] >> 4) & 0xf;
- vsdb->d = (edid_offset[1] >> 0) & 0xf;
- vsdb_local = *vsdb;
- vsdb->valid = 1;
-
- phy_addr = ((vsdb->a & 0xf) << 12) |
- ((vsdb->b & 0xf) << 8) |
- ((vsdb->c & 0xf) << 4) |
- ((vsdb->d & 0xf) << 0);
- prxcap->physical_addr = phy_addr;
-}
-
static void set_vsdb_dc_cap(struct rx_cap *prxcap)
{
if (!prxcap)
@@ -1132,13 +1190,13 @@
(svr >= 193 && svr <= 253)) {
prxcap->flag_vfpdb = 1;
prxcap->preferred_mode = svr;
- pr_debug("preferred mode 0 srv %d\n", prxcap->preferred_mode);
+ HDMITX_DEBUG("preferred mode 0 srv %d\n", prxcap->preferred_mode);
return 1;
}
if (svr >= 129 && svr <= 144) {
prxcap->flag_vfpdb = 1;
prxcap->preferred_mode = prxcap->dtd[svr - 129].vic;
- pr_debug("preferred mode 0 dtd %d\n", prxcap->preferred_mode);
+ HDMITX_DEBUG("preferred mode 0 dtd %d\n", prxcap->preferred_mode);
return 1;
}
return 0;
@@ -1208,21 +1266,21 @@
pos = 0;
length = buf[pos] & 0x1f;
if (length != 0x06)
- pr_debug("%s[%d]: the length is %d, should be 6 bytes\n",
+ HDMITX_DEBUG("%s[%d]: the length is %d, should be 6 bytes\n",
__func__, __LINE__, length);
cap->length = length;
pos += 2;
ieeeoui = buf[pos] + (buf[pos + 1] << 8) + (buf[pos + 2] << 16);
if (ieeeoui != DOVI_IEEEOUI)
- pr_debug("%s[%d]: the ieeeoui is 0x%x, should be 0x%x\n",
+ HDMITX_DEBUG("%s[%d]: the ieeeoui is 0x%x, should be 0x%x\n",
__func__, __LINE__, ieeeoui, DOVI_IEEEOUI);
cap->ieeeoui = ieeeoui;
pos += 3;
cap->dolby_vsadb_ver = buf[pos] & 0x7;
if (cap->dolby_vsadb_ver)
- pr_debug("%s[%d]: the version is 0x%x, should be 0x0\n",
+ HDMITX_DEBUG("%s[%d]: the version is 0x%x, should be 0x0\n",
__func__, __LINE__, cap->dolby_vsadb_ver);
cap->spk_center = (buf[pos] >> 4) & 1;
@@ -1418,7 +1476,7 @@
return;
if (size > 4 || size == 0) {
- pr_debug(EDID "4k2k in edid out of range, SIZE = %d\n", size);
+ HDMITX_DEBUG("4k2k in edid out of range, SIZE = %d\n", size);
return;
}
while (size--) {
@@ -1430,8 +1488,6 @@
store_cea_idx(prxcap, HDMI_93_3840x2160p24_16x9);
else if (*dat == 4)
store_cea_idx(prxcap, HDMI_98_4096x2160p24_256x135);
- else
- ;
dat++;
}
}
@@ -1485,7 +1541,6 @@
return;
prxcap->ieeeoui = HDMI_IEEE_OUI;
- set_vsdb_phy_addr(prxcap, &block_buf[offset + 3]);
prxcap->ColorDeepSupport = (count > 5) ? block_buf[offset + 5] : 0;
set_vsdb_dc_cap(prxcap);
@@ -1534,89 +1589,6 @@
}
}
-/*
- * force_vsvdb
- * 0: no force, use TV's
- * 1~n: use preset vsvdb 0~n-1
- * 255: use current vsvdb_data
- * update by module param vsvdb_data
- */
-static unsigned int force_vsvdb;
-static unsigned int vsvdb_size = 12;
-static unsigned char vsvdb_data[32] = {
- 0xeb, 0x01, 0x46, 0xd0, 0x00, 0x45, 0x0b, 0x90,
- 0x86, 0x60, 0x76, 0x8f, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
-};
-
-#define PRESET_VSVDB_COUNT 4
-static unsigned char tv_vsvdb[PRESET_VSVDB_COUNT][32] = {
- /* source-led */
- {
- 0xeb, 0x01, 0x46, 0xd0,
- 0x00, 0x45, 0x0b, 0x90,
- 0x86, 0x60, 0x76, 0x8f
- },
- /* sink-led */
- {
- 0xee, 0x01, 0x46, 0xd0,
- 0x00, 0x24, 0x0f, 0x8b,
- 0xa8, 0x53, 0x4b, 0x9d,
- 0x27, 0x0b, 0x00
- },
- /* sink-led & source-led */
- {
- 0xeb, 0x01, 0x46, 0xd0,
- 0x00, 0x44, 0x4f, 0x42,
- 0x8c, 0x46, 0x56, 0x8e
- },
- /* hdr10+ */
- {
- 0xe5, 0x01, 0x8b, 0x84,
- 0x90, 0x01
- }
-};
-
-module_param(force_vsvdb, uint, 0664);
-MODULE_PARM_DESC(force_vsvdb, "\n force_vsvdb\n");
-module_param_array(vsvdb_data, byte, &vsvdb_size, 0664);
-MODULE_PARM_DESC(vsvdb_data, "\n vsvdb data\n");
-
-/*
- * force_hdr
- * 0: no force, use TV's
- * 1~n: use preset drm 0~n-1
- * 255: use current drm_data
- * update by module param drm_data
- */
-static unsigned int force_hdr;
-static unsigned int drm_size = 4;
-static unsigned char drm_data[8] = {
- 0xe3, 0x06, 0x0d, 0x01, 0x00, 0x00, 0x00, 0x00
-};
-
-#define PRESET_DRM_COUNT 3
-static unsigned char tv_drm[PRESET_DRM_COUNT][32] = {
- /* hdr10 + hlg */
- {
- 0xe3, 0x06, 0x0d, 0x01
- },
- /* hdr10 */
- {
- 0xe3, 0x06, 0x05, 0x01
- },
- /* hlg */
- {
- 0xe3, 0x06, 0x09, 0x01
- }
-};
-
-module_param(force_hdr, uint, 0664);
-MODULE_PARM_DESC(force_hdr, "\n force_drm\n");
-module_param_array(drm_data, byte, &drm_size, 0664);
-MODULE_PARM_DESC(drm_data, "\n drm data\n");
-
static void hdmitx_edid_parse_ifdb(struct rx_cap *prxcap, u8 *blockbuf)
{
u8 payload_len;
@@ -1732,7 +1704,7 @@
prxcap->dsc_1p2 = 0;
if (prxcap->dsc_1p2) {
if (count < 13) {
- pr_info(EDID "error: dsc_1p2 support, but dsc not complete\n");
+ HDMITX_INFO("error: dsc_1p2 support, but dsc not complete\n");
prxcap->dsc_1p2 = 0;
return;
}
@@ -1871,14 +1843,87 @@
}
}
-static int hdmitx_edid_cta_block_parse(struct rx_cap *prxcap, u8 *block_buf)
+static int hdmitx_edid_audio_block_parse(struct rx_cap *prxcap, u8 *block_buf)
{
u8 offset, end;
u8 count;
u8 tag;
int i, tmp, idx;
+
+ if (!prxcap || !block_buf)
+ return -1;
+
+ /* CEA description */
+ end = block_buf[2];
+ /* Initialize SVD_VIC used for SVD storage in the video data block */
+ if (end > 127)
+ return 0;
+
+ /* this loop should be parsing when revision number is larger than 2 */
+ for (offset = 4 ; offset < end ; ) {
+ tag = block_buf[offset] >> 5;
+ count = block_buf[offset] & 0x1f;
+ switch (tag) {
+ case HDMI_EDID_BLOCK_TYPE_AUDIO:
+ tmp = count / 3;
+ idx = prxcap->AUD_count;
+ prxcap->AUD_count += tmp;
+ offset++;
+ for (i = 0; i < tmp; i++) {
+ prxcap->RxAudioCap[idx + i].audio_format_code =
+ (block_buf[offset + i * 3] >> 3) & 0xf;
+ prxcap->RxAudioCap[idx + i].channel_num_max =
+ block_buf[offset + i * 3] & 0x7;
+ prxcap->RxAudioCap[idx + i].freq_cc =
+ block_buf[offset + i * 3 + 1] & 0x7f;
+ prxcap->RxAudioCap[idx + i].cc3 =
+ block_buf[offset + i * 3 + 2];
+ }
+ offset += count;
+ break;
+ default:
+ offset++;
+ offset += count;
+ break;
+ }
+ }
+
+ return 0;
+}
+
+int hdmitx_audio_parse(struct rx_cap *prxcap, u8 *block_buf)
+{
+ int i;
+ unsigned char cta_block_count;
+ unsigned char edid_check = 0;
+
+ edid_check = prxcap->edid_check;
+ if (hdmitx_edid_check_data_valid(edid_check, block_buf) == false)
+ return 0;
+
+ cta_block_count = hdmitx_edid_get_cta_block_count(block_buf);
+ for (i = 1; i <= cta_block_count; i++) {
+ if (block_buf[i * 0x80] == 0x02 || edid_check & 0x01)
+ hdmitx_edid_audio_block_parse(prxcap, &block_buf[i * 0x80]);
+ }
+ /*
+ * CEA-861F 7.5.2 If only Basic Audio is supported,
+ * no Short Audio Descriptors are necessary.
+ */
+ if (!prxcap->AUD_count)
+ hdmitx_edid_set_default_aud(prxcap);
+ edid_check_pcm_declare(prxcap);
+
+ return 0;
+}
+
+static int hdmitx_edid_cta_block_parse(struct rx_cap *prxcap, u8 *block_buf)
+{
+ u8 offset, end;
+ u8 count;
+ u8 tag;
+ int i;
u8 *vfpdb_offset = NULL;
- u32 aud_flag = 0;
if (!prxcap || !block_buf)
return -1;
@@ -1913,25 +1958,6 @@
tag = block_buf[offset] >> 5;
count = block_buf[offset] & 0x1f;
switch (tag) {
- case HDMI_EDID_BLOCK_TYPE_AUDIO:
- aud_flag = 1;
- tmp = count / 3;
- idx = prxcap->AUD_count;
- prxcap->AUD_count += tmp;
- offset++;
- for (i = 0; i < tmp; i++) {
- prxcap->RxAudioCap[idx + i].audio_format_code =
- (block_buf[offset + i * 3] >> 3) & 0xf;
- prxcap->RxAudioCap[idx + i].channel_num_max =
- block_buf[offset + i * 3] & 0x7;
- prxcap->RxAudioCap[idx + i].freq_cc =
- block_buf[offset + i * 3 + 1] & 0x7f;
- prxcap->RxAudioCap[idx + i].cc3 =
- block_buf[offset + i * 3 + 2];
- }
- offset += count;
- break;
-
case HDMI_EDID_BLOCK_TYPE_VIDEO:
offset++;
for (i = 0; i < count ; i++) {
@@ -2049,30 +2075,12 @@
break;
default:
+ offset++;
+ offset += count;
break;
}
}
next:
- if (force_vsvdb) {
- if (force_vsvdb <= PRESET_VSVDB_COUNT) {
- vsvdb_size = (tv_vsvdb[force_vsvdb - 1][0] & 0x1f) + 1;
- memcpy(vsvdb_data, tv_vsvdb[force_vsvdb - 1],
- vsvdb_size);
- }
- edid_parsingvendspec(prxcap, vsvdb_data);
- }
- if (force_hdr) {
- if (force_hdr <= PRESET_DRM_COUNT) {
- drm_size = (tv_drm[force_hdr - 1][0] & 0x1f) + 1;
- memcpy(drm_data, tv_drm[force_hdr - 1],
- drm_size);
- }
- edid_parsedrmsb(prxcap, drm_data);
- }
-
- if (aud_flag == 0)
- hdmitx_edid_set_default_aud(prxcap);
-
edid_y420cmdb_postprocess(prxcap);
/* dtds in extended blocks */
@@ -2224,15 +2232,15 @@
return;
if (0) {
- pr_debug(EDID "%s[%d]\n", __func__, __LINE__);
- pr_debug(EDID "pixel_clock: %d\n", t->pixel_clock);
- pr_debug(EDID "h_active: %d\n", t->h_active);
- pr_debug(EDID "v_active: %d\n", t->v_active);
- pr_debug(EDID "v_blank: %d\n", t->v_blank);
- pr_debug(EDID "h_sync_offset: %d\n", t->h_sync_offset);
- pr_debug(EDID "h_sync: %d\n", t->h_sync);
- pr_debug(EDID "v_sync_offset: %d\n", t->v_sync_offset);
- pr_debug(EDID "v_sync: %d\n", t->v_sync);
+ HDMITX_DEBUG("%s[%d]\n", __func__, __LINE__);
+ HDMITX_DEBUG("pixel_clock: %d\n", t->pixel_clock);
+ HDMITX_DEBUG("h_active: %d\n", t->h_active);
+ HDMITX_DEBUG("v_active: %d\n", t->v_active);
+ HDMITX_DEBUG("v_blank: %d\n", t->v_blank);
+ HDMITX_DEBUG("h_sync_offset: %d\n", t->h_sync_offset);
+ HDMITX_DEBUG("h_sync: %d\n", t->h_sync);
+ HDMITX_DEBUG("v_sync_offset: %d\n", t->v_sync_offset);
+ HDMITX_DEBUG("v_sync: %d\n", t->v_sync);
}
}
@@ -2303,7 +2311,7 @@
}
/* Select dtd0 */
prxcap->preferred_mode = prxcap->dtd[0].vic;
- pr_debug(EDID "get dtd%d vic: %d\n",
+ HDMITX_DEBUG("get dtd%d vic: %d\n",
prxcap->dtd_idx, t->vic);
prxcap->dtd_idx++;
if (t->vic < HDMITX_VESA_OFFSET)
@@ -2389,7 +2397,7 @@
timing = hdmitx_mode_match_vesa_timing(t);
if (timing && (timing->vic < (HDMI_107_3840x2160p60_64x27 + 1))) {
prxcap->native_vic = timing->vic;
- pr_debug("hdmitx: get PMT vic: %d\n", timing->vic);
+ HDMITX_DEBUG("hdmitx: get PMT vic: %d\n", timing->vic);
}
if (timing && timing->vic >= HDMITX_VESA_OFFSET)
store_vesa_idx(prxcap, timing->vic);
@@ -2511,7 +2519,7 @@
/*
* both standard and LL are supported. 4k60 LL
* DV support should/can be determined using
- * video formats supported inthe E-EDID as flag
+ * video formats supported in the E-EDID as flag
* sup_2160p60hz might not be set.
*/
if ((dv->sup_2160p60hz ||
@@ -2567,7 +2575,6 @@
phyaddr->c = 0xf;
phyaddr->d = 0xf;
phyaddr->valid = 0;
- prxcap->physical_addr = 0xffff;
/* 165MHZ / 5 */
prxcap->Max_TMDS_Clock1 = DEFAULT_MAX_TMDS_CLK;
@@ -2704,7 +2711,7 @@
}
}
- pr_debug(EDID "EDID Parser:\n");
+ HDMITX_DEBUG("EDID Parser:\n");
if (hdmitx_edid_check_data_valid(edid_check, edid_buf) == false) {
edid_set_fallback_mode(prxcap);
@@ -2719,7 +2726,6 @@
hdmitx_edid_cta_block_parse(prxcap, &edid_buf[i * 0x80]);
}
- edid_check_pcm_declare(prxcap);
/*
* move parts that may contain cea timing parse behind
* VDB parse, so that to not affect VDB index which
@@ -2738,7 +2744,7 @@
if (!prxcap->flag_vfpdb &&
prxcap->preferred_mode != prxcap->VIC[0] &&
prxcap->number_of_dtd == 0) {
- pr_debug(EDID "change preferred_mode from %d to %d\n",
+ HDMITX_DEBUG("change preferred_mode from %d to %d\n",
prxcap->preferred_mode, prxcap->VIC[0]);
prxcap->preferred_mode = prxcap->VIC[0];
}
@@ -2780,10 +2786,10 @@
if (hdmitx_edid_search_IEEEOUI(&edid_buf[128])) {
prxcap->ieeeoui = HDMI_IEEE_OUI;
- pr_debug(EDID "find IEEEOUT\n");
+ HDMITX_DEBUG("find IEEEOUT\n");
} else {
prxcap->ieeeoui = 0x0;
- pr_debug(EDID "not find IEEEOUT\n");
+ HDMITX_DEBUG("not find IEEEOUT\n");
}
/* strictly DVI device judgement */
@@ -2791,22 +2797,13 @@
if (hdmitx_edid_check_data_valid(edid_check, &edid_buf[0]) &&
!hdmitx_edid_search_IEEEOUI(&edid_buf[128])) {
prxcap->ieeeoui = 0x0;
- pr_debug(EDID "sink is DVI device\n");
+ HDMITX_DEBUG("sink is DVI device\n");
} else {
prxcap->ieeeoui = HDMI_IEEE_OUI;
}
if (edid_zero_data(edid_buf))
prxcap->ieeeoui = HDMI_IEEE_OUI;
- if (!prxcap->AUD_count && !prxcap->ieeeoui)
- hdmitx_edid_set_default_aud(prxcap);
- /*
- * CEA-861F 7.5.2 If only Basic Audio is supported,
- * no Short Audio Descriptors are necessary.
- */
- if (!prxcap->AUD_count)
- hdmitx_edid_set_default_aud(prxcap);
-
update_edid_chksum(prxcap, edid_buf);
if (!hdmitx_edid_valid_block_num(&edid_buf[0])) {
@@ -2834,11 +2831,9 @@
if (edid_zero_data(edid_buf) || prxcap->VIC_count == 0)
hdmitx_edid_set_default_vic(prxcap);
- if (prxcap->ieeeoui != HDMI_IEEE_OUI)
- prxcap->physical_addr = 0xffff;
-
return 0;
}
+EXPORT_SYMBOL(hdmitx_edid_parse);
void hdmitx_edid_buffer_clear(u8 *edid_buf, int size)
{
@@ -2868,10 +2863,8 @@
prxcap->ieeeoui = HDMI_IEEE_OUI;
prxcap->edid_parsing = 0;
- hdmitx_edid_set_default_aud(prxcap);
rx_set_hdr_lumi(&tmp[0], 2);
/* rx_set_receiver_edid(&tmp[0], 2); */
- phy_addr_clear(&prxcap->vsdb_phy_addr);
}
/*
@@ -2891,7 +2884,7 @@
return;
memset(tmp_buf, 0, TMP_EDID_BUF_SIZE);
- HDMITX_INFO("edid: blk%d raw data\n", blk_idx);
+ HDMITX_DEBUG_EDID("edid: blk%d raw data\n", blk_idx);
for (i = 0, pos = 0; i < 128; i++) {
pos += sprintf(tmp_buf + pos, "%02x", blk[i]);
/* print 64 bytes a line */
@@ -2920,9 +2913,9 @@
if (tmp_chksum != 0) {
valid_blk_no++;
if ((tmp_chksum & 0xff) == 0)
- pr_debug(EDID "check sum valid\n");
+ HDMITX_DEBUG("check sum valid\n");
else
- pr_warn(EDID "check sum invalid\n");
+ HDMITX_ERROR("check sum invalid\n");
}
tmp_chksum = 0;
}
@@ -2948,7 +2941,7 @@
valid_blk_no = hdmitx_edid_valid_block_num(edid_buf);
if (valid_blk_no == 0) {
- pr_debug(EDID "raw data are all zeroes\n");
+ HDMITX_DEBUG("raw data are all zeroes\n");
} else {
for (blk_idx = 0; blk_idx < valid_blk_no; blk_idx++)
hdmitx_edid_blk_print(&edid_buf[blk_idx * 128], blk_idx);
@@ -2991,6 +2984,7 @@
* pos += snprintf(buffer + pos, buffer_len - pos,
* "EDID block number: 0x%x\n", tx_comm->EDID_buf[0x7e]);
*/
+
pos += snprintf(buffer + pos, buffer_len - pos,
"Source Physical Address[a.b.c.d]: %x.%x.%x.%x\n",
prxcap->vsdb_phy_addr.a,
diff --git a/include/amlogic/media/vout/hdmitx_common/hdmitx_edid.h b/include/amlogic/media/vout/hdmitx_common/hdmitx_edid.h
index 610c989..c4fbfd6 100644
--- a/include/amlogic/media/vout/hdmitx_common/hdmitx_edid.h
+++ b/include/amlogic/media/vout/hdmitx_common/hdmitx_edid.h
@@ -114,7 +114,6 @@
/*vendor*/
u32 ieeeoui;
u8 Max_TMDS_Clock1; /* HDMI1.4b TMDS_CLK */
- u16 physical_addr; /* CEC physical address */
u32 hf_ieeeoui; /* For HDMI Forum */
u32 Max_TMDS_Clock2; /* HDMI2.0 TMDS_CLK */
/* CEA861-F, Table 56, Colorimetry Data Block */
@@ -289,5 +288,7 @@
void hdmitx_edid_buffer_clear(u8 *edid_buf, int size);
void hdmitx_edid_rxcap_clear(struct rx_cap *prxcap);
bool is_support_y422(struct rx_cap *prxcap);
+void hdmitx_cec_phy_addr_parse(struct rx_cap *prxcap, u8 *edid_buf);
+int hdmitx_audio_parse(struct rx_cap *prxcap, u8 *block_buf);
#endif