rpms/kernel/devel drm-nouveau.patch, 1.24, 1.25 kernel.spec, 1.1427, 1.1428

Ben Skeggs bskeggs at fedoraproject.org
Fri Mar 13 07:42:02 UTC 2009


Author: bskeggs

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

Modified Files:
	drm-nouveau.patch kernel.spec 
Log Message:
* Fri Mar 13 2009 Ben Skeggs <bskeggs at redhat.com>
- drm-nouveau.patch: support needed for multiple xservers



drm-nouveau.patch:

Index: drm-nouveau.patch
===================================================================
RCS file: /cvs/pkgs/rpms/kernel/devel/drm-nouveau.patch,v
retrieving revision 1.24
retrieving revision 1.25
diff -u -r1.24 -r1.25
--- drm-nouveau.patch	12 Mar 2009 02:11:40 -0000	1.24
+++ drm-nouveau.patch	13 Mar 2009 07:41:58 -0000	1.25
@@ -102,6 +102,89 @@
  
  	if (mask & ~fence->type) {
  		DRM_ERROR("Wait trying to extend fence type"
+diff --git a/drivers/gpu/drm/drm_gem.c b/drivers/gpu/drm/drm_gem.c
+index c1173d8..2e4e667 100644
+--- a/drivers/gpu/drm/drm_gem.c
++++ b/drivers/gpu/drm/drm_gem.c
+@@ -280,48 +280,58 @@ drm_gem_close_ioctl(struct drm_device *dev, void *data,
+  * is freed, the name goes away.
+  */
+ int
+-drm_gem_flink_ioctl(struct drm_device *dev, void *data,
+-		    struct drm_file *file_priv)
++drm_gem_object_name(struct drm_device *dev, struct drm_gem_object *obj,
++		    uint64_t *name)
+ {
+-	struct drm_gem_flink *args = data;
+-	struct drm_gem_object *obj;
+ 	int ret;
+ 
+-	if (!(dev->driver->driver_features & DRIVER_GEM))
+-		return -ENODEV;
+-
+-	obj = drm_gem_object_lookup(dev, file_priv, args->handle);
+-	if (obj == NULL)
+-		return -EBADF;
+-
+ again:
+-	if (idr_pre_get(&dev->object_name_idr, GFP_KERNEL) == 0) {
+-		ret = -ENOMEM;
+-		goto err;
+-	}
++	if (idr_pre_get(&dev->object_name_idr, GFP_KERNEL) == 0)
++		return -ENOMEM;
+ 
+ 	spin_lock(&dev->object_name_lock);
+ 	if (!obj->name) {
+ 		ret = idr_get_new_above(&dev->object_name_idr, obj, 1,
+ 					&obj->name);
+-		args->name = (uint64_t) obj->name;
++		*name = (uint64_t) obj->name;
+ 		spin_unlock(&dev->object_name_lock);
+ 
+ 		if (ret == -EAGAIN)
+ 			goto again;
+ 
+ 		if (ret != 0)
+-			goto err;
++			return ret;
+ 
+ 		/* Allocate a reference for the name table.  */
+ 		drm_gem_object_reference(obj);
+ 	} else {
+-		args->name = (uint64_t) obj->name;
++		*name = (uint64_t) obj->name;
+ 		spin_unlock(&dev->object_name_lock);
+-		ret = 0;
+ 	}
+ 
+-err:
++	return 0;
++}
++EXPORT_SYMBOL(drm_gem_object_name);
++
++int
++drm_gem_flink_ioctl(struct drm_device *dev, void *data,
++		    struct drm_file *file_priv)
++{
++	struct drm_gem_flink *args = data;
++	struct drm_gem_object *obj;
++	uint64_t name;
++	int ret;
++
++	if (!(dev->driver->driver_features & DRIVER_GEM))
++		return -ENODEV;
++
++	obj = drm_gem_object_lookup(dev, file_priv, args->handle);
++	if (obj == NULL)
++		return -EBADF;
++
++	ret = drm_gem_object_name(dev, obj, &name);
++	args->name = name;
++
+ 	mutex_lock(&dev->struct_mutex);
+ 	drm_gem_object_unreference(obj);
+ 	mutex_unlock(&dev->struct_mutex);
 diff --git a/drivers/gpu/drm/drm_stub.c b/drivers/gpu/drm/drm_stub.c
 index 5d45cbf..e3b0a76 100644
 --- a/drivers/gpu/drm/drm_stub.c
@@ -2529,10 +2612,10 @@
 +MODULE_LICENSE("GPL and additional rights");
 diff --git a/drivers/gpu/drm/nouveau/nouveau_drv.h b/drivers/gpu/drm/nouveau/nouveau_drv.h
 new file mode 100644
-index 0000000..06e3f9e
+index 0000000..c281440
 --- /dev/null
 +++ b/drivers/gpu/drm/nouveau/nouveau_drv.h
-@@ -0,0 +1,741 @@
+@@ -0,0 +1,746 @@
 +/*
 + * Copyright 2005 Stephane Marchesin.
 + * All Rights Reserved.
@@ -2903,6 +2986,11 @@
 +	struct mutex submit_mutex;
 +
 +	struct backlight_device *backlight;
++
++	struct drm_gem_object *sfb_gem;
++	struct mem_block *sfb;
++	uint64_t sfbhack_handle;
++	uint64_t sfbhack_size;
 +};
 +
 +#define NOUVEAU_CHECK_INITIALISED_WITH_RETURN do {         \
@@ -10321,10 +10409,10 @@
 +}
 diff --git a/drivers/gpu/drm/nouveau/nouveau_state.c b/drivers/gpu/drm/nouveau/nouveau_state.c
 new file mode 100644
-index 0000000..756141a
+index 0000000..2988664
 --- /dev/null
 +++ b/drivers/gpu/drm/nouveau/nouveau_state.c
-@@ -0,0 +1,943 @@
+@@ -0,0 +1,1038 @@
 +/*
 + * Copyright 2005 Stephane Marchesin
 + * Copyright 2008 Stuart Bennett
@@ -10363,6 +10451,84 @@
 +static int nouveau_stub_init(struct drm_device *dev) { return 0; }
 +static void nouveau_stub_takedown(struct drm_device *dev) {}
 +
++extern int drm_gem_object_name(struct drm_device *, struct drm_gem_object *,
++			       uint64_t *);
++static int
++sfbhack_init(struct drm_device *dev)
++{
++	struct drm_nouveau_private *dev_priv = dev->dev_private;
++	uint32_t flags;
++	int ret, size;
++
++	if (dev_priv->sfb_gem || dev_priv->sfb)
++		return 0;
++
++	size = nouveau_mem_fb_amount(dev);
++	if (size > drm_get_resource_len(dev, 1))
++		size = drm_get_resource_len(dev, 1);
++	size >>= 1;
++
++	if (dev_priv->mm_enabled) {
++		flags = NOUVEAU_GEM_DOMAIN_VRAM;
++		if (dev_priv->card_type == NV_50)
++			flags |= NOUVEAU_GEM_DOMAIN_TILE;
++
++		ret = nouveau_gem_new(dev, dev_priv->channel, size, 0,
++				      flags, &dev_priv->sfb_gem);
++		if (ret)
++			return ret;
++
++		ret = nouveau_gem_pin(dev_priv->sfb_gem,
++				      NOUVEAU_GEM_DOMAIN_VRAM);
++		if (ret)
++			return ret;
++
++		ret = drm_gem_object_name(dev, dev_priv->sfb_gem,
++					  &dev_priv->sfbhack_handle);
++		if (ret) {
++			mutex_lock(&dev->struct_mutex);
++			drm_gem_object_unreference(dev_priv->sfb_gem);
++			mutex_unlock(&dev->struct_mutex);
++			dev_priv->sfb_gem = NULL;
++		}
++		
++		dev_priv->sfbhack_size = dev_priv->sfb_gem->size;
++		return 0;
++	}
++
++	flags = NOUVEAU_MEM_FB | NOUVEAU_MEM_MAPPED;
++	if (dev_priv->card_type == NV_50)
++		flags |= NOUVEAU_MEM_TILE;
++
++	dev_priv->sfb = nouveau_mem_alloc(dev, 0, size, flags,
++					  (struct drm_file *)-2);
++	if (!dev_priv->sfb)
++		return -ENOMEM;
++
++	dev_priv->sfbhack_handle = ((u64)dev_priv->sfb->map_handle << 32 |
++				    dev_priv->sfb->start);
++	dev_priv->sfbhack_size = dev_priv->sfb->size;
++	return 0;
++}
++
++static void
++sfbhack_takedown(struct drm_device *dev)
++{
++	struct drm_nouveau_private *dev_priv = dev->dev_private;
++
++	if (dev_priv->sfb_gem) {
++		mutex_lock(&dev->struct_mutex);
++		drm_gem_object_unreference(dev_priv->sfb_gem);
++		mutex_unlock(&dev->struct_mutex);
++		dev_priv->sfb_gem = NULL;
++	}
++
++	if (dev_priv->sfb) {
++		nouveau_mem_free(dev, dev_priv->sfb);
++		dev_priv->sfb = NULL;
++	}
++}
++
 +static int nouveau_init_engine_ptrs(struct drm_device *dev)
 +{
 +	struct drm_nouveau_private *dev_priv = dev->dev_private;
@@ -10936,6 +11102,8 @@
 +/* KMS: we need mmio at load time, not when the first drm client opens. */
 +void nouveau_lastclose(struct drm_device *dev)
 +{
++	sfbhack_takedown(dev);
++
 +	if (drm_core_check_feature(dev, DRIVER_MODESET))
 +		return;
 +
@@ -10970,6 +11138,7 @@
 +{
 +	struct drm_nouveau_private *dev_priv = dev->dev_private;
 +	struct drm_nouveau_getparam *getparam = data;
++	int ret;
 +
 +	NOUVEAU_CHECK_INITIALISED_WITH_RETURN;
 +
@@ -11018,6 +11187,20 @@
 +	case NOUVEAU_GETPARAM_VM_VRAM_BASE:
 +		getparam->value = dev_priv->vm_vram_base;
 +		break;
++	case 0xdeadcafe00000001: /* NOUVEAU_GETPARAM_SHAREDFB_HANDLE */
++		ret = sfbhack_init(dev);
++		if (ret)
++			return ret;
++
++		getparam->value = dev_priv->sfbhack_handle;
++		break;
++	case 0xdeadcafe00000002: /* NOUVEAU_GETPARAM_SHAREDFB_SIZE */
++		ret = sfbhack_init(dev);
++		if (ret)
++			return ret;
++
++		getparam->value = dev_priv->sfbhack_size;
++		break;
 +	default:
 +		DRM_ERROR("unknown parameter %lld\n", getparam->param);
 +		return -EINVAL;
@@ -42765,7 +42948,7 @@
  unifdef-y += via_drm.h
 +unifdef-y += nouveau_drm.h
 diff --git a/include/drm/drmP.h b/include/drm/drmP.h
-index 99e348d..e57c98f 100644
+index b61b0c6..5b7ce2d 100644
 --- a/include/drm/drmP.h
 +++ b/include/drm/drmP.h
 @@ -1267,6 +1267,8 @@ extern void drm_idlelock_release(struct drm_lock_data *lock_data);


Index: kernel.spec
===================================================================
RCS file: /cvs/pkgs/rpms/kernel/devel/kernel.spec,v
retrieving revision 1.1427
retrieving revision 1.1428
diff -u -r1.1427 -r1.1428
--- kernel.spec	13 Mar 2009 05:15:01 -0000	1.1427
+++ kernel.spec	13 Mar 2009 07:41:59 -0000	1.1428
@@ -1811,6 +1811,9 @@
 # and build.
 
 %changelog
+* Fri Mar 13 2009 Ben Skeggs <bskeggs at redhat.com>
+- drm-nouveau.patch: support needed for multiple xservers
+
 * Fri Mar 13 2009 Kyle McMartin <kyle at redhat.com> 2.6.29-0.247.rc8
 - Linux 2.6.29-rc8
 - squashfs-fix-page-aligned-data.patch: upstream-ish




More information about the fedora-extras-commits mailing list