rpms/kernel/devel kernel.spec, 1.594, 1.595 linux-2.6-drm-i915-modeset.patch, 1.8, 1.9

Dave Airlie (airlied) fedora-extras-commits at redhat.com
Tue Apr 8 08:10:10 UTC 2008


Author: airlied

Update of /cvs/pkgs/rpms/kernel/devel
In directory cvs-int.fedora.redhat.com:/tmp/cvs-serv17155

Modified Files:
	kernel.spec linux-2.6-drm-i915-modeset.patch 
Log Message:
* Tue Apr 08 2008 Dave Airlie <airlied at redhat.com>
- fix oops in radeon code caused by fixing the mappings



Index: kernel.spec
===================================================================
RCS file: /cvs/pkgs/rpms/kernel/devel/kernel.spec,v
retrieving revision 1.594
retrieving revision 1.595
diff -u -r1.594 -r1.595
--- kernel.spec	8 Apr 2008 05:54:57 -0000	1.594
+++ kernel.spec	8 Apr 2008 08:09:22 -0000	1.595
@@ -1759,6 +1759,9 @@
 
 %changelog
 * Tue Apr 08 2008 Dave Airlie <airlied at redhat.com>
+- fix oops in radeon code caused by fixing the mappings
+
+* Tue Apr 08 2008 Dave Airlie <airlied at redhat.com>
 - drm fixes, should fix radeon mappings problem and nouveau crashes
 
 * Tue Apr 08 2008 Chuck Ebbert <cebbert at redhat.com>

linux-2.6-drm-i915-modeset.patch:

Index: linux-2.6-drm-i915-modeset.patch
===================================================================
RCS file: /cvs/pkgs/rpms/kernel/devel/linux-2.6-drm-i915-modeset.patch,v
retrieving revision 1.8
retrieving revision 1.9
diff -u -r1.8 -r1.9
--- linux-2.6-drm-i915-modeset.patch	8 Apr 2008 05:54:57 -0000	1.8
+++ linux-2.6-drm-i915-modeset.patch	8 Apr 2008 08:09:22 -0000	1.9
@@ -884,23 +884,38 @@
  static int drm_copy_io_page(void *dst, void *src, unsigned long page)
  {
 diff --git a/drivers/char/drm/drm_bufs.c b/drivers/char/drm/drm_bufs.c
-index f3aac97..e9b0bdb 100644
+index f3aac97..b8e1dd6 100644
 --- a/drivers/char/drm/drm_bufs.c
 +++ b/drivers/char/drm/drm_bufs.c
-@@ -53,9 +53,9 @@ struct drm_map_list *drm_find_matching_map(struct drm_device *dev,
+@@ -48,14 +48,24 @@ unsigned long drm_get_resource_len(struct drm_device *dev, unsigned int resource
+ }
+ EXPORT_SYMBOL(drm_get_resource_len);
+ 
++static __inline__ bool map_has_master(struct drm_device *dev,
++				      struct drm_map_list *entry)
++{
++	if (entry->master && entry->master == dev->primary->master)
++		return true;
++	if (!entry->master && entry->map->flags & _DRM_DRIVER)
++		return true;
++	return false;
++}
++
+ struct drm_map_list *drm_find_matching_map(struct drm_device *dev,
+ 					   drm_local_map_t *map)
  {
  	struct drm_map_list *entry;
  	list_for_each_entry(entry, &dev->maplist, head) {
 -		if (entry->map && map->type == entry->map->type &&
 -		    ((entry->map->offset == map->offset) ||
 -		     (map->type == _DRM_SHM && map->flags == _DRM_CONTAINS_LOCK))) {
-+		if (entry->map && (entry->master == dev->primary->master) && (map->type == entry->map->type) &&
++		if (entry->map && map_has_master(dev, entry) && (map->type == entry->map->type) &&
 +		    ((entry->map->offset == map->offset) || 
 +		     ((map->type == _DRM_SHM) && (map->flags&_DRM_CONTAINS_LOCK)))) {
  			return entry;
  		}
  	}
-@@ -210,12 +210,12 @@ static int drm_addmap_core(struct drm_device *dev, unsigned int offset,
+@@ -210,12 +220,12 @@ static int drm_addmap_core(struct drm_device *dev, unsigned int offset,
  		map->offset = (unsigned long)map->handle;
  		if (map->flags & _DRM_CONTAINS_LOCK) {
  			/* Prevent a 2nd X Server from creating a 2nd lock */
@@ -915,7 +930,7 @@
  		}
  		break;
  	case _DRM_AGP: {
-@@ -319,6 +319,7 @@ static int drm_addmap_core(struct drm_device *dev, unsigned int offset,
+@@ -319,6 +329,7 @@ static int drm_addmap_core(struct drm_device *dev, unsigned int offset,
  	list->user_token = list->hash.key << PAGE_SHIFT;
  	mutex_unlock(&dev->struct_mutex);
  
@@ -923,7 +938,7 @@
  	*maplist = list;
  	return 0;
  	}
-@@ -408,6 +409,9 @@ int drm_rmmap_locked(struct drm_device *dev, drm_local_map_t *map)
+@@ -408,6 +419,9 @@ int drm_rmmap_locked(struct drm_device *dev, drm_local_map_t *map)
  		break;
  	case _DRM_SHM:
  		vfree(map->handle);
@@ -16332,6 +16347,61 @@
  		DRM_ERROR("Failed TT mm init: %d\n", ret);
  		return ret;
  	}
+diff --git a/drivers/char/drm/radeon_cp.c b/drivers/char/drm/radeon_cp.c
+index 9072e4a..dd9bb45 100644
+--- a/drivers/char/drm/radeon_cp.c
++++ b/drivers/char/drm/radeon_cp.c
+@@ -2393,6 +2393,9 @@ int radeon_driver_load(struct drm_device *dev, unsigned long flags)
+ 
+ 	DRM_DEBUG("%s card detected\n",
+ 		  ((dev_priv->flags & RADEON_IS_AGP) ? "AGP" : (((dev_priv->flags & RADEON_IS_PCIE) ? "PCIE" : "PCI"))));
++	ret = drm_addmap(dev, drm_get_resource_start(dev, 2),
++			 drm_get_resource_len(dev, 2), _DRM_REGISTERS,
++			 _DRM_READ_ONLY|_DRM_DRIVER, &dev_priv->mmio);
+ 	return ret;
+ }
+ 
+@@ -2407,12 +2410,6 @@ int radeon_driver_firstopen(struct drm_device *dev)
+ 
+ 	dev_priv->gart_info.table_size = RADEON_PCIGART_TABLE_SIZE;
+ 
+-	ret = drm_addmap(dev, drm_get_resource_start(dev, 2),
+-			 drm_get_resource_len(dev, 2), _DRM_REGISTERS,
+-			 _DRM_READ_ONLY, &dev_priv->mmio);
+-	if (ret != 0)
+-		return ret;
+-
+ 	dev_priv->fb_aper_offset = drm_get_resource_start(dev, 0);
+ 	ret = drm_addmap(dev, dev_priv->fb_aper_offset,
+ 			 drm_get_resource_len(dev, 0), _DRM_FRAME_BUFFER,
+@@ -2428,6 +2425,7 @@ int radeon_driver_unload(struct drm_device *dev)
+ 	drm_radeon_private_t *dev_priv = dev->dev_private;
+ 
+ 	DRM_DEBUG("\n");
++	drm_rmmap(dev, dev_priv->mmio);
+ 	drm_free(dev_priv, sizeof(*dev_priv), DRM_MEM_DRIVER);
+ 
+ 	dev->dev_private = NULL;
+diff --git a/drivers/char/drm/radeon_drv.h b/drivers/char/drm/radeon_drv.h
+index 173ae62..20faa2a 100644
+--- a/drivers/char/drm/radeon_drv.h
++++ b/drivers/char/drm/radeon_drv.h
+@@ -280,7 +280,6 @@ typedef struct drm_radeon_private {
+ 	unsigned long gart_textures_offset;
+ 
+ 	drm_local_map_t *sarea;
+-	drm_local_map_t *mmio;
+ 	drm_local_map_t *cp_ring;
+ 	drm_local_map_t *ring_rptr;
+ 	drm_local_map_t *gart_textures;
+@@ -307,6 +306,7 @@ typedef struct drm_radeon_private {
+ 	/* starting from here on, data is preserved accross an open */
+ 	uint32_t flags;		/* see radeon_chip_flags */
+ 	unsigned long fb_aper_offset;
++	drm_local_map_t *mmio;
+ } drm_radeon_private_t;
+ 
+ typedef struct drm_radeon_buf_priv {
 diff --git a/drivers/char/drm/radeon_state.c b/drivers/char/drm/radeon_state.c
 index 6f75512..3cd3972 100644
 --- a/drivers/char/drm/radeon_state.c




More information about the fedora-extras-commits mailing list