Commit 2c3addd8 authored by Dave Airlie's avatar Dave Airlie

Merge tag 'drm-misc-fixes-2020-01-08' of git://anongit.freedesktop.org/drm/drm-misc into drm-fixes

mst: Fix NO_STOP_BIT bit offset (Wayne)
sun4i: Fix RGB_DIV clock min divider on old hardware (Chen-Yu)
fb_helper: Fix bits_per_pixel param set behavior to round up (Geert)

Cc: Wayne Lin <Wayne.Lin@amd.com>
Cc: Chen-Yu Tsai <wens@csie.org>
Cc: Geert Uytterhoeven <geert+renesas@glider.be>
Signed-off-by: default avatarDave Airlie <airlied@redhat.com>

From: Sean Paul <sean@poorly.run>
Link: https://patchwork.freedesktop.org/patch/msgid/20200108205949.GA233273@art_vandelay
parents c79f46a2 f30e2777
...@@ -393,7 +393,7 @@ drm_dp_encode_sideband_req(const struct drm_dp_sideband_msg_req_body *req, ...@@ -393,7 +393,7 @@ drm_dp_encode_sideband_req(const struct drm_dp_sideband_msg_req_body *req,
memcpy(&buf[idx], req->u.i2c_read.transactions[i].bytes, req->u.i2c_read.transactions[i].num_bytes); memcpy(&buf[idx], req->u.i2c_read.transactions[i].bytes, req->u.i2c_read.transactions[i].num_bytes);
idx += req->u.i2c_read.transactions[i].num_bytes; idx += req->u.i2c_read.transactions[i].num_bytes;
buf[idx] = (req->u.i2c_read.transactions[i].no_stop_bit & 0x1) << 5; buf[idx] = (req->u.i2c_read.transactions[i].no_stop_bit & 0x1) << 4;
buf[idx] |= (req->u.i2c_read.transactions[i].i2c_transaction_delay & 0xf); buf[idx] |= (req->u.i2c_read.transactions[i].i2c_transaction_delay & 0xf);
idx++; idx++;
} }
......
...@@ -1283,7 +1283,7 @@ int drm_fb_helper_check_var(struct fb_var_screeninfo *var, ...@@ -1283,7 +1283,7 @@ int drm_fb_helper_check_var(struct fb_var_screeninfo *var,
* Changes struct fb_var_screeninfo are currently not pushed back * Changes struct fb_var_screeninfo are currently not pushed back
* to KMS, hence fail if different settings are requested. * to KMS, hence fail if different settings are requested.
*/ */
if (var->bits_per_pixel != fb->format->cpp[0] * 8 || if (var->bits_per_pixel > fb->format->cpp[0] * 8 ||
var->xres > fb->width || var->yres > fb->height || var->xres > fb->width || var->yres > fb->height ||
var->xres_virtual > fb->width || var->yres_virtual > fb->height) { var->xres_virtual > fb->width || var->yres_virtual > fb->height) {
DRM_DEBUG("fb requested width/height/bpp can't fit in current fb " DRM_DEBUG("fb requested width/height/bpp can't fit in current fb "
...@@ -1308,6 +1308,11 @@ int drm_fb_helper_check_var(struct fb_var_screeninfo *var, ...@@ -1308,6 +1308,11 @@ int drm_fb_helper_check_var(struct fb_var_screeninfo *var,
drm_fb_helper_fill_pixel_fmt(var, fb->format->depth); drm_fb_helper_fill_pixel_fmt(var, fb->format->depth);
} }
/*
* Likewise, bits_per_pixel should be rounded up to a supported value.
*/
var->bits_per_pixel = fb->format->cpp[0] * 8;
/* /*
* drm fbdev emulation doesn't support changing the pixel format at all, * drm fbdev emulation doesn't support changing the pixel format at all,
* so reject all pixel format changing requests. * so reject all pixel format changing requests.
......
...@@ -489,7 +489,7 @@ static void sun4i_tcon0_mode_set_rgb(struct sun4i_tcon *tcon, ...@@ -489,7 +489,7 @@ static void sun4i_tcon0_mode_set_rgb(struct sun4i_tcon *tcon,
WARN_ON(!tcon->quirks->has_channel_0); WARN_ON(!tcon->quirks->has_channel_0);
tcon->dclk_min_div = 1; tcon->dclk_min_div = tcon->quirks->dclk_min_div;
tcon->dclk_max_div = 127; tcon->dclk_max_div = 127;
sun4i_tcon0_mode_set_common(tcon, mode); sun4i_tcon0_mode_set_common(tcon, mode);
...@@ -1426,12 +1426,14 @@ static int sun8i_r40_tcon_tv_set_mux(struct sun4i_tcon *tcon, ...@@ -1426,12 +1426,14 @@ static int sun8i_r40_tcon_tv_set_mux(struct sun4i_tcon *tcon,
static const struct sun4i_tcon_quirks sun4i_a10_quirks = { static const struct sun4i_tcon_quirks sun4i_a10_quirks = {
.has_channel_0 = true, .has_channel_0 = true,
.has_channel_1 = true, .has_channel_1 = true,
.dclk_min_div = 4,
.set_mux = sun4i_a10_tcon_set_mux, .set_mux = sun4i_a10_tcon_set_mux,
}; };
static const struct sun4i_tcon_quirks sun5i_a13_quirks = { static const struct sun4i_tcon_quirks sun5i_a13_quirks = {
.has_channel_0 = true, .has_channel_0 = true,
.has_channel_1 = true, .has_channel_1 = true,
.dclk_min_div = 4,
.set_mux = sun5i_a13_tcon_set_mux, .set_mux = sun5i_a13_tcon_set_mux,
}; };
...@@ -1440,6 +1442,7 @@ static const struct sun4i_tcon_quirks sun6i_a31_quirks = { ...@@ -1440,6 +1442,7 @@ static const struct sun4i_tcon_quirks sun6i_a31_quirks = {
.has_channel_1 = true, .has_channel_1 = true,
.has_lvds_alt = true, .has_lvds_alt = true,
.needs_de_be_mux = true, .needs_de_be_mux = true,
.dclk_min_div = 1,
.set_mux = sun6i_tcon_set_mux, .set_mux = sun6i_tcon_set_mux,
}; };
...@@ -1447,11 +1450,13 @@ static const struct sun4i_tcon_quirks sun6i_a31s_quirks = { ...@@ -1447,11 +1450,13 @@ static const struct sun4i_tcon_quirks sun6i_a31s_quirks = {
.has_channel_0 = true, .has_channel_0 = true,
.has_channel_1 = true, .has_channel_1 = true,
.needs_de_be_mux = true, .needs_de_be_mux = true,
.dclk_min_div = 1,
}; };
static const struct sun4i_tcon_quirks sun7i_a20_quirks = { static const struct sun4i_tcon_quirks sun7i_a20_quirks = {
.has_channel_0 = true, .has_channel_0 = true,
.has_channel_1 = true, .has_channel_1 = true,
.dclk_min_div = 4,
/* Same display pipeline structure as A10 */ /* Same display pipeline structure as A10 */
.set_mux = sun4i_a10_tcon_set_mux, .set_mux = sun4i_a10_tcon_set_mux,
}; };
...@@ -1459,11 +1464,13 @@ static const struct sun4i_tcon_quirks sun7i_a20_quirks = { ...@@ -1459,11 +1464,13 @@ static const struct sun4i_tcon_quirks sun7i_a20_quirks = {
static const struct sun4i_tcon_quirks sun8i_a33_quirks = { static const struct sun4i_tcon_quirks sun8i_a33_quirks = {
.has_channel_0 = true, .has_channel_0 = true,
.has_lvds_alt = true, .has_lvds_alt = true,
.dclk_min_div = 1,
}; };
static const struct sun4i_tcon_quirks sun8i_a83t_lcd_quirks = { static const struct sun4i_tcon_quirks sun8i_a83t_lcd_quirks = {
.supports_lvds = true, .supports_lvds = true,
.has_channel_0 = true, .has_channel_0 = true,
.dclk_min_div = 1,
}; };
static const struct sun4i_tcon_quirks sun8i_a83t_tv_quirks = { static const struct sun4i_tcon_quirks sun8i_a83t_tv_quirks = {
...@@ -1477,11 +1484,13 @@ static const struct sun4i_tcon_quirks sun8i_r40_tv_quirks = { ...@@ -1477,11 +1484,13 @@ static const struct sun4i_tcon_quirks sun8i_r40_tv_quirks = {
static const struct sun4i_tcon_quirks sun8i_v3s_quirks = { static const struct sun4i_tcon_quirks sun8i_v3s_quirks = {
.has_channel_0 = true, .has_channel_0 = true,
.dclk_min_div = 1,
}; };
static const struct sun4i_tcon_quirks sun9i_a80_tcon_lcd_quirks = { static const struct sun4i_tcon_quirks sun9i_a80_tcon_lcd_quirks = {
.has_channel_0 = true, .has_channel_0 = true,
.needs_edp_reset = true, .needs_edp_reset = true,
.dclk_min_div = 1,
}; };
static const struct sun4i_tcon_quirks sun9i_a80_tcon_tv_quirks = { static const struct sun4i_tcon_quirks sun9i_a80_tcon_tv_quirks = {
......
...@@ -224,6 +224,7 @@ struct sun4i_tcon_quirks { ...@@ -224,6 +224,7 @@ struct sun4i_tcon_quirks {
bool needs_de_be_mux; /* sun6i needs mux to select backend */ bool needs_de_be_mux; /* sun6i needs mux to select backend */
bool needs_edp_reset; /* a80 edp reset needed for tcon0 access */ bool needs_edp_reset; /* a80 edp reset needed for tcon0 access */
bool supports_lvds; /* Does the TCON support an LVDS output? */ bool supports_lvds; /* Does the TCON support an LVDS output? */
u8 dclk_min_div; /* minimum divider for TCON0 DCLK */
/* callback to handle tcon muxing options */ /* callback to handle tcon muxing options */
int (*set_mux)(struct sun4i_tcon *, const struct drm_encoder *); int (*set_mux)(struct sun4i_tcon *, const struct drm_encoder *);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment