if (!ret)
return -EINVAL;
} else {
- ret = nv_crtc->set_scale(nv_crtc, value, true);
+ ret = nv_crtc->set_scale(nv_crtc, true);
if (ret)
return ret;
}
if (!nv_crtc || !nv_crtc->set_scale)
return 0;
- return nv_crtc->set_scale(nv_crtc,
- nv_connector->scaling_mode,
- true);
+ return nv_crtc->set_scale(nv_crtc, true);
}
return 0;
if (!nv_crtc || !nv_crtc->set_scale)
return 0;
- return nv_crtc->set_scale(nv_crtc,
- nv_connector->scaling_mode,
- true);
+ return nv_crtc->set_scale(nv_crtc, true);
}
return 0;
if (!nv_crtc || !nv_crtc->set_scale)
return 0;
- return nv_crtc->set_scale(nv_crtc,
- nv_connector->scaling_mode,
- true);
+ return nv_crtc->set_scale(nv_crtc, true);
}
return 0;
if (!nv_crtc || !nv_crtc->set_dither)
return 0;
- return nv_crtc->set_dither(nv_crtc, nv_connector->use_dithering,
- true);
+ return nv_crtc->set_dither(nv_crtc, true);
}
if (nv_encoder && nv_encoder->dcb->type == OUTPUT_TV)
int depth;
} lut;
- int (*set_dither)(struct nouveau_crtc *crtc, bool on, bool update);
- int (*set_scale)(struct nouveau_crtc *crtc, int mode, bool update);
+ int (*set_dither)(struct nouveau_crtc *crtc, bool update);
+ int (*set_scale)(struct nouveau_crtc *crtc, bool update);
};
static inline struct nouveau_crtc *nouveau_crtc(struct drm_crtc *crtc)
}
static int
-nv50_crtc_set_dither(struct nouveau_crtc *nv_crtc, bool on, bool update)
+nv50_crtc_set_dither(struct nouveau_crtc *nv_crtc, bool update)
{
struct drm_device *dev = nv_crtc->base.dev;
struct nouveau_channel *evo = nv50_display(dev)->master;
+ struct nouveau_connector *nv_connector =
+ nouveau_crtc_connector_get(nv_crtc);
int ret;
NV_DEBUG_KMS(dev, "\n");
}
BEGIN_RING(evo, 0, NV50_EVO_CRTC(nv_crtc->index, DITHER_CTRL), 1);
- if (on)
+ if (nv_connector->use_dithering)
OUT_RING(evo, NV50_EVO_CRTC_DITHER_CTRL_ON);
else
OUT_RING(evo, NV50_EVO_CRTC_DITHER_CTRL_OFF);
}
static int
-nv50_crtc_set_scale(struct nouveau_crtc *nv_crtc, int scaling_mode, bool update)
+nv50_crtc_set_scale(struct nouveau_crtc *nv_crtc, bool update)
{
struct nouveau_connector *nv_connector;
struct drm_crtc *crtc = &nv_crtc->base;
struct drm_device *dev = crtc->dev;
struct nouveau_channel *evo = nv50_display(dev)->master;
struct drm_display_mode *mode = &crtc->mode;
+ int scaling_mode, ret;
u32 ctrl = 0, oX, oY;
- int ret;
NV_DEBUG_KMS(dev, "\n");
if (!nv_connector || !nv_connector->native_mode) {
NV_ERROR(dev, "no native mode, forcing panel scaling\n");
scaling_mode = DRM_MODE_SCALE_NONE;
+ } else {
+ scaling_mode = nv_connector->scaling_mode;
}
/* start off at the resolution we programmed the crtc for, this
BEGIN_RING(evo, 0, NV50_EVO_CRTC(nv_crtc->index, SCALE_CENTER_OFFSET), 1);
OUT_RING(evo, NV50_EVO_CRTC_SCALE_CENTER_OFFSET_VAL(0, 0));
- nv_crtc->set_dither(nv_crtc, nv_connector->use_dithering, false);
- nv_crtc->set_scale(nv_crtc, nv_connector->scaling_mode, false);
+ nv_crtc->set_dither(nv_crtc, false);
+ nv_crtc->set_scale(nv_crtc, false);
return nv50_crtc_do_mode_set_base(crtc, old_fb, x, y, false);
}
* CRTC
*****************************************************************************/
static int
-nvd0_crtc_set_dither(struct nouveau_crtc *nv_crtc, bool on, bool update)
+nvd0_crtc_set_dither(struct nouveau_crtc *nv_crtc, bool update)
{
+ struct nouveau_connector *nv_connector;
struct drm_device *dev = nv_crtc->base.dev;
- u32 *push, mode;
+ u32 *push, mode = 0;
- mode = 0x00000000;
- if (on) {
+ nv_connector = nouveau_crtc_connector_get(nv_crtc);
+ if (nv_connector->use_dithering) {
/* 0x11: 6bpc dynamic 2x2
* 0x13: 8bpc dynamic 2x2
* 0x19: 6bpc static 2x2
}
static int
-nvd0_crtc_set_scale(struct nouveau_crtc *nv_crtc, int type, bool update)
+nvd0_crtc_set_scale(struct nouveau_crtc *nv_crtc, bool update)
{
struct drm_display_mode *mode = &nv_crtc->base.mode;
struct drm_device *dev = nv_crtc->base.dev;
u32 xratio = (native->hdisplay << 19) / mode->hdisplay;
u32 yratio = (native->vdisplay << 19) / mode->vdisplay;
- switch (type) {
+ switch (nv_connector->scaling_mode) {
case DRM_MODE_SCALE_ASPECT:
if (xratio > yratio) {
outX = (mode->hdisplay * yratio) >> 19;
}
nv_connector = nouveau_crtc_connector_get(nv_crtc);
- nvd0_crtc_set_dither(nv_crtc, nv_connector->use_dithering, false);
- nvd0_crtc_set_scale(nv_crtc, nv_connector->scaling_mode, false);
+ nvd0_crtc_set_dither(nv_crtc, false);
+ nvd0_crtc_set_scale(nv_crtc, false);
nvd0_crtc_set_image(nv_crtc, crtc->fb, x, y, false);
return 0;
}