v2.4.9.9 -> v2.4.9.10
[opensuse:kernel.git] / drivers / video / matrox / matroxfb_base.h
1 /*
2  *
3  * Hardware accelerated Matrox Millennium I, II, Mystique, G100, G200 and G400
4  *
5  * (c) 1998,1999,2000 Petr Vandrovec <vandrove@vc.cvut.cz>
6  *
7  */
8 #ifndef __MATROXFB_H__
9 #define __MATROXFB_H__
10
11 /* general, but fairly heavy, debugging */
12 #undef MATROXFB_DEBUG
13
14 /* heavy debugging: */
15 /* -- logs putc[s], so everytime a char is displayed, it's logged */
16 #undef MATROXFB_DEBUG_HEAVY
17
18 /* This one _could_ cause infinite loops */
19 /* It _does_ cause lots and lots of messages during idle loops */
20 #undef MATROXFB_DEBUG_LOOP
21
22 /* Debug register calls, too? */
23 #undef MATROXFB_DEBUG_REG
24
25 /* Guard accelerator accesses with spin_lock_irqsave... */
26 #undef MATROXFB_USE_SPINLOCKS
27
28 #include <linux/config.h>
29 #include <linux/module.h>
30 #include <linux/kernel.h>
31 #include <linux/errno.h>
32 #include <linux/string.h>
33 #include <linux/mm.h>
34 #include <linux/tty.h>
35 #include <linux/slab.h>
36 #include <linux/delay.h>
37 #include <linux/fb.h>
38 #include <linux/console.h>
39 #include <linux/selection.h>
40 #include <linux/ioport.h>
41 #include <linux/init.h>
42 #include <linux/timer.h>
43 #include <linux/pci.h>
44 #include <linux/spinlock.h>
45
46 #include <asm/io.h>
47 #include <asm/unaligned.h>
48 #ifdef CONFIG_MTRR
49 #include <asm/mtrr.h>
50 #endif
51
52 #include <video/fbcon.h>
53 #include <video/fbcon-cfb4.h>
54 #include <video/fbcon-cfb8.h>
55 #include <video/fbcon-cfb16.h>
56 #include <video/fbcon-cfb24.h>
57 #include <video/fbcon-cfb32.h>
58
59 #if defined(CONFIG_FB_COMPAT_XPMAC)
60 #include <asm/vc_ioctl.h>
61 #endif
62 #if defined(CONFIG_PPC)
63 #include <asm/prom.h>
64 #include <asm/pci-bridge.h>
65 #include <video/macmodes.h>
66 #endif
67
68 /* always compile support for 32MB... It cost almost nothing */
69 #define CONFIG_FB_MATROX_32MB
70
71 #define FBCON_HAS_VGATEXT
72
73 #ifdef MATROXFB_DEBUG
74
75 #define DEBUG
76 #define DBG(x)          printk(KERN_DEBUG "matroxfb: %s\n", (x));
77
78 #ifdef MATROXFB_DEBUG_HEAVY
79 #define DBG_HEAVY(x)    DBG(x)
80 #else /* MATROXFB_DEBUG_HEAVY */
81 #define DBG_HEAVY(x)    /* DBG_HEAVY */
82 #endif /* MATROXFB_DEBUG_HEAVY */
83
84 #ifdef MATROXFB_DEBUG_LOOP
85 #define DBG_LOOP(x)     DBG(x)
86 #else /* MATROXFB_DEBUG_LOOP */
87 #define DBG_LOOP(x)     /* DBG_LOOP */
88 #endif /* MATROXFB_DEBUG_LOOP */
89
90 #ifdef MATROXFB_DEBUG_REG
91 #define DBG_REG(x)      DBG(x)
92 #else /* MATROXFB_DEBUG_REG */
93 #define DBG_REG(x)      /* DBG_REG */
94 #endif /* MATROXFB_DEBUG_REG */
95
96 #else /* MATROXFB_DEBUG */
97
98 #define DBG(x)          /* DBG */
99 #define DBG_HEAVY(x)    /* DBG_HEAVY */
100 #define DBG_REG(x)      /* DBG_REG */
101 #define DBG_LOOP(x)     /* DBG_LOOP */
102
103 #endif /* MATROXFB_DEBUG */
104
105 #if !defined(__i386__) && !defined(__x86_64__)
106 #ifndef ioremap_nocache
107 #define ioremap_nocache(X,Y) ioremap(X,Y)
108 #endif
109 #endif
110
111 #if defined(__alpha__) || defined(__m68k__)
112 #define READx_WORKS
113 #define MEMCPYTOIO_WORKS
114 #else
115 #define READx_FAILS
116 /* recheck __ppc__, maybe that __ppc__ needs MEMCPYTOIO_WRITEL */
117 /* I benchmarked PII/350MHz with G200... MEMCPY, MEMCPYTOIO and WRITEL are on same speed ( <2% diff) */
118 /* so that means that G200 speed (or AGP speed?) is our limit... I do not have benchmark to test, how */
119 /* much of PCI bandwidth is used during transfers... */
120 #if defined(__i386__) || defined(__x86_64__)
121 #define MEMCPYTOIO_MEMCPY
122 #else
123 #define MEMCPYTOIO_WRITEL
124 #endif
125 #endif
126
127 #ifdef __sparc__
128 #error "Sorry, I have no idea how to do this on sparc... There is mapioaddr... With bus_type parameter..."
129 #endif
130
131 #if defined(__m68k__)
132 #define MAP_BUSTOVIRT
133 #else
134 #define MAP_IOREMAP
135 #endif
136
137 #ifdef DEBUG
138 #define dprintk(X...)   printk(X)
139 #else
140 #define dprintk(X...)
141 #endif
142
143 #ifndef PCI_SS_VENDOR_ID_SIEMENS_NIXDORF
144 #define PCI_SS_VENDOR_ID_SIEMENS_NIXDORF        0x110A
145 #endif
146 #ifndef PCI_SS_VENDOR_ID_MATROX
147 #define PCI_SS_VENDOR_ID_MATROX         PCI_VENDOR_ID_MATROX
148 #endif
149 #ifndef PCI_DEVICE_ID_MATROX_G200_PCI
150 #define PCI_DEVICE_ID_MATROX_G200_PCI   0x0520
151 #endif
152 #ifndef PCI_DEVICE_ID_MATROX_G200_AGP
153 #define PCI_DEVICE_ID_MATROX_G200_AGP   0x0521
154 #endif
155 #ifndef PCI_DEVICE_ID_MATROX_G100
156 #define PCI_DEVICE_ID_MATROX_G100       0x1000
157 #endif
158 #ifndef PCI_DEVICE_ID_MATROX_G100_AGP
159 #define PCI_DEVICE_ID_MATROX_G100_AGP   0x1001
160 #endif
161 #ifndef PCI_DEVICE_ID_MATROX_G400_AGP
162 #define PCI_DEVICE_ID_MATROX_G400_AGP   0x0525
163 #endif
164
165 #ifndef PCI_SS_ID_MATROX_PRODUCTIVA_G100_AGP
166 #define PCI_SS_ID_MATROX_GENERIC                0xFF00
167 #define PCI_SS_ID_MATROX_PRODUCTIVA_G100_AGP    0xFF01
168 #define PCI_SS_ID_MATROX_MYSTIQUE_G200_AGP      0xFF02
169 #define PCI_SS_ID_MATROX_MILLENIUM_G200_AGP     0xFF03
170 #define PCI_SS_ID_MATROX_MARVEL_G200_AGP        0xFF04
171 #define PCI_SS_ID_MATROX_MGA_G100_PCI           0xFF05
172 #define PCI_SS_ID_MATROX_MGA_G100_AGP           0x1001
173 #define PCI_SS_ID_MATROX_MILLENNIUM_G400_MAX_AGP        0x2179
174 #define PCI_SS_ID_SIEMENS_MGA_G100_AGP          0x001E /* 30 */
175 #define PCI_SS_ID_SIEMENS_MGA_G200_AGP          0x0032 /* 50 */
176 #endif
177
178 #define MX_VISUAL_TRUECOLOR     FB_VISUAL_DIRECTCOLOR
179 #define MX_VISUAL_DIRECTCOLOR   FB_VISUAL_TRUECOLOR
180 #define MX_VISUAL_PSEUDOCOLOR   FB_VISUAL_PSEUDOCOLOR
181
182 #define CNVT_TOHW(val,width) ((((val)<<(width))+0x7FFF-(val))>>16)
183
184 /* G100, G200 and Mystique have (almost) same DAC */
185 #undef NEED_DAC1064
186 #if defined(CONFIG_FB_MATROX_MYSTIQUE) || defined(CONFIG_FB_MATROX_G100)
187 #define NEED_DAC1064 1
188 #endif
189
190 typedef struct {
191         u_int8_t*       vaddr;
192 } vaddr_t;
193
194 #ifdef READx_WORKS
195 static inline unsigned int mga_readb(vaddr_t va, unsigned int offs) {
196         return readb(va.vaddr + offs);
197 }
198
199 static inline unsigned int mga_readw(vaddr_t va, unsigned int offs) {
200         return readw(va.vaddr + offs);
201 }
202
203 static inline u_int32_t mga_readl(vaddr_t va, unsigned int offs) {
204         return readl(va.vaddr + offs);
205 }
206
207 static inline void mga_writeb(vaddr_t va, unsigned int offs, u_int8_t value) {
208         writeb(value, va.vaddr + offs);
209 }
210
211 static inline void mga_writew(vaddr_t va, unsigned int offs, u_int16_t value) {
212         writew(value, va.vaddr + offs);
213 }
214
215 static inline void mga_writel(vaddr_t va, unsigned int offs, u_int32_t value) {
216         writel(value, va.vaddr + offs);
217 }
218 #else
219 static inline unsigned int mga_readb(vaddr_t va, unsigned int offs) {
220         return *(volatile u_int8_t*)(va.vaddr + offs);
221 }
222
223 static inline unsigned int mga_readw(vaddr_t va, unsigned int offs) {
224         return *(volatile u_int16_t*)(va.vaddr + offs);
225 }
226
227 static inline u_int32_t mga_readl(vaddr_t va, unsigned int offs) {
228         return *(volatile u_int32_t*)(va.vaddr + offs);
229 }
230
231 static inline void mga_writeb(vaddr_t va, unsigned int offs, u_int8_t value) {
232         *(volatile u_int8_t*)(va.vaddr + offs) = value;
233 }
234
235 static inline void mga_writew(vaddr_t va, unsigned int offs, u_int16_t value) {
236         *(volatile u_int16_t*)(va.vaddr + offs) = value;
237 }
238
239 static inline void mga_writel(vaddr_t va, unsigned int offs, u_int32_t value) {
240         *(volatile u_int32_t*)(va.vaddr + offs) = value;
241 }
242 #endif
243
244 static inline void mga_memcpy_toio(vaddr_t va, unsigned int offs, const void* src, int len) {
245 #ifdef MEMCPYTOIO_WORKS
246         memcpy_toio(va.vaddr + offs, src, len);
247 #elif defined(MEMCPYTOIO_WRITEL)
248 #define srcd ((const u_int32_t*)src)
249         if (offs & 3) {
250                 while (len >= 4) {
251                         mga_writel(va, offs, get_unaligned(srcd++));
252                         offs += 4;
253                         len -= 4;
254                 }
255         } else {
256                 while (len >= 4) {
257                         mga_writel(va, offs, *srcd++);
258                         offs += 4;
259                         len -= 4;
260                 }
261         }
262 #undef srcd
263         if (len) {
264                 u_int32_t tmp;
265
266                 memcpy(&tmp, src, len);
267                 mga_writel(va, offs, tmp);
268         }
269 #elif defined(MEMCPYTOIO_MEMCPY)
270         memcpy(va.vaddr + offs, src, len);
271 #else
272 #error "Sorry, do not know how to write block of data to device"
273 #endif
274 }
275
276 static inline void vaddr_add(vaddr_t* va, unsigned long offs) {
277         va->vaddr += offs;
278 }
279
280 static inline void* vaddr_va(vaddr_t va) {
281         return va.vaddr;
282 }
283
284 #define MGA_IOREMAP_NORMAL      0
285 #define MGA_IOREMAP_NOCACHE     1
286
287 #define MGA_IOREMAP_FB          MGA_IOREMAP_NOCACHE
288 #define MGA_IOREMAP_MMIO        MGA_IOREMAP_NOCACHE
289 static inline int mga_ioremap(unsigned long phys, unsigned long size, int flags, vaddr_t* virt) {
290 #ifdef MAP_IOREMAP
291         if (flags & MGA_IOREMAP_NOCACHE)
292                 virt->vaddr = ioremap_nocache(phys, size);
293         else
294                 virt->vaddr = ioremap(phys, size);
295 #else
296 #ifdef MAP_BUSTOVIRT
297         virt->vaddr = bus_to_virt(phys);
298 #else
299 #error "Your architecture does not have neither ioremap nor bus_to_virt... Giving up"
300 #endif
301 #endif
302         return (virt->vaddr == 0); /* 0, !0... 0, error_code in future */
303 }
304
305 static inline void mga_iounmap(vaddr_t va) {
306 #ifdef MAP_IOREMAP
307         iounmap(va.vaddr);
308 #endif
309 }
310
311 struct my_timming {
312         unsigned int pixclock;
313         unsigned int HDisplay;
314         unsigned int HSyncStart;
315         unsigned int HSyncEnd;
316         unsigned int HTotal;
317         unsigned int VDisplay;
318         unsigned int VSyncStart;
319         unsigned int VSyncEnd;
320         unsigned int VTotal;
321         unsigned int sync;
322         int          dblscan;
323         int          interlaced;
324         unsigned int delay;     /* CRTC delay */
325 };
326
327 struct matrox_pll_features {
328         unsigned int    vco_freq_min;
329         unsigned int    ref_freq;
330         unsigned int    feed_div_min;
331         unsigned int    feed_div_max;
332         unsigned int    in_div_min;
333         unsigned int    in_div_max;
334         unsigned int    post_shift_max;
335 };
336
337 struct matroxfb_par
338 {
339         unsigned int    final_bppShift;
340         unsigned int    cmap_len;
341         struct {
342                 unsigned int bytes;
343                 unsigned int pixels;
344                 unsigned int chunks;
345                       } ydstorg;
346         void            (*putc)(u_int32_t, u_int32_t, struct display*, int, int, int);
347         void            (*putcs)(u_int32_t, u_int32_t, struct display*, const unsigned short*, int, int, int);
348 };
349
350 struct matrox_fb_info;
351
352 struct matrox_DAC1064_features {
353         u_int8_t        xvrefctrl;
354         u_int8_t        xmiscctrl;
355         unsigned int    cursorimage;
356 };
357
358 struct matrox_accel_features {
359         int             has_cacheflush;
360 };
361
362 /* current hardware status */
363 struct mavenregs {
364         u_int8_t regs[256];
365         int      mode;
366         int      vlines;
367         int      xtal;
368         int      fv;
369
370         u_int16_t htotal;
371         u_int16_t hcorr;
372 };
373
374 struct matrox_hw_state {
375         u_int32_t       MXoptionReg;
376         unsigned char   DACclk[6];
377         unsigned char   DACreg[80];
378         unsigned char   MiscOutReg;
379         unsigned char   DACpal[768];
380         unsigned char   CRTC[25];
381         unsigned char   CRTCEXT[9];
382         unsigned char   SEQ[5];
383         /* unused for MGA mode, but who knows... */
384         unsigned char   GCTL[9];
385         /* unused for MGA mode, but who knows... */
386         unsigned char   ATTR[21];
387
388         /* TVOut only */
389         struct mavenregs        maven;
390
391         /* CRTC2 only */
392         /* u_int32_t    TBD */
393 };
394
395 struct matrox_accel_data {
396 #ifdef CONFIG_FB_MATROX_MILLENIUM
397         unsigned char   ramdac_rev;
398 #endif
399         u_int32_t       m_dwg_rect;
400         u_int32_t       m_opmode;
401 };
402
403 struct matrox_altout {
404         int             (*compute)(void* altout_dev, struct my_timming* input, struct matrox_hw_state* state);
405         int             (*program)(void* altout_dev, const struct matrox_hw_state* state);
406         int             (*start)(void* altout_dev);
407         void            (*incuse)(void* altout_dev);
408         void            (*decuse)(void* altout_dev);
409         int             (*setmode)(void* altout_dev, u_int32_t mode);
410         int             (*getmode)(void* altout_dev, u_int32_t* mode);
411 };
412
413 struct matrox_switch;
414 struct matroxfb_driver;
415
416 struct matrox_fb_info {
417         /* fb_info must be first */
418         struct fb_info          fbcon;
419
420         struct list_head        next_fb;
421
422         int                     dead;
423         unsigned int            usecount;
424
425         struct matroxfb_par     curr;
426         struct matrox_hw_state  hw1;
427         struct matrox_hw_state  hw2;
428         struct matrox_hw_state* newhw;
429         struct matrox_hw_state* currenthw;
430
431         struct matrox_accel_data accel;
432
433         struct pci_dev*         pcidev;
434
435         struct {
436                 u_int32_t       all;
437                 u_int32_t       ph;
438                 u_int32_t       sh;
439                               } output;
440         struct matrox_altout*   primout;
441         struct {
442         struct fb_info*         info;
443         struct rw_semaphore     lock;
444                               } crtc2;
445         struct {
446         struct matrox_altout*   output;
447         void*                   device;
448         struct rw_semaphore     lock;
449                               } altout;
450
451 #define MATROXFB_MAX_FB_DRIVERS         5
452         struct matroxfb_driver* (drivers[MATROXFB_MAX_FB_DRIVERS]);
453         void*                   (drivers_data[MATROXFB_MAX_FB_DRIVERS]);
454         unsigned int            drivers_count;
455
456         struct {
457         unsigned long   base;   /* physical */
458         vaddr_t         vbase;  /* CPU view */
459         unsigned int    len;
460         unsigned int    len_usable;
461         unsigned int    len_maximum;
462                       } video;
463
464         struct {
465         unsigned long   base;   /* physical */
466         vaddr_t         vbase;  /* CPU view */
467         unsigned int    len;
468                       } mmio;
469
470         unsigned int    max_pixel_clock;
471
472         struct matrox_switch*   hw_switch;
473         int             currcon;
474         struct display* currcon_display;
475
476         struct {
477                 struct matrox_pll_features pll;
478                 struct matrox_DAC1064_features DAC1064;
479                 struct matrox_accel_features accel;
480                               } features;
481         struct {
482                 spinlock_t      DAC;
483                 spinlock_t      accel;
484                               } lock;
485
486         int                     interleave;
487         int                     millenium;
488         int                     milleniumII;
489         struct {
490                 int             cfb4;
491                 const int*      vxres;
492                 int             cross4MB;
493                 int             text;
494                 int             plnwt;
495                 int             srcorg;
496                               } capable;
497         struct {
498                 unsigned int    size;
499                 unsigned int    mgabase;
500                 vaddr_t         vbase;
501                               } fastfont;
502 #ifdef CONFIG_MTRR
503         struct {
504                 int             vram;
505                 int             vram_valid;
506                               } mtrr;
507 #endif
508         struct {
509                 int             precise_width;
510                 int             mga_24bpp_fix;
511                 int             novga;
512                 int             nobios;
513                 int             nopciretry;
514                 int             noinit;
515                 int             inverse;
516                 int             hwcursor;
517                 int             blink;
518                 int             sgram;
519 #ifdef CONFIG_FB_MATROX_32MB
520                 int             support32MB;
521 #endif
522
523                 int             accelerator;
524                 int             text_type_aux;
525                 int             video64bits;
526                 int             crtc2;
527                 int             maven_capable;
528                 unsigned int    vgastep;
529                 unsigned int    textmode;
530                 unsigned int    textstep;
531                 unsigned int    textvram;       /* character cells */
532                 unsigned int    ydstorg;        /* offset in bytes from video start to usable memory */
533                                                 /* 0 except for 6MB Millenium */
534                 int             memtype;
535                 int             g450dac;
536                               } devflags;
537         struct display_switch   dispsw;
538         struct {
539                 int             x;
540                 int             y;
541                 unsigned int    w;
542                 unsigned int    u;
543                 unsigned int    d;
544                 unsigned int    type;
545                 int             state;
546                 int             redraw;
547                 struct timer_list timer;
548                               } cursor;
549         struct { unsigned red, green, blue, transp; } palette[256];
550 #if defined(CONFIG_FB_COMPAT_XPMAC)
551         char    matrox_name[32];
552 #endif
553 /* These ifdefs must be last! They differ for module & non-module compiles */
554 #if defined(FBCON_HAS_CFB16) || defined(FBCON_HAS_CFB24) || defined(FBCON_HAS_CFB32)
555         union {
556 #ifdef FBCON_HAS_CFB16
557                 u_int16_t       cfb16[16];
558 #endif
559 #ifdef FBCON_HAS_CFB24
560                 u_int32_t       cfb24[16];
561 #endif
562 #ifdef FBCON_HAS_CFB32
563                 u_int32_t       cfb32[16];
564 #endif
565         } cmap;
566 #endif
567 };
568
569 #ifdef CONFIG_FB_MATROX_MULTIHEAD
570 #define ACCESS_FBINFO2(info, x) (info->x)
571 #define ACCESS_FBINFO(x) ACCESS_FBINFO2(minfo,x)
572
573 #define MINFO minfo
574
575 #define WPMINFO2 struct matrox_fb_info* minfo
576 #define WPMINFO  WPMINFO2 ,
577 #define CPMINFO2 const struct matrox_fb_info* minfo
578 #define CPMINFO  CPMINFO2 ,
579 #define PMINFO2  minfo
580 #define PMINFO   PMINFO2 ,
581
582 static inline struct matrox_fb_info* mxinfo(const struct display* p) {
583         return (struct matrox_fb_info*)p->fb_info;
584 }
585
586 #define PMXINFO(p)         mxinfo(p),
587 #define MINFO_FROM(x)      struct matrox_fb_info* minfo = x
588 #define MINFO_FROM_DISP(x) MINFO_FROM(mxinfo(x))
589
590 #else
591
592 extern struct matrox_fb_info matroxfb_global_mxinfo;
593
594 #define ACCESS_FBINFO(x) (matroxfb_global_mxinfo.x)
595 #define ACCESS_FBINFO2(info, x) (matroxfb_global_mxinfo.x)
596
597 #define MINFO (&matroxfb_global_mxinfo)
598
599 #define WPMINFO2 void
600 #define WPMINFO
601 #define CPMINFO2 void
602 #define CPMINFO
603 #define PMINFO2
604 #define PMINFO
605
606 #if 0
607 static inline struct matrox_fb_info* mxinfo(const struct display* p) {
608         return &matroxfb_global_mxinfo;
609 }
610 #endif
611
612 #define PMXINFO(p)
613 #define MINFO_FROM(x)
614 #define MINFO_FROM_DISP(x)
615
616 #endif
617
618 struct matrox_switch {
619         int     (*preinit)(WPMINFO struct matrox_hw_state*);
620         void    (*reset)(WPMINFO struct matrox_hw_state*);
621         int     (*init)(CPMINFO struct matrox_hw_state*, struct my_timming*, struct display*);
622         void    (*restore)(WPMINFO struct matrox_hw_state*, struct matrox_hw_state*, struct display*);
623         int     (*selhwcursor)(WPMINFO struct display*);
624 };
625
626 struct matroxfb_driver {
627         struct list_head        node;
628         char*                   name;
629         void*                   (*probe)(struct matrox_fb_info* info);
630         void                    (*remove)(struct matrox_fb_info* info, void* data);
631 };
632
633 int matroxfb_register_driver(struct matroxfb_driver* drv);
634 void matroxfb_unregister_driver(struct matroxfb_driver* drv);
635
636 #define PCI_OPTION_REG  0x40
637 #define PCI_MGA_INDEX   0x44
638 #define PCI_MGA_DATA    0x48
639
640 #define M_DWGCTL        0x1C00
641 #define M_MACCESS       0x1C04
642 #define M_CTLWTST       0x1C08
643
644 #define M_PLNWT         0x1C1C
645
646 #define M_BCOL          0x1C20
647 #define M_FCOL          0x1C24
648
649 #define M_SGN           0x1C58
650 #define M_LEN           0x1C5C
651 #define M_AR0           0x1C60
652 #define M_AR1           0x1C64
653 #define M_AR2           0x1C68
654 #define M_AR3           0x1C6C
655 #define M_AR4           0x1C70
656 #define M_AR5           0x1C74
657 #define M_AR6           0x1C78
658
659 #define M_CXBNDRY       0x1C80
660 #define M_FXBNDRY       0x1C84
661 #define M_YDSTLEN       0x1C88
662 #define M_PITCH         0x1C8C
663 #define M_YDST          0x1C90
664 #define M_YDSTORG       0x1C94
665 #define M_YTOP          0x1C98
666 #define M_YBOT          0x1C9C
667
668 /* mystique only */
669 #define M_CACHEFLUSH    0x1FFF
670
671 #define M_EXEC          0x0100
672
673 #define M_DWG_TRAP      0x04
674 #define M_DWG_BITBLT    0x08
675 #define M_DWG_ILOAD     0x09
676
677 #define M_DWG_LINEAR    0x0080
678 #define M_DWG_SOLID     0x0800
679 #define M_DWG_ARZERO    0x1000
680 #define M_DWG_SGNZERO   0x2000
681 #define M_DWG_SHIFTZERO 0x4000
682
683 #define M_DWG_REPLACE   0x000C0000
684 #define M_DWG_REPLACE2  (M_DWG_REPLACE | 0x40)
685 #define M_DWG_XOR       0x00060010
686
687 #define M_DWG_BFCOL     0x04000000
688 #define M_DWG_BMONOWF   0x08000000
689
690 #define M_DWG_TRANSC    0x40000000
691
692 #define M_FIFOSTATUS    0x1E10
693 #define M_STATUS        0x1E14
694
695 #define M_IEN           0x1E1C
696
697 #define M_VCOUNT        0x1E20
698
699 #define M_RESET         0x1E40
700 #define M_MEMRDBK       0x1E44
701
702 #define M_AGP2PLL       0x1E4C
703
704 #define M_OPMODE        0x1E54
705 #define     M_OPMODE_DMA_GEN_WRITE      0x00
706 #define     M_OPMODE_DMA_BLIT           0x04
707 #define     M_OPMODE_DMA_VECTOR_WRITE   0x08
708 #define     M_OPMODE_DMA_LE             0x0000          /* little endian - no transformation */
709 #define     M_OPMODE_DMA_BE_8BPP        0x0000
710 #define     M_OPMODE_DMA_BE_16BPP       0x0100
711 #define     M_OPMODE_DMA_BE_32BPP       0x0200
712 #define     M_OPMODE_DIR_LE             0x000000        /* little endian - no transformation */
713 #define     M_OPMODE_DIR_BE_8BPP        0x000000
714 #define     M_OPMODE_DIR_BE_16BPP       0x010000
715 #define     M_OPMODE_DIR_BE_32BPP       0x020000
716
717 #define M_ATTR_INDEX    0x1FC0
718 #define M_ATTR_DATA     0x1FC1
719
720 #define M_MISC_REG      0x1FC2
721 #define M_3C2_RD        0x1FC2
722
723 #define M_SEQ_INDEX     0x1FC4
724 #define M_SEQ_DATA      0x1FC5
725
726 #define M_MISC_REG_READ 0x1FCC
727
728 #define M_GRAPHICS_INDEX 0x1FCE
729 #define M_GRAPHICS_DATA 0x1FCF
730
731 #define M_CRTC_INDEX    0x1FD4
732
733 #define M_ATTR_RESET    0x1FDA
734 #define M_3DA_WR        0x1FDA
735 #define M_INSTS1        0x1FDA
736
737 #define M_EXTVGA_INDEX  0x1FDE
738 #define M_EXTVGA_DATA   0x1FDF
739
740 /* G200 only */
741 #define M_SRCORG        0x2CB4
742 #define M_DSTORG        0x2CB8
743
744 #define M_RAMDAC_BASE   0x3C00
745
746 /* fortunately, same on TVP3026 and MGA1064 */
747 #define M_DAC_REG       (M_RAMDAC_BASE+0)
748 #define M_DAC_VAL       (M_RAMDAC_BASE+1)
749 #define M_PALETTE_MASK  (M_RAMDAC_BASE+2)
750
751 #define M_X_INDEX       0x00
752 #define M_X_DATAREG     0x0A
753
754 #define DAC_XGENIOCTRL          0x2A
755 #define DAC_XGENIODATA          0x2B
756
757 #ifdef __LITTLE_ENDIAN
758 #define MX_OPTION_BSWAP         0x00000000
759
760 #define M_OPMODE_4BPP   (M_OPMODE_DMA_LE | M_OPMODE_DIR_LE | M_OPMODE_DMA_BLIT)
761 #define M_OPMODE_8BPP   (M_OPMODE_DMA_LE | M_OPMODE_DIR_LE | M_OPMODE_DMA_BLIT)
762 #define M_OPMODE_16BPP  (M_OPMODE_DMA_LE | M_OPMODE_DIR_LE | M_OPMODE_DMA_BLIT)
763 #define M_OPMODE_24BPP  (M_OPMODE_DMA_LE | M_OPMODE_DIR_LE | M_OPMODE_DMA_BLIT)
764 #define M_OPMODE_32BPP  (M_OPMODE_DMA_LE | M_OPMODE_DIR_LE | M_OPMODE_DMA_BLIT)
765 #else
766 #ifdef __BIG_ENDIAN
767 #define MX_OPTION_BSWAP         0x80000000
768
769 #define M_OPMODE_4BPP   (M_OPMODE_DMA_LE | M_OPMODE_DIR_LE | M_OPMODE_DMA_BLIT) /* TODO */
770 #define M_OPMODE_8BPP   (M_OPMODE_DMA_BE_8BPP  | M_OPMODE_DIR_BE_8BPP  | M_OPMODE_DMA_BLIT)
771 #define M_OPMODE_16BPP  (M_OPMODE_DMA_BE_16BPP | M_OPMODE_DIR_BE_16BPP | M_OPMODE_DMA_BLIT)
772 #define M_OPMODE_24BPP  (M_OPMODE_DMA_BE_8BPP | M_OPMODE_DIR_BE_8BPP | M_OPMODE_DMA_BLIT)       /* TODO, ?32 */
773 #define M_OPMODE_32BPP  (M_OPMODE_DMA_BE_32BPP | M_OPMODE_DIR_BE_32BPP | M_OPMODE_DMA_BLIT)
774 #else
775 #error "Byte ordering have to be defined. Cannot continue."
776 #endif
777 #endif
778
779 #define mga_inb(addr)   mga_readb(ACCESS_FBINFO(mmio.vbase), (addr))
780 #define mga_inl(addr)   mga_readl(ACCESS_FBINFO(mmio.vbase), (addr))
781 #define mga_outb(addr,val) mga_writeb(ACCESS_FBINFO(mmio.vbase), (addr), (val))
782 #define mga_outw(addr,val) mga_writew(ACCESS_FBINFO(mmio.vbase), (addr), (val))
783 #define mga_outl(addr,val) mga_writel(ACCESS_FBINFO(mmio.vbase), (addr), (val))
784 #define mga_readr(port,idx) (mga_outb((port),(idx)), mga_inb((port)+1))
785 #ifdef __LITTLE_ENDIAN
786 #define mga_setr(addr,port,val) mga_outw(addr, ((val)<<8) | (port))
787 #else
788 #define mga_setr(addr,port,val) do { mga_outb(addr, port); mga_outb((addr)+1, val); } while (0)
789 #endif
790
791 #define mga_fifo(n)     do {} while ((mga_inl(M_FIFOSTATUS) & 0xFF) < (n))
792
793 #define WaitTillIdle()  do {} while (mga_inl(M_STATUS) & 0x10000)
794
795 /* code speedup */
796 #ifdef CONFIG_FB_MATROX_MILLENIUM
797 #define isInterleave(x)  (x->interleave)
798 #define isMillenium(x)   (x->millenium)
799 #define isMilleniumII(x) (x->milleniumII)
800 #else
801 #define isInterleave(x)  (0)
802 #define isMillenium(x)   (0)
803 #define isMilleniumII(x) (0)
804 #endif
805
806 #define matroxfb_DAC_lock()                   spin_lock(&ACCESS_FBINFO(lock.DAC))
807 #define matroxfb_DAC_unlock()                 spin_unlock(&ACCESS_FBINFO(lock.DAC))
808 #define matroxfb_DAC_lock_irqsave(flags)      spin_lock_irqsave(&ACCESS_FBINFO(lock.DAC),flags)
809 #define matroxfb_DAC_unlock_irqrestore(flags) spin_unlock_irqrestore(&ACCESS_FBINFO(lock.DAC),flags)
810 extern void matroxfb_DAC_out(CPMINFO int reg, int val);
811 extern int matroxfb_DAC_in(CPMINFO int reg);
812 extern struct list_head matroxfb_list;
813 extern void matroxfb_var2my(struct fb_var_screeninfo* fvsi, struct my_timming* mt);
814
815 #ifdef MATROXFB_USE_SPINLOCKS
816 #define CRITBEGIN  spin_lock_irqsave(&ACCESS_FBINFO(lock.accel), critflags);
817 #define CRITEND    spin_unlock_irqrestore(&ACCESS_FBINFO(lock.accel), critflags);
818 #define CRITFLAGS  unsigned long critflags;
819 #else
820 #define CRITBEGIN
821 #define CRITEND
822 #define CRITFLAGS
823 #endif
824
825 #endif  /* __MATROXFB_H__ */