diff options
Diffstat (limited to 'drivers/gpu/drm/radeon/rv770_dpm.c')
| -rw-r--r-- | drivers/gpu/drm/radeon/rv770_dpm.c | 56 | 
1 files changed, 30 insertions, 26 deletions
diff --git a/drivers/gpu/drm/radeon/rv770_dpm.c b/drivers/gpu/drm/radeon/rv770_dpm.c index 913b025ae9b..3c76e1dcdf0 100644 --- a/drivers/gpu/drm/radeon/rv770_dpm.c +++ b/drivers/gpu/drm/radeon/rv770_dpm.c @@ -1863,8 +1863,8 @@ void rv770_enable_auto_throttle_source(struct radeon_device *rdev,  	}  } -int rv770_set_thermal_temperature_range(struct radeon_device *rdev, -					int min_temp, int max_temp) +static int rv770_set_thermal_temperature_range(struct radeon_device *rdev, +					       int min_temp, int max_temp)  {  	int low_temp = 0 * 1000;  	int high_temp = 255 * 1000; @@ -1966,6 +1966,15 @@ int rv770_dpm_enable(struct radeon_device *rdev)  	if (pi->mg_clock_gating)  		rv770_mg_clock_gating_enable(rdev, true); +	rv770_enable_auto_throttle_source(rdev, RADEON_DPM_AUTO_THROTTLE_SRC_THERMAL, true); + +	return 0; +} + +int rv770_dpm_late_enable(struct radeon_device *rdev) +{ +	int ret; +  	if (rdev->irq.installed &&  	    r600_is_internal_thermal_sensor(rdev->pm.int_thermal_type)) {  		PPSMC_Result result; @@ -1981,8 +1990,6 @@ int rv770_dpm_enable(struct radeon_device *rdev)  			DRM_DEBUG_KMS("Could not enable thermal interrupts.\n");  	} -	rv770_enable_auto_throttle_source(rdev, RADEON_DPM_AUTO_THROTTLE_SRC_THERMAL, true); -  	return 0;  } @@ -2167,7 +2174,6 @@ static void rv7xx_parse_pplib_clock_info(struct radeon_device *rdev,  	struct evergreen_power_info *eg_pi = evergreen_get_pi(rdev);  	struct rv7xx_ps *ps = rv770_get_ps(rps);  	u32 sclk, mclk; -	u16 vddc;  	struct rv7xx_pl *pl;  	switch (index) { @@ -2207,8 +2213,8 @@ static void rv7xx_parse_pplib_clock_info(struct radeon_device *rdev,  	/* patch up vddc if necessary */  	if (pl->vddc == 0xff01) { -		if (radeon_atom_get_max_vddc(rdev, 0, 0, &vddc) == 0) -			pl->vddc = vddc; +		if (pi->max_vddc) +			pl->vddc = pi->max_vddc;  	}  	if (rps->class & ATOM_PPLIB_CLASSIFICATION_ACPI) { @@ -2244,14 +2250,12 @@ static void rv7xx_parse_pplib_clock_info(struct radeon_device *rdev,  		pl->vddci = vddci;  	} -	if (rdev->family >= CHIP_BARTS) { -		if ((rps->class & ATOM_PPLIB_CLASSIFICATION_UI_MASK) == -		    ATOM_PPLIB_CLASSIFICATION_UI_PERFORMANCE) { -			rdev->pm.dpm.dyn_state.max_clock_voltage_on_ac.sclk = pl->sclk; -			rdev->pm.dpm.dyn_state.max_clock_voltage_on_ac.mclk = pl->mclk; -			rdev->pm.dpm.dyn_state.max_clock_voltage_on_ac.vddc = pl->vddc; -			rdev->pm.dpm.dyn_state.max_clock_voltage_on_ac.vddci = pl->vddci; -		} +	if ((rps->class & ATOM_PPLIB_CLASSIFICATION_UI_MASK) == +	    ATOM_PPLIB_CLASSIFICATION_UI_PERFORMANCE) { +		rdev->pm.dpm.dyn_state.max_clock_voltage_on_ac.sclk = pl->sclk; +		rdev->pm.dpm.dyn_state.max_clock_voltage_on_ac.mclk = pl->mclk; +		rdev->pm.dpm.dyn_state.max_clock_voltage_on_ac.vddc = pl->vddc; +		rdev->pm.dpm.dyn_state.max_clock_voltage_on_ac.vddci = pl->vddci;  	}  } @@ -2277,9 +2281,6 @@ int rv7xx_parse_power_table(struct radeon_device *rdev)  				  power_info->pplib.ucNumStates, GFP_KERNEL);  	if (!rdev->pm.dpm.ps)  		return -ENOMEM; -	rdev->pm.dpm.platform_caps = le32_to_cpu(power_info->pplib.ulPlatformCaps); -	rdev->pm.dpm.backbias_response_time = le16_to_cpu(power_info->pplib.usBackbiasTime); -	rdev->pm.dpm.voltage_response_time = le16_to_cpu(power_info->pplib.usVoltageTime);  	for (i = 0; i < power_info->pplib.ucNumStates; i++) {  		power_state = (union pplib_power_state *) @@ -2351,6 +2352,10 @@ int rv770_dpm_init(struct radeon_device *rdev)  	pi->min_vddc_in_table = 0;  	pi->max_vddc_in_table = 0; +	ret = r600_get_platform_caps(rdev); +	if (ret) +		return ret; +  	ret = rv7xx_parse_power_table(rdev);  	if (ret)  		return ret; @@ -2516,14 +2521,13 @@ u32 rv770_dpm_get_mclk(struct radeon_device *rdev, bool low)  bool rv770_dpm_vblank_too_short(struct radeon_device *rdev)  {  	u32 vblank_time = r600_dpm_get_vblank_time(rdev); -	u32 switch_limit = 300; - -	/* quirks */ -	/* ASUS K70AF */ -	if ((rdev->pdev->device == 0x9553) && -	    (rdev->pdev->subsystem_vendor == 0x1043) && -	    (rdev->pdev->subsystem_device == 0x1c42)) -		switch_limit = 200; +	u32 switch_limit = 200; /* 300 */ + +	/* RV770 */ +	/* mclk switching doesn't seem to work reliably on desktop RV770s */ +	if ((rdev->family == CHIP_RV770) && +	    !(rdev->flags & RADEON_IS_MOBILITY)) +		switch_limit = 0xffffffff; /* disable mclk switching */  	if (vblank_time < switch_limit)  		return true;  | 
