diff options
Diffstat (limited to 'drivers/gpu/drm/radeon/rv515.c')
| -rw-r--r-- | drivers/gpu/drm/radeon/rv515.c | 46 | 
1 files changed, 29 insertions, 17 deletions
diff --git a/drivers/gpu/drm/radeon/rv515.c b/drivers/gpu/drm/radeon/rv515.c index bea747da123..9035121f4b5 100644 --- a/drivers/gpu/drm/radeon/rv515.c +++ b/drivers/gpu/drm/radeon/rv515.c @@ -26,9 +26,11 @@   *          Jerome Glisse   */  #include <linux/seq_file.h> +#include <linux/slab.h>  #include "drmP.h"  #include "rv515d.h"  #include "radeon.h" +#include "radeon_asic.h"  #include "atom.h"  #include "rv515_reg_safe.h" @@ -279,19 +281,13 @@ static void rv515_vram_get_type(struct radeon_device *rdev)  void rv515_mc_init(struct radeon_device *rdev)  { -	fixed20_12 a;  	rv515_vram_get_type(rdev);  	r100_vram_init_sizes(rdev);  	radeon_vram_location(rdev, &rdev->mc, 0);  	if (!(rdev->flags & RADEON_IS_AGP))  		radeon_gtt_location(rdev, &rdev->mc); -	/* FIXME: we should enforce default clock in case GPU is not in -	 * default setup -	 */ -	a.full = rfixed_const(100); -	rdev->pm.sclk.full = rfixed_const(rdev->clock.default_sclk); -	rdev->pm.sclk.full = rfixed_div(rdev->pm.sclk, a); +	radeon_update_bandwidth_info(rdev);  }  uint32_t rv515_mc_rreg(struct radeon_device *rdev, uint32_t reg) @@ -539,6 +535,7 @@ void rv515_set_safe_registers(struct radeon_device *rdev)  void rv515_fini(struct radeon_device *rdev)  { +	radeon_pm_fini(rdev);  	r100_cp_fini(rdev);  	r100_wb_fini(rdev);  	r100_ib_fini(rdev); @@ -1020,7 +1017,7 @@ void rv515_bandwidth_avivo_update(struct radeon_device *rdev)  	struct drm_display_mode *mode1 = NULL;  	struct rv515_watermark wm0;  	struct rv515_watermark wm1; -	u32 tmp; +	u32 tmp, d1mode_priority_a_cnt, d2mode_priority_a_cnt;  	fixed20_12 priority_mark02, priority_mark12, fill_rate;  	fixed20_12 a, b; @@ -1088,10 +1085,16 @@ void rv515_bandwidth_avivo_update(struct radeon_device *rdev)  			priority_mark12.full = 0;  		if (wm1.priority_mark_max.full > priority_mark12.full)  			priority_mark12.full = wm1.priority_mark_max.full; -		WREG32(D1MODE_PRIORITY_A_CNT, rfixed_trunc(priority_mark02)); -		WREG32(D1MODE_PRIORITY_B_CNT, rfixed_trunc(priority_mark02)); -		WREG32(D2MODE_PRIORITY_A_CNT, rfixed_trunc(priority_mark12)); -		WREG32(D2MODE_PRIORITY_B_CNT, rfixed_trunc(priority_mark12)); +		d1mode_priority_a_cnt = rfixed_trunc(priority_mark02); +		d2mode_priority_a_cnt = rfixed_trunc(priority_mark12); +		if (rdev->disp_priority == 2) { +			d1mode_priority_a_cnt |= MODE_PRIORITY_ALWAYS_ON; +			d2mode_priority_a_cnt |= MODE_PRIORITY_ALWAYS_ON; +		} +		WREG32(D1MODE_PRIORITY_A_CNT, d1mode_priority_a_cnt); +		WREG32(D1MODE_PRIORITY_B_CNT, d1mode_priority_a_cnt); +		WREG32(D2MODE_PRIORITY_A_CNT, d2mode_priority_a_cnt); +		WREG32(D2MODE_PRIORITY_B_CNT, d2mode_priority_a_cnt);  	} else if (mode0) {  		if (rfixed_trunc(wm0.dbpp) > 64)  			a.full = rfixed_div(wm0.dbpp, wm0.num_line_pair); @@ -1118,8 +1121,11 @@ void rv515_bandwidth_avivo_update(struct radeon_device *rdev)  			priority_mark02.full = 0;  		if (wm0.priority_mark_max.full > priority_mark02.full)  			priority_mark02.full = wm0.priority_mark_max.full; -		WREG32(D1MODE_PRIORITY_A_CNT, rfixed_trunc(priority_mark02)); -		WREG32(D1MODE_PRIORITY_B_CNT, rfixed_trunc(priority_mark02)); +		d1mode_priority_a_cnt = rfixed_trunc(priority_mark02); +		if (rdev->disp_priority == 2) +			d1mode_priority_a_cnt |= MODE_PRIORITY_ALWAYS_ON; +		WREG32(D1MODE_PRIORITY_A_CNT, d1mode_priority_a_cnt); +		WREG32(D1MODE_PRIORITY_B_CNT, d1mode_priority_a_cnt);  		WREG32(D2MODE_PRIORITY_A_CNT, MODE_PRIORITY_OFF);  		WREG32(D2MODE_PRIORITY_B_CNT, MODE_PRIORITY_OFF);  	} else { @@ -1148,10 +1154,13 @@ void rv515_bandwidth_avivo_update(struct radeon_device *rdev)  			priority_mark12.full = 0;  		if (wm1.priority_mark_max.full > priority_mark12.full)  			priority_mark12.full = wm1.priority_mark_max.full; +		d2mode_priority_a_cnt = rfixed_trunc(priority_mark12); +		if (rdev->disp_priority == 2) +			d2mode_priority_a_cnt |= MODE_PRIORITY_ALWAYS_ON;  		WREG32(D1MODE_PRIORITY_A_CNT, MODE_PRIORITY_OFF);  		WREG32(D1MODE_PRIORITY_B_CNT, MODE_PRIORITY_OFF); -		WREG32(D2MODE_PRIORITY_A_CNT, rfixed_trunc(priority_mark12)); -		WREG32(D2MODE_PRIORITY_B_CNT, rfixed_trunc(priority_mark12)); +		WREG32(D2MODE_PRIORITY_A_CNT, d2mode_priority_a_cnt); +		WREG32(D2MODE_PRIORITY_B_CNT, d2mode_priority_a_cnt);  	}  } @@ -1161,6 +1170,8 @@ void rv515_bandwidth_update(struct radeon_device *rdev)  	struct drm_display_mode *mode0 = NULL;  	struct drm_display_mode *mode1 = NULL; +	radeon_update_display_priority(rdev); +  	if (rdev->mode_info.crtcs[0]->base.enabled)  		mode0 = &rdev->mode_info.crtcs[0]->base.mode;  	if (rdev->mode_info.crtcs[1]->base.enabled) @@ -1170,7 +1181,8 @@ void rv515_bandwidth_update(struct radeon_device *rdev)  	 * modes if the user specifies HIGH for displaypriority  	 * option.  	 */ -	if (rdev->disp_priority == 2) { +	if ((rdev->disp_priority == 2) && +	    (rdev->family == CHIP_RV515)) {  		tmp = RREG32_MC(MC_MISC_LAT_TIMER);  		tmp &= ~MC_DISP1R_INIT_LAT_MASK;  		tmp &= ~MC_DISP0R_INIT_LAT_MASK;  |