summaryrefslogtreecommitdiff
path: root/lib/igt_kms.c
diff options
context:
space:
mode:
authorSimon Ser <simon.ser@intel.com>2019-07-04 14:12:43 +0300
committerSimon Ser <simon.ser@intel.com>2019-07-11 10:05:59 +0300
commit7323650a4bccdd3ab82d898dd4476da6fbe256dd (patch)
tree777462367795050e19734d05ea443357c18c9acf /lib/igt_kms.c
parentb4c9f82f530c017eb935f2783c65553387a75819 (diff)
lib/igt_kms: add igt_kms_get_3d_edid
This replaces kmstest_edid_add_3d. The previous code for generating CEA extensions can be removed. The old and new generated EDIDs are byte-to-byte equal. Signed-off-by: Simon Ser <simon.ser@intel.com> Reviewed-by: Arkadiusz Hiler <arkadiusz.hiler@intel.com>
Diffstat (limited to 'lib/igt_kms.c')
-rw-r--r--lib/igt_kms.c149
1 files changed, 51 insertions, 98 deletions
diff --git a/lib/igt_kms.c b/lib/igt_kms.c
index 6fe3d4f0..8a76acf9 100644
--- a/lib/igt_kms.c
+++ b/lib/igt_kms.c
@@ -116,9 +116,6 @@ static void update_edid_csum(unsigned char *edid, int cea_pos)
* - 800x600 60Hz
* - 640x480 60Hz
*
- * This can be extended with further features using functions such as
- * #kmstest_edid_add_3d.
- *
* Returns: a basic edid block
*/
const unsigned char *igt_kms_get_base_edid(void)
@@ -155,9 +152,6 @@ const unsigned char *igt_kms_get_base_edid(void)
* - 800x600 60Hz
* - 640x480 60Hz
*
- * This can be extended with further features using functions such as
- * #kmstest_edid_add_3d.
- *
* Returns: an alternate edid block
*/
const unsigned char *igt_kms_get_alt_edid(void)
@@ -344,6 +338,57 @@ const unsigned char *igt_kms_get_4k_edid(void)
return raw_edid;
}
+const unsigned char *igt_kms_get_3d_edid(void)
+{
+ static unsigned char raw_edid[256] = {0};
+ struct edid *edid;
+ struct edid_ext *edid_ext;
+ struct edid_cea *edid_cea;
+ char *cea_data;
+ struct edid_cea_data_block *block;
+ /* We'll add 5 extension fields to the HDMI VSDB. */
+ char raw_hdmi[HDMI_VSDB_MIN_SIZE + 5] = {0};
+ struct hdmi_vsdb *hdmi;
+ size_t cea_data_size = 0;
+
+ /* Create a new EDID from the base IGT EDID, and add an
+ * extension that advertises 3D support. */
+ edid = (struct edid *) raw_edid;
+ memcpy(edid, igt_kms_get_base_edid(), sizeof(struct edid));
+ edid->extensions_len = 1;
+ edid_ext = &edid->extensions[0];
+ edid_cea = &edid_ext->data.cea;
+ cea_data = edid_cea->data;
+
+ /* Short Video Descriptor */
+ block = (struct edid_cea_data_block *) &cea_data[cea_data_size];
+ cea_data_size += edid_cea_data_block_set_svd(block, edid_4k_svds,
+ sizeof(edid_4k_svds));
+
+ /* Vendor-Specific Data Block */
+ hdmi = (struct hdmi_vsdb *) raw_hdmi;
+ hdmi->src_phy_addr[0] = 0x10;
+ hdmi->src_phy_addr[1] = 0x00;
+ /* 5 extension fields */
+ hdmi->flags1 = 0;
+ hdmi->max_tdms_clock = 0;
+ hdmi->flags2 = HDMI_VSDB_VIDEO_PRESENT;
+ hdmi->data[0] = HDMI_VSDB_VIDEO_3D_PRESENT; /* HDMI video flags */
+ hdmi->data[1] = 0; /* 0 VIC entries, 0 3D entries */
+
+ block = (struct edid_cea_data_block *) &cea_data[cea_data_size];
+ cea_data_size += edid_cea_data_block_set_hdmi_vsdb(block, hdmi,
+ sizeof(raw_hdmi));
+
+ assert(cea_data_size <= sizeof(edid_cea->data));
+
+ edid_ext_set_cea(edid_ext, cea_data_size, 0, 0);
+
+ edid_update_checksum(edid);
+ edid_ext_update_cea_checksum(edid_ext);
+ return raw_edid;
+}
+
const char * const igt_plane_prop_names[IGT_NUM_PLANE_PROPS] = {
[IGT_PLANE_SRC_X] = "SRC_X",
[IGT_PLANE_SRC_Y] = "SRC_Y",
@@ -1401,98 +1446,6 @@ kmstest_get_property(int drm_fd, uint32_t object_id, uint32_t object_type,
return found;
}
-struct edid_block {
- int pos;
- unsigned char *data;
-};
-
-static struct edid_block
-init_cea_block(const unsigned char *edid, size_t length,
- unsigned char *new_edid_ptr[], size_t *new_length,
- char extra_extensions_length,
- uint32_t dtd_support)
-{
- struct edid_block new_edid;
- int n_extensions;
- int pos;
- static const char cea_header_len = 4, video_block_len = 6;
-
- igt_assert(new_edid_ptr != NULL && new_length != NULL);
-
- *new_length = length + 128;
-
- new_edid.data = calloc(*new_length, sizeof(*new_edid.data));
- igt_assert_f(new_edid.data, "Failed to allocate %zu bytes for edid\n", sizeof(new_length));
- memcpy(new_edid.data, edid, length);
- *new_edid_ptr = new_edid.data;
-
- n_extensions = new_edid.data[126];
- n_extensions++;
- new_edid.data[126] = n_extensions;
-
- update_edid_csum(new_edid.data, 0);
-
- /* add a cea-861 extension block */
- pos = length;
- new_edid.data[pos++] = 0x2;
- new_edid.data[pos++] = 0x3;
- new_edid.data[pos++] = cea_header_len + video_block_len +
- extra_extensions_length;
- new_edid.data[pos++] = dtd_support;
-
- /* video block (id | length) */
- new_edid.data[pos++] = 2 << 5 | (video_block_len - 1);
- new_edid.data[pos++] = 32 | 0x80; /* 1080p @ 24Hz | (native)*/
- new_edid.data[pos++] = 5; /* 1080i @ 60Hz */
- new_edid.data[pos++] = 20; /* 1080i @ 50Hz */
- new_edid.data[pos++] = 4; /* 720p @ 60Hz*/
- new_edid.data[pos++] = 19; /* 720p @ 50Hz*/
- new_edid.pos = pos;
-
- return new_edid;
-}
-
-/**
- * kmstest_edid_add_3d:
- * @edid: an existing valid edid block
- * @length: length of @edid
- * @new_edid_ptr: pointer to where the new edid will be placed
- * @new_length: pointer to the size of the new edid
- *
- * Makes a copy of an existing edid block and adds an extension indicating
- * stereo 3D capabilities.
- */
-void kmstest_edid_add_3d(const unsigned char *edid, size_t length,
- unsigned char *new_edid_ptr[], size_t *new_length)
-{
- char vsdb_block_len = 11;
- struct edid_block new_edid = init_cea_block(edid, length, new_edid_ptr,
- new_length, vsdb_block_len,
- 0);
- int pos = new_edid.pos;
-
- /* vsdb block ( id | length ) */
- new_edid.data[pos++] = 3 << 5 | (vsdb_block_len - 1);
- /* registration id */
- new_edid.data[pos++] = 0x3;
- new_edid.data[pos++] = 0xc;
- new_edid.data[pos++] = 0x0;
- /* source physical address */
- new_edid.data[pos++] = 0x10;
- new_edid.data[pos++] = 0x00;
- /* Supports_AI ... etc */
- new_edid.data[pos++] = 0x00;
- /* Max TMDS Clock */
- new_edid.data[pos++] = 0x00;
- /* Latency present, HDMI Video Present */
- new_edid.data[pos++] = 0x20;
- /* HDMI Video */
- new_edid.data[pos++] = 0x80;
- new_edid.data[pos++] = 0x00;
-
- update_edid_csum(new_edid.data, length);
-}
-
/**
* kmstest_unset_all_crtcs:
* @drm_fd: the DRM fd