a null derefrence at [v7, 9/9] drm/omap: Add a 'right overlay' to plane state
Weiguo Li
liwg06 at foxmail.com
Mon Mar 7 15:50:43 UTC 2022
>
> From: Benoit Parrot <bparrot at ti.com>
>
> If the drm_plane has a source width that's greater than the max width
> supported by a single hw overlay, then we assign a 'r_overlay' to it in
> omap_plane_atomic_check().
>
> Both overlays should have the capabilities required to handle the source
> framebuffer. The only parameters that vary between the left and right
> hwoverlays are the src_w, crtc_w, src_x and crtc_x as we just even chop
> the fb into left and right halves.
>
> We also take care of not creating odd width size when dealing with YUV
> formats.
>
> Since both halves need to be 'appear' side by side the zpos is
> recalculated when dealing with dual overlay cases so that the other
> planes zpos is consistent.
>
> Depending on user space usage it is possible that on occasion the number
> of requested planes exceeds the numbers of overlays required to display
> them. In that case a failure would be returned for the plane that cannot
> be handled at that time. It is up to user space to make sure the H/W
> resource are not over-subscribed.
>
> Signed-off-by: Benoit Parrot <bparrot at ti.com>
> Signed-off-by: Neil Armstrong <narmstrong at baylibre.com>
> ---
> drivers/gpu/drm/omapdrm/omap_drv.c | 98 ++++++++++++++++++++-
> drivers/gpu/drm/omapdrm/omap_fb.c | 33 ++++++-
> drivers/gpu/drm/omapdrm/omap_fb.h | 4 +-
> drivers/gpu/drm/omapdrm/omap_overlay.c | 23 ++++-
> drivers/gpu/drm/omapdrm/omap_overlay.h | 3 +-
> drivers/gpu/drm/omapdrm/omap_plane.c | 117 +++++++++++++++++++++++--
> drivers/gpu/drm/omapdrm/omap_plane.h | 1 +
> 7 files changed, 267 insertions(+), 12 deletions(-)
>
> ...
>
> diff --git a/drivers/gpu/drm/omapdrm/omap_overlay.c b/drivers/gpu/drm/omapdrm/omap_overlay.c
> index afb2b44fdf86..10730c9b2752 100644
> --- a/drivers/gpu/drm/omapdrm/omap_overlay.c
> +++ b/drivers/gpu/drm/omapdrm/omap_overlay.c
> @@ -67,12 +67,13 @@ omap_plane_find_free_overlay(struct drm_device *dev, struct drm_plane *hwoverlay
> * next global overlay_map to be enabled when atomic transaction is valid.
> */
> int omap_overlay_assign(struct drm_atomic_state *s, struct drm_plane *plane,
> - u32 caps, u32 fourcc, struct omap_hw_overlay **overlay)
> + u32 caps, u32 fourcc, struct omap_hw_overlay **overlay,
> + struct omap_hw_overlay **r_overlay)
> {
> /* Get the global state of the current atomic transaction */
> struct omap_global_state *state = omap_get_global_state(s);
> struct drm_plane **overlay_map = state->hwoverlay_to_plane;
> - struct omap_hw_overlay *ovl;
> + struct omap_hw_overlay *ovl, *r_ovl;
>
> ovl = omap_plane_find_free_overlay(s->dev, overlay_map, caps, fourcc);
> if (!ovl)
> @@ -81,8 +82,26 @@ int omap_overlay_assign(struct drm_atomic_state *s, struct drm_plane *plane,
> overlay_map[ovl->idx] = plane;
> *overlay = ovl;
>
> + if (r_overlay) {
> + r_ovl = omap_plane_find_free_overlay(s->dev, overlay_map,
> + caps, fourcc);
> + if (!r_ovl) {
> + overlay_map[r_ovl->idx] = NULL;
Hi,
a null derefrence "r_ovl->idx" when "r_ovl" is null, in inner if clause.
More information about the dri-devel
mailing list