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)
{
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 )
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,
};
#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
* 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);
};