randr12: Lots of misc fixes.
[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 #ifdef ENABLE_RANDR12
18 #include "xf86Crtc.h"
19 #endif
20 #else
21 #error "This driver requires a DRI-enabled X server"
22 #endif
23
24 #include "nv50_type.h"
25 #include "nv_pcicompat.h"
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
81 #define NV_I2C_BUSES 3
82 #define NV40_NUM_DCB_ENTRIES 10
83
84 typedef enum
85 {
86     OUTPUT_NONE,
87     OUTPUT_ANALOG,
88     OUTPUT_DIGITAL,
89     OUTPUT_PANEL,
90     OUTPUT_TV,
91 } NVOutputType;
92
93 typedef struct {
94     int bitsPerPixel;
95     int depth;
96     int displayWidth;
97     rgb weight;
98     DisplayModePtr mode;
99 } NVFBLayout;
100
101 typedef struct _nv_crtc_reg 
102 {
103     unsigned char MiscOutReg;     /* */
104     CARD8 CRTC[90];
105     CARD8 Sequencer[5];
106     CARD8 Graphics[9];
107     CARD8 Attribute[21];
108     unsigned char DAC[768];       /* Internal Colorlookuptable */
109     CARD32 cursorConfig;
110     CARD32 crtcOwner;
111     CARD32 unk830;
112     CARD32 unk834;
113         CARD32 unk81c;
114     CARD32 head;
115 } NVCrtcRegRec, *NVCrtcRegPtr;
116
117 typedef struct _nv_output_reg
118 {
119         CARD32 fp_control;
120         CARD32 crtcSync;
121         CARD32 dither;
122         CARD32 general;
123         CARD32 bpp;
124         CARD32 nv10_cursync;
125         CARD32 output;
126         CARD32 debug_0;
127         CARD32 debug_1;
128         CARD32 debug_2;
129         CARD32 sel_clk;
130         CARD32 fp_horiz_regs[7];
131         CARD32 fp_vert_regs[7];
132         CARD32 fp_hvalid_start;
133         CARD32 fp_hvalid_end;
134         CARD32 fp_vvalid_start;
135         CARD32 fp_vvalid_end;
136         CARD8 TMDS[128];
137 } NVOutputRegRec, *NVOutputRegPtr;
138
139 typedef struct _riva_hw_state
140 {
141     CARD32 bpp;
142     CARD32 width;
143     CARD32 height;
144     CARD32 interlace;
145     CARD32 repaint0;
146     CARD32 repaint1;
147     CARD32 screen;
148     CARD32 scale;
149     CARD32 dither;
150     CARD32 extra;
151     CARD32 fifo;
152     CARD32 pixel;
153     CARD32 horiz;
154     CARD32 arbitration0;
155     CARD32 arbitration1;
156     CARD32 pll;
157     CARD32 pllB;
158     CARD32 vpll;
159     CARD32 vpll2;
160     CARD32 vpllB;
161     CARD32 vpll2B;
162     CARD32 pllsel;
163     CARD32 general;
164     CARD32 crtcOwner;
165     CARD32 head;
166     CARD32 head2;
167     CARD32 config;
168     CARD32 cursorConfig;
169     CARD32 cursor0;
170     CARD32 cursor1;
171     CARD32 cursor2;
172     CARD32 timingH;
173     CARD32 timingV;
174     CARD32 displayV;
175     CARD32 crtcSync;
176
177     NVCrtcRegRec crtc_reg[2];
178     NVOutputRegRec dac_reg[2];
179 } RIVA_HW_STATE, *NVRegPtr;
180
181 typedef struct _nv50_crtc_reg
182 {
183         
184 } NV50CrtcRegRec, *NV50CrtcRegPtr;
185
186 typedef struct _nv50_hw_state
187 {
188         NV50CrtcRegRec crtc_reg[2];
189 } NV50_HW_STATE, *NV50RegPtr;
190
191 typedef struct {
192         int type;
193         uint64_t size;
194         uint64_t offset;
195         void *map;
196 } NVAllocRec;
197
198 typedef struct _NVOutputPrivateRec {
199         int ramdac;
200         int prefered_ramdac;
201         Bool ramdac_assigned;
202         I2CBusPtr                   pDDCBus;
203         NVOutputType type;
204         CARD32 fpSyncs;
205         CARD32 fpWidth;
206         CARD32 fpHeight;
207         Bool fpdither;
208 } NVOutputPrivateRec, *NVOutputPrivatePtr;
209
210 typedef struct _MiscStartupInfo {
211         CARD8 crtc_0_reg_52;
212 } MiscStartupInfo;
213
214 typedef enum {
215         OUTPUT_0_SLAVED = (1 << 0),
216         OUTPUT_1_SLAVED = (1 << 1),
217         OUTPUT_0_LVDS = (1 << 2),
218         OUTPUT_1_LVDS = (1 << 3),
219         OUTPUT_0_CROSSWIRED_TMDS = (1 << 4),
220         OUTPUT_1_CROSSWIRED_TMDS = (1 << 5),
221 } OutputInfo;
222
223 #define NVOutputPrivate(o) ((NVOutputPrivatePtr (o)->driver_private)
224
225 typedef struct _NVRec *NVPtr;
226 typedef struct _NVRec {
227     RIVA_HW_STATE       SavedReg;
228     RIVA_HW_STATE       ModeReg;
229     RIVA_HW_STATE       *CurrentState;
230         NV50_HW_STATE   NV50SavedReg;
231         NV50_HW_STATE   NV50ModeReg;
232     CARD32              Architecture;
233     EntityInfoPtr       pEnt;
234 #ifndef XSERVER_LIBPCIACCESS
235         pciVideoPtr     PciInfo;
236         PCITAG          PciTag;
237 #else
238         struct pci_device *PciInfo;
239 #endif /* XSERVER_LIBPCIACCESS */
240     int                 Chipset;
241     int                 NVArch;
242     Bool                Primary;
243     CARD32              IOAddress;
244     Bool cursorOn;
245
246     /* VRAM physical address */
247     unsigned long       VRAMPhysical;
248     /* Size of VRAM BAR */
249     unsigned long       VRAMPhysicalSize;
250     /* Accesible VRAM size (by the GPU) */
251     unsigned long       VRAMSize;
252     /* AGP physical address */
253     unsigned long       AGPPhysical;
254     /* Accessible AGP size */
255     unsigned long       AGPSize;
256     /* PCI buffer virtual address */
257     unsigned long       SGPhysical;
258
259     uint32_t *          VBIOS;
260     NVAllocRec *        FB;
261     NVAllocRec *        Cursor;
262     NVAllocRec *        CLUT;   /* NV50 only */
263     NVAllocRec *        ScratchBuffer;
264     NVAllocRec *        GARTScratch;
265     Bool                NoAccel;
266     Bool                HWCursor;
267     Bool                FpScale;
268     Bool                ShadowFB;
269     unsigned char *     ShadowPtr;
270     int                 ShadowPitch;
271     CARD32              MinVClockFreqKHz;
272     CARD32              MaxVClockFreqKHz;
273     CARD32              CrystalFreqKHz;
274     CARD32              RamAmountKBytes;
275     int drm_fd;
276
277     volatile CARD32 *REGS;
278     volatile CARD32 *PCRTC0;
279     volatile CARD32 *PCRTC1;
280
281         volatile CARD32 *NV50_PCRTC;
282
283     volatile CARD32 *PRAMDAC0;
284     volatile CARD32 *PRAMDAC1;
285     volatile CARD32 *PFB;
286     volatile CARD32 *PFIFO;
287     volatile CARD32 *PGRAPH;
288     volatile CARD32 *PEXTDEV;
289     volatile CARD32 *PTIMER;
290     volatile CARD32 *PVIDEO;
291     volatile CARD32 *PMC;
292     volatile CARD32 *PRAMIN;
293     volatile CARD32 *FIFO;
294     volatile CARD32 *CURSOR;
295     volatile CARD8 *PCIO0;
296     volatile CARD8 *PCIO1;
297     volatile CARD8 *PVIO0;
298     volatile CARD8 *PVIO1;
299     volatile CARD8 *PDIO0;
300     volatile CARD8 *PDIO1;
301     volatile CARD8 *PROM;
302
303
304     volatile CARD32 *RAMHT;
305     CARD32 pramin_free;
306
307     unsigned int SaveGeneration;
308     uint8_t cur_head;
309     ExaDriverPtr        EXADriverPtr;
310     xf86CursorInfoPtr   CursorInfoRec;
311     void                (*PointerMoved)(int index, int x, int y);
312     ScreenBlockHandlerProcPtr BlockHandler;
313     CloseScreenProcPtr  CloseScreen;
314     int                 Rotate;
315     NVFBLayout          CurrentLayout;
316     /* Cursor */
317     CARD32              curFg, curBg;
318     CARD32              curImage[256];
319     /* I2C / DDC */
320     int ddc2;
321     xf86Int10InfoPtr    pInt10;
322     I2CBusPtr           I2C;
323   void          (*VideoTimerCallback)(ScrnInfoPtr, Time);
324     void                (*DMAKickoffCallback)(NVPtr pNv);
325     XF86VideoAdaptorPtr overlayAdaptor;
326     XF86VideoAdaptorPtr blitAdaptor;
327     int                 videoKey;
328     int                 FlatPanel;
329     Bool                FPDither;
330     int                 Mobile;
331     Bool                Television;
332         int         vtOWNER;
333         Bool            crtc_active[2];
334     OptionInfoPtr       Options;
335     Bool                alphaCursor;
336     unsigned char       DDCBase;
337     Bool                twoHeads;
338     Bool                twoStagePLL;
339     Bool                fpScaler;
340     int                 fpWidth;
341     int                 fpHeight;
342     CARD32              fpSyncs;
343     Bool                usePanelTweak;
344     int                 PanelTweak;
345     Bool                LVDS;
346
347     Bool                LockedUp;
348
349     volatile void *     NotifierBlock;
350     struct drm_nouveau_notifierobj_alloc *Notifier0;
351
352     struct drm_nouveau_channel_alloc fifo;
353     CARD32              dmaPut;
354     CARD32              dmaCurrent;
355     CARD32              dmaFree;
356     CARD32              dmaMax;
357     CARD32              *dmaBase;
358
359     CARD32              currentRop;
360     int                 M2MFDirection;
361
362     Bool                WaitVSyncPossible;
363     Bool                BlendingPossible;
364     Bool                RandRRotation;
365     DRIInfoPtr          pDRIInfo;
366     drmVersionPtr       pLibDRMVersion;
367     drmVersionPtr       pKernelDRMVersion;
368
369     Bool randr12_enable;
370     CreateScreenResourcesProcPtr    CreateScreenResources;
371
372     /* we know about 3 i2c buses */
373     I2CBusPtr           pI2CBus[3];
374     int dcb_entries;
375
376     int analog_count;
377     int digital_count;
378     CARD32 dcb_table[NV40_NUM_DCB_ENTRIES]; /* 10 is a good limit */
379     int crtc_associated[2];
380     int ramdac_count;
381     uint32_t output_info;
382     MiscStartupInfo misc_info;
383
384     struct {
385             ORNum dac;
386             ORNum sor;
387     } i2cMap[4];
388     struct {
389             Bool  present;
390             ORNum or;
391     } lvds;
392 } NVRec;
393
394 typedef struct _NVCrtcPrivateRec {
395         int crtc;
396         int head;
397         Bool paletteEnabled;
398 } NVCrtcPrivateRec, *NVCrtcPrivatePtr;
399
400 typedef struct _NV50CrtcPrivRec {
401         int head;
402         int pclk; /* Target pixel clock in kHz */
403         Bool cursorVisible;
404         Bool skipModeFixup;
405         Bool dither;
406 } NV50CrtcPrivRec, *NV50CrtcPrivPtr;
407
408 #define NVCrtcPrivate(c) ((NVCrtcPrivatePtr)(c)->driver_private)
409
410 #define NVPTR(p) ((NVPtr)((p)->driverPrivate))
411
412 #define nvReadRAMDAC0(pNv, reg) nvReadRAMDAC(pNv, 0, reg)
413 #define nvWriteRAMDAC0(pNv, reg, val) nvWriteRAMDAC(pNv, 0, reg, val)
414
415 #define nvReadCurRAMDAC(pNv, reg) nvReadRAMDAC(pNv, pNv->cur_head, reg)
416 #define nvWriteCurRAMDAC(pNv, reg, val) nvWriteRAMDAC(pNv, pNv->cur_head, reg, val)
417
418 #define nvReadCRTC0(pNv, reg) nvReadCRTC(pNv, 0, reg)
419 #define nvWriteCRTC0(pNv, reg, val) nvWriteCRTC(pNv, 0, reg, val)
420
421 #define nvReadCurCRTC(pNv, reg) nvReadCRTC(pNv, pNv->cur_head, reg)
422 #define nvWriteCurCRTC(pNv, reg, val) nvWriteCRTC(pNv, pNv->cur_head, reg, val)
423
424 #define nvReadFB(pNv, fb_reg) MMIO_IN32(pNv->PFB, fb_reg)
425 #define nvWriteFB(pNv, fb_reg, val) MMIO_OUT32(pNv->PFB, fb_reg, val)
426
427 #define nvReadGRAPH(pNv, reg) MMIO_IN32(pNv->PGRAPH, reg)
428 #define nvWriteGRAPH(pNv, reg, val) MMIO_OUT32(pNv->PGRAPH, reg, val)
429
430 #define nvReadMC(pNv, reg) MMIO_IN32(pNv->PMC, reg)
431 #define nvWriteMC(pNv, reg, val) MMIO_OUT32(pNv->PMC, reg, val)
432
433 #define nvReadEXTDEV(pNv, reg) MMIO_IN32(pNv->PEXTDEV, reg)
434 #define nvWriteEXTDEV(pNv, reg, val) MMIO_OUT32(pNv->PEXTDEV, reg, val)
435
436 #define nvReadTIMER(pNv, reg) MMIO_IN32(pNv->PTIMER, reg)
437 #define nvWriteTIMER(pNv, reg, val) MMIO_OUT32(pNv->PTIMER, reg, val)
438
439 #define nvReadVIDEO(pNv, reg) MMIO_IN32(pNv->PVIDEO, reg)
440 #define nvWriteVIDEO(pNv, reg, val) MMIO_OUT32(pNv->PVIDEO, reg, val)
441
442 #endif /* __NV_STRUCT_H__ */