diff options
author | Alex Deucher <alexander.deucher@amd.com> | 2013-04-12 14:04:10 -0400 |
---|---|---|
committer | Alex Deucher <alexander.deucher@amd.com> | 2013-06-27 10:50:08 -0400 |
commit | 4a6369e9935e392402d4ccb67f5cddac953e8d3c (patch) | |
tree | c3c9b8585776d91f59bba876e99d56c32de0ad78 /drivers/gpu/drm/radeon/r600_dpm.c | |
parent | 9d67006e6ebc6c5bc553d04b8c2dabea168e5e5b (diff) |
drm/radeon/kms: add dpm support for rv6xx (v3)
This adds dpm support for rv6xx asics. This includes:
- clockgating
- dynamic engine clock scaling
- dynamic memory clock scaling
- dynamic voltage scaling
- dynamic pcie gen1/gen2 switching
Set radeon.dpm=1 to enable.
v2: remove duplicate line
v3: fix thermal interrupt check noticed by Jerome
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
Reviewed-by: Christian König <christian.koenig@amd.com>
Diffstat (limited to 'drivers/gpu/drm/radeon/r600_dpm.c')
-rw-r--r-- | drivers/gpu/drm/radeon/r600_dpm.c | 45 |
1 files changed, 45 insertions, 0 deletions
diff --git a/drivers/gpu/drm/radeon/r600_dpm.c b/drivers/gpu/drm/radeon/r600_dpm.c index 91bc5ab5b1e6..bf396a0f6a50 100644 --- a/drivers/gpu/drm/radeon/r600_dpm.c +++ b/drivers/gpu/drm/radeon/r600_dpm.c | |||
@@ -676,3 +676,48 @@ bool r600_is_uvd_state(u32 class, u32 class2) | |||
676 | return true; | 676 | return true; |
677 | return false; | 677 | return false; |
678 | } | 678 | } |
679 | |||
680 | int r600_set_thermal_temperature_range(struct radeon_device *rdev, | ||
681 | int min_temp, int max_temp) | ||
682 | { | ||
683 | int low_temp = 0 * 1000; | ||
684 | int high_temp = 255 * 1000; | ||
685 | |||
686 | if (low_temp < min_temp) | ||
687 | low_temp = min_temp; | ||
688 | if (high_temp > max_temp) | ||
689 | high_temp = max_temp; | ||
690 | if (high_temp < low_temp) { | ||
691 | DRM_ERROR("invalid thermal range: %d - %d\n", low_temp, high_temp); | ||
692 | return -EINVAL; | ||
693 | } | ||
694 | |||
695 | WREG32_P(CG_THERMAL_INT, DIG_THERM_INTH(high_temp / 1000), ~DIG_THERM_INTH_MASK); | ||
696 | WREG32_P(CG_THERMAL_INT, DIG_THERM_INTL(low_temp / 1000), ~DIG_THERM_INTL_MASK); | ||
697 | WREG32_P(CG_THERMAL_CTRL, DIG_THERM_DPM(high_temp / 1000), ~DIG_THERM_DPM_MASK); | ||
698 | |||
699 | rdev->pm.dpm.thermal.min_temp = low_temp; | ||
700 | rdev->pm.dpm.thermal.max_temp = high_temp; | ||
701 | |||
702 | return 0; | ||
703 | } | ||
704 | |||
705 | bool r600_is_internal_thermal_sensor(enum radeon_int_thermal_type sensor) | ||
706 | { | ||
707 | switch (sensor) { | ||
708 | case THERMAL_TYPE_RV6XX: | ||
709 | case THERMAL_TYPE_RV770: | ||
710 | case THERMAL_TYPE_EVERGREEN: | ||
711 | case THERMAL_TYPE_SUMO: | ||
712 | case THERMAL_TYPE_NI: | ||
713 | return true; | ||
714 | case THERMAL_TYPE_ADT7473_WITH_INTERNAL: | ||
715 | case THERMAL_TYPE_EMC2103_WITH_INTERNAL: | ||
716 | return false; /* need special handling */ | ||
717 | case THERMAL_TYPE_NONE: | ||
718 | case THERMAL_TYPE_EXTERNAL: | ||
719 | case THERMAL_TYPE_EXTERNAL_GPIO: | ||
720 | default: | ||
721 | return false; | ||
722 | } | ||
723 | } | ||