OSDN Git Service

gralloc: check possible crtcs of plane against primary output
authorTapani Pälli <tapani.palli@intel.com>
Fri, 3 May 2013 07:08:54 +0000 (10:08 +0300)
committerTapani Pälli <tapani.palli@intel.com>
Tue, 7 May 2013 10:10:51 +0000 (13:10 +0300)
Current implementation supports planes only with primary
output, patch adds a check to guard this.

Change-Id: I537858122a4fe77a374031d11339eaaea27ad9bf
Signed-off-by: Tapani Pälli <tapani.palli@intel.com>
Reviewed-by: Topi Pohjolainen <topi.pohjolainen@intel.com>
gralloc_drm_kms.c
gralloc_drm_priv.h

index 4eb3dfa..1e64312 100644 (file)
@@ -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) {
index eb4338c..d96702e 100644 (file)
@@ -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;