Signed-off-by: Adam Jackson <a...@redhat.com>
---
 drivers/gpu/drm/drm_crtc.c              |    7 +++++--
 drivers/gpu/drm/drm_edid.c              |   19 +++++--------------
 drivers/gpu/drm/drm_sysfs.c             |    2 +-
 drivers/gpu/drm/radeon/radeon_combios.c |    8 ++++----
 include/drm/drm_edid.h                  |    3 ---
 5 files changed, 15 insertions(+), 24 deletions(-)

diff --git a/drivers/gpu/drm/drm_crtc.c b/drivers/gpu/drm/drm_crtc.c
index d91fb8c..aa24f2f 100644
--- a/drivers/gpu/drm/drm_crtc.c
+++ b/drivers/gpu/drm/drm_crtc.c
@@ -33,6 +33,7 @@
 #include "drm.h"
 #include "drmP.h"
 #include "drm_crtc.h"
+#include "drm_edid.h"
 
 struct drm_prop_enum_list {
        int type;
@@ -2349,7 +2350,7 @@ int drm_mode_connector_update_edid_property(struct 
drm_connector *connector,
                                            struct edid *edid)
 {
        struct drm_device *dev = connector->dev;
-       int ret = 0;
+       int ret = 0, size;
 
        if (connector->edid_blob_ptr)
                drm_property_destroy_blob(dev, connector->edid_blob_ptr);
@@ -2361,7 +2362,9 @@ int drm_mode_connector_update_edid_property(struct 
drm_connector *connector,
                return ret;
        }
 
-       connector->edid_blob_ptr = drm_property_create_blob(connector->dev, 
128, edid);
+       size = EDID_LENGTH * (1 + edid->extensions);
+       connector->edid_blob_ptr = drm_property_create_blob(connector->dev,
+                                                           size, edid);
 
        ret = drm_connector_property_set_value(connector,
                                               dev->mode_config.edid_property,
diff --git a/drivers/gpu/drm/drm_edid.c b/drivers/gpu/drm/drm_edid.c
index e0c37fb..9974638 100644
--- a/drivers/gpu/drm/drm_edid.c
+++ b/drivers/gpu/drm/drm_edid.c
@@ -1337,7 +1337,6 @@ static int add_detailed_info_eedid(struct drm_connector 
*connector,
        int i, modes = 0;
        char *edid_ext = NULL;
        struct detailed_timing *timing;
-       int edid_ext_num;
        int start_offset, end_offset;
        int timing_level;
 
@@ -1354,19 +1353,15 @@ static int add_detailed_info_eedid(struct drm_connector 
*connector,
                return 0;
        }
 
-       /* Chose real EDID extension number */
-       edid_ext_num = edid->extensions > DRM_MAX_EDID_EXT_NUM ?
-               DRM_MAX_EDID_EXT_NUM : edid->extensions;
-
        /* Find CEA extension */
-       for (i = 0; i < edid_ext_num; i++) {
+       for (i = 0; i < edid->extensions; i++) {
                edid_ext = (char *)edid + EDID_LENGTH * (i + 1);
                /* This block is CEA extension */
                if (edid_ext[0] == 0x02)
                        break;
        }
 
-       if (i == edid_ext_num) {
+       if (i == edid->extensions) {
                /* if there is no additional timing EDID block, return */
                return 0;
        }
@@ -1405,7 +1400,7 @@ static int add_detailed_info_eedid(struct drm_connector 
*connector,
 bool drm_detect_hdmi_monitor(struct edid *edid)
 {
        char *edid_ext = NULL;
-       int i, hdmi_id, edid_ext_num;
+       int i, hdmi_id;
        int start_offset, end_offset;
        bool is_hdmi = false;
 
@@ -1413,19 +1408,15 @@ bool drm_detect_hdmi_monitor(struct edid *edid)
        if (edid == NULL || edid->extensions == 0)
                goto end;
 
-       /* Chose real EDID extension number */
-       edid_ext_num = edid->extensions > DRM_MAX_EDID_EXT_NUM ?
-                      DRM_MAX_EDID_EXT_NUM : edid->extensions;
-
        /* Find CEA extension */
-       for (i = 0; i < edid_ext_num; i++) {
+       for (i = 0; i < edid->extensions; i++) {
                edid_ext = (char *)edid + EDID_LENGTH * (i + 1);
                /* This block is CEA extension */
                if (edid_ext[0] == 0x02)
                        break;
        }
 
-       if (i == edid_ext_num)
+       if (i == edid->extensions)
                goto end;
 
        /* Data block offset in CEA extension block */
diff --git a/drivers/gpu/drm/drm_sysfs.c b/drivers/gpu/drm/drm_sysfs.c
index 014ce24..7b7c83f 100644
--- a/drivers/gpu/drm/drm_sysfs.c
+++ b/drivers/gpu/drm/drm_sysfs.c
@@ -332,7 +332,7 @@ static struct device_attribute connector_attrs_opt1[] = {
 static struct bin_attribute edid_attr = {
        .attr.name = "edid",
        .attr.mode = 0444,
-       .size = 128,
+       .size = 0,
        .read = edid_show,
 };
 
diff --git a/drivers/gpu/drm/radeon/radeon_combios.c 
b/drivers/gpu/drm/radeon/radeon_combios.c
index e9ea38e..9949ae7 100644
--- a/drivers/gpu/drm/radeon/radeon_combios.c
+++ b/drivers/gpu/drm/radeon/radeon_combios.c
@@ -450,17 +450,17 @@ bool radeon_combios_check_hardcoded_edid(struct 
radeon_device *rdev)
 {
        int edid_info;
        struct edid *edid;
+       unsigned char *raw;
        edid_info = combios_get_table_offset(rdev->ddev, 
COMBIOS_HARDCODED_EDID_TABLE);
        if (!edid_info)
                return false;
 
-       edid = kmalloc(EDID_LENGTH * (DRM_MAX_EDID_EXT_NUM + 1),
-                      GFP_KERNEL);
+       raw = rdev->bios + edid_info;
+       edid = kmalloc(EDID_LENGTH * (raw[0x7e] + 1), GFP_KERNEL);
        if (edid == NULL)
                return false;
 
-       memcpy((unsigned char *)edid,
-              (unsigned char *)(rdev->bios + edid_info), EDID_LENGTH);
+       memcpy((unsigned char *)edid, raw, EDID_LENGTH * (raw[0x7e] + 1));
 
        if (!drm_edid_is_valid(edid)) {
                kfree(edid);
diff --git a/include/drm/drm_edid.h b/include/drm/drm_edid.h
index b420989..d33c3e0 100644
--- a/include/drm/drm_edid.h
+++ b/include/drm/drm_edid.h
@@ -201,7 +201,4 @@ struct edid {
 
 #define EDID_PRODUCT_ID(e) ((e)->prod_code[0] | ((e)->prod_code[1] << 8))
 
-/* define the number of Extension EDID block */
-#define DRM_MAX_EDID_EXT_NUM 4
-
 #endif /* __DRM_EDID_H__ */
-- 
1.6.6.1


------------------------------------------------------------------------------
Download Intel&#174; Parallel Studio Eval
Try the new software tools for yourself. Speed compiling, find bugs
proactively, and fine-tune applications for parallel performance.
See why Intel Parallel Studio got high marks during beta.
http://p.sf.net/sfu/intel-sw-dev
--
_______________________________________________
Dri-devel mailing list
Dri-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/dri-devel

Reply via email to