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