diff options
Diffstat (limited to 'drivers/gpu/drm/radeon/evergreen.c')
| -rw-r--r-- | drivers/gpu/drm/radeon/evergreen.c | 113 | 
1 files changed, 58 insertions, 55 deletions
diff --git a/drivers/gpu/drm/radeon/evergreen.c b/drivers/gpu/drm/radeon/evergreen.c index 3453910ee0f..9073e3bfb08 100644 --- a/drivers/gpu/drm/radeon/evergreen.c +++ b/drivers/gpu/drm/radeon/evergreen.c @@ -353,7 +353,7 @@ static u32 evergreen_line_buffer_adjust(struct radeon_device *rdev,  					struct drm_display_mode *mode,  					struct drm_display_mode *other_mode)  { -	u32 tmp = 0; +	u32 tmp;  	/*  	 * Line Buffer Setup  	 * There are 3 line buffers, each one shared by 2 display controllers. @@ -363,64 +363,63 @@ static u32 evergreen_line_buffer_adjust(struct radeon_device *rdev,  	 * first display controller  	 *  0 - first half of lb (3840 * 2)  	 *  1 - first 3/4 of lb (5760 * 2) -	 *  2 - whole lb (7680 * 2) +	 *  2 - whole lb (7680 * 2), other crtc must be disabled  	 *  3 - first 1/4 of lb (1920 * 2)  	 * second display controller  	 *  4 - second half of lb (3840 * 2)  	 *  5 - second 3/4 of lb (5760 * 2) -	 *  6 - whole lb (7680 * 2) +	 *  6 - whole lb (7680 * 2), other crtc must be disabled  	 *  7 - last 1/4 of lb (1920 * 2)  	 */ -	if (mode && other_mode) { -		if (mode->hdisplay > other_mode->hdisplay) { -			if (mode->hdisplay > 2560) -				tmp = 1; /* 3/4 */ -			else -				tmp = 0; /* 1/2 */ -		} else if (other_mode->hdisplay > mode->hdisplay) { -			if (other_mode->hdisplay > 2560) -				tmp = 3; /* 1/4 */ -			else -				tmp = 0; /* 1/2 */ -		} else +	/* this can get tricky if we have two large displays on a paired group +	 * of crtcs.  Ideally for multiple large displays we'd assign them to +	 * non-linked crtcs for maximum line buffer allocation. +	 */ +	if (radeon_crtc->base.enabled && mode) { +		if (other_mode)  			tmp = 0; /* 1/2 */ -	} else if (mode) -		tmp = 2; /* whole */ -	else if (other_mode) -		tmp = 3; /* 1/4 */ +		else +			tmp = 2; /* whole */ +	} else +		tmp = 0;  	/* second controller of the pair uses second half of the lb */  	if (radeon_crtc->crtc_id % 2)  		tmp += 4;  	WREG32(DC_LB_MEMORY_SPLIT + radeon_crtc->crtc_offset, tmp); -	switch (tmp) { -	case 0: -	case 4: -	default: -		if (ASIC_IS_DCE5(rdev)) -			return 4096 * 2; -		else -			return 3840 * 2; -	case 1: -	case 5: -		if (ASIC_IS_DCE5(rdev)) -			return 6144 * 2; -		else -			return 5760 * 2; -	case 2: -	case 6: -		if (ASIC_IS_DCE5(rdev)) -			return 8192 * 2; -		else -			return 7680 * 2; -	case 3: -	case 7: -		if (ASIC_IS_DCE5(rdev)) -			return 2048 * 2; -		else -			return 1920 * 2; +	if (radeon_crtc->base.enabled && mode) { +		switch (tmp) { +		case 0: +		case 4: +		default: +			if (ASIC_IS_DCE5(rdev)) +				return 4096 * 2; +			else +				return 3840 * 2; +		case 1: +		case 5: +			if (ASIC_IS_DCE5(rdev)) +				return 6144 * 2; +			else +				return 5760 * 2; +		case 2: +		case 6: +			if (ASIC_IS_DCE5(rdev)) +				return 8192 * 2; +			else +				return 7680 * 2; +		case 3: +		case 7: +			if (ASIC_IS_DCE5(rdev)) +				return 2048 * 2; +			else +				return 1920 * 2; +		}  	} + +	/* controller not enabled, so no lb used */ +	return 0;  }  static u32 evergreen_get_number_of_dram_channels(struct radeon_device *rdev) @@ -863,9 +862,15 @@ int evergreen_pcie_gart_enable(struct radeon_device *rdev)  		SYSTEM_ACCESS_MODE_NOT_IN_SYS |  		SYSTEM_APERTURE_UNMAPPED_ACCESS_PASS_THRU |  		EFFECTIVE_L1_TLB_SIZE(5) | EFFECTIVE_L1_QUEUE_SIZE(5); -	WREG32(MC_VM_MD_L1_TLB0_CNTL, tmp); -	WREG32(MC_VM_MD_L1_TLB1_CNTL, tmp); -	WREG32(MC_VM_MD_L1_TLB2_CNTL, tmp); +	if (rdev->flags & RADEON_IS_IGP) { +		WREG32(FUS_MC_VM_MD_L1_TLB0_CNTL, tmp); +		WREG32(FUS_MC_VM_MD_L1_TLB1_CNTL, tmp); +		WREG32(FUS_MC_VM_MD_L1_TLB2_CNTL, tmp); +	} else { +		WREG32(MC_VM_MD_L1_TLB0_CNTL, tmp); +		WREG32(MC_VM_MD_L1_TLB1_CNTL, tmp); +		WREG32(MC_VM_MD_L1_TLB2_CNTL, tmp); +	}  	WREG32(MC_VM_MB_L1_TLB0_CNTL, tmp);  	WREG32(MC_VM_MB_L1_TLB1_CNTL, tmp);  	WREG32(MC_VM_MB_L1_TLB2_CNTL, tmp); @@ -1775,7 +1780,10 @@ static void evergreen_gpu_init(struct radeon_device *rdev)  	mc_shared_chmap = RREG32(MC_SHARED_CHMAP); -	mc_arb_ramcfg = RREG32(MC_ARB_RAMCFG); +	if (rdev->flags & RADEON_IS_IGP) +		mc_arb_ramcfg = RREG32(FUS_MC_ARB_RAMCFG); +	else +		mc_arb_ramcfg = RREG32(MC_ARB_RAMCFG);  	switch (rdev->config.evergreen.max_tile_pipes) {  	case 1: @@ -2581,7 +2589,7 @@ static inline u32 evergreen_get_ih_wptr(struct radeon_device *rdev)  	u32 wptr, tmp;  	if (rdev->wb.enabled) -		wptr = rdev->wb.wb[R600_WB_IH_WPTR_OFFSET/4]; +		wptr = le32_to_cpu(rdev->wb.wb[R600_WB_IH_WPTR_OFFSET/4]);  	else  		wptr = RREG32(IH_RB_WPTR); @@ -2924,11 +2932,6 @@ static int evergreen_startup(struct radeon_device *rdev)  		rdev->asic->copy = NULL;  		dev_warn(rdev->dev, "failed blitter (%d) falling back to memcpy\n", r);  	} -	/* XXX: ontario has problems blitting to gart at the moment */ -	if (rdev->family == CHIP_PALM) { -		rdev->asic->copy = NULL; -		radeon_ttm_set_active_vram_size(rdev, rdev->mc.visible_vram_size); -	}  	/* allocate wb buffer */  	r = radeon_wb_init(rdev);  |