Commit d416bd0b authored by Dave Airlie's avatar Dave Airlie

Merge tag 'drm-misc-fixes-2021-04-09' of git://anongit.freedesktop.org/drm/drm-misc into drm-fixes

drm-misc-fixes for v5.12-rc7:
- Fix use-after-free in xen.
- Reduce fifo threshold on hvs4 to fix a fifo full error.
- Disable TE support for Droid4 and N950.
- Small compiler fixes.
Signed-off-by: default avatarDave Airlie <airlied@redhat.com>

From: Maarten Lankhorst <maarten.lankhorst@linux.intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/e7647dd9-60c3-9dfd-a377-89d717212e13@linux.intel.com
parents 2e99cd7a eb9dfdd1
...@@ -37,6 +37,7 @@ struct dsic_panel_data { ...@@ -37,6 +37,7 @@ struct dsic_panel_data {
u32 height_mm; u32 height_mm;
u32 max_hs_rate; u32 max_hs_rate;
u32 max_lp_rate; u32 max_lp_rate;
bool te_support;
}; };
struct panel_drv_data { struct panel_drv_data {
...@@ -334,9 +335,11 @@ static int dsicm_power_on(struct panel_drv_data *ddata) ...@@ -334,9 +335,11 @@ static int dsicm_power_on(struct panel_drv_data *ddata)
if (r) if (r)
goto err; goto err;
r = mipi_dsi_dcs_set_tear_on(ddata->dsi, MIPI_DSI_DCS_TEAR_MODE_VBLANK); if (ddata->panel_data->te_support) {
if (r) r = mipi_dsi_dcs_set_tear_on(ddata->dsi, MIPI_DSI_DCS_TEAR_MODE_VBLANK);
goto err; if (r)
goto err;
}
/* possible panel bug */ /* possible panel bug */
msleep(100); msleep(100);
...@@ -619,6 +622,7 @@ static const struct dsic_panel_data taal_data = { ...@@ -619,6 +622,7 @@ static const struct dsic_panel_data taal_data = {
.height_mm = 0, .height_mm = 0,
.max_hs_rate = 300000000, .max_hs_rate = 300000000,
.max_lp_rate = 10000000, .max_lp_rate = 10000000,
.te_support = true,
}; };
static const struct dsic_panel_data himalaya_data = { static const struct dsic_panel_data himalaya_data = {
...@@ -629,6 +633,7 @@ static const struct dsic_panel_data himalaya_data = { ...@@ -629,6 +633,7 @@ static const struct dsic_panel_data himalaya_data = {
.height_mm = 88, .height_mm = 88,
.max_hs_rate = 300000000, .max_hs_rate = 300000000,
.max_lp_rate = 10000000, .max_lp_rate = 10000000,
.te_support = false,
}; };
static const struct dsic_panel_data droid4_data = { static const struct dsic_panel_data droid4_data = {
...@@ -639,6 +644,7 @@ static const struct dsic_panel_data droid4_data = { ...@@ -639,6 +644,7 @@ static const struct dsic_panel_data droid4_data = {
.height_mm = 89, .height_mm = 89,
.max_hs_rate = 300000000, .max_hs_rate = 300000000,
.max_lp_rate = 10000000, .max_lp_rate = 10000000,
.te_support = false,
}; };
static const struct of_device_id dsicm_of_match[] = { static const struct of_device_id dsicm_of_match[] = {
......
...@@ -210,6 +210,7 @@ static u32 vc4_get_fifo_full_level(struct vc4_crtc *vc4_crtc, u32 format) ...@@ -210,6 +210,7 @@ static u32 vc4_get_fifo_full_level(struct vc4_crtc *vc4_crtc, u32 format)
{ {
const struct vc4_crtc_data *crtc_data = vc4_crtc_to_vc4_crtc_data(vc4_crtc); const struct vc4_crtc_data *crtc_data = vc4_crtc_to_vc4_crtc_data(vc4_crtc);
const struct vc4_pv_data *pv_data = vc4_crtc_to_vc4_pv_data(vc4_crtc); const struct vc4_pv_data *pv_data = vc4_crtc_to_vc4_pv_data(vc4_crtc);
struct vc4_dev *vc4 = to_vc4_dev(vc4_crtc->base.dev);
u32 fifo_len_bytes = pv_data->fifo_depth; u32 fifo_len_bytes = pv_data->fifo_depth;
/* /*
...@@ -238,6 +239,22 @@ static u32 vc4_get_fifo_full_level(struct vc4_crtc *vc4_crtc, u32 format) ...@@ -238,6 +239,22 @@ static u32 vc4_get_fifo_full_level(struct vc4_crtc *vc4_crtc, u32 format)
if (crtc_data->hvs_output == 5) if (crtc_data->hvs_output == 5)
return 32; return 32;
/*
* It looks like in some situations, we will overflow
* the PixelValve FIFO (with the bit 10 of PV stat being
* set) and stall the HVS / PV, eventually resulting in
* a page flip timeout.
*
* Displaying the video overlay during a playback with
* Kodi on an RPi3 seems to be a great solution with a
* failure rate around 50%.
*
* Removing 1 from the FIFO full level however
* seems to completely remove that issue.
*/
if (!vc4->hvs->hvs5)
return fifo_len_bytes - 3 * HVS_FIFO_LATENCY_PIX - 1;
return fifo_len_bytes - 3 * HVS_FIFO_LATENCY_PIX; return fifo_len_bytes - 3 * HVS_FIFO_LATENCY_PIX;
} }
} }
......
...@@ -1146,7 +1146,6 @@ static void vc4_plane_atomic_async_update(struct drm_plane *plane, ...@@ -1146,7 +1146,6 @@ static void vc4_plane_atomic_async_update(struct drm_plane *plane,
plane->state->src_y = state->src_y; plane->state->src_y = state->src_y;
plane->state->src_w = state->src_w; plane->state->src_w = state->src_w;
plane->state->src_h = state->src_h; plane->state->src_h = state->src_h;
plane->state->src_h = state->src_h;
plane->state->alpha = state->alpha; plane->state->alpha = state->alpha;
plane->state->pixel_blend_mode = state->pixel_blend_mode; plane->state->pixel_blend_mode = state->pixel_blend_mode;
plane->state->rotation = state->rotation; plane->state->rotation = state->rotation;
......
...@@ -521,7 +521,7 @@ static int xen_drm_drv_init(struct xen_drm_front_info *front_info) ...@@ -521,7 +521,7 @@ static int xen_drm_drv_init(struct xen_drm_front_info *front_info)
drm_dev = drm_dev_alloc(&xen_drm_driver, dev); drm_dev = drm_dev_alloc(&xen_drm_driver, dev);
if (IS_ERR(drm_dev)) { if (IS_ERR(drm_dev)) {
ret = PTR_ERR(drm_dev); ret = PTR_ERR(drm_dev);
goto fail; goto fail_dev;
} }
drm_info->drm_dev = drm_dev; drm_info->drm_dev = drm_dev;
...@@ -551,8 +551,10 @@ static int xen_drm_drv_init(struct xen_drm_front_info *front_info) ...@@ -551,8 +551,10 @@ static int xen_drm_drv_init(struct xen_drm_front_info *front_info)
drm_kms_helper_poll_fini(drm_dev); drm_kms_helper_poll_fini(drm_dev);
drm_mode_config_cleanup(drm_dev); drm_mode_config_cleanup(drm_dev);
drm_dev_put(drm_dev); drm_dev_put(drm_dev);
fail: fail_dev:
kfree(drm_info); kfree(drm_info);
front_info->drm_info = NULL;
fail:
return ret; return ret;
} }
......
...@@ -16,7 +16,6 @@ ...@@ -16,7 +16,6 @@
struct drm_connector; struct drm_connector;
struct xen_drm_front_drm_info; struct xen_drm_front_drm_info;
struct xen_drm_front_drm_info;
int xen_drm_front_conn_init(struct xen_drm_front_drm_info *drm_info, int xen_drm_front_conn_init(struct xen_drm_front_drm_info *drm_info,
struct drm_connector *connector); struct drm_connector *connector);
......
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