aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTejun Heo <tj@kernel.org>2011-01-03 08:49:32 -0500
committerDave Airlie <airlied@redhat.com>2011-01-05 23:32:16 -0500
commit32c87fca2fac490e34a9fa900b45f2fbb4faacf9 (patch)
tree181e9c1d1493124f0a0f5a8a65be4bf29053b77e
parentaf5dd83b873efd4e1477f2265b6fa15a825aff26 (diff)
drm/radeon: use system_wq instead of dev_priv->wq
With cmwq, there's no reason for radeon to use a dedicated workqueue. Drop dev_priv->wq and use system_wq instead. Because radeon_driver_irq_uninstall_kms() may be called from unsleepable context, the work items can't be flushed from there. Instead, init and flush from radeon_irq_kms_init/fini(). While at it, simplify canceling/flushing of rdev->pm.dynpm_idle_work. Always initialize and sync cancel instead of being unnecessarily smart about it. Signed-off-by: Tejun Heo <tj@kernel.org> Acked-by: Alex Deucher <alexdeucher@gmail.com> Cc: dri-devel@lists.freedesktop.org Signed-off-by: Dave Airlie <airlied@redhat.com>
-rw-r--r--drivers/gpu/drm/radeon/evergreen.c2
-rw-r--r--drivers/gpu/drm/radeon/r100.c2
-rw-r--r--drivers/gpu/drm/radeon/r600.c2
-rw-r--r--drivers/gpu/drm/radeon/radeon.h1
-rw-r--r--drivers/gpu/drm/radeon/radeon_device.c6
-rw-r--r--drivers/gpu/drm/radeon/radeon_irq_kms.c5
-rw-r--r--drivers/gpu/drm/radeon/radeon_pm.c47
-rw-r--r--drivers/gpu/drm/radeon/rs600.c2
8 files changed, 23 insertions, 44 deletions
diff --git a/drivers/gpu/drm/radeon/evergreen.c b/drivers/gpu/drm/radeon/evergreen.c
index 3ae63ceb9c33..eaf4fba90b72 100644
--- a/drivers/gpu/drm/radeon/evergreen.c
+++ b/drivers/gpu/drm/radeon/evergreen.c
@@ -2756,7 +2756,7 @@ restart_ih:
2756 if (wptr != rdev->ih.wptr) 2756 if (wptr != rdev->ih.wptr)
2757 goto restart_ih; 2757 goto restart_ih;
2758 if (queue_hotplug) 2758 if (queue_hotplug)
2759 queue_work(rdev->wq, &rdev->hotplug_work); 2759 schedule_work(&rdev->hotplug_work);
2760 rdev->ih.rptr = rptr; 2760 rdev->ih.rptr = rptr;
2761 WREG32(IH_RB_RPTR, rdev->ih.rptr); 2761 WREG32(IH_RB_RPTR, rdev->ih.rptr);
2762 spin_unlock_irqrestore(&rdev->ih.lock, flags); 2762 spin_unlock_irqrestore(&rdev->ih.lock, flags);
diff --git a/drivers/gpu/drm/radeon/r100.c b/drivers/gpu/drm/radeon/r100.c
index 300b4a64d8fe..f637595b14e1 100644
--- a/drivers/gpu/drm/radeon/r100.c
+++ b/drivers/gpu/drm/radeon/r100.c
@@ -682,7 +682,7 @@ int r100_irq_process(struct radeon_device *rdev)
682 /* reset gui idle ack. the status bit is broken */ 682 /* reset gui idle ack. the status bit is broken */
683 rdev->irq.gui_idle_acked = false; 683 rdev->irq.gui_idle_acked = false;
684 if (queue_hotplug) 684 if (queue_hotplug)
685 queue_work(rdev->wq, &rdev->hotplug_work); 685 schedule_work(&rdev->hotplug_work);
686 if (rdev->msi_enabled) { 686 if (rdev->msi_enabled) {
687 switch (rdev->family) { 687 switch (rdev->family) {
688 case CHIP_RS400: 688 case CHIP_RS400:
diff --git a/drivers/gpu/drm/radeon/r600.c b/drivers/gpu/drm/radeon/r600.c
index f95ca5b44396..279794c391e9 100644
--- a/drivers/gpu/drm/radeon/r600.c
+++ b/drivers/gpu/drm/radeon/r600.c
@@ -3442,7 +3442,7 @@ restart_ih:
3442 if (wptr != rdev->ih.wptr) 3442 if (wptr != rdev->ih.wptr)
3443 goto restart_ih; 3443 goto restart_ih;
3444 if (queue_hotplug) 3444 if (queue_hotplug)
3445 queue_work(rdev->wq, &rdev->hotplug_work); 3445 schedule_work(&rdev->hotplug_work);
3446 rdev->ih.rptr = rptr; 3446 rdev->ih.rptr = rptr;
3447 WREG32(IH_RB_RPTR, rdev->ih.rptr); 3447 WREG32(IH_RB_RPTR, rdev->ih.rptr);
3448 spin_unlock_irqrestore(&rdev->ih.lock, flags); 3448 spin_unlock_irqrestore(&rdev->ih.lock, flags);
diff --git a/drivers/gpu/drm/radeon/radeon.h b/drivers/gpu/drm/radeon/radeon.h
index a835d95021d1..aff8080026a1 100644
--- a/drivers/gpu/drm/radeon/radeon.h
+++ b/drivers/gpu/drm/radeon/radeon.h
@@ -1152,7 +1152,6 @@ struct radeon_device {
1152 struct r700_vram_scratch vram_scratch; 1152 struct r700_vram_scratch vram_scratch;
1153 int msi_enabled; /* msi enabled */ 1153 int msi_enabled; /* msi enabled */
1154 struct r600_ih ih; /* r6/700 interrupt ring */ 1154 struct r600_ih ih; /* r6/700 interrupt ring */
1155 struct workqueue_struct *wq;
1156 struct work_struct hotplug_work; 1155 struct work_struct hotplug_work;
1157 int num_crtc; /* number of crtcs */ 1156 int num_crtc; /* number of crtcs */
1158 struct mutex dc_hw_i2c_mutex; /* display controller hw i2c mutex */ 1157 struct mutex dc_hw_i2c_mutex; /* display controller hw i2c mutex */
diff --git a/drivers/gpu/drm/radeon/radeon_device.c b/drivers/gpu/drm/radeon/radeon_device.c
index 4ee0c53b28a7..44cf0d707006 100644
--- a/drivers/gpu/drm/radeon/radeon_device.c
+++ b/drivers/gpu/drm/radeon/radeon_device.c
@@ -710,11 +710,6 @@ int radeon_device_init(struct radeon_device *rdev,
710 init_waitqueue_head(&rdev->irq.vblank_queue); 710 init_waitqueue_head(&rdev->irq.vblank_queue);
711 init_waitqueue_head(&rdev->irq.idle_queue); 711 init_waitqueue_head(&rdev->irq.idle_queue);
712 712
713 /* setup workqueue */
714 rdev->wq = create_workqueue("radeon");
715 if (rdev->wq == NULL)
716 return -ENOMEM;
717
718 /* Set asic functions */ 713 /* Set asic functions */
719 r = radeon_asic_init(rdev); 714 r = radeon_asic_init(rdev);
720 if (r) 715 if (r)
@@ -813,7 +808,6 @@ void radeon_device_fini(struct radeon_device *rdev)
813 /* evict vram memory */ 808 /* evict vram memory */
814 radeon_bo_evict_vram(rdev); 809 radeon_bo_evict_vram(rdev);
815 radeon_fini(rdev); 810 radeon_fini(rdev);
816 destroy_workqueue(rdev->wq);
817 vga_switcheroo_unregister_client(rdev->pdev); 811 vga_switcheroo_unregister_client(rdev->pdev);
818 vga_client_register(rdev->pdev, NULL, NULL, NULL); 812 vga_client_register(rdev->pdev, NULL, NULL, NULL);
819 if (rdev->rio_mem) 813 if (rdev->rio_mem)
diff --git a/drivers/gpu/drm/radeon/radeon_irq_kms.c b/drivers/gpu/drm/radeon/radeon_irq_kms.c
index c6861bb751ad..a289646e8aa4 100644
--- a/drivers/gpu/drm/radeon/radeon_irq_kms.c
+++ b/drivers/gpu/drm/radeon/radeon_irq_kms.c
@@ -64,8 +64,6 @@ void radeon_driver_irq_preinstall_kms(struct drm_device *dev)
64 struct radeon_device *rdev = dev->dev_private; 64 struct radeon_device *rdev = dev->dev_private;
65 unsigned i; 65 unsigned i;
66 66
67 INIT_WORK(&rdev->hotplug_work, radeon_hotplug_work_func);
68
69 /* Disable *all* interrupts */ 67 /* Disable *all* interrupts */
70 rdev->irq.sw_int = false; 68 rdev->irq.sw_int = false;
71 rdev->irq.gui_idle = false; 69 rdev->irq.gui_idle = false;
@@ -114,6 +112,8 @@ int radeon_irq_kms_init(struct radeon_device *rdev)
114{ 112{
115 int r = 0; 113 int r = 0;
116 114
115 INIT_WORK(&rdev->hotplug_work, radeon_hotplug_work_func);
116
117 spin_lock_init(&rdev->irq.sw_lock); 117 spin_lock_init(&rdev->irq.sw_lock);
118 r = drm_vblank_init(rdev->ddev, rdev->num_crtc); 118 r = drm_vblank_init(rdev->ddev, rdev->num_crtc);
119 if (r) { 119 if (r) {
@@ -152,6 +152,7 @@ void radeon_irq_kms_fini(struct radeon_device *rdev)
152 if (rdev->msi_enabled) 152 if (rdev->msi_enabled)
153 pci_disable_msi(rdev->pdev); 153 pci_disable_msi(rdev->pdev);
154 } 154 }
155 flush_work_sync(&rdev->hotplug_work);
155} 156}
156 157
157void radeon_irq_kms_sw_irq_get(struct radeon_device *rdev) 158void radeon_irq_kms_sw_irq_get(struct radeon_device *rdev)
diff --git a/drivers/gpu/drm/radeon/radeon_pm.c b/drivers/gpu/drm/radeon/radeon_pm.c
index 4de7776bd1c5..0afd26ccccfa 100644
--- a/drivers/gpu/drm/radeon/radeon_pm.c
+++ b/drivers/gpu/drm/radeon/radeon_pm.c
@@ -405,20 +405,13 @@ static ssize_t radeon_set_pm_method(struct device *dev,
405 rdev->pm.dynpm_planned_action = DYNPM_ACTION_DEFAULT; 405 rdev->pm.dynpm_planned_action = DYNPM_ACTION_DEFAULT;
406 mutex_unlock(&rdev->pm.mutex); 406 mutex_unlock(&rdev->pm.mutex);
407 } else if (strncmp("profile", buf, strlen("profile")) == 0) { 407 } else if (strncmp("profile", buf, strlen("profile")) == 0) {
408 bool flush_wq = false;
409
410 mutex_lock(&rdev->pm.mutex); 408 mutex_lock(&rdev->pm.mutex);
411 if (rdev->pm.pm_method == PM_METHOD_DYNPM) {
412 cancel_delayed_work(&rdev->pm.dynpm_idle_work);
413 flush_wq = true;
414 }
415 /* disable dynpm */ 409 /* disable dynpm */
416 rdev->pm.dynpm_state = DYNPM_STATE_DISABLED; 410 rdev->pm.dynpm_state = DYNPM_STATE_DISABLED;
417 rdev->pm.dynpm_planned_action = DYNPM_ACTION_NONE; 411 rdev->pm.dynpm_planned_action = DYNPM_ACTION_NONE;
418 rdev->pm.pm_method = PM_METHOD_PROFILE; 412 rdev->pm.pm_method = PM_METHOD_PROFILE;
419 mutex_unlock(&rdev->pm.mutex); 413 mutex_unlock(&rdev->pm.mutex);
420 if (flush_wq) 414 cancel_delayed_work_sync(&rdev->pm.dynpm_idle_work);
421 flush_workqueue(rdev->wq);
422 } else { 415 } else {
423 DRM_ERROR("invalid power method!\n"); 416 DRM_ERROR("invalid power method!\n");
424 goto fail; 417 goto fail;
@@ -524,18 +517,14 @@ static void radeon_hwmon_fini(struct radeon_device *rdev)
524 517
525void radeon_pm_suspend(struct radeon_device *rdev) 518void radeon_pm_suspend(struct radeon_device *rdev)
526{ 519{
527 bool flush_wq = false;
528
529 mutex_lock(&rdev->pm.mutex); 520 mutex_lock(&rdev->pm.mutex);
530 if (rdev->pm.pm_method == PM_METHOD_DYNPM) { 521 if (rdev->pm.pm_method == PM_METHOD_DYNPM) {
531 cancel_delayed_work(&rdev->pm.dynpm_idle_work);
532 if (rdev->pm.dynpm_state == DYNPM_STATE_ACTIVE) 522 if (rdev->pm.dynpm_state == DYNPM_STATE_ACTIVE)
533 rdev->pm.dynpm_state = DYNPM_STATE_SUSPENDED; 523 rdev->pm.dynpm_state = DYNPM_STATE_SUSPENDED;
534 flush_wq = true;
535 } 524 }
536 mutex_unlock(&rdev->pm.mutex); 525 mutex_unlock(&rdev->pm.mutex);
537 if (flush_wq) 526
538 flush_workqueue(rdev->wq); 527 cancel_delayed_work_sync(&rdev->pm.dynpm_idle_work);
539} 528}
540 529
541void radeon_pm_resume(struct radeon_device *rdev) 530void radeon_pm_resume(struct radeon_device *rdev)
@@ -550,8 +539,8 @@ void radeon_pm_resume(struct radeon_device *rdev)
550 if (rdev->pm.pm_method == PM_METHOD_DYNPM 539 if (rdev->pm.pm_method == PM_METHOD_DYNPM
551 && rdev->pm.dynpm_state == DYNPM_STATE_SUSPENDED) { 540 && rdev->pm.dynpm_state == DYNPM_STATE_SUSPENDED) {
552 rdev->pm.dynpm_state = DYNPM_STATE_ACTIVE; 541 rdev->pm.dynpm_state = DYNPM_STATE_ACTIVE;
553 queue_delayed_work(rdev->wq, &rdev->pm.dynpm_idle_work, 542 schedule_delayed_work(&rdev->pm.dynpm_idle_work,
554 msecs_to_jiffies(RADEON_IDLE_LOOP_MS)); 543 msecs_to_jiffies(RADEON_IDLE_LOOP_MS));
555 } 544 }
556 mutex_unlock(&rdev->pm.mutex); 545 mutex_unlock(&rdev->pm.mutex);
557 radeon_pm_compute_clocks(rdev); 546 radeon_pm_compute_clocks(rdev);
@@ -585,6 +574,9 @@ int radeon_pm_init(struct radeon_device *rdev)
585 ret = radeon_hwmon_init(rdev); 574 ret = radeon_hwmon_init(rdev);
586 if (ret) 575 if (ret)
587 return ret; 576 return ret;
577
578 INIT_DELAYED_WORK(&rdev->pm.dynpm_idle_work, radeon_dynpm_idle_work_handler);
579
588 if (rdev->pm.num_power_states > 1) { 580 if (rdev->pm.num_power_states > 1) {
589 /* where's the best place to put these? */ 581 /* where's the best place to put these? */
590 ret = device_create_file(rdev->dev, &dev_attr_power_profile); 582 ret = device_create_file(rdev->dev, &dev_attr_power_profile);
@@ -598,8 +590,6 @@ int radeon_pm_init(struct radeon_device *rdev)
598 rdev->acpi_nb.notifier_call = radeon_acpi_event; 590 rdev->acpi_nb.notifier_call = radeon_acpi_event;
599 register_acpi_notifier(&rdev->acpi_nb); 591 register_acpi_notifier(&rdev->acpi_nb);
600#endif 592#endif
601 INIT_DELAYED_WORK(&rdev->pm.dynpm_idle_work, radeon_dynpm_idle_work_handler);
602
603 if (radeon_debugfs_pm_init(rdev)) { 593 if (radeon_debugfs_pm_init(rdev)) {
604 DRM_ERROR("Failed to register debugfs file for PM!\n"); 594 DRM_ERROR("Failed to register debugfs file for PM!\n");
605 } 595 }
@@ -613,25 +603,20 @@ int radeon_pm_init(struct radeon_device *rdev)
613void radeon_pm_fini(struct radeon_device *rdev) 603void radeon_pm_fini(struct radeon_device *rdev)
614{ 604{
615 if (rdev->pm.num_power_states > 1) { 605 if (rdev->pm.num_power_states > 1) {
616 bool flush_wq = false;
617
618 mutex_lock(&rdev->pm.mutex); 606 mutex_lock(&rdev->pm.mutex);
619 if (rdev->pm.pm_method == PM_METHOD_PROFILE) { 607 if (rdev->pm.pm_method == PM_METHOD_PROFILE) {
620 rdev->pm.profile = PM_PROFILE_DEFAULT; 608 rdev->pm.profile = PM_PROFILE_DEFAULT;
621 radeon_pm_update_profile(rdev); 609 radeon_pm_update_profile(rdev);
622 radeon_pm_set_clocks(rdev); 610 radeon_pm_set_clocks(rdev);
623 } else if (rdev->pm.pm_method == PM_METHOD_DYNPM) { 611 } else if (rdev->pm.pm_method == PM_METHOD_DYNPM) {
624 /* cancel work */
625 cancel_delayed_work(&rdev->pm.dynpm_idle_work);
626 flush_wq = true;
627 /* reset default clocks */ 612 /* reset default clocks */
628 rdev->pm.dynpm_state = DYNPM_STATE_DISABLED; 613 rdev->pm.dynpm_state = DYNPM_STATE_DISABLED;
629 rdev->pm.dynpm_planned_action = DYNPM_ACTION_DEFAULT; 614 rdev->pm.dynpm_planned_action = DYNPM_ACTION_DEFAULT;
630 radeon_pm_set_clocks(rdev); 615 radeon_pm_set_clocks(rdev);
631 } 616 }
632 mutex_unlock(&rdev->pm.mutex); 617 mutex_unlock(&rdev->pm.mutex);
633 if (flush_wq) 618
634 flush_workqueue(rdev->wq); 619 cancel_delayed_work_sync(&rdev->pm.dynpm_idle_work);
635 620
636 device_remove_file(rdev->dev, &dev_attr_power_profile); 621 device_remove_file(rdev->dev, &dev_attr_power_profile);
637 device_remove_file(rdev->dev, &dev_attr_power_method); 622 device_remove_file(rdev->dev, &dev_attr_power_method);
@@ -690,12 +675,12 @@ void radeon_pm_compute_clocks(struct radeon_device *rdev)
690 radeon_pm_get_dynpm_state(rdev); 675 radeon_pm_get_dynpm_state(rdev);
691 radeon_pm_set_clocks(rdev); 676 radeon_pm_set_clocks(rdev);
692 677
693 queue_delayed_work(rdev->wq, &rdev->pm.dynpm_idle_work, 678 schedule_delayed_work(&rdev->pm.dynpm_idle_work,
694 msecs_to_jiffies(RADEON_IDLE_LOOP_MS)); 679 msecs_to_jiffies(RADEON_IDLE_LOOP_MS));
695 } else if (rdev->pm.dynpm_state == DYNPM_STATE_PAUSED) { 680 } else if (rdev->pm.dynpm_state == DYNPM_STATE_PAUSED) {
696 rdev->pm.dynpm_state = DYNPM_STATE_ACTIVE; 681 rdev->pm.dynpm_state = DYNPM_STATE_ACTIVE;
697 queue_delayed_work(rdev->wq, &rdev->pm.dynpm_idle_work, 682 schedule_delayed_work(&rdev->pm.dynpm_idle_work,
698 msecs_to_jiffies(RADEON_IDLE_LOOP_MS)); 683 msecs_to_jiffies(RADEON_IDLE_LOOP_MS));
699 DRM_DEBUG_DRIVER("radeon: dynamic power management activated\n"); 684 DRM_DEBUG_DRIVER("radeon: dynamic power management activated\n");
700 } 685 }
701 } else { /* count == 0 */ 686 } else { /* count == 0 */
@@ -800,8 +785,8 @@ static void radeon_dynpm_idle_work_handler(struct work_struct *work)
800 radeon_pm_set_clocks(rdev); 785 radeon_pm_set_clocks(rdev);
801 } 786 }
802 787
803 queue_delayed_work(rdev->wq, &rdev->pm.dynpm_idle_work, 788 schedule_delayed_work(&rdev->pm.dynpm_idle_work,
804 msecs_to_jiffies(RADEON_IDLE_LOOP_MS)); 789 msecs_to_jiffies(RADEON_IDLE_LOOP_MS));
805 } 790 }
806 mutex_unlock(&rdev->pm.mutex); 791 mutex_unlock(&rdev->pm.mutex);
807 ttm_bo_unlock_delayed_workqueue(&rdev->mman.bdev, resched); 792 ttm_bo_unlock_delayed_workqueue(&rdev->mman.bdev, resched);
diff --git a/drivers/gpu/drm/radeon/rs600.c b/drivers/gpu/drm/radeon/rs600.c
index 9a85b1614c86..b4192acaab5f 100644
--- a/drivers/gpu/drm/radeon/rs600.c
+++ b/drivers/gpu/drm/radeon/rs600.c
@@ -692,7 +692,7 @@ int rs600_irq_process(struct radeon_device *rdev)
692 /* reset gui idle ack. the status bit is broken */ 692 /* reset gui idle ack. the status bit is broken */
693 rdev->irq.gui_idle_acked = false; 693 rdev->irq.gui_idle_acked = false;
694 if (queue_hotplug) 694 if (queue_hotplug)
695 queue_work(rdev->wq, &rdev->hotplug_work); 695 schedule_work(&rdev->hotplug_work);
696 if (rdev->msi_enabled) { 696 if (rdev->msi_enabled) {
697 switch (rdev->family) { 697 switch (rdev->family) {
698 case CHIP_RS600: 698 case CHIP_RS600: