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

Commit 64d9cc04 authored by Ben Skeggs's avatar Ben Skeggs
Browse files

drm/nvd0/disp: enable hdmi on sor if hdmi monitor present



Signed-off-by: default avatarBen Skeggs <bskeggs@redhat.com>
parent 78951d22
Loading
Loading
Loading
Loading
+44 −0
Original line number Diff line number Diff line
@@ -811,13 +811,57 @@ nvd0_audio_disconnect(struct drm_encoder *encoder)
static void
nvd0_hdmi_mode_set(struct drm_encoder *encoder, struct drm_display_mode *mode)
{
	struct nouveau_encoder *nv_encoder = nouveau_encoder(encoder);
	struct nouveau_crtc *nv_crtc = nouveau_crtc(encoder->crtc);
	struct nouveau_connector *nv_connector;
	struct drm_device *dev = encoder->dev;
	int head = nv_crtc->index * 0x800;
	u32 rekey = 56; /* binary driver, and tegra constant */
	u32 max_ac_packet;

	nv_connector = nouveau_encoder_connector_get(nv_encoder);
	if (!drm_detect_hdmi_monitor(nv_connector->edid))
		return;

	max_ac_packet  = mode->htotal - mode->hdisplay;
	max_ac_packet -= rekey;
	max_ac_packet -= 18; /* constant from tegra */
	max_ac_packet /= 32;

	/* AVI InfoFrame */
	nv_mask(dev, 0x616714 + head, 0x00000001, 0x00000000);
	nv_wr32(dev, 0x61671c + head, 0x000d0282);
	nv_wr32(dev, 0x616720 + head, 0x0000006f);
	nv_wr32(dev, 0x616724 + head, 0x00000000);
	nv_wr32(dev, 0x616728 + head, 0x00000000);
	nv_wr32(dev, 0x61672c + head, 0x00000000);
	nv_mask(dev, 0x616714 + head, 0x00000001, 0x00000001);

	/* ??? InfoFrame? */
	nv_mask(dev, 0x6167a4 + head, 0x00000001, 0x00000000);
	nv_wr32(dev, 0x6167ac + head, 0x00000010);
	nv_mask(dev, 0x6167a4 + head, 0x00000001, 0x00000001);

	/* HDMI_CTRL */
	nv_mask(dev, 0x616798 + head, 0x401f007f, 0x40000000 | rekey |
						  max_ac_packet << 16);

	nvd0_audio_mode_set(encoder, mode);
}

static void
nvd0_hdmi_disconnect(struct drm_encoder *encoder)
{
	struct nouveau_encoder *nv_encoder = nouveau_encoder(encoder);
	struct nouveau_crtc *nv_crtc = nouveau_crtc(nv_encoder->crtc);
	struct drm_device *dev = encoder->dev;
	int head = nv_crtc->index * 0x800;

	nvd0_audio_disconnect(encoder);

	nv_mask(dev, 0x616798 + head, 0x40000000, 0x00000000);
	nv_mask(dev, 0x6167a4 + head, 0x00000001, 0x00000000);
	nv_mask(dev, 0x616714 + head, 0x00000001, 0x00000000);
}

/******************************************************************************