Commit 20c47601 authored by benjamin.gaignard@linaro.org's avatar benjamin.gaignard@linaro.org Committed by Vincent Abriou

drm/sti: fix potential crash in gdp

In some cases last_close() could be called before sti_gdp_disable()
and make kernel crash because mixer structure has been destroy.
Let's gdp keep a reference on vtg to fix that (like it is already done
in HQVDP)
Signed-off-by: default avatarBenjamin Gaignard <benjamin.gaignard@linaro.org>
Reviewed-by: default avatarVincent Abriou <vincent.abriou@st.com>
parent 44ab4042
...@@ -97,6 +97,7 @@ struct sti_gdp_node_list { ...@@ -97,6 +97,7 @@ struct sti_gdp_node_list {
* @vtg_field_nb: callback for VTG FIELD (top or bottom) notification * @vtg_field_nb: callback for VTG FIELD (top or bottom) notification
* @is_curr_top: true if the current node processed is the top field * @is_curr_top: true if the current node processed is the top field
* @node_list: array of node list * @node_list: array of node list
* @vtg: registered vtg
*/ */
struct sti_gdp { struct sti_gdp {
struct sti_plane plane; struct sti_plane plane;
...@@ -108,6 +109,7 @@ struct sti_gdp { ...@@ -108,6 +109,7 @@ struct sti_gdp {
struct notifier_block vtg_field_nb; struct notifier_block vtg_field_nb;
bool is_curr_top; bool is_curr_top;
struct sti_gdp_node_list node_list[GDP_NODE_NB_BANK]; struct sti_gdp_node_list node_list[GDP_NODE_NB_BANK];
struct sti_vtg *vtg;
}; };
#define to_sti_gdp(x) container_of(x, struct sti_gdp, plane) #define to_sti_gdp(x) container_of(x, struct sti_gdp, plane)
...@@ -240,9 +242,6 @@ struct sti_gdp_node_list *sti_gdp_get_current_nodes(struct sti_gdp *gdp) ...@@ -240,9 +242,6 @@ struct sti_gdp_node_list *sti_gdp_get_current_nodes(struct sti_gdp *gdp)
*/ */
static void sti_gdp_disable(struct sti_gdp *gdp) static void sti_gdp_disable(struct sti_gdp *gdp)
{ {
struct drm_plane *drm_plane = &gdp->plane.drm_plane;
struct sti_mixer *mixer = to_sti_mixer(drm_plane->crtc);
struct sti_compositor *compo = dev_get_drvdata(gdp->dev);
unsigned int i; unsigned int i;
DRM_DEBUG_DRIVER("%s\n", sti_plane_to_str(&gdp->plane)); DRM_DEBUG_DRIVER("%s\n", sti_plane_to_str(&gdp->plane));
...@@ -253,8 +252,7 @@ static void sti_gdp_disable(struct sti_gdp *gdp) ...@@ -253,8 +252,7 @@ static void sti_gdp_disable(struct sti_gdp *gdp)
gdp->node_list[i].btm_field->gam_gdp_ppt |= GAM_GDP_PPT_IGNORE; gdp->node_list[i].btm_field->gam_gdp_ppt |= GAM_GDP_PPT_IGNORE;
} }
if (sti_vtg_unregister_client(mixer->id == STI_MIXER_MAIN ? if (sti_vtg_unregister_client(gdp->vtg, &gdp->vtg_field_nb))
compo->vtg_main : compo->vtg_aux, &gdp->vtg_field_nb))
DRM_DEBUG_DRIVER("Warning: cannot unregister VTG notifier\n"); DRM_DEBUG_DRIVER("Warning: cannot unregister VTG notifier\n");
if (gdp->clk_pix) if (gdp->clk_pix)
...@@ -490,7 +488,10 @@ static void sti_gdp_atomic_update(struct drm_plane *drm_plane, ...@@ -490,7 +488,10 @@ static void sti_gdp_atomic_update(struct drm_plane *drm_plane,
if (first_prepare) { if (first_prepare) {
/* Register gdp callback */ /* Register gdp callback */
if (sti_vtg_register_client(mixer->id == STI_MIXER_MAIN ? gdp->vtg = mixer->id == STI_MIXER_MAIN ?
compo->vtg_main : compo->vtg_aux;
if (sti_vtg_register_client(gdp->vtg == STI_MIXER_MAIN ?
compo->vtg_main : compo->vtg_aux, compo->vtg_main : compo->vtg_aux,
&gdp->vtg_field_nb, crtc)) { &gdp->vtg_field_nb, crtc)) {
DRM_ERROR("Cannot register VTG notifier\n"); DRM_ERROR("Cannot register VTG notifier\n");
......
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