11da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/*
21da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
31da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Hardware accelerated Matrox Millennium I, II, Mystique, G100, G200, G400 and G450
41da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
51da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * (c) 1998-2002 Petr Vandrovec <vandrove@vc.cvut.cz>
61da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
71da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */
81da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#ifndef __MATROXFB_H__
91da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define __MATROXFB_H__
101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* general, but fairly heavy, debugging */
121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#undef MATROXFB_DEBUG
131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* heavy debugging: */
1525985edcedea6396277003854657b5f3cb31a628Lucas De Marchi/* -- logs putc[s], so every time a char is displayed, it's logged */
161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#undef MATROXFB_DEBUG_HEAVY
171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* This one _could_ cause infinite loops */
191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* It _does_ cause lots and lots of messages during idle loops */
201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#undef MATROXFB_DEBUG_LOOP
211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* Debug register calls, too? */
231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#undef MATROXFB_DEBUG_REG
241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* Guard accelerator accesses with spin_lock_irqsave... */
261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#undef MATROXFB_USE_SPINLOCKS
271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <linux/module.h>
291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <linux/kernel.h>
301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <linux/errno.h>
311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <linux/string.h>
321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <linux/mm.h>
331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <linux/slab.h>
341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <linux/delay.h>
351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <linux/fb.h>
361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <linux/console.h>
371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <linux/selection.h>
381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <linux/ioport.h>
391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <linux/init.h>
401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <linux/timer.h>
411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <linux/pci.h>
421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <linux/spinlock.h>
431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <linux/kd.h>
441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <asm/io.h>
461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <asm/unaligned.h>
471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#ifdef CONFIG_MTRR
481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <asm/mtrr.h>
491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#endif
501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#if defined(CONFIG_PPC_PMAC)
521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <asm/prom.h>
531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <asm/pci-bridge.h>
541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include "../macmodes.h"
551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#endif
561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#ifdef MATROXFB_DEBUG
581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define DEBUG
601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define DBG(x)		printk(KERN_DEBUG "matroxfb: %s\n", (x));
611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#ifdef MATROXFB_DEBUG_HEAVY
631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define DBG_HEAVY(x)	DBG(x)
641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#else /* MATROXFB_DEBUG_HEAVY */
651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define DBG_HEAVY(x)	/* DBG_HEAVY */
661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#endif /* MATROXFB_DEBUG_HEAVY */
671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#ifdef MATROXFB_DEBUG_LOOP
691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define DBG_LOOP(x)	DBG(x)
701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#else /* MATROXFB_DEBUG_LOOP */
711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define DBG_LOOP(x)	/* DBG_LOOP */
721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#endif /* MATROXFB_DEBUG_LOOP */
731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#ifdef MATROXFB_DEBUG_REG
751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define DBG_REG(x)	DBG(x)
761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#else /* MATROXFB_DEBUG_REG */
771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define DBG_REG(x)	/* DBG_REG */
781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#endif /* MATROXFB_DEBUG_REG */
791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#else /* MATROXFB_DEBUG */
811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define DBG(x)		/* DBG */
831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define DBG_HEAVY(x)	/* DBG_HEAVY */
841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define DBG_REG(x)	/* DBG_REG */
851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define DBG_LOOP(x)	/* DBG_LOOP */
861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#endif /* MATROXFB_DEBUG */
881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#ifdef DEBUG
901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define dprintk(X...)	printk(X)
911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#else
921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define dprintk(X...)
931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#endif
941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#ifndef PCI_SS_VENDOR_ID_SIEMENS_NIXDORF
961da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define PCI_SS_VENDOR_ID_SIEMENS_NIXDORF	0x110A
971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#endif
981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#ifndef PCI_SS_VENDOR_ID_MATROX
991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define PCI_SS_VENDOR_ID_MATROX		PCI_VENDOR_ID_MATROX
1001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#endif
1011da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#ifndef PCI_SS_ID_MATROX_PRODUCTIVA_G100_AGP
1031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define PCI_SS_ID_MATROX_GENERIC		0xFF00
1041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define PCI_SS_ID_MATROX_PRODUCTIVA_G100_AGP	0xFF01
1051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define PCI_SS_ID_MATROX_MYSTIQUE_G200_AGP	0xFF02
1061da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define PCI_SS_ID_MATROX_MILLENIUM_G200_AGP	0xFF03
1071da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define PCI_SS_ID_MATROX_MARVEL_G200_AGP	0xFF04
1081da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define PCI_SS_ID_MATROX_MGA_G100_PCI		0xFF05
1091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define PCI_SS_ID_MATROX_MGA_G100_AGP		0x1001
1101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define PCI_SS_ID_MATROX_MILLENNIUM_G400_MAX_AGP	0x2179
1111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define PCI_SS_ID_SIEMENS_MGA_G100_AGP		0x001E /* 30 */
1121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define PCI_SS_ID_SIEMENS_MGA_G200_AGP		0x0032 /* 50 */
1131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#endif
1141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define MX_VISUAL_TRUECOLOR	FB_VISUAL_DIRECTCOLOR
1161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define MX_VISUAL_DIRECTCOLOR	FB_VISUAL_TRUECOLOR
1171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define MX_VISUAL_PSEUDOCOLOR	FB_VISUAL_PSEUDOCOLOR
1181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define CNVT_TOHW(val,width) ((((val)<<(width))+0x7FFF-(val))>>16)
1201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* G-series and Mystique have (almost) same DAC */
1221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#undef NEED_DAC1064
1231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#if defined(CONFIG_FB_MATROX_MYSTIQUE) || defined(CONFIG_FB_MATROX_G)
1241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define NEED_DAC1064 1
1251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#endif
1261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldstypedef struct {
1281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	void __iomem*	vaddr;
1291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} vaddr_t;
1301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic inline unsigned int mga_readb(vaddr_t va, unsigned int offs) {
1321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	return readb(va.vaddr + offs);
1331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
1341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic inline void mga_writeb(vaddr_t va, unsigned int offs, u_int8_t value) {
1361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	writeb(value, va.vaddr + offs);
1371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
1381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic inline void mga_writew(vaddr_t va, unsigned int offs, u_int16_t value) {
1401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	writew(value, va.vaddr + offs);
1411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
1421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic inline u_int32_t mga_readl(vaddr_t va, unsigned int offs) {
1441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	return readl(va.vaddr + offs);
1451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
1461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic inline void mga_writel(vaddr_t va, unsigned int offs, u_int32_t value) {
1481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	writel(value, va.vaddr + offs);
1491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
1501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic inline void mga_memcpy_toio(vaddr_t va, const void* src, int len) {
1521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#if defined(__alpha__) || defined(__i386__) || defined(__x86_64__)
1531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/*
154c81476df1b4241aefba4ff83a7701b3a926bd7ceOndrej Zary	 * iowrite32_rep works for us if:
1551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	 *  (1) Copies data as 32bit quantities, not byte after byte,
1561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	 *  (2) Performs LE ordered stores, and
1571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	 *  (3) It copes with unaligned source (destination is guaranteed to be page
1581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	 *      aligned and length is guaranteed to be multiple of 4).
1591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	 */
160c81476df1b4241aefba4ff83a7701b3a926bd7ceOndrej Zary	iowrite32_rep(va.vaddr, src, len >> 2);
1611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#else
1621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        u_int32_t __iomem* addr = va.vaddr;
1631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if ((unsigned long)src & 3) {
1651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		while (len >= 4) {
1661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			fb_writel(get_unaligned((u32 *)src), addr);
1671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			addr++;
1681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			len -= 4;
1691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			src += 4;
1701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		}
1711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	} else {
1721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		while (len >= 4) {
1731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			fb_writel(*(u32 *)src, addr);
1741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			addr++;
1751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			len -= 4;
1761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			src += 4;
1771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		}
1781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
1791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#endif
1801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
1811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic inline void vaddr_add(vaddr_t* va, unsigned long offs) {
1831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	va->vaddr += offs;
1841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
1851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic inline void __iomem* vaddr_va(vaddr_t va) {
1871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	return va.vaddr;
1881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
1891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define MGA_IOREMAP_NORMAL	0
1911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define MGA_IOREMAP_NOCACHE	1
1921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define MGA_IOREMAP_FB		MGA_IOREMAP_NOCACHE
1941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define MGA_IOREMAP_MMIO	MGA_IOREMAP_NOCACHE
1951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic inline int mga_ioremap(unsigned long phys, unsigned long size, int flags, vaddr_t* virt) {
1961da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (flags & MGA_IOREMAP_NOCACHE)
1971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		virt->vaddr = ioremap_nocache(phys, size);
1981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	else
1991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		virt->vaddr = ioremap(phys, size);
2005e2daeb3c982ea19ecad0c2e720a4052034be14bHarvey Harrison	return (virt->vaddr == NULL); /* 0, !0... 0, error_code in future */
2011da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
2021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
2031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic inline void mga_iounmap(vaddr_t va) {
2041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	iounmap(va.vaddr);
2051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
2061da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
2071da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstruct my_timming {
2081da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	unsigned int pixclock;
2091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	int mnp;
2101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	unsigned int crtc;
2111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	unsigned int HDisplay;
2121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	unsigned int HSyncStart;
2131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	unsigned int HSyncEnd;
2141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	unsigned int HTotal;
2151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	unsigned int VDisplay;
2161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	unsigned int VSyncStart;
2171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	unsigned int VSyncEnd;
2181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	unsigned int VTotal;
2191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	unsigned int sync;
2201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	int	     dblscan;
2211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	int	     interlaced;
2221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	unsigned int delay;	/* CRTC delay */
2231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds};
2241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
2251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsenum { M_SYSTEM_PLL, M_PIXEL_PLL_A, M_PIXEL_PLL_B, M_PIXEL_PLL_C, M_VIDEO_PLL };
2261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
2271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstruct matrox_pll_cache {
2281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	unsigned int	valid;
2291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	struct {
2301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		unsigned int	mnp_key;
2311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		unsigned int	mnp_value;
2321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		      } data[4];
2331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds};
2341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
2351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstruct matrox_pll_limits {
2361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	unsigned int	vcomin;
2371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	unsigned int	vcomax;
2381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds};
2391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
2401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstruct matrox_pll_features {
2411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	unsigned int	vco_freq_min;
2421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	unsigned int	ref_freq;
2431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	unsigned int	feed_div_min;
2441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	unsigned int	feed_div_max;
2451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	unsigned int	in_div_min;
2461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	unsigned int	in_div_max;
2471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	unsigned int	post_shift_max;
2481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds};
2491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
2501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstruct matroxfb_par
2511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
2521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	unsigned int	final_bppShift;
2531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	unsigned int	cmap_len;
2541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	struct {
2551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		unsigned int bytes;
2561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		unsigned int pixels;
2571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		unsigned int chunks;
2581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		      } ydstorg;
2591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds};
2601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
2611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstruct matrox_fb_info;
2621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
2631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstruct matrox_DAC1064_features {
2641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	u_int8_t	xvrefctrl;
2651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	u_int8_t	xmiscctrl;
2661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds};
2671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
2681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* current hardware status */
2691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstruct mavenregs {
2701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	u_int8_t regs[256];
2711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	int	 mode;
2721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	int	 vlines;
2731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	int	 xtal;
2741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	int	 fv;
2751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
2761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	u_int16_t htotal;
2771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	u_int16_t hcorr;
2781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds};
2791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
2801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstruct matrox_crtc2 {
2811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	u_int32_t ctl;
2821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds};
2831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
2841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstruct matrox_hw_state {
2851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	u_int32_t	MXoptionReg;
2861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	unsigned char	DACclk[6];
2871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	unsigned char	DACreg[80];
2881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	unsigned char	MiscOutReg;
2891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	unsigned char	DACpal[768];
2901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	unsigned char	CRTC[25];
2911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	unsigned char	CRTCEXT[9];
2921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	unsigned char	SEQ[5];
2931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* unused for MGA mode, but who knows... */
2941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	unsigned char	GCTL[9];
2951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* unused for MGA mode, but who knows... */
2961da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	unsigned char	ATTR[21];
2971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
2981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* TVOut only */
2991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	struct mavenregs	maven;
3001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
3011da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	struct matrox_crtc2	crtc2;
3021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds};
3031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
3041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstruct matrox_accel_data {
3051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#ifdef CONFIG_FB_MATROX_MILLENIUM
3061da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	unsigned char	ramdac_rev;
3071da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#endif
3081da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	u_int32_t	m_dwg_rect;
3091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	u_int32_t	m_opmode;
3101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds};
3111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
3121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstruct v4l2_queryctrl;
3131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstruct v4l2_control;
3141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
3151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstruct matrox_altout {
3161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	const char	*name;
3171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	int		(*compute)(void* altout_dev, struct my_timming* input);
3181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	int		(*program)(void* altout_dev);
3191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	int		(*start)(void* altout_dev);
3201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	int		(*verifymode)(void* altout_dev, u_int32_t mode);
3211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	int		(*getqueryctrl)(void* altout_dev,
3221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds					struct v4l2_queryctrl* ctrl);
3231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	int		(*getctrl)(void* altout_dev,
3241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				   struct v4l2_control* ctrl);
3251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	int		(*setctrl)(void* altout_dev,
3261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				   struct v4l2_control* ctrl);
3271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds};
3281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
3291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define MATROXFB_SRC_NONE	0
3301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define MATROXFB_SRC_CRTC1	1
3311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define MATROXFB_SRC_CRTC2	2
3321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
3331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsenum mga_chip { MGA_2064, MGA_2164, MGA_1064, MGA_1164, MGA_G100, MGA_G200, MGA_G400, MGA_G450, MGA_G550 };
3341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
3351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstruct matrox_bios {
3361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	unsigned int	bios_valid : 1;
3371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	unsigned int	pins_len;
3381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	unsigned char	pins[128];
3391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	struct {
3401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		unsigned char vMaj, vMin, vRev;
3411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		      } version;
3421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	struct {
3431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		unsigned char state, tvout;
3441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		      } output;
3451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds};
3461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
3471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstruct matrox_switch;
3481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstruct matroxfb_driver;
3491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstruct matroxfb_dh_fb_info;
3501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
3511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstruct matrox_vsync {
3521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	wait_queue_head_t	wait;
3531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	unsigned int		cnt;
3541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds};
3551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
3561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstruct matrox_fb_info {
3571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	struct fb_info		fbcon;
3581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
3591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	struct list_head	next_fb;
3601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
3611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	int			dead;
3621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	int                     initialized;
3631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	unsigned int		usecount;
3641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
3651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	unsigned int		userusecount;
3661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	unsigned long		irq_flags;
3671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
3681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	struct matroxfb_par	curr;
3691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	struct matrox_hw_state	hw;
3701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
3711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	struct matrox_accel_data accel;
3721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
3731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	struct pci_dev*		pcidev;
3741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
3751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	struct {
3761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		struct matrox_vsync	vsync;
3771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		unsigned int	pixclock;
3781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		int		mnp;
3791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		int		panpos;
3801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			      } crtc1;
3811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	struct {
3821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		struct matrox_vsync	vsync;
3831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		unsigned int 	pixclock;
3841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		int		mnp;
3851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	struct matroxfb_dh_fb_info*	info;
3861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	struct rw_semaphore	lock;
3871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			      } crtc2;
3881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	struct {
3891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	struct rw_semaphore	lock;
3901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	struct {
3911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		int brightness, contrast, saturation, hue, gamma;
3921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		int testout, deflicker;
3931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				} tvo_params;
3941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			      } altout;
3951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define MATROXFB_MAX_OUTPUTS		3
3961da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	struct {
3971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	unsigned int		src;
3981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	struct matrox_altout*	output;
3991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	void*			data;
4001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	unsigned int		mode;
4011da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	unsigned int		default_src;
4021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			      } outputs[MATROXFB_MAX_OUTPUTS];
4031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
4041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define MATROXFB_MAX_FB_DRIVERS		5
4051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	struct matroxfb_driver* (drivers[MATROXFB_MAX_FB_DRIVERS]);
4061da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	void*			(drivers_data[MATROXFB_MAX_FB_DRIVERS]);
4071da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	unsigned int		drivers_count;
4081da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
4091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	struct {
4101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	unsigned long	base;	/* physical */
4111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	vaddr_t		vbase;	/* CPU view */
4121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	unsigned int	len;
4131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	unsigned int	len_usable;
4141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	unsigned int	len_maximum;
4151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		      } video;
4161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
4171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	struct {
4181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	unsigned long	base;	/* physical */
4191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	vaddr_t		vbase;	/* CPU view */
4201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	unsigned int	len;
4211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		      } mmio;
4221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
4231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	unsigned int	max_pixel_clock;
424e798bd95b61918e653f3d28f9176237236f2d103Paul A. Clarke	unsigned int	max_pixel_clock_panellink;
4251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
4261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	struct matrox_switch*	hw_switch;
4271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
4281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	struct {
4291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		struct matrox_pll_features pll;
4301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		struct matrox_DAC1064_features DAC1064;
4311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			      } features;
4321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	struct {
4331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		spinlock_t	DAC;
4341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		spinlock_t	accel;
4351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			      } lock;
4361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
4371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	enum mga_chip		chip;
4381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
4391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	int			interleave;
4401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	int			millenium;
4411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	int			milleniumII;
4421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	struct {
4431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		int		cfb4;
4441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		const int*	vxres;
4451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		int		cross4MB;
4461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		int		text;
4471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		int		plnwt;
4481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		int		srcorg;
4491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			      } capable;
4501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#ifdef CONFIG_MTRR
4511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	struct {
4521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		int		vram;
4531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		int		vram_valid;
4541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			      } mtrr;
4551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#endif
4561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	struct {
4571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		int		precise_width;
4581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		int		mga_24bpp_fix;
4591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		int		novga;
4601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		int		nobios;
4611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		int		nopciretry;
4621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		int		noinit;
4631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		int		sgram;
4641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		int		support32MB;
4651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
4661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		int		accelerator;
4671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		int		text_type_aux;
4681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		int		video64bits;
4691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		int		crtc2;
4701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		int		maven_capable;
4711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		unsigned int	vgastep;
4721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		unsigned int	textmode;
4731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		unsigned int	textstep;
4741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		unsigned int	textvram;	/* character cells */
4751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		unsigned int	ydstorg;	/* offset in bytes from video start to usable memory */
4761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds						/* 0 except for 6MB Millenium */
4771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		int		memtype;
4781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		int		g450dac;
4791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		int		dfp_type;
4801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		int		panellink;	/* G400 DFP possible (not G450/G550) */
4811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		int		dualhead;
4821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		unsigned int	fbResource;
4831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			      } devflags;
4841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	struct fb_ops		fbops;
4851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	struct matrox_bios	bios;
4861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	struct {
4871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		struct matrox_pll_limits	pixel;
4881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		struct matrox_pll_limits	system;
4891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		struct matrox_pll_limits	video;
4901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			      } limits;
4911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	struct {
4921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		struct matrox_pll_cache	pixel;
4931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		struct matrox_pll_cache	system;
4941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		struct matrox_pll_cache	video;
4951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				      } cache;
4961da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	struct {
4971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		struct {
4981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			unsigned int	video;
4991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			unsigned int	system;
5001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				      } pll;
5011da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		struct {
5021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			u_int32_t	opt;
5031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			u_int32_t	opt2;
5041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			u_int32_t	opt3;
5051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			u_int32_t	mctlwtst;
5061da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			u_int32_t	mctlwtst_core;
5071da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			u_int32_t	memmisc;
5081da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			u_int32_t	memrdbk;
5091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			u_int32_t	maccess;
5101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				      } reg;
5111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		struct {
5121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			unsigned int	ddr:1,
5131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			                emrswen:1,
5141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds					dll:1;
5151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				      } memory;
5161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			      } values;
51708a498de79727d63a011f2583e9aba4d3083c3a0Antonino A. Daplas	u_int32_t cmap[16];
5181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds};
5191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
5201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define info2minfo(info) container_of(info, struct matrox_fb_info, fbcon)
5211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
5221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstruct matrox_switch {
523316b4d644caceb2cf7432d8a27e45b88f57ef2a0Jean Delvare	int	(*preinit)(struct matrox_fb_info *minfo);
524316b4d644caceb2cf7432d8a27e45b88f57ef2a0Jean Delvare	void	(*reset)(struct matrox_fb_info *minfo);
525316b4d644caceb2cf7432d8a27e45b88f57ef2a0Jean Delvare	int	(*init)(struct matrox_fb_info *minfo, struct my_timming*);
526316b4d644caceb2cf7432d8a27e45b88f57ef2a0Jean Delvare	void	(*restore)(struct matrox_fb_info *minfo);
5271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds};
5281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
5291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstruct matroxfb_driver {
5301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	struct list_head	node;
5311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	char*			name;
5321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	void*			(*probe)(struct matrox_fb_info* info);
5331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	void			(*remove)(struct matrox_fb_info* info, void* data);
5341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds};
5351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
5361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsint matroxfb_register_driver(struct matroxfb_driver* drv);
5371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsvoid matroxfb_unregister_driver(struct matroxfb_driver* drv);
5381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
5391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define PCI_OPTION_REG	0x40
5401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define   PCI_OPTION_ENABLE_ROM		0x40000000
5411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
5421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define PCI_MGA_INDEX	0x44
5431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define PCI_MGA_DATA	0x48
5441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define PCI_OPTION2_REG	0x50
5451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define PCI_OPTION3_REG	0x54
5461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define PCI_MEMMISC_REG	0x58
5471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
5481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define M_DWGCTL	0x1C00
5491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define M_MACCESS	0x1C04
5501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define M_CTLWTST	0x1C08
5511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
5521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define M_PLNWT		0x1C1C
5531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
5541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define M_BCOL		0x1C20
5551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define M_FCOL		0x1C24
5561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
5571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define M_SGN		0x1C58
5581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define M_LEN		0x1C5C
5591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define M_AR0		0x1C60
5601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define M_AR1		0x1C64
5611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define M_AR2		0x1C68
5621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define M_AR3		0x1C6C
5631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define M_AR4		0x1C70
5641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define M_AR5		0x1C74
5651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define M_AR6		0x1C78
5661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
5671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define M_CXBNDRY	0x1C80
5681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define M_FXBNDRY	0x1C84
5691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define M_YDSTLEN	0x1C88
5701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define M_PITCH		0x1C8C
5711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define M_YDST		0x1C90
5721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define M_YDSTORG	0x1C94
5731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define M_YTOP		0x1C98
5741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define M_YBOT		0x1C9C
5751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
5761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* mystique only */
5771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define M_CACHEFLUSH	0x1FFF
5781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
5791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define M_EXEC		0x0100
5801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
5811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define M_DWG_TRAP	0x04
5821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define M_DWG_BITBLT	0x08
5831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define M_DWG_ILOAD	0x09
5841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
5851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define M_DWG_LINEAR	0x0080
5861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define M_DWG_SOLID	0x0800
5871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define M_DWG_ARZERO	0x1000
5881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define M_DWG_SGNZERO	0x2000
5891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define M_DWG_SHIFTZERO	0x4000
5901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
5911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define M_DWG_REPLACE	0x000C0000
5921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define M_DWG_REPLACE2	(M_DWG_REPLACE | 0x40)
5931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define M_DWG_XOR	0x00060010
5941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
5951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define M_DWG_BFCOL	0x04000000
5961da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define M_DWG_BMONOWF	0x08000000
5971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
5981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define M_DWG_TRANSC	0x40000000
5991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
6001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define M_FIFOSTATUS	0x1E10
6011da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define M_STATUS	0x1E14
6021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define M_ICLEAR	0x1E18
6031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define M_IEN		0x1E1C
6041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
6051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define M_VCOUNT	0x1E20
6061da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
6071da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define M_RESET		0x1E40
6081da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define M_MEMRDBK	0x1E44
6091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
6101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define M_AGP2PLL	0x1E4C
6111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
6121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define M_OPMODE	0x1E54
6131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define     M_OPMODE_DMA_GEN_WRITE	0x00
6141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define     M_OPMODE_DMA_BLIT		0x04
6151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define     M_OPMODE_DMA_VECTOR_WRITE	0x08
6161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define     M_OPMODE_DMA_LE		0x0000		/* little endian - no transformation */
6171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define     M_OPMODE_DMA_BE_8BPP	0x0000
6181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define     M_OPMODE_DMA_BE_16BPP	0x0100
6191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define     M_OPMODE_DMA_BE_32BPP	0x0200
6201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define     M_OPMODE_DIR_LE		0x000000	/* little endian - no transformation */
6211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define     M_OPMODE_DIR_BE_8BPP	0x000000
6221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define     M_OPMODE_DIR_BE_16BPP	0x010000
6231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define     M_OPMODE_DIR_BE_32BPP	0x020000
6241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
6251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define M_ATTR_INDEX	0x1FC0
6261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define M_ATTR_DATA	0x1FC1
6271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
6281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define M_MISC_REG	0x1FC2
6291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define M_3C2_RD	0x1FC2
6301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
6311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define M_SEQ_INDEX	0x1FC4
6321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define M_SEQ_DATA	0x1FC5
6336d39bedc47fbf18a940f5843981767c221d22cfePaul A. Clarke#define     M_SEQ1		0x01
6346d39bedc47fbf18a940f5843981767c221d22cfePaul A. Clarke#define        M_SEQ1_SCROFF		0x20
6351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
6361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define M_MISC_REG_READ	0x1FCC
6371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
6381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define M_GRAPHICS_INDEX 0x1FCE
6391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define M_GRAPHICS_DATA	0x1FCF
6401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
6411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define M_CRTC_INDEX	0x1FD4
6421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
6431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define M_ATTR_RESET	0x1FDA
6441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define M_3DA_WR	0x1FDA
6451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define M_INSTS1	0x1FDA
6461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
6471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define M_EXTVGA_INDEX	0x1FDE
6481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define M_EXTVGA_DATA	0x1FDF
6491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
6501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* G200 only */
6511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define M_SRCORG	0x2CB4
6521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define M_DSTORG	0x2CB8
6531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
6541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define M_RAMDAC_BASE	0x3C00
6551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
6561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* fortunately, same on TVP3026 and MGA1064 */
6571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define M_DAC_REG	(M_RAMDAC_BASE+0)
6581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define M_DAC_VAL	(M_RAMDAC_BASE+1)
6591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define M_PALETTE_MASK	(M_RAMDAC_BASE+2)
6601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
6611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define M_X_INDEX	0x00
6621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define M_X_DATAREG	0x0A
6631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
6641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define DAC_XGENIOCTRL		0x2A
6651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define DAC_XGENIODATA		0x2B
6661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
6671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define M_C2CTL		0x3C10
6681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
6691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define MX_OPTION_BSWAP         0x00000000
6701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
6711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#ifdef __LITTLE_ENDIAN
6721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define M_OPMODE_4BPP	(M_OPMODE_DMA_LE | M_OPMODE_DIR_LE | M_OPMODE_DMA_BLIT)
6731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define M_OPMODE_8BPP	(M_OPMODE_DMA_LE | M_OPMODE_DIR_LE | M_OPMODE_DMA_BLIT)
6741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define M_OPMODE_16BPP	(M_OPMODE_DMA_LE | M_OPMODE_DIR_LE | M_OPMODE_DMA_BLIT)
6751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define M_OPMODE_24BPP	(M_OPMODE_DMA_LE | M_OPMODE_DIR_LE | M_OPMODE_DMA_BLIT)
6761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define M_OPMODE_32BPP	(M_OPMODE_DMA_LE | M_OPMODE_DIR_LE | M_OPMODE_DMA_BLIT)
6771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#else
6781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#ifdef __BIG_ENDIAN
6791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define M_OPMODE_4BPP	(M_OPMODE_DMA_LE | M_OPMODE_DIR_LE       | M_OPMODE_DMA_BLIT)	/* TODO */
6801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define M_OPMODE_8BPP	(M_OPMODE_DMA_LE | M_OPMODE_DIR_BE_8BPP  | M_OPMODE_DMA_BLIT)
6811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define M_OPMODE_16BPP	(M_OPMODE_DMA_LE | M_OPMODE_DIR_BE_16BPP | M_OPMODE_DMA_BLIT)
6821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define M_OPMODE_24BPP	(M_OPMODE_DMA_LE | M_OPMODE_DIR_BE_8BPP  | M_OPMODE_DMA_BLIT)	/* TODO, ?32 */
6831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define M_OPMODE_32BPP	(M_OPMODE_DMA_LE | M_OPMODE_DIR_BE_32BPP | M_OPMODE_DMA_BLIT)
6841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#else
6851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#error "Byte ordering have to be defined. Cannot continue."
6861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#endif
6871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#endif
6881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
689fc2d10ddfc8989e82f74d2a38c7d6bfa45bcaba9Jean Delvare#define mga_inb(addr)		mga_readb(minfo->mmio.vbase, (addr))
690fc2d10ddfc8989e82f74d2a38c7d6bfa45bcaba9Jean Delvare#define mga_inl(addr)		mga_readl(minfo->mmio.vbase, (addr))
691fc2d10ddfc8989e82f74d2a38c7d6bfa45bcaba9Jean Delvare#define mga_outb(addr,val)	mga_writeb(minfo->mmio.vbase, (addr), (val))
692fc2d10ddfc8989e82f74d2a38c7d6bfa45bcaba9Jean Delvare#define mga_outw(addr,val)	mga_writew(minfo->mmio.vbase, (addr), (val))
693fc2d10ddfc8989e82f74d2a38c7d6bfa45bcaba9Jean Delvare#define mga_outl(addr,val)	mga_writel(minfo->mmio.vbase, (addr), (val))
6941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define mga_readr(port,idx)	(mga_outb((port),(idx)), mga_inb((port)+1))
6951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define mga_setr(addr,port,val)	mga_outw(addr, ((val)<<8) | (port))
6961da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
6971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define mga_fifo(n)	do {} while ((mga_inl(M_FIFOSTATUS) & 0xFF) < (n))
6981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
6991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define WaitTillIdle()	do {} while (mga_inl(M_STATUS) & 0x10000)
7001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
7011da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* code speedup */
7021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#ifdef CONFIG_FB_MATROX_MILLENIUM
7031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define isInterleave(x)	 (x->interleave)
7041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define isMillenium(x)	 (x->millenium)
7051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define isMilleniumII(x) (x->milleniumII)
7061da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#else
7071da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define isInterleave(x)  (0)
7081da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define isMillenium(x)	 (0)
7091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define isMilleniumII(x) (0)
7101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#endif
7111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
712fc2d10ddfc8989e82f74d2a38c7d6bfa45bcaba9Jean Delvare#define matroxfb_DAC_lock()                   spin_lock(&minfo->lock.DAC)
713fc2d10ddfc8989e82f74d2a38c7d6bfa45bcaba9Jean Delvare#define matroxfb_DAC_unlock()                 spin_unlock(&minfo->lock.DAC)
714fc2d10ddfc8989e82f74d2a38c7d6bfa45bcaba9Jean Delvare#define matroxfb_DAC_lock_irqsave(flags)      spin_lock_irqsave(&minfo->lock.DAC, flags)
715fc2d10ddfc8989e82f74d2a38c7d6bfa45bcaba9Jean Delvare#define matroxfb_DAC_unlock_irqrestore(flags) spin_unlock_irqrestore(&minfo->lock.DAC, flags)
716316b4d644caceb2cf7432d8a27e45b88f57ef2a0Jean Delvareextern void matroxfb_DAC_out(const struct matrox_fb_info *minfo, int reg,
717316b4d644caceb2cf7432d8a27e45b88f57ef2a0Jean Delvare			     int val);
718316b4d644caceb2cf7432d8a27e45b88f57ef2a0Jean Delvareextern int matroxfb_DAC_in(const struct matrox_fb_info *minfo, int reg);
7191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsextern void matroxfb_var2my(struct fb_var_screeninfo* fvsi, struct my_timming* mt);
720316b4d644caceb2cf7432d8a27e45b88f57ef2a0Jean Delvareextern int matroxfb_wait_for_sync(struct matrox_fb_info *minfo, u_int32_t crtc);
721316b4d644caceb2cf7432d8a27e45b88f57ef2a0Jean Delvareextern int matroxfb_enable_irq(struct matrox_fb_info *minfo, int reenable);
7221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
7231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#ifdef MATROXFB_USE_SPINLOCKS
724fc2d10ddfc8989e82f74d2a38c7d6bfa45bcaba9Jean Delvare#define CRITBEGIN  spin_lock_irqsave(&minfo->lock.accel, critflags);
725fc2d10ddfc8989e82f74d2a38c7d6bfa45bcaba9Jean Delvare#define CRITEND	   spin_unlock_irqrestore(&minfo->lock.accel, critflags);
7261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define CRITFLAGS  unsigned long critflags;
7271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#else
7281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define CRITBEGIN
7291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define CRITEND
7301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define CRITFLAGS
7311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#endif
7321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
7331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#endif	/* __MATROXFB_H__ */
734