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