Hopefully this will improve flatpanel beheaviour.
[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 "xaa.h"
9 #include "xf86Cursor.h"
10 #include "xf86int10.h"
11 #include "exa.h"
12 #ifdef XF86DRI
13 #define _XF86DRI_SERVER_
14 #include "xf86drm.h"
15 #include "dri.h"
16 #include <stdint.h>
17 #include "nouveau_drm.h"
18 #include "xf86Crtc.h"
19 #else
20 #error "This driver requires a DRI-enabled X server"
21 #endif
22
23 #include "nv50_type.h"
24 #include "nv_pcicompat.h"
25
26 #define NV_ARCH_03  0x03
27 #define NV_ARCH_04  0x04
28 #define NV_ARCH_10  0x10
29 #define NV_ARCH_20  0x20
30 #define NV_ARCH_30  0x30
31 #define NV_ARCH_40  0x40
32 #define NV_ARCH_50  0x50
33
34 #define CHIPSET_NV03     0x0010
35 #define CHIPSET_NV04     0x0020
36 #define CHIPSET_NV10     0x0100
37 #define CHIPSET_NV11     0x0110
38 #define CHIPSET_NV15     0x0150
39 #define CHIPSET_NV17     0x0170
40 #define CHIPSET_NV18     0x0180
41 #define CHIPSET_NFORCE   0x01A0
42 #define CHIPSET_NFORCE2  0x01F0
43 #define CHIPSET_NV20     0x0200
44 #define CHIPSET_NV25     0x0250
45 #define CHIPSET_NV28     0x0280
46 #define CHIPSET_NV30     0x0300
47 #define CHIPSET_NV31     0x0310
48 #define CHIPSET_NV34     0x0320
49 #define CHIPSET_NV35     0x0330
50 #define CHIPSET_NV36     0x0340
51 #define CHIPSET_NV40     0x0040
52 #define CHIPSET_NV41     0x00C0
53 #define CHIPSET_NV43     0x0140
54 #define CHIPSET_NV44     0x0160
55 #define CHIPSET_NV44A    0x0220
56 #define CHIPSET_NV45     0x0210
57 #define CHIPSET_NV50     0x0190
58 #define CHIPSET_NV84     0x0400
59 #define CHIPSET_MISC_BRIDGED  0x00F0
60 #define CHIPSET_G70      0x0090
61 #define CHIPSET_G71      0x0290
62 #define CHIPSET_G72      0x01D0
63 #define CHIPSET_G73      0x0390
64 // integrated GeForces (6100, 6150)
65 #define CHIPSET_C51      0x0240
66 // variant of C51, seems based on a G70 design
67 #define CHIPSET_C512     0x03D0
68 #define CHIPSET_G73_BRIDGED 0x02E0
69
70
71 #define BITMASK(t,b) (((unsigned)(1U << (((t)-(b)+1)))-1)  << (b))
72 #define MASKEXPAND(mask) BITMASK(1?mask,0?mask)
73 #define SetBF(mask,value) ((value) << (0?mask))
74 #define GetBF(var,mask) (((unsigned)((var) & MASKEXPAND(mask))) >> (0?mask) )
75 #define SetBitField(value,from,to) SetBF(to, GetBF(value,from))
76 #define SetBit(n) (1<<(n))
77 #define Set8Bits(value) ((value)&0xff)
78
79
80 #define NV_I2C_BUSES 3
81 #define NV40_NUM_DCB_ENTRIES 10
82
83 typedef enum
84 {
85     OUTPUT_NONE,
86     OUTPUT_ANALOG,
87     OUTPUT_DIGITAL,
88     OUTPUT_PANEL,
89     OUTPUT_TV,
90 } NVOutputType;
91
92 typedef struct {
93     int bitsPerPixel;
94     int depth;
95     int displayWidth;
96     rgb weight;
97     DisplayModePtr mode;
98 } NVFBLayout;
99
100 typedef struct _nv_crtc_reg 
101 {
102     unsigned char MiscOutReg;     /* */
103     CARD8 CRTC[90];
104     CARD8 Sequencer[5];
105     CARD8 Graphics[9];
106     CARD8 Attribute[21];
107     unsigned char DAC[768];       /* Internal Colorlookuptable */
108     CARD32 cursorConfig;
109     CARD32 crtcOwner;
110     CARD32 unk830;
111     CARD32 unk834;
112     CARD32 head;
113 } NVCrtcRegRec, *NVCrtcRegPtr;
114
115 typedef struct _nv_output_reg
116 {
117         CARD32 fp_control;
118         CARD32 crtcSync;
119         CARD32 dither;
120         CARD32 general;
121         CARD32 bpp;
122         CARD32 nv10_cursync;
123         CARD32 output;
124         CARD32 debug_0;
125         CARD32 debug_1;
126         CARD32 debug_2;
127         CARD32 fp_horiz_regs[7];
128         CARD32 fp_vert_regs[7];
129         CARD32 fp_hvalid_start;
130         CARD32 fp_hvalid_end;
131         CARD32 fp_vvalid_start;
132         CARD32 fp_vvalid_end;
133 } NVOutputRegRec, *NVOutputRegPtr;
134
135 typedef struct _riva_hw_state
136 {
137     CARD32 bpp;
138     CARD32 width;
139     CARD32 height;
140     CARD32 interlace;
141     CARD32 repaint0;
142     CARD32 repaint1;
143     CARD32 screen;
144     CARD32 scale;
145     CARD32 dither;
146     CARD32 extra;
147     CARD32 fifo;
148     CARD32 pixel;
149     CARD32 horiz;
150     CARD32 arbitration0;
151     CARD32 arbitration1;
152     CARD32 pll;
153     CARD32 pllB;
154     CARD32 vpll;
155     CARD32 vpll2;
156     CARD32 vpllB;
157     CARD32 vpll2B;
158     CARD32 pllsel;
159     CARD32 general;
160     CARD32 crtcOwner;
161     CARD32 head;
162     CARD32 head2;
163     CARD32 config;
164     CARD32 cursorConfig;
165     CARD32 cursor0;
166     CARD32 cursor1;
167     CARD32 cursor2;
168     CARD32 timingH;
169     CARD32 timingV;
170     CARD32 displayV;
171     CARD32 crtcSync;
172
173     NVCrtcRegRec crtc_reg[2];
174     NVOutputRegRec dac_reg[2];
175 } RIVA_HW_STATE, *NVRegPtr;
176
177 typedef struct {
178         int type;
179         uint64_t size;
180         uint64_t offset;
181         void *map;
182 } NVAllocRec;
183
184 typedef struct _NVOutputPrivateRec {
185         int ramdac;
186         I2CBusPtr                   pDDCBus;
187         NVOutputType type;
188         CARD32 fpSyncs;
189         CARD32 fpWidth;
190         CARD32 fpHeight;
191         Bool fpdither;
192 } NVOutputPrivateRec, *NVOutputPrivatePtr;
193
194 #define NVOutputPrivate(o) ((NVOutputPrivatePtr (o)->driver_private)
195
196 typedef struct _NVRec *NVPtr;
197 typedef struct _NVRec {
198     RIVA_HW_STATE       SavedReg;
199     RIVA_HW_STATE       ModeReg;
200     RIVA_HW_STATE       *CurrentState;
201     CARD32              Architecture;
202     EntityInfoPtr       pEnt;
203 #ifndef XSERVER_LIBPCIACCESS
204         pciVideoPtr     PciInfo;
205         PCITAG          PciTag;
206 #else
207         struct pci_device *PciInfo;
208 #endif /* XSERVER_LIBPCIACCESS */
209     int                 Chipset;
210     int                 NVArch;
211     Bool                Primary;
212     CARD32              IOAddress;
213     Bool cursorOn;
214
215     /* VRAM physical address */
216     unsigned long       VRAMPhysical;
217     /* Size of VRAM BAR */
218     unsigned long       VRAMPhysicalSize;
219     /* Accesible VRAM size (by the GPU) */
220     unsigned long       VRAMSize;
221     /* AGP physical address */
222     unsigned long       AGPPhysical;
223     /* Accessible AGP size */
224     unsigned long       AGPSize;
225     /* PCI buffer virtual address */
226     unsigned long       SGPhysical;
227
228     NVAllocRec *        FB;
229     NVAllocRec *        Cursor;
230     NVAllocRec *        CLUT;   /* NV50 only */
231     NVAllocRec *        ScratchBuffer;
232     NVAllocRec *        GARTScratch;
233     Bool                NoAccel;
234     Bool                HWCursor;
235     Bool                FpScale;
236     Bool                ShadowFB;
237     unsigned char *     ShadowPtr;
238     int                 ShadowPitch;
239     CARD32              MinVClockFreqKHz;
240     CARD32              MaxVClockFreqKHz;
241     CARD32              CrystalFreqKHz;
242     CARD32              RamAmountKBytes;
243     int drm_fd;
244
245     volatile CARD32 *REGS;
246     volatile CARD32 *PCRTC0;
247     volatile CARD32 *PCRTC1;
248
249     volatile CARD32 *PRAMDAC0;
250     volatile CARD32 *PRAMDAC1;
251     volatile CARD32 *PFB;
252     volatile CARD32 *PFIFO;
253     volatile CARD32 *PGRAPH;
254     volatile CARD32 *PEXTDEV;
255     volatile CARD32 *PTIMER;
256     volatile CARD32 *PVIDEO;
257     volatile CARD32 *PMC;
258     volatile CARD32 *PRAMIN;
259     volatile CARD32 *FIFO;
260     volatile CARD32 *CURSOR;
261     volatile CARD8 *PCIO0;
262     volatile CARD8 *PCIO1;
263     volatile CARD8 *PVIO;
264     volatile CARD8 *PDIO0;
265     volatile CARD8 *PDIO1;
266     volatile CARD8 *PROM;
267
268
269     volatile CARD32 *RAMHT;
270     CARD32 pramin_free;
271
272     unsigned int SaveGeneration;
273     uint8_t cur_head;
274     ExaDriverPtr        EXADriverPtr;
275     xf86CursorInfoPtr   CursorInfoRec;
276     void                (*PointerMoved)(int index, int x, int y);
277     ScreenBlockHandlerProcPtr BlockHandler;
278     CloseScreenProcPtr  CloseScreen;
279     int                 Rotate;
280     NVFBLayout          CurrentLayout;
281     /* Cursor */
282     CARD32              curFg, curBg;
283     CARD32              curImage[256];
284     /* I2C / DDC */
285     int ddc2;
286     xf86Int10InfoPtr    pInt10;
287     I2CBusPtr           I2C;
288   void          (*VideoTimerCallback)(ScrnInfoPtr, Time);
289     void                (*DMAKickoffCallback)(NVPtr pNv);
290     XF86VideoAdaptorPtr overlayAdaptor;
291     XF86VideoAdaptorPtr blitAdaptor;
292     int                 videoKey;
293     int                 FlatPanel;
294     Bool                FPDither;
295     int                 Mobile;
296     Bool                Television;
297         int         vtOWNER;
298         Bool            crtc_active[2];
299     OptionInfoPtr       Options;
300     Bool                alphaCursor;
301     unsigned char       DDCBase;
302     Bool                twoHeads;
303     Bool                twoStagePLL;
304     Bool                fpScaler;
305     int                 fpWidth;
306     int                 fpHeight;
307     CARD32              fpSyncs;
308     Bool                usePanelTweak;
309     int                 PanelTweak;
310     Bool                LVDS;
311
312     Bool                LockedUp;
313
314     volatile void *     NotifierBlock;
315     struct drm_nouveau_notifierobj_alloc *Notifier0;
316
317     struct drm_nouveau_channel_alloc fifo;
318     CARD32              dmaPut;
319     CARD32              dmaCurrent;
320     CARD32              dmaFree;
321     CARD32              dmaMax;
322     CARD32              *dmaBase;
323
324     CARD32              currentRop;
325     int                 M2MFDirection;
326
327     Bool                WaitVSyncPossible;
328     Bool                BlendingPossible;
329     Bool                RandRRotation;
330     DRIInfoPtr          pDRIInfo;
331     drmVersionPtr       pLibDRMVersion;
332     drmVersionPtr       pKernelDRMVersion;
333
334     Bool randr12_enable;
335     CreateScreenResourcesProcPtr    CreateScreenResources;
336
337     /* we know about 3 i2c buses */
338     I2CBusPtr           pI2CBus[3];
339     int dcb_entries;
340
341     int analog_count;
342     int digital_count;
343     CARD32 dcb_table[NV40_NUM_DCB_ENTRIES]; /* 10 is a good limit */
344
345     struct {
346             ORNum dac;
347             ORNum sor;
348     } i2cMap[4];
349 } NVRec;
350
351 typedef struct _NVCrtcPrivateRec {
352         int crtc;
353         Bool paletteEnabled;
354         NVPtr pNv;
355 } NVCrtcPrivateRec, *NVCrtcPrivatePtr;
356
357 #define NVCrtcPrivate(c) ((NVCrtcPrivatePtr)(c)->driver_private)
358
359 #define NVPTR(p) ((NVPtr)((p)->driverPrivate))
360
361 #define nvReadRAMDAC0(pNv, reg) nvReadRAMDAC(pNv, 0, reg)
362 #define nvWriteRAMDAC0(pNv, reg, val) nvWriteRAMDAC(pNv, 0, reg, val)
363
364 #define nvReadCurRAMDAC(pNv, reg) nvReadRAMDAC(pNv, pNv->cur_head, reg)
365 #define nvWriteCurRAMDAC(pNv, reg, val) nvWriteRAMDAC(pNv, pNv->cur_head, reg, val)
366
367 #define nvReadCRTC0(pNv, reg) nvReadCRTC(pNv, 0, reg)
368 #define nvWriteCRTC0(pNv, reg, val) nvWriteCRTC(pNv, 0, reg, val)
369
370 #define nvReadCurCRTC(pNv, reg) nvReadCRTC(pNv, pNv->cur_head, reg)
371 #define nvWriteCurCRTC(pNv, reg, val) nvWriteCRTC(pNv, pNv->cur_head, reg, val)
372
373 #define nvReadFB(pNv, fb_reg) MMIO_IN32(pNv->PFB, fb_reg)
374 #define nvWriteFB(pNv, fb_reg, val) MMIO_OUT32(pNv->PFB, fb_reg, val)
375
376 #define nvReadGRAPH(pNv, reg) MMIO_IN32(pNv->PGRAPH, reg)
377 #define nvWriteGRAPH(pNv, reg, val) MMIO_OUT32(pNv->PGRAPH, reg, val)
378
379 #define nvReadMC(pNv, reg) MMIO_IN32(pNv->PMC, reg)
380 #define nvWriteMC(pNv, reg, val) MMIO_OUT32(pNv->PMC, reg, val)
381
382 #define nvReadEXTDEV(pNv, reg) MMIO_IN32(pNv->PEXTDEV, reg)
383 #define nvWriteEXTDEV(pNv, reg, val) MMIO_OUT32(pNv->PEXTDEV, reg, val)
384
385 #define nvReadTIMER(pNv, reg) MMIO_IN32(pNv->PTIMER, reg)
386 #define nvWriteTIMER(pNv, reg, val) MMIO_OUT32(pNv->PTIMER, reg, val)
387
388 #define nvReadVIDEO(pNv, reg) MMIO_IN32(pNv->PVIDEO, reg)
389 #define nvWriteVIDEO(pNv, reg, val) MMIO_OUT32(pNv->PVIDEO, reg, val)
390
391 #endif /* __NV_STRUCT_H__ */