Skip to content

Commit

Permalink
radeon: Take drm struct_mutex over reclocking
Browse files Browse the repository at this point in the history
We need to block the drm core from doing anything that may touch our vram
during reclock, so take the drm mutex for the duration.

Signed-off-by: Matthew Garrett <mjg@redhat.com>
Signed-off-by: Dave Airlie <airlied@redhat.com>
  • Loading branch information
Matthew Garrett authored and Dave Airlie committed May 18, 2010
1 parent 5876dd2 commit 8f5b5e6
Showing 1 changed file with 10 additions and 0 deletions.
10 changes: 10 additions & 0 deletions drivers/gpu/drm/radeon/radeon_pm.c
Original file line number Diff line number Diff line change
Expand Up @@ -131,6 +131,7 @@ static ssize_t radeon_set_power_state_static(struct device *dev,
return count;
}

mutex_lock(&rdev->ddev->struct_mutex);
mutex_lock(&rdev->pm.mutex);
if ((ps >= 0) && (ps < rdev->pm.num_power_states) &&
(cm >= 0) && (cm < rdev->pm.power_state[ps].num_clock_modes)) {
Expand All @@ -148,6 +149,7 @@ static ssize_t radeon_set_power_state_static(struct device *dev,
} else
DRM_ERROR("Invalid power state: %d.%d\n\n", ps, cm);
mutex_unlock(&rdev->pm.mutex);
mutex_unlock(&rdev->ddev->struct_mutex);

return count;
}
Expand Down Expand Up @@ -184,11 +186,13 @@ static ssize_t radeon_set_dynpm(struct device *dev,
} else if (tmp == 1) {
if (rdev->pm.num_power_states > 1) {
/* enable dynpm */
mutex_lock(&rdev->ddev->struct_mutex);
mutex_lock(&rdev->pm.mutex);
rdev->pm.state = PM_STATE_PAUSED;
rdev->pm.planned_action = PM_ACTION_DEFAULT;
radeon_get_power_state(rdev, rdev->pm.planned_action);
mutex_unlock(&rdev->pm.mutex);
mutex_unlock(&rdev->ddev->struct_mutex);
/* update power mode info */
radeon_pm_compute_clocks(rdev);
DRM_INFO("radeon: dynamic power management enabled\n");
Expand Down Expand Up @@ -311,9 +315,11 @@ void radeon_pm_fini(struct radeon_device *rdev)
(rdev->pm.current_clock_mode_index != 0)) {
rdev->pm.requested_power_state_index = rdev->pm.default_power_state_index;
rdev->pm.requested_clock_mode_index = 0;
mutex_lock(&rdev->ddev->struct_mutex);
mutex_lock(&rdev->pm.mutex);
radeon_pm_set_clocks(rdev, true);
mutex_unlock(&rdev->pm.mutex);
mutex_unlock(&rdev->ddev->struct_mutex);
}

device_remove_file(rdev->dev, &dev_attr_power_state);
Expand All @@ -332,6 +338,7 @@ void radeon_pm_compute_clocks(struct radeon_device *rdev)
if (rdev->pm.state == PM_STATE_DISABLED)
return;

mutex_lock(&rdev->ddev->struct_mutex);
mutex_lock(&rdev->pm.mutex);

rdev->pm.active_crtcs = 0;
Expand Down Expand Up @@ -382,6 +389,7 @@ void radeon_pm_compute_clocks(struct radeon_device *rdev)
}

mutex_unlock(&rdev->pm.mutex);
mutex_unlock(&rdev->ddev->struct_mutex);
}

bool radeon_pm_debug_check_in_vbl(struct radeon_device *rdev, bool finish)
Expand Down Expand Up @@ -455,6 +463,7 @@ static void radeon_pm_idle_work_handler(struct work_struct *work)
rdev = container_of(work, struct radeon_device,
pm.idle_work.work);

mutex_lock(&rdev->ddev->struct_mutex);
mutex_lock(&rdev->pm.mutex);
if (rdev->pm.state == PM_STATE_ACTIVE) {
unsigned long irq_flags;
Expand Down Expand Up @@ -499,6 +508,7 @@ static void radeon_pm_idle_work_handler(struct work_struct *work)
}
}
mutex_unlock(&rdev->pm.mutex);
mutex_unlock(&rdev->ddev->struct_mutex);

queue_delayed_work(rdev->wq, &rdev->pm.idle_work,
msecs_to_jiffies(RADEON_IDLE_LOOP_MS));
Expand Down

0 comments on commit 8f5b5e6

Please sign in to comment.