diff options
Diffstat (limited to 'drivers/gpu/drm/radeon/radeon_device.c')
-rw-r--r-- | drivers/gpu/drm/radeon/radeon_device.c | 35 |
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) | |||
636 | static void radeon_switcheroo_set_state(struct pci_dev *pdev, enum vga_switcheroo_state state) | 650 | static 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(); |