Commit a4a2739b authored by Dave Airlie's avatar Dave Airlie

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

 * drm: fix possible use-after-free
 * dbi: fix SPI Type 1 transfer
 * drm_fb_helper: use memcpy_io on bochs' sparc64
 * mcde: fix stability
 * panel: fix display noise on auo,kd101n80-45na
 * panel: delay HPD checks for boe_nv133fhm_n61
 * bridge: drop connector check in nwl-dsi bridge
 * bridge: set proper bridge type for adv7511
 * of: fix a double free
Signed-off-by: default avatarDave Airlie <airlied@redhat.com>

From: Thomas Zimmermann <tzimmermann@suse.de>
Link: https://patchwork.freedesktop.org/patch/msgid/20200728110446.GA8076@linux-uq9g
parents 0d786980 8490d6a7
...@@ -146,6 +146,7 @@ int bochs_kms_init(struct bochs_device *bochs) ...@@ -146,6 +146,7 @@ int bochs_kms_init(struct bochs_device *bochs)
bochs->dev->mode_config.preferred_depth = 24; bochs->dev->mode_config.preferred_depth = 24;
bochs->dev->mode_config.prefer_shadow = 0; bochs->dev->mode_config.prefer_shadow = 0;
bochs->dev->mode_config.prefer_shadow_fbdev = 1; bochs->dev->mode_config.prefer_shadow_fbdev = 1;
bochs->dev->mode_config.fbdev_use_iomem = true;
bochs->dev->mode_config.quirk_addfb_prefer_host_byte_order = true; bochs->dev->mode_config.quirk_addfb_prefer_host_byte_order = true;
bochs->dev->mode_config.funcs = &bochs_mode_funcs; bochs->dev->mode_config.funcs = &bochs_mode_funcs;
......
...@@ -1224,6 +1224,7 @@ static int adv7511_probe(struct i2c_client *i2c, const struct i2c_device_id *id) ...@@ -1224,6 +1224,7 @@ static int adv7511_probe(struct i2c_client *i2c, const struct i2c_device_id *id)
adv7511->bridge.funcs = &adv7511_bridge_funcs; adv7511->bridge.funcs = &adv7511_bridge_funcs;
adv7511->bridge.of_node = dev->of_node; adv7511->bridge.of_node = dev->of_node;
adv7511->bridge.type = DRM_MODE_CONNECTOR_HDMIA;
drm_bridge_add(&adv7511->bridge); drm_bridge_add(&adv7511->bridge);
......
...@@ -917,11 +917,6 @@ static int nwl_dsi_bridge_attach(struct drm_bridge *bridge, ...@@ -917,11 +917,6 @@ static int nwl_dsi_bridge_attach(struct drm_bridge *bridge,
struct drm_panel *panel; struct drm_panel *panel;
int ret; int ret;
if (flags & DRM_BRIDGE_ATTACH_NO_CONNECTOR) {
DRM_ERROR("Fix bridge driver to make connector optional!");
return -EINVAL;
}
ret = drm_of_find_panel_or_bridge(dsi->dev->of_node, 1, 0, &panel, ret = drm_of_find_panel_or_bridge(dsi->dev->of_node, 1, 0, &panel,
&panel_bridge); &panel_bridge);
if (ret) if (ret)
......
...@@ -399,7 +399,11 @@ static void drm_fb_helper_dirty_blit_real(struct drm_fb_helper *fb_helper, ...@@ -399,7 +399,11 @@ static void drm_fb_helper_dirty_blit_real(struct drm_fb_helper *fb_helper,
unsigned int y; unsigned int y;
for (y = clip->y1; y < clip->y2; y++) { for (y = clip->y1; y < clip->y2; y++) {
memcpy(dst, src, len); if (!fb_helper->dev->mode_config.fbdev_use_iomem)
memcpy(dst, src, len);
else
memcpy_toio((void __iomem *)dst, src, len);
src += fb->pitches[0]; src += fb->pitches[0];
dst += fb->pitches[0]; dst += fb->pitches[0];
} }
......
...@@ -871,9 +871,6 @@ drm_gem_flink_ioctl(struct drm_device *dev, void *data, ...@@ -871,9 +871,6 @@ drm_gem_flink_ioctl(struct drm_device *dev, void *data,
* @file_priv: drm file-private structure * @file_priv: drm file-private structure
* *
* Open an object using the global name, returning a handle and the size. * Open an object using the global name, returning a handle and the size.
*
* This handle (of course) holds a reference to the object, so the object
* will not go away until the handle is deleted.
*/ */
int int
drm_gem_open_ioctl(struct drm_device *dev, void *data, drm_gem_open_ioctl(struct drm_device *dev, void *data,
...@@ -898,14 +895,15 @@ drm_gem_open_ioctl(struct drm_device *dev, void *data, ...@@ -898,14 +895,15 @@ drm_gem_open_ioctl(struct drm_device *dev, void *data,
/* drm_gem_handle_create_tail unlocks dev->object_name_lock. */ /* drm_gem_handle_create_tail unlocks dev->object_name_lock. */
ret = drm_gem_handle_create_tail(file_priv, obj, &handle); ret = drm_gem_handle_create_tail(file_priv, obj, &handle);
drm_gem_object_put_unlocked(obj);
if (ret) if (ret)
return ret; goto err;
args->handle = handle; args->handle = handle;
args->size = obj->size; args->size = obj->size;
return 0; err:
drm_gem_object_put_unlocked(obj);
return ret;
} }
/** /**
......
...@@ -923,7 +923,7 @@ static int mipi_dbi_spi1_transfer(struct mipi_dbi *dbi, int dc, ...@@ -923,7 +923,7 @@ static int mipi_dbi_spi1_transfer(struct mipi_dbi *dbi, int dc,
} }
} }
tr.len = chunk; tr.len = chunk * 2;
len -= chunk; len -= chunk;
ret = spi_sync(spi, &m); ret = spi_sync(spi, &m);
......
...@@ -322,10 +322,8 @@ static int drm_of_lvds_get_remote_pixels_type( ...@@ -322,10 +322,8 @@ static int drm_of_lvds_get_remote_pixels_type(
* configurations by passing the endpoints explicitly to * configurations by passing the endpoints explicitly to
* drm_of_lvds_get_dual_link_pixel_order(). * drm_of_lvds_get_dual_link_pixel_order().
*/ */
if (!current_pt || pixels_type != current_pt) { if (!current_pt || pixels_type != current_pt)
of_node_put(remote_port);
return -EINVAL; return -EINVAL;
}
} }
return pixels_type; return pixels_type;
......
...@@ -1060,9 +1060,14 @@ static void mcde_display_update(struct drm_simple_display_pipe *pipe, ...@@ -1060,9 +1060,14 @@ static void mcde_display_update(struct drm_simple_display_pipe *pipe,
*/ */
if (fb) { if (fb) {
mcde_set_extsrc(mcde, drm_fb_cma_get_gem_addr(fb, pstate, 0)); mcde_set_extsrc(mcde, drm_fb_cma_get_gem_addr(fb, pstate, 0));
if (!mcde->video_mode) if (!mcde->video_mode) {
/* Send a single frame using software sync */ /*
mcde_display_send_one_frame(mcde); * Send a single frame using software sync if the flow
* is not active yet.
*/
if (mcde->flow_active == 0)
mcde_display_send_one_frame(mcde);
}
dev_info_once(mcde->dev, "sent first display update\n"); dev_info_once(mcde->dev, "sent first display update\n");
} else { } else {
/* /*
......
...@@ -615,9 +615,9 @@ static const struct panel_desc boe_tv101wum_nl6_desc = { ...@@ -615,9 +615,9 @@ static const struct panel_desc boe_tv101wum_nl6_desc = {
static const struct drm_display_mode auo_kd101n80_45na_default_mode = { static const struct drm_display_mode auo_kd101n80_45na_default_mode = {
.clock = 157000, .clock = 157000,
.hdisplay = 1200, .hdisplay = 1200,
.hsync_start = 1200 + 80, .hsync_start = 1200 + 60,
.hsync_end = 1200 + 80 + 24, .hsync_end = 1200 + 60 + 24,
.htotal = 1200 + 80 + 24 + 36, .htotal = 1200 + 60 + 24 + 56,
.vdisplay = 1920, .vdisplay = 1920,
.vsync_start = 1920 + 16, .vsync_start = 1920 + 16,
.vsync_end = 1920 + 16 + 4, .vsync_end = 1920 + 16 + 4,
......
...@@ -1250,7 +1250,21 @@ static const struct panel_desc boe_nv133fhm_n61 = { ...@@ -1250,7 +1250,21 @@ static const struct panel_desc boe_nv133fhm_n61 = {
.height = 165, .height = 165,
}, },
.delay = { .delay = {
.hpd_absent_delay = 200, /*
* When power is first given to the panel there's a short
* spike on the HPD line. It was explained that this spike
* was until the TCON data download was complete. On
* one system this was measured at 8 ms. We'll put 15 ms
* in the prepare delay just to be safe and take it away
* from the hpd_absent_delay (which would otherwise be 200 ms)
* to handle this. That means:
* - If HPD isn't hooked up you still have 200 ms delay.
* - If HPD is hooked up we won't try to look at it for the
* first 15 ms.
*/
.prepare = 15,
.hpd_absent_delay = 185,
.unprepare = 500, .unprepare = 500,
}, },
.bus_format = MEDIA_BUS_FMT_RGB888_1X24, .bus_format = MEDIA_BUS_FMT_RGB888_1X24,
......
...@@ -865,6 +865,18 @@ struct drm_mode_config { ...@@ -865,6 +865,18 @@ struct drm_mode_config {
*/ */
bool prefer_shadow_fbdev; bool prefer_shadow_fbdev;
/**
* @fbdev_use_iomem:
*
* Set to true if framebuffer reside in iomem.
* When set to true memcpy_toio() is used when copying the framebuffer in
* drm_fb_helper.drm_fb_helper_dirty_blit_real().
*
* FIXME: This should be replaced with a per-mapping is_iomem
* flag (like ttm does), and then used everywhere in fbdev code.
*/
bool fbdev_use_iomem;
/** /**
* @quirk_addfb_prefer_xbgr_30bpp: * @quirk_addfb_prefer_xbgr_30bpp:
* *
......
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