Update intel modesetting to use mm_private instead of mm_handle.

main
Kristian Høgsberg 2008-09-23 16:52:06 +10:00 committed by Dave Airlie
parent 0130aa0de9
commit 840c9a3054
3 changed files with 43 additions and 28 deletions

View File

@ -370,6 +370,7 @@ intel_pipe_set_base(struct drm_crtc *crtc, int x, int y)
struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
struct intel_framebuffer *intel_fb;
struct drm_i915_gem_object *obj_priv;
struct drm_gem_object *obj;
int pipe = intel_crtc->pipe;
unsigned long Start, Offset;
int dspbase = (pipe == 0 ? DSPAADDR : DSPBADDR);
@ -386,7 +387,8 @@ intel_pipe_set_base(struct drm_crtc *crtc, int x, int y)
intel_fb = to_intel_framebuffer(crtc->fb);
obj_priv = intel_fb->obj->driver_private;
obj = intel_fb->base.mm_private;
obj_priv = obj->driver_private;
Start = obj_priv->gtt_offset;
Offset = y * crtc->fb->pitch + x * (crtc->fb->bits_per_pixel / 8);
@ -1481,21 +1483,34 @@ static void intel_user_framebuffer_destroy(struct drm_framebuffer *fb)
{
struct intel_framebuffer *intel_fb = to_intel_framebuffer(fb);
struct drm_device *dev = fb->dev;
if (fb->fbdev)
intelfb_remove(dev, fb);
drm_framebuffer_cleanup(fb);
drm_gem_object_unreference(fb->mm_private);
kfree(intel_fb);
}
static int intel_user_framebuffer_create_handle(struct drm_framebuffer *fb,
struct drm_file *file_priv,
unsigned int *handle)
{
struct drm_gem_object *object = fb->mm_private;
return drm_gem_handle_create(file_priv, object, handle);
}
static const struct drm_framebuffer_funcs intel_fb_funcs = {
.destroy = intel_user_framebuffer_destroy,
.create_handle = intel_user_framebuffer_create_handle,
};
struct drm_framebuffer *intel_user_framebuffer_create(struct drm_device *dev,
struct drm_file *filp,
struct drm_mode_fb_cmd *mode_cmd)
struct drm_framebuffer *
intel_framebuffer_create(struct drm_device *dev,
struct drm_mode_fb_cmd *mode_cmd,
void *mm_private)
{
struct intel_framebuffer *intel_fb;
@ -1506,20 +1521,26 @@ struct drm_framebuffer *intel_user_framebuffer_create(struct drm_device *dev,
if (!drm_framebuffer_init(dev, &intel_fb->base, &intel_fb_funcs))
return NULL;
drm_helper_mode_fill_fb_struct(&intel_fb->base, mode_cmd);
drm_helper_mode_fill_fb_struct(&intel_fb->base, mode_cmd, mm_private);
if (filp) {
intel_fb->obj = drm_gem_object_lookup(dev, filp,
mode_cmd->handle);
if (!intel_fb->obj) {
kfree(intel_fb);
return NULL;
}
}
drm_gem_object_unreference(intel_fb->obj);
return &intel_fb->base;
}
static struct drm_framebuffer *
intel_user_framebuffer_create(struct drm_device *dev,
struct drm_file *filp,
struct drm_mode_fb_cmd *mode_cmd)
{
struct drm_gem_object *obj;
obj = drm_gem_object_lookup(dev, filp, mode_cmd->handle);
if (!obj)
return NULL;
return intel_framebuffer_create(dev, mode_cmd, obj);
}
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)
{
@ -1536,14 +1557,10 @@ static int intel_insert_new_fb(struct drm_device *dev, struct drm_file *file_pri
mutex_unlock(&dev->struct_mutex);
return -EINVAL;
}
drm_helper_mode_fill_fb_struct(fb, mode_cmd);
drm_gem_object_unreference(intel_fb->obj);
drm_gem_object_unreference(obj);
drm_gem_object_unreference(intel_fb->base.mm_private);
drm_helper_mode_fill_fb_struct(fb, mode_cmd, obj);
mutex_unlock(&dev->struct_mutex);
intel_fb->obj = obj;
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;

View File

@ -50,7 +50,6 @@ struct intel_i2c_chan {
struct intel_framebuffer {
struct drm_framebuffer base;
struct drm_gem_object *obj;
};
@ -119,7 +118,8 @@ extern int intelfb_resize(struct drm_device *dev, struct drm_crtc *crtc);
extern void intel_crtc_fb_gamma_set(struct drm_crtc *crtc, u16 red, u16 green,
u16 blue, int regno);
extern struct drm_framebuffer *intel_user_framebuffer_create(struct drm_device *dev,
struct drm_file *file_priv,
struct drm_mode_fb_cmd *mode_cmd);
extern struct drm_framebuffer *
intel_framebuffer_create(struct drm_device *dev,
struct drm_mode_fb_cmd *mode_cmd,
void *mm_private);
#endif /* __INTEL_DRV_H__ */

View File

@ -728,7 +728,7 @@ int intelfb_create(struct drm_device *dev, uint32_t fb_width, uint32_t fb_height
i915_gem_clflush_object(fbo);
fb = intel_user_framebuffer_create(dev, NULL, &mode_cmd);
fb = intel_framebuffer_create(dev, &mode_cmd, fbo);
if (!fb) {
DRM_ERROR("failed to allocate fb.\n");
ret = -ENOMEM;
@ -740,8 +740,6 @@ int intelfb_create(struct drm_device *dev, uint32_t fb_width, uint32_t fb_height
intel_fb = to_intel_framebuffer(fb);
*intel_fb_p = intel_fb;
intel_fb->obj = fbo;
info = framebuffer_alloc(sizeof(struct intelfb_par), device);
if (!info) {
ret = -ENOMEM;
@ -1137,7 +1135,7 @@ int intelfb_remove(struct drm_device *dev, struct drm_framebuffer *fb)
unregister_framebuffer(info);
iounmap(info->screen_base);
mutex_lock(&dev->struct_mutex);
drm_gem_object_unreference(intel_fb->obj);
drm_gem_object_unreference(intel_fb->base.mm_private);
mutex_unlock(&dev->struct_mutex);
framebuffer_release(info);
}