|
@@ -1169,6 +1169,7 @@ int drm_universal_plane_init(struct drm_device *dev, struct drm_plane *plane,
|
|
|
const uint32_t *formats, uint32_t format_count,
|
|
|
enum drm_plane_type type)
|
|
|
{
|
|
|
+ struct drm_mode_config *config = &dev->mode_config;
|
|
|
int ret;
|
|
|
|
|
|
ret = drm_mode_object_get(dev, &plane->base, DRM_MODE_OBJECT_PLANE);
|
|
@@ -1193,15 +1194,28 @@ int drm_universal_plane_init(struct drm_device *dev, struct drm_plane *plane,
|
|
|
plane->possible_crtcs = possible_crtcs;
|
|
|
plane->type = type;
|
|
|
|
|
|
- list_add_tail(&plane->head, &dev->mode_config.plane_list);
|
|
|
- dev->mode_config.num_total_plane++;
|
|
|
+ list_add_tail(&plane->head, &config->plane_list);
|
|
|
+ config->num_total_plane++;
|
|
|
if (plane->type == DRM_PLANE_TYPE_OVERLAY)
|
|
|
- dev->mode_config.num_overlay_plane++;
|
|
|
+ config->num_overlay_plane++;
|
|
|
|
|
|
drm_object_attach_property(&plane->base,
|
|
|
- dev->mode_config.plane_type_property,
|
|
|
+ config->plane_type_property,
|
|
|
plane->type);
|
|
|
|
|
|
+ if (drm_core_check_feature(dev, DRIVER_ATOMIC)) {
|
|
|
+ drm_object_attach_property(&plane->base, config->prop_fb_id, 0);
|
|
|
+ drm_object_attach_property(&plane->base, config->prop_crtc_id, 0);
|
|
|
+ drm_object_attach_property(&plane->base, config->prop_crtc_x, 0);
|
|
|
+ drm_object_attach_property(&plane->base, config->prop_crtc_y, 0);
|
|
|
+ drm_object_attach_property(&plane->base, config->prop_crtc_w, 0);
|
|
|
+ drm_object_attach_property(&plane->base, config->prop_crtc_h, 0);
|
|
|
+ drm_object_attach_property(&plane->base, config->prop_src_x, 0);
|
|
|
+ drm_object_attach_property(&plane->base, config->prop_src_y, 0);
|
|
|
+ drm_object_attach_property(&plane->base, config->prop_src_w, 0);
|
|
|
+ drm_object_attach_property(&plane->base, config->prop_src_h, 0);
|
|
|
+ }
|
|
|
+
|
|
|
return 0;
|
|
|
}
|
|
|
EXPORT_SYMBOL(drm_universal_plane_init);
|
|
@@ -1323,7 +1337,7 @@ void drm_plane_force_disable(struct drm_plane *plane)
|
|
|
}
|
|
|
EXPORT_SYMBOL(drm_plane_force_disable);
|
|
|
|
|
|
-static int drm_mode_create_standard_connector_properties(struct drm_device *dev)
|
|
|
+static int drm_mode_create_standard_properties(struct drm_device *dev)
|
|
|
{
|
|
|
struct drm_property *prop;
|
|
|
|
|
@@ -1360,20 +1374,72 @@ static int drm_mode_create_standard_connector_properties(struct drm_device *dev)
|
|
|
return -ENOMEM;
|
|
|
dev->mode_config.tile_property = prop;
|
|
|
|
|
|
- return 0;
|
|
|
-}
|
|
|
-
|
|
|
-static int drm_mode_create_standard_plane_properties(struct drm_device *dev)
|
|
|
-{
|
|
|
- struct drm_property *type;
|
|
|
-
|
|
|
- /*
|
|
|
- * Standard properties (apply to all planes)
|
|
|
- */
|
|
|
- type = drm_property_create_enum(dev, DRM_MODE_PROP_IMMUTABLE,
|
|
|
+ prop = drm_property_create_enum(dev, DRM_MODE_PROP_IMMUTABLE,
|
|
|
"type", drm_plane_type_enum_list,
|
|
|
ARRAY_SIZE(drm_plane_type_enum_list));
|
|
|
- dev->mode_config.plane_type_property = type;
|
|
|
+ if (!prop)
|
|
|
+ return -ENOMEM;
|
|
|
+ dev->mode_config.plane_type_property = prop;
|
|
|
+
|
|
|
+ prop = drm_property_create_range(dev, DRM_MODE_PROP_ATOMIC,
|
|
|
+ "SRC_X", 0, UINT_MAX);
|
|
|
+ if (!prop)
|
|
|
+ return -ENOMEM;
|
|
|
+ dev->mode_config.prop_src_x = prop;
|
|
|
+
|
|
|
+ prop = drm_property_create_range(dev, DRM_MODE_PROP_ATOMIC,
|
|
|
+ "SRC_Y", 0, UINT_MAX);
|
|
|
+ if (!prop)
|
|
|
+ return -ENOMEM;
|
|
|
+ dev->mode_config.prop_src_y = prop;
|
|
|
+
|
|
|
+ prop = drm_property_create_range(dev, DRM_MODE_PROP_ATOMIC,
|
|
|
+ "SRC_W", 0, UINT_MAX);
|
|
|
+ if (!prop)
|
|
|
+ return -ENOMEM;
|
|
|
+ dev->mode_config.prop_src_w = prop;
|
|
|
+
|
|
|
+ prop = drm_property_create_range(dev, DRM_MODE_PROP_ATOMIC,
|
|
|
+ "SRC_H", 0, UINT_MAX);
|
|
|
+ if (!prop)
|
|
|
+ return -ENOMEM;
|
|
|
+ dev->mode_config.prop_src_h = prop;
|
|
|
+
|
|
|
+ prop = drm_property_create_signed_range(dev, DRM_MODE_PROP_ATOMIC,
|
|
|
+ "CRTC_X", INT_MIN, INT_MAX);
|
|
|
+ if (!prop)
|
|
|
+ return -ENOMEM;
|
|
|
+ dev->mode_config.prop_crtc_x = prop;
|
|
|
+
|
|
|
+ prop = drm_property_create_signed_range(dev, DRM_MODE_PROP_ATOMIC,
|
|
|
+ "CRTC_Y", INT_MIN, INT_MAX);
|
|
|
+ if (!prop)
|
|
|
+ return -ENOMEM;
|
|
|
+ dev->mode_config.prop_crtc_y = prop;
|
|
|
+
|
|
|
+ prop = drm_property_create_range(dev, DRM_MODE_PROP_ATOMIC,
|
|
|
+ "CRTC_W", 0, INT_MAX);
|
|
|
+ if (!prop)
|
|
|
+ return -ENOMEM;
|
|
|
+ dev->mode_config.prop_crtc_w = prop;
|
|
|
+
|
|
|
+ prop = drm_property_create_range(dev, DRM_MODE_PROP_ATOMIC,
|
|
|
+ "CRTC_H", 0, INT_MAX);
|
|
|
+ if (!prop)
|
|
|
+ return -ENOMEM;
|
|
|
+ dev->mode_config.prop_crtc_h = prop;
|
|
|
+
|
|
|
+ prop = drm_property_create_object(dev, DRM_MODE_PROP_ATOMIC,
|
|
|
+ "FB_ID", DRM_MODE_OBJECT_FB);
|
|
|
+ if (!prop)
|
|
|
+ return -ENOMEM;
|
|
|
+ dev->mode_config.prop_fb_id = prop;
|
|
|
+
|
|
|
+ prop = drm_property_create_object(dev, DRM_MODE_PROP_ATOMIC,
|
|
|
+ "CRTC_ID", DRM_MODE_OBJECT_CRTC);
|
|
|
+ if (!prop)
|
|
|
+ return -ENOMEM;
|
|
|
+ dev->mode_config.prop_crtc_id = prop;
|
|
|
|
|
|
return 0;
|
|
|
}
|
|
@@ -5264,8 +5330,7 @@ void drm_mode_config_init(struct drm_device *dev)
|
|
|
idr_init(&dev->mode_config.tile_idr);
|
|
|
|
|
|
drm_modeset_lock_all(dev);
|
|
|
- drm_mode_create_standard_connector_properties(dev);
|
|
|
- drm_mode_create_standard_plane_properties(dev);
|
|
|
+ drm_mode_create_standard_properties(dev);
|
|
|
drm_modeset_unlock_all(dev);
|
|
|
|
|
|
/* Just to be sure */
|