drm: Add drm_framebuffer_plane_{width,height}()
authorVille Syrjälä <ville.syrjala@linux.intel.com>
Fri, 18 Nov 2016 19:53:05 +0000 (21:53 +0200)
committerVille Syrjälä <ville.syrjala@linux.intel.com>
Thu, 15 Dec 2016 12:55:33 +0000 (14:55 +0200)
Add variants of drm_format_plane_{width,height}() that take an entire fb
object instead of just the format. These should be more efficent as they
can just look up the format info from the fb->format pointer rather than
having to look it up (using a linear search based on the format).

Signed-off-by: Ville Syrjälä <ville.syrjala@linux.intel.com>
Reviewed-by: Alex Deucher <alexander.deucher@amd.com>
Link: http://patchwork.freedesktop.org/patch/msgid/1479498793-31021-30-git-send-email-ville.syrjala@linux.intel.com
drivers/gpu/drm/drm_framebuffer.c
include/drm/drm_framebuffer.h

index 892976d974e51ea10bfdb9e812bca1454f9db0e6..22071d7e3420618b76400941464619dd1c32e174 100644 (file)
@@ -793,3 +793,47 @@ void drm_framebuffer_remove(struct drm_framebuffer *fb)
        drm_framebuffer_unreference(fb);
 }
 EXPORT_SYMBOL(drm_framebuffer_remove);
+
+/**
+ * drm_framebuffer_plane_width - width of the plane given the first plane
+ * @width: width of the first plane
+ * @fb: the framebuffer
+ * @plane: plane index
+ *
+ * Returns:
+ * The width of @plane, given that the width of the first plane is @width.
+ */
+int drm_framebuffer_plane_width(int width,
+                               const struct drm_framebuffer *fb, int plane)
+{
+       if (plane >= fb->format->num_planes)
+               return 0;
+
+       if (plane == 0)
+               return width;
+
+       return width / fb->format->hsub;
+}
+EXPORT_SYMBOL(drm_framebuffer_plane_width);
+
+/**
+ * drm_framebuffer_plane_height - height of the plane given the first plane
+ * @height: height of the first plane
+ * @fb: the framebuffer
+ * @plane: plane index
+ *
+ * Returns:
+ * The height of @plane, given that the height of the first plane is @height.
+ */
+int drm_framebuffer_plane_height(int height,
+                                const struct drm_framebuffer *fb, int plane)
+{
+       if (plane >= fb->format->num_planes)
+               return 0;
+
+       if (plane == 0)
+               return height;
+
+       return height / fb->format->vsub;
+}
+EXPORT_SYMBOL(drm_framebuffer_plane_height);
index a3d2f25230a8d3c0c800f62019c6ab85fdd98149..79640c3e7ec43cdecc6965442a5d7a86432f52a4 100644 (file)
@@ -286,4 +286,10 @@ static inline void drm_framebuffer_assign(struct drm_framebuffer **p,
                                          struct drm_framebuffer, head);        \
             &fb->head != (&(dev)->mode_config.fb_list);                        \
             fb = list_next_entry(fb, head))
+
+int drm_framebuffer_plane_width(int width,
+                               const struct drm_framebuffer *fb, int plane);
+int drm_framebuffer_plane_height(int height,
+                                const struct drm_framebuffer *fb, int plane);
+
 #endif