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