aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/radeon/evergreen.c
diff options
context:
space:
mode:
authorAlex Deucher <alexander.deucher@amd.com>2012-03-13 16:25:11 -0400
committerAlex Deucher <alexander.deucher@amd.com>2013-06-27 10:49:22 -0400
commitcf0cfdd7a7c87dff0f4ac6084b73fec83caa71a4 (patch)
treea4958e8831e0628a0cfb970a6d49b14027b075c7 /drivers/gpu/drm/radeon/evergreen.c
parent7d99e5177477866fce3df146d4fe378248032230 (diff)
drm/radeon/kms: fix up dce4/5 display watermark calc for dpm
Calculate the low and high watermarks based on the low and high clocks for the current power state. The dynamic pm hw will select the appropriate watermark based on the internal dpm state. Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
Diffstat (limited to 'drivers/gpu/drm/radeon/evergreen.c')
-rw-r--r--drivers/gpu/drm/radeon/evergreen.c89
1 files changed, 66 insertions, 23 deletions
diff --git a/drivers/gpu/drm/radeon/evergreen.c b/drivers/gpu/drm/radeon/evergreen.c
index b9f64f0e003d..63a1e6ec7f5a 100644
--- a/drivers/gpu/drm/radeon/evergreen.c
+++ b/drivers/gpu/drm/radeon/evergreen.c
@@ -2122,7 +2122,8 @@ static void evergreen_program_watermarks(struct radeon_device *rdev,
2122 u32 lb_size, u32 num_heads) 2122 u32 lb_size, u32 num_heads)
2123{ 2123{
2124 struct drm_display_mode *mode = &radeon_crtc->base.mode; 2124 struct drm_display_mode *mode = &radeon_crtc->base.mode;
2125 struct evergreen_wm_params wm; 2125 struct evergreen_wm_params wm_low, wm_high;
2126 u32 dram_channels;
2126 u32 pixel_period; 2127 u32 pixel_period;
2127 u32 line_time = 0; 2128 u32 line_time = 0;
2128 u32 latency_watermark_a = 0, latency_watermark_b = 0; 2129 u32 latency_watermark_a = 0, latency_watermark_b = 0;
@@ -2138,39 +2139,81 @@ static void evergreen_program_watermarks(struct radeon_device *rdev,
2138 line_time = min((u32)mode->crtc_htotal * pixel_period, (u32)65535); 2139 line_time = min((u32)mode->crtc_htotal * pixel_period, (u32)65535);
2139 priority_a_cnt = 0; 2140 priority_a_cnt = 0;
2140 priority_b_cnt = 0; 2141 priority_b_cnt = 0;
2142 dram_channels = evergreen_get_number_of_dram_channels(rdev);
2143
2144 /* watermark for high clocks */
2145 if ((rdev->pm.pm_method == PM_METHOD_DPM) && rdev->pm.dpm_enabled) {
2146 wm_high.yclk =
2147 radeon_dpm_get_mclk(rdev, false) * 10;
2148 wm_high.sclk =
2149 radeon_dpm_get_sclk(rdev, false) * 10;
2150 } else {
2151 wm_high.yclk = rdev->pm.current_mclk * 10;
2152 wm_high.sclk = rdev->pm.current_sclk * 10;
2153 }
2141 2154
2142 wm.yclk = rdev->pm.current_mclk * 10; 2155 wm_high.disp_clk = mode->clock;
2143 wm.sclk = rdev->pm.current_sclk * 10; 2156 wm_high.src_width = mode->crtc_hdisplay;
2144 wm.disp_clk = mode->clock; 2157 wm_high.active_time = mode->crtc_hdisplay * pixel_period;
2145 wm.src_width = mode->crtc_hdisplay; 2158 wm_high.blank_time = line_time - wm_high.active_time;
2146 wm.active_time = mode->crtc_hdisplay * pixel_period; 2159 wm_high.interlaced = false;
2147 wm.blank_time = line_time - wm.active_time;
2148 wm.interlaced = false;
2149 if (mode->flags & DRM_MODE_FLAG_INTERLACE) 2160 if (mode->flags & DRM_MODE_FLAG_INTERLACE)
2150 wm.interlaced = true; 2161 wm_high.interlaced = true;
2151 wm.vsc = radeon_crtc->vsc; 2162 wm_high.vsc = radeon_crtc->vsc;
2152 wm.vtaps = 1; 2163 wm_high.vtaps = 1;
2153 if (radeon_crtc->rmx_type != RMX_OFF) 2164 if (radeon_crtc->rmx_type != RMX_OFF)
2154 wm.vtaps = 2; 2165 wm_high.vtaps = 2;
2155 wm.bytes_per_pixel = 4; /* XXX: get this from fb config */ 2166 wm_high.bytes_per_pixel = 4; /* XXX: get this from fb config */
2156 wm.lb_size = lb_size; 2167 wm_high.lb_size = lb_size;
2157 wm.dram_channels = evergreen_get_number_of_dram_channels(rdev); 2168 wm_high.dram_channels = dram_channels;
2158 wm.num_heads = num_heads; 2169 wm_high.num_heads = num_heads;
2170
2171 /* watermark for low clocks */
2172 if ((rdev->pm.pm_method == PM_METHOD_DPM) && rdev->pm.dpm_enabled) {
2173 wm_low.yclk =
2174 radeon_dpm_get_mclk(rdev, true) * 10;
2175 wm_low.sclk =
2176 radeon_dpm_get_sclk(rdev, true) * 10;
2177 } else {
2178 wm_low.yclk = rdev->pm.current_mclk * 10;
2179 wm_low.sclk = rdev->pm.current_sclk * 10;
2180 }
2181
2182 wm_low.disp_clk = mode->clock;
2183 wm_low.src_width = mode->crtc_hdisplay;
2184 wm_low.active_time = mode->crtc_hdisplay * pixel_period;
2185 wm_low.blank_time = line_time - wm_low.active_time;
2186 wm_low.interlaced = false;
2187 if (mode->flags & DRM_MODE_FLAG_INTERLACE)
2188 wm_low.interlaced = true;
2189 wm_low.vsc = radeon_crtc->vsc;
2190 wm_low.vtaps = 1;
2191 if (radeon_crtc->rmx_type != RMX_OFF)
2192 wm_low.vtaps = 2;
2193 wm_low.bytes_per_pixel = 4; /* XXX: get this from fb config */
2194 wm_low.lb_size = lb_size;
2195 wm_low.dram_channels = dram_channels;
2196 wm_low.num_heads = num_heads;
2159 2197
2160 /* set for high clocks */ 2198 /* set for high clocks */
2161 latency_watermark_a = min(evergreen_latency_watermark(&wm), (u32)65535); 2199 latency_watermark_a = min(evergreen_latency_watermark(&wm_high), (u32)65535);
2162 /* set for low clocks */ 2200 /* set for low clocks */
2163 /* wm.yclk = low clk; wm.sclk = low clk */ 2201 latency_watermark_b = min(evergreen_latency_watermark(&wm_low), (u32)65535);
2164 latency_watermark_b = min(evergreen_latency_watermark(&wm), (u32)65535);
2165 2202
2166 /* possibly force display priority to high */ 2203 /* possibly force display priority to high */
2167 /* should really do this at mode validation time... */ 2204 /* should really do this at mode validation time... */
2168 if (!evergreen_average_bandwidth_vs_dram_bandwidth_for_display(&wm) || 2205 if (!evergreen_average_bandwidth_vs_dram_bandwidth_for_display(&wm_high) ||
2169 !evergreen_average_bandwidth_vs_available_bandwidth(&wm) || 2206 !evergreen_average_bandwidth_vs_available_bandwidth(&wm_high) ||
2170 !evergreen_check_latency_hiding(&wm) || 2207 !evergreen_check_latency_hiding(&wm_high) ||
2171 (rdev->disp_priority == 2)) { 2208 (rdev->disp_priority == 2)) {
2172 DRM_DEBUG_KMS("force priority to high\n"); 2209 DRM_DEBUG_KMS("force priority a to high\n");
2173 priority_a_cnt |= PRIORITY_ALWAYS_ON; 2210 priority_a_cnt |= PRIORITY_ALWAYS_ON;
2211 }
2212 if (!evergreen_average_bandwidth_vs_dram_bandwidth_for_display(&wm_low) ||
2213 !evergreen_average_bandwidth_vs_available_bandwidth(&wm_low) ||
2214 !evergreen_check_latency_hiding(&wm_low) ||
2215 (rdev->disp_priority == 2)) {
2216 DRM_DEBUG_KMS("force priority b to high\n");
2174 priority_b_cnt |= PRIORITY_ALWAYS_ON; 2217 priority_b_cnt |= PRIORITY_ALWAYS_ON;
2175 } 2218 }
2176 2219