rpms/kernel/devel drm-create-handle-for-fb.patch, NONE, 1.1 kernel.spec, 1.962, 1.963

Kristian Høgsberg krh at fedoraproject.org
Mon Sep 22 18:59:49 UTC 2008


Author: krh

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

Modified Files:
	kernel.spec 
Added Files:
	drm-create-handle-for-fb.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.


drm-create-handle-for-fb.patch:

--- NEW FILE drm-create-handle-for-fb.patch ---
>From ad69a5217c83468ee8f6edac931b8bef58b2f410 Mon Sep 17 00:00:00 2001
From: =?utf-8?q?Kristian=20H=C3=B8gsberg?= <krh at redhat.com>
Date: Mon, 22 Sep 2008 12:00:57 -0400
Subject: [PATCH] Store the buffer object backing the fb as a void pointer, not a handle.

This lets us defer handle creation until userspace acutally asks for
one, at which point we also have a drm_file to associate it with.
---
 drivers/gpu/drm/drm_crtc.c                  |    2 +-
 drivers/gpu/drm/drm_crtc_helper.c           |    5 +-
 drivers/gpu/drm/radeon/atombios_crtc.c      |    4 +-
 drivers/gpu/drm/radeon/radeon_display.c     |   86 +++++++++------------------
 drivers/gpu/drm/radeon/radeon_fb.c          |    6 +-
 drivers/gpu/drm/radeon/radeon_legacy_crtc.c |    8 ++-
 drivers/gpu/drm/radeon/radeon_mode.h        |    7 +-
 drivers/gpu/drm/radeon/radeon_pm.c          |    9 ++-
 include/drm/drm_crtc.h                      |    5 +-
 include/drm/drm_crtc_helper.h               |    3 +-
 10 files changed, 58 insertions(+), 77 deletions(-)

diff --git a/drivers/gpu/drm/drm_crtc.c b/drivers/gpu/drm/drm_crtc.c
index 8375bf9..15b9f3e 100644
--- a/drivers/gpu/drm/drm_crtc.c
+++ b/drivers/gpu/drm/drm_crtc.c
@@ -1629,8 +1629,8 @@ int drm_mode_getfb(struct drm_device *dev,
 	r->width = fb->width;
 	r->depth = fb->depth;
 	r->bpp = fb->bits_per_pixel;
-	r->handle = fb->mm_handle;
 	r->pitch = fb->pitch;
+	fb->funcs->create_handle(fb, file_priv, &r->handle);
 
 out:
 	mutex_unlock(&dev->mode_config.mutex);
diff --git a/drivers/gpu/drm/drm_crtc_helper.c b/drivers/gpu/drm/drm_crtc_helper.c
index b507315..b334f5b 100644
--- a/drivers/gpu/drm/drm_crtc_helper.c
+++ b/drivers/gpu/drm/drm_crtc_helper.c
@@ -771,14 +771,15 @@ int drm_helper_hotplug_stage_two(struct drm_device *dev)
 EXPORT_SYMBOL(drm_helper_hotplug_stage_two);
 
 int drm_helper_mode_fill_fb_struct(struct drm_framebuffer *fb,
-				   struct drm_mode_fb_cmd *mode_cmd)
+				   struct drm_mode_fb_cmd *mode_cmd,
+				   void *mm_private)
 {
 	fb->width = mode_cmd->width;
 	fb->height = mode_cmd->height;
 	fb->pitch = mode_cmd->pitch;
 	fb->bits_per_pixel = mode_cmd->bpp;
 	fb->depth = mode_cmd->depth;
-	fb->mm_handle = mode_cmd->handle;
+	fb->mm_private = mm_private;
 	
 	return 0;
 }
diff --git a/drivers/gpu/drm/radeon/atombios_crtc.c b/drivers/gpu/drm/radeon/atombios_crtc.c
index a618132..20e6d02 100644
--- a/drivers/gpu/drm/radeon/atombios_crtc.c
+++ b/drivers/gpu/drm/radeon/atombios_crtc.c
@@ -231,6 +231,7 @@ void atombios_crtc_set_base(struct drm_crtc *crtc, int x, int y)
 	struct drm_device *dev = crtc->dev;
 	struct drm_radeon_private *dev_priv = dev->dev_private;
 	struct radeon_framebuffer *radeon_fb;
+	struct drm_gem_object *obj;
 	struct drm_radeon_gem_object *obj_priv;
 	uint32_t fb_location, fb_format, fb_pitch_pixels;
 
@@ -239,7 +240,8 @@ void atombios_crtc_set_base(struct drm_crtc *crtc, int x, int y)
 
 	radeon_fb = to_radeon_framebuffer(crtc->fb);
 
-	obj_priv = radeon_fb->obj->driver_private;
+	obj = radeon_fb->base.mm_private;
+	obj_priv = obj->driver_private;
 
 	fb_location = obj_priv->bo->offset + dev_priv->fb_location;
 
diff --git a/drivers/gpu/drm/radeon/radeon_display.c b/drivers/gpu/drm/radeon/radeon_display.c
index a2cb66a..c459338 100644
--- a/drivers/gpu/drm/radeon/radeon_display.c
+++ b/drivers/gpu/drm/radeon/radeon_display.c
@@ -518,15 +518,25 @@ static void radeon_user_framebuffer_destroy(struct drm_framebuffer *fb)
 	kfree(radeon_fb);
 }
 
+static int radeon_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 radeon_fb_funcs = {
 	.destroy = radeon_user_framebuffer_destroy,
+	.create_handle = radeon_user_framebuffer_create_handle,
 };
 
-struct drm_framebuffer *radeon_user_framebuffer_create(struct drm_device *dev,
-						       struct drm_file *filp,
-						       struct drm_mode_fb_cmd *mode_cmd)
+struct drm_framebuffer *
+radeon_framebuffer_create(struct drm_device *dev,
+			  struct drm_mode_fb_cmd *mode_cmd,
+			  void *mm_private)
 {
-
 	struct radeon_framebuffer *radeon_fb;
 
 	radeon_fb = kzalloc(sizeof(*radeon_fb), GFP_KERNEL);
@@ -534,26 +544,25 @@ struct drm_framebuffer *radeon_user_framebuffer_create(struct drm_device *dev,
 		return NULL;
 
 	drm_framebuffer_init(dev, &radeon_fb->base, &radeon_fb_funcs);
-	drm_helper_mode_fill_fb_struct(&radeon_fb->base, mode_cmd);
-
-	if (filp) {
-		radeon_fb->obj = drm_gem_object_lookup(dev, filp,
-						       mode_cmd->handle);
-		if (!radeon_fb->obj) {
-			kfree(radeon_fb);
-			return NULL;
-		}
-		/* copy the root into the object */
-		if (mode_cmd->flags & DRM_FB_COPY_ROOT) {
-			radeon_copy_fb(dev, radeon_fb->obj);
-		}
-		drm_gem_object_unreference(radeon_fb->obj);
-	}
-
+	drm_helper_mode_fill_fb_struct(&radeon_fb->base, mode_cmd, mm_private);
 		
 	return &radeon_fb->base;
 }
 
+static struct drm_framebuffer *
+radeon_user_framebuffer_create(struct drm_device *dev,
+			       struct drm_file *file_priv,
+			       struct drm_mode_fb_cmd *mode_cmd)
+{
+
+	struct radeon_framebuffer *radeon_fb;
+	void *mm_private;
+
+	mm_private = drm_gem_object_lookup(dev, file_priv, mode_cmd->handle);
+
+	return radeon_framebuffer_create(dev, mode_cmd, mm_private);
+}
+
 static const struct drm_mode_config_funcs radeon_mode_funcs = {
 	.fb_create = radeon_user_framebuffer_create,
 	.fb_changed = radeonfb_probe,
@@ -612,40 +621,3 @@ void radeon_modeset_cleanup(struct drm_device *dev)
 {
 	drm_mode_config_cleanup(dev);
 }
-
-void radeon_copy_fb(struct drm_device *dev, struct drm_gem_object *dst_obj)
-{
-	/* find the current fb */
-	drm_radeon_private_t *dev_priv = dev->dev_private;
-	struct drm_crtc *crtc;
-	struct drm_framebuffer *fb = NULL;
-	struct radeon_framebuffer *radeon_fb;
-	struct drm_radeon_gem_object *obj_priv_dst, *obj_priv_src;
-
-	list_for_each_entry(crtc, &dev->mode_config.crtc_list, head) {
-		if (crtc->fb) {
-			fb = crtc->fb;
-			break;
-		}
-	}
-
-	if (!fb) {
-		DRM_ERROR("can't find fb to copy from\n");
-		return;
-	}
-
-	radeon_fb = to_radeon_framebuffer(fb);
-
-	obj_priv_dst = dst_obj->driver_private;
-	obj_priv_src = radeon_fb->obj->driver_private;
-
-	DRM_DEBUG("copying fb %p to %p %d\n", obj_priv_dst->bo->offset + dev_priv->fb_location,
-		  obj_priv_src->bo->offset + dev_priv->fb_location, obj_priv_dst->bo->num_pages);
-
-	/* shove out a blit */
-	radeon_emit_copy_blit(dev,
-			      obj_priv_src->bo->offset + dev_priv->fb_location,
-			      obj_priv_dst->bo->offset + dev_priv->fb_location,
-			      obj_priv_dst->bo->num_pages);
-
-}
diff --git a/drivers/gpu/drm/radeon/radeon_fb.c b/drivers/gpu/drm/radeon/radeon_fb.c
index 83d39d3..3d1e4ea 100644
--- a/drivers/gpu/drm/radeon/radeon_fb.c
+++ b/drivers/gpu/drm/radeon/radeon_fb.c
@@ -504,7 +504,7 @@ int radeonfb_create(struct drm_device *dev, uint32_t fb_width, uint32_t fb_heigh
 	}
 
 	mutex_lock(&dev->struct_mutex);
-	fb = radeon_user_framebuffer_create(dev, NULL, &mode_cmd);
+	fb = radeon_framebuffer_create(dev, &mode_cmd, fbo);
 	if (!fb) {
 		DRM_ERROR("failed to allocate fb.\n");
 		ret = -ENOMEM;
@@ -516,8 +516,6 @@ int radeonfb_create(struct drm_device *dev, uint32_t fb_width, uint32_t fb_heigh
 	radeon_fb = to_radeon_framebuffer(fb);
 	*radeon_fb_p = radeon_fb;
 
-	radeon_fb->obj = fbo;
-
 	info = framebuffer_alloc(sizeof(struct radeonfb_par), device);
 	if (!info) {
 		ret = -ENOMEM;
@@ -910,7 +908,7 @@ int radeonfb_remove(struct drm_device *dev, struct drm_framebuffer *fb)
 		unregister_framebuffer(info);
 		drm_bo_kunmap(&radeon_fb->kmap_obj);
 		mutex_lock(&dev->struct_mutex);
-		drm_gem_object_unreference(radeon_fb->obj);
+		drm_gem_object_unreference(fb->mm_private);
 		mutex_unlock(&dev->struct_mutex);
 		framebuffer_release(info);
 	}
diff --git a/drivers/gpu/drm/radeon/radeon_legacy_crtc.c b/drivers/gpu/drm/radeon/radeon_legacy_crtc.c
index 58c2f9d..71f60ec 100644
--- a/drivers/gpu/drm/radeon/radeon_legacy_crtc.c
+++ b/drivers/gpu/drm/radeon/radeon_legacy_crtc.c
@@ -176,6 +176,7 @@ static bool radeon_set_crtc1_base(struct drm_crtc *crtc, int x, int y)
 	struct drm_device *dev = crtc->dev;
 	struct drm_radeon_private *dev_priv = dev->dev_private;
 	struct radeon_framebuffer *radeon_fb;
+	struct drm_gem_object *obj;
 	struct drm_radeon_gem_object *obj_priv;
 	uint32_t base;
 	uint32_t crtc_offset, crtc_offset_cntl, crtc_tile_x0_y0 = 0;
@@ -185,7 +186,8 @@ static bool radeon_set_crtc1_base(struct drm_crtc *crtc, int x, int y)
 
 	radeon_fb = to_radeon_framebuffer(crtc->fb);
 
-	obj_priv = radeon_fb->obj->driver_private;
+	obj = radeon_fb->base.mm_private;
+	obj_priv = obj->driver_private;
 
 	crtc_offset = obj_priv->bo->offset;
 
@@ -594,6 +596,7 @@ static bool radeon_set_crtc2_base(struct drm_crtc *crtc, int x, int y)
 	struct drm_device *dev = crtc->dev;
 	struct drm_radeon_private *dev_priv = dev->dev_private;
 	struct radeon_framebuffer *radeon_fb;
+	struct drm_gem_object *obj;
 	struct drm_radeon_gem_object *obj_priv;
 	uint32_t base;
 	uint32_t crtc2_offset, crtc2_offset_cntl, crtc2_tile_x0_y0 = 0;
@@ -603,7 +606,8 @@ static bool radeon_set_crtc2_base(struct drm_crtc *crtc, int x, int y)
 
 	radeon_fb = to_radeon_framebuffer(crtc->fb);
 
-	obj_priv = radeon_fb->obj->driver_private;
+	obj = radeon_fb->base.mm_private;
+	obj_priv = obj->driver_private;
 
 	crtc2_offset = obj_priv->bo->offset;
 
diff --git a/drivers/gpu/drm/radeon/radeon_mode.h b/drivers/gpu/drm/radeon/radeon_mode.h
index a4ee78a..7201f36 100644
--- a/drivers/gpu/drm/radeon/radeon_mode.h
+++ b/drivers/gpu/drm/radeon/radeon_mode.h
@@ -239,7 +239,6 @@ struct radeon_connector {
 
 struct radeon_framebuffer {
 	struct drm_framebuffer base;
-	struct drm_gem_object *obj;
 	struct drm_bo_kmap_obj kmap_obj;
 };
 
@@ -302,9 +301,9 @@ extern void radeon_atom_output_lock(struct drm_encoder *encoder, bool lock);
 extern void radeon_atom_initialize_bios_scratch_regs(struct drm_device *dev);
 extern void radeon_crtc_fb_gamma_set(struct drm_crtc *crtc, u16 red, u16 green,
 				     u16 blue, int regno);
-struct drm_framebuffer *radeon_user_framebuffer_create(struct drm_device *dev,
-						       struct drm_file *filp,
-						       struct drm_mode_fb_cmd *mode_cmd);
+struct drm_framebuffer *radeon_framebuffer_create(struct drm_device *dev,
+						  struct drm_mode_fb_cmd *mode_cmd,
+						  void *mm_private);
 
 int radeonfb_probe(struct drm_device *dev);
 
diff --git a/drivers/gpu/drm/radeon/radeon_pm.c b/drivers/gpu/drm/radeon/radeon_pm.c
index c7a57b9..1eed239 100644
--- a/drivers/gpu/drm/radeon/radeon_pm.c
+++ b/drivers/gpu/drm/radeon/radeon_pm.c
@@ -54,10 +54,10 @@ int radeon_suspend(struct drm_device *dev, pm_message_t state)
 		if (!radeon_fb)
 			continue;
 
-		if (!radeon_fb->obj)
+		if (!radeon_fb->base.mm_private)
 			continue;
 		
-		radeon_gem_object_unpin(radeon_fb->obj);
+		radeon_gem_object_unpin(radeon_fb->base.mm_private);
 	}
 
 	if (!(dev_priv->flags & RADEON_IS_IGP))
@@ -168,10 +168,11 @@ int radeon_resume(struct drm_device *dev)
 		if (!radeon_fb)
 			continue;
 
-		if (!radeon_fb->obj)
+		if (!radeon_fb->base.mm_private)
 			continue;
 		
-		radeon_gem_object_pin(radeon_fb->obj, PAGE_SIZE, RADEON_GEM_DOMAIN_VRAM);
+		radeon_gem_object_pin(radeon_fb->base.mm_private,
+				      PAGE_SIZE, RADEON_GEM_DOMAIN_VRAM);
 	}
 	/* blat the mode back in */
 	drm_helper_resume_force_mode(dev);
diff --git a/include/drm/drm_crtc.h b/include/drm/drm_crtc.h
index 5f63dc2..6a73a71 100644
--- a/include/drm/drm_crtc.h
+++ b/include/drm/drm_crtc.h
@@ -220,6 +220,9 @@ struct drm_display_info {
 
 struct drm_framebuffer_funcs {
 	void (*destroy)(struct drm_framebuffer *framebuffer);
+	int (*create_handle)(struct drm_framebuffer *fb,
+			     struct drm_file *file_priv,
+			     unsigned int *handle);
 };
 
 struct drm_framebuffer {
@@ -237,7 +240,7 @@ struct drm_framebuffer {
 	void *fbdev;
 	u32 pseudo_palette[17];
 	struct list_head filp_head;
-	uint32_t mm_handle;
+	void *mm_private;
 };
 
 struct drm_property_blob {
diff --git a/include/drm/drm_crtc_helper.h b/include/drm/drm_crtc_helper.h
index c071915..01b1423 100644
--- a/include/drm/drm_crtc_helper.h
+++ b/include/drm/drm_crtc_helper.h
@@ -75,7 +75,8 @@ extern bool drm_crtc_helper_set_mode(struct drm_crtc *crtc, struct drm_display_m
 extern bool drm_helper_crtc_in_use(struct drm_crtc *crtc);
 
 extern int drm_helper_mode_fill_fb_struct(struct drm_framebuffer *fb,
-					  struct drm_mode_fb_cmd *mode_cmd);
+					  struct drm_mode_fb_cmd *mode_cmd,
+					  void *mm_private);
 
 static inline void drm_crtc_helper_add(struct drm_crtc *crtc, const struct drm_crtc_helper_funcs *funcs)
 {
-- 
1.5.6.GIT



Index: kernel.spec
===================================================================
RCS file: /cvs/pkgs/rpms/kernel/devel/kernel.spec,v
retrieving revision 1.962
retrieving revision 1.963
diff -u -r1.962 -r1.963
--- kernel.spec	22 Sep 2008 14:07:05 -0000	1.962
+++ kernel.spec	22 Sep 2008 18:59:19 -0000	1.963
@@ -609,6 +609,7 @@
 Patch1811: drm-modesetting-radeon.patch
 Patch1812: drm-modesetting-i915.patch
 Patch1813: drm-nouveau.patch
+Patch1814: drm-create-handle-for-fb.patch
 
 # kludge to make ich9 e1000 work
 Patch2000: linux-2.6-e1000-ich9.patch
@@ -1167,6 +1168,7 @@
 ApplyPatch drm-modesetting-radeon.patch
 ApplyPatch drm-modesetting-i915.patch
 ApplyPatch drm-nouveau.patch
+ApplyPatch drm-create-handle-for-fb.patch
 
 # linux1394 git patches
 ApplyPatch linux-2.6-firewire-git-update.patch
@@ -1758,6 +1760,10 @@
 %kernel_variant_files -k vmlinux %{with_kdump} kdump
 
 %changelog
+* 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.
+
 * Mon Sep 22 2008 Kyle McMartin <kyle at redhat.com>
 - Linux 2.6.27-rc7
 




More information about the fedora-extras-commits mailing list