View Single Post
Old 12-15-09, 09:35 PM   #1
underling
Registered User
 
Join Date: Jun 2005
Posts: 14
Default Fedora 12 + multiple video cards + Xinerama + vga_arbitor is unusable

I discovered after updating to Fedora 12 that my 3 monitor Xinerama setup broke. At X startup, the CPU would shoot to 100%, and GDM would never get a chance to paint anything.

I noticed that while the server was wedged, it was spinning reading and writing to /dev/vga_arbiter. Since the nvidia driver has no need to communicate over the legacy VGA channel, I patched the driver to call vga_set_legacy_decoding(dev, VGA_RSRC_NONE); at init time, and my Xinerama setup works perfectly once again.

Patch:

Code:
*** usr/src/nv/nv-linux.h.orig	2009-11-22 19:27:38.000000000 -0800
--- usr/src/nv/nv-linux.h	2009-12-15 18:32:06.000000000 -0800
***************
*** 83,102 ****
--- 83,103 ----
  
  #if !defined(KERNEL_2_4)
  #include <linux/sched.h>            /* suser(), capable() replacement   */
  #include <linux/moduleparam.h>      /* module_param()                   */
  #include <linux/smp_lock.h>         /* kernel_locked                    */
  #include <asm/tlbflush.h>           /* flush_tlb(), flush_tlb_all()     */
  #include <asm/kmap_types.h>         /* page table entry lookup          */
  #endif
  
  #include <linux/pci.h>              /* pci_find_class, etc              */
+ #include <linux/vgaarb.h>           /* vga_set_legacy_decoding          */
  #include <linux/interrupt.h>        /* tasklets, interrupt helpers      */
  #include <linux/timer.h>
  
  #include <asm/div64.h>              /* do_div()                         */
  #include <asm/system.h>             /* cli, sli, save_flags             */
  #include <asm/io.h>                 /* ioremap, virt_to_phys            */
  #include <asm/uaccess.h>            /* access_ok                        */
  #include <asm/page.h>               /* PAGE_OFFSET                      */
  #include <asm/pgtable.h>            /* pte bit definitions              */
  
*** usr/src/nv/nv.c.orig	2009-11-22 19:27:36.000000000 -0800
--- usr/src/nv/nv.c	2009-12-15 18:32:06.000000000 -0800
***************
*** 724,743 ****
--- 724,745 ----
                  goto failed;
              }
  
              entry->data = nv;
              entry->read_proc = nv_kern_read_agpinfo;
  #if defined(NV_PROC_DIR_ENTRY_HAS_OWNER)
              entry->owner = THIS_MODULE;
  #endif
          }
  
+         vga_set_legacy_decoding(dev, VGA_RSRC_NONE);
+ 
          NV_PCI_DEV_PUT(dev);
      }
  
      entry = create_proc_entry("version", flags, proc_nvidia);
      if (!entry)
          goto failed;
  
      entry->read_proc = nv_kern_read_version;
  #if defined(NV_PROC_DIR_ENTRY_HAS_OWNER)
      entry->owner = THIS_MODULE;
underling is offline   Reply With Quote