From 6062311f2c2528a58b34436dce0bb542d9b3af13 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tapani=20P=C3=A4lli?= Date: Fri, 3 May 2013 10:08:54 +0300 Subject: gralloc: check possible crtcs of plane against primary output MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Current implementation supports planes only with primary output, patch adds a check to guard this. Change-Id: I537858122a4fe77a374031d11339eaaea27ad9bf Signed-off-by: Tapani Pälli Reviewed-by: Topi Pohjolainen --- gralloc_drm_kms.c | 29 +++++++++++++++++++++++++++++ gralloc_drm_priv.h | 1 + 2 files changed, 30 insertions(+) diff --git a/gralloc_drm_kms.c b/gralloc_drm_kms.c index 4eb3dfa..1e64312 100644 --- a/gralloc_drm_kms.c +++ b/gralloc_drm_kms.c @@ -243,6 +243,16 @@ static int gralloc_drm_bo_setplane(struct gralloc_drm_t *drm, } /* + * Returns if a particular plane is supported with the implementation + */ +static unsigned is_plane_supported(const struct gralloc_drm_t *drm, + const struct gralloc_drm_plane_t *plane) +{ + /* Planes are only supported on primary pipe for now */ + return plane->drm_plane->possible_crtcs & (1 << drm->primary.pipe); +} + +/* * Sets all the active planes to be displayed. */ static void gralloc_drm_set_planes(struct gralloc_drm_t *drm) @@ -251,6 +261,15 @@ static void gralloc_drm_set_planes(struct gralloc_drm_t *drm) unsigned int i; for (i = 0; i < drm->plane_resources->count_planes; i++, plane++) { + /* plane is not in use at all */ + if (!plane->active && !plane->handle) + continue; + + /* plane is active, safety check if it is supported */ + if (!is_plane_supported(drm, plane)) + ALOGE("%s: plane %d is not supported", + __func__, plane->drm_plane->plane_id); + /* * Disable overlay if it is not active * or if there is error during setplane @@ -291,6 +310,15 @@ int gralloc_drm_reserve_plane(struct gralloc_drm_t *drm, } for (j = 0; j < plane_count; j++, plane++) { + + /* + * handle may be suitable to be shown on a plane, in + * addition we need to check that this particular plane + * is supported by the current implementation + */ + if (!is_plane_supported(drm, plane)) + continue; + /* if plane is available and can support this buffer */ if (!plane->active && drm_handle->plane_mask & @@ -723,6 +751,7 @@ static int drm_kms_init_with_connector(struct gralloc_drm_t *drm, output->bo = NULL; output->crtc_id = drm->resources->crtcs[i]; output->connector_id = connector->connector_id; + output->pipe = i; /* print connector info */ if (connector->count_modes > 1) { diff --git a/gralloc_drm_priv.h b/gralloc_drm_priv.h index eb4338c..d96702e 100644 --- a/gralloc_drm_priv.h +++ b/gralloc_drm_priv.h @@ -74,6 +74,7 @@ struct gralloc_drm_output { uint32_t crtc_id; uint32_t connector_id; + uint32_t pipe; drmModeModeInfo mode; int xdpi, ydpi; int fb_format; -- cgit v1.1