On Fri, 8 Mar 2002, Ron Farrer wrote:
> Michel D?nzer ([EMAIL PROTECTED]) wrote:
> > It's a possible way, in particular if you just put Modes "current" in
> > the Display subsection.
> > 
> > Getting back to your original question: I guess just 'fbset 1024x768-60'
> > (or any other 1024x768 mode, see /etc/fb.modes) doesn't work either? Do
> > you use tdfxfb or OFfb? The latter can't change modes so you either have
> > to use tdfxfb or the tdfx X driver.
> 
> Ok, I tried changing the modes to "current" and 'fbset
> 1024x768-anything' works fine, I'm using "-100" right now. However fbset 
> only effects the current tty. It doesn't effect tty7. So X still runs at 
> 640x480... 
> 
> As I said in the past, setting the driver to "tdfx" causes the X server
> to segfault (signal 11) at startup (see list archives.) When I built
> this kernel, I said yes to tdfx framebuffer.. but how do I check if it's
> being used? 'cat /proc/fb' shows:
> 0 3Dfx Voodoo3
> 1 OFfb /bandit/3Dfx,Voodoo3
> 
> Looking at that I'd gather it's using the tdfxfb driver.

Worse, it's using _both_ drivers on the same card, because tdfxfb doesn't use
resource management yet! You can fix that by saying `video=offb:off', or
better, try this patch (untested, please let me know whether it works):

--- fbdev-resource-2.4.18-rc1/drivers/video/tdfxfb.c.orig       Thu Feb 14 
09:56:52 2002
+++ fbdev-resource-2.4.18-rc1/drivers/video/tdfxfb.c    Sat Feb 16 14:37:39 2002
@@ -1907,6 +1907,7 @@
 {
        struct fb_var_screeninfo var;
        char *name = NULL;
+       int error = -ENXIO;
 
        fb_info.dev = pdev->device;
        
@@ -1927,28 +1928,36 @@
        
        fb_info.regbase_phys = pci_resource_start(pdev, 0);
        fb_info.regbase_size = 1 << 24;
+       if (!request_mem_region(fb_info.regbase_phys, 1 << 24, "tdfxfb")) {
+               error = -EBUSY;
+               goto fail;
+       }
+
        fb_info.regbase_virt = ioremap_nocache(fb_info.regbase_phys, 1 << 24);
        
        if (!fb_info.regbase_virt) {
                printk(KERN_WARNING "fb: Can't remap %s register area.\n", 
name);
-               return -ENXIO;
+               goto release_reg;
        }
       
        fb_info.bufbase_phys = pci_resource_start (pdev, 1);
        
        if (!(fb_info.bufbase_size = do_lfb_size())) {
-               iounmap(fb_info.regbase_virt);
                printk(KERN_WARNING "fb: Can't count %s memory.\n", name);
-               return -ENXIO;
+               goto unmap_reg;
        }
        
+       if (!request_mem_region(fb_info.bufbase_phys, bufbase_size,
+                               "tdfxfb")) {
+               error = -EBUSY;
+               goto unmap_reg;
+       }
        fb_info.bufbase_virt = ioremap_nocache(fb_info.bufbase_phys,
                                               fb_info.bufbase_size);
                                               
        if (!fb_info.regbase_virt) {
                printk(KERN_WARNING "fb: Can't remap %s framebuffer.\n", name);
-               iounmap(fb_info.regbase_virt);
-               return -ENXIO;
+               goto release_buf;
        }
 
        fb_info.iobase = pci_resource_start (pdev, 2);
@@ -2014,7 +2023,7 @@
                if (tdfxfb_decode_var(&var, &fb_info.default_par, &fb_info)) {
                        /* this is getting really bad!... */
                        printk(KERN_WARNING "tdfxfb: can't decode default video 
mode\n");
-                       return -ENXIO;
+                       goto unmap_buf;
                }
        }
 
@@ -2023,18 +2032,29 @@
       
        if (tdfxfb_set_var(&var, -1, &fb_info.fb_info)) {
                printk(KERN_WARNING "tdfxfb: can't set default video mode\n");
-               return -ENXIO;
+               goto unmap_buf;
        }
 
        if (register_framebuffer(&fb_info.fb_info) < 0) {
                printk(KERN_WARNING "tdfxfb: can't register framebuffer\n");
-               return -ENXIO;
+               goto unmap_buf;
        }
 
        printk(KERN_INFO "fb%d: %s frame buffer device\n", 
             GET_FB_IDX(fb_info.fb_info.node), fb_info.fb_info.modename);
       
        return 0;
+
+unmap_buf:
+       iounmap(fb_info.bufbase_virt);
+release_buf:
+       release_mem_region(fb_info.bufbase_phys, bufbase_size);
+unmap_reg:
+       iounmap(fb_info.regbase_virt);
+release_reg:
+       release_mem_region(fb_info.regbase_phys, 1 << 24);
+fail:
+       return error;
 }
 
 /**
@@ -2058,8 +2078,10 @@
        }
 #endif
 
-       iounmap(fb_info.regbase_virt);
        iounmap(fb_info.bufbase_virt);
+       release_mem_region(fb_info.bufbase_phys, bufbase_size);
+       iounmap(fb_info.regbase_virt);
+       release_mem_region(fb_info.regbase_phys, 1 << 24);
 }
 
 int __init tdfxfb_init(void)

Gr{oetje,eeting}s,

                                                Geert

--
Geert Uytterhoeven -- There's lots of Linux beyond ia32 -- [EMAIL PROTECTED]

In personal conversations with technical people, I call myself a hacker. But
when I'm talking to journalists I just say "programmer" or something like that.
                                                            -- Linus Torvalds

Reply via email to