Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit cc0cc1aa authored by Dave Airlie's avatar Dave Airlie
Browse files

Merge branch 'drm-next-3.20' of git://people.freedesktop.org/~agd5f/linux into drm-next

Radeon drm-next changes for 3.20.  Highlights:
- Indirect draw support for evergreen/NI hw
- SMC fan control support for SI/CI
- Manual fan control for SI/CI
- DP audio support
- Lots of code cleanup

* 'drm-next-3.20' of git://people.freedesktop.org/~agd5f/linux: (45 commits)
  drm/radeon: make MMU_NOTIFIER optional
  drm/radeon: use NULL rather then 0 in audio detect
  drm/radeon: whitespace clean up in radeon_audio.c
  radeon/audio: enable DP audio
  radeon/audio: moved audio caps programming to audio_hotplug() function
  radeon/audio: applied audio_dpms() and audio_mode_set() calls
  radeon/audio: consolidate audio_mode_set() functions
  radeon/audio: removed unnecessary debug settings
  radeon/audio: moved mute programming to a separate function
  radeon/audio: moved audio packet programming to a separate function
  radeon/audio: set_avi_packet() function cleanup
  radeon/audio: removed unnecessary CRC control programing
  radeon: moved HDMI color depth programming to a separate function
  radeon/audio: moved VBI packet programming to separate functions
  radeon/audio: consolidate update_acr() functions (v2)
  radeon/audio: consolidate update_avi_infoframe() functions
  radeon/audio: consolidate audio_set_dto() functions
  radeon/audio: consolidate audio_fini() functions
  radeon/audio: consolidate audio_enable() functions
  radeon/audio: consolidate select_pin() functions
  ...
parents 923e0575 5a1aa4b4
Loading
Loading
Loading
Loading
+0 −1
Original line number Original line Diff line number Diff line
@@ -110,7 +110,6 @@ config DRM_RADEON
	select HWMON
	select HWMON
	select BACKLIGHT_CLASS_DEVICE
	select BACKLIGHT_CLASS_DEVICE
	select INTERVAL_TREE
	select INTERVAL_TREE
	select MMU_NOTIFIER
	help
	help
	  Choose this option if you have an ATI Radeon graphics card.  There
	  Choose this option if you have an ATI Radeon graphics card.  There
	  are both PCI and AGP versions.  You don't need to choose this to
	  are both PCI and AGP versions.  You don't need to choose this to
+4 −2
Original line number Original line Diff line number Diff line
@@ -80,8 +80,10 @@ radeon-y += radeon_device.o radeon_asic.o radeon_kms.o \
	r600_dpm.o rs780_dpm.o rv6xx_dpm.o rv770_dpm.o rv730_dpm.o rv740_dpm.o \
	r600_dpm.o rs780_dpm.o rv6xx_dpm.o rv770_dpm.o rv730_dpm.o rv740_dpm.o \
	rv770_smc.o cypress_dpm.o btc_dpm.o sumo_dpm.o sumo_smc.o trinity_dpm.o \
	rv770_smc.o cypress_dpm.o btc_dpm.o sumo_dpm.o sumo_smc.o trinity_dpm.o \
	trinity_smc.o ni_dpm.o si_smc.o si_dpm.o kv_smc.o kv_dpm.o ci_smc.o \
	trinity_smc.o ni_dpm.o si_smc.o si_dpm.o kv_smc.o kv_dpm.o ci_smc.o \
	ci_dpm.o dce6_afmt.o radeon_vm.o radeon_ucode.o radeon_ib.o radeon_mn.o \
	ci_dpm.o dce6_afmt.o radeon_vm.o radeon_ucode.o radeon_ib.o \
	radeon_sync.o
	radeon_sync.o radeon_audio.o

radeon-$(CONFIG_MMU_NOTIFIER) += radeon_mn.o


# add async DMA block
# add async DMA block
radeon-y += \
radeon-y += \
+18 −11
Original line number Original line Diff line number Diff line
@@ -27,6 +27,7 @@
#include <drm/drm_crtc_helper.h>
#include <drm/drm_crtc_helper.h>
#include <drm/radeon_drm.h>
#include <drm/radeon_drm.h>
#include "radeon.h"
#include "radeon.h"
#include "radeon_audio.h"
#include "atom.h"
#include "atom.h"
#include <linux/backlight.h>
#include <linux/backlight.h>


@@ -664,6 +665,8 @@ atombios_digital_setup(struct drm_encoder *encoder, int action)
int
int
atombios_get_encoder_mode(struct drm_encoder *encoder)
atombios_get_encoder_mode(struct drm_encoder *encoder)
{
{
	struct drm_device *dev = encoder->dev;
	struct radeon_device *rdev = dev->dev_private;
	struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder);
	struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder);
	struct drm_connector *connector;
	struct drm_connector *connector;
	struct radeon_connector *radeon_connector;
	struct radeon_connector *radeon_connector;
@@ -728,6 +731,8 @@ atombios_get_encoder_mode(struct drm_encoder *encoder)
		dig_connector = radeon_connector->con_priv;
		dig_connector = radeon_connector->con_priv;
		if ((dig_connector->dp_sink_type == CONNECTOR_OBJECT_ID_DISPLAYPORT) ||
		if ((dig_connector->dp_sink_type == CONNECTOR_OBJECT_ID_DISPLAYPORT) ||
		    (dig_connector->dp_sink_type == CONNECTOR_OBJECT_ID_eDP)) {
		    (dig_connector->dp_sink_type == CONNECTOR_OBJECT_ID_eDP)) {
			if (radeon_audio != 0 && ASIC_IS_DCE4(rdev) && !ASIC_IS_DCE5(rdev))
				return ATOM_ENCODER_MODE_DP_AUDIO;
			return ATOM_ENCODER_MODE_DP;
			return ATOM_ENCODER_MODE_DP;
		} else if (radeon_audio != 0) {
		} else if (radeon_audio != 0) {
			if (radeon_connector->audio == RADEON_AUDIO_ENABLE)
			if (radeon_connector->audio == RADEON_AUDIO_ENABLE)
@@ -742,6 +747,8 @@ atombios_get_encoder_mode(struct drm_encoder *encoder)
		}
		}
		break;
		break;
	case DRM_MODE_CONNECTOR_eDP:
	case DRM_MODE_CONNECTOR_eDP:
		if (radeon_audio != 0 && ASIC_IS_DCE4(rdev) && !ASIC_IS_DCE5(rdev))
			return ATOM_ENCODER_MODE_DP_AUDIO;
		return ATOM_ENCODER_MODE_DP;
		return ATOM_ENCODER_MODE_DP;
	case DRM_MODE_CONNECTOR_DVIA:
	case DRM_MODE_CONNECTOR_DVIA:
	case DRM_MODE_CONNECTOR_VGA:
	case DRM_MODE_CONNECTOR_VGA:
@@ -1615,6 +1622,7 @@ radeon_atom_encoder_dpms_dig(struct drm_encoder *encoder, int mode)
	struct radeon_connector *radeon_connector = NULL;
	struct radeon_connector *radeon_connector = NULL;
	struct radeon_connector_atom_dig *radeon_dig_connector = NULL;
	struct radeon_connector_atom_dig *radeon_dig_connector = NULL;
	bool travis_quirk = false;
	bool travis_quirk = false;
	int encoder_mode;


	if (connector) {
	if (connector) {
		radeon_connector = to_radeon_connector(connector);
		radeon_connector = to_radeon_connector(connector);
@@ -1710,6 +1718,11 @@ radeon_atom_encoder_dpms_dig(struct drm_encoder *encoder, int mode)
		}
		}
		break;
		break;
	}
	}

	encoder_mode = atombios_get_encoder_mode(encoder);
	if (radeon_audio != 0 &&
		(encoder_mode == ATOM_ENCODER_MODE_HDMI || ENCODER_MODE_IS_DP(encoder_mode)))
		radeon_audio_dpms(encoder, mode);
}
}


static void
static void
@@ -2123,6 +2136,7 @@ radeon_atom_encoder_mode_set(struct drm_encoder *encoder,
	struct drm_device *dev = encoder->dev;
	struct drm_device *dev = encoder->dev;
	struct radeon_device *rdev = dev->dev_private;
	struct radeon_device *rdev = dev->dev_private;
	struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder);
	struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder);
	int encoder_mode;


	radeon_encoder->pixel_clock = adjusted_mode->clock;
	radeon_encoder->pixel_clock = adjusted_mode->clock;


@@ -2149,6 +2163,10 @@ radeon_atom_encoder_mode_set(struct drm_encoder *encoder,
	case ENCODER_OBJECT_ID_INTERNAL_UNIPHY3:
	case ENCODER_OBJECT_ID_INTERNAL_UNIPHY3:
	case ENCODER_OBJECT_ID_INTERNAL_KLDSCP_LVTMA:
	case ENCODER_OBJECT_ID_INTERNAL_KLDSCP_LVTMA:
		/* handled in dpms */
		/* handled in dpms */
		encoder_mode = atombios_get_encoder_mode(encoder);
		if (radeon_audio != 0 &&
			(encoder_mode == ATOM_ENCODER_MODE_HDMI || ENCODER_MODE_IS_DP(encoder_mode)))
			radeon_audio_mode_set(encoder, adjusted_mode);
		break;
		break;
	case ENCODER_OBJECT_ID_INTERNAL_DDI:
	case ENCODER_OBJECT_ID_INTERNAL_DDI:
	case ENCODER_OBJECT_ID_INTERNAL_DVO1:
	case ENCODER_OBJECT_ID_INTERNAL_DVO1:
@@ -2170,13 +2188,6 @@ radeon_atom_encoder_mode_set(struct drm_encoder *encoder,
	}
	}


	atombios_apply_encoder_quirks(encoder, adjusted_mode);
	atombios_apply_encoder_quirks(encoder, adjusted_mode);

	if (atombios_get_encoder_mode(encoder) == ATOM_ENCODER_MODE_HDMI) {
		if (rdev->asic->display.hdmi_enable)
			radeon_hdmi_enable(rdev, encoder, true);
		if (rdev->asic->display.hdmi_setmode)
			radeon_hdmi_setmode(rdev, encoder, adjusted_mode);
	}
}
}


static bool
static bool
@@ -2442,10 +2453,6 @@ static void radeon_atom_encoder_disable(struct drm_encoder *encoder)


disable_done:
disable_done:
	if (radeon_encoder_is_digital(encoder)) {
	if (radeon_encoder_is_digital(encoder)) {
		if (atombios_get_encoder_mode(encoder) == ATOM_ENCODER_MODE_HDMI) {
			if (rdev->asic->display.hdmi_enable)
				radeon_hdmi_enable(rdev, encoder, false);
		}
		dig = radeon_encoder->enc_priv;
		dig = radeon_encoder->enc_priv;
		dig->dig_encoder = -1;
		dig->dig_encoder = -1;
	}
	}
+2 −0
Original line number Original line Diff line number Diff line
@@ -2277,6 +2277,7 @@ static void btc_update_requested_ps(struct radeon_device *rdev,
	eg_pi->requested_rps.ps_priv = &eg_pi->requested_ps;
	eg_pi->requested_rps.ps_priv = &eg_pi->requested_ps;
}
}


#if 0
void btc_dpm_reset_asic(struct radeon_device *rdev)
void btc_dpm_reset_asic(struct radeon_device *rdev)
{
{
	rv770_restrict_performance_levels_before_switch(rdev);
	rv770_restrict_performance_levels_before_switch(rdev);
@@ -2284,6 +2285,7 @@ void btc_dpm_reset_asic(struct radeon_device *rdev)
	btc_set_boot_state_timing(rdev);
	btc_set_boot_state_timing(rdev);
	rv770_set_boot_state(rdev);
	rv770_set_boot_state(rdev);
}
}
#endif


int btc_dpm_pre_set_power_state(struct radeon_device *rdev)
int btc_dpm_pre_set_power_state(struct radeon_device *rdev)
{
{
+47 −10
Original line number Original line Diff line number Diff line
@@ -187,6 +187,9 @@ static int ci_update_uvd_dpm(struct radeon_device *rdev, bool gate);
static PPSMC_Result ci_send_msg_to_smc_with_parameter(struct radeon_device *rdev,
static PPSMC_Result ci_send_msg_to_smc_with_parameter(struct radeon_device *rdev,
						      PPSMC_Msg msg, u32 parameter);
						      PPSMC_Msg msg, u32 parameter);


static void ci_thermal_start_smc_fan_control(struct radeon_device *rdev);
static void ci_fan_ctrl_set_default_mode(struct radeon_device *rdev);

static struct ci_power_info *ci_get_pi(struct radeon_device *rdev)
static struct ci_power_info *ci_get_pi(struct radeon_device *rdev)
{
{
        struct ci_power_info *pi = rdev->pm.dpm.priv;
        struct ci_power_info *pi = rdev->pm.dpm.priv;
@@ -1043,22 +1046,24 @@ static int ci_fan_ctrl_start_smc_fan_control(struct radeon_device *rdev)
			return -EINVAL;
			return -EINVAL;
	}
	}


	pi->fan_is_controlled_by_smc = true;
	return 0;
	return 0;
}
}


#if 0
static int ci_fan_ctrl_stop_smc_fan_control(struct radeon_device *rdev)
static int ci_fan_ctrl_stop_smc_fan_control(struct radeon_device *rdev)
{
{
	PPSMC_Result ret;
	PPSMC_Result ret;
	struct ci_power_info *pi = ci_get_pi(rdev);


	ret = ci_send_msg_to_smc(rdev, PPSMC_StopFanControl);
	ret = ci_send_msg_to_smc(rdev, PPSMC_StopFanControl);
	if (ret == PPSMC_Result_OK)
	if (ret == PPSMC_Result_OK) {
		pi->fan_is_controlled_by_smc = false;
		return 0;
		return 0;
	else
	} else
		return -EINVAL;
		return -EINVAL;
}
}


static int ci_fan_ctrl_get_fan_speed_percent(struct radeon_device *rdev,
int ci_fan_ctrl_get_fan_speed_percent(struct radeon_device *rdev,
					     u32 *speed)
					     u32 *speed)
{
{
	u32 duty, duty100;
	u32 duty, duty100;
@@ -1083,21 +1088,22 @@ static int ci_fan_ctrl_get_fan_speed_percent(struct radeon_device *rdev,
	return 0;
	return 0;
}
}


static int ci_fan_ctrl_set_fan_speed_percent(struct radeon_device *rdev,
int ci_fan_ctrl_set_fan_speed_percent(struct radeon_device *rdev,
					     u32 speed)
					     u32 speed)
{
{
	u32 tmp;
	u32 tmp;
	u32 duty, duty100;
	u32 duty, duty100;
	u64 tmp64;
	u64 tmp64;
	struct ci_power_info *pi = ci_get_pi(rdev);


	if (rdev->pm.no_fan)
	if (rdev->pm.no_fan)
		return -ENOENT;
		return -ENOENT;


	if (speed > 100)
	if (pi->fan_is_controlled_by_smc)
		return -EINVAL;
		return -EINVAL;


	if (rdev->pm.dpm.fan.ucode_fan_control)
	if (speed > 100)
		ci_fan_ctrl_stop_smc_fan_control(rdev);
		return -EINVAL;


	duty100 = (RREG32_SMC(CG_FDO_CTRL1) & FMAX_DUTY100_MASK) >> FMAX_DUTY100_SHIFT;
	duty100 = (RREG32_SMC(CG_FDO_CTRL1) & FMAX_DUTY100_MASK) >> FMAX_DUTY100_SHIFT;


@@ -1112,11 +1118,38 @@ static int ci_fan_ctrl_set_fan_speed_percent(struct radeon_device *rdev,
	tmp |= FDO_STATIC_DUTY(duty);
	tmp |= FDO_STATIC_DUTY(duty);
	WREG32_SMC(CG_FDO_CTRL0, tmp);
	WREG32_SMC(CG_FDO_CTRL0, tmp);


	ci_fan_ctrl_set_static_mode(rdev, FDO_PWM_MODE_STATIC);
	return 0;
}

void ci_fan_ctrl_set_mode(struct radeon_device *rdev, u32 mode)
{
	if (mode) {
		/* stop auto-manage */
		if (rdev->pm.dpm.fan.ucode_fan_control)
			ci_fan_ctrl_stop_smc_fan_control(rdev);
		ci_fan_ctrl_set_static_mode(rdev, mode);
	} else {
		/* restart auto-manage */
		if (rdev->pm.dpm.fan.ucode_fan_control)
			ci_thermal_start_smc_fan_control(rdev);
		else
			ci_fan_ctrl_set_default_mode(rdev);
	}
}


u32 ci_fan_ctrl_get_mode(struct radeon_device *rdev)
{
	struct ci_power_info *pi = ci_get_pi(rdev);
	u32 tmp;

	if (pi->fan_is_controlled_by_smc)
		return 0;
		return 0;

	tmp = RREG32_SMC(CG_FDO_CTRL2) & FDO_PWM_MODE_MASK;
	return (tmp >> FDO_PWM_MODE_SHIFT);
}
}


#if 0
static int ci_fan_ctrl_get_fan_speed_rpm(struct radeon_device *rdev,
static int ci_fan_ctrl_get_fan_speed_rpm(struct radeon_device *rdev,
					 u32 *speed)
					 u32 *speed)
{
{
@@ -1698,10 +1731,12 @@ static int ci_set_overdrive_target_tdp(struct radeon_device *rdev,
	return 0;
	return 0;
}
}


#if 0
static int ci_set_boot_state(struct radeon_device *rdev)
static int ci_set_boot_state(struct radeon_device *rdev)
{
{
	return ci_enable_sclk_mclk_dpm(rdev, false);
	return ci_enable_sclk_mclk_dpm(rdev, false);
}
}
#endif


static u32 ci_get_average_sclk_freq(struct radeon_device *rdev)
static u32 ci_get_average_sclk_freq(struct radeon_device *rdev)
{
{
@@ -5343,10 +5378,12 @@ int ci_dpm_set_power_state(struct radeon_device *rdev)
	return 0;
	return 0;
}
}


#if 0
void ci_dpm_reset_asic(struct radeon_device *rdev)
void ci_dpm_reset_asic(struct radeon_device *rdev)
{
{
	ci_set_boot_state(rdev);
	ci_set_boot_state(rdev);
}
}
#endif


void ci_dpm_display_configuration_changed(struct radeon_device *rdev)
void ci_dpm_display_configuration_changed(struct radeon_device *rdev)
{
{
Loading