Here is the current version of the patch. As soon as Dave approves it
will go in.

The problem was a conflict between VesaFB and DRM. The patch detects
VesaFB and puts DRM in stealth mode.

=====
Jon Smirl
[EMAIL PROTECTED]


                
__________________________________
Do you Yahoo!?
New and Improved Yahoo! Mail - Send 10MB messages!
http://promotions.yahoo.com/new_mail 
===== linux/drm_drv.h 1.9 vs edited =====
--- 1.9/linux/drm_drv.h	Wed Aug 25 16:55:12 2004
+++ edited/linux/drm_drv.h	Thu Aug 26 00:40:06 2004
@@ -602,7 +602,7 @@
 static int __init drm_init( void )
 {
 	struct pci_dev *pdev = NULL;
-	struct pci_driver *pdriver = NULL;
+	struct pci_device_id *pid;
 	int i;
 	
 	DRM_DEBUG( "\n" );
@@ -613,25 +613,39 @@
 
 	DRM(mem_init)();
 	
-	for (i=0; DRM(pciidlist)[i].vendor != 0; i++) {
-		pdev = pci_get_subsys(DRM(pciidlist[i]).vendor, DRM(pciidlist[i]).device, DRM(pciidlist[i]).subvendor, DRM(pciidlist[i]).subdevice, NULL);
-		if (pdev)
-		{
-			pdriver = pci_dev_driver(pdev);
-			if (pdriver)
-			{
-				DRM(fb_loaded)=1;
-				drm_probe(pdev, &DRM(pciidlist[i]));
-			}
-			else
+	for (i=0; (DRM(pciidlist)[i].vendor != 0) && !DRM(fb_loaded); i++) {
+		pid = &DRM(pciidlist[i]);
+		
+		/* pass back in pdev to account for multiple identical cards */
+		while ((pdev = pci_get_subsys(pid->vendor, pid->device, pid->subvendor, pid->subdevice, pdev))) {
+			/* is there already a driver loaded, or (short circuit saves work) */
+			/* does something like VesaFB have control of the memory region? */
+			if (pci_dev_driver(pdev) || pci_request_regions(pdev, "DRM scan")) {
+				/* go into stealth mode */
+				DRM(fb_loaded) = 1;
 				pci_dev_put(pdev);
+				break;
+			}
+			/* no fbdev or vesadev, put things back and wait for normal probe */
+			pci_release_regions(pdev);
+			pci_dev_put(pdev);
 		}
 	}
 	
-	if (DRM(fb_loaded)==0)
+	if (DRM(fb_loaded) == 0)
 		pci_register_driver(&drm_driver);
-	else
+	else {
+		for (i=0; DRM(pciidlist)[i].vendor != 0; i++) {
+			pid = &DRM(pciidlist[i]);
+			
+			/* pass back in pdev to account for multiple identical cards */
+			while ((pdev = pci_get_subsys(pid->vendor, pid->device, pid->subvendor, pid->subdevice, pdev))) {
+				/* stealth mode requires a manual probe */
+				drm_probe(pdev, &DRM(pciidlist[i]));
+			}
+		}
 		DRM_INFO("Used old pci detect: framebuffer loaded\n");
+	}
 	return 0;
 }
 

Reply via email to