Loading drivers/gpu/drm/nouveau/nvd0_display.c +44 −0 Original line number Diff line number Diff line Loading @@ -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); } /****************************************************************************** Loading Loading
drivers/gpu/drm/nouveau/nvd0_display.c +44 −0 Original line number Diff line number Diff line Loading @@ -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); } /****************************************************************************** Loading