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