[Linux-fbdev-devel] Re: Who is stomping PCI config space?

Benjamin Herrenschmidt benh at kernel.crashing.org
Fri Mar 4 14:42:36 PST 2005


> Ok, now I see what X is doing. It is making sure there is only one
> active VGA device in the system.  However, my framebuffer driver is
> not using VGA mode.
> 
> I have similar code in my VGA support patch but I only shut down the
> card mem/io long enough to turn off VGA support. I don't leave the
> whole card turned off. I also see now that I should shut interrupts
> off while doing this.

Shut interrupts off never works. It only affects one CPU, you can still
take the interrupt on the other CPU. Unless you switch interrupt
emission on the card itself, or use some kind of spinlock to put IRQs
"on hold" while you are doing the shutdown...
 
> pci_read_config_word(pdev, PCI_COMMAND, &command);
> pci_write_config_word(pdev, PCI_COMMAND, command | PCI_COMMAND_IO |
> PCI_COMMAND_MEMORY);
> 
> vga_io_w(0x3C3, ~0x01 & vga_io_r(0x3C3));
> vga_io_w(0x46e8, ~0x08 & vga_io_r(0x46e8));
> vga_io_w(0x102, ~0x01 & vga_io_r(0x102));
> 
> pci_write_config_word(pdev, PCI_COMMAND, command);
> 
> If we leave the whole card turned off I can't access the interrupt
> status registers to acknowledge the interrupt and shut it off.

Also, some cards won't let you switch VGA access decoding off.

> Does this approach work for X? Where is the code that does this at VT
> switch time?
> 
> On VT enter X would need to:
> 1) shut off interrupts

Not possible (system interrupts). Unless it does it on the card itself,
which is a per-driver thing.

> 2) disable IO/MEM on all VGA cards - remember IO/mem state
> 3) turn the cards on one at a time and disable VGA - remember VGA enable state
> 4) restore IO/MEM state to all cards
> 5) turn interrupts back on
> 
> On VT exit:
> 1) shut off interrupts
> 2) disable IO/MEM on all VGA cards - remember IO/mem state
> 3) restore VGA enable state
> 4) restore IO/MEM state to all cards
> 5) turn interrupts back on

Ben.




More information about the xorg mailing list