rpms/kernel/F-10 drm-modesetting-radeon.patch, 1.62, 1.63 kernel.spec, 1.1166, 1.1167

Dave Airlie airlied at fedoraproject.org
Sun Nov 30 08:32:43 UTC 2008


Author: airlied

Update of /cvs/pkgs/rpms/kernel/F-10
In directory cvs1.fedora.phx.redhat.com:/tmp/cvs-serv19033

Modified Files:
	drm-modesetting-radeon.patch kernel.spec 
Log Message:
- radeon: fix card posting, module unload and radeon AGP issues


drm-modesetting-radeon.patch:

Index: drm-modesetting-radeon.patch
===================================================================
RCS file: /cvs/pkgs/rpms/kernel/F-10/drm-modesetting-radeon.patch,v
retrieving revision 1.62
retrieving revision 1.63
diff -u -r1.62 -r1.63
--- drm-modesetting-radeon.patch	27 Nov 2008 01:44:43 -0000	1.62
+++ drm-modesetting-radeon.patch	30 Nov 2008 08:32:10 -0000	1.63
@@ -1,3 +1,25 @@
+commit 97bbdd07e8abe3172715a4e9403e84341fb240ec
+Author: Dave Airlie <airlied at linux.ie>
+Date:   Sun Nov 30 18:24:14 2008 +1000
+
+    radeon: write agp base/location when kms is enabled
+    
+    this hopefully will make AGP systems actually work
+
+commit 1ff222030a971f3d1274dfcb3742a35996ccc6c8
+Author: Dave Airlie <airlied at redhat.com>
+Date:   Fri Nov 28 09:19:47 2008 +1000
+
+    drm: cleanup exit path mess using a linked list.
+    
+    Just keep a list of devices per driver and cleanup on exit
+
+commit 1f745bdfe55455d707625ad5a28b834db636b679
+Author: Dave Airlie <airlied at redhat.com>
+Date:   Thu Nov 27 17:14:40 2008 +1000
+
+    radeon: post any GPUs that aren't posted
+
 commit 5a7e1ee57ec37fb479cb3f7dc428bdb8cb9099ad
 Author: Dave Airlie <airlied at redhat.com>
 Date:   Mon Nov 24 15:18:31 2008 +1000
@@ -8359,7 +8381,7 @@
  /**
   * Free a buffer.
 diff --git a/drivers/gpu/drm/drm_drv.c b/drivers/gpu/drm/drm_drv.c
-index 996097a..f328b24 100644
+index 996097a..64907a6 100644
 --- a/drivers/gpu/drm/drm_drv.c
 +++ b/drivers/gpu/drm/drm_drv.c
 @@ -74,6 +74,9 @@ static struct drm_ioctl_desc drm_ioctls[] = {
@@ -8488,7 +8510,24 @@
  	mutex_unlock(&dev->struct_mutex);
  
  	DRM_DEBUG("lastclose completed\n");
-@@ -318,18 +315,21 @@ static void drm_cleanup(struct drm_device * dev)
+@@ -263,6 +260,8 @@ int drm_init(struct drm_driver *driver)
+ 
+ 	DRM_DEBUG("\n");
+ 
++	INIT_LIST_HEAD(&driver->device_list);
++
+ 	for (i = 0; driver->pci_driver.id_table[i].vendor != 0; i++) {
+ 		pid = (struct pci_device_id *)&driver->pci_driver.id_table[i];
+ 
+@@ -299,7 +298,6 @@ EXPORT_SYMBOL(drm_init);
+ static void drm_cleanup(struct drm_device * dev)
+ {
+ 	DRM_DEBUG("\n");
+-
+ 	if (!dev) {
+ 		DRM_ERROR("cleanup called no dev\n");
+ 		return;
+@@ -318,47 +316,33 @@ static void drm_cleanup(struct drm_device * dev)
  		DRM_DEBUG("mtrr_del=%d\n", retval);
  	}
  
@@ -8512,24 +8551,40 @@
 +
  	if (drm_put_dev(dev))
  		DRM_ERROR("Cannot unload module\n");
- }
-@@ -344,8 +344,13 @@ static int drm_minors_cleanup(int id, void *ptr, void *data)
- 	if (minor->dev->driver != driver)
- 		return 0;
- 
+-}
+-
+-static int drm_minors_cleanup(int id, void *ptr, void *data)
+-{
+-	struct drm_minor *minor = ptr;
+-	struct drm_device *dev;
+-	struct drm_driver *driver = data;
+-
+-	dev = minor->dev;
+-	if (minor->dev->driver != driver)
+-		return 0;
+-
 -	if (minor->type != DRM_MINOR_LEGACY)
 -		return 0;
-+	if (drm_core_check_feature(dev, DRIVER_MODESET)) {
-+		if (minor->type != DRM_MINOR_CONTROL)
-+			return 0;
-+	} else {
-+		if (minor->type != DRM_MINOR_LEGACY)
-+			return 0;
-+	}
  
- 	if (dev)
- 		pci_dev_put(dev->pdev);
-@@ -373,9 +378,34 @@ static const struct file_operations drm_stub_fops = {
+-	if (dev)
+-		pci_dev_put(dev->pdev);
+-	drm_cleanup(dev);
+-	return 1;
+ }
+ 
+ void drm_exit(struct drm_driver *driver)
+ {
++	struct drm_device *dev, *tmp;
+ 	DRM_DEBUG("\n");
+ 
+-	idr_for_each(&drm_minors_idr, &drm_minors_cleanup, driver);
+-
++	list_for_each_entry_safe(dev, tmp, &driver->device_list, driver_item) 
++		drm_cleanup(dev);
+ 	DRM_INFO("Module unloaded\n");
+ }
+ 
+@@ -373,9 +357,34 @@ static const struct file_operations drm_stub_fops = {
  static int __init drm_core_init(void)
  {
  	int ret = -ENOMEM;
@@ -11157,7 +11212,7 @@
  		DRM_PROC_PRINT("%s %s\n", dev->driver->pci_driver.name,
  			       pci_name(dev->pdev));
 diff --git a/drivers/gpu/drm/drm_stub.c b/drivers/gpu/drm/drm_stub.c
-index 66c96ec..7570311 100644
+index 66c96ec..72a63ed 100644
 --- a/drivers/gpu/drm/drm_stub.c
 +++ b/drivers/gpu/drm/drm_stub.c
 @@ -57,6 +57,14 @@ static int drm_minor_get_id(struct drm_device *dev, int type)
@@ -11340,7 +11395,7 @@
  
  	idr_replace(&drm_minors_idr, new_minor, minor_id);
  
-@@ -267,15 +383,31 @@ int drm_get_dev(struct pci_dev *pdev, const struct pci_device_id *ent,
+@@ -267,15 +383,32 @@ int drm_get_dev(struct pci_dev *pdev, const struct pci_device_id *ent,
  		printk(KERN_ERR "DRM: Fill_in_dev failed.\n");
  		goto err_g2;
  	}
@@ -11362,6 +11417,7 @@
 +		if (drm_mode_group_init_legacy_group(dev, &dev->primary->mode_group))
 +			goto err_g3;
 +
++	list_add_tail(&dev->driver_item, &driver->device_list);
  
  	DRM_INFO("Initialized %s %d.%d.%d %s on minor %d\n",
  		 driver->name, driver->major, driver->minor, driver->patchlevel,
@@ -11374,7 +11430,7 @@
  err_g2:
  	pci_disable_device(pdev);
  err_g1:
-@@ -297,11 +429,6 @@ int drm_put_dev(struct drm_device * dev)
+@@ -297,11 +430,6 @@ int drm_put_dev(struct drm_device * dev)
  {
  	DRM_DEBUG("release primary %s\n", dev->driver->pci_driver.name);
  
@@ -11386,6 +11442,14 @@
  	if (dev->devname) {
  		drm_free(dev->devname, strlen(dev->devname) + 1,
  			 DRM_MEM_DRIVER);
+@@ -324,7 +452,6 @@ int drm_put_dev(struct drm_device * dev)
+ int drm_put_minor(struct drm_minor **minor_p)
+ {
+ 	struct drm_minor *minor = *minor_p;
+-
+ 	DRM_DEBUG("release secondary minor %d\n", minor->index);
+ 
+ 	if (minor->type == DRM_MINOR_LEGACY)
 @@ -337,3 +464,4 @@ int drm_put_minor(struct drm_minor **minor_p)
  	*minor_p = NULL;
  	return 0;
@@ -24196,7 +24260,7 @@
 +	return NULL;
 +}
 diff --git a/drivers/gpu/drm/radeon/radeon_cp.c b/drivers/gpu/drm/radeon/radeon_cp.c
-index dcebb4b..e086f1d 100644
+index dcebb4b..c660898 100644
 --- a/drivers/gpu/drm/radeon/radeon_cp.c
 +++ b/drivers/gpu/drm/radeon/radeon_cp.c
 @@ -31,6 +31,7 @@
@@ -24365,29 +24429,29 @@
 +		RADEON_WRITE(RADEON_CLOCK_CNTL_INDEX, save);
 +	}
 +}
- 
--	RADEON_WRITE8(RADEON_CLOCK_CNTL_INDEX, addr & 0x1f);
--	return RADEON_READ(RADEON_CLOCK_CNTL_DATA);
++
 +u32 RADEON_READ_PLL(struct drm_radeon_private *dev_priv, int addr)
 +{
 +	uint32_t data;
-+
+ 
+-	RADEON_WRITE8(RADEON_CLOCK_CNTL_INDEX, addr & 0x1f);
+-	return RADEON_READ(RADEON_CLOCK_CNTL_DATA);
 +	RADEON_WRITE8(RADEON_CLOCK_CNTL_INDEX, addr & 0x3f);
 +	radeon_pll_errata_after_index(dev_priv);
 +	data = RADEON_READ(RADEON_CLOCK_CNTL_DATA);
 +	radeon_pll_errata_after_data(dev_priv);
 +	return data;
- }
- 
--static u32 RADEON_READ_PCIE(drm_radeon_private_t *dev_priv, int addr)
++}
++
 +void RADEON_WRITE_PLL(struct drm_radeon_private *dev_priv, int addr, uint32_t data)
 +{
 +	RADEON_WRITE8(RADEON_CLOCK_CNTL_INDEX, ((addr & 0x3f) | RADEON_PLL_WR_EN));
 +	radeon_pll_errata_after_index(dev_priv);
 +	RADEON_WRITE(RADEON_CLOCK_CNTL_DATA, data);
 +	radeon_pll_errata_after_data(dev_priv);
-+}
-+
+ }
+ 
+-static u32 RADEON_READ_PCIE(drm_radeon_private_t *dev_priv, int addr)
 +u32 RADEON_READ_PCIE(drm_radeon_private_t *dev_priv, int addr)
  {
  	RADEON_WRITE8(RADEON_PCIE_INDEX, addr & 0xff);
@@ -24526,7 +24590,7 @@
  
  	/* Initialize the memory controller. With new memory map, the fb location
  	 * is not changed, it should have been properly initialized already. Part
-@@ -568,9 +724,13 @@ static void radeon_cp_init_ring_buffer(struct drm_device * dev,
+@@ -568,9 +724,22 @@ static void radeon_cp_init_ring_buffer(struct drm_device * dev,
  	 */
  	if (!dev_priv->new_memmap)
  		radeon_write_fb_location(dev_priv,
@@ -24539,11 +24603,20 @@
 +	if (dev_priv->mm.ring.bo) {
 +		ring_start = dev_priv->mm.ring.bo->offset +
 +			dev_priv->gart_vm_start;
++#if __OS_HAS_AGP
++		if (dev_priv->flags & RADEON_IS_AGP) {
++			radeon_write_agp_base(dev_priv, dev->agp->base);
++			radeon_write_agp_location(dev_priv,
++				     (((dev_priv->gart_vm_start - 1 +
++					dev_priv->gart_size) & 0xffff0000) |
++				      (dev_priv->gart_vm_start >> 16)), 0);
++#endif
++		}
 +	} else
  #if __OS_HAS_AGP
  	if (dev_priv->flags & RADEON_IS_AGP) {
  		radeon_write_agp_base(dev_priv, dev->agp->base);
-@@ -578,7 +738,7 @@ static void radeon_cp_init_ring_buffer(struct drm_device * dev,
+@@ -578,7 +747,7 @@ static void radeon_cp_init_ring_buffer(struct drm_device * dev,
  		radeon_write_agp_location(dev_priv,
  			     (((dev_priv->gart_vm_start - 1 +
  				dev_priv->gart_size) & 0xffff0000) |
@@ -24552,7 +24625,7 @@
  
  		ring_start = (dev_priv->cp_ring->offset
  			      - dev->agp->base
-@@ -600,6 +760,12 @@ static void radeon_cp_init_ring_buffer(struct drm_device * dev,
+@@ -600,6 +769,12 @@ static void radeon_cp_init_ring_buffer(struct drm_device * dev,
  	SET_RING_HEAD(dev_priv, cur_read_ptr);
  	dev_priv->ring.tail = cur_read_ptr;
  
@@ -24565,7 +24638,7 @@
  #if __OS_HAS_AGP
  	if (dev_priv->flags & RADEON_IS_AGP) {
  		RADEON_WRITE(RADEON_CP_RB_RPTR_ADDR,
-@@ -646,63 +812,79 @@ static void radeon_cp_init_ring_buffer(struct drm_device * dev,
+@@ -646,63 +821,79 @@ static void radeon_cp_init_ring_buffer(struct drm_device * dev,
  	RADEON_WRITE(RADEON_SCRATCH_ADDR, RADEON_READ(RADEON_CP_RB_RPTR_ADDR)
  		     + RADEON_SCRATCH_REG_OFFSET);
  
@@ -24605,26 +24678,26 @@
 +
 +	dev_priv->scratch[0] = 0;
 +	RADEON_WRITE(RADEON_LAST_FRAME_REG, 0);
-+
-+	dev_priv->scratch[1] = 0;
-+	RADEON_WRITE(RADEON_LAST_DISPATCH_REG, 0);
-+
-+	dev_priv->scratch[2] = 0;
-+	RADEON_WRITE(RADEON_LAST_CLEAR_REG, 0);
  
 -	dev_priv->sarea_priv->last_frame = dev_priv->scratch[0] = 0;
 -	RADEON_WRITE(RADEON_LAST_FRAME_REG, dev_priv->sarea_priv->last_frame);
-+	dev_priv->scratch[3] = 0;
-+	RADEON_WRITE(RADEON_LAST_SWI_REG, 0);
++	dev_priv->scratch[1] = 0;
++	RADEON_WRITE(RADEON_LAST_DISPATCH_REG, 0);
  
 -	dev_priv->sarea_priv->last_dispatch = dev_priv->scratch[1] = 0;
 -	RADEON_WRITE(RADEON_LAST_DISPATCH_REG,
 -		     dev_priv->sarea_priv->last_dispatch);
-+	dev_priv->scratch[4] = 0;
-+	RADEON_WRITE(RADEON_SCRATCH_REG4, 0);
++	dev_priv->scratch[2] = 0;
++	RADEON_WRITE(RADEON_LAST_CLEAR_REG, 0);
  
 -	dev_priv->sarea_priv->last_clear = dev_priv->scratch[2] = 0;
 -	RADEON_WRITE(RADEON_LAST_CLEAR_REG, dev_priv->sarea_priv->last_clear);
++	dev_priv->scratch[3] = 0;
++	RADEON_WRITE(RADEON_LAST_SWI_REG, 0);
++
++	dev_priv->scratch[4] = 0;
++	RADEON_WRITE(RADEON_SCRATCH_REG4, 0);
++
 +	dev_priv->scratch[6] = 0;
 +	RADEON_WRITE(RADEON_SCRATCH_REG6, 0);
  
@@ -24674,7 +24747,7 @@
  		    0xdeadbeef)
  			break;
  		DRM_UDELAY(1);
-@@ -720,10 +902,12 @@ static void radeon_test_writeback(drm_radeon_private_t * dev_priv)
+@@ -720,10 +911,12 @@ static void radeon_test_writeback(drm_radeon_private_t * dev_priv)
  		DRM_INFO("writeback forced off\n");
  	}
  
@@ -24690,7 +24763,7 @@
  		RADEON_WRITE(RADEON_SCRATCH_UMSK, 0);
  	}
  }
-@@ -734,10 +918,25 @@ static void radeon_set_igpgart(drm_radeon_private_t * dev_priv, int on)
+@@ -734,10 +927,25 @@ static void radeon_set_igpgart(drm_radeon_private_t * dev_priv, int on)
  	u32 temp;
  
  	if (on) {
@@ -24719,7 +24792,7 @@
  
  		temp = IGP_READ_MCIND(dev_priv, RS480_MC_MISC_CNTL);
  		if (((dev_priv->flags & RADEON_FAMILY_MASK) == CHIP_RS690) ||
-@@ -747,8 +946,7 @@ static void radeon_set_igpgart(drm_radeon_private_t * dev_priv, int on)
+@@ -747,8 +955,7 @@ static void radeon_set_igpgart(drm_radeon_private_t * dev_priv, int on)
  		else
  			IGP_WRITE_MCIND(RS480_MC_MISC_CNTL, RS480_GART_INDEX_REG_EN);
  
@@ -24729,7 +24802,7 @@
  
  		temp = IGP_READ_MCIND(dev_priv, RS480_GART_FEATURE_ID);
  		IGP_WRITE_MCIND(RS480_GART_FEATURE_ID, (RS480_HANG_EN |
-@@ -764,24 +962,31 @@ static void radeon_set_igpgart(drm_radeon_private_t * dev_priv, int on)
+@@ -764,24 +971,31 @@ static void radeon_set_igpgart(drm_radeon_private_t * dev_priv, int on)
  		IGP_WRITE_MCIND(RS480_AGP_MODE_CNTL, ((1 << RS480_REQ_TYPE_SNOOP_SHIFT) |
  						      RS480_REQ_TYPE_SNOOP_DIS));
  
@@ -24767,7 +24840,7 @@
  
  		IGP_WRITE_MCIND(RS480_GART_CACHE_CNTRL,
  				RS480_GART_CACHE_INVALIDATE);
-@@ -791,7 +996,7 @@ static void radeon_set_igpgart(drm_radeon_private_t * dev_priv, int on)
+@@ -791,7 +1005,7 @@ static void radeon_set_igpgart(drm_radeon_private_t * dev_priv, int on)
  			if ((temp & RS480_GART_CACHE_INVALIDATE) == 0)
  				break;
  			DRM_UDELAY(1);
@@ -24776,7 +24849,7 @@
  
  		IGP_WRITE_MCIND(RS480_GART_CACHE_CNTRL, 0);
  	} else {
-@@ -818,7 +1023,7 @@ static void radeon_set_pciegart(drm_radeon_private_t * dev_priv, int on)
+@@ -818,7 +1032,7 @@ static void radeon_set_pciegart(drm_radeon_private_t * dev_priv, int on)
  				  dev_priv->gart_vm_start +
  				  dev_priv->gart_size - 1);
  
@@ -24785,7 +24858,7 @@
  
  		RADEON_WRITE_PCIE(RADEON_PCIE_TX_GART_CNTL,
  				  RADEON_PCIE_TX_GART_EN);
-@@ -829,7 +1034,7 @@ static void radeon_set_pciegart(drm_radeon_private_t * dev_priv, int on)
+@@ -829,7 +1043,7 @@ static void radeon_set_pciegart(drm_radeon_private_t * dev_priv, int on)
  }
  
  /* Enable or disable PCI GART on the chip */
@@ -24794,7 +24867,7 @@
  {
  	u32 tmp;
  
-@@ -863,7 +1068,7 @@ static void radeon_set_pcigart(drm_radeon_private_t * dev_priv, int on)
+@@ -863,7 +1077,7 @@ static void radeon_set_pcigart(drm_radeon_private_t * dev_priv, int on)
  
  		/* Turn off AGP aperture -- is this required for PCI GART?
  		 */
@@ -24803,7 +24876,7 @@
  		RADEON_WRITE(RADEON_AGP_COMMAND, 0);	/* clear AGP_COMMAND */
  	} else {
  		RADEON_WRITE(RADEON_AIC_CNTL,
-@@ -871,9 +1076,11 @@ static void radeon_set_pcigart(drm_radeon_private_t * dev_priv, int on)
+@@ -871,9 +1085,11 @@ static void radeon_set_pcigart(drm_radeon_private_t * dev_priv, int on)
  	}
  }
  
@@ -24816,7 +24889,7 @@
  
  	DRM_DEBUG("\n");
  
-@@ -911,17 +1118,6 @@ static int radeon_do_init_cp(struct drm_device * dev, drm_radeon_init_t * init)
+@@ -911,17 +1127,6 @@ static int radeon_do_init_cp(struct drm_device * dev, drm_radeon_init_t * init)
  	 */
  	dev_priv->vblank_crtc = DRM_RADEON_VBLANK_CRTC1;
  
@@ -24834,7 +24907,7 @@
  	dev_priv->do_boxes = 0;
  	dev_priv->cp_mode = init->cp_mode;
  
-@@ -969,9 +1165,8 @@ static int radeon_do_init_cp(struct drm_device * dev, drm_radeon_init_t * init)
+@@ -969,9 +1174,8 @@ static int radeon_do_init_cp(struct drm_device * dev, drm_radeon_init_t * init)
  	 */
  	dev_priv->depth_clear.rb3d_cntl = (RADEON_PLANE_MASK_ENABLE |
  					   (dev_priv->color_fmt << 10) |
@@ -24846,7 +24919,7 @@
  	dev_priv->depth_clear.rb3d_zstencilcntl =
  	    (dev_priv->depth_fmt |
  	     RADEON_Z_TEST_ALWAYS |
-@@ -998,8 +1193,8 @@ static int radeon_do_init_cp(struct drm_device * dev, drm_radeon_init_t * init)
+@@ -998,8 +1202,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;
  
@@ -24857,7 +24930,7 @@
  		DRM_ERROR("could not find sarea!\n");
  		radeon_do_cleanup_cp(dev);
  		return -EINVAL;
-@@ -1035,10 +1230,6 @@ static int radeon_do_init_cp(struct drm_device * dev, drm_radeon_init_t * init)
+@@ -1035,10 +1239,6 @@ static int radeon_do_init_cp(struct drm_device * dev, drm_radeon_init_t * init)
  		}
  	}
  
@@ -24868,7 +24941,7 @@
  #if __OS_HAS_AGP
  	if (dev_priv->flags & RADEON_IS_AGP) {
  		drm_core_ioremap(dev_priv->cp_ring, dev);
-@@ -1152,8 +1343,7 @@ static int radeon_do_init_cp(struct drm_device * dev, drm_radeon_init_t * init)
+@@ -1152,8 +1352,7 @@ static int radeon_do_init_cp(struct drm_device * dev, drm_radeon_init_t * init)
  	dev_priv->ring.rptr_update = /* init->rptr_update */ 4096;
  	dev_priv->ring.rptr_update_l2qw = drm_order( /* init->rptr_update */ 4096 / 8);
  
@@ -24878,7 +24951,7 @@
  	dev_priv->ring.tail_mask = (dev_priv->ring.size / sizeof(u32)) - 1;
  
  	dev_priv->ring.high_mark = RADEON_RING_HIGH_MARK;
-@@ -1168,28 +1358,41 @@ static int radeon_do_init_cp(struct drm_device * dev, drm_radeon_init_t * init)
+@@ -1168,28 +1367,41 @@ static int radeon_do_init_cp(struct drm_device * dev, drm_radeon_init_t * init)
  		dev_priv->gart_info.table_mask = DMA_BIT_MASK(32);
  		/* if we have an offset set from userspace */
  		if (dev_priv->pcigart_offset_set) {
@@ -24940,7 +25013,7 @@
  			if (dev_priv->flags & RADEON_IS_IGPGART)
  				dev_priv->gart_info.gart_reg_if = DRM_ATI_GART_IGP;
  			else
-@@ -1198,12 +1401,7 @@ static int radeon_do_init_cp(struct drm_device * dev, drm_radeon_init_t * init)
+@@ -1198,12 +1410,7 @@ static int radeon_do_init_cp(struct drm_device * dev, drm_radeon_init_t * init)
  			    DRM_ATI_GART_MAIN;
  			dev_priv->gart_info.addr = NULL;
  			dev_priv->gart_info.bus_addr = 0;
@@ -24954,7 +25027,7 @@
  		}
  
  		if (!drm_ati_pcigart_init(dev, &dev_priv->gart_info)) {
-@@ -1216,6 +1414,9 @@ static int radeon_do_init_cp(struct drm_device * dev, drm_radeon_init_t * init)
+@@ -1216,6 +1423,9 @@ static int radeon_do_init_cp(struct drm_device * dev, drm_radeon_init_t * init)
  		radeon_set_pcigart(dev_priv, 1);
  	}
  
@@ -24964,7 +25037,7 @@
  	radeon_cp_load_microcode(dev_priv);
  	radeon_cp_init_ring_buffer(dev, dev_priv);
  
-@@ -1260,14 +1461,16 @@ static int radeon_do_cleanup_cp(struct drm_device * dev)
+@@ -1260,14 +1470,16 @@ static int radeon_do_cleanup_cp(struct drm_device * dev)
  		if (dev_priv->gart_info.bus_addr) {
  			/* Turn off PCI GART */
  			radeon_set_pcigart(dev_priv, 0);
@@ -24985,7 +25058,7 @@
  		}
  	}
  	/* only clear to the start of flags */
-@@ -1319,6 +1522,10 @@ static int radeon_do_resume_cp(struct drm_device * dev)
+@@ -1319,6 +1531,10 @@ static int radeon_do_resume_cp(struct drm_device * dev)
  int radeon_cp_init(struct drm_device *dev, void *data, struct drm_file *file_priv)
  {
  	drm_radeon_init_t *init = data;
@@ -24996,7 +25069,7 @@
  
  	LOCK_TEST_WITH_RETURN(dev, file_priv);
  
-@@ -1329,7 +1536,7 @@ int radeon_cp_init(struct drm_device *dev, void *data, struct drm_file *file_pri
+@@ -1329,7 +1545,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:
@@ -25005,7 +25078,7 @@
  	case RADEON_CLEANUP_CP:
  		return radeon_do_cleanup_cp(dev);
  	}
-@@ -1342,6 +1549,9 @@ int radeon_cp_start(struct drm_device *dev, void *data, struct drm_file *file_pr
+@@ -1342,6 +1558,9 @@ int radeon_cp_start(struct drm_device *dev, void *data, struct drm_file *file_pr
  	drm_radeon_private_t *dev_priv = dev->dev_private;
  	DRM_DEBUG("\n");
  
@@ -25015,7 +25088,7 @@
  	LOCK_TEST_WITH_RETURN(dev, file_priv);
  
  	if (dev_priv->cp_running) {
-@@ -1369,6 +1579,9 @@ int radeon_cp_stop(struct drm_device *dev, void *data, struct drm_file *file_pri
+@@ -1369,6 +1588,9 @@ int radeon_cp_stop(struct drm_device *dev, void *data, struct drm_file *file_pri
  	int ret;
  	DRM_DEBUG("\n");
  
@@ -25025,7 +25098,7 @@
  	LOCK_TEST_WITH_RETURN(dev, file_priv);
  
  	if (!dev_priv->cp_running)
-@@ -1407,6 +1620,9 @@ void radeon_do_release(struct drm_device * dev)
+@@ -1407,6 +1629,9 @@ void radeon_do_release(struct drm_device * dev)
  	drm_radeon_private_t *dev_priv = dev->dev_private;
  	int i, ret;
  
@@ -25035,7 +25108,7 @@
  	if (dev_priv) {
  		if (dev_priv->cp_running) {
  			/* Stop the cp */
-@@ -1440,6 +1656,9 @@ void radeon_do_release(struct drm_device * dev)
+@@ -1440,6 +1665,9 @@ void radeon_do_release(struct drm_device * dev)
  		radeon_mem_takedown(&(dev_priv->gart_heap));
  		radeon_mem_takedown(&(dev_priv->fb_heap));
  
@@ -25045,7 +25118,7 @@
  		/* deallocate kernel resources */
  		radeon_do_cleanup_cp(dev);
  	}
-@@ -1452,6 +1671,9 @@ int radeon_cp_reset(struct drm_device *dev, void *data, struct drm_file *file_pr
+@@ -1452,6 +1680,9 @@ int radeon_cp_reset(struct drm_device *dev, void *data, struct drm_file *file_pr
  	drm_radeon_private_t *dev_priv = dev->dev_private;
  	DRM_DEBUG("\n");
  
@@ -25055,7 +25128,7 @@
  	LOCK_TEST_WITH_RETURN(dev, file_priv);
  
  	if (!dev_priv) {
-@@ -1472,7 +1694,9 @@ int radeon_cp_idle(struct drm_device *dev, void *data, struct drm_file *file_pri
+@@ -1472,7 +1703,9 @@ int radeon_cp_idle(struct drm_device *dev, void *data, struct drm_file *file_pri
  	drm_radeon_private_t *dev_priv = dev->dev_private;
  	DRM_DEBUG("\n");
  
@@ -25066,7 +25139,7 @@
  
  	return radeon_do_cp_idle(dev_priv);
  }
-@@ -1482,6 +1706,9 @@ int radeon_cp_idle(struct drm_device *dev, void *data, struct drm_file *file_pri
+@@ -1482,6 +1715,9 @@ int radeon_cp_idle(struct drm_device *dev, void *data, struct drm_file *file_pri
  int radeon_cp_resume(struct drm_device *dev, void *data, struct drm_file *file_priv)
  {
  
@@ -25076,7 +25149,7 @@
  	return radeon_do_resume_cp(dev);
  }
  
-@@ -1489,6 +1716,9 @@ int radeon_engine_reset(struct drm_device *dev, void *data, struct drm_file *fil
+@@ -1489,6 +1725,9 @@ int radeon_engine_reset(struct drm_device *dev, void *data, struct drm_file *fil
  {
  	DRM_DEBUG("\n");
  
@@ -25086,7 +25159,7 @@
  	LOCK_TEST_WITH_RETURN(dev, file_priv);
  
  	return radeon_do_engine_reset(dev);
-@@ -1711,6 +1941,715 @@ int radeon_cp_buffers(struct drm_device *dev, void *data, struct drm_file *file_
+@@ -1711,6 +1950,732 @@ int radeon_cp_buffers(struct drm_device *dev, void *data, struct drm_file *file_
  	return ret;
  }
  
@@ -25799,10 +25872,27 @@
 +	return 0;
 +}
 +
++static bool radeon_card_posted(struct drm_device *dev)
++{
++	drm_radeon_private_t *dev_priv = dev->dev_private;
++	uint32_t reg;
++
++	if (radeon_is_avivo(dev_priv)) {
++		reg = RADEON_READ(AVIVO_D1CRTC_CONTROL) | RADEON_READ(AVIVO_D2CRTC_CONTROL);
++		if (reg & AVIVO_CRTC_EN)
++			return true;
++	} else {
++		reg = RADEON_READ(RADEON_CRTC_GEN_CNTL) | RADEON_READ(RADEON_CRTC2_GEN_CNTL);
++		if (reg & RADEON_CRTC_EN)
++			return true;
++	}
++	return false;
++		
++}
  int radeon_driver_load(struct drm_device *dev, unsigned long flags)
  {
  	drm_radeon_private_t *dev_priv;
-@@ -1724,6 +2663,8 @@ int radeon_driver_load(struct drm_device *dev, unsigned long flags)
+@@ -1724,6 +2689,8 @@ int radeon_driver_load(struct drm_device *dev, unsigned long flags)
  	dev->dev_private = (void *)dev_priv;
  	dev_priv->flags = flags;
  
@@ -25811,7 +25901,7 @@
  	switch (flags & RADEON_FAMILY_MASK) {
  	case CHIP_R100:
  	case CHIP_RV200:
-@@ -1744,6 +2685,18 @@ int radeon_driver_load(struct drm_device *dev, unsigned long flags)
+@@ -1744,6 +2711,18 @@ int radeon_driver_load(struct drm_device *dev, unsigned long flags)
  		break;
  	}
  
@@ -25830,7 +25920,7 @@
  	if (drm_device_is_agp(dev))
  		dev_priv->flags |= RADEON_IS_AGP;
  	else if (drm_device_is_pcie(dev))
-@@ -1751,9 +2704,25 @@ int radeon_driver_load(struct drm_device *dev, unsigned long flags)
+@@ -1751,9 +2730,25 @@ int radeon_driver_load(struct drm_device *dev, unsigned long flags)
  	else
  		dev_priv->flags |= RADEON_IS_PCI;
  
@@ -25857,7 +25947,7 @@
  	if (ret != 0)
  		return ret;
  
-@@ -1763,9 +2732,99 @@ int radeon_driver_load(struct drm_device *dev, unsigned long flags)
+@@ -1763,28 +2758,122 @@ int radeon_driver_load(struct drm_device *dev, unsigned long flags)
  		return ret;
  	}
  
@@ -25884,6 +25974,16 @@
 +	    dev_priv->chip_family == CHIP_RS200)
 +		dev_priv->pll_errata |= CHIP_ERRATA_PLL_DELAY;
 +
++	/* check if cards are posted or not */
++	if (!radeon_card_posted(dev) && dev_priv->bios) {
++		DRM_INFO("GPU not posted. posting now...\n");
++		if (dev_priv->is_atom_bios) {
++			struct atom_context *ctx = dev_priv->mode_info.atom_context;
++			atom_asic_init(ctx);
++		} else {
++			radeon_combios_asic_init(dev);
++		}
++	}
 +
 +	if (drm_core_check_feature(dev, DRIVER_MODESET))
 +		radeon_static_clocks_init(dev);
@@ -25906,13 +26006,13 @@
 +	}
 +
 +
- 	return ret;
++	return ret;
 +modeset_fail:
 +	dev->driver->driver_features &= ~DRIVER_MODESET;
 +	drm_put_minor(&dev->control);
-+	return ret;
-+}
-+
+ 	return ret;
+ }
+ 
 +int radeon_master_create(struct drm_device *dev, struct drm_master *master)
 +{
 +	struct drm_radeon_master_private *master_priv;
@@ -25956,10 +26056,10 @@
 +	drm_free(master_priv, sizeof(*master_priv), DRM_MEM_DRIVER);
 +
 +	master->driver_priv = NULL;
- }
- 
++}
++
  /* Create mappings for registers and framebuffer so userland doesn't necessarily
-@@ -1773,18 +2832,12 @@ int radeon_driver_load(struct drm_device *dev, unsigned long flags)
+  * have to find them.
   */
  int radeon_driver_firstopen(struct drm_device *dev)
  {
@@ -25981,7 +26081,7 @@
  
  	return 0;
  }
-@@ -1793,6 +2846,18 @@ int radeon_driver_unload(struct drm_device *dev)
+@@ -1793,6 +2882,18 @@ int radeon_driver_unload(struct drm_device *dev)
  {
  	drm_radeon_private_t *dev_priv = dev->dev_private;
  
@@ -26000,7 +26100,7 @@
  	DRM_DEBUG("\n");
  
  	drm_rmmap(dev, dev_priv->mmio);
-@@ -1802,3 +2867,63 @@ int radeon_driver_unload(struct drm_device *dev)
+@@ -1802,3 +2903,63 @@ int radeon_driver_unload(struct drm_device *dev)
  	dev->dev_private = NULL;
  	return 0;
  }
@@ -42169,7 +42269,7 @@
   * Device specific ioctls should only be in their respective headers
   * The device specific ioctl range is from 0x40 to 0x99.
 diff --git a/include/drm/drmP.h b/include/drm/drmP.h
-index d5e8e5c..339216f 100644
+index d5e8e5c..18cae19 100644
 --- a/include/drm/drmP.h
 +++ b/include/drm/drmP.h
 @@ -87,6 +87,7 @@ struct drm_device;
@@ -42331,7 +42431,13 @@
  	int major;
  	int minor;
  	int patchlevel;
-@@ -741,6 +801,8 @@ struct drm_driver {
+@@ -737,10 +797,14 @@ struct drm_driver {
+ 	int num_ioctls;
+ 	struct file_operations fops;
+ 	struct pci_driver pci_driver;
++	/* List of devices hanging off this driver */
++	struct list_head device_list;
+ };
  
  #define DRM_MINOR_UNASSIGNED 0
  #define DRM_MINOR_LEGACY 1
@@ -42340,7 +42446,7 @@
  
  /**
   * DRM minor structure. This structure represents a drm minor number.
-@@ -752,6 +814,9 @@ struct drm_minor {
+@@ -752,6 +816,9 @@ struct drm_minor {
  	struct device kdev;		/**< Linux device */
  	struct drm_device *dev;
  	struct proc_dir_entry *dev_root;  /**< proc directory entry */
@@ -42350,12 +42456,14 @@
  };
  
  /**
-@@ -759,13 +824,9 @@ struct drm_minor {
+@@ -759,13 +826,11 @@ struct drm_minor {
   * may contain multiple heads.
   */
  struct drm_device {
 -	char *unique;			/**< Unique identifier: e.g., busid */
 -	int unique_len;			/**< Length of unique field */
++	/* linked list of devices per driver */
++	struct list_head driver_item;
  	char *devname;			/**< For /proc/interrupts */
  	int if_version;			/**< Highest interface version set */
  
@@ -42364,7 +42472,7 @@
  	/** \name Locks */
  	/*@{ */
  	spinlock_t count_lock;		/**< For inuse, drm_device::open_count, drm_device::buf_use */
-@@ -788,18 +849,15 @@ struct drm_device {
+@@ -788,18 +853,15 @@ struct drm_device {
  	atomic_t counts[15];
  	/*@} */
  
@@ -42387,7 +42495,7 @@
  
  	/** \name Context handle management */
  	/*@{ */
-@@ -810,7 +868,10 @@ struct drm_device {
+@@ -810,7 +872,10 @@ struct drm_device {
  	struct idr ctx_idr;
  
  	struct list_head vmalist;	/**< List of vmas (for debugging) */
@@ -42399,7 +42507,7 @@
  	/*@} */
  
  	/** \name DMA queues (contexts) */
-@@ -887,14 +948,21 @@ struct drm_device {
+@@ -887,14 +952,21 @@ struct drm_device {
  	struct drm_driver *driver;
  	drm_local_map_t *agp_buffer_map;
  	unsigned int agp_buffer_token;
@@ -42421,7 +42529,7 @@
  	/** \name GEM information */
  	/*@{ */
  	spinlock_t object_name_lock;
-@@ -909,8 +977,28 @@ struct drm_device {
+@@ -909,8 +981,28 @@ struct drm_device {
  	uint32_t invalidate_domains;    /* domains pending invalidation */
  	uint32_t flush_domains;         /* domains pending flush */
  	/*@} */
@@ -42450,7 +42558,7 @@
  
  static inline int drm_dev_to_irq(struct drm_device *dev)
  {
-@@ -1018,6 +1106,17 @@ extern DRM_AGP_MEM *drm_agp_bind_pages(struct drm_device *dev,
+@@ -1018,6 +1110,17 @@ extern DRM_AGP_MEM *drm_agp_bind_pages(struct drm_device *dev,
  				       uint32_t type);
  extern int drm_unbind_agp(DRM_AGP_MEM * handle);
  
@@ -42468,7 +42576,7 @@
  				/* Misc. IOCTL support (drm_ioctl.h) */
  extern int drm_irq_by_busid(struct drm_device *dev, void *data,
  			    struct drm_file *file_priv);
-@@ -1186,9 +1285,17 @@ extern DRM_AGP_MEM *drm_agp_allocate_memory(struct agp_bridge_data *bridge, size
+@@ -1186,9 +1289,17 @@ extern DRM_AGP_MEM *drm_agp_allocate_memory(struct agp_bridge_data *bridge, size
  extern int drm_agp_free_memory(DRM_AGP_MEM * handle);
  extern int drm_agp_bind_memory(DRM_AGP_MEM * handle, off_t start);
  extern int drm_agp_unbind_memory(DRM_AGP_MEM * handle);
@@ -42486,7 +42594,7 @@
  extern int drm_get_dev(struct pci_dev *pdev, const struct pci_device_id *ent,
  		       struct drm_driver *driver);
  extern int drm_put_dev(struct drm_device *dev);
-@@ -1220,6 +1327,8 @@ extern int drm_ati_pcigart_init(struct drm_device *dev,
+@@ -1220,6 +1331,8 @@ extern int drm_ati_pcigart_init(struct drm_device *dev,
  				struct drm_ati_pcigart_info * gart_info);
  extern int drm_ati_pcigart_cleanup(struct drm_device *dev,
  				   struct drm_ati_pcigart_info * gart_info);
@@ -42495,7 +42603,7 @@
  
  extern drm_dma_handle_t *drm_pci_alloc(struct drm_device *dev, size_t size,
  				       size_t align, dma_addr_t maxaddr);
-@@ -1231,7 +1340,11 @@ struct drm_sysfs_class;
+@@ -1231,7 +1344,11 @@ struct drm_sysfs_class;
  extern struct class *drm_sysfs_create(struct module *owner, char *name);
  extern void drm_sysfs_destroy(void);
  extern int drm_sysfs_device_add(struct drm_minor *minor);
@@ -42507,7 +42615,7 @@
  
  /*
   * Basic memory manager support (drm_mm.c)
-@@ -1369,6 +1482,39 @@ extern void drm_free(void *pt, size_t size, int area);
+@@ -1369,6 +1486,39 @@ extern void drm_free(void *pt, size_t size, int area);
  extern void *drm_calloc(size_t nmemb, size_t size, int area);
  #endif
  


Index: kernel.spec
===================================================================
RCS file: /cvs/pkgs/rpms/kernel/F-10/kernel.spec,v
retrieving revision 1.1166
retrieving revision 1.1167
diff -u -r1.1166 -r1.1167
--- kernel.spec	27 Nov 2008 06:37:02 -0000	1.1166
+++ kernel.spec	30 Nov 2008 08:32:11 -0000	1.1167
@@ -1932,6 +1932,9 @@
 %kernel_variant_files -k vmlinux %{with_kdump} kdump
 
 %changelog
+* Sun Nov 30 2008 Dave Airlie <airlied at redhat.com> 2.6.27.7-131
+- radeon: fix card posting, module unload and radeon AGP issues
+
 * Thu Nov 27 2008 Chuck Ebbert <cebbert at redhat.com> 2.6.27.7-130
 - Additional fixes for 64K lowmem reservation:
   - More general matching for Phoenix BIOS




More information about the fedora-extras-commits mailing list