diff options
| -rw-r--r-- | drivers/gpu/drm/drm_crtc.c | 35 |
1 files changed, 19 insertions, 16 deletions
diff --git a/drivers/gpu/drm/drm_crtc.c b/drivers/gpu/drm/drm_crtc.c index 6b6b07ff720b..f6d04c7b5115 100644 --- a/drivers/gpu/drm/drm_crtc.c +++ b/drivers/gpu/drm/drm_crtc.c | |||
| @@ -43,9 +43,10 @@ | |||
| 43 | #include "drm_crtc_internal.h" | 43 | #include "drm_crtc_internal.h" |
| 44 | #include "drm_internal.h" | 44 | #include "drm_internal.h" |
| 45 | 45 | ||
| 46 | static struct drm_framebuffer *add_framebuffer_internal(struct drm_device *dev, | 46 | static struct drm_framebuffer * |
| 47 | struct drm_mode_fb_cmd2 *r, | 47 | internal_framebuffer_create(struct drm_device *dev, |
| 48 | struct drm_file *file_priv); | 48 | struct drm_mode_fb_cmd2 *r, |
| 49 | struct drm_file *file_priv); | ||
| 49 | 50 | ||
| 50 | /* Avoid boilerplate. I'm tired of typing. */ | 51 | /* Avoid boilerplate. I'm tired of typing. */ |
| 51 | #define DRM_ENUM_NAME_FN(fnname, list) \ | 52 | #define DRM_ENUM_NAME_FN(fnname, list) \ |
| @@ -2908,13 +2909,11 @@ static int drm_mode_cursor_universal(struct drm_crtc *crtc, | |||
| 2908 | */ | 2909 | */ |
| 2909 | if (req->flags & DRM_MODE_CURSOR_BO) { | 2910 | if (req->flags & DRM_MODE_CURSOR_BO) { |
| 2910 | if (req->handle) { | 2911 | if (req->handle) { |
| 2911 | fb = add_framebuffer_internal(dev, &fbreq, file_priv); | 2912 | fb = internal_framebuffer_create(dev, &fbreq, file_priv); |
| 2912 | if (IS_ERR(fb)) { | 2913 | if (IS_ERR(fb)) { |
| 2913 | DRM_DEBUG_KMS("failed to wrap cursor buffer in drm framebuffer\n"); | 2914 | DRM_DEBUG_KMS("failed to wrap cursor buffer in drm framebuffer\n"); |
| 2914 | return PTR_ERR(fb); | 2915 | return PTR_ERR(fb); |
| 2915 | } | 2916 | } |
| 2916 | |||
| 2917 | drm_framebuffer_reference(fb); | ||
| 2918 | } else { | 2917 | } else { |
| 2919 | fb = NULL; | 2918 | fb = NULL; |
| 2920 | } | 2919 | } |
| @@ -3267,9 +3266,10 @@ static int framebuffer_check(const struct drm_mode_fb_cmd2 *r) | |||
| 3267 | return 0; | 3266 | return 0; |
| 3268 | } | 3267 | } |
| 3269 | 3268 | ||
| 3270 | static struct drm_framebuffer *add_framebuffer_internal(struct drm_device *dev, | 3269 | static struct drm_framebuffer * |
| 3271 | struct drm_mode_fb_cmd2 *r, | 3270 | internal_framebuffer_create(struct drm_device *dev, |
| 3272 | struct drm_file *file_priv) | 3271 | struct drm_mode_fb_cmd2 *r, |
| 3272 | struct drm_file *file_priv) | ||
| 3273 | { | 3273 | { |
| 3274 | struct drm_mode_config *config = &dev->mode_config; | 3274 | struct drm_mode_config *config = &dev->mode_config; |
| 3275 | struct drm_framebuffer *fb; | 3275 | struct drm_framebuffer *fb; |
| @@ -3301,12 +3301,6 @@ static struct drm_framebuffer *add_framebuffer_internal(struct drm_device *dev, | |||
| 3301 | return fb; | 3301 | return fb; |
| 3302 | } | 3302 | } |
| 3303 | 3303 | ||
| 3304 | mutex_lock(&file_priv->fbs_lock); | ||
| 3305 | r->fb_id = fb->base.id; | ||
| 3306 | list_add(&fb->filp_head, &file_priv->fbs); | ||
| 3307 | DRM_DEBUG_KMS("[FB:%d]\n", fb->base.id); | ||
| 3308 | mutex_unlock(&file_priv->fbs_lock); | ||
| 3309 | |||
| 3310 | return fb; | 3304 | return fb; |
| 3311 | } | 3305 | } |
| 3312 | 3306 | ||
| @@ -3328,15 +3322,24 @@ static struct drm_framebuffer *add_framebuffer_internal(struct drm_device *dev, | |||
| 3328 | int drm_mode_addfb2(struct drm_device *dev, | 3322 | int drm_mode_addfb2(struct drm_device *dev, |
| 3329 | void *data, struct drm_file *file_priv) | 3323 | void *data, struct drm_file *file_priv) |
| 3330 | { | 3324 | { |
| 3325 | struct drm_mode_fb_cmd2 *r = data; | ||
| 3331 | struct drm_framebuffer *fb; | 3326 | struct drm_framebuffer *fb; |
| 3332 | 3327 | ||
| 3333 | if (!drm_core_check_feature(dev, DRIVER_MODESET)) | 3328 | if (!drm_core_check_feature(dev, DRIVER_MODESET)) |
| 3334 | return -EINVAL; | 3329 | return -EINVAL; |
| 3335 | 3330 | ||
| 3336 | fb = add_framebuffer_internal(dev, data, file_priv); | 3331 | fb = internal_framebuffer_create(dev, r, file_priv); |
| 3337 | if (IS_ERR(fb)) | 3332 | if (IS_ERR(fb)) |
| 3338 | return PTR_ERR(fb); | 3333 | return PTR_ERR(fb); |
| 3339 | 3334 | ||
| 3335 | /* Transfer ownership to the filp for reaping on close */ | ||
| 3336 | |||
| 3337 | DRM_DEBUG_KMS("[FB:%d]\n", fb->base.id); | ||
| 3338 | mutex_lock(&file_priv->fbs_lock); | ||
| 3339 | r->fb_id = fb->base.id; | ||
| 3340 | list_add(&fb->filp_head, &file_priv->fbs); | ||
| 3341 | mutex_unlock(&file_priv->fbs_lock); | ||
| 3342 | |||
| 3340 | return 0; | 3343 | return 0; |
| 3341 | } | 3344 | } |
| 3342 | 3345 | ||
