This code replaces earlier and incomplete handling of graphics on non-zero PCI domains (aka hoses or peer PCI buses). An option (CONFIG_VGA_HOSE) is set TRUE if configuring a GENERIC kernel, or a kernel for MARVEL, TITAN, or TSUNAMI machines, as these are the machines whose SRM consoles are capable of configuring and handling graphics options on non-zero hoses. All other machines have the option set FALSE. A routine, "find_console_vga_hose()", is used to find the graphics device which the machine's firmware believes is the console device, and it sets a global (pci_vga_hose) for later use in managing access to the device. This is called in "init_arch" on TITAN and TSUNAMI machines; MARVEL machines use a custom version of this routine because of extra complexity. A routine, "locate_and_init_vga()", is used to find the graphics device and set a global (pci_vga_hose) for later use in managing access to the device, in the case where "find_console_vga_hose" has failed. Various adjustments are made to the ioremap and ioportmap routines for detecting and translating "legacy" VGA register and memory references to the real PCI domain. [akpm@linux-foundation.org: don't statically init bss] [akpm@linux-foundation.org: build fix] Signed-off-by: Jay Estabrook <jay.estabrook@hp.com> Signed-off-by: Ivan Kokshaysky <ink@jurassic.park.msu.ru> Cc: Richard Henderson <rth@twiddle.net> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
		
			
				
	
	
		
			83 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			83 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| /*
 | |
|  *	Access to VGA videoram
 | |
|  *
 | |
|  *	(c) 1998 Martin Mares <mj@ucw.cz>
 | |
|  */
 | |
| 
 | |
| #ifndef _LINUX_ASM_VGA_H_
 | |
| #define _LINUX_ASM_VGA_H_
 | |
| 
 | |
| #include <asm/io.h>
 | |
| 
 | |
| #define VT_BUF_HAVE_RW
 | |
| #define VT_BUF_HAVE_MEMSETW
 | |
| #define VT_BUF_HAVE_MEMCPYW
 | |
| 
 | |
| extern inline void scr_writew(u16 val, volatile u16 *addr)
 | |
| {
 | |
| 	if (__is_ioaddr(addr))
 | |
| 		__raw_writew(val, (volatile u16 __iomem *) addr);
 | |
| 	else
 | |
| 		*addr = val;
 | |
| }
 | |
| 
 | |
| extern inline u16 scr_readw(volatile const u16 *addr)
 | |
| {
 | |
| 	if (__is_ioaddr(addr))
 | |
| 		return __raw_readw((volatile const u16 __iomem *) addr);
 | |
| 	else
 | |
| 		return *addr;
 | |
| }
 | |
| 
 | |
| extern inline void scr_memsetw(u16 *s, u16 c, unsigned int count)
 | |
| {
 | |
| 	if (__is_ioaddr(s))
 | |
| 		memsetw_io((u16 __iomem *) s, c, count);
 | |
| 	else
 | |
| 		memsetw(s, c, count);
 | |
| }
 | |
| 
 | |
| /* Do not trust that the usage will be correct; analyze the arguments.  */
 | |
| extern void scr_memcpyw(u16 *d, const u16 *s, unsigned int count);
 | |
| 
 | |
| /* ??? These are currently only used for downloading character sets.  As
 | |
|    such, they don't need memory barriers.  Is this all they are intended
 | |
|    to be used for?  */
 | |
| #define vga_readb(a)	readb((u8 __iomem *)(a))
 | |
| #define vga_writeb(v,a)	writeb(v, (u8 __iomem *)(a))
 | |
| 
 | |
| #ifdef CONFIG_VGA_HOSE
 | |
| #include <linux/ioport.h>
 | |
| #include <linux/pci.h>
 | |
| 
 | |
| extern struct pci_controller *pci_vga_hose;
 | |
| 
 | |
| # define __is_port_vga(a)       \
 | |
| 	(((a) >= 0x3b0) && ((a) < 0x3e0) && \
 | |
| 	 ((a) != 0x3b3) && ((a) != 0x3d3))
 | |
| 
 | |
| # define __is_mem_vga(a) \
 | |
| 	(((a) >= 0xa0000) && ((a) <= 0xc0000))
 | |
| 
 | |
| # define FIXUP_IOADDR_VGA(a) do {                       \
 | |
| 	if (pci_vga_hose && __is_port_vga(a))     \
 | |
| 		(a) += pci_vga_hose->io_space->start;	  \
 | |
|  } while(0)
 | |
| 
 | |
| # define FIXUP_MEMADDR_VGA(a) do {                       \
 | |
| 	if (pci_vga_hose && __is_mem_vga(a))     \
 | |
| 		(a) += pci_vga_hose->mem_space->start; \
 | |
|  } while(0)
 | |
| 
 | |
| #else /* CONFIG_VGA_HOSE */
 | |
| # define pci_vga_hose 0
 | |
| # define __is_port_vga(a) 0
 | |
| # define __is_mem_vga(a) 0
 | |
| # define FIXUP_IOADDR_VGA(a)
 | |
| # define FIXUP_MEMADDR_VGA(a)
 | |
| #endif /* CONFIG_VGA_HOSE */
 | |
| 
 | |
| #define VGA_MAP_MEM(x,s)	((unsigned long) ioremap(x, s))
 | |
| 
 | |
| #endif
 |