aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/drm_crtc.c
diff options
context:
space:
mode:
authorRob Clark <robdclark@gmail.com>2014-12-18 16:01:53 -0500
committerDaniel Vetter <daniel.vetter@ffwll.ch>2015-01-05 07:55:28 -0500
commit6b4959f43a04e12d39c5700607727f2cbcfeac31 (patch)
treed74d04b2ef62bdda5e3f588e719d742fe3d18bc7 /drivers/gpu/drm/drm_crtc.c
parent356af0e154467eb6844f25631a11940b462deca0 (diff)
drm/atomic: atomic plane properties
Expose the core plane state as properties, so they can be updated via atomic ioctl. v2: atomic property flag Signed-off-by: Rob Clark <robdclark@gmail.com> Reviewed-by: Sean Paul <seanpaul@chromium.org> Reviewed-by: Daniel Vetter <daniel.vetter@ffwll.ch> Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
Diffstat (limited to 'drivers/gpu/drm/drm_crtc.c')
-rw-r--r--drivers/gpu/drm/drm_crtc.c103
1 files changed, 84 insertions, 19 deletions
diff --git a/drivers/gpu/drm/drm_crtc.c b/drivers/gpu/drm/drm_crtc.c
index f33863a40d42..46fa0945b53e 100644
--- a/drivers/gpu/drm/drm_crtc.c
+++ b/drivers/gpu/drm/drm_crtc.c
@@ -1169,6 +1169,7 @@ int drm_universal_plane_init(struct drm_device *dev, struct drm_plane *plane,
1169 const uint32_t *formats, uint32_t format_count, 1169 const uint32_t *formats, uint32_t format_count,
1170 enum drm_plane_type type) 1170 enum drm_plane_type type)
1171{ 1171{
1172 struct drm_mode_config *config = &dev->mode_config;
1172 int ret; 1173 int ret;
1173 1174
1174 ret = drm_mode_object_get(dev, &plane->base, DRM_MODE_OBJECT_PLANE); 1175 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,
1193 plane->possible_crtcs = possible_crtcs; 1194 plane->possible_crtcs = possible_crtcs;
1194 plane->type = type; 1195 plane->type = type;
1195 1196
1196 list_add_tail(&plane->head, &dev->mode_config.plane_list); 1197 list_add_tail(&plane->head, &config->plane_list);
1197 dev->mode_config.num_total_plane++; 1198 config->num_total_plane++;
1198 if (plane->type == DRM_PLANE_TYPE_OVERLAY) 1199 if (plane->type == DRM_PLANE_TYPE_OVERLAY)
1199 dev->mode_config.num_overlay_plane++; 1200 config->num_overlay_plane++;
1200 1201
1201 drm_object_attach_property(&plane->base, 1202 drm_object_attach_property(&plane->base,
1202 dev->mode_config.plane_type_property, 1203 config->plane_type_property,
1203 plane->type); 1204 plane->type);
1204 1205
1206 if (drm_core_check_feature(dev, DRIVER_ATOMIC)) {
1207 drm_object_attach_property(&plane->base, config->prop_fb_id, 0);
1208 drm_object_attach_property(&plane->base, config->prop_crtc_id, 0);
1209 drm_object_attach_property(&plane->base, config->prop_crtc_x, 0);
1210 drm_object_attach_property(&plane->base, config->prop_crtc_y, 0);
1211 drm_object_attach_property(&plane->base, config->prop_crtc_w, 0);
1212 drm_object_attach_property(&plane->base, config->prop_crtc_h, 0);
1213 drm_object_attach_property(&plane->base, config->prop_src_x, 0);
1214 drm_object_attach_property(&plane->base, config->prop_src_y, 0);
1215 drm_object_attach_property(&plane->base, config->prop_src_w, 0);
1216 drm_object_attach_property(&plane->base, config->prop_src_h, 0);
1217 }
1218
1205 return 0; 1219 return 0;
1206} 1220}
1207EXPORT_SYMBOL(drm_universal_plane_init); 1221EXPORT_SYMBOL(drm_universal_plane_init);
@@ -1323,7 +1337,7 @@ void drm_plane_force_disable(struct drm_plane *plane)
1323} 1337}
1324EXPORT_SYMBOL(drm_plane_force_disable); 1338EXPORT_SYMBOL(drm_plane_force_disable);
1325 1339
1326static int drm_mode_create_standard_connector_properties(struct drm_device *dev) 1340static int drm_mode_create_standard_properties(struct drm_device *dev)
1327{ 1341{
1328 struct drm_property *prop; 1342 struct drm_property *prop;
1329 1343
@@ -1360,20 +1374,72 @@ static int drm_mode_create_standard_connector_properties(struct drm_device *dev)
1360 return -ENOMEM; 1374 return -ENOMEM;
1361 dev->mode_config.tile_property = prop; 1375 dev->mode_config.tile_property = prop;
1362 1376
1363 return 0; 1377 prop = drm_property_create_enum(dev, DRM_MODE_PROP_IMMUTABLE,
1364}
1365
1366static int drm_mode_create_standard_plane_properties(struct drm_device *dev)
1367{
1368 struct drm_property *type;
1369
1370 /*
1371 * Standard properties (apply to all planes)
1372 */
1373 type = drm_property_create_enum(dev, DRM_MODE_PROP_IMMUTABLE,
1374 "type", drm_plane_type_enum_list, 1378 "type", drm_plane_type_enum_list,
1375 ARRAY_SIZE(drm_plane_type_enum_list)); 1379 ARRAY_SIZE(drm_plane_type_enum_list));
1376 dev->mode_config.plane_type_property = type; 1380 if (!prop)
1381 return -ENOMEM;
1382 dev->mode_config.plane_type_property = prop;
1383
1384 prop = drm_property_create_range(dev, DRM_MODE_PROP_ATOMIC,
1385 "SRC_X", 0, UINT_MAX);
1386 if (!prop)
1387 return -ENOMEM;
1388 dev->mode_config.prop_src_x = prop;
1389
1390 prop = drm_property_create_range(dev, DRM_MODE_PROP_ATOMIC,
1391 "SRC_Y", 0, UINT_MAX);
1392 if (!prop)
1393 return -ENOMEM;
1394 dev->mode_config.prop_src_y = prop;
1395
1396 prop = drm_property_create_range(dev, DRM_MODE_PROP_ATOMIC,
1397 "SRC_W", 0, UINT_MAX);
1398 if (!prop)
1399 return -ENOMEM;
1400 dev->mode_config.prop_src_w = prop;
1401
1402 prop = drm_property_create_range(dev, DRM_MODE_PROP_ATOMIC,
1403 "SRC_H", 0, UINT_MAX);
1404 if (!prop)
1405 return -ENOMEM;
1406 dev->mode_config.prop_src_h = prop;
1407
1408 prop = drm_property_create_signed_range(dev, DRM_MODE_PROP_ATOMIC,
1409 "CRTC_X", INT_MIN, INT_MAX);
1410 if (!prop)
1411 return -ENOMEM;
1412 dev->mode_config.prop_crtc_x = prop;
1413
1414 prop = drm_property_create_signed_range(dev, DRM_MODE_PROP_ATOMIC,
1415 "CRTC_Y", INT_MIN, INT_MAX);
1416 if (!prop)
1417 return -ENOMEM;
1418 dev->mode_config.prop_crtc_y = prop;
1419
1420 prop = drm_property_create_range(dev, DRM_MODE_PROP_ATOMIC,
1421 "CRTC_W", 0, INT_MAX);
1422 if (!prop)
1423 return -ENOMEM;
1424 dev->mode_config.prop_crtc_w = prop;
1425
1426 prop = drm_property_create_range(dev, DRM_MODE_PROP_ATOMIC,
1427 "CRTC_H", 0, INT_MAX);
1428 if (!prop)
1429 return -ENOMEM;
1430 dev->mode_config.prop_crtc_h = prop;
1431
1432 prop = drm_property_create_object(dev, DRM_MODE_PROP_ATOMIC,
1433 "FB_ID", DRM_MODE_OBJECT_FB);
1434 if (!prop)
1435 return -ENOMEM;
1436 dev->mode_config.prop_fb_id = prop;
1437
1438 prop = drm_property_create_object(dev, DRM_MODE_PROP_ATOMIC,
1439 "CRTC_ID", DRM_MODE_OBJECT_CRTC);
1440 if (!prop)
1441 return -ENOMEM;
1442 dev->mode_config.prop_crtc_id = prop;
1377 1443
1378 return 0; 1444 return 0;
1379} 1445}
@@ -5264,8 +5330,7 @@ void drm_mode_config_init(struct drm_device *dev)
5264 idr_init(&dev->mode_config.tile_idr); 5330 idr_init(&dev->mode_config.tile_idr);
5265 5331
5266 drm_modeset_lock_all(dev); 5332 drm_modeset_lock_all(dev);
5267 drm_mode_create_standard_connector_properties(dev); 5333 drm_mode_create_standard_properties(dev);
5268 drm_mode_create_standard_plane_properties(dev);
5269 drm_modeset_unlock_all(dev); 5334 drm_modeset_unlock_all(dev);
5270 5335
5271 /* Just to be sure */ 5336 /* Just to be sure */