Signed-off-by: Adam Jackson <ajax@redhat.com>
Signed-off-by: Dave Airlie <airlied@redhat.com>
#include "drm.h"
#include "drmP.h"
#include "drm_crtc.h"
#include "drm.h"
#include "drmP.h"
#include "drm_crtc.h"
struct drm_prop_enum_list {
int type;
struct drm_prop_enum_list {
int type;
struct edid *edid)
{
struct drm_device *dev = connector->dev;
struct edid *edid)
{
struct drm_device *dev = connector->dev;
if (connector->edid_blob_ptr)
drm_property_destroy_blob(dev, connector->edid_blob_ptr);
if (connector->edid_blob_ptr)
drm_property_destroy_blob(dev, connector->edid_blob_ptr);
- 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,
ret = drm_connector_property_set_value(connector,
dev->mode_config.edid_property,
int i, modes = 0;
char *edid_ext = NULL;
struct detailed_timing *timing;
int i, modes = 0;
char *edid_ext = NULL;
struct detailed_timing *timing;
int start_offset, end_offset;
int timing_level;
int start_offset, end_offset;
int timing_level;
- /* Chose real EDID extension number */
- edid_ext_num = edid->extensions > DRM_MAX_EDID_EXT_NUM ?
- DRM_MAX_EDID_EXT_NUM : edid->extensions;
-
- 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;
}
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;
}
/* if there is no additional timing EDID block, return */
return 0;
}
bool drm_detect_hdmi_monitor(struct edid *edid)
{
char *edid_ext = NULL;
bool drm_detect_hdmi_monitor(struct edid *edid)
{
char *edid_ext = NULL;
- int i, hdmi_id, edid_ext_num;
int start_offset, end_offset;
bool is_hdmi = false;
int start_offset, end_offset;
bool is_hdmi = false;
if (edid == NULL || edid->extensions == 0)
goto end;
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;
-
- 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;
}
edid_ext = (char *)edid + EDID_LENGTH * (i + 1);
/* This block is CEA extension */
if (edid_ext[0] == 0x02)
break;
}
+ if (i == edid->extensions)
goto end;
/* Data block offset in CEA extension block */
goto end;
/* Data block offset in CEA extension block */
static struct bin_attribute edid_attr = {
.attr.name = "edid",
.attr.mode = 0444,
static struct bin_attribute edid_attr = {
.attr.name = "edid",
.attr.mode = 0444,
{
int edid_info;
struct edid *edid;
{
int edid_info;
struct edid *edid;
edid_info = combios_get_table_offset(rdev->ddev, COMBIOS_HARDCODED_EDID_TABLE);
if (!edid_info)
return false;
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;
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);
if (!drm_edid_is_valid(edid)) {
kfree(edid);
#define EDID_PRODUCT_ID(e) ((e)->prod_code[0] | ((e)->prod_code[1] << 8))
#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__ */
#endif /* __DRM_EDID_H__ */