diff options
author | Alex Deucher <alexdeucher@gmail.com> | 2010-08-12 18:58:47 -0400 |
---|---|---|
committer | Dave Airlie <airlied@redhat.com> | 2010-08-19 18:44:05 -0400 |
commit | 5137ee940c3e593ae5578a7a12a604eb8f239ac0 (patch) | |
tree | d26b8f4ad4f4154ec46276ae8a43e6ee579a84a4 /drivers/gpu/drm/radeon/radeon_atombios.c | |
parent | fbee67a65d16c431ae3c389db13688c6e1b1b9d8 (diff) |
drm/radeon/kms: rework encoder handling
On most newer asics, digital encoders have two links each
and they can be used independantly. As such, treat them as
separate encoders otherwise the individual links will not
get programmed properly at modeset time.
Signed-off-by: Alex Deucher <alexdeucher@gmail.com>
Signed-off-by: Dave Airlie <airlied@redhat.com>
Diffstat (limited to 'drivers/gpu/drm/radeon/radeon_atombios.c')
-rw-r--r-- | drivers/gpu/drm/radeon/radeon_atombios.c | 35 |
1 files changed, 19 insertions, 16 deletions
diff --git a/drivers/gpu/drm/radeon/radeon_atombios.c b/drivers/gpu/drm/radeon/radeon_atombios.c index 4a4225e601fb..b015915441ba 100644 --- a/drivers/gpu/drm/radeon/radeon_atombios.c +++ b/drivers/gpu/drm/radeon/radeon_atombios.c | |||
@@ -32,11 +32,11 @@ | |||
32 | 32 | ||
33 | /* from radeon_encoder.c */ | 33 | /* from radeon_encoder.c */ |
34 | extern uint32_t | 34 | extern uint32_t |
35 | radeon_get_encoder_id(struct drm_device *dev, uint32_t supported_device, | 35 | radeon_get_encoder_enum(struct drm_device *dev, uint32_t supported_device, |
36 | uint8_t dac); | 36 | uint8_t dac); |
37 | extern void radeon_link_encoder_connector(struct drm_device *dev); | 37 | extern void radeon_link_encoder_connector(struct drm_device *dev); |
38 | extern void | 38 | extern void |
39 | radeon_add_atom_encoder(struct drm_device *dev, uint32_t encoder_id, | 39 | radeon_add_atom_encoder(struct drm_device *dev, uint32_t encoder_enum, |
40 | uint32_t supported_device); | 40 | uint32_t supported_device); |
41 | 41 | ||
42 | /* from radeon_connector.c */ | 42 | /* from radeon_connector.c */ |
@@ -46,14 +46,14 @@ radeon_add_atom_connector(struct drm_device *dev, | |||
46 | uint32_t supported_device, | 46 | uint32_t supported_device, |
47 | int connector_type, | 47 | int connector_type, |
48 | struct radeon_i2c_bus_rec *i2c_bus, | 48 | struct radeon_i2c_bus_rec *i2c_bus, |
49 | bool linkb, uint32_t igp_lane_info, | 49 | uint32_t igp_lane_info, |
50 | uint16_t connector_object_id, | 50 | uint16_t connector_object_id, |
51 | struct radeon_hpd *hpd, | 51 | struct radeon_hpd *hpd, |
52 | struct radeon_router *router); | 52 | struct radeon_router *router); |
53 | 53 | ||
54 | /* from radeon_legacy_encoder.c */ | 54 | /* from radeon_legacy_encoder.c */ |
55 | extern void | 55 | extern void |
56 | radeon_add_legacy_encoder(struct drm_device *dev, uint32_t encoder_id, | 56 | radeon_add_legacy_encoder(struct drm_device *dev, uint32_t encoder_enum, |
57 | uint32_t supported_device); | 57 | uint32_t supported_device); |
58 | 58 | ||
59 | union atom_supported_devices { | 59 | union atom_supported_devices { |
@@ -479,7 +479,6 @@ bool radeon_get_atom_connector_info_from_object_table(struct drm_device *dev) | |||
479 | int i, j, k, path_size, device_support; | 479 | int i, j, k, path_size, device_support; |
480 | int connector_type; | 480 | int connector_type; |
481 | u16 igp_lane_info, conn_id, connector_object_id; | 481 | u16 igp_lane_info, conn_id, connector_object_id; |
482 | bool linkb; | ||
483 | struct radeon_i2c_bus_rec ddc_bus; | 482 | struct radeon_i2c_bus_rec ddc_bus; |
484 | struct radeon_router router; | 483 | struct radeon_router router; |
485 | struct radeon_gpio_rec gpio; | 484 | struct radeon_gpio_rec gpio; |
@@ -512,7 +511,7 @@ bool radeon_get_atom_connector_info_from_object_table(struct drm_device *dev) | |||
512 | addr += path_size; | 511 | addr += path_size; |
513 | path = (ATOM_DISPLAY_OBJECT_PATH *) addr; | 512 | path = (ATOM_DISPLAY_OBJECT_PATH *) addr; |
514 | path_size += le16_to_cpu(path->usSize); | 513 | path_size += le16_to_cpu(path->usSize); |
515 | linkb = false; | 514 | |
516 | if (device_support & le16_to_cpu(path->usDeviceTag)) { | 515 | if (device_support & le16_to_cpu(path->usDeviceTag)) { |
517 | uint8_t con_obj_id, con_obj_num, con_obj_type; | 516 | uint8_t con_obj_id, con_obj_num, con_obj_type; |
518 | 517 | ||
@@ -603,13 +602,10 @@ bool radeon_get_atom_connector_info_from_object_table(struct drm_device *dev) | |||
603 | OBJECT_TYPE_MASK) >> OBJECT_TYPE_SHIFT; | 602 | OBJECT_TYPE_MASK) >> OBJECT_TYPE_SHIFT; |
604 | 603 | ||
605 | if (grph_obj_type == GRAPH_OBJECT_TYPE_ENCODER) { | 604 | if (grph_obj_type == GRAPH_OBJECT_TYPE_ENCODER) { |
606 | if (grph_obj_num == 2) | 605 | u16 encoder_obj = le16_to_cpu(path->usGraphicObjIds[j]); |
607 | linkb = true; | ||
608 | else | ||
609 | linkb = false; | ||
610 | 606 | ||
611 | radeon_add_atom_encoder(dev, | 607 | radeon_add_atom_encoder(dev, |
612 | grph_obj_id, | 608 | encoder_obj, |
613 | le16_to_cpu | 609 | le16_to_cpu |
614 | (path-> | 610 | (path-> |
615 | usDeviceTag)); | 611 | usDeviceTag)); |
@@ -746,7 +742,7 @@ bool radeon_get_atom_connector_info_from_object_table(struct drm_device *dev) | |||
746 | le16_to_cpu(path-> | 742 | le16_to_cpu(path-> |
747 | usDeviceTag), | 743 | usDeviceTag), |
748 | connector_type, &ddc_bus, | 744 | connector_type, &ddc_bus, |
749 | linkb, igp_lane_info, | 745 | igp_lane_info, |
750 | connector_object_id, | 746 | connector_object_id, |
751 | &hpd, | 747 | &hpd, |
752 | &router); | 748 | &router); |
@@ -935,13 +931,13 @@ bool radeon_get_atom_connector_info_from_supported_devices_table(struct | |||
935 | 931 | ||
936 | if (ASIC_IS_AVIVO(rdev) || radeon_r4xx_atom) | 932 | if (ASIC_IS_AVIVO(rdev) || radeon_r4xx_atom) |
937 | radeon_add_atom_encoder(dev, | 933 | radeon_add_atom_encoder(dev, |
938 | radeon_get_encoder_id(dev, | 934 | radeon_get_encoder_enum(dev, |
939 | (1 << i), | 935 | (1 << i), |
940 | dac), | 936 | dac), |
941 | (1 << i)); | 937 | (1 << i)); |
942 | else | 938 | else |
943 | radeon_add_legacy_encoder(dev, | 939 | radeon_add_legacy_encoder(dev, |
944 | radeon_get_encoder_id(dev, | 940 | radeon_get_encoder_enum(dev, |
945 | (1 << i), | 941 | (1 << i), |
946 | dac), | 942 | dac), |
947 | (1 << i)); | 943 | (1 << i)); |
@@ -998,7 +994,7 @@ bool radeon_get_atom_connector_info_from_supported_devices_table(struct | |||
998 | bios_connectors[i]. | 994 | bios_connectors[i]. |
999 | connector_type, | 995 | connector_type, |
1000 | &bios_connectors[i].ddc_bus, | 996 | &bios_connectors[i].ddc_bus, |
1001 | false, 0, | 997 | 0, |
1002 | connector_object_id, | 998 | connector_object_id, |
1003 | &bios_connectors[i].hpd, | 999 | &bios_connectors[i].hpd, |
1004 | &router); | 1000 | &router); |
@@ -1307,6 +1303,7 @@ struct radeon_encoder_atom_dig *radeon_atombios_get_lvds_info(struct | |||
1307 | union lvds_info *lvds_info; | 1303 | union lvds_info *lvds_info; |
1308 | uint8_t frev, crev; | 1304 | uint8_t frev, crev; |
1309 | struct radeon_encoder_atom_dig *lvds = NULL; | 1305 | struct radeon_encoder_atom_dig *lvds = NULL; |
1306 | int encoder_enum = (encoder->encoder_enum & ENUM_ID_MASK) >> ENUM_ID_SHIFT; | ||
1310 | 1307 | ||
1311 | if (atom_parse_data_header(mode_info->atom_context, index, NULL, | 1308 | if (atom_parse_data_header(mode_info->atom_context, index, NULL, |
1312 | &frev, &crev, &data_offset)) { | 1309 | &frev, &crev, &data_offset)) { |
@@ -1370,6 +1367,12 @@ struct radeon_encoder_atom_dig *radeon_atombios_get_lvds_info(struct | |||
1370 | } | 1367 | } |
1371 | 1368 | ||
1372 | encoder->native_mode = lvds->native_mode; | 1369 | encoder->native_mode = lvds->native_mode; |
1370 | |||
1371 | if (encoder_enum == 2) | ||
1372 | lvds->linkb = true; | ||
1373 | else | ||
1374 | lvds->linkb = false; | ||
1375 | |||
1373 | } | 1376 | } |
1374 | return lvds; | 1377 | return lvds; |
1375 | } | 1378 | } |