diff options
author | Simon Ser <simon.ser@intel.com> | 2019-07-04 14:12:43 +0300 |
---|---|---|
committer | Simon Ser <simon.ser@intel.com> | 2019-07-11 10:05:59 +0300 |
commit | 7323650a4bccdd3ab82d898dd4476da6fbe256dd (patch) | |
tree | 777462367795050e19734d05ea443357c18c9acf /lib/igt_kms.c | |
parent | b4c9f82f530c017eb935f2783c65553387a75819 (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.c | 149 |
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 |