diff options
Diffstat (limited to 'drivers/gpu/drm/radeon/evergreen.c')
| -rw-r--r-- | drivers/gpu/drm/radeon/evergreen.c | 197 | 
1 files changed, 121 insertions, 76 deletions
diff --git a/drivers/gpu/drm/radeon/evergreen.c b/drivers/gpu/drm/radeon/evergreen.c index 98ea597bc76..15bd0477a3e 100644 --- a/drivers/gpu/drm/radeon/evergreen.c +++ b/drivers/gpu/drm/radeon/evergreen.c @@ -88,7 +88,8 @@ u32 evergreen_page_flip(struct radeon_device *rdev, int crtc_id, u64 crtc_base)  /* get temperature in millidegrees */  int evergreen_get_temp(struct radeon_device *rdev)  { -	u32 temp, toffset, actual_temp = 0; +	u32 temp, toffset; +	int actual_temp = 0;  	if (rdev->family == CHIP_JUNIPER) {  		toffset = (RREG32(CG_THERMAL_CTRL) & TOFFSET_MASK) >> @@ -139,11 +140,17 @@ void evergreen_pm_misc(struct radeon_device *rdev)  	struct radeon_voltage *voltage = &ps->clock_info[req_cm_idx].voltage;  	if (voltage->type == VOLTAGE_SW) { +		/* 0xff01 is a flag rather then an actual voltage */ +		if (voltage->voltage == 0xff01) +			return;  		if (voltage->voltage && (voltage->voltage != rdev->pm.current_vddc)) {  			radeon_atom_set_voltage(rdev, voltage->voltage, SET_VOLTAGE_TYPE_ASIC_VDDC);  			rdev->pm.current_vddc = voltage->voltage;  			DRM_DEBUG("Setting: vddc: %d\n", voltage->voltage);  		} +		/* 0xff01 is a flag rather then an actual voltage */ +		if (voltage->vddci == 0xff01) +			return;  		if (voltage->vddci && (voltage->vddci != rdev->pm.current_vddci)) {  			radeon_atom_set_voltage(rdev, voltage->vddci, SET_VOLTAGE_TYPE_ASIC_VDDCI);  			rdev->pm.current_vddci = voltage->vddci; @@ -978,17 +985,19 @@ void evergreen_mc_stop(struct radeon_device *rdev, struct evergreen_mc_save *sav  {  	save->vga_control[0] = RREG32(D1VGA_CONTROL);  	save->vga_control[1] = RREG32(D2VGA_CONTROL); -	save->vga_control[2] = RREG32(EVERGREEN_D3VGA_CONTROL); -	save->vga_control[3] = RREG32(EVERGREEN_D4VGA_CONTROL); -	save->vga_control[4] = RREG32(EVERGREEN_D5VGA_CONTROL); -	save->vga_control[5] = RREG32(EVERGREEN_D6VGA_CONTROL);  	save->vga_render_control = RREG32(VGA_RENDER_CONTROL);  	save->vga_hdp_control = RREG32(VGA_HDP_CONTROL);  	save->crtc_control[0] = RREG32(EVERGREEN_CRTC_CONTROL + EVERGREEN_CRTC0_REGISTER_OFFSET);  	save->crtc_control[1] = RREG32(EVERGREEN_CRTC_CONTROL + EVERGREEN_CRTC1_REGISTER_OFFSET); -	if (!(rdev->flags & RADEON_IS_IGP)) { +	if (rdev->num_crtc >= 4) { +		save->vga_control[2] = RREG32(EVERGREEN_D3VGA_CONTROL); +		save->vga_control[3] = RREG32(EVERGREEN_D4VGA_CONTROL);  		save->crtc_control[2] = RREG32(EVERGREEN_CRTC_CONTROL + EVERGREEN_CRTC2_REGISTER_OFFSET);  		save->crtc_control[3] = RREG32(EVERGREEN_CRTC_CONTROL + EVERGREEN_CRTC3_REGISTER_OFFSET); +	} +	if (rdev->num_crtc >= 6) { +		save->vga_control[4] = RREG32(EVERGREEN_D5VGA_CONTROL); +		save->vga_control[5] = RREG32(EVERGREEN_D6VGA_CONTROL);  		save->crtc_control[4] = RREG32(EVERGREEN_CRTC_CONTROL + EVERGREEN_CRTC4_REGISTER_OFFSET);  		save->crtc_control[5] = RREG32(EVERGREEN_CRTC_CONTROL + EVERGREEN_CRTC5_REGISTER_OFFSET);  	} @@ -997,35 +1006,45 @@ void evergreen_mc_stop(struct radeon_device *rdev, struct evergreen_mc_save *sav  	WREG32(VGA_RENDER_CONTROL, 0);  	WREG32(EVERGREEN_CRTC_UPDATE_LOCK + EVERGREEN_CRTC0_REGISTER_OFFSET, 1);  	WREG32(EVERGREEN_CRTC_UPDATE_LOCK + EVERGREEN_CRTC1_REGISTER_OFFSET, 1); -	if (!(rdev->flags & RADEON_IS_IGP)) { +	if (rdev->num_crtc >= 4) {  		WREG32(EVERGREEN_CRTC_UPDATE_LOCK + EVERGREEN_CRTC2_REGISTER_OFFSET, 1);  		WREG32(EVERGREEN_CRTC_UPDATE_LOCK + EVERGREEN_CRTC3_REGISTER_OFFSET, 1); +	} +	if (rdev->num_crtc >= 6) {  		WREG32(EVERGREEN_CRTC_UPDATE_LOCK + EVERGREEN_CRTC4_REGISTER_OFFSET, 1);  		WREG32(EVERGREEN_CRTC_UPDATE_LOCK + EVERGREEN_CRTC5_REGISTER_OFFSET, 1);  	}  	WREG32(EVERGREEN_CRTC_CONTROL + EVERGREEN_CRTC0_REGISTER_OFFSET, 0);  	WREG32(EVERGREEN_CRTC_CONTROL + EVERGREEN_CRTC1_REGISTER_OFFSET, 0); -	if (!(rdev->flags & RADEON_IS_IGP)) { +	if (rdev->num_crtc >= 4) {  		WREG32(EVERGREEN_CRTC_CONTROL + EVERGREEN_CRTC2_REGISTER_OFFSET, 0);  		WREG32(EVERGREEN_CRTC_CONTROL + EVERGREEN_CRTC3_REGISTER_OFFSET, 0); +	} +	if (rdev->num_crtc >= 6) {  		WREG32(EVERGREEN_CRTC_CONTROL + EVERGREEN_CRTC4_REGISTER_OFFSET, 0);  		WREG32(EVERGREEN_CRTC_CONTROL + EVERGREEN_CRTC5_REGISTER_OFFSET, 0);  	}  	WREG32(EVERGREEN_CRTC_UPDATE_LOCK + EVERGREEN_CRTC0_REGISTER_OFFSET, 0);  	WREG32(EVERGREEN_CRTC_UPDATE_LOCK + EVERGREEN_CRTC1_REGISTER_OFFSET, 0); -	if (!(rdev->flags & RADEON_IS_IGP)) { +	if (rdev->num_crtc >= 4) {  		WREG32(EVERGREEN_CRTC_UPDATE_LOCK + EVERGREEN_CRTC2_REGISTER_OFFSET, 0);  		WREG32(EVERGREEN_CRTC_UPDATE_LOCK + EVERGREEN_CRTC3_REGISTER_OFFSET, 0); +	} +	if (rdev->num_crtc >= 6) {  		WREG32(EVERGREEN_CRTC_UPDATE_LOCK + EVERGREEN_CRTC4_REGISTER_OFFSET, 0);  		WREG32(EVERGREEN_CRTC_UPDATE_LOCK + EVERGREEN_CRTC5_REGISTER_OFFSET, 0);  	}  	WREG32(D1VGA_CONTROL, 0);  	WREG32(D2VGA_CONTROL, 0); -	WREG32(EVERGREEN_D3VGA_CONTROL, 0); -	WREG32(EVERGREEN_D4VGA_CONTROL, 0); -	WREG32(EVERGREEN_D5VGA_CONTROL, 0); -	WREG32(EVERGREEN_D6VGA_CONTROL, 0); +	if (rdev->num_crtc >= 4) { +		WREG32(EVERGREEN_D3VGA_CONTROL, 0); +		WREG32(EVERGREEN_D4VGA_CONTROL, 0); +	} +	if (rdev->num_crtc >= 6) { +		WREG32(EVERGREEN_D5VGA_CONTROL, 0); +		WREG32(EVERGREEN_D6VGA_CONTROL, 0); +	}  }  void evergreen_mc_resume(struct radeon_device *rdev, struct evergreen_mc_save *save) @@ -1048,7 +1067,7 @@ void evergreen_mc_resume(struct radeon_device *rdev, struct evergreen_mc_save *s  	WREG32(EVERGREEN_GRPH_SECONDARY_SURFACE_ADDRESS + EVERGREEN_CRTC1_REGISTER_OFFSET,  	       (u32)rdev->mc.vram_start); -	if (!(rdev->flags & RADEON_IS_IGP)) { +	if (rdev->num_crtc >= 4) {  		WREG32(EVERGREEN_GRPH_PRIMARY_SURFACE_ADDRESS_HIGH + EVERGREEN_CRTC2_REGISTER_OFFSET,  		       upper_32_bits(rdev->mc.vram_start));  		WREG32(EVERGREEN_GRPH_SECONDARY_SURFACE_ADDRESS_HIGH + EVERGREEN_CRTC2_REGISTER_OFFSET, @@ -1066,7 +1085,8 @@ void evergreen_mc_resume(struct radeon_device *rdev, struct evergreen_mc_save *s  		       (u32)rdev->mc.vram_start);  		WREG32(EVERGREEN_GRPH_SECONDARY_SURFACE_ADDRESS + EVERGREEN_CRTC3_REGISTER_OFFSET,  		       (u32)rdev->mc.vram_start); - +	} +	if (rdev->num_crtc >= 6) {  		WREG32(EVERGREEN_GRPH_PRIMARY_SURFACE_ADDRESS_HIGH + EVERGREEN_CRTC4_REGISTER_OFFSET,  		       upper_32_bits(rdev->mc.vram_start));  		WREG32(EVERGREEN_GRPH_SECONDARY_SURFACE_ADDRESS_HIGH + EVERGREEN_CRTC4_REGISTER_OFFSET, @@ -1094,31 +1114,41 @@ void evergreen_mc_resume(struct radeon_device *rdev, struct evergreen_mc_save *s  	/* Restore video state */  	WREG32(D1VGA_CONTROL, save->vga_control[0]);  	WREG32(D2VGA_CONTROL, save->vga_control[1]); -	WREG32(EVERGREEN_D3VGA_CONTROL, save->vga_control[2]); -	WREG32(EVERGREEN_D4VGA_CONTROL, save->vga_control[3]); -	WREG32(EVERGREEN_D5VGA_CONTROL, save->vga_control[4]); -	WREG32(EVERGREEN_D6VGA_CONTROL, save->vga_control[5]); +	if (rdev->num_crtc >= 4) { +		WREG32(EVERGREEN_D3VGA_CONTROL, save->vga_control[2]); +		WREG32(EVERGREEN_D4VGA_CONTROL, save->vga_control[3]); +	} +	if (rdev->num_crtc >= 6) { +		WREG32(EVERGREEN_D5VGA_CONTROL, save->vga_control[4]); +		WREG32(EVERGREEN_D6VGA_CONTROL, save->vga_control[5]); +	}  	WREG32(EVERGREEN_CRTC_UPDATE_LOCK + EVERGREEN_CRTC0_REGISTER_OFFSET, 1);  	WREG32(EVERGREEN_CRTC_UPDATE_LOCK + EVERGREEN_CRTC1_REGISTER_OFFSET, 1); -	if (!(rdev->flags & RADEON_IS_IGP)) { +	if (rdev->num_crtc >= 4) {  		WREG32(EVERGREEN_CRTC_UPDATE_LOCK + EVERGREEN_CRTC2_REGISTER_OFFSET, 1);  		WREG32(EVERGREEN_CRTC_UPDATE_LOCK + EVERGREEN_CRTC3_REGISTER_OFFSET, 1); +	} +	if (rdev->num_crtc >= 6) {  		WREG32(EVERGREEN_CRTC_UPDATE_LOCK + EVERGREEN_CRTC4_REGISTER_OFFSET, 1);  		WREG32(EVERGREEN_CRTC_UPDATE_LOCK + EVERGREEN_CRTC5_REGISTER_OFFSET, 1);  	}  	WREG32(EVERGREEN_CRTC_CONTROL + EVERGREEN_CRTC0_REGISTER_OFFSET, save->crtc_control[0]);  	WREG32(EVERGREEN_CRTC_CONTROL + EVERGREEN_CRTC1_REGISTER_OFFSET, save->crtc_control[1]); -	if (!(rdev->flags & RADEON_IS_IGP)) { +	if (rdev->num_crtc >= 4) {  		WREG32(EVERGREEN_CRTC_CONTROL + EVERGREEN_CRTC2_REGISTER_OFFSET, save->crtc_control[2]);  		WREG32(EVERGREEN_CRTC_CONTROL + EVERGREEN_CRTC3_REGISTER_OFFSET, save->crtc_control[3]); +	} +	if (rdev->num_crtc >= 6) {  		WREG32(EVERGREEN_CRTC_CONTROL + EVERGREEN_CRTC4_REGISTER_OFFSET, save->crtc_control[4]);  		WREG32(EVERGREEN_CRTC_CONTROL + EVERGREEN_CRTC5_REGISTER_OFFSET, save->crtc_control[5]);  	}  	WREG32(EVERGREEN_CRTC_UPDATE_LOCK + EVERGREEN_CRTC0_REGISTER_OFFSET, 0);  	WREG32(EVERGREEN_CRTC_UPDATE_LOCK + EVERGREEN_CRTC1_REGISTER_OFFSET, 0); -	if (!(rdev->flags & RADEON_IS_IGP)) { +	if (rdev->num_crtc >= 4) {  		WREG32(EVERGREEN_CRTC_UPDATE_LOCK + EVERGREEN_CRTC2_REGISTER_OFFSET, 0);  		WREG32(EVERGREEN_CRTC_UPDATE_LOCK + EVERGREEN_CRTC3_REGISTER_OFFSET, 0); +	} +	if (rdev->num_crtc >= 6) {  		WREG32(EVERGREEN_CRTC_UPDATE_LOCK + EVERGREEN_CRTC4_REGISTER_OFFSET, 0);  		WREG32(EVERGREEN_CRTC_UPDATE_LOCK + EVERGREEN_CRTC5_REGISTER_OFFSET, 0);  	} @@ -1970,7 +2000,7 @@ static void evergreen_gpu_init(struct radeon_device *rdev)  			gb_backend_map = 0x66442200;  			break;  		case CHIP_JUNIPER: -			gb_backend_map = 0x00006420; +			gb_backend_map = 0x00002200;  			break;  		default:  			gb_backend_map = @@ -2006,9 +2036,9 @@ static void evergreen_gpu_init(struct radeon_device *rdev)  		rdev->config.evergreen.tile_config |= (3 << 0);  		break;  	} -	/* num banks is 8 on all fusion asics */ +	/* num banks is 8 on all fusion asics. 0 = 4, 1 = 8, 2 = 16 */  	if (rdev->flags & RADEON_IS_IGP) -		rdev->config.evergreen.tile_config |= 8 << 4; +		rdev->config.evergreen.tile_config |= 1 << 4;  	else  		rdev->config.evergreen.tile_config |=  			((mc_arb_ramcfg & NOOFBANK_MASK) >> NOOFBANK_SHIFT) << 4; @@ -2241,7 +2271,10 @@ int evergreen_mc_init(struct radeon_device *rdev)  	/* Get VRAM informations */  	rdev->mc.vram_is_ddr = true; -	tmp = RREG32(MC_ARB_RAMCFG); +	if (rdev->flags & RADEON_IS_IGP) +		tmp = RREG32(FUS_MC_ARB_RAMCFG); +	else +		tmp = RREG32(MC_ARB_RAMCFG);  	if (tmp & CHANSIZE_OVERRIDE) {  		chansize = 16;  	} else if (tmp & CHANSIZE_MASK) { @@ -2407,18 +2440,22 @@ void evergreen_disable_interrupt_state(struct radeon_device *rdev)  	WREG32(GRBM_INT_CNTL, 0);  	WREG32(INT_MASK + EVERGREEN_CRTC0_REGISTER_OFFSET, 0);  	WREG32(INT_MASK + EVERGREEN_CRTC1_REGISTER_OFFSET, 0); -	if (!(rdev->flags & RADEON_IS_IGP)) { +	if (rdev->num_crtc >= 4) {  		WREG32(INT_MASK + EVERGREEN_CRTC2_REGISTER_OFFSET, 0);  		WREG32(INT_MASK + EVERGREEN_CRTC3_REGISTER_OFFSET, 0); +	} +	if (rdev->num_crtc >= 6) {  		WREG32(INT_MASK + EVERGREEN_CRTC4_REGISTER_OFFSET, 0);  		WREG32(INT_MASK + EVERGREEN_CRTC5_REGISTER_OFFSET, 0);  	}  	WREG32(GRPH_INT_CONTROL + EVERGREEN_CRTC0_REGISTER_OFFSET, 0);  	WREG32(GRPH_INT_CONTROL + EVERGREEN_CRTC1_REGISTER_OFFSET, 0); -	if (!(rdev->flags & RADEON_IS_IGP)) { +	if (rdev->num_crtc >= 4) {  		WREG32(GRPH_INT_CONTROL + EVERGREEN_CRTC2_REGISTER_OFFSET, 0);  		WREG32(GRPH_INT_CONTROL + EVERGREEN_CRTC3_REGISTER_OFFSET, 0); +	} +	if (rdev->num_crtc >= 6) {  		WREG32(GRPH_INT_CONTROL + EVERGREEN_CRTC4_REGISTER_OFFSET, 0);  		WREG32(GRPH_INT_CONTROL + EVERGREEN_CRTC5_REGISTER_OFFSET, 0);  	} @@ -2537,19 +2574,25 @@ int evergreen_irq_set(struct radeon_device *rdev)  	WREG32(INT_MASK + EVERGREEN_CRTC0_REGISTER_OFFSET, crtc1);  	WREG32(INT_MASK + EVERGREEN_CRTC1_REGISTER_OFFSET, crtc2); -	if (!(rdev->flags & RADEON_IS_IGP)) { +	if (rdev->num_crtc >= 4) {  		WREG32(INT_MASK + EVERGREEN_CRTC2_REGISTER_OFFSET, crtc3);  		WREG32(INT_MASK + EVERGREEN_CRTC3_REGISTER_OFFSET, crtc4); +	} +	if (rdev->num_crtc >= 6) {  		WREG32(INT_MASK + EVERGREEN_CRTC4_REGISTER_OFFSET, crtc5);  		WREG32(INT_MASK + EVERGREEN_CRTC5_REGISTER_OFFSET, crtc6);  	}  	WREG32(GRPH_INT_CONTROL + EVERGREEN_CRTC0_REGISTER_OFFSET, grph1);  	WREG32(GRPH_INT_CONTROL + EVERGREEN_CRTC1_REGISTER_OFFSET, grph2); -	WREG32(GRPH_INT_CONTROL + EVERGREEN_CRTC2_REGISTER_OFFSET, grph3); -	WREG32(GRPH_INT_CONTROL + EVERGREEN_CRTC3_REGISTER_OFFSET, grph4); -	WREG32(GRPH_INT_CONTROL + EVERGREEN_CRTC4_REGISTER_OFFSET, grph5); -	WREG32(GRPH_INT_CONTROL + EVERGREEN_CRTC5_REGISTER_OFFSET, grph6); +	if (rdev->num_crtc >= 4) { +		WREG32(GRPH_INT_CONTROL + EVERGREEN_CRTC2_REGISTER_OFFSET, grph3); +		WREG32(GRPH_INT_CONTROL + EVERGREEN_CRTC3_REGISTER_OFFSET, grph4); +	} +	if (rdev->num_crtc >= 6) { +		WREG32(GRPH_INT_CONTROL + EVERGREEN_CRTC4_REGISTER_OFFSET, grph5); +		WREG32(GRPH_INT_CONTROL + EVERGREEN_CRTC5_REGISTER_OFFSET, grph6); +	}  	WREG32(DC_HPD1_INT_CONTROL, hpd1);  	WREG32(DC_HPD2_INT_CONTROL, hpd2); @@ -2573,53 +2616,57 @@ static inline void evergreen_irq_ack(struct radeon_device *rdev)  	rdev->irq.stat_regs.evergreen.disp_int_cont5 = RREG32(DISP_INTERRUPT_STATUS_CONTINUE5);  	rdev->irq.stat_regs.evergreen.d1grph_int = RREG32(GRPH_INT_STATUS + EVERGREEN_CRTC0_REGISTER_OFFSET);  	rdev->irq.stat_regs.evergreen.d2grph_int = RREG32(GRPH_INT_STATUS + EVERGREEN_CRTC1_REGISTER_OFFSET); -	rdev->irq.stat_regs.evergreen.d3grph_int = RREG32(GRPH_INT_STATUS + EVERGREEN_CRTC2_REGISTER_OFFSET); -	rdev->irq.stat_regs.evergreen.d4grph_int = RREG32(GRPH_INT_STATUS + EVERGREEN_CRTC3_REGISTER_OFFSET); -	rdev->irq.stat_regs.evergreen.d5grph_int = RREG32(GRPH_INT_STATUS + EVERGREEN_CRTC4_REGISTER_OFFSET); -	rdev->irq.stat_regs.evergreen.d6grph_int = RREG32(GRPH_INT_STATUS + EVERGREEN_CRTC5_REGISTER_OFFSET); +	if (rdev->num_crtc >= 4) { +		rdev->irq.stat_regs.evergreen.d3grph_int = RREG32(GRPH_INT_STATUS + EVERGREEN_CRTC2_REGISTER_OFFSET); +		rdev->irq.stat_regs.evergreen.d4grph_int = RREG32(GRPH_INT_STATUS + EVERGREEN_CRTC3_REGISTER_OFFSET); +	} +	if (rdev->num_crtc >= 6) { +		rdev->irq.stat_regs.evergreen.d5grph_int = RREG32(GRPH_INT_STATUS + EVERGREEN_CRTC4_REGISTER_OFFSET); +		rdev->irq.stat_regs.evergreen.d6grph_int = RREG32(GRPH_INT_STATUS + EVERGREEN_CRTC5_REGISTER_OFFSET); +	}  	if (rdev->irq.stat_regs.evergreen.d1grph_int & GRPH_PFLIP_INT_OCCURRED)  		WREG32(GRPH_INT_STATUS + EVERGREEN_CRTC0_REGISTER_OFFSET, GRPH_PFLIP_INT_CLEAR);  	if (rdev->irq.stat_regs.evergreen.d2grph_int & GRPH_PFLIP_INT_OCCURRED)  		WREG32(GRPH_INT_STATUS + EVERGREEN_CRTC1_REGISTER_OFFSET, GRPH_PFLIP_INT_CLEAR); -	if (rdev->irq.stat_regs.evergreen.d3grph_int & GRPH_PFLIP_INT_OCCURRED) -		WREG32(GRPH_INT_STATUS + EVERGREEN_CRTC2_REGISTER_OFFSET, GRPH_PFLIP_INT_CLEAR); -	if (rdev->irq.stat_regs.evergreen.d4grph_int & GRPH_PFLIP_INT_OCCURRED) -		WREG32(GRPH_INT_STATUS + EVERGREEN_CRTC3_REGISTER_OFFSET, GRPH_PFLIP_INT_CLEAR); -	if (rdev->irq.stat_regs.evergreen.d5grph_int & GRPH_PFLIP_INT_OCCURRED) -		WREG32(GRPH_INT_STATUS + EVERGREEN_CRTC4_REGISTER_OFFSET, GRPH_PFLIP_INT_CLEAR); -	if (rdev->irq.stat_regs.evergreen.d6grph_int & GRPH_PFLIP_INT_OCCURRED) -		WREG32(GRPH_INT_STATUS + EVERGREEN_CRTC5_REGISTER_OFFSET, GRPH_PFLIP_INT_CLEAR); -  	if (rdev->irq.stat_regs.evergreen.disp_int & LB_D1_VBLANK_INTERRUPT)  		WREG32(VBLANK_STATUS + EVERGREEN_CRTC0_REGISTER_OFFSET, VBLANK_ACK);  	if (rdev->irq.stat_regs.evergreen.disp_int & LB_D1_VLINE_INTERRUPT)  		WREG32(VLINE_STATUS + EVERGREEN_CRTC0_REGISTER_OFFSET, VLINE_ACK); -  	if (rdev->irq.stat_regs.evergreen.disp_int_cont & LB_D2_VBLANK_INTERRUPT)  		WREG32(VBLANK_STATUS + EVERGREEN_CRTC1_REGISTER_OFFSET, VBLANK_ACK);  	if (rdev->irq.stat_regs.evergreen.disp_int_cont & LB_D2_VLINE_INTERRUPT)  		WREG32(VLINE_STATUS + EVERGREEN_CRTC1_REGISTER_OFFSET, VLINE_ACK); -	if (rdev->irq.stat_regs.evergreen.disp_int_cont2 & LB_D3_VBLANK_INTERRUPT) -		WREG32(VBLANK_STATUS + EVERGREEN_CRTC2_REGISTER_OFFSET, VBLANK_ACK); -	if (rdev->irq.stat_regs.evergreen.disp_int_cont2 & LB_D3_VLINE_INTERRUPT) -		WREG32(VLINE_STATUS + EVERGREEN_CRTC2_REGISTER_OFFSET, VLINE_ACK); - -	if (rdev->irq.stat_regs.evergreen.disp_int_cont3 & LB_D4_VBLANK_INTERRUPT) -		WREG32(VBLANK_STATUS + EVERGREEN_CRTC3_REGISTER_OFFSET, VBLANK_ACK); -	if (rdev->irq.stat_regs.evergreen.disp_int_cont3 & LB_D4_VLINE_INTERRUPT) -		WREG32(VLINE_STATUS + EVERGREEN_CRTC3_REGISTER_OFFSET, VLINE_ACK); - -	if (rdev->irq.stat_regs.evergreen.disp_int_cont4 & LB_D5_VBLANK_INTERRUPT) -		WREG32(VBLANK_STATUS + EVERGREEN_CRTC4_REGISTER_OFFSET, VBLANK_ACK); -	if (rdev->irq.stat_regs.evergreen.disp_int_cont4 & LB_D5_VLINE_INTERRUPT) -		WREG32(VLINE_STATUS + EVERGREEN_CRTC4_REGISTER_OFFSET, VLINE_ACK); +	if (rdev->num_crtc >= 4) { +		if (rdev->irq.stat_regs.evergreen.d3grph_int & GRPH_PFLIP_INT_OCCURRED) +			WREG32(GRPH_INT_STATUS + EVERGREEN_CRTC2_REGISTER_OFFSET, GRPH_PFLIP_INT_CLEAR); +		if (rdev->irq.stat_regs.evergreen.d4grph_int & GRPH_PFLIP_INT_OCCURRED) +			WREG32(GRPH_INT_STATUS + EVERGREEN_CRTC3_REGISTER_OFFSET, GRPH_PFLIP_INT_CLEAR); +		if (rdev->irq.stat_regs.evergreen.disp_int_cont2 & LB_D3_VBLANK_INTERRUPT) +			WREG32(VBLANK_STATUS + EVERGREEN_CRTC2_REGISTER_OFFSET, VBLANK_ACK); +		if (rdev->irq.stat_regs.evergreen.disp_int_cont2 & LB_D3_VLINE_INTERRUPT) +			WREG32(VLINE_STATUS + EVERGREEN_CRTC2_REGISTER_OFFSET, VLINE_ACK); +		if (rdev->irq.stat_regs.evergreen.disp_int_cont3 & LB_D4_VBLANK_INTERRUPT) +			WREG32(VBLANK_STATUS + EVERGREEN_CRTC3_REGISTER_OFFSET, VBLANK_ACK); +		if (rdev->irq.stat_regs.evergreen.disp_int_cont3 & LB_D4_VLINE_INTERRUPT) +			WREG32(VLINE_STATUS + EVERGREEN_CRTC3_REGISTER_OFFSET, VLINE_ACK); +	} -	if (rdev->irq.stat_regs.evergreen.disp_int_cont5 & LB_D6_VBLANK_INTERRUPT) -		WREG32(VBLANK_STATUS + EVERGREEN_CRTC5_REGISTER_OFFSET, VBLANK_ACK); -	if (rdev->irq.stat_regs.evergreen.disp_int_cont5 & LB_D6_VLINE_INTERRUPT) -		WREG32(VLINE_STATUS + EVERGREEN_CRTC5_REGISTER_OFFSET, VLINE_ACK); +	if (rdev->num_crtc >= 6) { +		if (rdev->irq.stat_regs.evergreen.d5grph_int & GRPH_PFLIP_INT_OCCURRED) +			WREG32(GRPH_INT_STATUS + EVERGREEN_CRTC4_REGISTER_OFFSET, GRPH_PFLIP_INT_CLEAR); +		if (rdev->irq.stat_regs.evergreen.d6grph_int & GRPH_PFLIP_INT_OCCURRED) +			WREG32(GRPH_INT_STATUS + EVERGREEN_CRTC5_REGISTER_OFFSET, GRPH_PFLIP_INT_CLEAR); +		if (rdev->irq.stat_regs.evergreen.disp_int_cont4 & LB_D5_VBLANK_INTERRUPT) +			WREG32(VBLANK_STATUS + EVERGREEN_CRTC4_REGISTER_OFFSET, VBLANK_ACK); +		if (rdev->irq.stat_regs.evergreen.disp_int_cont4 & LB_D5_VLINE_INTERRUPT) +			WREG32(VLINE_STATUS + EVERGREEN_CRTC4_REGISTER_OFFSET, VLINE_ACK); +		if (rdev->irq.stat_regs.evergreen.disp_int_cont5 & LB_D6_VBLANK_INTERRUPT) +			WREG32(VBLANK_STATUS + EVERGREEN_CRTC5_REGISTER_OFFSET, VBLANK_ACK); +		if (rdev->irq.stat_regs.evergreen.disp_int_cont5 & LB_D6_VLINE_INTERRUPT) +			WREG32(VLINE_STATUS + EVERGREEN_CRTC5_REGISTER_OFFSET, VLINE_ACK); +	}  	if (rdev->irq.stat_regs.evergreen.disp_int & DC_HPD1_INTERRUPT) {  		tmp = RREG32(DC_HPD1_INT_CONTROL); @@ -2694,28 +2741,25 @@ static inline u32 evergreen_get_ih_wptr(struct radeon_device *rdev)  int evergreen_irq_process(struct radeon_device *rdev)  { -	u32 wptr = evergreen_get_ih_wptr(rdev); -	u32 rptr = rdev->ih.rptr; +	u32 wptr; +	u32 rptr;  	u32 src_id, src_data;  	u32 ring_index;  	unsigned long flags;  	bool queue_hotplug = false; -	DRM_DEBUG("r600_irq_process start: rptr %d, wptr %d\n", rptr, wptr); -	if (!rdev->ih.enabled) +	if (!rdev->ih.enabled || rdev->shutdown)  		return IRQ_NONE; -	spin_lock_irqsave(&rdev->ih.lock, flags); +	wptr = evergreen_get_ih_wptr(rdev); +	rptr = rdev->ih.rptr; +	DRM_DEBUG("r600_irq_process start: rptr %d, wptr %d\n", rptr, wptr); +	spin_lock_irqsave(&rdev->ih.lock, flags);  	if (rptr == wptr) {  		spin_unlock_irqrestore(&rdev->ih.lock, flags);  		return IRQ_NONE;  	} -	if (rdev->shutdown) { -		spin_unlock_irqrestore(&rdev->ih.lock, flags); -		return IRQ_NONE; -	} -  restart_ih:  	/* display interrupts */  	evergreen_irq_ack(rdev); @@ -2944,7 +2988,7 @@ restart_ih:  			radeon_fence_process(rdev);  			break;  		case 233: /* GUI IDLE */ -			DRM_DEBUG("IH: CP EOP\n"); +			DRM_DEBUG("IH: GUI idle\n");  			rdev->pm.gui_idle = true;  			wake_up(&rdev->irq.idle_queue);  			break; @@ -3230,6 +3274,7 @@ void evergreen_fini(struct radeon_device *rdev)  	r700_cp_fini(rdev);  	r600_irq_fini(rdev);  	radeon_wb_fini(rdev); +	radeon_ib_pool_fini(rdev);  	radeon_irq_kms_fini(rdev);  	evergreen_pcie_gart_fini(rdev);  	radeon_gem_fini(rdev);  |