[PATCHv4 09/13] drm: Add plane max width/height properties

Matt Roper matthew.d.roper at intel.com
Thu Mar 27 17:44:34 PDT 2014


Some hardware has different size limits for different planes (e.g.,
sprites/overlays can't always be as large as the upper bound for the
primary plane).  Adding read-only plane properties allows userspace
to check these limits.  By default, mode_config.max_{width,height} are
used for non-cursor planes and mode_config.cursor_{width,height} are
used for cursors; drivers should override these defaults after calling
plane_init, if necessary.

Signed-off-by: Matt Roper <matthew.d.roper at intel.com>
---
 drivers/gpu/drm/drm_crtc.c | 30 ++++++++++++++++++++++++++++++
 include/drm/drm_crtc.h     |  2 ++
 2 files changed, 32 insertions(+)

diff --git a/drivers/gpu/drm/drm_crtc.c b/drivers/gpu/drm/drm_crtc.c
index 0c70101..24226de 100644
--- a/drivers/gpu/drm/drm_crtc.c
+++ b/drivers/gpu/drm/drm_crtc.c
@@ -1028,6 +1028,7 @@ int drm_universal_plane_init(struct drm_device *dev, struct drm_plane *plane,
 			     enum drm_plane_type type)
 {
 	int ret;
+	uint32_t maxwidth, maxheight;
 
 	drm_modeset_lock_all(dev);
 
@@ -1061,6 +1062,28 @@ int drm_universal_plane_init(struct drm_device *dev, struct drm_plane *plane,
 				   dev->mode_config.plane_type_property,
 				   plane->type);
 
+	/*
+	 * Drivers may override default max width/height after calling
+	 * plane_init.
+	 */
+	if (plane->type == DRM_PLANE_TYPE_CURSOR) {
+		maxwidth = dev->mode_config.cursor_width;
+		if (!maxwidth)
+			maxwidth = 64;
+		maxheight = dev->mode_config.cursor_height;
+		if (!maxheight)
+			maxheight = 64;
+	} else {
+		maxwidth = dev->mode_config.max_width;
+		maxheight = dev->mode_config.max_height;
+	}
+	drm_object_attach_property(&plane->base,
+				   dev->mode_config.plane_maxwidth_property,
+				   maxwidth);
+	drm_object_attach_property(&plane->base,
+				   dev->mode_config.plane_maxheight_property,
+				   maxheight);
+
  out:
 	drm_modeset_unlock_all(dev);
 
@@ -1175,6 +1198,7 @@ static int drm_mode_create_standard_connector_properties(struct drm_device *dev)
 static int drm_mode_create_standard_plane_properties(struct drm_device *dev)
 {
 	struct drm_property *type;
+	struct drm_property *maxwidth, *maxheight;
 
 	/*
 	 * Standard properties (apply to all planes)
@@ -1182,7 +1206,13 @@ static int drm_mode_create_standard_plane_properties(struct drm_device *dev)
 	type = drm_property_create_enum(dev, DRM_MODE_PROP_IMMUTABLE,
 					"type", drm_plane_type_enum_list,
 					ARRAY_SIZE(drm_plane_type_enum_list));
+	maxwidth = drm_property_create_range(dev, DRM_MODE_PROP_IMMUTABLE,
+					     "max width", 1, INT_MAX);
+	maxheight = drm_property_create_range(dev, DRM_MODE_PROP_IMMUTABLE,
+					      "max height", 1, INT_MAX);
 	dev->mode_config.plane_type_property = type;
+	dev->mode_config.plane_maxwidth_property = maxwidth;
+	dev->mode_config.plane_maxheight_property = maxheight;
 
 	return 0;
 }
diff --git a/include/drm/drm_crtc.h b/include/drm/drm_crtc.h
index 4c4f792..78cf825 100644
--- a/include/drm/drm_crtc.h
+++ b/include/drm/drm_crtc.h
@@ -772,6 +772,8 @@ struct drm_mode_config {
 	struct drm_property *edid_property;
 	struct drm_property *dpms_property;
 	struct drm_property *plane_type_property;
+	struct drm_property *plane_maxwidth_property;
+	struct drm_property *plane_maxheight_property;
 
 	/* DVI-I properties */
 	struct drm_property *dvi_i_subconnector_property;
-- 
1.8.5.1



More information about the dri-devel mailing list