diff options
Diffstat (limited to 'drivers/gpu/drm/radeon/ni_dpm.c')
| -rw-r--r-- | drivers/gpu/drm/radeon/ni_dpm.c | 70 | 
1 files changed, 28 insertions, 42 deletions
diff --git a/drivers/gpu/drm/radeon/ni_dpm.c b/drivers/gpu/drm/radeon/ni_dpm.c index f2633902815..01fc4888e6f 100644 --- a/drivers/gpu/drm/radeon/ni_dpm.c +++ b/drivers/gpu/drm/radeon/ni_dpm.c @@ -720,6 +720,8 @@ static const u32 cayman_sysls_enable[] =  struct rv7xx_power_info *rv770_get_pi(struct radeon_device *rdev);  struct evergreen_power_info *evergreen_get_pi(struct radeon_device *rdev); +extern int ni_mc_load_microcode(struct radeon_device *rdev); +  struct ni_power_info *ni_get_pi(struct radeon_device *rdev)  {          struct ni_power_info *pi = rdev->pm.dpm.priv; @@ -785,8 +787,8 @@ static void ni_apply_state_adjust_rules(struct radeon_device *rdev,  	struct ni_ps *ps = ni_get_ps(rps);  	struct radeon_clock_and_voltage_limits *max_limits;  	bool disable_mclk_switching; -	u32 mclk, sclk; -	u16 vddc, vddci; +	u32 mclk; +	u16 vddci;  	u32 max_sclk_vddc, max_mclk_vddci, max_mclk_vddc;  	int i; @@ -839,24 +841,14 @@ static void ni_apply_state_adjust_rules(struct radeon_device *rdev,  	/* XXX validate the min clocks required for display */ +	/* adjust low state */  	if (disable_mclk_switching) { -		mclk  = ps->performance_levels[ps->performance_level_count - 1].mclk; -		sclk = ps->performance_levels[0].sclk; -		vddc = ps->performance_levels[0].vddc; -		vddci = ps->performance_levels[ps->performance_level_count - 1].vddci; -	} else { -		sclk = ps->performance_levels[0].sclk; -		mclk = ps->performance_levels[0].mclk; -		vddc = ps->performance_levels[0].vddc; -		vddci = ps->performance_levels[0].vddci; +		ps->performance_levels[0].mclk = +			ps->performance_levels[ps->performance_level_count - 1].mclk; +		ps->performance_levels[0].vddci = +			ps->performance_levels[ps->performance_level_count - 1].vddci;  	} -	/* adjusted low state */ -	ps->performance_levels[0].sclk = sclk; -	ps->performance_levels[0].mclk = mclk; -	ps->performance_levels[0].vddc = vddc; -	ps->performance_levels[0].vddci = vddci; -  	btc_skip_blacklist_clocks(rdev, max_limits->sclk, max_limits->mclk,  				  &ps->performance_levels[0].sclk,  				  &ps->performance_levels[0].mclk); @@ -868,11 +860,15 @@ static void ni_apply_state_adjust_rules(struct radeon_device *rdev,  			ps->performance_levels[i].vddc = ps->performance_levels[i - 1].vddc;  	} +	/* adjust remaining states */  	if (disable_mclk_switching) {  		mclk = ps->performance_levels[0].mclk; +		vddci = ps->performance_levels[0].vddci;  		for (i = 1; i < ps->performance_level_count; i++) {  			if (mclk < ps->performance_levels[i].mclk)  				mclk = ps->performance_levels[i].mclk; +			if (vddci < ps->performance_levels[i].vddci) +				vddci = ps->performance_levels[i].vddci;  		}  		for (i = 0; i < ps->performance_level_count; i++) {  			ps->performance_levels[i].mclk = mclk; @@ -1319,7 +1315,7 @@ static void ni_populate_smc_voltage_tables(struct radeon_device *rdev,  		table->voltageMaskTable.highMask[NISLANDS_SMC_VOLTAGEMASK_VDDCI] = 0;  		table->voltageMaskTable.lowMask[NISLANDS_SMC_VOLTAGEMASK_VDDCI] = -			cpu_to_be32(eg_pi->vddc_voltage_table.mask_low); +			cpu_to_be32(eg_pi->vddci_voltage_table.mask_low);  	}  } @@ -2592,7 +2588,7 @@ static int ni_populate_sq_ramping_values(struct radeon_device *rdev,  	if (NISLANDS_DPM2_SQ_RAMP_STI_SIZE > (STI_SIZE_MASK >> STI_SIZE_SHIFT))  		enable_sq_ramping = false; -	if (NISLANDS_DPM2_SQ_RAMP_LTI_RATIO <= (LTI_RATIO_MASK >> LTI_RATIO_SHIFT)) +	if (NISLANDS_DPM2_SQ_RAMP_LTI_RATIO > (LTI_RATIO_MASK >> LTI_RATIO_SHIFT))  		enable_sq_ramping = false;  	for (i = 0; i < state->performance_level_count; i++) { @@ -3445,9 +3441,9 @@ static int ni_enable_smc_cac(struct radeon_device *rdev,  static int ni_pcie_performance_request(struct radeon_device *rdev,  				       u8 perf_req, bool advertise)  { +#if defined(CONFIG_ACPI)  	struct evergreen_power_info *eg_pi = evergreen_get_pi(rdev); -#if defined(CONFIG_ACPI)  	if ((perf_req == PCIE_PERF_REQ_PECI_GEN1) ||              (perf_req == PCIE_PERF_REQ_PECI_GEN2)) {  		if (eg_pi->pcie_performance_request_registered == false) @@ -3571,7 +3567,11 @@ void ni_set_uvd_clock_after_set_eng_clock(struct radeon_device *rdev,  void ni_dpm_setup_asic(struct radeon_device *rdev)  {  	struct evergreen_power_info *eg_pi = evergreen_get_pi(rdev); +	int r; +	r = ni_mc_load_microcode(rdev); +	if (r) +		DRM_ERROR("Failed to load MC firmware!\n");  	ni_read_clock_registers(rdev);  	btc_read_arb_registers(rdev);  	rv770_get_memory_type(rdev); @@ -3716,21 +3716,6 @@ int ni_dpm_enable(struct radeon_device *rdev)  	if (eg_pi->ls_clock_gating)  		ni_ls_clockgating_enable(rdev, true); -	if (rdev->irq.installed && -	    r600_is_internal_thermal_sensor(rdev->pm.int_thermal_type)) { -		PPSMC_Result result; - -		ret = rv770_set_thermal_temperature_range(rdev, R600_TEMP_RANGE_MIN, 0xff * 1000); -		if (ret) -			return ret; -		rdev->irq.dpm_thermal = true; -		radeon_irq_set(rdev); -		result = rv770_send_msg_to_smc(rdev, PPSMC_MSG_EnableThermalInterrupt); - -		if (result != PPSMC_Result_OK) -			DRM_DEBUG_KMS("Could not enable thermal interrupts.\n"); -	} -  	rv770_enable_auto_throttle_source(rdev, RADEON_DPM_AUTO_THROTTLE_SRC_THERMAL, true);  	ni_update_current_ps(rdev, boot_ps); @@ -3960,7 +3945,6 @@ static void ni_parse_pplib_clock_info(struct radeon_device *rdev,  	struct rv7xx_power_info *pi = rv770_get_pi(rdev);  	struct evergreen_power_info *eg_pi = evergreen_get_pi(rdev);  	struct ni_ps *ps = ni_get_ps(rps); -	u16 vddc;  	struct rv7xx_pl *pl = &ps->performance_levels[index];  	ps->performance_level_count = index + 1; @@ -3976,8 +3960,8 @@ static void ni_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) { @@ -4041,9 +4025,6 @@ static int ni_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 *) @@ -4105,6 +4086,10 @@ int ni_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 = ni_parse_power_table(rdev);  	if (ret)  		return ret; @@ -4337,7 +4322,8 @@ void ni_dpm_print_power_state(struct radeon_device *rdev,  void ni_dpm_debugfs_print_current_performance_level(struct radeon_device *rdev,  						    struct seq_file *m)  { -	struct radeon_ps *rps = rdev->pm.dpm.current_ps; +	struct evergreen_power_info *eg_pi = evergreen_get_pi(rdev); +	struct radeon_ps *rps = &eg_pi->current_rps;  	struct ni_ps *ps = ni_get_ps(rps);  	struct rv7xx_pl *pl;  	u32 current_index =  | 
