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