diff options
author | Matt Roper <matthew.d.roper@intel.com> | 2014-04-01 18:22:30 -0400 |
---|---|---|
committer | Rob Clark <robdclark@gmail.com> | 2014-04-01 19:13:07 -0400 |
commit | e27dde3e1c5117149c50b89d688528e279756113 (patch) | |
tree | f8af6af4b70125256c657317b6192a7183ec8157 /drivers | |
parent | c32fc9c803f8ed90a7548810de48ca33a3020168 (diff) |
drm: Add support for multiple plane types (v2)
The DRM core currently only tracks "overlay"-style planes. Start
refactoring the plane handling to allow other plane types (primary and
cursor) to also be placed on the DRM plane list.
v2: Add drm_for_each_legacy_plane() iterator to smooth transition
of drivers with plane loops.
Signed-off-by: Matt Roper <matthew.d.roper@intel.com>
Reviewed-by: Rob Clark <robdclark@gmail.com>
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/gpu/drm/drm_crtc.c | 21 | ||||
-rw-r--r-- | drivers/gpu/drm/drm_fb_helper.c | 3 |
2 files changed, 18 insertions, 6 deletions
diff --git a/drivers/gpu/drm/drm_crtc.c b/drivers/gpu/drm/drm_crtc.c index 960ca987c20f..7def92b8acc2 100644 --- a/drivers/gpu/drm/drm_crtc.c +++ b/drivers/gpu/drm/drm_crtc.c | |||
@@ -1044,6 +1044,7 @@ int drm_plane_init(struct drm_device *dev, struct drm_plane *plane, | |||
1044 | memcpy(plane->format_types, formats, format_count * sizeof(uint32_t)); | 1044 | memcpy(plane->format_types, formats, format_count * sizeof(uint32_t)); |
1045 | plane->format_count = format_count; | 1045 | plane->format_count = format_count; |
1046 | plane->possible_crtcs = possible_crtcs; | 1046 | plane->possible_crtcs = possible_crtcs; |
1047 | plane->type = DRM_PLANE_TYPE_OVERLAY; | ||
1047 | 1048 | ||
1048 | /* private planes are not exposed to userspace, but depending on | 1049 | /* private planes are not exposed to userspace, but depending on |
1049 | * display hardware, might be convenient to allow sharing programming | 1050 | * display hardware, might be convenient to allow sharing programming |
@@ -1051,7 +1052,9 @@ int drm_plane_init(struct drm_device *dev, struct drm_plane *plane, | |||
1051 | */ | 1052 | */ |
1052 | if (!priv) { | 1053 | if (!priv) { |
1053 | list_add_tail(&plane->head, &dev->mode_config.plane_list); | 1054 | list_add_tail(&plane->head, &dev->mode_config.plane_list); |
1054 | dev->mode_config.num_plane++; | 1055 | dev->mode_config.num_total_plane++; |
1056 | if (plane->type == DRM_PLANE_TYPE_OVERLAY) | ||
1057 | dev->mode_config.num_overlay_plane++; | ||
1055 | } else { | 1058 | } else { |
1056 | INIT_LIST_HEAD(&plane->head); | 1059 | INIT_LIST_HEAD(&plane->head); |
1057 | } | 1060 | } |
@@ -1081,7 +1084,9 @@ void drm_plane_cleanup(struct drm_plane *plane) | |||
1081 | /* if not added to a list, it must be a private plane */ | 1084 | /* if not added to a list, it must be a private plane */ |
1082 | if (!list_empty(&plane->head)) { | 1085 | if (!list_empty(&plane->head)) { |
1083 | list_del(&plane->head); | 1086 | list_del(&plane->head); |
1084 | dev->mode_config.num_plane--; | 1087 | dev->mode_config.num_total_plane--; |
1088 | if (plane->type == DRM_PLANE_TYPE_OVERLAY) | ||
1089 | dev->mode_config.num_overlay_plane--; | ||
1085 | } | 1090 | } |
1086 | drm_modeset_unlock_all(dev); | 1091 | drm_modeset_unlock_all(dev); |
1087 | } | 1092 | } |
@@ -1908,11 +1913,15 @@ int drm_mode_getplane_res(struct drm_device *dev, void *data, | |||
1908 | * This ioctl is called twice, once to determine how much space is | 1913 | * This ioctl is called twice, once to determine how much space is |
1909 | * needed, and the 2nd time to fill it. | 1914 | * needed, and the 2nd time to fill it. |
1910 | */ | 1915 | */ |
1911 | if (config->num_plane && | 1916 | if (config->num_overlay_plane && |
1912 | (plane_resp->count_planes >= config->num_plane)) { | 1917 | (plane_resp->count_planes >= config->num_overlay_plane)) { |
1913 | plane_ptr = (uint32_t __user *)(unsigned long)plane_resp->plane_id_ptr; | 1918 | plane_ptr = (uint32_t __user *)(unsigned long)plane_resp->plane_id_ptr; |
1914 | 1919 | ||
1915 | list_for_each_entry(plane, &config->plane_list, head) { | 1920 | list_for_each_entry(plane, &config->plane_list, head) { |
1921 | /* Only advertise overlays to userspace for now. */ | ||
1922 | if (plane->type != DRM_PLANE_TYPE_OVERLAY) | ||
1923 | continue; | ||
1924 | |||
1916 | if (put_user(plane->base.id, plane_ptr + copied)) { | 1925 | if (put_user(plane->base.id, plane_ptr + copied)) { |
1917 | ret = -EFAULT; | 1926 | ret = -EFAULT; |
1918 | goto out; | 1927 | goto out; |
@@ -1920,7 +1929,7 @@ int drm_mode_getplane_res(struct drm_device *dev, void *data, | |||
1920 | copied++; | 1929 | copied++; |
1921 | } | 1930 | } |
1922 | } | 1931 | } |
1923 | plane_resp->count_planes = config->num_plane; | 1932 | plane_resp->count_planes = config->num_overlay_plane; |
1924 | 1933 | ||
1925 | out: | 1934 | out: |
1926 | drm_modeset_unlock_all(dev); | 1935 | drm_modeset_unlock_all(dev); |
@@ -4534,6 +4543,8 @@ void drm_mode_config_init(struct drm_device *dev) | |||
4534 | dev->mode_config.num_connector = 0; | 4543 | dev->mode_config.num_connector = 0; |
4535 | dev->mode_config.num_crtc = 0; | 4544 | dev->mode_config.num_crtc = 0; |
4536 | dev->mode_config.num_encoder = 0; | 4545 | dev->mode_config.num_encoder = 0; |
4546 | dev->mode_config.num_overlay_plane = 0; | ||
4547 | dev->mode_config.num_total_plane = 0; | ||
4537 | } | 4548 | } |
4538 | EXPORT_SYMBOL(drm_mode_config_init); | 4549 | EXPORT_SYMBOL(drm_mode_config_init); |
4539 | 4550 | ||
diff --git a/drivers/gpu/drm/drm_fb_helper.c b/drivers/gpu/drm/drm_fb_helper.c index 16f271e21b9c..f30bf7b723d5 100644 --- a/drivers/gpu/drm/drm_fb_helper.c +++ b/drivers/gpu/drm/drm_fb_helper.c | |||
@@ -291,7 +291,8 @@ bool drm_fb_helper_restore_fbdev_mode(struct drm_fb_helper *fb_helper) | |||
291 | drm_warn_on_modeset_not_all_locked(dev); | 291 | drm_warn_on_modeset_not_all_locked(dev); |
292 | 292 | ||
293 | list_for_each_entry(plane, &dev->mode_config.plane_list, head) | 293 | list_for_each_entry(plane, &dev->mode_config.plane_list, head) |
294 | drm_plane_force_disable(plane); | 294 | if (plane->type != DRM_PLANE_TYPE_PRIMARY) |
295 | drm_plane_force_disable(plane); | ||
295 | 296 | ||
296 | for (i = 0; i < fb_helper->crtc_count; i++) { | 297 | for (i = 0; i < fb_helper->crtc_count; i++) { |
297 | struct drm_mode_set *mode_set = &fb_helper->crtc_info[i].mode_set; | 298 | struct drm_mode_set *mode_set = &fb_helper->crtc_info[i].mode_set; |