aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/radeon/radeon_connectors.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/gpu/drm/radeon/radeon_connectors.c')
-rw-r--r--drivers/gpu/drm/radeon/radeon_connectors.c237
1 files changed, 216 insertions, 21 deletions
diff --git a/drivers/gpu/drm/radeon/radeon_connectors.c b/drivers/gpu/drm/radeon/radeon_connectors.c
index 5ee81b6a879..af1d551f1a8 100644
--- a/drivers/gpu/drm/radeon/radeon_connectors.c
+++ b/drivers/gpu/drm/radeon/radeon_connectors.c
@@ -39,6 +39,15 @@ radeon_atombios_connected_scratch_regs(struct drm_connector *connector,
39 struct drm_encoder *encoder, 39 struct drm_encoder *encoder,
40 bool connected); 40 bool connected);
41 41
42static void radeon_property_change_mode(struct drm_encoder *encoder)
43{
44 struct drm_crtc *crtc = encoder->crtc;
45
46 if (crtc && crtc->enabled) {
47 drm_crtc_helper_set_mode(crtc, &crtc->mode,
48 crtc->x, crtc->y, crtc->fb);
49 }
50}
42static void 51static void
43radeon_connector_update_scratch_regs(struct drm_connector *connector, enum drm_connector_status status) 52radeon_connector_update_scratch_regs(struct drm_connector *connector, enum drm_connector_status status)
44{ 53{
@@ -78,6 +87,27 @@ radeon_connector_update_scratch_regs(struct drm_connector *connector, enum drm_c
78 } 87 }
79} 88}
80 89
90struct drm_encoder *radeon_find_encoder(struct drm_connector *connector, int encoder_type)
91{
92 struct drm_mode_object *obj;
93 struct drm_encoder *encoder;
94 int i;
95
96 for (i = 0; i < DRM_CONNECTOR_MAX_ENCODER; i++) {
97 if (connector->encoder_ids[i] == 0)
98 break;
99
100 obj = drm_mode_object_find(connector->dev, connector->encoder_ids[i], DRM_MODE_OBJECT_ENCODER);
101 if (!obj)
102 continue;
103
104 encoder = obj_to_encoder(obj);
105 if (encoder->encoder_type == encoder_type)
106 return encoder;
107 }
108 return NULL;
109}
110
81struct drm_encoder *radeon_best_single_encoder(struct drm_connector *connector) 111struct drm_encoder *radeon_best_single_encoder(struct drm_connector *connector)
82{ 112{
83 int enc_id = connector->encoder_ids[0]; 113 int enc_id = connector->encoder_ids[0];
@@ -95,7 +125,6 @@ struct drm_encoder *radeon_best_single_encoder(struct drm_connector *connector)
95 return NULL; 125 return NULL;
96} 126}
97 127
98
99/* 128/*
100 * radeon_connector_analog_encoder_conflict_solve 129 * radeon_connector_analog_encoder_conflict_solve
101 * - search for other connectors sharing this encoder 130 * - search for other connectors sharing this encoder
@@ -224,6 +253,89 @@ static void radeon_add_common_modes(struct drm_encoder *encoder, struct drm_conn
224int radeon_connector_set_property(struct drm_connector *connector, struct drm_property *property, 253int radeon_connector_set_property(struct drm_connector *connector, struct drm_property *property,
225 uint64_t val) 254 uint64_t val)
226{ 255{
256 struct drm_device *dev = connector->dev;
257 struct radeon_device *rdev = dev->dev_private;
258 struct drm_encoder *encoder;
259 struct radeon_encoder *radeon_encoder;
260
261 if (property == rdev->mode_info.coherent_mode_property) {
262 struct radeon_encoder_atom_dig *dig;
263
264 /* need to find digital encoder on connector */
265 encoder = radeon_find_encoder(connector, DRM_MODE_ENCODER_TMDS);
266 if (!encoder)
267 return 0;
268
269 radeon_encoder = to_radeon_encoder(encoder);
270
271 if (!radeon_encoder->enc_priv)
272 return 0;
273
274 dig = radeon_encoder->enc_priv;
275 dig->coherent_mode = val ? true : false;
276 radeon_property_change_mode(&radeon_encoder->base);
277 }
278
279 if (property == rdev->mode_info.tv_std_property) {
280 encoder = radeon_find_encoder(connector, DRM_MODE_ENCODER_TVDAC);
281 if (!encoder) {
282 encoder = radeon_find_encoder(connector, DRM_MODE_ENCODER_DAC);
283 }
284
285 if (!encoder)
286 return 0;
287
288 radeon_encoder = to_radeon_encoder(encoder);
289 if (!radeon_encoder->enc_priv)
290 return 0;
291 if (rdev->is_atom_bios) {
292 struct radeon_encoder_atom_dac *dac_int;
293 dac_int = radeon_encoder->enc_priv;
294 dac_int->tv_std = val;
295 } else {
296 struct radeon_encoder_tv_dac *dac_int;
297 dac_int = radeon_encoder->enc_priv;
298 dac_int->tv_std = val;
299 }
300 radeon_property_change_mode(&radeon_encoder->base);
301 }
302
303 if (property == rdev->mode_info.load_detect_property) {
304 struct radeon_connector *radeon_connector =
305 to_radeon_connector(connector);
306
307 if (val == 0)
308 radeon_connector->dac_load_detect = false;
309 else
310 radeon_connector->dac_load_detect = true;
311 }
312
313 if (property == rdev->mode_info.tmds_pll_property) {
314 struct radeon_encoder_int_tmds *tmds = NULL;
315 bool ret = false;
316 /* need to find digital encoder on connector */
317 encoder = radeon_find_encoder(connector, DRM_MODE_ENCODER_TMDS);
318 if (!encoder)
319 return 0;
320
321 radeon_encoder = to_radeon_encoder(encoder);
322
323 tmds = radeon_encoder->enc_priv;
324 if (!tmds)
325 return 0;
326
327 if (val == 0) {
328 if (rdev->is_atom_bios)
329 ret = radeon_atombios_get_tmds_info(radeon_encoder, tmds);
330 else
331 ret = radeon_legacy_get_tmds_info_from_combios(radeon_encoder, tmds);
332 }
333 if (val == 1 || ret == false) {
334 radeon_legacy_get_tmds_info_from_table(radeon_encoder, tmds);
335 }
336 radeon_property_change_mode(&radeon_encoder->base);
337 }
338
227 return 0; 339 return 0;
228} 340}
229 341
@@ -320,6 +432,42 @@ static void radeon_connector_destroy(struct drm_connector *connector)
320 kfree(connector); 432 kfree(connector);
321} 433}
322 434
435static int radeon_lvds_set_property(struct drm_connector *connector,
436 struct drm_property *property,
437 uint64_t value)
438{
439 struct drm_device *dev = connector->dev;
440 struct radeon_encoder *radeon_encoder;
441 enum radeon_rmx_type rmx_type;
442
443 DRM_DEBUG("\n");
444 if (property != dev->mode_config.scaling_mode_property)
445 return 0;
446
447 if (connector->encoder)
448 radeon_encoder = to_radeon_encoder(connector->encoder);
449 else {
450 struct drm_connector_helper_funcs *connector_funcs = connector->helper_private;
451 radeon_encoder = to_radeon_encoder(connector_funcs->best_encoder(connector));
452 }
453
454 switch (value) {
455 case DRM_MODE_SCALE_NONE: rmx_type = RMX_OFF; break;
456 case DRM_MODE_SCALE_CENTER: rmx_type = RMX_CENTER; break;
457 case DRM_MODE_SCALE_ASPECT: rmx_type = RMX_ASPECT; break;
458 default:
459 case DRM_MODE_SCALE_FULLSCREEN: rmx_type = RMX_FULL; break;
460 }
461 if (radeon_encoder->rmx_type == rmx_type)
462 return 0;
463
464 radeon_encoder->rmx_type = rmx_type;
465
466 radeon_property_change_mode(&radeon_encoder->base);
467 return 0;
468}
469
470
323struct drm_connector_helper_funcs radeon_lvds_connector_helper_funcs = { 471struct drm_connector_helper_funcs radeon_lvds_connector_helper_funcs = {
324 .get_modes = radeon_lvds_get_modes, 472 .get_modes = radeon_lvds_get_modes,
325 .mode_valid = radeon_lvds_mode_valid, 473 .mode_valid = radeon_lvds_mode_valid,
@@ -331,7 +479,7 @@ struct drm_connector_funcs radeon_lvds_connector_funcs = {
331 .detect = radeon_lvds_detect, 479 .detect = radeon_lvds_detect,
332 .fill_modes = drm_helper_probe_single_connector_modes, 480 .fill_modes = drm_helper_probe_single_connector_modes,
333 .destroy = radeon_connector_destroy, 481 .destroy = radeon_connector_destroy,
334 .set_property = radeon_connector_set_property, 482 .set_property = radeon_lvds_set_property,
335}; 483};
336 484
337static int radeon_vga_get_modes(struct drm_connector *connector) 485static int radeon_vga_get_modes(struct drm_connector *connector)
@@ -368,8 +516,10 @@ static enum drm_connector_status radeon_vga_detect(struct drm_connector *connect
368 if (dret) 516 if (dret)
369 ret = connector_status_connected; 517 ret = connector_status_connected;
370 else { 518 else {
371 encoder_funcs = encoder->helper_private; 519 if (radeon_connector->dac_load_detect) {
372 ret = encoder_funcs->detect(encoder, connector); 520 encoder_funcs = encoder->helper_private;
521 ret = encoder_funcs->detect(encoder, connector);
522 }
373 } 523 }
374 524
375 if (ret == connector_status_connected) 525 if (ret == connector_status_connected)
@@ -426,7 +576,11 @@ static enum drm_connector_status radeon_tv_detect(struct drm_connector *connecto
426{ 576{
427 struct drm_encoder *encoder; 577 struct drm_encoder *encoder;
428 struct drm_encoder_helper_funcs *encoder_funcs; 578 struct drm_encoder_helper_funcs *encoder_funcs;
429 int ret; 579 struct radeon_connector *radeon_connector = to_radeon_connector(connector);
580 enum drm_connector_status ret = connector_status_disconnected;
581
582 if (!radeon_connector->dac_load_detect)
583 return ret;
430 584
431 encoder = radeon_best_single_encoder(connector); 585 encoder = radeon_best_single_encoder(connector);
432 if (!encoder) 586 if (!encoder)
@@ -510,27 +664,29 @@ static enum drm_connector_status radeon_dvi_detect(struct drm_connector *connect
510 goto out; 664 goto out;
511 665
512 /* find analog encoder */ 666 /* find analog encoder */
513 for (i = 0; i < DRM_CONNECTOR_MAX_ENCODER; i++) { 667 if (radeon_connector->dac_load_detect) {
514 if (connector->encoder_ids[i] == 0) 668 for (i = 0; i < DRM_CONNECTOR_MAX_ENCODER; i++) {
515 break; 669 if (connector->encoder_ids[i] == 0)
670 break;
516 671
517 obj = drm_mode_object_find(connector->dev, 672 obj = drm_mode_object_find(connector->dev,
518 connector->encoder_ids[i], 673 connector->encoder_ids[i],
519 DRM_MODE_OBJECT_ENCODER); 674 DRM_MODE_OBJECT_ENCODER);
520 if (!obj) 675 if (!obj)
521 continue; 676 continue;
522 677
523 encoder = obj_to_encoder(obj); 678 encoder = obj_to_encoder(obj);
524 679
525 encoder_funcs = encoder->helper_private; 680 encoder_funcs = encoder->helper_private;
526 if (encoder_funcs->detect) { 681 if (encoder_funcs->detect) {
527 if (ret != connector_status_connected) { 682 if (ret != connector_status_connected) {
528 ret = encoder_funcs->detect(encoder, connector); 683 ret = encoder_funcs->detect(encoder, connector);
529 if (ret == connector_status_connected) { 684 if (ret == connector_status_connected) {
530 radeon_connector->use_digital = false; 685 radeon_connector->use_digital = false;
686 }
531 } 687 }
688 break;
532 } 689 }
533 break;
534 } 690 }
535 } 691 }
536 692
@@ -610,6 +766,7 @@ radeon_add_atom_connector(struct drm_device *dev,
610 bool linkb, 766 bool linkb,
611 uint32_t igp_lane_info) 767 uint32_t igp_lane_info)
612{ 768{
769 struct radeon_device *rdev = dev->dev_private;
613 struct drm_connector *connector; 770 struct drm_connector *connector;
614 struct radeon_connector *radeon_connector; 771 struct radeon_connector *radeon_connector;
615 struct radeon_connector_atom_dig *radeon_dig_connector; 772 struct radeon_connector_atom_dig *radeon_dig_connector;
@@ -645,6 +802,9 @@ radeon_add_atom_connector(struct drm_device *dev,
645 if (!radeon_connector->ddc_bus) 802 if (!radeon_connector->ddc_bus)
646 goto failed; 803 goto failed;
647 } 804 }
805 drm_connector_attach_property(&radeon_connector->base,
806 rdev->mode_info.load_detect_property,
807 1);
648 break; 808 break;
649 case DRM_MODE_CONNECTOR_DVIA: 809 case DRM_MODE_CONNECTOR_DVIA:
650 drm_connector_init(dev, &radeon_connector->base, &radeon_vga_connector_funcs, connector_type); 810 drm_connector_init(dev, &radeon_connector->base, &radeon_vga_connector_funcs, connector_type);
@@ -654,6 +814,9 @@ radeon_add_atom_connector(struct drm_device *dev,
654 if (!radeon_connector->ddc_bus) 814 if (!radeon_connector->ddc_bus)
655 goto failed; 815 goto failed;
656 } 816 }
817 drm_connector_attach_property(&radeon_connector->base,
818 rdev->mode_info.load_detect_property,
819 1);
657 break; 820 break;
658 case DRM_MODE_CONNECTOR_DVII: 821 case DRM_MODE_CONNECTOR_DVII:
659 case DRM_MODE_CONNECTOR_DVID: 822 case DRM_MODE_CONNECTOR_DVID:
@@ -671,6 +834,12 @@ radeon_add_atom_connector(struct drm_device *dev,
671 goto failed; 834 goto failed;
672 } 835 }
673 subpixel_order = SubPixelHorizontalRGB; 836 subpixel_order = SubPixelHorizontalRGB;
837 drm_connector_attach_property(&radeon_connector->base,
838 rdev->mode_info.coherent_mode_property,
839 1);
840 drm_connector_attach_property(&radeon_connector->base,
841 rdev->mode_info.load_detect_property,
842 1);
674 break; 843 break;
675 case DRM_MODE_CONNECTOR_HDMIA: 844 case DRM_MODE_CONNECTOR_HDMIA:
676 case DRM_MODE_CONNECTOR_HDMIB: 845 case DRM_MODE_CONNECTOR_HDMIB:
@@ -687,6 +856,9 @@ radeon_add_atom_connector(struct drm_device *dev,
687 if (!radeon_connector->ddc_bus) 856 if (!radeon_connector->ddc_bus)
688 goto failed; 857 goto failed;
689 } 858 }
859 drm_connector_attach_property(&radeon_connector->base,
860 rdev->mode_info.coherent_mode_property,
861 1);
690 subpixel_order = SubPixelHorizontalRGB; 862 subpixel_order = SubPixelHorizontalRGB;
691 break; 863 break;
692 case DRM_MODE_CONNECTOR_DisplayPort: 864 case DRM_MODE_CONNECTOR_DisplayPort:
@@ -712,6 +884,9 @@ radeon_add_atom_connector(struct drm_device *dev,
712 drm_connector_init(dev, &radeon_connector->base, &radeon_tv_connector_funcs, connector_type); 884 drm_connector_init(dev, &radeon_connector->base, &radeon_tv_connector_funcs, connector_type);
713 drm_connector_helper_add(&radeon_connector->base, &radeon_tv_connector_helper_funcs); 885 drm_connector_helper_add(&radeon_connector->base, &radeon_tv_connector_helper_funcs);
714 } 886 }
887 drm_connector_attach_property(&radeon_connector->base,
888 rdev->mode_info.load_detect_property,
889 1);
715 break; 890 break;
716 case DRM_MODE_CONNECTOR_LVDS: 891 case DRM_MODE_CONNECTOR_LVDS:
717 radeon_dig_connector = kzalloc(sizeof(struct radeon_connector_atom_dig), GFP_KERNEL); 892 radeon_dig_connector = kzalloc(sizeof(struct radeon_connector_atom_dig), GFP_KERNEL);
@@ -727,6 +902,10 @@ radeon_add_atom_connector(struct drm_device *dev,
727 if (!radeon_connector->ddc_bus) 902 if (!radeon_connector->ddc_bus)
728 goto failed; 903 goto failed;
729 } 904 }
905 drm_mode_create_scaling_mode_property(dev);
906 drm_connector_attach_property(&radeon_connector->base,
907 dev->mode_config.scaling_mode_property,
908 DRM_MODE_SCALE_FULLSCREEN);
730 subpixel_order = SubPixelHorizontalRGB; 909 subpixel_order = SubPixelHorizontalRGB;
731 break; 910 break;
732 } 911 }
@@ -749,6 +928,7 @@ radeon_add_legacy_connector(struct drm_device *dev,
749 int connector_type, 928 int connector_type,
750 struct radeon_i2c_bus_rec *i2c_bus) 929 struct radeon_i2c_bus_rec *i2c_bus)
751{ 930{
931 struct radeon_device *rdev = dev->dev_private;
752 struct drm_connector *connector; 932 struct drm_connector *connector;
753 struct radeon_connector *radeon_connector; 933 struct radeon_connector *radeon_connector;
754 uint32_t subpixel_order = SubPixelNone; 934 uint32_t subpixel_order = SubPixelNone;
@@ -783,6 +963,9 @@ radeon_add_legacy_connector(struct drm_device *dev,
783 if (!radeon_connector->ddc_bus) 963 if (!radeon_connector->ddc_bus)
784 goto failed; 964 goto failed;
785 } 965 }
966 drm_connector_attach_property(&radeon_connector->base,
967 rdev->mode_info.load_detect_property,
968 1);
786 break; 969 break;
787 case DRM_MODE_CONNECTOR_DVIA: 970 case DRM_MODE_CONNECTOR_DVIA:
788 drm_connector_init(dev, &radeon_connector->base, &radeon_vga_connector_funcs, connector_type); 971 drm_connector_init(dev, &radeon_connector->base, &radeon_vga_connector_funcs, connector_type);
@@ -792,6 +975,9 @@ radeon_add_legacy_connector(struct drm_device *dev,
792 if (!radeon_connector->ddc_bus) 975 if (!radeon_connector->ddc_bus)
793 goto failed; 976 goto failed;
794 } 977 }
978 drm_connector_attach_property(&radeon_connector->base,
979 rdev->mode_info.load_detect_property,
980 1);
795 break; 981 break;
796 case DRM_MODE_CONNECTOR_DVII: 982 case DRM_MODE_CONNECTOR_DVII:
797 case DRM_MODE_CONNECTOR_DVID: 983 case DRM_MODE_CONNECTOR_DVID:
@@ -801,6 +987,9 @@ radeon_add_legacy_connector(struct drm_device *dev,
801 radeon_connector->ddc_bus = radeon_i2c_create(dev, i2c_bus, "DVI"); 987 radeon_connector->ddc_bus = radeon_i2c_create(dev, i2c_bus, "DVI");
802 if (!radeon_connector->ddc_bus) 988 if (!radeon_connector->ddc_bus)
803 goto failed; 989 goto failed;
990 drm_connector_attach_property(&radeon_connector->base,
991 rdev->mode_info.load_detect_property,
992 1);
804 } 993 }
805 subpixel_order = SubPixelHorizontalRGB; 994 subpixel_order = SubPixelHorizontalRGB;
806 break; 995 break;
@@ -810,6 +999,9 @@ radeon_add_legacy_connector(struct drm_device *dev,
810 if (radeon_tv == 1) { 999 if (radeon_tv == 1) {
811 drm_connector_init(dev, &radeon_connector->base, &radeon_tv_connector_funcs, connector_type); 1000 drm_connector_init(dev, &radeon_connector->base, &radeon_tv_connector_funcs, connector_type);
812 drm_connector_helper_add(&radeon_connector->base, &radeon_tv_connector_helper_funcs); 1001 drm_connector_helper_add(&radeon_connector->base, &radeon_tv_connector_helper_funcs);
1002 drm_connector_attach_property(&radeon_connector->base,
1003 rdev->mode_info.load_detect_property,
1004 1);
813 } 1005 }
814 break; 1006 break;
815 case DRM_MODE_CONNECTOR_LVDS: 1007 case DRM_MODE_CONNECTOR_LVDS:
@@ -820,6 +1012,9 @@ radeon_add_legacy_connector(struct drm_device *dev,
820 if (!radeon_connector->ddc_bus) 1012 if (!radeon_connector->ddc_bus)
821 goto failed; 1013 goto failed;
822 } 1014 }
1015 drm_connector_attach_property(&radeon_connector->base,
1016 dev->mode_config.scaling_mode_property,
1017 DRM_MODE_SCALE_FULLSCREEN);
823 subpixel_order = SubPixelHorizontalRGB; 1018 subpixel_order = SubPixelHorizontalRGB;
824 break; 1019 break;
825 } 1020 }