mirror of
https://github.com/torvalds/linux.git
synced 2024-11-27 14:41:39 +00:00
drm: drop DRM_IOCTL_MODE_REPLACEFB, add+remove works just as well.
The replace fb ioctl replaces the backing buffer object for a modesetting framebuffer object. This can be acheived by just creating a new framebuffer backed by the new buffer object, setting that for the crtcs in question and then removing the old framebuffer object. Signed-off-by: Kristian Hogsberg <krh@redhat.com> Acked-by: Jakob Bornecrantz <jakob@vmware.com> Signed-off-by: Dave Airlie <airlied@redhat.com>
This commit is contained in:
parent
e0c8463a8b
commit
0c7c266475
@ -2302,46 +2302,6 @@ out:
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
||||
int drm_mode_replacefb(struct drm_device *dev,
|
||||
void *data, struct drm_file *file_priv)
|
||||
{
|
||||
struct drm_mode_fb_cmd *r = data;
|
||||
struct drm_mode_object *obj;
|
||||
struct drm_framebuffer *fb;
|
||||
int found = 0;
|
||||
struct drm_framebuffer *fbl = NULL;
|
||||
int ret = 0;
|
||||
|
||||
/* right replace the current bo attached to this fb with a new bo */
|
||||
mutex_lock(&dev->mode_config.mutex);
|
||||
obj = drm_mode_object_find(dev, r->fb_id, DRM_MODE_OBJECT_FB);
|
||||
if (!obj) {
|
||||
ret = -EINVAL;
|
||||
goto out;
|
||||
}
|
||||
fb = obj_to_fb(obj);
|
||||
|
||||
list_for_each_entry(fbl, &file_priv->fbs, filp_head)
|
||||
if (fb == fbl)
|
||||
found = 1;
|
||||
|
||||
if (!found) {
|
||||
DRM_ERROR("tried to replace an fb we didn't own\n");
|
||||
ret = -EINVAL;
|
||||
goto out;
|
||||
}
|
||||
|
||||
if (dev->mode_config.funcs->resize_fb)
|
||||
ret = dev->mode_config.funcs->resize_fb(dev, file_priv, fb, r);
|
||||
else
|
||||
ret = -EINVAL;
|
||||
out:
|
||||
mutex_unlock(&dev->mode_config.mutex);
|
||||
return ret;
|
||||
|
||||
}
|
||||
|
||||
int drm_mode_connector_attach_encoder(struct drm_connector *connector,
|
||||
struct drm_encoder *encoder)
|
||||
{
|
||||
|
@ -143,7 +143,6 @@ static struct drm_ioctl_desc drm_ioctls[] = {
|
||||
DRM_IOCTL_DEF(DRM_IOCTL_MODE_GETFB, drm_mode_getfb, DRM_MASTER|DRM_CONTROL_ALLOW),
|
||||
DRM_IOCTL_DEF(DRM_IOCTL_MODE_ADDFB, drm_mode_addfb, DRM_MASTER|DRM_CONTROL_ALLOW),
|
||||
DRM_IOCTL_DEF(DRM_IOCTL_MODE_RMFB, drm_mode_rmfb, DRM_MASTER|DRM_CONTROL_ALLOW),
|
||||
DRM_IOCTL_DEF(DRM_IOCTL_MODE_REPLACEFB, drm_mode_replacefb, DRM_MASTER|DRM_ROOT_ONLY|DRM_CONTROL_ALLOW),
|
||||
};
|
||||
|
||||
#define DRM_CORE_IOCTL_COUNT ARRAY_SIZE( drm_ioctls )
|
||||
|
@ -1528,38 +1528,7 @@ intel_user_framebuffer_create(struct drm_device *dev,
|
||||
return fb;
|
||||
}
|
||||
|
||||
static int intel_insert_new_fb(struct drm_device *dev,
|
||||
struct drm_file *file_priv,
|
||||
struct drm_framebuffer *fb,
|
||||
struct drm_mode_fb_cmd *mode_cmd)
|
||||
{
|
||||
struct intel_framebuffer *intel_fb;
|
||||
struct drm_gem_object *obj;
|
||||
struct drm_crtc *crtc;
|
||||
|
||||
intel_fb = to_intel_framebuffer(fb);
|
||||
|
||||
obj = drm_gem_object_lookup(dev, file_priv, mode_cmd->handle);
|
||||
|
||||
if (!obj)
|
||||
return -EINVAL;
|
||||
|
||||
intel_fb->obj = obj;
|
||||
drm_gem_object_unreference(intel_fb->obj);
|
||||
drm_helper_mode_fill_fb_struct(fb, mode_cmd);
|
||||
mutex_unlock(&dev->struct_mutex);
|
||||
|
||||
list_for_each_entry(crtc, &dev->mode_config.crtc_list, head) {
|
||||
if (crtc->fb == fb) {
|
||||
struct drm_crtc_helper_funcs *crtc_funcs = crtc->helper_private;
|
||||
crtc_funcs->mode_set_base(crtc, crtc->x, crtc->y);
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
static const struct drm_mode_config_funcs intel_mode_funcs = {
|
||||
.resize_fb = intel_insert_new_fb,
|
||||
.fb_create = intel_user_framebuffer_create,
|
||||
.fb_changed = intelfb_probe,
|
||||
};
|
||||
|
@ -687,7 +687,6 @@ struct drm_gem_open {
|
||||
#define DRM_IOCTL_MODE_GETFB DRM_IOWR(0xAD, struct drm_mode_fb_cmd)
|
||||
#define DRM_IOCTL_MODE_ADDFB DRM_IOWR(0xAE, struct drm_mode_fb_cmd)
|
||||
#define DRM_IOCTL_MODE_RMFB DRM_IOWR(0xAF, unsigned int)
|
||||
#define DRM_IOCTL_MODE_REPLACEFB DRM_IOWR(0xB0, struct drm_mode_fb_cmd)
|
||||
|
||||
/**
|
||||
* Device specific ioctls should only be in their respective headers
|
||||
|
@ -510,7 +510,6 @@ struct drm_mode_set {
|
||||
* the CRTC<->connector mappings as needed and update its view of the screen.
|
||||
*/
|
||||
struct drm_mode_config_funcs {
|
||||
int (*resize_fb)(struct drm_device *dev, struct drm_file *file_priv, struct drm_framebuffer *fb, struct drm_mode_fb_cmd *mode_cmd);
|
||||
struct drm_framebuffer *(*fb_create)(struct drm_device *dev, struct drm_file *file_priv, struct drm_mode_fb_cmd *mode_cmd);
|
||||
int (*fb_changed)(struct drm_device *dev);
|
||||
};
|
||||
|
Loading…
Reference in New Issue
Block a user