mirror of
https://gitlab.freedesktop.org/mesa/drm.git
synced 2026-05-05 06:38:03 +02:00
nv50: some kms fixes
This commit is contained in:
parent
4fec64f166
commit
56887e62e7
4 changed files with 34 additions and 16 deletions
|
|
@ -506,25 +506,39 @@ nv50_crtc_gamma_set(struct drm_crtc *drm_crtc, u16 *r, u16 *g, u16 *b,
|
|||
nv50_crtc_lut_load(crtc);
|
||||
}
|
||||
|
||||
static int
|
||||
nv50_crtc_helper_set_config(struct drm_mode_set *set)
|
||||
{
|
||||
struct drm_nouveau_private *dev_priv = set->crtc->dev->dev_private;
|
||||
int ret;
|
||||
|
||||
dev_priv->in_modeset = true;
|
||||
ret = drm_crtc_helper_set_config(set);
|
||||
dev_priv->in_modeset = false;
|
||||
return ret;
|
||||
}
|
||||
|
||||
static const struct drm_crtc_funcs nv50_crtc_funcs = {
|
||||
.save = NULL,
|
||||
.restore = NULL,
|
||||
.cursor_set = nv50_crtc_cursor_set,
|
||||
.cursor_move = nv50_crtc_cursor_move,
|
||||
.gamma_set = nv50_crtc_gamma_set,
|
||||
.set_config = drm_crtc_helper_set_config,
|
||||
.set_config = nv50_crtc_helper_set_config,
|
||||
.destroy = nv50_crtc_destroy,
|
||||
};
|
||||
|
||||
static void nv50_crtc_dpms(struct drm_crtc *drm_crtc, int mode)
|
||||
{
|
||||
struct drm_nouveau_private *dev_priv = drm_crtc->dev->dev_private;
|
||||
struct nouveau_crtc *crtc = to_nouveau_crtc(drm_crtc);
|
||||
|
||||
if (dev_priv->in_modeset)
|
||||
nv50_crtc_blank(crtc, true);
|
||||
}
|
||||
|
||||
static void nv50_crtc_prepare(struct drm_crtc *drm_crtc)
|
||||
{
|
||||
struct nouveau_crtc *crtc = to_nouveau_crtc(drm_crtc);
|
||||
|
||||
nv50_crtc_blank(crtc, true);
|
||||
}
|
||||
|
||||
static void nv50_crtc_commit(struct drm_crtc *drm_crtc)
|
||||
|
|
|
|||
|
|
@ -121,6 +121,11 @@ static void nv50_dac_dpms(struct drm_encoder *drm_encoder, int mode)
|
|||
|
||||
DRM_DEBUG("or %d\n", or);
|
||||
|
||||
if (dev_priv->in_modeset) {
|
||||
nv50_dac_disconnect(encoder);
|
||||
return;
|
||||
}
|
||||
|
||||
/* wait for it to be done */
|
||||
if (!nv_wait(NV50_PDISPLAY_DAC_REGS_DPMS_CTRL(or),
|
||||
NV50_PDISPLAY_DAC_REGS_DPMS_CTRL_PENDING, 0)) {
|
||||
|
|
@ -211,15 +216,14 @@ static void nv50_dac_mode_set(struct drm_encoder *drm_encoder,
|
|||
mode_ctl |= 0x100;
|
||||
}
|
||||
|
||||
if (mode->flags & DRM_MODE_FLAG_NHSYNC)
|
||||
if (adjusted_mode->flags & DRM_MODE_FLAG_NHSYNC)
|
||||
mode_ctl2 |= NV50_DAC_MODE_CTRL2_NHSYNC;
|
||||
|
||||
if (mode->flags & DRM_MODE_FLAG_NVSYNC)
|
||||
if (adjusted_mode->flags & DRM_MODE_FLAG_NVSYNC)
|
||||
mode_ctl2 |= NV50_DAC_MODE_CTRL2_NVSYNC;
|
||||
|
||||
OUT_MODE(NV50_DAC0_MODE_CTRL + offset, mode_ctl);
|
||||
OUT_MODE(NV50_DAC0_MODE_CTRL2 + offset, mode_ctl2);
|
||||
OUT_MODE(NV50_UPDATE_DISPLAY, 0);
|
||||
}
|
||||
|
||||
static const struct drm_encoder_helper_funcs nv50_dac_helper_funcs = {
|
||||
|
|
|
|||
|
|
@ -80,6 +80,11 @@ static void nv50_sor_dpms(struct drm_encoder *drm_encoder, int mode)
|
|||
|
||||
DRM_DEBUG("or %d\n", encoder->or);
|
||||
|
||||
if (dev_priv->in_modeset) {
|
||||
nv50_sor_disconnect(encoder);
|
||||
return;
|
||||
}
|
||||
|
||||
/* wait for it to be done */
|
||||
if (!nv_wait(NV50_PDISPLAY_SOR_REGS_DPMS_CTRL(or),
|
||||
NV50_PDISPLAY_SOR_REGS_DPMS_CTRL_PENDING, 0)) {
|
||||
|
|
@ -147,15 +152,10 @@ static bool nv50_sor_mode_fixup(struct drm_encoder *drm_encoder,
|
|||
|
||||
static void nv50_sor_prepare(struct drm_encoder *drm_encoder)
|
||||
{
|
||||
struct nouveau_encoder *encoder = to_nouveau_encoder(drm_encoder);
|
||||
|
||||
nv50_sor_dpms(drm_encoder, DRM_MODE_DPMS_OFF);
|
||||
nv50_sor_disconnect(encoder);
|
||||
}
|
||||
|
||||
static void nv50_sor_commit(struct drm_encoder *drm_encoder)
|
||||
{
|
||||
nv50_sor_dpms(drm_encoder, DRM_MODE_DPMS_ON);
|
||||
}
|
||||
|
||||
static void nv50_sor_mode_set(struct drm_encoder *drm_encoder,
|
||||
|
|
@ -174,7 +174,7 @@ static void nv50_sor_mode_set(struct drm_encoder *drm_encoder,
|
|||
mode_ctl |= NV50_SOR_MODE_CTRL_LVDS;
|
||||
} else {
|
||||
mode_ctl |= NV50_SOR_MODE_CTRL_TMDS;
|
||||
if (mode->clock > 165000)
|
||||
if (adjusted_mode->clock > 165000)
|
||||
mode_ctl |= NV50_SOR_MODE_CTRL_TMDS_DUAL_LINK;
|
||||
}
|
||||
|
||||
|
|
@ -183,14 +183,13 @@ static void nv50_sor_mode_set(struct drm_encoder *drm_encoder,
|
|||
else
|
||||
mode_ctl |= NV50_SOR_MODE_CTRL_CRTC0;
|
||||
|
||||
if (mode->flags & DRM_MODE_FLAG_NHSYNC)
|
||||
if (adjusted_mode->flags & DRM_MODE_FLAG_NHSYNC)
|
||||
mode_ctl |= NV50_SOR_MODE_CTRL_NHSYNC;
|
||||
|
||||
if (mode->flags & DRM_MODE_FLAG_NVSYNC)
|
||||
if (adjusted_mode->flags & DRM_MODE_FLAG_NVSYNC)
|
||||
mode_ctl |= NV50_SOR_MODE_CTRL_NVSYNC;
|
||||
|
||||
OUT_MODE(NV50_SOR0_MODE_CTRL + offset, mode_ctl);
|
||||
OUT_MODE(NV50_UPDATE_DISPLAY, 0);
|
||||
}
|
||||
|
||||
static const struct drm_encoder_helper_funcs nv50_sor_helper_funcs = {
|
||||
|
|
|
|||
|
|
@ -347,6 +347,7 @@ struct drm_nouveau_private {
|
|||
struct list_head gpuobj_list;
|
||||
|
||||
void *display_priv; /* internal modesetting */
|
||||
bool in_modeset;
|
||||
|
||||
struct bios bios;
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue