rpms/kernel/devel drm-modesetting-intel-mm-private.patch, NONE, 1.1 kernel.spec, 1.966, 1.967

Kristian Høgsberg krh at fedoraproject.org
Mon Sep 22 20:47:26 UTC 2008


Author: krh

Update of /cvs/pkgs/rpms/kernel/devel
In directory cvs1.fedora.phx.redhat.com:/tmp/cvs-serv8390

Modified Files:
	kernel.spec 
Added Files:
	drm-modesetting-intel-mm-private.patch 
Log Message:
* Mon Sep 22 2008 Kristian Høgsberg <krh at redhat.com>
- Add patch to allow userspace to get a handle for the buffer object
  backing the drm fbdev buffer.
- Update intel modesetting for the buffer object change.


drm-modesetting-intel-mm-private.patch:

--- NEW FILE drm-modesetting-intel-mm-private.patch ---
>From 63901e2b76b591fd7e5b86c09228c953a28f992d Mon Sep 17 00:00:00 2001
From: =?utf-8?q?Kristian=20H=C3=B8gsberg?= <krh at redhat.com>
Date: Mon, 22 Sep 2008 16:43:04 -0400
Subject: [PATCH] Update intel modesetting to use mm_private instead of mm_handle.

---
 drivers/gpu/drm/i915/intel_display.c |   57 ++++++++++++++++++++++------------
 drivers/gpu/drm/i915/intel_drv.h     |    8 ++--
 drivers/gpu/drm/i915/intel_fb.c      |    6 +--
 3 files changed, 43 insertions(+), 28 deletions(-)

diff --git a/drivers/gpu/drm/i915/intel_display.c b/drivers/gpu/drm/i915/intel_display.c
index d7e02a2..10d120a 100644
--- a/drivers/gpu/drm/i915/intel_display.c
+++ b/drivers/gpu/drm/i915/intel_display.c
@@ -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);
@@ -1464,21 +1466,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;
 
@@ -1489,20 +1504,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)
 {
@@ -1519,14 +1540,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;
diff --git a/drivers/gpu/drm/i915/intel_drv.h b/drivers/gpu/drm/i915/intel_drv.h
index bffbeef..256deac 100644
--- a/drivers/gpu/drm/i915/intel_drv.h
+++ b/drivers/gpu/drm/i915/intel_drv.h
@@ -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__ */
diff --git a/drivers/gpu/drm/i915/intel_fb.c b/drivers/gpu/drm/i915/intel_fb.c
index fea083b..8ec8e73 100644
--- a/drivers/gpu/drm/i915/intel_fb.c
+++ b/drivers/gpu/drm/i915/intel_fb.c
@@ -488,7 +488,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;
@@ -500,8 +500,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;
@@ -897,7 +895,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);
 	}
-- 
1.5.6.GIT



Index: kernel.spec
===================================================================
RCS file: /cvs/pkgs/rpms/kernel/devel/kernel.spec,v
retrieving revision 1.966
retrieving revision 1.967
diff -u -r1.966 -r1.967
--- kernel.spec	22 Sep 2008 20:10:55 -0000	1.966
+++ kernel.spec	22 Sep 2008 20:46:55 -0000	1.967
@@ -610,6 +610,7 @@
 Patch1812: drm-modesetting-i915.patch
 Patch1813: drm-nouveau.patch
 Patch1814: drm-create-handle-for-fb.patch
+Patch1815: drm-modesetting-intel-mm-private.patch
 
 # kludge to make ich9 e1000 work
 Patch2000: linux-2.6-e1000-ich9.patch
@@ -1169,6 +1170,7 @@
 ApplyPatch drm-modesetting-i915.patch
 ApplyPatch drm-nouveau.patch
 ApplyPatch drm-create-handle-for-fb.patch
+ApplyPatch drm-modesetting-intel-mm-private.patch
 
 # linux1394 git patches
 ApplyPatch linux-2.6-firewire-git-update.patch
@@ -1772,6 +1774,7 @@
 * Mon Sep 22 2008 Kristian Høgsberg <krh at redhat.com>
 - Add patch to allow userspace to get a handle for the buffer object
   backing the drm fbdev buffer.
+- Update intel modesetting for the buffer object change.
 
 * Mon Sep 22 2008 Kyle McMartin <kyle at redhat.com>
 - Linux 2.6.27-rc7




More information about the fedora-extras-commits mailing list