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

Commit 8c2a6d73 authored by Alex Deucher's avatar Alex Deucher Committed by Dave Airlie
Browse files

drm/radeon/kms: move active_device setup into encoder fixup()



radeon_encoder->active_device defines the active routing
between the encoder and connector.  The encoder fixup and
dpms functions need to know the active_device to function
properly.  Setting active_device in the prepare hook was
too late in some cases.

Signed-off-by: default avatarAlex Deucher <alexdeucher@gmail.com>
Signed-off-by: default avatarDave Airlie <airlied@redhat.com>
parent fb06ca8f
Loading
Loading
Loading
Loading
+6 −13
Original line number Original line Diff line number Diff line
@@ -194,6 +194,8 @@ static bool radeon_atom_mode_fixup(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;


	/* set the active encoder to connector routing */
	radeon_encoder_set_active_device(encoder);
	drm_mode_set_crtcinfo(adjusted_mode, 0);
	drm_mode_set_crtcinfo(adjusted_mode, 0);


	if (radeon_encoder->rmx_type != RMX_OFF)
	if (radeon_encoder->rmx_type != RMX_OFF)
@@ -860,16 +862,9 @@ radeon_atom_encoder_dpms(struct drm_encoder *encoder, int mode)
	DISPLAY_DEVICE_OUTPUT_CONTROL_PS_ALLOCATION args;
	DISPLAY_DEVICE_OUTPUT_CONTROL_PS_ALLOCATION args;
	int index = 0;
	int index = 0;
	bool is_dig = false;
	bool is_dig = false;
	int devices;


	memset(&args, 0, sizeof(args));
	memset(&args, 0, sizeof(args));


	/* on DPMS off we have no idea if active device is meaningful */
	if (mode != DRM_MODE_DPMS_ON && !radeon_encoder->active_device)
		devices = radeon_encoder->devices;
	else
		devices = radeon_encoder->active_device;

	DRM_DEBUG("encoder dpms %d to mode %d, devices %08x, active_devices %08x\n",
	DRM_DEBUG("encoder dpms %d to mode %d, devices %08x, active_devices %08x\n",
		  radeon_encoder->encoder_id, mode, radeon_encoder->devices,
		  radeon_encoder->encoder_id, mode, radeon_encoder->devices,
		  radeon_encoder->active_device);
		  radeon_encoder->active_device);
@@ -900,18 +895,18 @@ radeon_atom_encoder_dpms(struct drm_encoder *encoder, int mode)
		break;
		break;
	case ENCODER_OBJECT_ID_INTERNAL_DAC1:
	case ENCODER_OBJECT_ID_INTERNAL_DAC1:
	case ENCODER_OBJECT_ID_INTERNAL_KLDSCP_DAC1:
	case ENCODER_OBJECT_ID_INTERNAL_KLDSCP_DAC1:
		if (devices & (ATOM_DEVICE_TV_SUPPORT))
		if (radeon_encoder->active_device & (ATOM_DEVICE_TV_SUPPORT))
			index = GetIndexIntoMasterTable(COMMAND, TV1OutputControl);
			index = GetIndexIntoMasterTable(COMMAND, TV1OutputControl);
		else if (devices & (ATOM_DEVICE_CV_SUPPORT))
		else if (radeon_encoder->active_device & (ATOM_DEVICE_CV_SUPPORT))
			index = GetIndexIntoMasterTable(COMMAND, CV1OutputControl);
			index = GetIndexIntoMasterTable(COMMAND, CV1OutputControl);
		else
		else
			index = GetIndexIntoMasterTable(COMMAND, DAC1OutputControl);
			index = GetIndexIntoMasterTable(COMMAND, DAC1OutputControl);
		break;
		break;
	case ENCODER_OBJECT_ID_INTERNAL_DAC2:
	case ENCODER_OBJECT_ID_INTERNAL_DAC2:
	case ENCODER_OBJECT_ID_INTERNAL_KLDSCP_DAC2:
	case ENCODER_OBJECT_ID_INTERNAL_KLDSCP_DAC2:
		if (devices & (ATOM_DEVICE_TV_SUPPORT))
		if (radeon_encoder->active_device & (ATOM_DEVICE_TV_SUPPORT))
			index = GetIndexIntoMasterTable(COMMAND, TV1OutputControl);
			index = GetIndexIntoMasterTable(COMMAND, TV1OutputControl);
		else if (devices & (ATOM_DEVICE_CV_SUPPORT))
		else if (radeon_encoder->active_device & (ATOM_DEVICE_CV_SUPPORT))
			index = GetIndexIntoMasterTable(COMMAND, CV1OutputControl);
			index = GetIndexIntoMasterTable(COMMAND, CV1OutputControl);
		else
		else
			index = GetIndexIntoMasterTable(COMMAND, DAC2OutputControl);
			index = GetIndexIntoMasterTable(COMMAND, DAC2OutputControl);
@@ -1254,8 +1249,6 @@ static void radeon_atom_encoder_prepare(struct drm_encoder *encoder)
{
{
	radeon_atom_output_lock(encoder, true);
	radeon_atom_output_lock(encoder, true);
	radeon_atom_encoder_dpms(encoder, DRM_MODE_DPMS_OFF);
	radeon_atom_encoder_dpms(encoder, DRM_MODE_DPMS_OFF);

	radeon_encoder_set_active_device(encoder);
}
}


static void radeon_atom_encoder_commit(struct drm_encoder *encoder)
static void radeon_atom_encoder_commit(struct drm_encoder *encoder)
+8 −9
Original line number Original line Diff line number Diff line
@@ -107,8 +107,6 @@ static void radeon_legacy_lvds_prepare(struct drm_encoder *encoder)
	else
	else
		radeon_combios_output_lock(encoder, true);
		radeon_combios_output_lock(encoder, true);
	radeon_legacy_lvds_dpms(encoder, DRM_MODE_DPMS_OFF);
	radeon_legacy_lvds_dpms(encoder, DRM_MODE_DPMS_OFF);

	radeon_encoder_set_active_device(encoder);
}
}


static void radeon_legacy_lvds_commit(struct drm_encoder *encoder)
static void radeon_legacy_lvds_commit(struct drm_encoder *encoder)
@@ -192,6 +190,8 @@ static bool radeon_legacy_lvds_mode_fixup(struct drm_encoder *encoder,
{
{
	struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder);
	struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder);


	/* set the active encoder to connector routing */
	radeon_encoder_set_active_device(encoder);
	drm_mode_set_crtcinfo(adjusted_mode, 0);
	drm_mode_set_crtcinfo(adjusted_mode, 0);


	if (radeon_encoder->rmx_type != RMX_OFF)
	if (radeon_encoder->rmx_type != RMX_OFF)
@@ -218,7 +218,8 @@ static bool radeon_legacy_primary_dac_mode_fixup(struct drm_encoder *encoder,
						 struct drm_display_mode *mode,
						 struct drm_display_mode *mode,
						 struct drm_display_mode *adjusted_mode)
						 struct drm_display_mode *adjusted_mode)
{
{

	/* set the active encoder to connector routing */
	radeon_encoder_set_active_device(encoder);
	drm_mode_set_crtcinfo(adjusted_mode, 0);
	drm_mode_set_crtcinfo(adjusted_mode, 0);


	return true;
	return true;
@@ -272,7 +273,6 @@ static void radeon_legacy_primary_dac_prepare(struct drm_encoder *encoder)
	else
	else
		radeon_combios_output_lock(encoder, true);
		radeon_combios_output_lock(encoder, true);
	radeon_legacy_primary_dac_dpms(encoder, DRM_MODE_DPMS_OFF);
	radeon_legacy_primary_dac_dpms(encoder, DRM_MODE_DPMS_OFF);
	radeon_encoder_set_active_device(encoder);
}
}


static void radeon_legacy_primary_dac_commit(struct drm_encoder *encoder)
static void radeon_legacy_primary_dac_commit(struct drm_encoder *encoder)
@@ -468,7 +468,6 @@ static void radeon_legacy_tmds_int_prepare(struct drm_encoder *encoder)
	else
	else
		radeon_combios_output_lock(encoder, true);
		radeon_combios_output_lock(encoder, true);
	radeon_legacy_tmds_int_dpms(encoder, DRM_MODE_DPMS_OFF);
	radeon_legacy_tmds_int_dpms(encoder, DRM_MODE_DPMS_OFF);
	radeon_encoder_set_active_device(encoder);
}
}


static void radeon_legacy_tmds_int_commit(struct drm_encoder *encoder)
static void radeon_legacy_tmds_int_commit(struct drm_encoder *encoder)
@@ -593,7 +592,8 @@ static bool radeon_legacy_tmds_ext_mode_fixup(struct drm_encoder *encoder,
					      struct drm_display_mode *mode,
					      struct drm_display_mode *mode,
					      struct drm_display_mode *adjusted_mode)
					      struct drm_display_mode *adjusted_mode)
{
{

	/* set the active encoder to connector routing */
	radeon_encoder_set_active_device(encoder);
	drm_mode_set_crtcinfo(adjusted_mode, 0);
	drm_mode_set_crtcinfo(adjusted_mode, 0);


	return true;
	return true;
@@ -636,7 +636,6 @@ static void radeon_legacy_tmds_ext_prepare(struct drm_encoder *encoder)
	else
	else
		radeon_combios_output_lock(encoder, true);
		radeon_combios_output_lock(encoder, true);
	radeon_legacy_tmds_ext_dpms(encoder, DRM_MODE_DPMS_OFF);
	radeon_legacy_tmds_ext_dpms(encoder, DRM_MODE_DPMS_OFF);
	radeon_encoder_set_active_device(encoder);
}
}


static void radeon_legacy_tmds_ext_commit(struct drm_encoder *encoder)
static void radeon_legacy_tmds_ext_commit(struct drm_encoder *encoder)
@@ -735,7 +734,8 @@ static bool radeon_legacy_tv_dac_mode_fixup(struct drm_encoder *encoder,
					    struct drm_display_mode *mode,
					    struct drm_display_mode *mode,
					    struct drm_display_mode *adjusted_mode)
					    struct drm_display_mode *adjusted_mode)
{
{

	/* set the active encoder to connector routing */
	radeon_encoder_set_active_device(encoder);
	drm_mode_set_crtcinfo(adjusted_mode, 0);
	drm_mode_set_crtcinfo(adjusted_mode, 0);


	return true;
	return true;
@@ -839,7 +839,6 @@ static void radeon_legacy_tv_dac_prepare(struct drm_encoder *encoder)
	else
	else
		radeon_combios_output_lock(encoder, true);
		radeon_combios_output_lock(encoder, true);
	radeon_legacy_tv_dac_dpms(encoder, DRM_MODE_DPMS_OFF);
	radeon_legacy_tv_dac_dpms(encoder, DRM_MODE_DPMS_OFF);
	radeon_encoder_set_active_device(encoder);
}
}


static void radeon_legacy_tv_dac_commit(struct drm_encoder *encoder)
static void radeon_legacy_tv_dac_commit(struct drm_encoder *encoder)