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

Commit 196c58d2 authored by Alex Deucher's avatar Alex Deucher Committed by Dave Airlie
Browse files

drm/radeon/kms: add support for eDP (embedded DisplayPort)



This is displayport used for internal connections such
as laptop panels and systems with integrated monitors.

Signed-off-by: default avatarAlex Deucher <alexdeucher@gmail.com>
Signed-off-by: default avatarDave Airlie <airlied@redhat.com>
parent 7970e677
Loading
Loading
Loading
Loading
+4 −2
Original line number Diff line number Diff line
@@ -468,7 +468,8 @@ void radeon_dp_set_link_config(struct drm_connector *connector,
	struct radeon_connector *radeon_connector;
	struct radeon_connector_atom_dig *dig_connector;

	if (connector->connector_type != DRM_MODE_CONNECTOR_DisplayPort)
	if ((connector->connector_type != DRM_MODE_CONNECTOR_DisplayPort) ||
	    (connector->connector_type != DRM_MODE_CONNECTOR_eDP))
		return;

	radeon_connector = to_radeon_connector(connector);
@@ -582,7 +583,8 @@ void dp_link_train(struct drm_encoder *encoder,
	u8 train_set[4];
	int i;

	if (connector->connector_type != DRM_MODE_CONNECTOR_DisplayPort)
	if ((connector->connector_type != DRM_MODE_CONNECTOR_DisplayPort) ||
	    (connector->connector_type != DRM_MODE_CONNECTOR_eDP))
		return;

	if (!radeon_encoder->enc_priv)
+3 −1
Original line number Diff line number Diff line
@@ -346,7 +346,9 @@ const int object_connector_convert[] = {
	DRM_MODE_CONNECTOR_Unknown,
	DRM_MODE_CONNECTOR_Unknown,
	DRM_MODE_CONNECTOR_Unknown,
	DRM_MODE_CONNECTOR_DisplayPort
	DRM_MODE_CONNECTOR_DisplayPort,
	DRM_MODE_CONNECTOR_eDP,
	DRM_MODE_CONNECTOR_Unknown
};

bool radeon_get_atom_connector_info_from_object_table(struct drm_device *dev)
+17 −6
Original line number Diff line number Diff line
@@ -49,8 +49,10 @@ void radeon_connector_hotplug(struct drm_connector *connector)
	if (radeon_connector->hpd.hpd != RADEON_HPD_NONE)
		radeon_hpd_set_polarity(rdev, radeon_connector->hpd.hpd);

	if (connector->connector_type == DRM_MODE_CONNECTOR_DisplayPort) {
		if (radeon_dp_getsinktype(radeon_connector) == CONNECTOR_OBJECT_ID_DISPLAYPORT) {
	if ((connector->connector_type == DRM_MODE_CONNECTOR_DisplayPort) ||
	    (connector->connector_type == DRM_MODE_CONNECTOR_eDP)) {
		if ((radeon_dp_getsinktype(radeon_connector) == CONNECTOR_OBJECT_ID_DISPLAYPORT) ||
		    (radeon_dp_getsinktype(radeon_connector) == CONNECTOR_OBJECT_ID_eDP)) {
			if (radeon_dp_needs_link_train(radeon_connector)) {
				if (connector->encoder)
					dp_link_train(connector->encoder, connector);
@@ -967,7 +969,8 @@ static enum drm_connector_status radeon_dp_detect(struct drm_connector *connecto
	}

	sink_type = radeon_dp_getsinktype(radeon_connector);
	if (sink_type == CONNECTOR_OBJECT_ID_DISPLAYPORT) {
	if ((sink_type == CONNECTOR_OBJECT_ID_DISPLAYPORT) ||
	    (sink_type == CONNECTOR_OBJECT_ID_eDP)) {
		if (radeon_dp_getdpcd(radeon_connector)) {
			radeon_dig_connector->dp_sink_type = sink_type;
			ret = connector_status_connected;
@@ -992,7 +995,8 @@ static int radeon_dp_mode_valid(struct drm_connector *connector,

	/* XXX check mode bandwidth */

	if (radeon_dig_connector->dp_sink_type == CONNECTOR_OBJECT_ID_DISPLAYPORT)
	if ((radeon_dig_connector->dp_sink_type == CONNECTOR_OBJECT_ID_DISPLAYPORT) ||
	    (radeon_dig_connector->dp_sink_type == CONNECTOR_OBJECT_ID_eDP))
		return radeon_dp_mode_valid_helper(radeon_connector, mode);
	else
		return MODE_OK;
@@ -1145,6 +1149,7 @@ radeon_add_atom_connector(struct drm_device *dev,
		subpixel_order = SubPixelHorizontalRGB;
		break;
	case DRM_MODE_CONNECTOR_DisplayPort:
	case DRM_MODE_CONNECTOR_eDP:
		radeon_dig_connector = kzalloc(sizeof(struct radeon_connector_atom_dig), GFP_KERNEL);
		if (!radeon_dig_connector)
			goto failed;
@@ -1157,9 +1162,15 @@ radeon_add_atom_connector(struct drm_device *dev,
			goto failed;
		if (i2c_bus->valid) {
			/* add DP i2c bus */
			if (connector_type == DRM_MODE_CONNECTOR_eDP)
				radeon_dig_connector->dp_i2c_bus = radeon_i2c_create_dp(dev, i2c_bus, "eDP-auxch");
			else
				radeon_dig_connector->dp_i2c_bus = radeon_i2c_create_dp(dev, i2c_bus, "DP-auxch");
			if (!radeon_dig_connector->dp_i2c_bus)
				goto failed;
			if (connector_type == DRM_MODE_CONNECTOR_eDP)
				radeon_connector->ddc_bus = radeon_i2c_create(dev, i2c_bus, "eDP");
			else
				radeon_connector->ddc_bus = radeon_i2c_create(dev, i2c_bus, "DP");
			if (!radeon_connector->ddc_bus)
				goto failed;
+5 −2
Original line number Diff line number Diff line
@@ -234,7 +234,7 @@ static const char *encoder_names[34] = {
	"INTERNAL_UNIPHY2",
};

static const char *connector_names[13] = {
static const char *connector_names[15] = {
	"Unknown",
	"VGA",
	"DVI-I",
@@ -248,6 +248,8 @@ static const char *connector_names[13] = {
	"DisplayPort",
	"HDMI-A",
	"HDMI-B",
	"TV",
	"eDP",
};

static const char *hpd_names[7] = {
@@ -352,7 +354,8 @@ int radeon_ddc_get_modes(struct radeon_connector *radeon_connector)
{
	int ret = 0;

	if (radeon_connector->base.connector_type == DRM_MODE_CONNECTOR_DisplayPort) {
	if ((radeon_connector->base.connector_type == DRM_MODE_CONNECTOR_DisplayPort) ||
	    (radeon_connector->base.connector_type == DRM_MODE_CONNECTOR_eDP)) {
		struct radeon_connector_atom_dig *dig = radeon_connector->con_priv;
		if (dig->dp_i2c_bus)
			radeon_connector->edid = drm_get_edid(&radeon_connector->base, &dig->dp_i2c_bus->adapter);
+3 −1
Original line number Diff line number Diff line
@@ -596,8 +596,10 @@ atombios_get_encoder_mode(struct drm_encoder *encoder)
		return ATOM_ENCODER_MODE_LVDS;
		break;
	case DRM_MODE_CONNECTOR_DisplayPort:
	case DRM_MODE_CONNECTOR_eDP:
		radeon_dig_connector = radeon_connector->con_priv;
		if (radeon_dig_connector->dp_sink_type == CONNECTOR_OBJECT_ID_DISPLAYPORT)
		if ((radeon_dig_connector->dp_sink_type == CONNECTOR_OBJECT_ID_DISPLAYPORT) ||
		    (radeon_dig_connector->dp_sink_type == CONNECTOR_OBJECT_ID_eDP))
			return ATOM_ENCODER_MODE_DP;
		else if (drm_detect_hdmi_monitor(radeon_connector->edid))
			return ATOM_ENCODER_MODE_HDMI;