diff options
| -rw-r--r-- | drivers/gpu/drm/radeon/evergreen.c | 2 | ||||
| -rw-r--r-- | drivers/gpu/drm/radeon/r100.c | 2 | ||||
| -rw-r--r-- | drivers/gpu/drm/radeon/r600.c | 2 | ||||
| -rw-r--r-- | drivers/gpu/drm/radeon/radeon.h | 1 | ||||
| -rw-r--r-- | drivers/gpu/drm/radeon/radeon_device.c | 6 | ||||
| -rw-r--r-- | drivers/gpu/drm/radeon/radeon_irq_kms.c | 5 | ||||
| -rw-r--r-- | drivers/gpu/drm/radeon/radeon_pm.c | 47 | ||||
| -rw-r--r-- | drivers/gpu/drm/radeon/rs600.c | 2 |
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 | ||
| 157 | void radeon_irq_kms_sw_irq_get(struct radeon_device *rdev) | 158 | void 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 | ||
| 525 | void radeon_pm_suspend(struct radeon_device *rdev) | 518 | void 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 | ||
| 541 | void radeon_pm_resume(struct radeon_device *rdev) | 530 | void 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) | |||
| 613 | void radeon_pm_fini(struct radeon_device *rdev) | 603 | void 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: |
