2
* Copyright � 2001 Keith Packard
4
* Permission to use, copy, modify, distribute, and sell this software and its
5
* documentation for any purpose is hereby granted without fee, provided that
6
* the above copyright notice appear in all copies and that both that
7
* copyright notice and this permission notice appear in supporting
8
* documentation, and that the name of Keith Packard not be used in
9
* advertising or publicity pertaining to distribution of the software without
10
* specific, written prior permission. Keith Packard makes no
11
* representations about the suitability of this software for any purpose. It
12
* is provided "as is" without express or implied warranty.
14
* KEITH PACKARD DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
15
* INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
16
* EVENT SHALL KEITH PACKARD BE LIABLE FOR ANY SPECIAL, INDIRECT OR
17
* CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
18
* DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
19
* TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
20
* PERFORMANCE OF THIS SOFTWARE.
22
/* $RCSId: xc/programs/Xserver/hw/kdrive/mach64/mach64.c,v 1.10 2002/10/14 18:01:41 keithp Exp $ */
25
#include <kdrive-config.h>
31
mach64CardInit (KdCardInfo *card)
33
Mach64CardInfo *mach64c;
35
mach64c = (Mach64CardInfo *) xalloc (sizeof (Mach64CardInfo));
39
(void) mach64MapReg (card, mach64c);
40
mach64c->lcdEnabled = FALSE;
42
if (!vesaInitialize (card, &mach64c->vesa))
48
card->driver = mach64c;
54
mach64ScreenInit (KdScreenInfo *screen)
56
Mach64CardInfo *mach64c = screen->card->driver;
57
Mach64ScreenInfo *mach64s;
59
mach64s = (Mach64ScreenInfo *) xalloc (sizeof (Mach64ScreenInfo));
62
memset (mach64s, '\0', sizeof (Mach64ScreenInfo));
63
if (!vesaScreenInitialize (screen, &mach64s->vesa))
70
if (mach64s->vesa.mapping != VESA_LINEAR)
72
switch (screen->fb[0].depth) {
74
mach64s->colorKey = 0xff;
78
mach64s->colorKey = 0x001e;
81
mach64s->colorKey = 0x0000fe;
84
mach64s->colorKey = 1;
87
screen->driver = mach64s;
92
mach64InitScreen (ScreenPtr pScreen)
95
mach64InitVideo(pScreen);
97
return vesaInitScreen (pScreen);
102
mach64RandRSetConfig (ScreenPtr pScreen,
105
RRScreenSizePtr pSize)
107
kaaWaitSync (pScreen);
109
if (!vesaRandRSetConfig (pScreen, rotation, rate, pSize))
116
mach64RandRInit (ScreenPtr pScreen)
120
pScrPriv->rrSetConfig = mach64RandRSetConfig;
125
mach64FinishInitScreen (ScreenPtr pScreen)
128
ret = vesaFinishInitScreen (pScreen);
130
mach64RandRInit (pScreen);
136
mach64CreateResources (ScreenPtr pScreen)
138
return vesaCreateResources (pScreen);
142
mach64ReadLCD (Reg *reg, int id)
146
LCD_INDEX = reg->LCD_INDEX & ~(0x3f);
147
reg->LCD_INDEX = (LCD_INDEX | id);
148
return reg->LCD_DATA;
152
mach64WriteLCD (Reg *reg, int id, CARD32 data)
156
LCD_INDEX = reg->LCD_INDEX & ~(0x3f);
157
reg->LCD_INDEX = (LCD_INDEX | id);
158
reg->LCD_DATA = data;
162
mach64Preserve (KdCardInfo *card)
164
Mach64CardInfo *mach64c = card->driver;
165
Reg *reg = mach64c->reg;
170
mach64c->save.LCD_GEN_CTRL = mach64ReadLCD (reg, 1);
175
mach64MapReg (KdCardInfo *card, Mach64CardInfo *mach64c)
177
mach64c->reg_base = (CARD8 *) KdMapDevice (MACH64_REG_BASE(card),
178
MACH64_REG_SIZE(card));
180
if (!mach64c->reg_base)
183
mach64c->media_reg = 0;
187
KdSetMappedMode (MACH64_REG_BASE(card),
188
MACH64_REG_SIZE(card),
189
KD_MAPPED_MODE_REGISTERS);
190
mach64c->reg = (Reg *) (mach64c->reg_base + MACH64_REG_OFF(card));
191
mach64c->media_reg = (MediaReg *) (mach64c->reg_base + MACH64_MEDIA_REG_OFF(card));
196
mach64UnmapReg (KdCardInfo *card, Mach64CardInfo *mach64c)
198
if (mach64c->reg_base)
200
KdResetMappedMode (MACH64_REG_BASE(card),
201
MACH64_REG_SIZE(card),
202
KD_MAPPED_MODE_REGISTERS);
203
KdUnmapDevice ((void *) mach64c->reg_base, MACH64_REG_SIZE(card));
204
mach64c->reg_base = 0;
206
mach64c->media_reg = 0;
211
mach64SetMMIO (KdCardInfo *card, Mach64CardInfo *mach64c)
213
if (!mach64c->reg_base)
214
mach64MapReg (card, mach64c);
217
if (mach64c->reg->GUI_STAT == 0xffffffff)
218
FatalError ("Mach64 REG not visible\n");
223
mach64ResetMMIO (KdCardInfo *card, Mach64CardInfo *mach64c)
225
mach64UnmapReg (card, mach64c);
229
mach64Enable (ScreenPtr pScreen)
231
KdScreenPriv(pScreen);
232
Mach64CardInfo *mach64c = pScreenPriv->card->driver;
234
if (!vesaEnable (pScreen))
237
mach64SetMMIO (pScreenPriv->card, mach64c);
238
mach64DPMS (pScreen, KD_DPMS_NORMAL);
240
KdXVEnable (pScreen);
246
mach64Disable (ScreenPtr pScreen)
248
KdScreenPriv(pScreen);
249
Mach64CardInfo *mach64c = pScreenPriv->card->driver;
252
KdXVDisable (pScreen);
254
mach64ResetMMIO (pScreenPriv->card, mach64c);
255
vesaDisable (pScreen);
258
const CARD8 mach64DPMSModes[4] = {
259
0x80, /* KD_DPMS_NORMAL */
260
0x8c, /* KD_DPMS_STANDBY */
261
0x8c, /* KD_DPMS_STANDBY */
262
0x8c, /* KD_DPMS_STANDBY */
263
/* 0xb0, KD_DPMS_SUSPEND */
264
/* 0xbc, KD_DPMS_POWERDOWN */
267
#define PWR_MGT_ON (1 << 0)
268
#define PWR_MGT_MODE (3 << 1)
269
#define PWR_MGT_MODE_PIN (0 << 1)
270
#define PWR_MGT_MODE_REG (1 << 1)
271
#define PWR_MGT_MODE_TIMER (2 << 1)
272
#define PWR_MGR_MODE_PCI (3 << 1)
273
#define AUTO_PWRUP_EN (1 << 3)
274
#define ACTIVITY_PIN_ON (1 << 4)
275
#define STANDBY_POL (1 << 5)
276
#define SUSPEND_POL (1 << 6)
277
#define SELF_REFRESH (1 << 7)
278
#define ACTIVITY_PIN_EN (1 << 8)
279
#define KEYBD_SNOOP (1 << 9)
280
#define DONT_USE_F32KHZ (1 << 10)
281
#define TRISTATE_MEM_EN (1 << 11)
282
#define LCDENG_TEST_MODE (0xf << 12)
283
#define STANDBY_COUNT (0xf << 16)
284
#define SUSPEND_COUNT (0xf << 20)
285
#define BIASON (1 << 24)
286
#define BLON (1 << 25)
287
#define DIGON (1 << 26)
288
#define PM_D3_RST_ENB (1 << 27)
289
#define STANDBY_NOW (1 << 28)
290
#define SUSPEND_NOW (1 << 29)
291
#define PWR_MGT_STATUS (3 << 30)
292
#define PWR_MGT_STATUS_ON (0 << 30)
293
#define PWR_MGT_STATUS_STANDBY (1 << 30)
294
#define PWR_MGT_STATUS_SUSPEND (2 << 30)
295
#define PWR_MGT_STATUS_TRANSITION (3 << 30)
298
mach64DPMS (ScreenPtr pScreen, int mode)
300
KdScreenPriv(pScreen);
301
Mach64CardInfo *mach64c = pScreenPriv->card->driver;
302
int hsync_off = 0, vsync_off = 0, blank = 0;
303
CARD32 CRTC_GEN_CNTL;
305
Reg *reg = mach64c->reg;
310
CRTC_GEN_CNTL = reg->CRTC_GEN_CNTL;
311
LCD_GEN_CTRL = mach64ReadLCD (reg, 1);
319
case KD_DPMS_STANDBY:
324
case KD_DPMS_SUSPEND:
329
case KD_DPMS_POWERDOWN:
336
CRTC_GEN_CNTL |= (1 << 2);
338
CRTC_GEN_CNTL &= ~(1 << 2);
340
CRTC_GEN_CNTL |= (1 << 3);
342
CRTC_GEN_CNTL &= ~(1 << 3);
345
mach64c->lcdEnabled = (LCD_GEN_CTRL & (1 << 1)) != 0;
346
LCD_GEN_CTRL &= ~(1 << 1);
347
CRTC_GEN_CNTL |= (1 << 6);
352
if (!(LCD_GEN_CTRL & 3) || mach64c->lcdEnabled)
353
LCD_GEN_CTRL |= (1 << 1);
354
CRTC_GEN_CNTL &= ~(1 << 6);
357
kaaWaitSync (pScreen);
359
mach64WriteLCD (reg, 1, LCD_GEN_CTRL);
361
reg->CRTC_GEN_CNTL = CRTC_GEN_CNTL;
366
mach64Restore (KdCardInfo *card)
368
Mach64CardInfo *mach64c = card->driver;
369
Reg *reg = mach64c->reg;
373
mach64WriteLCD (reg, 1, mach64c->save.LCD_GEN_CTRL);
375
mach64ResetMMIO (card, mach64c);
380
mach64ScreenFini (KdScreenInfo *screen)
382
Mach64ScreenInfo *mach64s = (Mach64ScreenInfo *) screen->driver;
384
mach64FiniVideo(screen->pScreen);
386
vesaScreenFini (screen);
392
mach64CardFini (KdCardInfo *card)
394
Mach64CardInfo *mach64c = card->driver;
396
mach64UnmapReg (card, mach64c);
401
#define mach64CursorInit 0 /* initCursor */
402
#define mach64CursorEnable 0 /* enableCursor */
403
#define mach64CursorDisable 0 /* disableCursor */
404
#define mach64CursorFini 0 /* finiCursor */
405
#define mach64RecolorCursor 0 /* recolorCursor */
407
KdCardFuncs mach64Funcs = {
408
mach64CardInit, /* cardinit */
409
mach64ScreenInit, /* scrinit */
410
mach64InitScreen, /* initScreen */
411
mach64FinishInitScreen, /* finishInitScreen */
412
mach64CreateResources, /* createRes */
413
mach64Preserve, /* preserve */
414
mach64Enable, /* enable */
415
mach64DPMS, /* dpms */
416
mach64Disable, /* disable */
417
mach64Restore, /* restore */
418
mach64ScreenFini, /* scrfini */
419
mach64CardFini, /* cardfini */
421
mach64CursorInit, /* initCursor */
422
mach64CursorEnable, /* enableCursor */
423
mach64CursorDisable, /* disableCursor */
424
mach64CursorFini, /* finiCursor */
425
mach64RecolorCursor, /* recolorCursor */
427
mach64DrawInit, /* initAccel */
428
mach64DrawEnable, /* enableAccel */
429
mach64DrawDisable, /* disableAccel */
430
mach64DrawFini, /* finiAccel */
432
vesaGetColors, /* getColors */
433
vesaPutColors, /* putColors */