randr12: More fixes for strange output routes.
[nouveau] / src / nv_type.h
1 /* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/nv/nv_type.h,v 1.51 2005/04/16 23:57:26 mvojkovi Exp $ */
2
3 #ifndef __NV_STRUCT_H__
4 #define __NV_STRUCT_H__
5
6 #include "colormapst.h"
7 #include "vgaHW.h"
8 #include "xf86Cursor.h"
9 #include "xf86int10.h"
10 #include "exa.h"
11 #ifdef XF86DRI
12 #define _XF86DRI_SERVER_
13 #include "xf86drm.h"
14 #include "dri.h"
15 #include <stdint.h>
16 #include "nouveau_drm.h"
17 #include "xf86Crtc.h"
18 #else
19 #error "This driver requires a DRI-enabled X server"
20 #endif
21
22 #include "nv50_type.h"
23 #include "nv_pcicompat.h"
24
25 #include "nouveau_local.h" /* needed for NOUVEAU_EXA_PIXMAPS */
26
27 #define NV_ARCH_03  0x03
28 #define NV_ARCH_04  0x04
29 #define NV_ARCH_10  0x10
30 #define NV_ARCH_20  0x20
31 #define NV_ARCH_30  0x30
32 #define NV_ARCH_40  0x40
33 #define NV_ARCH_50  0x50
34
35 #define CHIPSET_NV03     0x0010
36 #define CHIPSET_NV04     0x0020
37 #define CHIPSET_NV10     0x0100
38 #define CHIPSET_NV11     0x0110
39 #define CHIPSET_NV15     0x0150
40 #define CHIPSET_NV17     0x0170
41 #define CHIPSET_NV18     0x0180
42 #define CHIPSET_NFORCE   0x01A0
43 #define CHIPSET_NFORCE2  0x01F0
44 #define CHIPSET_NV20     0x0200
45 #define CHIPSET_NV25     0x0250
46 #define CHIPSET_NV28     0x0280
47 #define CHIPSET_NV30     0x0300
48 #define CHIPSET_NV31     0x0310
49 #define CHIPSET_NV34     0x0320
50 #define CHIPSET_NV35     0x0330
51 #define CHIPSET_NV36     0x0340
52 #define CHIPSET_NV40     0x0040
53 #define CHIPSET_NV41     0x00C0
54 #define CHIPSET_NV43     0x0140
55 #define CHIPSET_NV44     0x0160
56 #define CHIPSET_NV44A    0x0220
57 #define CHIPSET_NV45     0x0210
58 #define CHIPSET_NV50     0x0190
59 #define CHIPSET_NV84     0x0400
60 #define CHIPSET_MISC_BRIDGED  0x00F0
61 #define CHIPSET_G70      0x0090
62 #define CHIPSET_G71      0x0290
63 #define CHIPSET_G72      0x01D0
64 #define CHIPSET_G73      0x0390
65 // integrated GeForces (6100, 6150)
66 #define CHIPSET_C51      0x0240
67 // variant of C51, seems based on a G70 design
68 #define CHIPSET_C512     0x03D0
69 #define CHIPSET_G73_BRIDGED 0x02E0
70
71
72 #define BITMASK(t,b) (((unsigned)(1U << (((t)-(b)+1)))-1)  << (b))
73 #define MASKEXPAND(mask) BITMASK(1?mask,0?mask)
74 #define SetBF(mask,value) ((value) << (0?mask))
75 #define GetBF(var,mask) (((unsigned)((var) & MASKEXPAND(mask))) >> (0?mask) )
76 #define SetBitField(value,from,to) SetBF(to, GetBF(value,from))
77 #define SetBit(n) (1<<(n))
78 #define Set8Bits(value) ((value)&0xff)
79
80 #define MAX_NUM_DCB_ENTRIES 16
81
82 typedef enum /* matches DCB types */
83 {
84     OUTPUT_NONE = 4,
85     OUTPUT_ANALOG = 0,
86     OUTPUT_TMDS = 2,
87     OUTPUT_LVDS = 3,
88     OUTPUT_TV = 1,
89 } NVOutputType;
90
91 typedef struct {
92     int bitsPerPixel;
93     int depth;
94     int displayWidth;
95     rgb weight;
96     DisplayModePtr mode;
97 } NVFBLayout;
98
99 typedef struct _nv_crtc_reg 
100 {
101         unsigned char MiscOutReg;     /* */
102         uint8_t CRTC[0xff];
103         uint8_t CR58[0x10];
104         uint8_t Sequencer[5];
105         uint8_t Graphics[9];
106         uint8_t Attribute[21];
107         unsigned char DAC[768];       /* Internal Colorlookuptable */
108         uint32_t cursorConfig;
109         uint32_t crtcOwner;
110         uint32_t gpio;
111         uint32_t unk830;
112         uint32_t unk834;
113         uint32_t unk850;
114         uint32_t unk81c;
115         uint32_t head;
116         uint32_t config;
117
118         /* These are former output regs, but are believed to be crtc related */
119         uint32_t general;
120         uint32_t debug_0[2];
121         uint32_t debug_1;
122         uint32_t debug_2;
123         uint32_t unk_a20;
124         uint32_t unk_a24;
125         uint32_t unk_a34;
126         uint32_t fp_horiz_regs[7];
127         uint32_t fp_vert_regs[7];
128         uint32_t fp_hvalid_start;
129         uint32_t fp_hvalid_end;
130         uint32_t fp_vvalid_start;
131         uint32_t fp_vvalid_end;
132         uint32_t bpp;
133         uint32_t nv10_cursync;
134         uint32_t fp_control[2];
135         uint32_t crtcSync;
136         uint32_t dither;
137 } NVCrtcRegRec, *NVCrtcRegPtr;
138
139 typedef struct _nv_output_reg
140 {
141         uint32_t test_control;
142         uint32_t unk_670;
143
144         uint32_t output;
145         uint8_t TMDS[0xFF];
146         uint8_t TMDS2[0xFF];
147 } NVOutputRegRec, *NVOutputRegPtr;
148
149 typedef struct _riva_hw_state
150 {
151     CARD32 bpp;
152     CARD32 width;
153     CARD32 height;
154     CARD32 interlace;
155     CARD32 repaint0;
156     CARD32 repaint1;
157     CARD32 screen;
158     CARD32 scale;
159     CARD32 dither;
160     CARD32 extra;
161     CARD32 fifo;
162     CARD32 pixel;
163     CARD32 horiz;
164     CARD32 arbitration0;
165     CARD32 arbitration1;
166     CARD32 pll;
167     CARD32 pllB;
168     CARD32 vpll;
169     CARD32 vpll2;
170     CARD32 vpllB;
171     CARD32 vpll2B;
172     CARD32 pllsel;
173         uint32_t sel_clk;
174         Bool crosswired;
175         Bool vpll_changed[2];
176         Bool db1_ratio[2];
177         /* These vpll values are only for nv4x hardware */
178         uint32_t vpll1_a;
179         uint32_t vpll1_b;
180         uint32_t vpll2_a;
181         uint32_t vpll2_b;
182         uint32_t reg580;
183         uint32_t reg594;
184     CARD32 general;
185     CARD32 crtcOwner;
186     CARD32 head;
187     CARD32 head2;
188     CARD32 config;
189     CARD32 cursorConfig;
190     CARD32 cursor0;
191     CARD32 cursor1;
192     CARD32 cursor2;
193     CARD32 timingH;
194     CARD32 timingV;
195     CARD32 displayV;
196     CARD32 crtcSync;
197
198     NVCrtcRegRec crtc_reg[2];
199     NVOutputRegRec dac_reg[2];
200 } RIVA_HW_STATE, *NVRegPtr;
201
202 typedef struct _nv50_crtc_reg
203 {
204         
205 } NV50CrtcRegRec, *NV50CrtcRegPtr;
206
207 typedef struct _nv50_hw_state
208 {
209         NV50CrtcRegRec crtc_reg[2];
210 } NV50_HW_STATE, *NV50RegPtr;
211
212 typedef enum {
213         OUTPUT_0 = (1 << 0),
214         OUTPUT_1 = (1 << 1)
215 } ValidOutputResource;
216
217 typedef struct _NVOutputPrivateRec {
218         uint8_t preferred_output;
219         uint8_t output_resource;
220         uint8_t bus;
221         uint8_t last_dpms;
222         I2CBusPtr pDDCBus;
223         NVOutputType type;
224         int dcb_entry;
225         uint32_t fpWidth;
226         uint32_t fpHeight;
227         DisplayModePtr native_mode;
228         Bool fpdither;
229         uint8_t scaling_mode;
230 } NVOutputPrivateRec, *NVOutputPrivatePtr;
231
232 typedef struct _MiscStartupInfo {
233         uint8_t crtc_0_reg_52;
234         uint32_t ramdac_0_reg_580;
235         uint32_t ramdac_0_pllsel;
236         uint32_t reg_c040;
237         uint32_t sel_clk;
238         uint32_t output[2];
239 } MiscStartupInfo;
240
241 typedef enum {
242         OUTPUT_0_SLAVED = (1 << 0),
243         OUTPUT_1_SLAVED = (1 << 1),
244         OUTPUT_0_LVDS = (1 << 2),
245         OUTPUT_1_LVDS = (1 << 3),
246         OUTPUT_0_CROSSWIRED_TMDS = (1 << 4),
247         OUTPUT_1_CROSSWIRED_TMDS = (1 << 5)
248 } OutputInfo;
249
250 struct dcb_entry {
251         uint8_t type;
252         uint8_t i2c_index;
253         uint8_t heads;
254         uint8_t bus;
255         uint8_t location;
256         uint8_t or;
257         Bool duallink_possible;
258         union {
259                 struct {
260                         Bool use_straps_for_mode;
261                         Bool use_power_scripts;
262                 } lvdsconf;
263         };
264 };
265
266 enum pll_types {
267         VPLL1,
268         VPLL2
269 };
270
271 struct pll_lims {
272         struct {
273                 /* nv3x needs 32 bit values */
274                 uint32_t minfreq;
275                 uint32_t maxfreq;
276                 uint32_t min_inputfreq;
277                 uint16_t max_inputfreq;
278
279                 uint8_t min_m;
280                 uint8_t max_m;
281                 uint8_t min_n;
282                 uint8_t max_n;
283         } vco1, vco2;
284
285         uint8_t unk1c;
286         uint8_t unk1d;
287         uint8_t unk1e;
288 };
289
290 typedef struct {
291         uint8_t *data;
292         unsigned int length;
293         Bool execute;
294
295         uint8_t major_version, chip_version;
296
297         uint32_t fmaxvco, fminvco;
298
299         uint16_t init_script_tbls_ptr;
300         uint16_t extra_init_script_tbl_ptr;
301         uint16_t macro_index_tbl_ptr;
302         uint16_t macro_tbl_ptr;
303         uint16_t condition_tbl_ptr;
304         uint16_t io_condition_tbl_ptr;
305         uint16_t io_flag_condition_tbl_ptr;
306         uint16_t init_function_tbl_ptr;
307
308         uint16_t pll_limit_tbl_ptr;
309         uint16_t ram_restrict_tbl_ptr;
310
311         struct {
312                 DisplayModePtr native_mode;
313                 uint8_t *edid;
314                 uint16_t lvdsmanufacturerpointer;
315                 uint16_t xlated_entry;
316                 Bool dual_link;
317                 Bool if_is_18bit;
318                 Bool BITbit1;
319         } fp;
320
321         struct {
322                 uint16_t output0_script_ptr;
323                 uint16_t output1_script_ptr;
324         } tmds;
325
326         struct {
327                 uint8_t crt, tv, panel;
328         } legacy_i2c_indices;
329 } bios_t;
330
331 enum LVDS_script {
332         /* Order *does* matter here */
333         LVDS_INIT = 1,
334         LVDS_RESET,
335         LVDS_BACKLIGHT_ON,
336         LVDS_BACKLIGHT_OFF,
337         LVDS_PANEL_ON,
338         LVDS_PANEL_OFF
339 };
340
341 #define NVOutputPrivate(o) ((NVOutputPrivatePtr (o)->driver_private)
342
343 typedef struct _NVRec *NVPtr;
344 typedef struct _NVRec {
345     RIVA_HW_STATE       SavedReg;
346     RIVA_HW_STATE       ModeReg;
347     RIVA_HW_STATE       *CurrentState;
348         NV50_HW_STATE   NV50SavedReg;
349         NV50_HW_STATE   NV50ModeReg;
350     uint32_t              Architecture;
351     EntityInfoPtr       pEnt;
352 #ifndef XSERVER_LIBPCIACCESS
353         pciVideoPtr     PciInfo;
354         PCITAG          PciTag;
355 #else
356         struct pci_device *PciInfo;
357 #endif /* XSERVER_LIBPCIACCESS */
358     int                 Chipset;
359     int                 NVArch;
360     Bool                Primary;
361     CARD32              IOAddress;
362     Bool cursorOn;
363
364     /* VRAM physical address */
365     unsigned long       VRAMPhysical;
366     /* Size of VRAM BAR */
367     unsigned long       VRAMPhysicalSize;
368     /* Accesible VRAM size (by the GPU) */
369     unsigned long       VRAMSize;
370     /* Accessible AGP size */
371     unsigned long       AGPSize;
372
373     /* Various pinned memory regions */
374     struct nouveau_bo * FB;
375     struct nouveau_bo * Cursor;
376     struct nouveau_bo * Cursor2;
377     struct nouveau_bo * CLUT;   /* NV50 only */
378     struct nouveau_bo * GART;
379
380     bios_t              VBIOS;
381     Bool                NoAccel;
382     Bool                HWCursor;
383     Bool                FpScale;
384     Bool                ShadowFB;
385     unsigned char *     ShadowPtr;
386     int                 ShadowPitch;
387     CARD32              MinVClockFreqKHz;
388     CARD32              MaxVClockFreqKHz;
389     CARD32              CrystalFreqKHz;
390     CARD32              RamAmountKBytes;
391
392     volatile CARD32 *REGS;
393     volatile CARD32 *PCRTC0;
394     volatile CARD32 *PCRTC1;
395
396         volatile CARD32 *NV50_PCRTC;
397
398     volatile CARD32 *PRAMDAC0;
399     volatile CARD32 *PRAMDAC1;
400     volatile CARD32 *PFB;
401     volatile CARD32 *PFIFO;
402     volatile CARD32 *PGRAPH;
403     volatile CARD32 *PEXTDEV;
404     volatile CARD32 *PTIMER;
405     volatile CARD32 *PVIDEO;
406     volatile CARD32 *PMC;
407     volatile CARD32 *PRAMIN;
408     volatile CARD32 *CURSOR;
409     volatile CARD8 *PCIO0;
410     volatile CARD8 *PCIO1;
411     volatile CARD8 *PVIO0;
412     volatile CARD8 *PVIO1;
413     volatile CARD8 *PDIO0;
414     volatile CARD8 *PDIO1;
415     volatile CARD8 *PROM;
416
417
418     volatile CARD32 *RAMHT;
419     CARD32 pramin_free;
420
421     unsigned int SaveGeneration;
422     uint8_t cur_head;
423     ExaDriverPtr        EXADriverPtr;
424     xf86CursorInfoPtr   CursorInfoRec;
425     void                (*PointerMoved)(int index, int x, int y);
426     ScreenBlockHandlerProcPtr BlockHandler;
427     CloseScreenProcPtr  CloseScreen;
428     int                 Rotate;
429     NVFBLayout          CurrentLayout;
430     /* Cursor */
431     CARD32              curFg, curBg;
432     CARD32              curImage[256];
433     /* I2C / DDC */
434     int ddc2;
435     xf86Int10InfoPtr    pInt10;
436     I2CBusPtr           I2C;
437   void          (*VideoTimerCallback)(ScrnInfoPtr, Time);
438     XF86VideoAdaptorPtr overlayAdaptor;
439     XF86VideoAdaptorPtr blitAdaptor;
440     XF86VideoAdaptorPtr textureAdaptor;
441     int                 videoKey;
442     int                 FlatPanel;
443     Bool                FPDither;
444     int                 Mobile;
445     Bool                Television;
446         int         vtOWNER;
447         Bool            crtc_active[2];
448     OptionInfoPtr       Options;
449     Bool                alphaCursor;
450     unsigned char       DDCBase;
451     Bool                twoHeads;
452     Bool                twoStagePLL;
453     Bool                fpScaler;
454     int                 fpWidth;
455     int                 fpHeight;
456     CARD32              fpSyncs;
457     Bool                usePanelTweak;
458     int                 PanelTweak;
459     Bool                LVDS;
460
461     Bool                LockedUp;
462
463     CARD32              currentRop;
464
465     Bool                WaitVSyncPossible;
466     Bool                BlendingPossible;
467     Bool                RandRRotation;
468     DRIInfoPtr          pDRIInfo;
469     drmVersionPtr       pLibDRMVersion;
470     drmVersionPtr       pKernelDRMVersion;
471
472     Bool randr12_enable;
473     CreateScreenResourcesProcPtr    CreateScreenResources;
474
475     I2CBusPtr           pI2CBus[MAX_NUM_DCB_ENTRIES];
476
477         int vga_count;
478         int dvi_d_count;
479         int dvi_a_count;
480         int lvds_count;
481
482         /* Is our secondary (analog) output not flexible (ffs(or) != 3)? */
483         Bool restricted_mode;
484         Bool switchable_crtc;
485
486         uint8_t fp_regs_owner[2];
487
488         struct {
489                 int entries;
490                 struct dcb_entry entry[MAX_NUM_DCB_ENTRIES];
491                 unsigned char i2c_read[MAX_NUM_DCB_ENTRIES];
492                 unsigned char i2c_write[MAX_NUM_DCB_ENTRIES];
493         } dcb_table;
494
495         uint32_t output_info;
496         MiscStartupInfo misc_info;
497
498         struct {
499                 ORNum dac;
500                 ORNum sor;
501         } i2cMap[4];
502         struct {
503                 Bool  present;
504                 ORNum or;
505         } lvds;
506
507         /* DRM interface */
508         struct nouveau_device *dev;
509
510         /* GPU context */
511         struct nouveau_channel *chan;
512         struct nouveau_notifier *notify0;
513         struct nouveau_grobj *NvNull;
514         struct nouveau_grobj *NvContextSurfaces;
515         struct nouveau_grobj *NvContextBeta1;
516         struct nouveau_grobj *NvContextBeta4;
517         struct nouveau_grobj *NvImagePattern;
518         struct nouveau_grobj *NvRop;
519         struct nouveau_grobj *NvRectangle;
520         struct nouveau_grobj *NvImageBlit;
521         struct nouveau_grobj *NvScaledImage;
522         struct nouveau_grobj *NvClipRectangle;
523         struct nouveau_grobj *NvMemFormat;
524         struct nouveau_grobj *NvImageFromCpu;
525         struct nouveau_grobj *Nv2D;
526         struct nouveau_grobj *Nv3D;
527
528 } NVRec;
529
530 typedef struct _NVCrtcPrivateRec {
531         int head;
532         uint8_t last_dpms;
533         Bool paletteEnabled;
534 #if NOUVEAU_EXA_PIXMAPS
535         struct nouveau_bo *shadow;
536 #else
537         ExaOffscreenArea *shadow;
538 #endif /* NOUVEAU_EXA_PIXMAPS */
539 } NVCrtcPrivateRec, *NVCrtcPrivatePtr;
540
541 typedef struct _NV50CrtcPrivRec {
542         int head;
543         int pclk; /* Target pixel clock in kHz */
544         Bool cursorVisible;
545         Bool skipModeFixup;
546         Bool dither;
547 } NV50CrtcPrivRec, *NV50CrtcPrivPtr;
548
549 enum scaling_modes {
550         SCALE_PANEL,
551         SCALE_FULLSCREEN,
552         SCALE_ASPECT,
553         SCALE_NOSCALE,
554         SCALE_INVALID
555 };
556
557 #define NVCrtcPrivate(c) ((NVCrtcPrivatePtr)(c)->driver_private)
558
559 #define NVPTR(p) ((NVPtr)((p)->driverPrivate))
560
561 #define nvReadRAMDAC0(pNv, reg) nvReadRAMDAC(pNv, 0, reg)
562 #define nvWriteRAMDAC0(pNv, reg, val) nvWriteRAMDAC(pNv, 0, reg, val)
563
564 #define nvReadCurRAMDAC(pNv, reg) nvReadRAMDAC(pNv, pNv->cur_head, reg)
565 #define nvWriteCurRAMDAC(pNv, reg, val) nvWriteRAMDAC(pNv, pNv->cur_head, reg, val)
566
567 #define nvReadCRTC0(pNv, reg) nvReadCRTC(pNv, 0, reg)
568 #define nvWriteCRTC0(pNv, reg, val) nvWriteCRTC(pNv, 0, reg, val)
569
570 #define nvReadCurCRTC(pNv, reg) nvReadCRTC(pNv, pNv->cur_head, reg)
571 #define nvWriteCurCRTC(pNv, reg, val) nvWriteCRTC(pNv, pNv->cur_head, reg, val)
572
573 #define nvReadFB(pNv, fb_reg) MMIO_IN32(pNv->PFB, fb_reg)
574 #define nvWriteFB(pNv, fb_reg, val) MMIO_OUT32(pNv->PFB, fb_reg, val)
575
576 #define nvReadGRAPH(pNv, reg) MMIO_IN32(pNv->PGRAPH, reg)
577 #define nvWriteGRAPH(pNv, reg, val) MMIO_OUT32(pNv->PGRAPH, reg, val)
578
579 #define nvReadMC(pNv, reg) MMIO_IN32(pNv->PMC, reg)
580 #define nvWriteMC(pNv, reg, val) MMIO_OUT32(pNv->PMC, reg, val)
581
582 #define nvReadEXTDEV(pNv, reg) MMIO_IN32(pNv->PEXTDEV, reg)
583 #define nvWriteEXTDEV(pNv, reg, val) MMIO_OUT32(pNv->PEXTDEV, reg, val)
584
585 #define nvReadTIMER(pNv, reg) MMIO_IN32(pNv->PTIMER, reg)
586 #define nvWriteTIMER(pNv, reg, val) MMIO_OUT32(pNv->PTIMER, reg, val)
587
588 #define nvReadVIDEO(pNv, reg) MMIO_IN32(pNv->PVIDEO, reg)
589 #define nvWriteVIDEO(pNv, reg, val) MMIO_OUT32(pNv->PVIDEO, reg, val)
590
591 typedef struct _NVPortPrivRec {
592         short           brightness;
593         short           contrast;
594         short           saturation;
595         short           hue;
596         RegionRec       clip;
597         CARD32          colorKey;
598         Bool            autopaintColorKey;
599         Bool            doubleBuffer;
600         CARD32          videoStatus;
601         int             currentBuffer;
602         Time            videoTime;
603         int             overlayCRTC;
604         Bool            grabbedByV4L;
605         Bool            iturbt_709;
606         Bool            blitter;
607         Bool            texture;
608         Bool            SyncToVBlank;
609         struct nouveau_bo *video_mem;
610         int             pitch;
611         int             offset;
612         struct nouveau_bo *TT_mem_chunk[2];
613         int             currentHostBuffer;
614         struct nouveau_notifier *DMANotifier[2];
615 } NVPortPrivRec, *NVPortPrivPtr;
616
617 #endif /* __NV_STRUCT_H__ */