aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/radeon/radeon_device.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/gpu/drm/radeon/radeon_device.c')
-rw-r--r--drivers/gpu/drm/radeon/radeon_device.c35
1 files changed, 22 insertions, 13 deletions
diff --git a/drivers/gpu/drm/radeon/radeon_device.c b/drivers/gpu/drm/radeon/radeon_device.c
index 501966a13f48..26091d602b84 100644
--- a/drivers/gpu/drm/radeon/radeon_device.c
+++ b/drivers/gpu/drm/radeon/radeon_device.c
@@ -81,6 +81,10 @@ static const char radeon_family_name[][16] = {
81 "JUNIPER", 81 "JUNIPER",
82 "CYPRESS", 82 "CYPRESS",
83 "HEMLOCK", 83 "HEMLOCK",
84 "PALM",
85 "BARTS",
86 "TURKS",
87 "CAICOS",
84 "LAST", 88 "LAST",
85}; 89};
86 90
@@ -224,6 +228,11 @@ int radeon_wb_init(struct radeon_device *rdev)
224 rdev->wb.use_event = true; 228 rdev->wb.use_event = true;
225 } 229 }
226 } 230 }
231 /* always use writeback/events on NI */
232 if (ASIC_IS_DCE5(rdev)) {
233 rdev->wb.enabled = true;
234 rdev->wb.use_event = true;
235 }
227 236
228 dev_info(rdev->dev, "WB %sabled\n", rdev->wb.enabled ? "en" : "dis"); 237 dev_info(rdev->dev, "WB %sabled\n", rdev->wb.enabled ? "en" : "dis");
229 238
@@ -335,7 +344,12 @@ bool radeon_card_posted(struct radeon_device *rdev)
335 uint32_t reg; 344 uint32_t reg;
336 345
337 /* first check CRTCs */ 346 /* first check CRTCs */
338 if (ASIC_IS_DCE4(rdev)) { 347 if (ASIC_IS_DCE41(rdev)) {
348 reg = RREG32(EVERGREEN_CRTC_CONTROL + EVERGREEN_CRTC0_REGISTER_OFFSET) |
349 RREG32(EVERGREEN_CRTC_CONTROL + EVERGREEN_CRTC1_REGISTER_OFFSET);
350 if (reg & EVERGREEN_CRTC_MASTER_EN)
351 return true;
352 } else if (ASIC_IS_DCE4(rdev)) {
339 reg = RREG32(EVERGREEN_CRTC_CONTROL + EVERGREEN_CRTC0_REGISTER_OFFSET) | 353 reg = RREG32(EVERGREEN_CRTC_CONTROL + EVERGREEN_CRTC0_REGISTER_OFFSET) |
340 RREG32(EVERGREEN_CRTC_CONTROL + EVERGREEN_CRTC1_REGISTER_OFFSET) | 354 RREG32(EVERGREEN_CRTC_CONTROL + EVERGREEN_CRTC1_REGISTER_OFFSET) |
341 RREG32(EVERGREEN_CRTC_CONTROL + EVERGREEN_CRTC2_REGISTER_OFFSET) | 355 RREG32(EVERGREEN_CRTC_CONTROL + EVERGREEN_CRTC2_REGISTER_OFFSET) |
@@ -636,20 +650,20 @@ void radeon_check_arguments(struct radeon_device *rdev)
636static void radeon_switcheroo_set_state(struct pci_dev *pdev, enum vga_switcheroo_state state) 650static void radeon_switcheroo_set_state(struct pci_dev *pdev, enum vga_switcheroo_state state)
637{ 651{
638 struct drm_device *dev = pci_get_drvdata(pdev); 652 struct drm_device *dev = pci_get_drvdata(pdev);
639 struct radeon_device *rdev = dev->dev_private;
640 pm_message_t pmm = { .event = PM_EVENT_SUSPEND }; 653 pm_message_t pmm = { .event = PM_EVENT_SUSPEND };
641 if (state == VGA_SWITCHEROO_ON) { 654 if (state == VGA_SWITCHEROO_ON) {
642 printk(KERN_INFO "radeon: switched on\n"); 655 printk(KERN_INFO "radeon: switched on\n");
643 /* don't suspend or resume card normally */ 656 /* don't suspend or resume card normally */
644 rdev->powered_down = false; 657 dev->switch_power_state = DRM_SWITCH_POWER_CHANGING;
645 radeon_resume_kms(dev); 658 radeon_resume_kms(dev);
659 dev->switch_power_state = DRM_SWITCH_POWER_ON;
646 drm_kms_helper_poll_enable(dev); 660 drm_kms_helper_poll_enable(dev);
647 } else { 661 } else {
648 printk(KERN_INFO "radeon: switched off\n"); 662 printk(KERN_INFO "radeon: switched off\n");
649 drm_kms_helper_poll_disable(dev); 663 drm_kms_helper_poll_disable(dev);
664 dev->switch_power_state = DRM_SWITCH_POWER_CHANGING;
650 radeon_suspend_kms(dev, pmm); 665 radeon_suspend_kms(dev, pmm);
651 /* don't suspend or resume card normally */ 666 dev->switch_power_state = DRM_SWITCH_POWER_OFF;
652 rdev->powered_down = true;
653 } 667 }
654} 668}
655 669
@@ -704,11 +718,6 @@ int radeon_device_init(struct radeon_device *rdev,
704 init_waitqueue_head(&rdev->irq.vblank_queue); 718 init_waitqueue_head(&rdev->irq.vblank_queue);
705 init_waitqueue_head(&rdev->irq.idle_queue); 719 init_waitqueue_head(&rdev->irq.idle_queue);
706 720
707 /* setup workqueue */
708 rdev->wq = create_workqueue("radeon");
709 if (rdev->wq == NULL)
710 return -ENOMEM;
711
712 /* Set asic functions */ 721 /* Set asic functions */
713 r = radeon_asic_init(rdev); 722 r = radeon_asic_init(rdev);
714 if (r) 723 if (r)
@@ -773,6 +782,7 @@ int radeon_device_init(struct radeon_device *rdev,
773 vga_client_register(rdev->pdev, rdev, NULL, radeon_vga_set_decode); 782 vga_client_register(rdev->pdev, rdev, NULL, radeon_vga_set_decode);
774 vga_switcheroo_register_client(rdev->pdev, 783 vga_switcheroo_register_client(rdev->pdev,
775 radeon_switcheroo_set_state, 784 radeon_switcheroo_set_state,
785 NULL,
776 radeon_switcheroo_can_switch); 786 radeon_switcheroo_can_switch);
777 787
778 r = radeon_init(rdev); 788 r = radeon_init(rdev);
@@ -806,7 +816,6 @@ void radeon_device_fini(struct radeon_device *rdev)
806 /* evict vram memory */ 816 /* evict vram memory */
807 radeon_bo_evict_vram(rdev); 817 radeon_bo_evict_vram(rdev);
808 radeon_fini(rdev); 818 radeon_fini(rdev);
809 destroy_workqueue(rdev->wq);
810 vga_switcheroo_unregister_client(rdev->pdev); 819 vga_switcheroo_unregister_client(rdev->pdev);
811 vga_client_register(rdev->pdev, NULL, NULL, NULL); 820 vga_client_register(rdev->pdev, NULL, NULL, NULL);
812 if (rdev->rio_mem) 821 if (rdev->rio_mem)
@@ -835,7 +844,7 @@ int radeon_suspend_kms(struct drm_device *dev, pm_message_t state)
835 } 844 }
836 rdev = dev->dev_private; 845 rdev = dev->dev_private;
837 846
838 if (rdev->powered_down) 847 if (dev->switch_power_state == DRM_SWITCH_POWER_OFF)
839 return 0; 848 return 0;
840 849
841 /* turn off display hw */ 850 /* turn off display hw */
@@ -893,7 +902,7 @@ int radeon_resume_kms(struct drm_device *dev)
893 struct drm_connector *connector; 902 struct drm_connector *connector;
894 struct radeon_device *rdev = dev->dev_private; 903 struct radeon_device *rdev = dev->dev_private;
895 904
896 if (rdev->powered_down) 905 if (dev->switch_power_state == DRM_SWITCH_POWER_OFF)
897 return 0; 906 return 0;
898 907
899 acquire_console_sem(); 908 acquire_console_sem();