diff options
author | Rob Clark <robdclark@gmail.com> | 2014-12-18 16:01:53 -0500 |
---|---|---|
committer | Daniel Vetter <daniel.vetter@ffwll.ch> | 2015-01-05 07:55:28 -0500 |
commit | 6b4959f43a04e12d39c5700607727f2cbcfeac31 (patch) | |
tree | d74d04b2ef62bdda5e3f588e719d742fe3d18bc7 /drivers/gpu/drm/drm_crtc.c | |
parent | 356af0e154467eb6844f25631a11940b462deca0 (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.c | 103 |
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 | } |
1207 | EXPORT_SYMBOL(drm_universal_plane_init); | 1221 | EXPORT_SYMBOL(drm_universal_plane_init); |
@@ -1323,7 +1337,7 @@ void drm_plane_force_disable(struct drm_plane *plane) | |||
1323 | } | 1337 | } |
1324 | EXPORT_SYMBOL(drm_plane_force_disable); | 1338 | EXPORT_SYMBOL(drm_plane_force_disable); |
1325 | 1339 | ||
1326 | static int drm_mode_create_standard_connector_properties(struct drm_device *dev) | 1340 | static 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 | |||
1366 | static 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 */ |