rpms/kernel/devel linux-2.6-drm-radeon-fix-oops2.patch, NONE, 1.1 kernel.spec, 1.613, 1.614 nouveau-drm-update.patch, 1.1, 1.2

Dave Airlie (airlied) fedora-extras-commits at redhat.com
Tue Apr 15 01:40:07 UTC 2008


Author: airlied

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

Modified Files:
	kernel.spec nouveau-drm-update.patch 
Added Files:
	linux-2.6-drm-radeon-fix-oops2.patch 
Log Message:
* Tue Apr 15 2008 Dave Airlie <airlied at redhat.com>
- fix oops on nouveau startup and make build again (#442122)
- fix radeon oops seen on kerneloops (#442227)


linux-2.6-drm-radeon-fix-oops2.patch:

--- NEW FILE linux-2.6-drm-radeon-fix-oops2.patch ---
diff --git a/drivers/char/drm/radeon_cp.c b/drivers/char/drm/radeon_cp.c
index dd9bb45..12a870b 100644
--- a/drivers/char/drm/radeon_cp.c
+++ b/drivers/char/drm/radeon_cp.c
@@ -1513,10 +1513,10 @@ static void radeon_set_pcigart(drm_radeon_private_t * dev_priv, int on)
 	}
 }
 
-static int radeon_do_init_cp(struct drm_device * dev, drm_radeon_init_t * init)
+static int radeon_do_init_cp(struct drm_device * dev, drm_radeon_init_t * init, struct drm_file *file_priv)
 {
 	drm_radeon_private_t *dev_priv = dev->dev_private;
-
+	struct drm_radeon_master_private *master_priv = file_priv->master->driver_priv;
 	DRM_DEBUG("\n");
 
 	/* if we require new memory map but we don't have it fail */
@@ -1640,8 +1640,8 @@ static int radeon_do_init_cp(struct drm_device * dev, drm_radeon_init_t * init)
 	dev_priv->buffers_offset = init->buffers_offset;
 	dev_priv->gart_textures_offset = init->gart_textures_offset;
 
-	dev_priv->sarea = drm_getsarea(dev);
-	if (!dev_priv->sarea) {
+	master_priv->sarea = drm_getsarea(dev);
+	if (!master_priv->sarea) {
 		DRM_ERROR("could not find sarea!\n");
 		radeon_do_cleanup_cp(dev);
 		return -EINVAL;
@@ -1678,7 +1678,7 @@ static int radeon_do_init_cp(struct drm_device * dev, drm_radeon_init_t * init)
 	}
 
 	dev_priv->sarea_priv =
-	    (drm_radeon_sarea_t *) ((u8 *) dev_priv->sarea->handle +
+	    (drm_radeon_sarea_t *) ((u8 *) master_priv->sarea->handle +
 				    init->sarea_priv_offset);
 
 #if __OS_HAS_AGP
@@ -1970,7 +1970,7 @@ int radeon_cp_init(struct drm_device *dev, void *data, struct drm_file *file_pri
 	case RADEON_INIT_CP:
 	case RADEON_INIT_R200_CP:
 	case RADEON_INIT_R300_CP:
-		return radeon_do_init_cp(dev, init);
+		return radeon_do_init_cp(dev, init, file_priv);
 	case RADEON_CLEANUP_CP:
 		return radeon_do_cleanup_cp(dev);
 	}
diff --git a/drivers/char/drm/radeon_drv.c b/drivers/char/drm/radeon_drv.c
index 349ac3d..52b7c46 100644
--- a/drivers/char/drm/radeon_drv.c
+++ b/drivers/char/drm/radeon_drv.c
@@ -81,6 +81,8 @@ static struct drm_driver driver = {
 	.get_reg_ofs = drm_core_get_reg_ofs,
 	.ioctls = radeon_ioctls,
 	.dma_ioctl = radeon_cp_buffers,
+	.master_create = radeon_master_create,
+	.master_destroy = radeon_master_destroy,
 	.fops = {
 		 .owner = THIS_MODULE,
 		 .open = drm_open,
diff --git a/drivers/char/drm/radeon_drv.h b/drivers/char/drm/radeon_drv.h
index 20faa2a..f1c58dd 100644
--- a/drivers/char/drm/radeon_drv.h
+++ b/drivers/char/drm/radeon_drv.h
@@ -279,7 +279,6 @@ typedef struct drm_radeon_private {
 	unsigned long buffers_offset;
 	unsigned long gart_textures_offset;
 
-	drm_local_map_t *sarea;
 	drm_local_map_t *cp_ring;
 	drm_local_map_t *ring_rptr;
 	drm_local_map_t *gart_textures;
@@ -309,6 +308,10 @@ typedef struct drm_radeon_private {
 	drm_local_map_t *mmio;
 } drm_radeon_private_t;
 
+struct drm_radeon_master_private {
+	drm_local_map_t *sarea;
+};
+
 typedef struct drm_radeon_buf_priv {
 	u32 age;
 } drm_radeon_buf_priv_t;
@@ -395,6 +398,9 @@ extern int radeon_driver_open(struct drm_device * dev, struct drm_file * filp_pr
 extern long radeon_compat_ioctl(struct file *filp, unsigned int cmd,
 				unsigned long arg);
 
+extern int radeon_master_create(struct drm_device *dev, struct drm_master *master);
+extern void radeon_master_destroy(struct drm_device *dev, struct drm_master *master);
+
 /* r300_cmdbuf.c */
 extern void r300_init_reg_flags(struct drm_device *dev);
 
diff --git a/drivers/char/drm/radeon_state.c b/drivers/char/drm/radeon_state.c
index 3cd3972..e79359b 100644
--- a/drivers/char/drm/radeon_state.c
+++ b/drivers/char/drm/radeon_state.c
@@ -1415,10 +1415,11 @@ static void radeon_cp_dispatch_swap(struct drm_device * dev)
 	ADVANCE_RING();
 }
 
-static void radeon_cp_dispatch_flip(struct drm_device * dev)
+static void radeon_cp_dispatch_flip(struct drm_device * dev, struct drm_master *master)
 {
 	drm_radeon_private_t *dev_priv = dev->dev_private;
-	struct drm_sarea *sarea = (struct drm_sarea *) dev_priv->sarea->handle;
+	struct drm_radeon_master_private *master_priv = master->driver_priv;
+	struct drm_sarea *sarea = (struct drm_sarea *) master_priv->sarea->handle;
 	int offset = (dev_priv->sarea_priv->pfCurrentPage == 1)
 	    ? dev_priv->front_offset : dev_priv->back_offset;
 	RING_LOCALS;
@@ -2166,7 +2167,7 @@ static int radeon_cp_flip(struct drm_device *dev, void *data, struct drm_file *f
 	if (!dev_priv->page_flipping)
 		radeon_do_init_pageflip(dev);
 
-	radeon_cp_dispatch_flip(dev);
+	radeon_cp_dispatch_flip(dev, file_priv->master);
 
 	COMMIT_RING();
 	return 0;
@@ -3120,15 +3121,42 @@ void radeon_driver_preclose(struct drm_device *dev, struct drm_file *file_priv)
 
 void radeon_driver_lastclose(struct drm_device *dev)
 {
-	if (dev->dev_private) {
-		drm_radeon_private_t *dev_priv = dev->dev_private;
+	radeon_do_release(dev);
+}
 
-		if (dev_priv->sarea_priv &&
-		    dev_priv->sarea_priv->pfCurrentPage != 0)
-			radeon_cp_dispatch_flip(dev);
-	}
+int radeon_master_create(struct drm_device *dev, struct drm_master *master)
+{
+	/* radeon doesn't support multi-master yet so just workaround */
+	struct drm_radeon_master_private *master_priv;
+
+	master_priv = drm_calloc(1, sizeof(*master_priv), DRM_MEM_DRIVER);
+	if (!master_priv)
+		return -ENOMEM;
+	
+	master->driver_priv = master_priv;
+	return 0;
+}
+
+void radeon_master_destroy(struct drm_device *dev, struct drm_master *master)
+{
+	struct drm_radeon_master_private *master_priv = master->driver_priv;
+	drm_radeon_private_t *dev_priv = dev->dev_private;
+
+	if (!master_priv)
+		return;
+
+	if (dev_priv->sarea_priv &&
+	    dev_priv->sarea_priv->pfCurrentPage != 0)
+		radeon_cp_dispatch_flip(dev, master);
+
+	dev_priv->sarea_priv = NULL;
+
+	if (master_priv->sarea)
+		drm_rmmap(dev, master_priv->sarea);
+
+	drm_free(master_priv, sizeof(*master_priv), DRM_MEM_DRIVER);
+	master->driver_priv = NULL;
 
-	radeon_do_release(dev);
 }
 
 int radeon_driver_open(struct drm_device *dev, struct drm_file *file_priv)


Index: kernel.spec
===================================================================
RCS file: /cvs/pkgs/rpms/kernel/devel/kernel.spec,v
retrieving revision 1.613
retrieving revision 1.614
diff -u -r1.613 -r1.614
--- kernel.spec	14 Apr 2008 04:04:52 -0000	1.613
+++ kernel.spec	15 Apr 2008 01:39:26 -0000	1.614
@@ -624,6 +624,7 @@
 Patch1804: nouveau-drm-update.patch
 Patch1806: linux-2.6-drm-i915-modeset.patch
 Patch1807: linux-2.6-drm-radeon-fix-oops.patch
+Patch1808: linux-2.6-drm-radeon-fix-oops2.patch
 
 # kludge to make ich9 e1000 work
 Patch2000: linux-2.6-e1000-ich9.patch
@@ -1148,6 +1149,7 @@
 ApplyPatch nouveau-drm-update.patch
 ApplyPatch linux-2.6-drm-i915-modeset.patch
 ApplyPatch linux-2.6-drm-radeon-fix-oops.patch
+ApplyPatch linux-2.6-drm-radeon-fix-oops2.patch
 
 # ext4dev stable patch queue, slated for 2.6.25
 #ApplyPatch linux-2.6-ext4-stable-queue.patch
@@ -1760,6 +1762,10 @@
 %kernel_variant_files -a /%{image_install_path}/xen*-%{KVERREL}.xen -e /etc/ld.so.conf.d/kernelcap-%{KVERREL}.xen.conf %{with_xen} xen
 
 %changelog
+* Tue Apr 15 2008 Dave Airlie <airlied at redhat.com>
+- fix oops on nouveau startup and make build again (#442122)
+- fix radeon oops seen on kerneloops (#442227)
+
 * Mon Apr 14 2008 Dave Airlie <airlied at redhat.com>
 - update to latest nouveau drm from git
 

nouveau-drm-update.patch:

Index: nouveau-drm-update.patch
===================================================================
RCS file: /cvs/pkgs/rpms/kernel/devel/nouveau-drm-update.patch,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -r1.1 -r1.2
--- nouveau-drm-update.patch	14 Apr 2008 04:04:52 -0000	1.1
+++ nouveau-drm-update.patch	15 Apr 2008 01:39:26 -0000	1.2
@@ -1,3 +1,21 @@
+commit 2ab03489c6a63b4861736f1904566c95098119bf
+Author: Dave Airlie <airlied at redhat.com>
+Date:   Mon Apr 14 13:38:40 2008 +1000
+
+    nouveau: update to latest drm
+
+diff --git a/drivers/char/drm/drm_mm.c b/drivers/char/drm/drm_mm.c
+index 369a052..7d8b670 100644
+--- a/drivers/char/drm/drm_mm.c
++++ b/drivers/char/drm/drm_mm.c
+@@ -217,6 +217,7 @@ void drm_mm_put_block(struct drm_mm_node * cur)
+ 		drm_ctl_free(cur, sizeof(*cur), DRM_MEM_MM);
+ 	}
+ }
++EXPORT_SYMBOL(drm_mm_put_block);
+ 
+ struct drm_mm_node *drm_mm_search_free(const struct drm_mm * mm,
+ 				  unsigned long size,
 diff --git a/drivers/char/drm/nouveau_bo.c b/drivers/char/drm/nouveau_bo.c
 index 9407bd3..ab3b23a 100644
 --- a/drivers/char/drm/nouveau_bo.c
@@ -555,9 +573,36 @@
  #define NV03_FIFO_CMD_JUMP                                 0x20000000
  #define NV03_FIFO_CMD_JUMP_OFFSET_MASK                     0x1ffffffc
 diff --git a/drivers/char/drm/nouveau_state.c b/drivers/char/drm/nouveau_state.c
-index 39524ae..d29e0eb 100644
+index 39524ae..90d5748 100644
 --- a/drivers/char/drm/nouveau_state.c
 +++ b/drivers/char/drm/nouveau_state.c
+@@ -41,7 +41,7 @@ static int nouveau_init_card_mappings(struct drm_device *dev)
+ 	/* map the mmio regs */
+ 	ret = drm_addmap(dev, drm_get_resource_start(dev, 0),
+ 			      drm_get_resource_len(dev, 0),
+-			      _DRM_REGISTERS, _DRM_READ_ONLY, &dev_priv->mmio);
++			      _DRM_REGISTERS, _DRM_READ_ONLY|_DRM_DRIVER, &dev_priv->mmio);
+ 	if (ret) {
+ 		DRM_ERROR("Unable to initialize the mmio mapping (%d). "
+ 			  "Please report your setup to " DRIVER_EMAIL "\n",
+@@ -60,7 +60,7 @@ static int nouveau_init_card_mappings(struct drm_device *dev)
+ 		ret = drm_addmap(dev,
+ 				 drm_get_resource_start(dev, ramin_resource),
+ 				 drm_get_resource_len(dev, ramin_resource),
+-				 _DRM_REGISTERS, _DRM_READ_ONLY,
++				 _DRM_REGISTERS, _DRM_READ_ONLY|_DRM_DRIVER,
+ 				 &dev_priv->ramin);
+ 		if (ret) {
+ 			DRM_ERROR("Failed to init RAMIN mapping, "
+@@ -75,7 +75,7 @@ static int nouveau_init_card_mappings(struct drm_device *dev)
+ 		ret = drm_addmap(dev,
+ 				 drm_get_resource_start(dev, 0) + NV_RAMIN,
+ 				 (1*1024*1024),
+-				 _DRM_REGISTERS, _DRM_READ_ONLY,
++				 _DRM_REGISTERS, _DRM_READ_ONLY|_DRM_DRIVER,
+ 				 &dev_priv->ramin);
+ 		if (ret) {
+ 			DRM_ERROR("Failed to map BAR0 PRAMIN: %d\n", ret);
 @@ -384,6 +384,7 @@ static void nouveau_card_takedown(struct drm_device *dev)
  		nouveau_sgdma_takedown(dev);
  
@@ -566,6 +611,30 @@
  
  		nouveau_mem_close(dev);
  		engine->instmem.takedown(dev);
+@@ -416,6 +417,7 @@ int nouveau_firstopen(struct drm_device *dev)
+ 	struct device_node *dn;
+ #endif
+ 	int ret;
++
+ 	/* Map any PCI resources we need on the card */
+ 	ret = nouveau_init_card_mappings(dev);
+ 	if (ret) return ret;
+@@ -559,6 +561,15 @@ void nouveau_lastclose(struct drm_device *dev)
+ 			drm_mtrr_del(dev_priv->fb_mtrr, drm_get_resource_start(dev, 1),nouveau_mem_fb_amount(dev), DRM_MTRR_WC);
+ 			dev_priv->fb_mtrr=0;
+ 		}
++
++		if (dev_priv->ramin) {
++			drm_rmmap(dev, dev_priv->ramin);
++			dev_priv->ramin = NULL;
++		}
++		if (dev_priv->mmio) {
++			drm_rmmap(dev, dev_priv->mmio);
++			dev_priv->mmio = NULL;
++		}
+ 	}
+ }
+ 
 diff --git a/drivers/char/drm/nv04_mc.c b/drivers/char/drm/nv04_mc.c
 index 766f3a3..24c1f7b 100644
 --- a/drivers/char/drm/nv04_mc.c




More information about the fedora-extras-commits mailing list