diff options
author | Alex Deucher <alexdeucher@gmail.com> | 2010-02-05 04:21:19 -0500 |
---|---|---|
committer | Dave Airlie <airlied@redhat.com> | 2010-02-08 18:31:20 -0500 |
commit | 3c537889e17232e9073f75ae8710ea0f008c5a29 (patch) | |
tree | 9d3c25825b466b8ddc3fdc8224d4484c99173b08 /drivers/gpu/drm/radeon/radeon_display.c | |
parent | 2739d49cd7f1f44876cad614b072da698967b370 (diff) |
drm/radeon/kms: add support for hardcoded edids in rom (v2)
Some servers hardcode an edid in rom so that they will
work properly with KVMs. This is a port of the relevant
code from the ddx.
[airlied: reworked to validate edid at boot stage - and
remove special quirk, if there is a valid EDID in the BIOS rom
we'll just try and use it.]
Signed-off-by: Alex Deucher <alexdeucher@gmail.com>
Signed-off-by: Dave Airlie <airlied@redhat.com>
Diffstat (limited to 'drivers/gpu/drm/radeon/radeon_display.c')
-rw-r--r-- | drivers/gpu/drm/radeon/radeon_display.c | 14 |
1 files changed, 13 insertions, 1 deletions
diff --git a/drivers/gpu/drm/radeon/radeon_display.c b/drivers/gpu/drm/radeon/radeon_display.c index ec3166bfaa4..79634da7c31 100644 --- a/drivers/gpu/drm/radeon/radeon_display.c +++ b/drivers/gpu/drm/radeon/radeon_display.c | |||
@@ -352,6 +352,8 @@ static bool radeon_setup_enc_conn(struct drm_device *dev) | |||
352 | 352 | ||
353 | int radeon_ddc_get_modes(struct radeon_connector *radeon_connector) | 353 | int radeon_ddc_get_modes(struct radeon_connector *radeon_connector) |
354 | { | 354 | { |
355 | struct drm_device *dev = radeon_connector->base.dev; | ||
356 | struct radeon_device *rdev = dev->dev_private; | ||
355 | int ret = 0; | 357 | int ret = 0; |
356 | 358 | ||
357 | if ((radeon_connector->base.connector_type == DRM_MODE_CONNECTOR_DisplayPort) || | 359 | if ((radeon_connector->base.connector_type == DRM_MODE_CONNECTOR_DisplayPort) || |
@@ -366,7 +368,9 @@ int radeon_ddc_get_modes(struct radeon_connector *radeon_connector) | |||
366 | if (!radeon_connector->edid) { | 368 | if (!radeon_connector->edid) { |
367 | radeon_connector->edid = drm_get_edid(&radeon_connector->base, &radeon_connector->ddc_bus->adapter); | 369 | radeon_connector->edid = drm_get_edid(&radeon_connector->base, &radeon_connector->ddc_bus->adapter); |
368 | } | 370 | } |
369 | 371 | /* some servers provide a hardcoded edid in rom for KVMs */ | |
372 | if (!radeon_connector->edid) | ||
373 | radeon_connector->edid = radeon_combios_get_hardcoded_edid(rdev); | ||
370 | if (radeon_connector->edid) { | 374 | if (radeon_connector->edid) { |
371 | drm_mode_connector_update_edid_property(&radeon_connector->base, radeon_connector->edid); | 375 | drm_mode_connector_update_edid_property(&radeon_connector->base, radeon_connector->edid); |
372 | ret = drm_add_edid_modes(&radeon_connector->base, radeon_connector->edid); | 376 | ret = drm_add_edid_modes(&radeon_connector->base, radeon_connector->edid); |
@@ -829,6 +833,12 @@ int radeon_modeset_init(struct radeon_device *rdev) | |||
829 | return ret; | 833 | return ret; |
830 | } | 834 | } |
831 | 835 | ||
836 | /* check combios for a valid hardcoded EDID - Sun servers */ | ||
837 | if (!rdev->is_atom_bios) { | ||
838 | /* check for hardcoded EDID in BIOS */ | ||
839 | radeon_combios_check_hardcoded_edid(rdev); | ||
840 | } | ||
841 | |||
832 | if (rdev->flags & RADEON_SINGLE_CRTC) | 842 | if (rdev->flags & RADEON_SINGLE_CRTC) |
833 | num_crtc = 1; | 843 | num_crtc = 1; |
834 | 844 | ||
@@ -850,6 +860,8 @@ int radeon_modeset_init(struct radeon_device *rdev) | |||
850 | 860 | ||
851 | void radeon_modeset_fini(struct radeon_device *rdev) | 861 | void radeon_modeset_fini(struct radeon_device *rdev) |
852 | { | 862 | { |
863 | kfree(rdev->mode_info.bios_hardcoded_edid); | ||
864 | |||
853 | if (rdev->mode_info.mode_config_initialized) { | 865 | if (rdev->mode_info.mode_config_initialized) { |
854 | radeon_hpd_fini(rdev); | 866 | radeon_hpd_fini(rdev); |
855 | drm_mode_config_cleanup(rdev->ddev); | 867 | drm_mode_config_cleanup(rdev->ddev); |