geode.h revision 44802259
1 /*
2  * (c) 2006-2008 Advanced Micro Devices, Inc.
3  *
4  * Permission is hereby granted, free of charge, to any person obtaining a
5  * copy of this software and associated documentation files (the "Software"),
6  * to deal in the Software without restriction, including without limitation
7  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
8  * and/or sell copies of the Software, and to permit persons to whom the
9  * Software is furnished to do so, subject to the following conditions:
10  *
11  * The above copyright notice and this permission notice shall be included in
12  * all copies or substantial portions of the Software.
13  *
14  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
15  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
17  * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
18  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
19  * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
20  * DEALINGS IN THE SOFTWARE.
21  *
22  * Neither the name of the Advanced Micro Devices, Inc. nor the names of its
23  * contributors may be used to endorse or promote products derived from this
24  * software without specific prior written permission.
25  */
26
27#ifndef _GEODE_H_
28#define _GEODE_H_
29
30#ifdef HAVE_CONFIG_H
31#include "config.h"
32#endif
33#include "geode_pcirename.h"
34
35#include "xorg-server.h"
36#ifdef HAVE_XAA_H
37#include "xaa.h"
38#endif
39#include "exa.h"
40#include "xf86Cursor.h"
41
42#include "vgaHW.h"
43#include "xf86int10.h"
44#include <X11/extensions/randr.h>
45#include "randrstr.h"
46
47#include "xf86xv.h"
48
49#include "compat-api.h"
50
51/* We only support EXA version >=2 */
52
53#if (EXA_VERSION_MAJOR >= 2)
54#ifndef XF86EXA
55#define XF86EXA 1
56#endif
57#else
58#undef XF86EXA
59#endif
60
61#ifdef HAVE_XAA_H
62#define XF86XAA 1
63#else
64#undef XF86XAA
65#endif
66
67#define CFB 0
68#define INT10_SUPPORT 1
69
70/* Existing Processor Models */
71#define GX1     0x01
72#define GX      0x10
73#define LX      0x20
74
75#define PCI_VENDOR_ID_CYRIX  0x1078
76#define PCI_VENDOR_ID_NS     0x100b
77#define PCI_VENDOR_ID_AMD    0x1022
78
79#define PCI_CHIP_5530     0x0104
80#define PCI_CHIP_SC1200   0x0504
81#define PCI_CHIP_SC1400   0x0104
82#define PCI_CHIP_GEODEGX  0x0030
83#define PCI_CHIP_GEODELX  0x2081
84
85#define GFX_CPU_GEODELX   4
86
87#if defined(HAVE_GX) && XF86XAA
88#define GX_FILL_RECT_SUPPORT 1
89#define GX_BRES_LINE_SUPPORT 1
90#define GX_DASH_LINE_SUPPORT 0  /* does not do dashed lines */
91#define GX_MONO_8X8_PAT_SUPPORT 1
92#define GX_CLREXP_8X8_PAT_SUPPORT 1
93#define GX_SCR2SCREXP_SUPPORT 1
94#define GX_SCR2SCRCPY_SUPPORT 1
95#define GX_CPU2SCREXP_SUPPORT 1
96#define GX_SCANLINE_SUPPORT 1
97#define GX_USE_OFFSCRN_MEM 0
98#define GX_ONE_LINE_AT_A_TIME 1
99#define GX_WRITE_PIXMAP_SUPPORT 1
100#endif
101
102#define GFX(func) gfx_##func
103#define GFX2(func) gfx2_##func
104
105#define GEODEPTR(p) ((GeodeRec *)((p)->driverPrivate))
106
107#define DEFAULT_EXA_SCRATCH_BFRSZ 0x40000
108
109/* the LX hardware (and Cimarron) require a cursor memory size of 48x64.. */
110#define LX_CURSOR_HW_WIDTH 48
111#define LX_CURSOR_HW_HEIGHT 64
112
113/* ...but xorg requires the cursor width to be a multiple of 32.  This is
114the size of the *actual* cursor. */
115#define LX_CURSOR_MAX_WIDTH 32
116#define LX_CURSOR_MAX_HEIGHT 32
117
118/* FIXME: Get rid of this from GX */
119
120#define DEBUGMSG(cond, drv_msg)
121
122#ifdef HAVE_LX
123extern unsigned char cim_inb(unsigned short port);
124extern void cim_outb(unsigned short port, unsigned char data);
125extern unsigned short cim_inw(unsigned short port);
126extern void cim_outw(unsigned short port, unsigned short data);
127extern unsigned long cim_ind(unsigned short port);
128extern void cim_outd(unsigned short port, unsigned long data);
129
130#include "cim_rtns.h"
131
132typedef struct _CIM_DISPLAYTIMING {
133    unsigned short wPitch;
134    unsigned short wBpp;
135    VG_DISPLAY_MODE vgDisplayMode;
136} CIM_DISPLAYTIMING;
137
138#endif
139
140#ifdef HAVE_GX
141extern void gfx_write_reg32(int offset, int data);
142extern void gfx_write_reg16(int offset, short data);
143extern void gfx_write_reg8(int offset, char data);
144extern int gfx_read_reg32(int offset);
145extern short gfx_read_reg16(int offset);
146extern void gfx_write_vid32(int offset, int data);
147extern int gfx_read_vid32(int offset);
148extern unsigned char gfx_inb(unsigned short port);
149extern void gfx_outb(unsigned short port, unsigned char data);
150extern unsigned short gfx_inw(unsigned short port);
151extern void gfx_outw(unsigned short port, unsigned short data);
152extern unsigned long gfx_ind(unsigned short port);
153extern void gfx_outd(unsigned short port, unsigned long data);
154
155#define Q_WORD QQ_WORD
156#include "gfx_rtns.h"
157#undef Q_WORD
158#include "panel.h"
159
160typedef struct tag_GFX_DISPLAYTIMING {
161    unsigned int dwDotClock;
162    unsigned short wPitch;
163    unsigned short wBpp;
164    unsigned short wHTotal;
165    unsigned short wHActive;
166    unsigned short wHSyncStart;
167    unsigned short wHSyncEnd;
168    unsigned short wHBlankStart;
169    unsigned short wHBlankEnd;
170    unsigned short wVTotal;
171    unsigned short wVActive;
172    unsigned short wVSyncStart;
173    unsigned short wVSyncEnd;
174    unsigned short wVBlankStart;
175    unsigned short wVBlankEnd;
176    unsigned short wPolarity;
177} GFX_DISPLAYTIMING;
178
179#endif
180
181typedef struct _VESARec {
182    xf86Int10InfoPtr pInt;
183} VESARec;
184
185typedef struct _GeodeMemRec {
186    struct _GeodeMemRec *next;
187    struct _GeodeMemRec *prev;
188    unsigned int offset;
189    int size;
190} GeodeMemRec, *GeodeMemPtr;
191
192#define OUTPUT_PANEL 0x01
193#define OUTPUT_CRT   0x02
194#define OUTPUT_TV    0x04
195#define OUTPUT_VOP   0x08
196#define OUTPUT_DCON  0x10
197
198typedef struct _geodeRec {
199    /* Common for both GX and LX */
200    int Output;                 /* Bitmask indicating the valid output options */
201    Bool HWCursor;
202    Bool NoAccel;
203    Bool useVGA;
204    Bool VGAActive;             /* Flag indicating if LX VGA is active */
205    Bool Compression;
206    Bool useEXA;
207
208    int rotation;
209    int displayWidth;
210    Bool starting;
211    Bool tryCompression;
212    Bool tryHWCursor;
213
214    int mm_width, mm_height;    /* physical display size */
215
216    unsigned long CursorStartOffset;
217
218    int Pitch;                  /* display FB pitch */
219    int displaySize;            /* The size of the visibile area */
220
221    ExaOffscreenArea *shadowArea;
222
223    /* Framebuffer memory */
224
225    unsigned char *FBBase;
226    unsigned int FBAvail;
227
228    /* EXA structures */
229
230    ExaDriverPtr pExa;
231    unsigned int exaBfrOffset;
232    unsigned int exaBfrSz;
233
234    /* Other structures */
235
236    EntityInfoPtr pEnt;
237    ScreenBlockHandlerProcPtr BlockHandler;     /* needed for video */
238    XF86VideoAdaptorPtr adaptor;
239
240    /* State save structures */
241    unsigned long FBDisplayOffset;
242    unsigned long PrevDisplayOffset;
243
244    VESARec *vesa;
245
246    int FBCompressionEnable;
247
248    VG_CURSOR_DATA FBCursor;
249
250    /* Save the Cursor offset of the FB */
251    unsigned long FBCursorOffset;
252    unsigned char FBBIOSMode;
253
254    /* Hooks */
255
256    void (*PointerMoved) (POINTER_MOVED_ARGS_DECL);
257    CloseScreenProcPtr CloseScreen;
258    Bool (*CreateScreenResources) (ScreenPtr);
259
260    /* ===== LX specific items ===== */
261
262    /* Flags */
263    Bool Scale;
264
265    DisplayModePtr panelMode;   /* The mode for the panel (if attached) */
266
267    /* Command buffer information */
268    unsigned long CmdBfrOffset;
269    unsigned long CmdBfrSize;
270
271    /* Memory Management */
272    GeodeMemPtr offscreenList;
273    unsigned int offscreenStart;
274    unsigned int offscreenSize;
275
276    /* Save state */
277    VG_COMPRESSION_DATA CBData;
278    VG_COMPRESSION_DATA FBCBData;
279    CIM_DISPLAYTIMING FBcimdisplaytiming;
280
281    /* ===== GX specific items ===== */
282
283    /* Flags */
284    Bool Panel;
285
286    int PanelX;
287    int PanelY;
288
289    int displayPitch;           /* The pitch ofthe visible area */
290    int displayOffset;          /* The offset of the visible area */
291
292    DisplayModePtr curMode;
293
294    unsigned int shadowSize;
295    unsigned int shadowOffset;
296
297    int FBVGAActive;
298
299    xf86CursorInfoPtr CursorInfo;
300
301    /* XAA structures */
302
303    unsigned int cpySrcOffset;
304    int cpySrcPitch, cpySrcBpp;
305    int cpyDx, cpyDy;
306    unsigned int cmpSrcOffset;
307    int cmpSrcPitch, cmpSrcBpp;
308    unsigned int cmpSrcFmt, cmpDstFmt;
309    int cmpOp;
310
311    unsigned char **AccelImageWriteBuffers;
312    int NoOfImgBuffers;
313    unsigned char **AccelColorExpandBuffers;
314    int NoOfColorExpandLines;
315#if XF86XAA
316    XAAInfoRecPtr AccelInfoRec;
317#endif
318
319    /* Save state */
320    unsigned long FBCompressionOffset;
321    unsigned short FBCompressionPitch;
322    unsigned short FBCompressionSize;
323    GFX_DISPLAYTIMING FBgfxdisplaytiming;
324
325    /* Hooks */
326    void (*WritePixmap) (ScrnInfoPtr pScrni, int x, int y, int w, int h,
327                         unsigned char *src, int srcwidth, int rop,
328                         unsigned int planemask, int trans, int bpp, int depth);
329
330    /* Video information */
331    int video_x;
332    int video_y;
333    short video_w;
334    short video_h;
335    short video_srcw;
336    short video_srch;
337    short video_dstw;
338    short video_dsth;
339    int video_id;
340    int video_offset;
341    ScrnInfoPtr video_scrnptr;
342    BOOL OverlayON;
343} GeodeRec, *GeodePtr;
344
345/* option flags are self-explanatory */
346#ifdef HAVE_LX
347enum {
348    LX_OPTION_SW_CURSOR,
349    LX_OPTION_HW_CURSOR,
350    LX_OPTION_NOCOMPRESSION,
351    LX_OPTION_NOACCEL,
352    LX_OPTION_EXA_SCRATCH_BFRSZ,
353    LX_OPTION_TV_SUPPORT,
354    LX_OPTION_TV_OUTPUT,
355    LX_OPTION_TV_OVERSCAN,
356    LX_OPTION_ROTATE,
357    LX_OPTION_NOPANEL,
358    LX_OPTION_FBSIZE,
359    LX_OPTION_PANEL_MODE,
360    LX_OPTION_DONT_PROGRAM
361} LX_GeodeOpts;
362#endif
363
364#ifdef HAVE_GX
365enum {
366    GX_OPTION_SW_CURSOR,
367    GX_OPTION_HW_CURSOR,
368    GX_OPTION_NOCOMPRESSION,
369    GX_OPTION_NOACCEL,
370    GX_OPTION_ACCEL_METHOD,
371    GX_OPTION_EXA_SCRATCH_BFRSZ,
372    GX_OPTION_TV_SUPPORT,
373    GX_OPTION_TV_OUTPUT,
374    GX_OPTION_TV_OVERSCAN,
375    GX_OPTION_ROTATE,
376    GX_OPTION_NOPANEL,
377    GX_OPTION_OSM_IMG_BUFS,
378    GX_OPTION_OSM_CLR_BUFS,
379    GX_OPTION_FBSIZE,
380    GX_OPTION_PANEL_GEOMETRY,
381    GX_OPTION_DONT_PROGRAM
382} GX_GeodeOpts;
383#endif
384
385/* geode_dcon.c */
386extern Bool dcon_init(ScrnInfoPtr pScrni);
387extern int DCONDPMSSet(ScrnInfoPtr pScrni, int mode);
388
389/* geode_common.c */
390
391void geode_memory_to_screen_blt(unsigned long, unsigned long,
392                                unsigned long, unsigned long, long, long, int);
393int GeodeGetRefreshRate(DisplayModePtr);
394void GeodeCopyGreyscale(unsigned char *, unsigned char *, int, int, int, int);
395int GeodeGetSizeFromFB(unsigned int *);
396
397/* gx_video.c */
398
399int
400
401
402GeodeQueryImageAttributes(ScrnInfoPtr, int id, unsigned short *w,
403                          unsigned short *h, int *pitches, int *offsets);
404
405Bool RegionsEqual(RegionPtr A, RegionPtr B);
406
407/* gx_driver.c */
408
409void GeodeProbeDDC(ScrnInfoPtr pScrni, int index);
410xf86MonPtr GeodeDoDDC(ScrnInfoPtr pScrni, int index);
411Bool GeodeI2CInit(ScrnInfoPtr pScrni, I2CBusPtr * ptr, char *name);
412
413int GeodeGetFPGeometry(const char *str, int *width, int *height);
414void GeodePointerMoved(POINTER_MOVED_ARGS_DECL);
415void GeodeFreeScreen(FREE_SCREEN_ARGS_DECL);
416int GeodeCalculatePitchBytes(unsigned int width, unsigned int bpp);
417void GXSetupChipsetFPtr(ScrnInfoPtr pScrn);
418
419/* geode_msr.c */
420int GeodeReadMSR(unsigned long addr, unsigned long *lo, unsigned long *hi);
421int GeodeWriteMSR(unsigned long addr, unsigned long lo, unsigned long hi);
422
423/* gx_cursor.c */
424Bool GXHWCursorInit(ScreenPtr pScrn);
425void GXLoadCursorImage(ScrnInfoPtr pScrni, unsigned char *src);
426void GXHideCursor(ScrnInfoPtr pScrni);
427void GXShowCursor(ScrnInfoPtr pScrni);
428
429/* gx_randr.c */
430Rotation GXGetRotation(ScreenPtr pScreen);
431Bool GXRandRInit(ScreenPtr pScreen, int rotation);
432extern _X_EXPORT Bool GXRandRSetConfig(ScreenPtr pScreen, Rotation rotation,
433                                       int rate, RRScreenSizePtr pSize);
434
435/* gx_rotate.c */
436Bool GXRotate(ScrnInfoPtr pScrni, DisplayModePtr mode);
437
438/* gx_accel.c */
439Bool GXAccelInit(ScreenPtr pScrn);
440void GXAccelSync(ScrnInfoPtr pScrni);
441
442/* gx_video.c */
443void GXInitVideo(ScreenPtr pScrn);
444
445/* lx_display.c */
446void lx_enable_dac_power(ScrnInfoPtr pScrni, int option);
447void lx_disable_dac_power(ScrnInfoPtr pScrni, int option);
448
449/* lx_driver.c */
450void LXSetupChipsetFPtr(ScrnInfoPtr pScrn);
451
452/* lx_cursor.c */
453Bool LXHWCursorInit(ScreenPtr pScrn);
454void LXLoadARGBCursorImage(ScrnInfoPtr pScrni, unsigned char *src);
455void LXHideCursor(ScrnInfoPtr pScrni);
456void LXShowCursor(ScrnInfoPtr pScrni);
457
458/* lx_exa.c */
459Bool LXExaInit(ScreenPtr pScreen);
460
461/* lx_video.c */
462void LXInitVideo(ScreenPtr pScrn);
463
464/* lx_output.c */
465void LXSetupOutput(ScrnInfoPtr);
466
467/* lx_panel.c */
468DisplayModePtr LXGetLegacyPanelMode(ScrnInfoPtr pScrni);
469DisplayModePtr LXGetManualPanelMode(char *modestr);
470
471void LXAdjustFrame(ADJUST_FRAME_ARGS_DECL);
472
473/* lx_display.c */
474void LXSetupCrtc(ScrnInfoPtr pScrni);
475
476/* lx_memory.c */
477GeodeMemPtr GeodeAllocOffscreen(GeodeRec * pGeode, int size, int align);
478void GeodeFreeOffscreen(GeodeRec * pGeode, GeodeMemPtr ptr);
479void LXInitOffscreen(ScrnInfoPtr pScrni);
480void GeodeCloseOffscreen(ScrnInfoPtr pScrni);
481unsigned int GeodeOffscreenFreeSize(GeodeRec * pGeode);
482
483/* lx_cursor.c */
484Bool LXCursorInit(ScreenPtr pScrn);
485
486#endif
487