162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 */ 262306a36Sopenharmony_ci/* 362306a36Sopenharmony_ci * 462306a36Sopenharmony_ci * Hardware accelerated Matrox Millennium I, II, Mystique, G100, G200, G400 and G450 562306a36Sopenharmony_ci * 662306a36Sopenharmony_ci * (c) 1998-2002 Petr Vandrovec <vandrove@vc.cvut.cz> 762306a36Sopenharmony_ci * 862306a36Sopenharmony_ci */ 962306a36Sopenharmony_ci#ifndef __MATROXFB_H__ 1062306a36Sopenharmony_ci#define __MATROXFB_H__ 1162306a36Sopenharmony_ci 1262306a36Sopenharmony_ci/* general, but fairly heavy, debugging */ 1362306a36Sopenharmony_ci#undef MATROXFB_DEBUG 1462306a36Sopenharmony_ci 1562306a36Sopenharmony_ci/* heavy debugging: */ 1662306a36Sopenharmony_ci/* -- logs putc[s], so every time a char is displayed, it's logged */ 1762306a36Sopenharmony_ci#undef MATROXFB_DEBUG_HEAVY 1862306a36Sopenharmony_ci 1962306a36Sopenharmony_ci/* This one _could_ cause infinite loops */ 2062306a36Sopenharmony_ci/* It _does_ cause lots and lots of messages during idle loops */ 2162306a36Sopenharmony_ci#undef MATROXFB_DEBUG_LOOP 2262306a36Sopenharmony_ci 2362306a36Sopenharmony_ci/* Debug register calls, too? */ 2462306a36Sopenharmony_ci#undef MATROXFB_DEBUG_REG 2562306a36Sopenharmony_ci 2662306a36Sopenharmony_ci/* Guard accelerator accesses with spin_lock_irqsave... */ 2762306a36Sopenharmony_ci#undef MATROXFB_USE_SPINLOCKS 2862306a36Sopenharmony_ci 2962306a36Sopenharmony_ci#include <linux/module.h> 3062306a36Sopenharmony_ci#include <linux/kernel.h> 3162306a36Sopenharmony_ci#include <linux/errno.h> 3262306a36Sopenharmony_ci#include <linux/string.h> 3362306a36Sopenharmony_ci#include <linux/mm.h> 3462306a36Sopenharmony_ci#include <linux/slab.h> 3562306a36Sopenharmony_ci#include <linux/delay.h> 3662306a36Sopenharmony_ci#include <linux/fb.h> 3762306a36Sopenharmony_ci#include <linux/console.h> 3862306a36Sopenharmony_ci#include <linux/selection.h> 3962306a36Sopenharmony_ci#include <linux/ioport.h> 4062306a36Sopenharmony_ci#include <linux/init.h> 4162306a36Sopenharmony_ci#include <linux/timer.h> 4262306a36Sopenharmony_ci#include <linux/pci.h> 4362306a36Sopenharmony_ci#include <linux/spinlock.h> 4462306a36Sopenharmony_ci#include <linux/kd.h> 4562306a36Sopenharmony_ci 4662306a36Sopenharmony_ci#include <asm/io.h> 4762306a36Sopenharmony_ci#include <asm/unaligned.h> 4862306a36Sopenharmony_ci 4962306a36Sopenharmony_ci#if defined(CONFIG_PPC_PMAC) 5062306a36Sopenharmony_ci#include "../macmodes.h" 5162306a36Sopenharmony_ci#endif 5262306a36Sopenharmony_ci 5362306a36Sopenharmony_ci#ifdef MATROXFB_DEBUG 5462306a36Sopenharmony_ci 5562306a36Sopenharmony_ci#define DEBUG 5662306a36Sopenharmony_ci#define DBG(x) printk(KERN_DEBUG "matroxfb: %s\n", (x)); 5762306a36Sopenharmony_ci 5862306a36Sopenharmony_ci#ifdef MATROXFB_DEBUG_HEAVY 5962306a36Sopenharmony_ci#define DBG_HEAVY(x) DBG(x) 6062306a36Sopenharmony_ci#else /* MATROXFB_DEBUG_HEAVY */ 6162306a36Sopenharmony_ci#define DBG_HEAVY(x) /* DBG_HEAVY */ 6262306a36Sopenharmony_ci#endif /* MATROXFB_DEBUG_HEAVY */ 6362306a36Sopenharmony_ci 6462306a36Sopenharmony_ci#ifdef MATROXFB_DEBUG_LOOP 6562306a36Sopenharmony_ci#define DBG_LOOP(x) DBG(x) 6662306a36Sopenharmony_ci#else /* MATROXFB_DEBUG_LOOP */ 6762306a36Sopenharmony_ci#define DBG_LOOP(x) /* DBG_LOOP */ 6862306a36Sopenharmony_ci#endif /* MATROXFB_DEBUG_LOOP */ 6962306a36Sopenharmony_ci 7062306a36Sopenharmony_ci#ifdef MATROXFB_DEBUG_REG 7162306a36Sopenharmony_ci#define DBG_REG(x) DBG(x) 7262306a36Sopenharmony_ci#else /* MATROXFB_DEBUG_REG */ 7362306a36Sopenharmony_ci#define DBG_REG(x) /* DBG_REG */ 7462306a36Sopenharmony_ci#endif /* MATROXFB_DEBUG_REG */ 7562306a36Sopenharmony_ci 7662306a36Sopenharmony_ci#else /* MATROXFB_DEBUG */ 7762306a36Sopenharmony_ci 7862306a36Sopenharmony_ci#define DBG(x) /* DBG */ 7962306a36Sopenharmony_ci#define DBG_HEAVY(x) /* DBG_HEAVY */ 8062306a36Sopenharmony_ci#define DBG_REG(x) /* DBG_REG */ 8162306a36Sopenharmony_ci#define DBG_LOOP(x) /* DBG_LOOP */ 8262306a36Sopenharmony_ci 8362306a36Sopenharmony_ci#endif /* MATROXFB_DEBUG */ 8462306a36Sopenharmony_ci 8562306a36Sopenharmony_ci#ifdef DEBUG 8662306a36Sopenharmony_ci#define dprintk(X...) printk(X) 8762306a36Sopenharmony_ci#else 8862306a36Sopenharmony_ci#define dprintk(X...) no_printk(X) 8962306a36Sopenharmony_ci#endif 9062306a36Sopenharmony_ci 9162306a36Sopenharmony_ci#ifndef PCI_SS_VENDOR_ID_SIEMENS_NIXDORF 9262306a36Sopenharmony_ci#define PCI_SS_VENDOR_ID_SIEMENS_NIXDORF 0x110A 9362306a36Sopenharmony_ci#endif 9462306a36Sopenharmony_ci#ifndef PCI_SS_VENDOR_ID_MATROX 9562306a36Sopenharmony_ci#define PCI_SS_VENDOR_ID_MATROX PCI_VENDOR_ID_MATROX 9662306a36Sopenharmony_ci#endif 9762306a36Sopenharmony_ci 9862306a36Sopenharmony_ci#ifndef PCI_SS_ID_MATROX_PRODUCTIVA_G100_AGP 9962306a36Sopenharmony_ci#define PCI_SS_ID_MATROX_GENERIC 0xFF00 10062306a36Sopenharmony_ci#define PCI_SS_ID_MATROX_PRODUCTIVA_G100_AGP 0xFF01 10162306a36Sopenharmony_ci#define PCI_SS_ID_MATROX_MYSTIQUE_G200_AGP 0xFF02 10262306a36Sopenharmony_ci#define PCI_SS_ID_MATROX_MILLENIUM_G200_AGP 0xFF03 10362306a36Sopenharmony_ci#define PCI_SS_ID_MATROX_MARVEL_G200_AGP 0xFF04 10462306a36Sopenharmony_ci#define PCI_SS_ID_MATROX_MGA_G100_PCI 0xFF05 10562306a36Sopenharmony_ci#define PCI_SS_ID_MATROX_MGA_G100_AGP 0x1001 10662306a36Sopenharmony_ci#define PCI_SS_ID_MATROX_MILLENNIUM_G400_MAX_AGP 0x2179 10762306a36Sopenharmony_ci#define PCI_SS_ID_SIEMENS_MGA_G100_AGP 0x001E /* 30 */ 10862306a36Sopenharmony_ci#define PCI_SS_ID_SIEMENS_MGA_G200_AGP 0x0032 /* 50 */ 10962306a36Sopenharmony_ci#endif 11062306a36Sopenharmony_ci 11162306a36Sopenharmony_ci#define MX_VISUAL_TRUECOLOR FB_VISUAL_DIRECTCOLOR 11262306a36Sopenharmony_ci#define MX_VISUAL_DIRECTCOLOR FB_VISUAL_TRUECOLOR 11362306a36Sopenharmony_ci#define MX_VISUAL_PSEUDOCOLOR FB_VISUAL_PSEUDOCOLOR 11462306a36Sopenharmony_ci 11562306a36Sopenharmony_ci#define CNVT_TOHW(val,width) ((((val)<<(width))+0x7FFF-(val))>>16) 11662306a36Sopenharmony_ci 11762306a36Sopenharmony_ci/* G-series and Mystique have (almost) same DAC */ 11862306a36Sopenharmony_ci#undef NEED_DAC1064 11962306a36Sopenharmony_ci#if defined(CONFIG_FB_MATROX_MYSTIQUE) || defined(CONFIG_FB_MATROX_G) 12062306a36Sopenharmony_ci#define NEED_DAC1064 1 12162306a36Sopenharmony_ci#endif 12262306a36Sopenharmony_ci 12362306a36Sopenharmony_citypedef struct { 12462306a36Sopenharmony_ci void __iomem* vaddr; 12562306a36Sopenharmony_ci} vaddr_t; 12662306a36Sopenharmony_ci 12762306a36Sopenharmony_cistatic inline unsigned int mga_readb(vaddr_t va, unsigned int offs) { 12862306a36Sopenharmony_ci return readb(va.vaddr + offs); 12962306a36Sopenharmony_ci} 13062306a36Sopenharmony_ci 13162306a36Sopenharmony_cistatic inline void mga_writeb(vaddr_t va, unsigned int offs, u_int8_t value) { 13262306a36Sopenharmony_ci writeb(value, va.vaddr + offs); 13362306a36Sopenharmony_ci} 13462306a36Sopenharmony_ci 13562306a36Sopenharmony_cistatic inline void mga_writew(vaddr_t va, unsigned int offs, u_int16_t value) { 13662306a36Sopenharmony_ci writew(value, va.vaddr + offs); 13762306a36Sopenharmony_ci} 13862306a36Sopenharmony_ci 13962306a36Sopenharmony_cistatic inline u_int32_t mga_readl(vaddr_t va, unsigned int offs) { 14062306a36Sopenharmony_ci return readl(va.vaddr + offs); 14162306a36Sopenharmony_ci} 14262306a36Sopenharmony_ci 14362306a36Sopenharmony_cistatic inline void mga_writel(vaddr_t va, unsigned int offs, u_int32_t value) { 14462306a36Sopenharmony_ci writel(value, va.vaddr + offs); 14562306a36Sopenharmony_ci} 14662306a36Sopenharmony_ci 14762306a36Sopenharmony_cistatic inline void mga_memcpy_toio(vaddr_t va, const void* src, int len) { 14862306a36Sopenharmony_ci#if defined(__alpha__) || defined(__i386__) || defined(__x86_64__) 14962306a36Sopenharmony_ci /* 15062306a36Sopenharmony_ci * iowrite32_rep works for us if: 15162306a36Sopenharmony_ci * (1) Copies data as 32bit quantities, not byte after byte, 15262306a36Sopenharmony_ci * (2) Performs LE ordered stores, and 15362306a36Sopenharmony_ci * (3) It copes with unaligned source (destination is guaranteed to be page 15462306a36Sopenharmony_ci * aligned and length is guaranteed to be multiple of 4). 15562306a36Sopenharmony_ci */ 15662306a36Sopenharmony_ci iowrite32_rep(va.vaddr, src, len >> 2); 15762306a36Sopenharmony_ci#else 15862306a36Sopenharmony_ci u_int32_t __iomem* addr = va.vaddr; 15962306a36Sopenharmony_ci 16062306a36Sopenharmony_ci if ((unsigned long)src & 3) { 16162306a36Sopenharmony_ci while (len >= 4) { 16262306a36Sopenharmony_ci fb_writel(get_unaligned((u32 *)src), addr); 16362306a36Sopenharmony_ci addr++; 16462306a36Sopenharmony_ci len -= 4; 16562306a36Sopenharmony_ci src += 4; 16662306a36Sopenharmony_ci } 16762306a36Sopenharmony_ci } else { 16862306a36Sopenharmony_ci while (len >= 4) { 16962306a36Sopenharmony_ci fb_writel(*(u32 *)src, addr); 17062306a36Sopenharmony_ci addr++; 17162306a36Sopenharmony_ci len -= 4; 17262306a36Sopenharmony_ci src += 4; 17362306a36Sopenharmony_ci } 17462306a36Sopenharmony_ci } 17562306a36Sopenharmony_ci#endif 17662306a36Sopenharmony_ci} 17762306a36Sopenharmony_ci 17862306a36Sopenharmony_cistatic inline void vaddr_add(vaddr_t* va, unsigned long offs) { 17962306a36Sopenharmony_ci va->vaddr += offs; 18062306a36Sopenharmony_ci} 18162306a36Sopenharmony_ci 18262306a36Sopenharmony_cistatic inline void __iomem* vaddr_va(vaddr_t va) { 18362306a36Sopenharmony_ci return va.vaddr; 18462306a36Sopenharmony_ci} 18562306a36Sopenharmony_ci 18662306a36Sopenharmony_cistruct my_timming { 18762306a36Sopenharmony_ci unsigned int pixclock; 18862306a36Sopenharmony_ci int mnp; 18962306a36Sopenharmony_ci unsigned int crtc; 19062306a36Sopenharmony_ci unsigned int HDisplay; 19162306a36Sopenharmony_ci unsigned int HSyncStart; 19262306a36Sopenharmony_ci unsigned int HSyncEnd; 19362306a36Sopenharmony_ci unsigned int HTotal; 19462306a36Sopenharmony_ci unsigned int VDisplay; 19562306a36Sopenharmony_ci unsigned int VSyncStart; 19662306a36Sopenharmony_ci unsigned int VSyncEnd; 19762306a36Sopenharmony_ci unsigned int VTotal; 19862306a36Sopenharmony_ci unsigned int sync; 19962306a36Sopenharmony_ci int dblscan; 20062306a36Sopenharmony_ci int interlaced; 20162306a36Sopenharmony_ci unsigned int delay; /* CRTC delay */ 20262306a36Sopenharmony_ci}; 20362306a36Sopenharmony_ci 20462306a36Sopenharmony_cienum { M_SYSTEM_PLL, M_PIXEL_PLL_A, M_PIXEL_PLL_B, M_PIXEL_PLL_C, M_VIDEO_PLL }; 20562306a36Sopenharmony_ci 20662306a36Sopenharmony_cistruct matrox_pll_cache { 20762306a36Sopenharmony_ci unsigned int valid; 20862306a36Sopenharmony_ci struct { 20962306a36Sopenharmony_ci unsigned int mnp_key; 21062306a36Sopenharmony_ci unsigned int mnp_value; 21162306a36Sopenharmony_ci } data[4]; 21262306a36Sopenharmony_ci}; 21362306a36Sopenharmony_ci 21462306a36Sopenharmony_cistruct matrox_pll_limits { 21562306a36Sopenharmony_ci unsigned int vcomin; 21662306a36Sopenharmony_ci unsigned int vcomax; 21762306a36Sopenharmony_ci}; 21862306a36Sopenharmony_ci 21962306a36Sopenharmony_cistruct matrox_pll_features { 22062306a36Sopenharmony_ci unsigned int vco_freq_min; 22162306a36Sopenharmony_ci unsigned int ref_freq; 22262306a36Sopenharmony_ci unsigned int feed_div_min; 22362306a36Sopenharmony_ci unsigned int feed_div_max; 22462306a36Sopenharmony_ci unsigned int in_div_min; 22562306a36Sopenharmony_ci unsigned int in_div_max; 22662306a36Sopenharmony_ci unsigned int post_shift_max; 22762306a36Sopenharmony_ci}; 22862306a36Sopenharmony_ci 22962306a36Sopenharmony_cistruct matroxfb_par 23062306a36Sopenharmony_ci{ 23162306a36Sopenharmony_ci unsigned int final_bppShift; 23262306a36Sopenharmony_ci unsigned int cmap_len; 23362306a36Sopenharmony_ci struct { 23462306a36Sopenharmony_ci unsigned int bytes; 23562306a36Sopenharmony_ci unsigned int pixels; 23662306a36Sopenharmony_ci unsigned int chunks; 23762306a36Sopenharmony_ci } ydstorg; 23862306a36Sopenharmony_ci}; 23962306a36Sopenharmony_ci 24062306a36Sopenharmony_cistruct matrox_fb_info; 24162306a36Sopenharmony_ci 24262306a36Sopenharmony_cistruct matrox_DAC1064_features { 24362306a36Sopenharmony_ci u_int8_t xvrefctrl; 24462306a36Sopenharmony_ci u_int8_t xmiscctrl; 24562306a36Sopenharmony_ci}; 24662306a36Sopenharmony_ci 24762306a36Sopenharmony_ci/* current hardware status */ 24862306a36Sopenharmony_cistruct mavenregs { 24962306a36Sopenharmony_ci u_int8_t regs[256]; 25062306a36Sopenharmony_ci int mode; 25162306a36Sopenharmony_ci int vlines; 25262306a36Sopenharmony_ci int xtal; 25362306a36Sopenharmony_ci int fv; 25462306a36Sopenharmony_ci 25562306a36Sopenharmony_ci u_int16_t htotal; 25662306a36Sopenharmony_ci u_int16_t hcorr; 25762306a36Sopenharmony_ci}; 25862306a36Sopenharmony_ci 25962306a36Sopenharmony_cistruct matrox_crtc2 { 26062306a36Sopenharmony_ci u_int32_t ctl; 26162306a36Sopenharmony_ci}; 26262306a36Sopenharmony_ci 26362306a36Sopenharmony_cistruct matrox_hw_state { 26462306a36Sopenharmony_ci u_int32_t MXoptionReg; 26562306a36Sopenharmony_ci unsigned char DACclk[6]; 26662306a36Sopenharmony_ci unsigned char DACreg[80]; 26762306a36Sopenharmony_ci unsigned char MiscOutReg; 26862306a36Sopenharmony_ci unsigned char DACpal[768]; 26962306a36Sopenharmony_ci unsigned char CRTC[25]; 27062306a36Sopenharmony_ci unsigned char CRTCEXT[9]; 27162306a36Sopenharmony_ci unsigned char SEQ[5]; 27262306a36Sopenharmony_ci /* unused for MGA mode, but who knows... */ 27362306a36Sopenharmony_ci unsigned char GCTL[9]; 27462306a36Sopenharmony_ci /* unused for MGA mode, but who knows... */ 27562306a36Sopenharmony_ci unsigned char ATTR[21]; 27662306a36Sopenharmony_ci 27762306a36Sopenharmony_ci /* TVOut only */ 27862306a36Sopenharmony_ci struct mavenregs maven; 27962306a36Sopenharmony_ci 28062306a36Sopenharmony_ci struct matrox_crtc2 crtc2; 28162306a36Sopenharmony_ci}; 28262306a36Sopenharmony_ci 28362306a36Sopenharmony_cistruct matrox_accel_data { 28462306a36Sopenharmony_ci#ifdef CONFIG_FB_MATROX_MILLENIUM 28562306a36Sopenharmony_ci unsigned char ramdac_rev; 28662306a36Sopenharmony_ci#endif 28762306a36Sopenharmony_ci u_int32_t m_dwg_rect; 28862306a36Sopenharmony_ci u_int32_t m_opmode; 28962306a36Sopenharmony_ci u_int32_t m_access; 29062306a36Sopenharmony_ci u_int32_t m_pitch; 29162306a36Sopenharmony_ci}; 29262306a36Sopenharmony_ci 29362306a36Sopenharmony_cistruct v4l2_queryctrl; 29462306a36Sopenharmony_cistruct v4l2_control; 29562306a36Sopenharmony_ci 29662306a36Sopenharmony_cistruct matrox_altout { 29762306a36Sopenharmony_ci const char *name; 29862306a36Sopenharmony_ci int (*compute)(void* altout_dev, struct my_timming* input); 29962306a36Sopenharmony_ci int (*program)(void* altout_dev); 30062306a36Sopenharmony_ci int (*start)(void* altout_dev); 30162306a36Sopenharmony_ci int (*verifymode)(void* altout_dev, u_int32_t mode); 30262306a36Sopenharmony_ci int (*getqueryctrl)(void* altout_dev, 30362306a36Sopenharmony_ci struct v4l2_queryctrl* ctrl); 30462306a36Sopenharmony_ci int (*getctrl)(void *altout_dev, 30562306a36Sopenharmony_ci struct v4l2_control* ctrl); 30662306a36Sopenharmony_ci int (*setctrl)(void *altout_dev, 30762306a36Sopenharmony_ci struct v4l2_control* ctrl); 30862306a36Sopenharmony_ci}; 30962306a36Sopenharmony_ci 31062306a36Sopenharmony_ci#define MATROXFB_SRC_NONE 0 31162306a36Sopenharmony_ci#define MATROXFB_SRC_CRTC1 1 31262306a36Sopenharmony_ci#define MATROXFB_SRC_CRTC2 2 31362306a36Sopenharmony_ci 31462306a36Sopenharmony_cienum mga_chip { MGA_2064, MGA_2164, MGA_1064, MGA_1164, MGA_G100, MGA_G200, MGA_G400, MGA_G450, MGA_G550 }; 31562306a36Sopenharmony_ci 31662306a36Sopenharmony_cistruct matrox_bios { 31762306a36Sopenharmony_ci unsigned int bios_valid : 1; 31862306a36Sopenharmony_ci unsigned int pins_len; 31962306a36Sopenharmony_ci unsigned char pins[128]; 32062306a36Sopenharmony_ci struct { 32162306a36Sopenharmony_ci unsigned char vMaj, vMin, vRev; 32262306a36Sopenharmony_ci } version; 32362306a36Sopenharmony_ci struct { 32462306a36Sopenharmony_ci unsigned char state, tvout; 32562306a36Sopenharmony_ci } output; 32662306a36Sopenharmony_ci}; 32762306a36Sopenharmony_ci 32862306a36Sopenharmony_cistruct matrox_switch; 32962306a36Sopenharmony_cistruct matroxfb_driver; 33062306a36Sopenharmony_cistruct matroxfb_dh_fb_info; 33162306a36Sopenharmony_ci 33262306a36Sopenharmony_cistruct matrox_vsync { 33362306a36Sopenharmony_ci wait_queue_head_t wait; 33462306a36Sopenharmony_ci unsigned int cnt; 33562306a36Sopenharmony_ci}; 33662306a36Sopenharmony_ci 33762306a36Sopenharmony_cistruct matrox_fb_info { 33862306a36Sopenharmony_ci struct fb_info fbcon; 33962306a36Sopenharmony_ci 34062306a36Sopenharmony_ci struct list_head next_fb; 34162306a36Sopenharmony_ci 34262306a36Sopenharmony_ci int dead; 34362306a36Sopenharmony_ci int initialized; 34462306a36Sopenharmony_ci unsigned int usecount; 34562306a36Sopenharmony_ci 34662306a36Sopenharmony_ci unsigned int userusecount; 34762306a36Sopenharmony_ci unsigned long irq_flags; 34862306a36Sopenharmony_ci 34962306a36Sopenharmony_ci struct matroxfb_par curr; 35062306a36Sopenharmony_ci struct matrox_hw_state hw; 35162306a36Sopenharmony_ci 35262306a36Sopenharmony_ci struct matrox_accel_data accel; 35362306a36Sopenharmony_ci 35462306a36Sopenharmony_ci struct pci_dev* pcidev; 35562306a36Sopenharmony_ci 35662306a36Sopenharmony_ci struct { 35762306a36Sopenharmony_ci struct matrox_vsync vsync; 35862306a36Sopenharmony_ci unsigned int pixclock; 35962306a36Sopenharmony_ci int mnp; 36062306a36Sopenharmony_ci int panpos; 36162306a36Sopenharmony_ci } crtc1; 36262306a36Sopenharmony_ci struct { 36362306a36Sopenharmony_ci struct matrox_vsync vsync; 36462306a36Sopenharmony_ci unsigned int pixclock; 36562306a36Sopenharmony_ci int mnp; 36662306a36Sopenharmony_ci struct matroxfb_dh_fb_info* info; 36762306a36Sopenharmony_ci struct rw_semaphore lock; 36862306a36Sopenharmony_ci } crtc2; 36962306a36Sopenharmony_ci struct { 37062306a36Sopenharmony_ci struct rw_semaphore lock; 37162306a36Sopenharmony_ci struct { 37262306a36Sopenharmony_ci int brightness, contrast, saturation, hue, gamma; 37362306a36Sopenharmony_ci int testout, deflicker; 37462306a36Sopenharmony_ci } tvo_params; 37562306a36Sopenharmony_ci } altout; 37662306a36Sopenharmony_ci#define MATROXFB_MAX_OUTPUTS 3 37762306a36Sopenharmony_ci struct { 37862306a36Sopenharmony_ci unsigned int src; 37962306a36Sopenharmony_ci struct matrox_altout* output; 38062306a36Sopenharmony_ci void* data; 38162306a36Sopenharmony_ci unsigned int mode; 38262306a36Sopenharmony_ci unsigned int default_src; 38362306a36Sopenharmony_ci } outputs[MATROXFB_MAX_OUTPUTS]; 38462306a36Sopenharmony_ci 38562306a36Sopenharmony_ci#define MATROXFB_MAX_FB_DRIVERS 5 38662306a36Sopenharmony_ci struct matroxfb_driver* (drivers[MATROXFB_MAX_FB_DRIVERS]); 38762306a36Sopenharmony_ci void* (drivers_data[MATROXFB_MAX_FB_DRIVERS]); 38862306a36Sopenharmony_ci unsigned int drivers_count; 38962306a36Sopenharmony_ci 39062306a36Sopenharmony_ci struct { 39162306a36Sopenharmony_ci unsigned long base; /* physical */ 39262306a36Sopenharmony_ci vaddr_t vbase; /* CPU view */ 39362306a36Sopenharmony_ci unsigned int len; 39462306a36Sopenharmony_ci unsigned int len_usable; 39562306a36Sopenharmony_ci unsigned int len_maximum; 39662306a36Sopenharmony_ci } video; 39762306a36Sopenharmony_ci 39862306a36Sopenharmony_ci struct { 39962306a36Sopenharmony_ci unsigned long base; /* physical */ 40062306a36Sopenharmony_ci vaddr_t vbase; /* CPU view */ 40162306a36Sopenharmony_ci unsigned int len; 40262306a36Sopenharmony_ci } mmio; 40362306a36Sopenharmony_ci 40462306a36Sopenharmony_ci unsigned int max_pixel_clock; 40562306a36Sopenharmony_ci unsigned int max_pixel_clock_panellink; 40662306a36Sopenharmony_ci 40762306a36Sopenharmony_ci struct matrox_switch* hw_switch; 40862306a36Sopenharmony_ci 40962306a36Sopenharmony_ci struct { 41062306a36Sopenharmony_ci struct matrox_pll_features pll; 41162306a36Sopenharmony_ci struct matrox_DAC1064_features DAC1064; 41262306a36Sopenharmony_ci } features; 41362306a36Sopenharmony_ci struct { 41462306a36Sopenharmony_ci spinlock_t DAC; 41562306a36Sopenharmony_ci spinlock_t accel; 41662306a36Sopenharmony_ci } lock; 41762306a36Sopenharmony_ci 41862306a36Sopenharmony_ci enum mga_chip chip; 41962306a36Sopenharmony_ci 42062306a36Sopenharmony_ci int interleave; 42162306a36Sopenharmony_ci int millenium; 42262306a36Sopenharmony_ci int milleniumII; 42362306a36Sopenharmony_ci struct { 42462306a36Sopenharmony_ci int cfb4; 42562306a36Sopenharmony_ci const int* vxres; 42662306a36Sopenharmony_ci int cross4MB; 42762306a36Sopenharmony_ci int text; 42862306a36Sopenharmony_ci int plnwt; 42962306a36Sopenharmony_ci int srcorg; 43062306a36Sopenharmony_ci } capable; 43162306a36Sopenharmony_ci int wc_cookie; 43262306a36Sopenharmony_ci struct { 43362306a36Sopenharmony_ci int precise_width; 43462306a36Sopenharmony_ci int mga_24bpp_fix; 43562306a36Sopenharmony_ci int novga; 43662306a36Sopenharmony_ci int nobios; 43762306a36Sopenharmony_ci int nopciretry; 43862306a36Sopenharmony_ci int noinit; 43962306a36Sopenharmony_ci int sgram; 44062306a36Sopenharmony_ci int support32MB; 44162306a36Sopenharmony_ci 44262306a36Sopenharmony_ci int accelerator; 44362306a36Sopenharmony_ci int text_type_aux; 44462306a36Sopenharmony_ci int video64bits; 44562306a36Sopenharmony_ci int crtc2; 44662306a36Sopenharmony_ci int maven_capable; 44762306a36Sopenharmony_ci unsigned int vgastep; 44862306a36Sopenharmony_ci unsigned int textmode; 44962306a36Sopenharmony_ci unsigned int textstep; 45062306a36Sopenharmony_ci unsigned int textvram; /* character cells */ 45162306a36Sopenharmony_ci unsigned int ydstorg; /* offset in bytes from video start to usable memory */ 45262306a36Sopenharmony_ci /* 0 except for 6MB Millenium */ 45362306a36Sopenharmony_ci int memtype; 45462306a36Sopenharmony_ci int g450dac; 45562306a36Sopenharmony_ci int dfp_type; 45662306a36Sopenharmony_ci int panellink; /* G400 DFP possible (not G450/G550) */ 45762306a36Sopenharmony_ci int dualhead; 45862306a36Sopenharmony_ci unsigned int fbResource; 45962306a36Sopenharmony_ci } devflags; 46062306a36Sopenharmony_ci struct fb_ops fbops; 46162306a36Sopenharmony_ci struct matrox_bios bios; 46262306a36Sopenharmony_ci struct { 46362306a36Sopenharmony_ci struct matrox_pll_limits pixel; 46462306a36Sopenharmony_ci struct matrox_pll_limits system; 46562306a36Sopenharmony_ci struct matrox_pll_limits video; 46662306a36Sopenharmony_ci } limits; 46762306a36Sopenharmony_ci struct { 46862306a36Sopenharmony_ci struct matrox_pll_cache pixel; 46962306a36Sopenharmony_ci struct matrox_pll_cache system; 47062306a36Sopenharmony_ci struct matrox_pll_cache video; 47162306a36Sopenharmony_ci } cache; 47262306a36Sopenharmony_ci struct { 47362306a36Sopenharmony_ci struct { 47462306a36Sopenharmony_ci unsigned int video; 47562306a36Sopenharmony_ci unsigned int system; 47662306a36Sopenharmony_ci } pll; 47762306a36Sopenharmony_ci struct { 47862306a36Sopenharmony_ci u_int32_t opt; 47962306a36Sopenharmony_ci u_int32_t opt2; 48062306a36Sopenharmony_ci u_int32_t opt3; 48162306a36Sopenharmony_ci u_int32_t mctlwtst; 48262306a36Sopenharmony_ci u_int32_t mctlwtst_core; 48362306a36Sopenharmony_ci u_int32_t memmisc; 48462306a36Sopenharmony_ci u_int32_t memrdbk; 48562306a36Sopenharmony_ci u_int32_t maccess; 48662306a36Sopenharmony_ci } reg; 48762306a36Sopenharmony_ci struct { 48862306a36Sopenharmony_ci unsigned int ddr:1, 48962306a36Sopenharmony_ci emrswen:1, 49062306a36Sopenharmony_ci dll:1; 49162306a36Sopenharmony_ci } memory; 49262306a36Sopenharmony_ci } values; 49362306a36Sopenharmony_ci u_int32_t cmap[16]; 49462306a36Sopenharmony_ci}; 49562306a36Sopenharmony_ci 49662306a36Sopenharmony_ci#define info2minfo(info) container_of(info, struct matrox_fb_info, fbcon) 49762306a36Sopenharmony_ci 49862306a36Sopenharmony_cistruct matrox_switch { 49962306a36Sopenharmony_ci int (*preinit)(struct matrox_fb_info *minfo); 50062306a36Sopenharmony_ci void (*reset)(struct matrox_fb_info *minfo); 50162306a36Sopenharmony_ci int (*init)(struct matrox_fb_info *minfo, struct my_timming*); 50262306a36Sopenharmony_ci void (*restore)(struct matrox_fb_info *minfo); 50362306a36Sopenharmony_ci}; 50462306a36Sopenharmony_ci 50562306a36Sopenharmony_cistruct matroxfb_driver { 50662306a36Sopenharmony_ci struct list_head node; 50762306a36Sopenharmony_ci char* name; 50862306a36Sopenharmony_ci void* (*probe)(struct matrox_fb_info* info); 50962306a36Sopenharmony_ci void (*remove)(struct matrox_fb_info* info, void* data); 51062306a36Sopenharmony_ci}; 51162306a36Sopenharmony_ci 51262306a36Sopenharmony_ciint matroxfb_register_driver(struct matroxfb_driver* drv); 51362306a36Sopenharmony_civoid matroxfb_unregister_driver(struct matroxfb_driver* drv); 51462306a36Sopenharmony_ci 51562306a36Sopenharmony_ci#define PCI_OPTION_REG 0x40 51662306a36Sopenharmony_ci#define PCI_OPTION_ENABLE_ROM 0x40000000 51762306a36Sopenharmony_ci 51862306a36Sopenharmony_ci#define PCI_MGA_INDEX 0x44 51962306a36Sopenharmony_ci#define PCI_MGA_DATA 0x48 52062306a36Sopenharmony_ci#define PCI_OPTION2_REG 0x50 52162306a36Sopenharmony_ci#define PCI_OPTION3_REG 0x54 52262306a36Sopenharmony_ci#define PCI_MEMMISC_REG 0x58 52362306a36Sopenharmony_ci 52462306a36Sopenharmony_ci#define M_DWGCTL 0x1C00 52562306a36Sopenharmony_ci#define M_MACCESS 0x1C04 52662306a36Sopenharmony_ci#define M_CTLWTST 0x1C08 52762306a36Sopenharmony_ci 52862306a36Sopenharmony_ci#define M_PLNWT 0x1C1C 52962306a36Sopenharmony_ci 53062306a36Sopenharmony_ci#define M_BCOL 0x1C20 53162306a36Sopenharmony_ci#define M_FCOL 0x1C24 53262306a36Sopenharmony_ci 53362306a36Sopenharmony_ci#define M_SGN 0x1C58 53462306a36Sopenharmony_ci#define M_LEN 0x1C5C 53562306a36Sopenharmony_ci#define M_AR0 0x1C60 53662306a36Sopenharmony_ci#define M_AR1 0x1C64 53762306a36Sopenharmony_ci#define M_AR2 0x1C68 53862306a36Sopenharmony_ci#define M_AR3 0x1C6C 53962306a36Sopenharmony_ci#define M_AR4 0x1C70 54062306a36Sopenharmony_ci#define M_AR5 0x1C74 54162306a36Sopenharmony_ci#define M_AR6 0x1C78 54262306a36Sopenharmony_ci 54362306a36Sopenharmony_ci#define M_CXBNDRY 0x1C80 54462306a36Sopenharmony_ci#define M_FXBNDRY 0x1C84 54562306a36Sopenharmony_ci#define M_YDSTLEN 0x1C88 54662306a36Sopenharmony_ci#define M_PITCH 0x1C8C 54762306a36Sopenharmony_ci#define M_YDST 0x1C90 54862306a36Sopenharmony_ci#define M_YDSTORG 0x1C94 54962306a36Sopenharmony_ci#define M_YTOP 0x1C98 55062306a36Sopenharmony_ci#define M_YBOT 0x1C9C 55162306a36Sopenharmony_ci 55262306a36Sopenharmony_ci/* mystique only */ 55362306a36Sopenharmony_ci#define M_CACHEFLUSH 0x1FFF 55462306a36Sopenharmony_ci 55562306a36Sopenharmony_ci#define M_EXEC 0x0100 55662306a36Sopenharmony_ci 55762306a36Sopenharmony_ci#define M_DWG_TRAP 0x04 55862306a36Sopenharmony_ci#define M_DWG_BITBLT 0x08 55962306a36Sopenharmony_ci#define M_DWG_ILOAD 0x09 56062306a36Sopenharmony_ci 56162306a36Sopenharmony_ci#define M_DWG_LINEAR 0x0080 56262306a36Sopenharmony_ci#define M_DWG_SOLID 0x0800 56362306a36Sopenharmony_ci#define M_DWG_ARZERO 0x1000 56462306a36Sopenharmony_ci#define M_DWG_SGNZERO 0x2000 56562306a36Sopenharmony_ci#define M_DWG_SHIFTZERO 0x4000 56662306a36Sopenharmony_ci 56762306a36Sopenharmony_ci#define M_DWG_REPLACE 0x000C0000 56862306a36Sopenharmony_ci#define M_DWG_REPLACE2 (M_DWG_REPLACE | 0x40) 56962306a36Sopenharmony_ci#define M_DWG_XOR 0x00060010 57062306a36Sopenharmony_ci 57162306a36Sopenharmony_ci#define M_DWG_BFCOL 0x04000000 57262306a36Sopenharmony_ci#define M_DWG_BMONOWF 0x08000000 57362306a36Sopenharmony_ci 57462306a36Sopenharmony_ci#define M_DWG_TRANSC 0x40000000 57562306a36Sopenharmony_ci 57662306a36Sopenharmony_ci#define M_FIFOSTATUS 0x1E10 57762306a36Sopenharmony_ci#define M_STATUS 0x1E14 57862306a36Sopenharmony_ci#define M_ICLEAR 0x1E18 57962306a36Sopenharmony_ci#define M_IEN 0x1E1C 58062306a36Sopenharmony_ci 58162306a36Sopenharmony_ci#define M_VCOUNT 0x1E20 58262306a36Sopenharmony_ci 58362306a36Sopenharmony_ci#define M_RESET 0x1E40 58462306a36Sopenharmony_ci#define M_MEMRDBK 0x1E44 58562306a36Sopenharmony_ci 58662306a36Sopenharmony_ci#define M_AGP2PLL 0x1E4C 58762306a36Sopenharmony_ci 58862306a36Sopenharmony_ci#define M_OPMODE 0x1E54 58962306a36Sopenharmony_ci#define M_OPMODE_DMA_GEN_WRITE 0x00 59062306a36Sopenharmony_ci#define M_OPMODE_DMA_BLIT 0x04 59162306a36Sopenharmony_ci#define M_OPMODE_DMA_VECTOR_WRITE 0x08 59262306a36Sopenharmony_ci#define M_OPMODE_DMA_LE 0x0000 /* little endian - no transformation */ 59362306a36Sopenharmony_ci#define M_OPMODE_DMA_BE_8BPP 0x0000 59462306a36Sopenharmony_ci#define M_OPMODE_DMA_BE_16BPP 0x0100 59562306a36Sopenharmony_ci#define M_OPMODE_DMA_BE_32BPP 0x0200 59662306a36Sopenharmony_ci#define M_OPMODE_DIR_LE 0x000000 /* little endian - no transformation */ 59762306a36Sopenharmony_ci#define M_OPMODE_DIR_BE_8BPP 0x000000 59862306a36Sopenharmony_ci#define M_OPMODE_DIR_BE_16BPP 0x010000 59962306a36Sopenharmony_ci#define M_OPMODE_DIR_BE_32BPP 0x020000 60062306a36Sopenharmony_ci 60162306a36Sopenharmony_ci#define M_ATTR_INDEX 0x1FC0 60262306a36Sopenharmony_ci#define M_ATTR_DATA 0x1FC1 60362306a36Sopenharmony_ci 60462306a36Sopenharmony_ci#define M_MISC_REG 0x1FC2 60562306a36Sopenharmony_ci#define M_3C2_RD 0x1FC2 60662306a36Sopenharmony_ci 60762306a36Sopenharmony_ci#define M_SEQ_INDEX 0x1FC4 60862306a36Sopenharmony_ci#define M_SEQ_DATA 0x1FC5 60962306a36Sopenharmony_ci#define M_SEQ1 0x01 61062306a36Sopenharmony_ci#define M_SEQ1_SCROFF 0x20 61162306a36Sopenharmony_ci 61262306a36Sopenharmony_ci#define M_MISC_REG_READ 0x1FCC 61362306a36Sopenharmony_ci 61462306a36Sopenharmony_ci#define M_GRAPHICS_INDEX 0x1FCE 61562306a36Sopenharmony_ci#define M_GRAPHICS_DATA 0x1FCF 61662306a36Sopenharmony_ci 61762306a36Sopenharmony_ci#define M_CRTC_INDEX 0x1FD4 61862306a36Sopenharmony_ci 61962306a36Sopenharmony_ci#define M_ATTR_RESET 0x1FDA 62062306a36Sopenharmony_ci#define M_3DA_WR 0x1FDA 62162306a36Sopenharmony_ci#define M_INSTS1 0x1FDA 62262306a36Sopenharmony_ci 62362306a36Sopenharmony_ci#define M_EXTVGA_INDEX 0x1FDE 62462306a36Sopenharmony_ci#define M_EXTVGA_DATA 0x1FDF 62562306a36Sopenharmony_ci 62662306a36Sopenharmony_ci/* G200 only */ 62762306a36Sopenharmony_ci#define M_SRCORG 0x2CB4 62862306a36Sopenharmony_ci#define M_DSTORG 0x2CB8 62962306a36Sopenharmony_ci 63062306a36Sopenharmony_ci#define M_RAMDAC_BASE 0x3C00 63162306a36Sopenharmony_ci 63262306a36Sopenharmony_ci/* fortunately, same on TVP3026 and MGA1064 */ 63362306a36Sopenharmony_ci#define M_DAC_REG (M_RAMDAC_BASE+0) 63462306a36Sopenharmony_ci#define M_DAC_VAL (M_RAMDAC_BASE+1) 63562306a36Sopenharmony_ci#define M_PALETTE_MASK (M_RAMDAC_BASE+2) 63662306a36Sopenharmony_ci 63762306a36Sopenharmony_ci#define M_X_INDEX 0x00 63862306a36Sopenharmony_ci#define M_X_DATAREG 0x0A 63962306a36Sopenharmony_ci 64062306a36Sopenharmony_ci#define DAC_XGENIOCTRL 0x2A 64162306a36Sopenharmony_ci#define DAC_XGENIODATA 0x2B 64262306a36Sopenharmony_ci 64362306a36Sopenharmony_ci#define M_C2CTL 0x3C10 64462306a36Sopenharmony_ci 64562306a36Sopenharmony_ci#define MX_OPTION_BSWAP 0x00000000 64662306a36Sopenharmony_ci 64762306a36Sopenharmony_ci#ifdef __LITTLE_ENDIAN 64862306a36Sopenharmony_ci#define M_OPMODE_4BPP (M_OPMODE_DMA_LE | M_OPMODE_DIR_LE | M_OPMODE_DMA_BLIT) 64962306a36Sopenharmony_ci#define M_OPMODE_8BPP (M_OPMODE_DMA_LE | M_OPMODE_DIR_LE | M_OPMODE_DMA_BLIT) 65062306a36Sopenharmony_ci#define M_OPMODE_16BPP (M_OPMODE_DMA_LE | M_OPMODE_DIR_LE | M_OPMODE_DMA_BLIT) 65162306a36Sopenharmony_ci#define M_OPMODE_24BPP (M_OPMODE_DMA_LE | M_OPMODE_DIR_LE | M_OPMODE_DMA_BLIT) 65262306a36Sopenharmony_ci#define M_OPMODE_32BPP (M_OPMODE_DMA_LE | M_OPMODE_DIR_LE | M_OPMODE_DMA_BLIT) 65362306a36Sopenharmony_ci#else 65462306a36Sopenharmony_ci#ifdef __BIG_ENDIAN 65562306a36Sopenharmony_ci#define M_OPMODE_4BPP (M_OPMODE_DMA_LE | M_OPMODE_DIR_LE | M_OPMODE_DMA_BLIT) /* TODO */ 65662306a36Sopenharmony_ci#define M_OPMODE_8BPP (M_OPMODE_DMA_LE | M_OPMODE_DIR_BE_8BPP | M_OPMODE_DMA_BLIT) 65762306a36Sopenharmony_ci#define M_OPMODE_16BPP (M_OPMODE_DMA_LE | M_OPMODE_DIR_BE_16BPP | M_OPMODE_DMA_BLIT) 65862306a36Sopenharmony_ci#define M_OPMODE_24BPP (M_OPMODE_DMA_LE | M_OPMODE_DIR_BE_8BPP | M_OPMODE_DMA_BLIT) /* TODO, ?32 */ 65962306a36Sopenharmony_ci#define M_OPMODE_32BPP (M_OPMODE_DMA_LE | M_OPMODE_DIR_BE_32BPP | M_OPMODE_DMA_BLIT) 66062306a36Sopenharmony_ci#else 66162306a36Sopenharmony_ci#error "Byte ordering have to be defined. Cannot continue." 66262306a36Sopenharmony_ci#endif 66362306a36Sopenharmony_ci#endif 66462306a36Sopenharmony_ci 66562306a36Sopenharmony_ci#define mga_inb(addr) mga_readb(minfo->mmio.vbase, (addr)) 66662306a36Sopenharmony_ci#define mga_inl(addr) mga_readl(minfo->mmio.vbase, (addr)) 66762306a36Sopenharmony_ci#define mga_outb(addr,val) mga_writeb(minfo->mmio.vbase, (addr), (val)) 66862306a36Sopenharmony_ci#define mga_outw(addr,val) mga_writew(minfo->mmio.vbase, (addr), (val)) 66962306a36Sopenharmony_ci#define mga_outl(addr,val) mga_writel(minfo->mmio.vbase, (addr), (val)) 67062306a36Sopenharmony_ci#define mga_readr(port,idx) (mga_outb((port),(idx)), mga_inb((port)+1)) 67162306a36Sopenharmony_ci#define mga_setr(addr,port,val) mga_outw(addr, ((val)<<8) | (port)) 67262306a36Sopenharmony_ci 67362306a36Sopenharmony_ci#define mga_fifo(n) do {} while ((mga_inl(M_FIFOSTATUS) & 0xFF) < (n)) 67462306a36Sopenharmony_ci 67562306a36Sopenharmony_ci#define WaitTillIdle() do { mga_inl(M_STATUS); do {} while (mga_inl(M_STATUS) & 0x10000); } while (0) 67662306a36Sopenharmony_ci 67762306a36Sopenharmony_ci/* code speedup */ 67862306a36Sopenharmony_ci#ifdef CONFIG_FB_MATROX_MILLENIUM 67962306a36Sopenharmony_ci#define isInterleave(x) (x->interleave) 68062306a36Sopenharmony_ci#define isMillenium(x) (x->millenium) 68162306a36Sopenharmony_ci#define isMilleniumII(x) (x->milleniumII) 68262306a36Sopenharmony_ci#else 68362306a36Sopenharmony_ci#define isInterleave(x) (0) 68462306a36Sopenharmony_ci#define isMillenium(x) (0) 68562306a36Sopenharmony_ci#define isMilleniumII(x) (0) 68662306a36Sopenharmony_ci#endif 68762306a36Sopenharmony_ci 68862306a36Sopenharmony_ci#define matroxfb_DAC_lock() spin_lock(&minfo->lock.DAC) 68962306a36Sopenharmony_ci#define matroxfb_DAC_unlock() spin_unlock(&minfo->lock.DAC) 69062306a36Sopenharmony_ci#define matroxfb_DAC_lock_irqsave(flags) spin_lock_irqsave(&minfo->lock.DAC, flags) 69162306a36Sopenharmony_ci#define matroxfb_DAC_unlock_irqrestore(flags) spin_unlock_irqrestore(&minfo->lock.DAC, flags) 69262306a36Sopenharmony_ciextern void matroxfb_DAC_out(const struct matrox_fb_info *minfo, int reg, 69362306a36Sopenharmony_ci int val); 69462306a36Sopenharmony_ciextern int matroxfb_DAC_in(const struct matrox_fb_info *minfo, int reg); 69562306a36Sopenharmony_ciextern void matroxfb_var2my(struct fb_var_screeninfo* fvsi, struct my_timming* mt); 69662306a36Sopenharmony_ciextern int matroxfb_wait_for_sync(struct matrox_fb_info *minfo, u_int32_t crtc); 69762306a36Sopenharmony_ciextern int matroxfb_enable_irq(struct matrox_fb_info *minfo, int reenable); 69862306a36Sopenharmony_ci 69962306a36Sopenharmony_ci#ifdef MATROXFB_USE_SPINLOCKS 70062306a36Sopenharmony_ci#define CRITBEGIN spin_lock_irqsave(&minfo->lock.accel, critflags); 70162306a36Sopenharmony_ci#define CRITEND spin_unlock_irqrestore(&minfo->lock.accel, critflags); 70262306a36Sopenharmony_ci#define CRITFLAGS unsigned long critflags; 70362306a36Sopenharmony_ci#else 70462306a36Sopenharmony_ci#define CRITBEGIN 70562306a36Sopenharmony_ci#define CRITEND 70662306a36Sopenharmony_ci#define CRITFLAGS 70762306a36Sopenharmony_ci#endif 70862306a36Sopenharmony_ci 70962306a36Sopenharmony_ci#endif /* __MATROXFB_H__ */ 710