Commit 279cc2e9 authored by Thomas Zimmermann's avatar Thomas Zimmermann

drm: Define DRM_FORMAT_MAX_PLANES

DRM uses a magic number of 4 for the maximum number of planes per color
format. Declare this constant via DRM_FORMAT_MAX_PLANES and update the
related code. Some code depends on the length of arrays that are now
declared with DRM_FORMAT_MAX_PLANES. Convert it from '4' to ARRAY_SIZE.

v2:
	* mention usage of ARRAY_SIZE() in the commit message (Maxime)
	* also fix error handling in drm_gem_fb_init_with_funcs()
	  (kernel test robot)
	* include <drm/drm_fourcc.h> for DRM_FORMAT_MAX_PLANES
Signed-off-by: default avatarThomas Zimmermann <tzimmermann@suse.de>
Reviewed-by: default avatarSam Ravnborg <sam@ravnborg.org>
Link: https://patchwork.freedesktop.org/patch/msgid/20210730183511.20080-2-tzimmermann@suse.de
parent 6e5b47a4
...@@ -48,7 +48,7 @@ ...@@ -48,7 +48,7 @@
struct drm_gem_object *drm_gem_fb_get_obj(struct drm_framebuffer *fb, struct drm_gem_object *drm_gem_fb_get_obj(struct drm_framebuffer *fb,
unsigned int plane) unsigned int plane)
{ {
if (plane >= 4) if (plane >= ARRAY_SIZE(fb->obj))
return NULL; return NULL;
return fb->obj[plane]; return fb->obj[plane];
...@@ -62,7 +62,8 @@ drm_gem_fb_init(struct drm_device *dev, ...@@ -62,7 +62,8 @@ drm_gem_fb_init(struct drm_device *dev,
struct drm_gem_object **obj, unsigned int num_planes, struct drm_gem_object **obj, unsigned int num_planes,
const struct drm_framebuffer_funcs *funcs) const struct drm_framebuffer_funcs *funcs)
{ {
int ret, i; unsigned int i;
int ret;
drm_helper_mode_fill_fb_struct(dev, fb, mode_cmd); drm_helper_mode_fill_fb_struct(dev, fb, mode_cmd);
...@@ -86,9 +87,9 @@ drm_gem_fb_init(struct drm_device *dev, ...@@ -86,9 +87,9 @@ drm_gem_fb_init(struct drm_device *dev,
*/ */
void drm_gem_fb_destroy(struct drm_framebuffer *fb) void drm_gem_fb_destroy(struct drm_framebuffer *fb)
{ {
int i; size_t i;
for (i = 0; i < 4; i++) for (i = 0; i < ARRAY_SIZE(fb->obj); i++)
drm_gem_object_put(fb->obj[i]); drm_gem_object_put(fb->obj[i]);
drm_framebuffer_cleanup(fb); drm_framebuffer_cleanup(fb);
...@@ -145,8 +146,9 @@ int drm_gem_fb_init_with_funcs(struct drm_device *dev, ...@@ -145,8 +146,9 @@ int drm_gem_fb_init_with_funcs(struct drm_device *dev,
const struct drm_framebuffer_funcs *funcs) const struct drm_framebuffer_funcs *funcs)
{ {
const struct drm_format_info *info; const struct drm_format_info *info;
struct drm_gem_object *objs[4]; struct drm_gem_object *objs[DRM_FORMAT_MAX_PLANES];
int ret, i; unsigned int i;
int ret;
info = drm_get_format_info(dev, mode_cmd); info = drm_get_format_info(dev, mode_cmd);
if (!info) { if (!info) {
...@@ -187,9 +189,10 @@ int drm_gem_fb_init_with_funcs(struct drm_device *dev, ...@@ -187,9 +189,10 @@ int drm_gem_fb_init_with_funcs(struct drm_device *dev,
return 0; return 0;
err_gem_object_put: err_gem_object_put:
for (i--; i >= 0; i--) while (i > 0) {
--i;
drm_gem_object_put(objs[i]); drm_gem_object_put(objs[i]);
}
return ret; return ret;
} }
EXPORT_SYMBOL_GPL(drm_gem_fb_init_with_funcs); EXPORT_SYMBOL_GPL(drm_gem_fb_init_with_funcs);
......
...@@ -25,6 +25,11 @@ ...@@ -25,6 +25,11 @@
#include <linux/types.h> #include <linux/types.h>
#include <uapi/drm/drm_fourcc.h> #include <uapi/drm/drm_fourcc.h>
/**
* DRM_FORMAT_MAX_PLANES - maximum number of planes a DRM format can have
*/
#define DRM_FORMAT_MAX_PLANES 4u
/* /*
* DRM formats are little endian. Define host endian variants for the * DRM formats are little endian. Define host endian variants for the
* most common formats here, to reduce the #ifdefs needed in drivers. * most common formats here, to reduce the #ifdefs needed in drivers.
...@@ -78,7 +83,7 @@ struct drm_format_info { ...@@ -78,7 +83,7 @@ struct drm_format_info {
* triplet @char_per_block, @block_w, @block_h for better * triplet @char_per_block, @block_w, @block_h for better
* describing the pixel format. * describing the pixel format.
*/ */
u8 cpp[4]; u8 cpp[DRM_FORMAT_MAX_PLANES];
/** /**
* @char_per_block: * @char_per_block:
...@@ -104,7 +109,7 @@ struct drm_format_info { ...@@ -104,7 +109,7 @@ struct drm_format_info {
* information from their drm_mode_config.get_format_info hook * information from their drm_mode_config.get_format_info hook
* if they want the core to be validating the pitch. * if they want the core to be validating the pitch.
*/ */
u8 char_per_block[4]; u8 char_per_block[DRM_FORMAT_MAX_PLANES];
}; };
/** /**
...@@ -113,7 +118,7 @@ struct drm_format_info { ...@@ -113,7 +118,7 @@ struct drm_format_info {
* Block width in pixels, this is intended to be accessed through * Block width in pixels, this is intended to be accessed through
* drm_format_info_block_width() * drm_format_info_block_width()
*/ */
u8 block_w[4]; u8 block_w[DRM_FORMAT_MAX_PLANES];
/** /**
* @block_h: * @block_h:
...@@ -121,7 +126,7 @@ struct drm_format_info { ...@@ -121,7 +126,7 @@ struct drm_format_info {
* Block height in pixels, this is intended to be accessed through * Block height in pixels, this is intended to be accessed through
* drm_format_info_block_height() * drm_format_info_block_height()
*/ */
u8 block_h[4]; u8 block_h[DRM_FORMAT_MAX_PLANES];
/** @hsub: Horizontal chroma subsampling factor */ /** @hsub: Horizontal chroma subsampling factor */
u8 hsub; u8 hsub;
......
...@@ -27,12 +27,12 @@ ...@@ -27,12 +27,12 @@
#include <linux/list.h> #include <linux/list.h>
#include <linux/sched.h> #include <linux/sched.h>
#include <drm/drm_fourcc.h>
#include <drm/drm_mode_object.h> #include <drm/drm_mode_object.h>
struct drm_clip_rect; struct drm_clip_rect;
struct drm_device; struct drm_device;
struct drm_file; struct drm_file;
struct drm_format_info;
struct drm_framebuffer; struct drm_framebuffer;
struct drm_gem_object; struct drm_gem_object;
...@@ -147,7 +147,7 @@ struct drm_framebuffer { ...@@ -147,7 +147,7 @@ struct drm_framebuffer {
* @pitches: Line stride per buffer. For userspace created object this * @pitches: Line stride per buffer. For userspace created object this
* is copied from drm_mode_fb_cmd2. * is copied from drm_mode_fb_cmd2.
*/ */
unsigned int pitches[4]; unsigned int pitches[DRM_FORMAT_MAX_PLANES];
/** /**
* @offsets: Offset from buffer start to the actual pixel data in bytes, * @offsets: Offset from buffer start to the actual pixel data in bytes,
* per buffer. For userspace created object this is copied from * per buffer. For userspace created object this is copied from
...@@ -165,7 +165,7 @@ struct drm_framebuffer { ...@@ -165,7 +165,7 @@ struct drm_framebuffer {
* data (even for linear buffers). Specifying an x/y pixel offset is * data (even for linear buffers). Specifying an x/y pixel offset is
* instead done through the source rectangle in &struct drm_plane_state. * instead done through the source rectangle in &struct drm_plane_state.
*/ */
unsigned int offsets[4]; unsigned int offsets[DRM_FORMAT_MAX_PLANES];
/** /**
* @modifier: Data layout modifier. This is used to describe * @modifier: Data layout modifier. This is used to describe
* tiling, or also special layouts (like compression) of auxiliary * tiling, or also special layouts (like compression) of auxiliary
...@@ -210,7 +210,7 @@ struct drm_framebuffer { ...@@ -210,7 +210,7 @@ struct drm_framebuffer {
* This is used by the GEM framebuffer helpers, see e.g. * This is used by the GEM framebuffer helpers, see e.g.
* drm_gem_fb_create(). * drm_gem_fb_create().
*/ */
struct drm_gem_object *obj[4]; struct drm_gem_object *obj[DRM_FORMAT_MAX_PLANES];
}; };
#define obj_to_fb(x) container_of(x, struct drm_framebuffer, base) #define obj_to_fb(x) container_of(x, struct drm_framebuffer, base)
......
...@@ -5,6 +5,7 @@ ...@@ -5,6 +5,7 @@
#include <linux/dma-buf-map.h> #include <linux/dma-buf-map.h>
#include <drm/drm_fourcc.h>
#include <drm/drm_plane.h> #include <drm/drm_plane.h>
struct drm_simple_display_pipe; struct drm_simple_display_pipe;
...@@ -40,7 +41,7 @@ struct drm_shadow_plane_state { ...@@ -40,7 +41,7 @@ struct drm_shadow_plane_state {
* The memory mappings stored in map should be established in the plane's * The memory mappings stored in map should be established in the plane's
* prepare_fb callback and removed in the cleanup_fb callback. * prepare_fb callback and removed in the cleanup_fb callback.
*/ */
struct dma_buf_map map[4]; struct dma_buf_map map[DRM_FORMAT_MAX_PLANES];
}; };
/** /**
......
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