Francisco Jerez
2009-Aug-17 14:58 UTC
[Nouveau] [PATCH 1/6] drm/i2c/ch7006: Fix some sparse warnings.
---
drivers/gpu/drm/i2c/ch7006_drv.c | 2 +-
drivers/gpu/drm/i2c/ch7006_mode.c | 2 +-
drivers/gpu/drm/i2c/ch7006_priv.h | 5 ++---
3 files changed, 4 insertions(+), 5 deletions(-)
diff --git a/drivers/gpu/drm/i2c/ch7006_drv.c b/drivers/gpu/drm/i2c/ch7006_drv.c
index c2594a1..7df4b86 100644
--- a/drivers/gpu/drm/i2c/ch7006_drv.c
+++ b/drivers/gpu/drm/i2c/ch7006_drv.c
@@ -351,7 +351,7 @@ static int ch7006_encoder_set_property(struct drm_encoder
*encoder,
return 0;
}
-struct drm_encoder_slave_funcs ch7006_encoder_funcs = {
+static struct drm_encoder_slave_funcs ch7006_encoder_funcs = {
.set_config = ch7006_encoder_set_config,
.destroy = ch7006_encoder_destroy,
.dpms = ch7006_encoder_dpms,
diff --git a/drivers/gpu/drm/i2c/ch7006_mode.c
b/drivers/gpu/drm/i2c/ch7006_mode.c
index e8f6db3..7ffe0bd 100644
--- a/drivers/gpu/drm/i2c/ch7006_mode.c
+++ b/drivers/gpu/drm/i2c/ch7006_mode.c
@@ -330,7 +330,7 @@ void ch7006_setup_properties(struct drm_encoder *encoder)
struct drm_display_mode *mode = &ch_mode->mode;
uint8_t *regs = state->regs;
int flicker, contrast, hpos, vpos;
- fixed scale, aspect;
+ uint64_t scale, aspect;
flicker = interpolate(0, 2, 3, priv->flicker);
regs[CH7006_FFILTER] = bitf(CH7006_FFILTER_TEXT, flicker) |
diff --git a/drivers/gpu/drm/i2c/ch7006_priv.h
b/drivers/gpu/drm/i2c/ch7006_priv.h
index 608ddab..7ebb073 100644
--- a/drivers/gpu/drm/i2c/ch7006_priv.h
+++ b/drivers/gpu/drm/i2c/ch7006_priv.h
@@ -141,9 +141,8 @@ void ch7006_state_save(struct i2c_client *client,
#define bitf(bitfield, x) __bitf(bitfield, x)
#define bitfs(bitfield, s) __bitf(bitfield, bitfield##_##s)
#define setbitf(state, reg, bitfield, x) \
- state->regs[reg] = (state->regs[reg] & \
- (typeof(*state->regs)) ~mask(reg##_##bitfield)) | \
- bitf(reg##_##bitfield, x)
+ state->regs[reg] = (state->regs[reg] & ~mask(reg##_##bitfield)) \
+ | bitf(reg##_##bitfield, x)
#define __unbitf(src, bitfield, x) ((x & __mask(src, bitfield)) \
>> (0?bitfield) << (src))
--
1.6.3.3
Francisco Jerez
2009-Aug-17 14:58 UTC
[Nouveau] [PATCH 2/6] drm/nouveau: Fix some sparse warnings in the TV-out code.
---
drivers/gpu/drm/nouveau/nv17_tv_modes.c | 9 ++++-----
1 files changed, 4 insertions(+), 5 deletions(-)
diff --git a/drivers/gpu/drm/nouveau/nv17_tv_modes.c
b/drivers/gpu/drm/nouveau/nv17_tv_modes.c
index 17adb8d..85f55b3 100644
--- a/drivers/gpu/drm/nouveau/nv17_tv_modes.c
+++ b/drivers/gpu/drm/nouveau/nv17_tv_modes.c
@@ -322,16 +322,15 @@ static void tv_setup_filter(struct drm_encoder *encoder)
&tv_enc->state.vfilter};
int i, j, k;
int32_t overscan = calc_overscan(tv_enc->overscan);
- int64_t flicker = (tv_enc->flicker - 50) * id3;
- int64_t rs[] = {mode->hdisplay * id3,
- mode->vdisplay * id3};
+ int64_t flicker = (tv_enc->flicker - 50) * (id3 / 100);
+ uint64_t rs[] = {mode->hdisplay * id3,
+ mode->vdisplay * id3};
- do_div(flicker, 100);
do_div(rs[0], overscan * tv_norm->tv_enc_mode.hdisplay);
do_div(rs[1], overscan * tv_norm->tv_enc_mode.vdisplay);
for (k = 0; k < 2; k++) {
- rs[k] = max(rs[k], id2);
+ rs[k] = max((int64_t)rs[k], id2);
for (j = 0; j < 4; j++) {
struct filter_params *p = &fparams[k][j];
--
1.6.3.3
Francisco Jerez
2009-Aug-17 14:58 UTC
[Nouveau] [PATCH 3/6] drm/nouveau: Don't initialize two CRTCs on single head cards.
---
drivers/gpu/drm/nouveau/nv04_display.c | 5 +++--
1 files changed, 3 insertions(+), 2 deletions(-)
diff --git a/drivers/gpu/drm/nouveau/nv04_display.c
b/drivers/gpu/drm/nouveau/nv04_display.c
index ed16e8d..b20ab01 100644
--- a/drivers/gpu/drm/nouveau/nv04_display.c
+++ b/drivers/gpu/drm/nouveau/nv04_display.c
@@ -125,8 +125,9 @@ nv04_display_create(struct drm_device *dev)
dev->mode_config.fb_base = dev_priv->fb_phys;
- for (i = 0; i < 2; i++)
- nv04_crtc_create(dev, i);
+ nv04_crtc_create(dev, 0);
+ if (nv_two_heads(dev))
+ nv04_crtc_create(dev, 1);
for (i = 0; i < dcb->entries; i++) {
struct dcb_entry *dcbent = &dcb->entry[i];
--
1.6.3.3
Francisco Jerez
2009-Aug-17 14:58 UTC
[Nouveau] [PATCH 4/6] drm/nouveau: Fix some bandwidth problems on nv11 with TV and VGA enabled.
The VGA output was showing some flashing pixels when TV was enabled
and the pixel clock was high enough.
---
drivers/gpu/drm/nouveau/nouveau_calc.c | 10 +++++++---
1 files changed, 7 insertions(+), 3 deletions(-)
diff --git a/drivers/gpu/drm/nouveau/nouveau_calc.c
b/drivers/gpu/drm/nouveau/nouveau_calc.c
index e2b78d2..3f80db8 100644
--- a/drivers/gpu/drm/nouveau/nouveau_calc.c
+++ b/drivers/gpu/drm/nouveau/nouveau_calc.c
@@ -174,7 +174,7 @@ nv10CalcArbitration(struct nv_fifo_info *fifo, struct
nv_sim_state *arb)
int us_m, us_m_min, us_n, us_p, crtc_drain_rate;
int vus_m;
int vpm_us, us_video, cpm_us, us_crt, clwm;
- int clwm_rnd_down;
+ int clwm_rnd_down, min_clwm;
int m2us, us_pipe_min, p1clk, p2;
int min_mclk_extra;
int us_min_mclk_extra;
@@ -323,8 +323,12 @@ nv10CalcArbitration(struct nv_fifo_info *fifo, struct
nv_sim_state *arb)
min_mclk_extra--;
}
- if (clwm < (1024 - cbs + 8))
- clwm = 1024 - cbs + 8;
+ /* This correction works around a slight snow effect
+ * when the TV and VGA outputs are enabled simultaneously. */
+ min_clwm = 1024 - cbs + 128 * pclk_freq / 100000;
+ if (clwm < min_clwm)
+ clwm = min_clwm;
+
/* printf("CRT LWM: prog: 0x%x, bs: 256\n", clwm); */
fifo->graphics_lwm = clwm;
fifo->graphics_burst_size = cbs;
--
1.6.3.3
Francisco Jerez
2009-Aug-17 14:58 UTC
[Nouveau] [PATCH 5/6] drm/nouveau: Reject TV norm changes when there is a mode set.
---
drivers/gpu/drm/nouveau/nv17_tv.c | 22 +++++++++++++++++++++-
1 files changed, 21 insertions(+), 1 deletions(-)
diff --git a/drivers/gpu/drm/nouveau/nv17_tv.c
b/drivers/gpu/drm/nouveau/nv17_tv.c
index fdc28b1..9d8e678 100644
--- a/drivers/gpu/drm/nouveau/nv17_tv.c
+++ b/drivers/gpu/drm/nouveau/nv17_tv.c
@@ -508,8 +508,10 @@ static int nv17_tv_set_property(struct drm_encoder
*encoder,
uint64_t val)
{
struct drm_mode_config *conf = &encoder->dev->mode_config;
+ struct drm_crtc *crtc = encoder->crtc;
struct nv17_tv_encoder *tv_enc = to_tv_enc(encoder);
struct nv17_tv_norm_params *tv_norm = get_tv_norm(encoder);
+ bool modes_changed = false;
if (property == conf->tv_overscan_property) {
tv_enc->overscan = val;
@@ -543,8 +545,12 @@ static int nv17_tv_set_property(struct drm_encoder
*encoder,
nv17_tv_update_rescaler(encoder);
} else if (property == conf->tv_mode_property) {
+ if (connector->dpms != DRM_MODE_DPMS_OFF)
+ return -EINVAL;
+
tv_enc->tv_norm = val;
- drm_helper_probe_single_connector_modes(connector, 0, 0);
+
+ modes_changed = true;
} else if (property == conf->tv_select_subconnector_property) {
if (tv_norm->kind != TV_ENC_MODE)
@@ -557,6 +563,20 @@ static int nv17_tv_set_property(struct drm_encoder
*encoder,
return -EINVAL;
}
+ if (modes_changed) {
+ drm_helper_probe_single_connector_modes(connector, 0, 0);
+
+ /* Disable the crtc to ensure a full modeset is
+ * performed whenever it's turned on again. */
+ if (crtc) {
+ struct drm_mode_set modeset = {
+ .crtc = crtc,
+ };
+
+ crtc->funcs->set_config(&modeset);
+ }
+ }
+
return 0;
}
--
1.6.3.3
Francisco Jerez
2009-Aug-17 14:58 UTC
[Nouveau] [PATCH 6/6] drm/i2c/ch7006: Reject TV norm changes when there is a mode set.
---
drivers/gpu/drm/i2c/ch7006_drv.c | 26 ++++++++++++++++++++++++--
1 files changed, 24 insertions(+), 2 deletions(-)
diff --git a/drivers/gpu/drm/i2c/ch7006_drv.c b/drivers/gpu/drm/i2c/ch7006_drv.c
index 7df4b86..a890652 100644
--- a/drivers/gpu/drm/i2c/ch7006_drv.c
+++ b/drivers/gpu/drm/i2c/ch7006_drv.c
@@ -287,6 +287,8 @@ static int ch7006_encoder_set_property(struct drm_encoder
*encoder,
struct ch7006_priv *priv = to_ch7006_priv(encoder);
struct ch7006_state *state = &priv->state;
struct drm_mode_config *conf = &encoder->dev->mode_config;
+ struct drm_crtc *crtc = encoder->crtc;
+ bool modes_changed = false;
ch7006_dbg(client, "\n");
@@ -314,9 +316,12 @@ static int ch7006_encoder_set_property(struct drm_encoder
*encoder,
ch7006_load_reg(client, state, CH7006_VPOS);
} else if (property == conf->tv_mode_property) {
+ if (connector->dpms != DRM_MODE_DPMS_OFF)
+ return -EINVAL;
+
priv->norm = val;
- drm_helper_probe_single_connector_modes(connector, 0, 0);
+ modes_changed = true;
} else if (property == conf->tv_brightness_property) {
priv->brightness = val;
@@ -340,14 +345,31 @@ static int ch7006_encoder_set_property(struct drm_encoder
*encoder,
ch7006_load_reg(client, state, CH7006_FFILTER);
} else if (property == priv->scale_property) {
+ if (connector->dpms != DRM_MODE_DPMS_OFF)
+ return -EINVAL;
+
priv->scale = val;
- drm_helper_probe_single_connector_modes(connector, 0, 0);
+ modes_changed = true;
} else {
return -EINVAL;
}
+ if (modes_changed) {
+ drm_helper_probe_single_connector_modes(connector, 0, 0);
+
+ /* Disable the crtc to ensure a full modeset is
+ * performed whenever it's turned on again. */
+ if (crtc) {
+ struct drm_mode_set modeset = {
+ .crtc = crtc,
+ };
+
+ crtc->funcs->set_config(&modeset);
+ }
+ }
+
return 0;
}
--
1.6.3.3
Apparently Analagous Threads
- [PATCHv2 1/6] drm/i2c/ch7006: Fix some sparse warnings.
- [PATCH 1/3] drm/nouveau: Update the CRTC arbitration parameters on FB depth switch.
- [PATCH 00/12] TV-out modesetting kernel patches.
- [PATCHv2 01/10] drm/nouveau: Fix a lock up at NVSetOwner with nv11.
- [PATCH 1/2] drm/i2c/ch7006: Make some parameter descriptions more useful.