📄 matroxfb_base.h
字号:
/* * * Hardware accelerated Matrox Millennium I, II, Mystique, G100, G200, G400 and G450 * * (c) 1998,1999,2000,2001 Petr Vandrovec <vandrove@vc.cvut.cz> * */#ifndef __MATROXFB_H__#define __MATROXFB_H__/* general, but fairly heavy, debugging */#undef MATROXFB_DEBUG/* heavy debugging: *//* -- logs putc[s], so everytime a char is displayed, it's logged */#undef MATROXFB_DEBUG_HEAVY/* This one _could_ cause infinite loops *//* It _does_ cause lots and lots of messages during idle loops */#undef MATROXFB_DEBUG_LOOP/* Debug register calls, too? */#undef MATROXFB_DEBUG_REG/* Guard accelerator accesses with spin_lock_irqsave... */#undef MATROXFB_USE_SPINLOCKS#include <linux/config.h>#include <linux/module.h>#include <linux/kernel.h>#include <linux/errno.h>#include <linux/string.h>#include <linux/mm.h>#include <linux/tty.h>#include <linux/slab.h>#include <linux/delay.h>#include <linux/fb.h>#include <linux/console.h>#include <linux/selection.h>#include <linux/ioport.h>#include <linux/init.h>#include <linux/timer.h>#include <linux/pci.h>#include <linux/spinlock.h>#include <asm/io.h>#include <asm/unaligned.h>#ifdef CONFIG_MTRR#include <asm/mtrr.h>#endif#include <video/fbcon.h>#include <video/fbcon-cfb4.h>#include <video/fbcon-cfb8.h>#include <video/fbcon-cfb16.h>#include <video/fbcon-cfb24.h>#include <video/fbcon-cfb32.h>#if defined(CONFIG_FB_COMPAT_XPMAC)#include <asm/vc_ioctl.h>#endif#if defined(CONFIG_PPC)#include <asm/prom.h>#include <asm/pci-bridge.h>#include <video/macmodes.h>#endif/* always compile support for 32MB... It cost almost nothing */#define CONFIG_FB_MATROX_32MB#define FBCON_HAS_VGATEXT#ifdef MATROXFB_DEBUG#define DEBUG#define DBG(x) printk(KERN_DEBUG "matroxfb: %s\n", (x));#ifdef MATROXFB_DEBUG_HEAVY#define DBG_HEAVY(x) DBG(x)#else /* MATROXFB_DEBUG_HEAVY */#define DBG_HEAVY(x) /* DBG_HEAVY */#endif /* MATROXFB_DEBUG_HEAVY */#ifdef MATROXFB_DEBUG_LOOP#define DBG_LOOP(x) DBG(x)#else /* MATROXFB_DEBUG_LOOP */#define DBG_LOOP(x) /* DBG_LOOP */#endif /* MATROXFB_DEBUG_LOOP */#ifdef MATROXFB_DEBUG_REG#define DBG_REG(x) DBG(x)#else /* MATROXFB_DEBUG_REG */#define DBG_REG(x) /* DBG_REG */#endif /* MATROXFB_DEBUG_REG */#else /* MATROXFB_DEBUG */#define DBG(x) /* DBG */#define DBG_HEAVY(x) /* DBG_HEAVY */#define DBG_REG(x) /* DBG_REG */#define DBG_LOOP(x) /* DBG_LOOP */#endif /* MATROXFB_DEBUG */#if !defined(__i386__) && !defined(__x86_64__)#ifndef ioremap_nocache#define ioremap_nocache(X,Y) ioremap(X,Y)#endif#endif#if defined(__alpha__) || defined(__mc68000__)#define READx_WORKS#define MEMCPYTOIO_WORKS#elif defined(__powerpc64__)#define RAW_READx_WORKS#define MEMCPYTOIO_WORKS#else#define READx_FAILS/* recheck __ppc__, maybe that __ppc__ needs MEMCPYTOIO_WRITEL *//* I benchmarked PII/350MHz with G200... MEMCPY, MEMCPYTOIO and WRITEL are on same speed ( <2% diff) *//* so that means that G200 speed (or AGP speed?) is our limit... I do not have benchmark to test, how *//* much of PCI bandwidth is used during transfers... */#if defined(__i386__) || defined(__x86_64__)#define MEMCPYTOIO_MEMCPY#else#define MEMCPYTOIO_WRITEL#endif#endif#if defined(__mc68000__)#define MAP_BUSTOVIRT#else#define MAP_IOREMAP#endif#ifdef DEBUG#define dprintk(X...) printk(X)#else#define dprintk(X...)#endif#ifndef PCI_SS_VENDOR_ID_SIEMENS_NIXDORF#define PCI_SS_VENDOR_ID_SIEMENS_NIXDORF 0x110A#endif#ifndef PCI_SS_VENDOR_ID_MATROX#define PCI_SS_VENDOR_ID_MATROX PCI_VENDOR_ID_MATROX#endif#ifndef PCI_SS_ID_MATROX_PRODUCTIVA_G100_AGP#define PCI_SS_ID_MATROX_GENERIC 0xFF00#define PCI_SS_ID_MATROX_PRODUCTIVA_G100_AGP 0xFF01#define PCI_SS_ID_MATROX_MYSTIQUE_G200_AGP 0xFF02#define PCI_SS_ID_MATROX_MILLENIUM_G200_AGP 0xFF03#define PCI_SS_ID_MATROX_MARVEL_G200_AGP 0xFF04#define PCI_SS_ID_MATROX_MGA_G100_PCI 0xFF05#define PCI_SS_ID_MATROX_MGA_G100_AGP 0x1001#define PCI_SS_ID_MATROX_MILLENNIUM_G400_MAX_AGP 0x2179#define PCI_SS_ID_SIEMENS_MGA_G100_AGP 0x001E /* 30 */#define PCI_SS_ID_SIEMENS_MGA_G200_AGP 0x0032 /* 50 */#endif#define MX_VISUAL_TRUECOLOR FB_VISUAL_DIRECTCOLOR#define MX_VISUAL_DIRECTCOLOR FB_VISUAL_TRUECOLOR#define MX_VISUAL_PSEUDOCOLOR FB_VISUAL_PSEUDOCOLOR#define CNVT_TOHW(val,width) ((((val)<<(width))+0x7FFF-(val))>>16)/* G-series and Mystique have (almost) same DAC */#undef NEED_DAC1064#if defined(CONFIG_FB_MATROX_MYSTIQUE) || defined(CONFIG_FB_MATROX_G100)#define NEED_DAC1064 1#endiftypedef struct { u_int8_t* vaddr;} vaddr_t;#ifdef READx_WORKSstatic inline unsigned int mga_readb(vaddr_t va, unsigned int offs) { return readb(va.vaddr + offs);}static inline unsigned int mga_readw(vaddr_t va, unsigned int offs) { return readw(va.vaddr + offs);}static inline u_int32_t mga_readl(vaddr_t va, unsigned int offs) { return readl(va.vaddr + offs);}static inline void mga_writeb(vaddr_t va, unsigned int offs, u_int8_t value) { writeb(value, va.vaddr + offs);}static inline void mga_writew(vaddr_t va, unsigned int offs, u_int16_t value) { writew(value, va.vaddr + offs);}static inline void mga_writel(vaddr_t va, unsigned int offs, u_int32_t value) { writel(value, va.vaddr + offs);}#elif defined(RAW_READx_WORKS)static inline unsigned int mga_readb(vaddr_t va, unsigned int offs) { return __raw_readb(va.vaddr + offs);}static inline unsigned int mga_readw(vaddr_t va, unsigned int offs) { return __raw_readw(va.vaddr + offs);}static inline u_int32_t mga_readl(vaddr_t va, unsigned int offs) { return __raw_readl(va.vaddr + offs);}static inline void mga_writeb(vaddr_t va, unsigned int offs, u_int8_t value) { __raw_writeb(value, va.vaddr + offs);}static inline void mga_writew(vaddr_t va, unsigned int offs, u_int16_t value) { __raw_writew(value, va.vaddr + offs);}static inline void mga_writel(vaddr_t va, unsigned int offs, u_int32_t value) { __raw_writel(value, va.vaddr + offs);}#elsestatic inline unsigned int mga_readb(vaddr_t va, unsigned int offs) { return *(volatile u_int8_t*)(va.vaddr + offs);}static inline unsigned int mga_readw(vaddr_t va, unsigned int offs) { return *(volatile u_int16_t*)(va.vaddr + offs);}static inline u_int32_t mga_readl(vaddr_t va, unsigned int offs) { return *(volatile u_int32_t*)(va.vaddr + offs);}static inline void mga_writeb(vaddr_t va, unsigned int offs, u_int8_t value) { *(volatile u_int8_t*)(va.vaddr + offs) = value;}static inline void mga_writew(vaddr_t va, unsigned int offs, u_int16_t value) { *(volatile u_int16_t*)(va.vaddr + offs) = value;}static inline void mga_writel(vaddr_t va, unsigned int offs, u_int32_t value) { *(volatile u_int32_t*)(va.vaddr + offs) = value;}#endifstatic inline void mga_memcpy_toio(vaddr_t va, unsigned int offs, const void* src, int len) {#ifdef MEMCPYTOIO_WORKS memcpy_toio(va.vaddr + offs, src, len);#elif defined(MEMCPYTOIO_WRITEL) if (offs & 3) { while (len >= 4) { mga_writel(va, offs, get_unaligned((u32 *)src)); offs += 4; len -= 4; src += 4; } } else { while (len >= 4) { mga_writel(va, offs, *(u32 *)src); offs += 4; len -= 4; src += 4; } } if (len) { u_int32_t tmp; memcpy(&tmp, src, len); mga_writel(va, offs, tmp); }#elif defined(MEMCPYTOIO_MEMCPY) memcpy(va.vaddr + offs, src, len);#else#error "Sorry, do not know how to write block of data to device"#endif}static inline void vaddr_add(vaddr_t* va, unsigned long offs) { va->vaddr += offs;}static inline void* vaddr_va(vaddr_t va) { return va.vaddr;}#define MGA_IOREMAP_NORMAL 0#define MGA_IOREMAP_NOCACHE 1#define MGA_IOREMAP_FB MGA_IOREMAP_NOCACHE#define MGA_IOREMAP_MMIO MGA_IOREMAP_NOCACHEstatic inline int mga_ioremap(unsigned long phys, unsigned long size, int flags, vaddr_t* virt) {#ifdef MAP_IOREMAP if (flags & MGA_IOREMAP_NOCACHE) virt->vaddr = ioremap_nocache(phys, size); else virt->vaddr = ioremap(phys, size);#else#ifdef MAP_BUSTOVIRT virt->vaddr = bus_to_virt(phys);#else#error "Your architecture does not have neither ioremap nor bus_to_virt... Giving up"#endif#endif return (virt->vaddr == 0); /* 0, !0... 0, error_code in future */}static inline void mga_iounmap(vaddr_t va) {#ifdef MAP_IOREMAP iounmap(va.vaddr);#endif}struct my_timming { unsigned int pixclock; int mnp; unsigned int crtc; unsigned int HDisplay; unsigned int HSyncStart; unsigned int HSyncEnd; unsigned int HTotal; unsigned int VDisplay; unsigned int VSyncStart; unsigned int VSyncEnd; unsigned int VTotal; unsigned int sync; int dblscan; int interlaced; unsigned int delay; /* CRTC delay */};enum { M_SYSTEM_PLL, M_PIXEL_PLL_A, M_PIXEL_PLL_B, M_PIXEL_PLL_C, M_VIDEO_PLL };struct matrox_pll_cache { unsigned int valid; struct { unsigned int mnp_key; unsigned int mnp_value; } data[4];};struct matrox_pll_limits { unsigned int vcomin; unsigned int vcomax;};struct matrox_pll_features { unsigned int vco_freq_min; unsigned int ref_freq; unsigned int feed_div_min; unsigned int feed_div_max; unsigned int in_div_min; unsigned int in_div_max; unsigned int post_shift_max;};struct matroxfb_par{ unsigned int final_bppShift; unsigned int cmap_len; struct { unsigned int bytes; unsigned int pixels; unsigned int chunks; } ydstorg; void (*putc)(u_int32_t, u_int32_t, struct display*, int, int, int); void (*putcs)(u_int32_t, u_int32_t, struct display*, const unsigned short*, int, int, int);};struct matrox_fb_info;struct matrox_DAC1064_features { u_int8_t xvrefctrl; u_int8_t xmiscctrl; unsigned int cursorimage;};struct matrox_accel_features { int has_cacheflush;};/* current hardware status */struct mavenregs { u_int8_t regs[256]; int mode; int vlines; int xtal; int fv; u_int16_t htotal; u_int16_t hcorr;};struct matrox_crtc2 { u_int32_t ctl, hparam, hsync, vparam, vsync, preload, datactl;};struct matrox_hw_state { u_int32_t MXoptionReg; unsigned char DACclk[6]; unsigned char DACreg[80]; unsigned char MiscOutReg; unsigned char DACpal[768]; unsigned char CRTC[25]; unsigned char CRTCEXT[9]; unsigned char SEQ[5]; /* unused for MGA mode, but who knows... */ unsigned char GCTL[9]; /* unused for MGA mode, but who knows... */ unsigned char ATTR[21]; /* TVOut only */ struct mavenregs maven; struct matrox_crtc2 crtc2;};struct matrox_accel_data {#ifdef CONFIG_FB_MATROX_MILLENIUM unsigned char ramdac_rev;#endif u_int32_t m_dwg_rect; u_int32_t m_opmode;};struct matroxfb_queryctrl;struct matroxfb_control;struct matrox_altout { struct module *owner; const char *name; int (*compute)(void* altout_dev, struct my_timming* input); int (*program)(void* altout_dev); int (*start)(void* altout_dev); int (*verifymode)(void* altout_dev, u_int32_t mode); int (*getqueryctrl)(void* altout_dev, struct matroxfb_queryctrl* ctrl); int (*getctrl)(void* altout_dev, struct matroxfb_control* ctrl); int (*setctrl)(void* altout_dev, struct matroxfb_control* ctrl);};#define MATROXFB_SRC_NONE 0#define MATROXFB_SRC_CRTC1 1#define MATROXFB_SRC_CRTC2 2enum mga_chip { MGA_2064, MGA_2164, MGA_1064, MGA_1164, MGA_G100, MGA_G200, MGA_G400, MGA_G450, MGA_G550 };struct matrox_bios { unsigned int bios_valid : 1; unsigned int pins_len; unsigned char pins[128]; struct { unsigned char vMaj, vMin, vRev; } version; struct { unsigned char state, tvout; } output;};struct matrox_switch;struct matroxfb_driver;struct matroxfb_dh_fb_info;struct matrox_vsync {
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -