Add modes, cursors and acceleration

This commit is contained in:
Keith Packard 2000-05-24 23:52:48 +00:00
parent 240aeb4cda
commit a6d519e527
10 changed files with 2568 additions and 80 deletions

View File

@ -1,9 +1,9 @@
XCOMM $XFree86$ XCOMM $XFree86: xc/programs/Xserver/hw/kdrive/igs/Imakefile,v 1.1 2000/05/06 22:17:42 keithp Exp $
#include <Server.tmpl> #include <Server.tmpl>
SRCS = igs.c igsdraw.c igsstub.c SRCS = igs.c igscmap.c igscurs.c igsdraw.c igsreg.c igsstub.c
OBJS = igs.o igsdraw.o igsstub.o OBJS = igs.o igscmap.o igscurs.o igsdraw.o igsreg.o igsstub.o
INCLUDES = -I.. -I. -I$(XBUILDINCDIR) -I$(FONTINCSRC) \ INCLUDES = -I.. -I. -I$(XBUILDINCDIR) -I$(FONTINCSRC) \
-I../../../fb -I../../../mi -I../../../include -I../../../os \ -I../../../fb -I../../../mi -I../../../include -I../../../os \

View File

@ -1,5 +1,5 @@
/* /*
* $XFree86$ * $XFree86: xc/programs/Xserver/hw/kdrive/igs/igs.c,v 1.1 2000/05/06 22:17:43 keithp Exp $
* *
* Copyright © 1999 SuSE, Inc. * Copyright © 1999 SuSE, Inc.
* *
@ -38,8 +38,13 @@ igsCardInit (KdCardInfo *card)
memset (igsc, '\0', sizeof (IgsCardInfo)); memset (igsc, '\0', sizeof (IgsCardInfo));
igsc->frameBuffer = (CARD8 *) KdMapDevice (card->attr.address[0], igsc->frameBuffer = (CARD8 *) KdMapDevice (card->attr.address[0] +
4096 * 1024); IGS_FB,
IGS_MEM);
igsc->vga = (VOL8 *) KdMapDevice (card->attr.address[0] +
IGS_VGA,
64 * 1024);
igsc->cop = (Cop5xxx *) KdMapDevice (card->attr.address[0] + igsc->cop = (Cop5xxx *) KdMapDevice (card->attr.address[0] +
IGS_COP_OFFSET, IGS_COP_OFFSET,
@ -49,17 +54,36 @@ igsCardInit (KdCardInfo *card)
IGS_COP_DATA, IGS_COP_DATA,
IGS_COP_DATA_LEN); IGS_COP_DATA_LEN);
igsRegInit (&igsc->igsvga, igsc->vga);
card->driver = igsc; card->driver = igsc;
return TRUE; return TRUE;
} }
Bool Bool
igsScreenInit (KdScreenInfo *screen) igsModeSupported (KdScreenInfo *screen,
const KdMonitorTiming *t)
{ {
IgsCardInfo *igsc = screen->card->driver; /* make sure the clock isn't too fast */
if (t->clock > IGS_MAX_CLOCK)
return FALSE;
/* width must be a multiple of 16 */
if (t->horizontal & 0xf)
return FALSE;
return TRUE;
}
Bool
igsModeUsable (KdScreenInfo *screen)
{
KdCardInfo *card = screen->card;
int screen_size;
int pixel_width;
int byte_width;
int fb = 0; int fb = 0;
screen_size = 0;
if (screen->fb[fb].depth >= 24) if (screen->fb[fb].depth >= 24)
{ {
screen->fb[fb].depth = 24; screen->fb[fb].depth = 24;
@ -76,11 +100,106 @@ igsScreenInit (KdScreenInfo *screen)
screen->fb[fb].depth = 15; screen->fb[fb].depth = 15;
screen->fb[fb].bitsPerPixel = 16; screen->fb[fb].bitsPerPixel = 16;
} }
else if (screen->fb[fb].depth >= 12)
{
screen->fb[fb].depth = 12;
screen->fb[fb].bitsPerPixel = 16;
}
else else
{ {
screen->fb[fb].depth = 8; screen->fb[fb].depth = 8;
screen->fb[fb].bitsPerPixel = 8; screen->fb[fb].bitsPerPixel = 8;
} }
byte_width = screen->width * (screen->fb[fb].bitsPerPixel >> 3);
pixel_width = screen->width;
screen->fb[fb].pixelStride = pixel_width;
screen->fb[fb].byteStride = byte_width;
screen_size += byte_width * screen->height;
return TRUE;
}
Bool
igsScreenInit (KdScreenInfo *screen)
{
IgsCardInfo *igsc = screen->card->driver;
int fb = 0;
IgsScreenInfo *igss;
int screen_size, memory;
int pattern_size;
int tile_size;
int stipple_size;
int poffset, boffset;
const KdMonitorTiming *t;
if (!screen->width || !screen->height)
{
screen->width = 800;
screen->height = 600;
screen->rate = 72;
}
if (!screen->fb[0].depth)
screen->fb[0].depth = 8;
t = KdFindMode (screen, igsModeSupported);
screen->rate = t->rate;
screen->width = t->horizontal;
screen->height = t->vertical;
if (!KdTuneMode (screen, igsModeUsable, igsModeSupported))
{
return FALSE;
}
igss = (IgsScreenInfo *) xalloc (sizeof (IgsScreenInfo));
if (!igss)
return FALSE;
memset (igss, '\0', sizeof (IgsScreenInfo));
screen_size = screen->fb[fb].byteStride * screen->height;
memory = IGS_MEM;
memory -= screen_size;
if (memory >= 1024)
{
igss->cursor_offset = memory - 1024;
#if BITMAP_BIT_ORDER == MSBFirst
igss->cursor_base = (CARD8 *) KdMapDevice (card->attr.address[0] +
igss->cursor_offset,
1024);
#else
igss->cursor_base = igsc->frameBuffer + igss->cursor_offset;
#endif
memory -= 1024;
}
else
igss->cursor_base = 0;
tile_size = IgsTileSize(screen->fb[fb].bitsPerPixel) * IGS_NUM_PATTERN;
stipple_size = IgsStippleSize(screen->fb[fb].bitsPerPixel) * IGS_NUM_PATTERN;
pattern_size = tile_size + stipple_size;
if (memory >= pattern_size)
{
boffset = screen_size;
poffset = boffset * 8 / screen->fb[fb].bitsPerPixel;
igss->tile.offset = poffset;
igss->tile.base = igsc->frameBuffer + boffset;
boffset = screen_size + tile_size;
poffset = boffset * 8 / screen->fb[fb].bitsPerPixel;
igss->stipple.offset = poffset;
igss->stipple.base = igsc->frameBuffer + boffset;
memory -= pattern_size;
}
else
{
igss->tile.base = 0;
igss->stipple.base = 0;
}
switch (screen->fb[fb].depth) { switch (screen->fb[fb].depth) {
case 8: case 8:
screen->fb[fb].visuals = ((1 << StaticGray) | screen->fb[fb].visuals = ((1 << StaticGray) |
@ -112,11 +231,13 @@ igsScreenInit (KdScreenInfo *screen)
screen->fb[fb].redMask = 0xff0000; screen->fb[fb].redMask = 0xff0000;
break; break;
} }
screen->fb[fb].pixelStride = screen->width; screen->fb[fb].pixelStride = screen->width;
screen->fb[fb].byteStride = screen->width * (screen->fb[fb].bitsPerPixel >> 3); screen->fb[fb].byteStride = screen->width * (screen->fb[fb].bitsPerPixel >> 3);
screen->fb[fb].frameBuffer = igsc->frameBuffer; screen->fb[fb].frameBuffer = igsc->frameBuffer;
if (!igsc->cop) if (!igsc->cop)
screen->dumb = TRUE; screen->dumb = TRUE;
screen->driver = igss;
return TRUE; return TRUE;
} }
@ -129,16 +250,345 @@ igsInitScreen(ScreenPtr pScreen)
void void
igsPreserve (KdCardInfo *card) igsPreserve (KdCardInfo *card)
{ {
IgsCardInfo *igsc = card->driver;
IgsVga *igsvga = &igsc->igsvga;
igsSave (igsvga);
}
void
igsSetBlank (IgsVga *igsvga, Bool blank)
{
igsSetImm(igsvga, igs_screen_off, blank ? 1 : 0);
}
void
igsSetSync (IgsCardInfo *igsc, int hsync, int vsync)
{
IgsVga *igsvga = &igsc->igsvga;
igsSet (igsvga, igs_mexhsyn, hsync);
igsSet (igsvga, igs_mexvsyn, vsync);
VgaFlush (&igsvga->card);
}
/*
* Clock synthesis:
*
* scale = p ? (2 * p) : 1
* f_out = f_ref * ((M + 1) / ((N + 1) * scale))
*
* Constraints:
*
* 1. 115MHz <= f_ref * ((M + 1) / (N + 1)) <= 260 MHz
* 2. N >= 1
*
* Vertical refresh rate = clock / ((hsize + hblank) * (vsize + vblank))
* Horizontal refresh rate = clock / (hsize + hblank)
*/
/* all in kHz */
void
igsGetClock (int target, int *Mp, int *Np, int *Pp, int maxM, int maxN, int maxP, int minVco)
{
int M, N, P, bestM, bestN;
int f_vco, f_out;
int err, abserr, besterr;
/*
* Compute correct P value to keep VCO in range
*/
for (P = 0; P <= maxP; P++)
{
f_vco = target * IGS_SCALE(P);
if (f_vco >= minVco)
break;
}
/* M = f_out / f_ref * ((N + 1) * IGS_SCALE(P)); */
besterr = target;
for (N = 1; N <= maxN; N++)
{
M = ((target * (N + 1) * IGS_SCALE(P) + (IGS_CLOCK_REF/2)) + IGS_CLOCK_REF/2) / IGS_CLOCK_REF - 1;
if (0 <= M && M <= maxM)
{
f_out = IGS_CLOCK(M,N,P);
err = target - f_out;
if (err < 0)
err = -err;
if (err < besterr)
{
besterr = err;
bestM = M;
bestN = N;
}
}
}
*Mp = bestM;
*Np = bestN;
*Pp = P;
} }
void void
igsEnable (ScreenPtr pScreen) igsEnable (ScreenPtr pScreen)
{ {
KdScreenPriv(pScreen);
KdCardInfo *card = pScreenPriv->card;
KdScreenInfo *screen = pScreenPriv->screen;
IgsCardInfo *igsc = card->driver;
IgsVga *igsvga = &igsc->igsvga;
const KdMonitorTiming *t;
int hactive, hblank, hfp, hbp;
int vactive, vblank, vfp, vbp;
int hsize;
int fb = 0;
int m, n, r;
int h_total;
int h_display_end;
int h_blank_start;
int h_blank_end;
int h_sync_start;
int h_sync_end;
int h_screen_off;
int v_total;
int v_retrace_start;
int v_retrace_end;
int v_display_end;
int v_blank_start;
int v_blank_end;
int offset;
int num_fetch;
int m_m, m_n, m_r;
igsSetBlank (igsvga, TRUE);
t = KdFindMode (screen, igsModeSupported);
igsGetClock (t->clock, &m, &n, &r, 2047, 255, 7, IGS_MIN_VCO);
/*
* Set the chip so that 0x400000 is a big-endian frame buffer
* with the correct byte swapping enabled
*/
igsSet (igsvga, igs_biga22force, 0);
igsSet (igsvga, igs_biga22en, 1);
igsSet (igsvga, igs_biga24en, 1);
/*
* Enable 8-bit DACs
*/
igsSet (igsvga, igs_rampwdn, 0);
igsSet (igsvga, igs_dac6_8, 1);
igsSet (igsvga, igs_dacpwdn, 0);
/*
* Set overscan to black
*/
igsSet (igsvga, igs_overscan_red, 0x00);
igsSet (igsvga, igs_overscan_green, 0x00);
igsSet (igsvga, igs_overscan_blue, 0x00);
/*
* Enable PCI retries
*/
igsSet (igsvga, igs_iow_retry, 1);
igsSet (igsvga, igs_mw_retry, 1);
igsSet (igsvga, igs_mr_retry, 1);
igsSet (igsvga, igs_pci_burst_write, 1);
igsSet (igsvga, igs_pci_burst_read, 1);
/*
* Set FIFO
*/
igsSet (igsvga, igs_memgopg, 1);
igsSet (igsvga, igs_memr2wpg, 0);
igsSet (igsvga, igs_crtff16, 0);
igsSet (igsvga, igs_fifomust, 0xff);
igsSet (igsvga, igs_fifogen, 0xff);
/*
* Enable CRT reg access
*/
igsSetImm (igsvga, igs_ena_vr_access, 1);
igsSetImm (igsvga, igs_crt_protect, 0);
hfp = t->hfp;
hbp = t->hbp;
hblank = t->hblank;
hactive = t->horizontal;
offset = screen->fb[0].byteStride;
vfp = t->vfp;
vbp = t->vbp;
vblank = t->vblank;
vactive = t->vertical;
/*
* Compute character lengths for horizontal timing values
*/
hactive = screen->width / 8;
hblank /= 8;
hfp /= 8;
hbp /= 8;
offset /= 8;
switch (screen->fb[fb].bitsPerPixel) {
case 8:
igsSet (igsvga, igs_overscan_red, pScreen->blackPixel);
igsSet (igsvga, igs_overscan_green, pScreen->blackPixel);
igsSet (igsvga, igs_overscan_blue, pScreen->blackPixel);
igsSet (igsvga, igs_bigswap, IGS_BIGSWAP_8);
igsSet (igsvga, igs_mode_sel, IGS_MODE_8);
igsSet (igsvga, igs_ramdacbypass, 0);
break;
case 16:
igsSet (igsvga, igs_bigswap, IGS_BIGSWAP_16);
igsSet (igsvga, igs_ramdacbypass, 1);
switch (screen->fb[fb].depth) {
case 12:
igsSet (igsvga, igs_mode_sel, IGS_MODE_4444);
break;
case 15:
igsSet (igsvga, igs_mode_sel, IGS_MODE_5551);
break;
case 16:
igsSet (igsvga, igs_mode_sel, IGS_MODE_565);
break;
}
break;
case 24:
igsSet (igsvga, igs_ramdacbypass, 1);
igsSet (igsvga, igs_bigswap, IGS_BIGSWAP_8);
igsSet (igsvga, igs_mode_sel, IGS_MODE_888);
break;
case 32:
igsSet (igsvga, igs_ramdacbypass, 1);
igsSet (igsvga, igs_bigswap, IGS_BIGSWAP_32);
igsSet (igsvga, igs_mode_sel, IGS_MODE_8888);
break;
}
/*
* Compute horizontal register values from timings
*/
h_total = hactive + hblank - 5;
h_display_end = hactive - 1;
h_sync_start = hactive + hfp;
h_sync_end = hactive + hblank - hbp;
/*
* pad the blank values narrow a bit and use the border_select to
* eliminate the remaining border; don't know why, but it doesn't
* work in the documented fashion
*/
h_blank_start = hactive - 1;
h_blank_end = hactive + hblank - 1 - 1;
num_fetch = (t->horizontal * screen->fb[fb].bitsPerPixel / 64) + 1;
v_total = vactive + vblank - 2;
v_display_end = vactive - 1;
v_blank_start = vactive - 1;
v_blank_end = v_blank_start + vblank - 1;
v_retrace_start = vactive + vfp;
v_retrace_end = vactive + vblank - vbp;
#if 0
#define chk(a,b,c) fprintf (stderr, "%20.20s: BIOS %6d X %6d\n", a, igsGet(igsvga, b), c);
chk("h_total", igs_h_total, h_total);
chk("h_display_end", igs_h_de_end, h_display_end);
chk("h_sync_start", igs_h_rstart, h_sync_start);
chk("h_sync_end", igs_h_rend, h_sync_end&0x1f);
chk("h_blank_start", igs_h_bstart, h_blank_start);
chk("h_blank_end", igs_h_bend, h_blank_end&0x3f);
chk("offset", igs_offset, offset);
chk("num_fetch", igs_num_fetch, num_fetch);
chk("v_total", igs_v_total, v_total);
chk("v_display_end", igs_v_de_end, v_display_end);
chk("v_blank_start", igs_v_bstart, v_blank_start);
chk("v_blank_end", igs_v_bend, v_blank_end&0xf);
chk("v_retrace_start", igs_v_rstart, v_retrace_start);
chk("v_retrace_end", igs_v_rend, v_retrace_end&0xf);
chk("vclk_m", igs_vclk_m, m);
chk("vclk_n", igs_vclk_n, n);
chk("vclk_p", igs_vclk_p, r);
fprintf (stderr, "%20.20s: BIOS %6d X %6d\n", "vclk",
IGS_CLOCK(igsGet(igsvga,igs_vclk_m),
igsGet(igsvga,igs_vclk_n),
igsGet(igsvga,igs_vclk_p)),
IGS_CLOCK(m,n,r));
#endif
igsSet (igsvga, igs_h_total, h_total);
igsSet (igsvga, igs_h_de_end, h_display_end);
igsSet (igsvga, igs_h_rstart, h_sync_start);
igsSet (igsvga, igs_h_rend, h_sync_end);
igsSet (igsvga, igs_h_bstart, h_blank_start);
igsSet (igsvga, igs_h_bend, h_blank_end);
igsSet (igsvga, igs_offset, offset);
igsSet (igsvga, igs_num_fetch, num_fetch);
igsSet (igsvga, igs_v_total, v_total);
igsSet (igsvga, igs_v_de_end, v_display_end);
igsSet (igsvga, igs_v_bstart, v_blank_start);
igsSet (igsvga, igs_v_bend, v_blank_end&0xf);
igsSet (igsvga, igs_v_rstart, v_retrace_start);
igsSet (igsvga, igs_v_rend, v_retrace_end&0xf);
igsSet (igsvga, igs_vclk_m, m);
igsSet (igsvga, igs_vclk_n, n);
igsSet (igsvga, igs_vclk_p, r);
igsSet (igsvga, igs_vfsel, IGS_CLOCK(m, n, 0) >= 180000);
VgaFlush (&igsvga->card);
igsSetImm (igsvga, igs_frqlat, 0);
igsSetImm (igsvga, igs_frqlat, 1);
igsSetImm (igsvga, igs_frqlat, 0);
igsSetBlank (igsvga, FALSE);
#if 0
#define dbg(a,b) fprintf(stderr, "%20.20s = 0x%x\n", a, igsGet(igsvga,b))
#include "reg.dbg"
{
VGA16 reg;
char buf[128];
for (reg = 0; reg < IGS_NREG; reg++)
fprintf(stderr, "%20.20s = 0x%02x\n", igsRegName(buf, reg),
VgaFetch (&igsvga->card, reg));
}
#endif
} }
Bool Bool
igsDPMS (ScreenPtr pScreen, int mode) igsDPMS (ScreenPtr pScreen, int mode)
{ {
KdScreenPriv(pScreen);
IgsCardInfo *igsc = pScreenPriv->card->driver;
IgsVga *igsvga = &igsc->igsvga;
switch (mode) {
case KD_DPMS_NORMAL:
igsSetSync (igsc, 0, 0);
igsSetBlank (igsvga, FALSE);
break;
case KD_DPMS_STANDBY:
igsSetBlank (igsvga, TRUE);
igsSetSync (igsc, 1, 0);
break;
case KD_DPMS_SUSPEND:
igsSetBlank (igsvga, TRUE);
igsSetSync (igsc, 0, 1);
break;
case KD_DPMS_POWERDOWN:
igsSetBlank (igsvga, TRUE);
igsSetSync (igsc, 1, 1);
break;
}
return TRUE; return TRUE;
} }
@ -150,11 +600,23 @@ igsDisable (ScreenPtr pScreen)
void void
igsRestore (KdCardInfo *card) igsRestore (KdCardInfo *card)
{ {
IgsCardInfo *igsc = card->driver;
IgsVga *igsvga = &igsc->igsvga;
igsReset (igsvga);
} }
void void
igsScreenFini (KdScreenInfo *screen) igsScreenFini (KdScreenInfo *screen)
{ {
IgsScreenInfo *igss = (IgsScreenInfo *) screen->driver;
#if BITMAP_BIT_ORDER == MSBFirst
if (igss->cursor_base)
KdUnmapDevice ((void *) igss->cursor_base, 1024);
#endif
xfree (igss);
screen->driver = 0;
} }
void void
@ -165,9 +627,11 @@ igsCardFini (KdCardInfo *card)
if (igsc->copData) if (igsc->copData)
KdUnmapDevice ((void *) igsc->copData, IGS_COP_DATA_LEN); KdUnmapDevice ((void *) igsc->copData, IGS_COP_DATA_LEN);
if (igsc->cop) if (igsc->cop)
KdUnmapDevice (igsc->cop, sizeof (Cop5xxx)); KdUnmapDevice ((void *) igsc->cop, sizeof (Cop5xxx));
if (igsc->vga)
KdUnmapDevice ((void *) igsc->vga, 64 * 1024);
if (igsc->frameBuffer) if (igsc->frameBuffer)
KdUnmapDevice (igsc->frameBuffer, 4096 * 1024); KdUnmapDevice (igsc->frameBuffer, IGS_MEM);
xfree (igsc); xfree (igsc);
card->driver = 0; card->driver = 0;
} }
@ -184,10 +648,10 @@ KdCardFuncs igsFuncs = {
igsScreenFini, /* scrfini */ igsScreenFini, /* scrfini */
igsCardFini, /* cardfini */ igsCardFini, /* cardfini */
0, /* initCursor */ igsCursorInit, /* initCursor */
0, /* enableCursor */ igsCursorEnable, /* enableCursor */
0, /* disableCursor */ igsCursorDisable, /* disableCursor */
0, /* finiCursor */ igsCursorFini, /* finiCursor */
0, /* recolorCursor */ 0, /* recolorCursor */
igsDrawInit, /* initAccel */ igsDrawInit, /* initAccel */
@ -196,6 +660,6 @@ KdCardFuncs igsFuncs = {
igsDrawDisable, /* disableAccel */ igsDrawDisable, /* disableAccel */
igsDrawFini, /* finiAccel */ igsDrawFini, /* finiAccel */
0, /* getColors */ igsGetColors, /* getColors */
0, /* putColors */ igsPutColors, /* putColors */
}; };

View File

@ -1,5 +1,5 @@
/* /*
* $XFree86$ * $XFree86: xc/programs/Xserver/hw/kdrive/igs/igs.h,v 1.1 2000/05/06 22:17:43 keithp Exp $
* *
* Copyright © 1999 SuSE, Inc. * Copyright © 1999 SuSE, Inc.
* *
@ -27,6 +27,7 @@
#define _IGS_H_ #define _IGS_H_
#include "kdrive.h" #include "kdrive.h"
#include "igsreg.h"
extern KdCardFuncs igsFuncs; extern KdCardFuncs igsFuncs;
@ -37,28 +38,50 @@ extern KdCardFuncs igsFuncs;
* Coprocessor 0x008bf000 * Coprocessor 0x008bf000
*/ */
#if BITMAP_BIT_ORDER == MSBFirst
#define IGS_FB 0x00400000
#else
#define IGS_FB 0x00000000
#endif
#define IGS_VGA 0x00800000
#define IGS_COP_DATA 0x008a0000 #define IGS_COP_DATA 0x008a0000
#define IGS_COP_DATA_LEN 0x00010000 #define IGS_COP_DATA_LEN 0x00010000
#define IGS_COP_OFFSET 0x008bf000 #define IGS_COP_OFFSET 0x008bf000
/* give audio 1/2 meg at end */
#if 1
#define IGS_MEM ((4096-512)*1024)
#else
#define IGS_MEM ((4096)*1024)
#endif
#define IGS_CLOCK_REF 24576 /* KHz */
#define IGS_SCALE(p) ((p) ? (2 * (p)) : 1)
#define IGS_CLOCK(m,n,p) ((IGS_CLOCK_REF * ((m) + 1)) / (((n) + 1) * IGS_SCALE(p)))
#define IGS_MAX_CLOCK 260000
#define IGS_MIN_VCO 115000
typedef volatile CARD8 VOL8; typedef volatile CARD8 VOL8;
typedef volatile CARD16 VOL16; typedef volatile CARD16 VOL16;
typedef volatile CARD32 VOL32; typedef volatile CARD32 VOL32;
typedef struct _Cop5xxx { typedef struct _Cop5xxx {
VOL8 pad000[0x11]; /* 0x000 */ VOL8 pad000[0x10]; /* 0x000 */
VOL8 control; /* 0x011 */ VOL32 control; /* 0x010 */
#define IGS_CONTROL_HBLTW_RDYZ 0x01 #define IGS_CONTROL_HBLTW_RDYZ 0x0100
#define IGS_CONTROL_MALLWBEPTZ 0x02 #define IGS_CONTROL_MALLWBEPTZ 0x0200
#define IGS_CONTROL_CMDFF 0x04 #define IGS_CONTROL_CMDFF 0x0400
#define IGS_CONTROL_SOP 0x08 #define IGS_CONTROL_SOP 0x0800
#define IGS_CONTROL_OPS 0x10 #define IGS_CONTROL_OPS 0x1000
#define IGS_CONTROL_TER 0x20 #define IGS_CONTROL_TER 0x2000
#define IGS_CONTROL_HBACKZ 0x40 #define IGS_CONTROL_HBACKZ 0x4000
#define IGS_CONTROL_BUSY 0x80 #define IGS_CONTROL_BUSY 0x8000
VOL8 pad012[0x06]; /* 0x012 */ VOL8 pad014[0x04]; /* 0x014 */
VOL32 src1_stride; /* 0x018 */ VOL32 src1_stride; /* 0x018 */
@ -110,8 +133,8 @@ typedef struct _Cop5xxx {
VOL32 src1_base_address; /* 0x070 */ VOL32 src1_base_address; /* 0x070 */
VOL8 pad074[0x04]; /* 0x074 */ VOL8 pad074[0x04]; /* 0x074 */
VOL16 dst_x_rotate; /* 0x078 */ VOL32 rotate; /* 0x078 */
VOL16 pat_y_rotate; /* 0x07a */ #define IGS_MAKE_ROTATE(x,y) ((x) | ((y) << 16))
VOL32 operation; /* 0x07c */ VOL32 operation; /* 0x07c */
/* OCT[2:0] */ /* OCT[2:0] */
@ -146,6 +169,7 @@ typedef struct _Cop5xxx {
#define IGS_PIXEL_LINE_TRANS 0x00007000 #define IGS_PIXEL_LINE_TRANS 0x00007000
#define IGS_PIXEL_FG 0x00008000 #define IGS_PIXEL_FG 0x00008000
#define IGS_PIXEL_TILE 0x00009000 #define IGS_PIXEL_TILE 0x00009000
#define IGS_PIXEL_TILE_OPAQUE 0x0000d000
/* HostBltEnable[1:0] */ /* HostBltEnable[1:0] */
#define IGS_HBLT_DISABLE 0x00000000 #define IGS_HBLT_DISABLE 0x00000000
@ -173,11 +197,10 @@ typedef struct _Cop5xxx {
/* BGS */ /* BGS */
#define IGS_BGS_BG 0x00000000 #define IGS_BGS_BG 0x00000000
#define IGS_BGS_SRC 0x80000000 #define IGS_BGS_SRC 0x80000000
VOL8 pad080[0x91]; /* 0x080 */ VOL8 pad080[0x90]; /* 0x080 */
VOL8 debug_control_1; /* 0x111 */ VOL32 debug_control; /* 0x110 */
VOL8 debug_control_2; /* 0x112 */ VOL8 pad114[0x04]; /* 0x114 */
VOL8 pad113[0x05]; /* 0x113 */
VOL32 src2_stride; /* 0x118 */ VOL32 src2_stride; /* 0x118 */
VOL8 pad11c[0x14]; /* 0x11c */ VOL8 pad11c[0x14]; /* 0x11c */
@ -194,37 +217,82 @@ typedef struct _Cop5xxx {
#define IGS_WRMRSTZ 0x100 #define IGS_WRMRSTZ 0x100
#define IGS_TEST_MTST 0x200 #define IGS_TEST_MTST 0x200
VOL8 style_line_roll_over; /* 0x134 */ VOL32 style_line; /* 0x134 */
VOL8 style_line_inc; /* 0x135 */ #define IGS_MAKE_STILE_LINE(roll_over,inc,pattern,accumulator) \
VOL8 style_line_pattern; /* 0x136 */ ((roll_over) | \
VOL8 style_line_accumulator; /* 0x137 */ ((style_line_inc) << 8) | \
VOL8 style_line_pattern_index; /* 0x138 */ ((style_line_patern) << 16) | \
VOL8 pad139[0x3]; /* 0x139 */ ((style_line_accumullator) << 24))
VOL32 style_line_pattern_index; /* 0x138 */
VOL16 mono_burst_total; /* 0x13c */ VOL32 mono_burst_total; /* 0x13c */
VOL8 pad13e[0x12]; /* 0x13e */ VOL8 pad140[0x10]; /* 0x140 */
VOL8 pat_x_rotate; /* 0x150 */ VOL32 pat_x_rotate; /* 0x150 */
VOL8 pad151[0x1f]; /* 0x151 */ VOL8 pad154[0x1c]; /* 0x154 */
VOL32 src1_start; /* 0x170 */ VOL32 src1_start; /* 0x170 */
VOL32 src2_start; /* 0x174 */ VOL32 src2_start; /* 0x174 */
VOL32 dst_start; /* 0x178 */ VOL32 dst_start; /* 0x178 */
VOL8 pad17c[0x9c]; /* 0x17c */ VOL8 pad17c[0x9c]; /* 0x17c */
VOL16 dst_stride; /* 0x218 */ VOL32 dst_stride; /* 0x218 */
} Cop5xxx; } Cop5xxx;
typedef struct _igsCardInfo { typedef struct _igsCardInfo {
Cop5xxx *cop; Cop5xxx *cop;
VOL8 *vga;
VOL32 *copData; VOL32 *copData;
Bool need_sync;
CARD8 *frameBuffer; CARD8 *frameBuffer;
IgsVga igsvga;
} IgsCardInfo; } IgsCardInfo;
#define getIgsCardInfo(kd) ((IgsCardInfo *) ((kd)->card->driver)) #define getIgsCardInfo(kd) ((IgsCardInfo *) ((kd)->card->driver))
#define igsCardInfo(kd) IgsCardInfo *igsc = getIgsCardInfo(kd) #define igsCardInfo(kd) IgsCardInfo *igsc = getIgsCardInfo(kd)
typedef struct _igsCursor {
int width, height;
int xhot, yhot;
Bool has_cursor;
CursorPtr pCursor;
Pixel source, mask;
} IgsCursor;
#define IGS_CURSOR_WIDTH 64
#define IGS_CURSOR_HEIGHT 64
typedef struct _igsPattern {
INT32 xrot, yrot;
CARD32 serial_number;
CARD8 *base;
CARD32 offset;
} IgsPattern;
#define IGS_NUM_PATTERN 8
#define IGS_PATTERN_WIDTH 8
#define IGS_PATTERN_HEIGHT 8
typedef struct _igsPatternCache {
CARD8 *base;
CARD32 offset;
IgsPattern pattern[IGS_NUM_PATTERN];
int next;
} IgsPatternCache;
typedef struct _igsScreenInfo {
CARD8 *cursor_base;
CARD32 cursor_offset;
IgsCursor cursor;
IgsPatternCache tile;
IgsPatternCache stipple;
} IgsScreenInfo;
#define IgsTileSize(bpp) (IGS_PATTERN_WIDTH*(bpp)/8*IGS_PATTERN_HEIGHT)
#define IgsStippleSize(bpp) (IGS_PATTERN_WIDTH/8*IGS_PATTERN_HEIGHT)
#define getIgsScreenInfo(kd) ((IgsScreenInfo *) ((kd)->screen->driver))
#define igsScreenInfo(kd) IgsScreenInfo *igss = getIgsScreenInfo(kd)
Bool Bool
igsDrawInit (ScreenPtr pScreen); igsDrawInit (ScreenPtr pScreen);
@ -240,5 +308,22 @@ igsDrawSync (ScreenPtr pScreen);
void void
igsDrawFini (ScreenPtr pScreen); igsDrawFini (ScreenPtr pScreen);
void
igsGetColors (ScreenPtr pScreen, int fb, int ndef, xColorItem *pdefs);
void
igsPutColors (ScreenPtr pScreen, int fb, int ndef, xColorItem *pdefs);
Bool
igsCursorInit (ScreenPtr pScreen);
void
igsCursorEnable (ScreenPtr pScreen);
void
igsCursorDisable (ScreenPtr pScreen);
void
igsCursorFini (ScreenPtr pScreen);
#endif /* _IGS_H_ */ #endif /* _IGS_H_ */

61
hw/kdrive/igs/igscmap.c Normal file
View File

@ -0,0 +1,61 @@
/*
* $XFree86$
*
* Copyright © 2000 Keith Packard
*
* Permission to use, copy, modify, distribute, and sell this software and its
* documentation for any purpose is hereby granted without fee, provided that
* the above copyright notice appear in all copies and that both that
* copyright notice and this permission notice appear in supporting
* documentation, and that the name of Keith Packard not be used in
* advertising or publicity pertaining to distribution of the software without
* specific, written prior permission. Keith Packard makes no
* representations about the suitability of this software for any purpose. It
* is provided "as is" without express or implied warranty.
*
* KEITH PACKARD DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
* INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
* EVENT SHALL KEITH PACKARD BE LIABLE FOR ANY SPECIAL, INDIRECT OR
* CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
* DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
* TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
* PERFORMANCE OF THIS SOFTWARE.
*/
#include "igs.h"
#define IGS_DAC_SHIFT 8
void
igsGetColors (ScreenPtr pScreen, int fb, int ndef, xColorItem *pdefs)
{
KdScreenPriv(pScreen);
igsCardInfo(pScreenPriv);
IgsVga *igsvga = &igsc->igsvga;
while (ndef--)
{
igsSetImm (igsvga, igs_dac_read_index, pdefs->pixel);
pdefs->red = igsGetImm (igsvga, igs_dac_data) << IGS_DAC_SHIFT;
pdefs->green = igsGetImm (igsvga, igs_dac_data) << IGS_DAC_SHIFT;
pdefs->blue = igsGetImm (igsvga, igs_dac_data) << IGS_DAC_SHIFT;
pdefs++;
}
}
void
igsPutColors (ScreenPtr pScreen, int fb, int ndef, xColorItem *pdefs)
{
KdScreenPriv(pScreen);
igsCardInfo(pScreenPriv);
IgsVga *igsvga = &igsc->igsvga;
while (ndef--)
{
igsSetImm (igsvga, igs_dac_write_index, pdefs->pixel);
igsSetImm (igsvga, igs_dac_data, pdefs->red >> IGS_DAC_SHIFT);
igsSetImm (igsvga, igs_dac_data, pdefs->green >> IGS_DAC_SHIFT);
igsSetImm (igsvga, igs_dac_data, pdefs->blue >> IGS_DAC_SHIFT);
pdefs++;
}
}

344
hw/kdrive/igs/igscurs.c Normal file
View File

@ -0,0 +1,344 @@
/*
* $XFree86$
*
* Copyright © 2000 Keith Packard
*
* Permission to use, copy, modify, distribute, and sell this software and its
* documentation for any purpose is hereby granted without fee, provided that
* the above copyright notice appear in all copies and that both that
* copyright notice and this permission notice appear in supporting
* documentation, and that the name of Keith Packard not be used in
* advertising or publicity pertaining to distribution of the software without
* specific, written prior permission. Keith Packard makes no
* representations about the suitability of this software for any purpose. It
* is provided "as is" without express or implied warranty.
*
* KEITH PACKARD DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
* INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
* EVENT SHALL KEITH PACKARD BE LIABLE FOR ANY SPECIAL, INDIRECT OR
* CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
* DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
* TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
* PERFORMANCE OF THIS SOFTWARE.
*/
#include "igs.h"
#include "cursorstr.h"
#define SetupCursor(s) KdScreenPriv(s); \
igsCardInfo(pScreenPriv); \
igsScreenInfo(pScreenPriv); \
IgsCursor *pCurPriv = &igss->cursor; \
IgsVga *igsvga = &igsc->igsvga
static void
_igsMoveCursor (ScreenPtr pScreen, int x, int y)
{
SetupCursor(pScreen);
CARD8 xoff, yoff;
x -= pCurPriv->xhot;
xoff = 0;
if (x < 0)
{
xoff = -x;
x = 0;
}
y -= pCurPriv->yhot;
yoff = 0;
if (y < 0)
{
yoff = -y;
y = 0;
}
igsSet (igsvga, igs_sprite_x, x);
igsSet (igsvga, igs_sprite_preset_x, xoff);
igsSet (igsvga, igs_sprite_y, y);
igsSet (igsvga, igs_sprite_preset_y, yoff);
}
static void
igsMoveCursor (ScreenPtr pScreen, int x, int y)
{
SetupCursor (pScreen);
if (!pCurPriv->has_cursor)
return;
if (!pScreenPriv->enabled)
return;
_igsMoveCursor (pScreen, x, y);
VgaFlush (&igsvga->card);
}
static void
igsSetCursorColors (ScreenPtr pScreen)
{
SetupCursor (pScreen);
CursorPtr pCursor = pCurPriv->pCursor;
igsSetImm (igsvga, igs_cursor_write_index, 0);
igsSetImm (igsvga, igs_cursor_data, pCursor->backRed >> 8);
igsSetImm (igsvga, igs_cursor_data, pCursor->backGreen >> 8);
igsSetImm (igsvga, igs_cursor_data, pCursor->backBlue >> 8);
igsSetImm (igsvga, igs_cursor_write_index, 1);
igsSetImm (igsvga, igs_cursor_data, pCursor->foreRed >> 8);
igsSetImm (igsvga, igs_cursor_data, pCursor->foreGreen >> 8);
igsSetImm (igsvga, igs_cursor_data, pCursor->foreBlue >> 8);
}
#if BITMAP_BIT_ORDER == MSBFirst
#define IgsAdjustCursor(v) { \
v = ((v & 0x55555555) << 1) | ((v >> 1) & 0x55555555); \
v = ((v & 0x33333333) << 2) | ((v >> 2) & 0x33333333); \
v = ((v & 0x0f0f0f0f) << 4) | ((v >> 4) & 0x0f0f0f0f); \
v = ((v & 0x00ff00ff) << 8) | ((v >> 8) & 0x00ff00ff); \
v = ((v & 0x0000ffff) <<16) | ((v >>16) & 0x0000ffff); \
}
#else
#define IgsAdjustCursor(v)
#endif
#define ExplodeBits2(v) (((v) & 1) | (((v) & 2) << 1))
#define ExplodeBits4(v) ((ExplodeBits2((v) >> 2) << 4) | \
(ExplodeBits2((v) & 0x3)))
#define ExplodeBits8(v) ((ExplodeBits4((v) >> 4) << 8) | \
(ExplodeBits4((v) & 0xf)))
#define ExplodeBits16(v) ((ExplodeBits8((v) >> 8) << 16) | \
(ExplodeBits8((v) & 0xff)))
static void
igsLoadCursor (ScreenPtr pScreen, int x, int y)
{
SetupCursor(pScreen);
CursorPtr pCursor = pCurPriv->pCursor;
CursorBitsPtr bits = pCursor->bits;
int w, h;
CARD32 *ram, *msk, *mskLine, *src, *srcLine;
int i, j;
int cursor_address;
int lwsrc;
unsigned char ramdac_control_;
CARD32 offset;
CARD32 b0, b1;
pCurPriv->pCursor = pCursor;
pCurPriv->xhot = pCursor->bits->xhot;
pCurPriv->yhot = pCursor->bits->yhot;
/*
* Stick new image into cursor memory
*/
ram = (CARD32 *) igss->cursor_base;
mskLine = (CARD32 *) bits->mask;
srcLine = (CARD32 *) bits->source;
h = bits->height;
if (h > IGS_CURSOR_HEIGHT)
h = IGS_CURSOR_HEIGHT;
lwsrc = BitmapBytePad(bits->width) / 4; /* words per line */
for (i = 0; i < IGS_CURSOR_HEIGHT; i++) {
msk = mskLine;
src = srcLine;
mskLine += lwsrc;
srcLine += lwsrc;
for (j = 0; j < IGS_CURSOR_WIDTH / 32; j++) {
CARD32 m, s;
if (i < h && j < lwsrc)
{
m = *msk++;
s = *src++;
IgsAdjustCursor(m);
IgsAdjustCursor(s);
}
else
{
m = 0;
s = 0;
}
s &= m;
m = ~m;
b0 = ExplodeBits16(s&0xffff) | (ExplodeBits16(m&0xffff)<<1);
b1 = ExplodeBits16(s>>16) | (ExplodeBits16(m>>16)<<1);
*ram++ = b0;
*ram++ = b1;
}
}
/* Set new color */
igsSetCursorColors (pScreen);
/* Set address for cursor bits */
offset = igss->cursor_offset;
offset >>= 10;
igsSet (igsvga, igs_sprite_addr, offset);
/* Assume TV interpolation off */
igsSet (igsvga, igs_hcshf, 3);
/* Enable the cursor */
igsSet (igsvga, igs_sprite_visible, 1);
igsSet (igsvga, igs_sprite_64x64, 1);
/* Move to new position */
_igsMoveCursor (pScreen, x, y);
VgaFlush (&igsvga->card);
}
static void
igsUnloadCursor (ScreenPtr pScreen)
{
SetupCursor (pScreen);
/* Disable cursor */
igsSet (igsvga, igs_sprite_visible, 0);
VgaFlush (&igsvga->card);
}
static Bool
igsRealizeCursor (ScreenPtr pScreen, CursorPtr pCursor)
{
SetupCursor(pScreen);
if (!pScreenPriv->enabled)
return TRUE;
/* miRecolorCursor does this */
if (pCurPriv->pCursor == pCursor)
{
if (pCursor)
{
int x, y;
miPointerPosition (&x, &y);
igsLoadCursor (pScreen, x, y);
}
}
return TRUE;
}
static Bool
igsUnrealizeCursor (ScreenPtr pScreen, CursorPtr pCursor)
{
return TRUE;
}
static void
igsSetCursor (ScreenPtr pScreen, CursorPtr pCursor, int x, int y)
{
SetupCursor(pScreen);
pCurPriv->pCursor = pCursor;
if (!pScreenPriv->enabled)
return;
if (pCursor)
igsLoadCursor (pScreen, x, y);
else
igsUnloadCursor (pScreen);
}
miPointerSpriteFuncRec igsPointerSpriteFuncs = {
igsRealizeCursor,
igsUnrealizeCursor,
igsSetCursor,
igsMoveCursor,
};
static void
igsQueryBestSize (int class,
unsigned short *pwidth, unsigned short *pheight,
ScreenPtr pScreen)
{
SetupCursor (pScreen);
switch (class)
{
case CursorShape:
if (*pwidth > pCurPriv->width)
*pwidth = pCurPriv->width;
if (*pheight > pCurPriv->height)
*pheight = pCurPriv->height;
if (*pwidth > pScreen->width)
*pwidth = pScreen->width;
if (*pheight > pScreen->height)
*pheight = pScreen->height;
break;
default:
fbQueryBestSize (class, pwidth, pheight, pScreen);
break;
}
}
Bool
igsCursorInit (ScreenPtr pScreen)
{
SetupCursor (pScreen);
if (!igss->cursor_base)
{
pCurPriv->has_cursor = FALSE;
return FALSE;
}
pCurPriv->width = IGS_CURSOR_WIDTH;
pCurPriv->height= IGS_CURSOR_HEIGHT;
pScreen->QueryBestSize = igsQueryBestSize;
miPointerInitialize (pScreen,
&igsPointerSpriteFuncs,
&kdPointerScreenFuncs,
FALSE);
pCurPriv->has_cursor = TRUE;
pCurPriv->pCursor = NULL;
return TRUE;
}
void
igsCursorEnable (ScreenPtr pScreen)
{
SetupCursor (pScreen);
if (pCurPriv->has_cursor)
{
if (pCurPriv->pCursor)
{
int x, y;
miPointerPosition (&x, &y);
igsLoadCursor (pScreen, x, y);
}
else
igsUnloadCursor (pScreen);
}
}
void
igsCursorDisable (ScreenPtr pScreen)
{
SetupCursor (pScreen);
if (!pScreenPriv->enabled)
return;
if (pCurPriv->has_cursor)
{
if (pCurPriv->pCursor)
{
igsUnloadCursor (pScreen);
}
}
}
void
igsCursorFini (ScreenPtr pScreen)
{
SetupCursor (pScreen);
pCurPriv->pCursor = NULL;
}

View File

@ -1,5 +1,5 @@
/* /*
* $XFree86$ * $XFree86: xc/programs/Xserver/hw/kdrive/igs/igsdraw.c,v 1.1 2000/05/06 22:17:43 keithp Exp $
* *
* Copyright © 2000 Keith Packard * Copyright © 2000 Keith Packard
* *
@ -72,6 +72,105 @@ CARD8 igsPatRop[16] = {
#define PixTransStore(t) *pix_trans = (t) #define PixTransStore(t) *pix_trans = (t)
#endif #endif
static IgsPattern *
igsSetPattern (ScreenPtr pScreen,
PixmapPtr pPixmap,
CARD8 fillStyle,
INT32 xrot,
INT32 yrot)
{
KdScreenPriv(pScreen);
igsCardInfo(pScreenPriv);
igsScreenInfo(pScreenPriv);
int i;
IgsPatternCache *c;
IgsPattern *p;
if (fillStyle == FillTiled)
c = &igss->tile;
else
c = &igss->stipple;
for (i = 0; i < IGS_NUM_PATTERN; i++)
{
p = &c->pattern[i];
if (p->serial_number == pPixmap->drawable.serialNumber &&
p->xrot == xrot &&
p->yrot == yrot)
{
return p;
}
}
p = &c->pattern[c->next];
if (++c->next == IGS_NUM_PATTERN)
c->next = 0;
p->serial_number = pPixmap->drawable.serialNumber;
p->xrot = xrot;
p->yrot = yrot;
if (fillStyle != FillTiled)
{
FbStip *pix;
FbStride pixStride;
int pixBpp;
CARD8 tmp[8];
CARD32 *pat;
int stipX, stipY;
int y;
FbStip bits;
modulus (-yrot, pPixmap->drawable.height, stipY);
modulus (-xrot, FB_UNIT, stipX);
pat = (CARD32 *) p->base;
fbGetStipDrawable (&pPixmap->drawable, pix, pixStride, pixBpp);
for (y = 0; y < 8; y++)
{
bits = pix[stipY * pixStride];
FbRotLeft (bits, stipX);
tmp[y] = (CARD8) bits;
stipY++;
if (stipY == pPixmap->drawable.height)
stipY = 0;
}
for (i = 0; i < 2; i++)
{
bits = (tmp[i*4+0] |
(tmp[i*4+1] << 8) |
(tmp[i*4+2] << 16) |
(tmp[i*4+3] << 24));
IgsAdjustBits32 (bits);
*pat++ = bits;
}
}
else
{
FbBits *pix;
FbStride pixStride;
int pixBpp;
FbBits *pat;
FbStride patStride;
int patBpp;
fbGetDrawable (&pPixmap->drawable, pix, pixStride, pixBpp);
pat = (FbBits *) p->base;
patBpp = pixBpp;
patStride = (patBpp * IGS_PATTERN_WIDTH) / (8 * sizeof (FbBits));
fbTile (pat, patStride, 0,
patBpp * IGS_PATTERN_WIDTH, IGS_PATTERN_HEIGHT,
pix, pixStride,
pPixmap->drawable.width * pixBpp,
pPixmap->drawable.height,
GXcopy, FB_ALLONES, pixBpp,
xrot * pixBpp, yrot);
}
return p;
}
void void
igsFillBoxSolid (DrawablePtr pDrawable, int nBox, BoxPtr pBox, igsFillBoxSolid (DrawablePtr pDrawable, int nBox, BoxPtr pBox,
unsigned long pixel, int alu, unsigned long planemask) unsigned long pixel, int alu, unsigned long planemask)
@ -88,6 +187,122 @@ igsFillBoxSolid (DrawablePtr pDrawable, int nBox, BoxPtr pBox,
KdMarkSync (pDrawable->pScreen); KdMarkSync (pDrawable->pScreen);
} }
void
igsFillBoxTiled (DrawablePtr pDrawable, int nBox, BoxPtr pBox,
PixmapPtr pPixmap, int xrot, int yrot, int alu)
{
SetupIgs(pDrawable->pScreen);
CARD32 cmd;
IgsPattern *p = igsSetPattern (pDrawable->pScreen,
pPixmap,
FillTiled,
xrot, yrot);
_igsSetTiledRect(cop,alu,planemask,p->offset,cmd);
while (nBox--)
{
_igsPatRect(cop,pBox->x1,pBox->y1,pBox->x2-pBox->x1,pBox->y2-pBox->y1,cmd);
pBox++;
}
KdMarkSync (pDrawable->pScreen);
}
void
igsFillBoxStippled (DrawablePtr pDrawable, GCPtr pGC,
int nBox, BoxPtr pBox)
{
SetupIgs(pDrawable->pScreen);
CARD32 cmd;
int xrot = pGC->patOrg.x + pDrawable->x;
int yrot = pGC->patOrg.y + pDrawable->y;
IgsPattern *p = igsSetPattern (pDrawable->pScreen,
pGC->stipple,
pGC->fillStyle,
xrot, yrot);
if (pGC->fillStyle == FillStippled)
{
_igsSetStippledRect (cop,pGC->alu,planemask,pGC->fgPixel,p->offset,cmd);
}
else
{
_igsSetOpaqueStippledRect (cop,pGC->alu,planemask,
pGC->fgPixel,pGC->bgPixel,p->offset,cmd);
}
while (nBox--)
{
_igsPatRect(cop,pBox->x1,pBox->y1,pBox->x2-pBox->x1,pBox->y2-pBox->y1,cmd);
pBox++;
}
KdMarkSync (pDrawable->pScreen);
}
void
igsStipple (ScreenPtr pScreen,
CARD32 cmd,
FbStip *psrcBase,
FbStride widthSrc,
int srcx,
int srcy,
int dstx,
int dsty,
int width,
int height)
{
SetupIgs(pScreen);
FbStip *psrcLine, *psrc;
FbStride widthRest;
FbStip bits, tmp, lastTmp;
int leftShift, rightShift;
int nl, nlMiddle;
int r;
PixTransDeclare;
/* Compute blt address and parameters */
psrc = psrcBase + srcy * widthSrc + (srcx >> 5);
nlMiddle = (width + 31) >> 5;
leftShift = srcx & 0x1f;
rightShift = 32 - leftShift;
widthRest = widthSrc - nlMiddle;
_igsPlaneBlt(cop,dstx,dsty,width,height,cmd);
if (leftShift == 0)
{
while (height--)
{
nl = nlMiddle;
PixTransStart(nl);
while (nl--)
{
tmp = *psrc++;
IgsAdjustBits32 (tmp);
PixTransStore (tmp);
}
psrc += widthRest;
}
}
else
{
widthRest--;
while (height--)
{
bits = *psrc++;
nl = nlMiddle;
PixTransStart(nl);
while (nl--)
{
tmp = FbStipLeft(bits, leftShift);
bits = *psrc++;
tmp |= FbStipRight(bits, rightShift);
IgsAdjustBits32(tmp);
PixTransStore (tmp);
}
psrc += widthRest;
}
}
}
void void
igsCopyNtoN (DrawablePtr pSrcDrawable, igsCopyNtoN (DrawablePtr pSrcDrawable,
DrawablePtr pDstDrawable, DrawablePtr pDstDrawable,
@ -164,6 +379,134 @@ igsCopyArea(DrawablePtr pSrcDrawable, DrawablePtr pDstDrawable, GCPtr pGC,
srcx, srcy, width, height, dstx, dsty); srcx, srcy, width, height, dstx, dsty);
} }
typedef struct _igs1toNargs {
unsigned long copyPlaneFG, copyPlaneBG;
Bool opaque;
} igs1toNargs;
void
igsCopy1toN (DrawablePtr pSrcDrawable,
DrawablePtr pDstDrawable,
GCPtr pGC,
BoxPtr pbox,
int nbox,
int dx,
int dy,
Bool reverse,
Bool upsidedown,
Pixel bitplane,
void *closure)
{
SetupIgs(pDstDrawable->pScreen);
igs1toNargs *args = closure;
int dstx, dsty;
FbStip *psrcBase;
FbStride widthSrc;
int srcBpp;
CARD32 cmd;
if (args->opaque && sourceInvarient (pGC->alu))
{
igsFillBoxSolid (pDstDrawable, nbox, pbox,
pGC->bgPixel, pGC->alu, pGC->planemask);
return;
}
fbGetStipDrawable (pSrcDrawable, psrcBase, widthSrc, srcBpp);
if (args->opaque)
{
_igsSetOpaquePlaneBlt (cop, pGC->alu, pGC->planemask, args->copyPlaneFG,
args->copyPlaneBG, cmd);
}
else
{
_igsSetTransparentPlaneBlt (cop, pGC->alu, pGC->planemask,
args->copyPlaneFG, cmd);
}
while (nbox--)
{
dstx = pbox->x1;
dsty = pbox->y1;
igsStipple (pDstDrawable->pScreen, cmd,
psrcBase, widthSrc,
dstx + dx, dsty + dy,
dstx, dsty,
pbox->x2 - dstx, pbox->y2 - dsty);
pbox++;
}
KdMarkSync (pDstDrawable->pScreen);
}
RegionPtr
igsCopyPlane (DrawablePtr pSrcDrawable,
DrawablePtr pDstDrawable,
GCPtr pGC,
int srcx,
int srcy,
int width,
int height,
int dstx,
int dsty,
unsigned long bitPlane)
{
RegionPtr ret;
igs1toNargs args;
FbBits depthMask;
depthMask = FbFullMask (pDstDrawable->depth);
if ((pGC->planemask & depthMask) == depthMask &&
pDstDrawable->type == DRAWABLE_WINDOW &&
pSrcDrawable->depth == 1)
{
args.copyPlaneFG = pGC->fgPixel;
args.copyPlaneBG = pGC->bgPixel;
args.opaque = TRUE;
return fbDoCopy (pSrcDrawable, pDstDrawable, pGC,
srcx, srcy, width, height,
dstx, dsty, igsCopy1toN, bitPlane, &args);
}
return KdCheckCopyPlane(pSrcDrawable, pDstDrawable, pGC,
srcx, srcy, width, height,
dstx, dsty, bitPlane);
}
#if 0
/* would you believe this is slower than fb? */
void
igsPushPixels (GCPtr pGC,
PixmapPtr pBitmap,
DrawablePtr pDrawable,
int w,
int h,
int x,
int y)
{
igs1toNargs args;
FbBits depthMask;
depthMask = FbFullMask (pDstDrawable->depth);
if ((pGC->planemask & depthMask) == depthMask &&
pDrawable->type == DRAWABLE_WINDOW &&
pGC->fillStyle == FillSolid)
{
args.opaque = FALSE;
args.copyPlaneFG = pGC->fgPixel;
(void) fbDoCopy ((DrawablePtr) pBitmap, pDrawable, pGC,
0, 0, w, h, x, y, igsCopy1toN, 1, &args);
}
else
{
KdCheckPushPixels (pGC, pBitmap, pDrawable, w, h, x, y);
}
}
#else
#define igsPushPixels KdCheckPushPixels
#endif
BOOL BOOL
igsFillOk (GCPtr pGC) igsFillOk (GCPtr pGC)
{ {
@ -175,7 +518,6 @@ igsFillOk (GCPtr pGC)
switch (pGC->fillStyle) { switch (pGC->fillStyle) {
case FillSolid: case FillSolid:
return TRUE; return TRUE;
#if 0
case FillTiled: case FillTiled:
return (igsPatternDimOk (pGC->tile.pixmap->drawable.width) && return (igsPatternDimOk (pGC->tile.pixmap->drawable.width) &&
igsPatternDimOk (pGC->tile.pixmap->drawable.height)); igsPatternDimOk (pGC->tile.pixmap->drawable.height));
@ -183,7 +525,6 @@ igsFillOk (GCPtr pGC)
case FillOpaqueStippled: case FillOpaqueStippled:
return (igsPatternDimOk (pGC->stipple->drawable.width) && return (igsPatternDimOk (pGC->stipple->drawable.width) &&
igsPatternDimOk (pGC->stipple->drawable.height)); igsPatternDimOk (pGC->stipple->drawable.height));
#endif
} }
return FALSE; return FALSE;
} }
@ -200,6 +541,7 @@ igsFillSpans (DrawablePtr pDrawable, GCPtr pGC, int n,
int nTmp; int nTmp;
INT16 x, y; INT16 x, y;
int width; int width;
IgsPattern *p;
if (!igsFillOk (pGC)) if (!igsFillOk (pGC))
{ {
@ -224,17 +566,31 @@ igsFillSpans (DrawablePtr pDrawable, GCPtr pGC, int n,
case FillSolid: case FillSolid:
_igsSetSolidRect(cop,pGC->alu,pGC->planemask,pGC->fgPixel,cmd); _igsSetSolidRect(cop,pGC->alu,pGC->planemask,pGC->fgPixel,cmd);
break; break;
#if 0
case FillTiled: case FillTiled:
cmd = igsTilePrepare (pGC->tile.pixmap, p = igsSetPattern (pDrawable->pScreen,
pGC->tile.pixmap,
FillTiled,
pGC->patOrg.x + pDrawable->x, pGC->patOrg.x + pDrawable->x,
pGC->patOrg.y + pDrawable->y, pGC->patOrg.y + pDrawable->y);
pGC->alu); _igsSetTiledRect (cop,pGC->alu,pGC->planemask,p->offset,cmd);
break; break;
default: default:
cmd = igsStipplePrepare (pDrawable, pGC); p = igsSetPattern (pDrawable->pScreen,
pGC->stipple,
pGC->fillStyle,
pGC->patOrg.x + pDrawable->x,
pGC->patOrg.y + pDrawable->y);
if (pGC->fillStyle == FillStippled)
{
_igsSetStippledRect (cop,pGC->alu,pGC->planemask,
pGC->fgPixel,p->offset,cmd);
}
else
{
_igsSetOpaqueStippledRect (cop,pGC->alu,pGC->planemask,
pGC->fgPixel,pGC->bgPixel,p->offset,cmd);
}
break; break;
#endif
} }
while (n--) while (n--)
{ {
@ -244,7 +600,7 @@ igsFillSpans (DrawablePtr pDrawable, GCPtr pGC, int n,
width = *pwidth++; width = *pwidth++;
if (width) if (width)
{ {
_igsRect(cop,x,y,width,1,cmd); _igsPatRect(cop,x,y,width,1,cmd);
} }
} }
DEALLOCATE_LOCAL(pptFree); DEALLOCATE_LOCAL(pptFree);
@ -407,7 +763,6 @@ igsPolyFillRect (DrawablePtr pDrawable, GCPtr pGC,
pboxClipped-pboxClippedBase, pboxClippedBase, pboxClipped-pboxClippedBase, pboxClippedBase,
pGC->fgPixel, pGC->alu, pGC->planemask); pGC->fgPixel, pGC->alu, pGC->planemask);
break; break;
#if 0
case FillTiled: case FillTiled:
igsFillBoxTiled(pDrawable, igsFillBoxTiled(pDrawable,
pboxClipped-pboxClippedBase, pboxClippedBase, pboxClipped-pboxClippedBase, pboxClippedBase,
@ -418,10 +773,9 @@ igsPolyFillRect (DrawablePtr pDrawable, GCPtr pGC,
break; break;
case FillStippled: case FillStippled:
case FillOpaqueStippled: case FillOpaqueStippled:
igsFillBoxStipple (pDrawable, pGC, igsFillBoxStippled (pDrawable, pGC,
pboxClipped-pboxClippedBase, pboxClippedBase); pboxClipped-pboxClippedBase, pboxClippedBase);
break; break;
#endif
} }
} }
if (pboxClippedBase != stackRects) if (pboxClippedBase != stackRects)
@ -834,6 +1188,12 @@ igsPolyGlyphBlt (DrawablePtr pDrawable,
CharInfoPtr *ppci, CharInfoPtr *ppci,
pointer pglyphBase) pointer pglyphBase)
{ {
if (pGC->fillStyle != FillSolid ||
fbGetGCPrivate(pGC)->pm != FB_ALLONES)
{
KdCheckPolyGlyphBlt (pDrawable, pGC, x, y, nglyph, ppci, pglyphBase);
return;
}
x += pDrawable->x; x += pDrawable->x;
y += pDrawable->y; y += pDrawable->y;
@ -860,6 +1220,11 @@ igsImageGlyphBlt (DrawablePtr pDrawable,
CharInfoPtr *ppci, CharInfoPtr *ppci,
pointer pglyphBase) pointer pglyphBase)
{ {
if (fbGetGCPrivate(pGC)->pm != FB_ALLONES)
{
KdCheckImageGlyphBlt (pDrawable, pGC, x, y, nglyph, ppci, pglyphBase);
return;
}
x += pDrawable->x; x += pDrawable->x;
y += pDrawable->y; y += pDrawable->y;
@ -878,12 +1243,48 @@ igsImageGlyphBlt (DrawablePtr pDrawable,
} }
} }
static void
igsInvalidatePattern (IgsPatternCache *c,
PixmapPtr pPixmap)
{
int i;
if (c->base)
{
for (i = 0; i < IGS_NUM_PATTERN; i++)
{
if (c->pattern[i].serial_number == pPixmap->drawable.serialNumber)
c->pattern[i].serial_number = ~0;
}
}
}
static void
igsInitPattern (IgsPatternCache *c, int bsize, int psize)
{
int i;
int boffset;
int poffset;
for (i = 0; i < IGS_NUM_PATTERN; i++)
{
boffset = i * bsize;
poffset = i * psize;
c->pattern[i].xrot = -1;
c->pattern[i].yrot = -1;
c->pattern[i].serial_number = ~0;
c->pattern[i].offset = c->offset + poffset;
c->pattern[i].base = c->base + boffset;
}
c->next = 0;
}
static const GCOps igsOps = { static const GCOps igsOps = {
igsFillSpans, igsFillSpans,
KdCheckSetSpans, KdCheckSetSpans,
KdCheckPutImage, KdCheckPutImage,
igsCopyArea, igsCopyArea,
KdCheckCopyPlane, igsCopyPlane,
KdCheckPolyPoint, KdCheckPolyPoint,
KdCheckPolylines, KdCheckPolylines,
KdCheckPolySegment, KdCheckPolySegment,
@ -898,7 +1299,7 @@ static const GCOps igsOps = {
miImageText16, miImageText16,
igsImageGlyphBlt, igsImageGlyphBlt,
igsPolyGlyphBlt, igsPolyGlyphBlt,
KdCheckPushPixels, igsPushPixels,
#ifdef NEED_LINEHELPER #ifdef NEED_LINEHELPER
,NULL ,NULL
#endif #endif
@ -985,7 +1386,6 @@ igsPaintWindow(WindowPtr pWin, RegionPtr pRegion, int what)
(*pWin->drawable.pScreen->PaintWindowBackground)(pWin, pRegion, (*pWin->drawable.pScreen->PaintWindowBackground)(pWin, pRegion,
what); what);
return; return;
#if 0
case BackgroundPixmap: case BackgroundPixmap:
pTile = pWin->background.pixmap; pTile = pWin->background.pixmap;
if (igsPatternDimOk (pTile->drawable.width) && if (igsPatternDimOk (pTile->drawable.width) &&
@ -999,7 +1399,6 @@ igsPaintWindow(WindowPtr pWin, RegionPtr pRegion, int what)
return; return;
} }
break; break;
#endif
case BackgroundPixel: case BackgroundPixel:
igsFillBoxSolid((DrawablePtr)pWin, igsFillBoxSolid((DrawablePtr)pWin,
(int)REGION_NUM_RECTS(pRegion), (int)REGION_NUM_RECTS(pRegion),
@ -1017,7 +1416,6 @@ igsPaintWindow(WindowPtr pWin, RegionPtr pRegion, int what)
pWin->border.pixel, GXcopy, ~0); pWin->border.pixel, GXcopy, ~0);
return; return;
} }
#if 0
else else
{ {
pTile = pWin->border.pixmap; pTile = pWin->border.pixmap;
@ -1032,7 +1430,6 @@ igsPaintWindow(WindowPtr pWin, RegionPtr pRegion, int what)
return; return;
} }
} }
#endif
break; break;
} }
KdCheckPaintWindow (pWin, pRegion, what); KdCheckPaintWindow (pWin, pRegion, what);
@ -1041,6 +1438,15 @@ igsPaintWindow(WindowPtr pWin, RegionPtr pRegion, int what)
Bool Bool
igsDrawInit (ScreenPtr pScreen) igsDrawInit (ScreenPtr pScreen)
{ {
KdScreenPriv(pScreen);
igsCardInfo(pScreenPriv);
igsScreenInfo(pScreenPriv);
int i;
int pattern_size;
int boffset, poffset;
KdScreenInitAsync (pScreen);
/* /*
* Replace various fb screen functions * Replace various fb screen functions
*/ */
@ -1049,8 +1455,20 @@ igsDrawInit (ScreenPtr pScreen)
pScreen->PaintWindowBackground = igsPaintWindow; pScreen->PaintWindowBackground = igsPaintWindow;
pScreen->PaintWindowBorder = igsPaintWindow; pScreen->PaintWindowBorder = igsPaintWindow;
KdScreenInitAsync (pScreen); /*
* Initialize patterns
*/
if (igss->tile.base)
{
pattern_size = IgsTileSize(pScreenPriv->screen->fb[0].bitsPerPixel);
igsInitPattern (&igss->tile,
pattern_size,
pattern_size * 8 / pScreenPriv->screen->fb[0].bitsPerPixel);
pattern_size = IgsStippleSize(pScreenPriv->screen->fb[0].bitsPerPixel);
igsInitPattern (&igss->stipple,
pattern_size,
pattern_size * 8 / pScreenPriv->screen->fb[0].bitsPerPixel);
}
return TRUE; return TRUE;
} }

View File

@ -1,5 +1,5 @@
/* /*
* $XFree86$ * $XFree86: xc/programs/Xserver/hw/kdrive/igs/igsdraw.h,v 1.1 2000/05/06 22:17:43 keithp Exp $
* *
* Copyright © 2000 Keith Packard * Copyright © 2000 Keith Packard
* *
@ -46,9 +46,13 @@ extern CARD8 igsPatRop[];
IGS_CONTROL_MALLWBEPTZ), \ IGS_CONTROL_MALLWBEPTZ), \
0) 0)
#if 1
#define _igsWaitFull(cop) _igsWaitLoop(cop, \ #define _igsWaitFull(cop) _igsWaitLoop(cop, \
IGS_CONTROL_CMDFF, \ IGS_CONTROL_CMDFF, \
0) 0)
#else
#define _igsWaitFull(cop) _igsWaitDone(cop)
#endif
#define _igsWaitIdleEmpty(cop) _igsWaitDone(cop) #define _igsWaitIdleEmpty(cop) _igsWaitDone(cop)
#define _igsWaitHostBltAck(cop) _igsWaitLoop(cop, \ #define _igsWaitHostBltAck(cop) _igsWaitLoop(cop, \
@ -76,13 +80,27 @@ extern CARD8 igsPatRop[];
v = ((v & 0x0f) << 4) | ((v >> 4) & 0x0f); \ v = ((v & 0x0f) << 4) | ((v >> 4) & 0x0f); \
} }
#define IgsByteSwap32(x) ((x) = (((x) >> 24) | \
(((x) >> 8) & 0xff00) | \
(((x) << 8) & 0xff0000) | \
((x) << 24)))
#define IgsByteSwap16(x) ((x) = ((x) << 8) | ((x) >> 8))
#define igsPatternDimOk(d) ((d) <= IGS_PATTERN_WIDTH && (((d) & ((d) - 1)) == 0))
#if BITMAP_BIT_ORDER == LSBFirst
#define IgsAdjustBits32(b) IgsInvertBits32(b) #define IgsAdjustBits32(b) IgsInvertBits32(b)
#define IgsAdjustBits16(x) IgsInvertBits16(x)
#else
#define IgsAdjustBits32(x) IgsByteSwap32(x)
#define IgsAdjustBits16(x) IgsByteSwap16(x)
#endif
#define _igsSetSolidRect(cop,alu,pm,pix,cmd) {\ #define _igsSetSolidRect(cop,alu,pm,pix,cmd) {\
_igsWaitFull(cop); \ _igsWaitFull(cop); \
(cop)->mix = IGS_MAKE_MIX(alu,alu); \ (cop)->mix = IGS_MAKE_MIX(alu,alu); \
(cop)->fg = (pix); \ (cop)->fg = (pix); \
(cop)->planemask = (pm); \
(cmd) = (IGS_DRAW_T_B | \ (cmd) = (IGS_DRAW_T_B | \
IGS_DRAW_L_R | \ IGS_DRAW_L_R | \
IGS_DRAW_ALL | \ IGS_DRAW_ALL | \
@ -94,6 +112,55 @@ extern CARD8 igsPatRop[];
IGS_BGS_BG); \ IGS_BGS_BG); \
} }
#define _igsSetTiledRect(cop,alu,pm,base,cmd) {\
_igsWaitFull(cop); \
(cop)->mix = IGS_MAKE_MIX(alu,alu); \
(cop)->src1_stride = IGS_PATTERN_WIDTH - 1; \
(cop)->src1_start = (base); \
(cmd) = (IGS_DRAW_T_B | \
IGS_DRAW_L_R | \
IGS_DRAW_ALL | \
IGS_PIXEL_TILE | \
IGS_HBLT_DISABLE | \
IGS_SRC2_NORMAL | \
IGS_STEP_PXBLT | \
IGS_FGS_SRC | \
IGS_BGS_BG); \
}
#define _igsSetStippledRect(cop,alu,pm,pix,base,cmd) {\
_igsWaitFull(cop); \
(cop)->mix = IGS_MAKE_MIX(alu,alu); \
(cop)->src1_start = (base); \
(cop)->fg = (pix); \
(cmd) = (IGS_DRAW_T_B | \
IGS_DRAW_L_R | \
IGS_DRAW_ALL | \
IGS_PIXEL_STIP_TRANS | \
IGS_HBLT_DISABLE | \
IGS_SRC2_NORMAL | \
IGS_STEP_PXBLT | \
IGS_FGS_FG | \
IGS_BGS_BG); \
}
#define _igsSetOpaqueStippledRect(cop,alu,pm,_fg,_bg,base,cmd) {\
_igsWaitFull(cop); \
(cop)->mix = IGS_MAKE_MIX(alu,alu); \
(cop)->src1_start = (base); \
(cop)->fg = (_fg); \
(cop)->bg = (_bg); \
(cmd) = (IGS_DRAW_T_B | \
IGS_DRAW_L_R | \
IGS_DRAW_ALL | \
IGS_PIXEL_STIP_OPAQUE | \
IGS_HBLT_DISABLE | \
IGS_SRC2_NORMAL | \
IGS_STEP_PXBLT | \
IGS_FGS_FG | \
IGS_BGS_BG); \
}
#define _igsRect(cop,x,y,w,h,cmd) { \ #define _igsRect(cop,x,y,w,h,cmd) { \
_igsWaitFull(cop); \ _igsWaitFull(cop); \
(cop)->dst_start = (x) + (y) * (cop_stride); \ (cop)->dst_start = (x) + (y) * (cop_stride); \
@ -101,10 +168,17 @@ extern CARD8 igsPatRop[];
(cop)->operation = (cmd); \ (cop)->operation = (cmd); \
} }
#define _igsPatRect(cop,x,y,w,h,cmd) { \
_igsWaitFull(cop); \
(cop)->dst_start = (x) + (y) * (cop_stride); \
(cop)->rotate = IGS_MAKE_ROTATE(x&7,y&7); \
(cop)->dim = IGS_MAKE_DIM(w-1,h-1); \
(cop)->operation = (cmd); \
}
#define _igsSetBlt(cop,alu,pm,backwards,upsidedown,cmd) { \ #define _igsSetBlt(cop,alu,pm,backwards,upsidedown,cmd) { \
_igsWaitFull(cop); \ _igsWaitFull(cop); \
(cop)->mix = IGS_MAKE_MIX(alu,GXnoop); \ (cop)->mix = IGS_MAKE_MIX(alu,alu); \
(cop)->planemask = (pm); \
(cop)->src1_stride = cop_stride - 1; \ (cop)->src1_stride = cop_stride - 1; \
(cmd) = (IGS_DRAW_ALL | \ (cmd) = (IGS_DRAW_ALL | \
IGS_PIXEL_FG | \ IGS_PIXEL_FG | \
@ -134,9 +208,8 @@ extern CARD8 igsPatRop[];
#define _igsSetTransparentPlaneBlt(cop,alu,pm,fg_pix,cmd) { \ #define _igsSetTransparentPlaneBlt(cop,alu,pm,fg_pix,cmd) { \
_igsWaitIdleEmpty(cop); \ _igsWaitIdleEmpty(cop); \
_igsPreparePlaneBlt(cop); \ _igsPreparePlaneBlt(cop); \
(cop)->mix = IGS_MAKE_MIX(igsPatRop[alu],igsPatRop[GXnoop]); \ (cop)->mix = IGS_MAKE_MIX(igsPatRop[alu],igsPatRop[alu]); \
(cop)->fg = (fg_pix); \ (cop)->fg = (fg_pix); \
(cop)->planemask = (pm); \
(cmd) = (IGS_DRAW_T_B | \ (cmd) = (IGS_DRAW_T_B | \
IGS_DRAW_L_R | \ IGS_DRAW_L_R | \
IGS_DRAW_ALL | \ IGS_DRAW_ALL | \
@ -152,7 +225,6 @@ extern CARD8 igsPatRop[];
_igsWaitIdleEmpty(cop); \ _igsWaitIdleEmpty(cop); \
_igsPreparePlaneBlt(cop); \ _igsPreparePlaneBlt(cop); \
(cop)->mix = IGS_MAKE_MIX(igsPatRop[alu],igsPatRop[alu]); \ (cop)->mix = IGS_MAKE_MIX(igsPatRop[alu],igsPatRop[alu]); \
(cop)->planemask = (pm); \
(cop)->fg = (fg_pix); \ (cop)->fg = (fg_pix); \
(cop)->bg = (bg_pix); \ (cop)->bg = (bg_pix); \
(cmd) = (IGS_DRAW_T_B | \ (cmd) = (IGS_DRAW_T_B | \

968
hw/kdrive/igs/igsreg.c Normal file
View File

@ -0,0 +1,968 @@
/*
* $XFree86$
*
* Copyright © 2000 Keith Packard
*
* Permission to use, copy, modify, distribute, and sell this software and its
* documentation for any purpose is hereby granted without fee, provided that
* the above copyright notice appear in all copies and that both that
* copyright notice and this permission notice appear in supporting
* documentation, and that the name of Keith Packard not be used in
* advertising or publicity pertaining to distribution of the software without
* specific, written prior permission. Keith Packard makes no
* representations about the suitability of this software for any purpose. It
* is provided "as is" without express or implied warranty.
*
* KEITH PACKARD DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
* INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
* EVENT SHALL KEITH PACKARD BE LIABLE FOR ANY SPECIAL, INDIRECT OR
* CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
* DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
* TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
* PERFORMANCE OF THIS SOFTWARE.
*/
#include "igsreg.h"
#include <stdio.h>
#define CR00 IGS_CR+0x00
#define CR01 IGS_CR+0x01
#define CR02 IGS_CR+0x02
#define CR03 IGS_CR+0x03
#define CR04 IGS_CR+0x04
#define CR05 IGS_CR+0x05
#define CR06 IGS_CR+0x06
#define CR07 IGS_CR+0x07
#define CR08 IGS_CR+0x08
#define CR09 IGS_CR+0x09
#define CR0A IGS_CR+0x0A
#define CR0B IGS_CR+0x0B
#define CR0C IGS_CR+0x0C
#define CR0D IGS_CR+0x0D
#define CR0E IGS_CR+0x0E
#define CR0F IGS_CR+0x0F
#define CR10 IGS_CR+0x10
#define CR11 IGS_CR+0x11
#define CR12 IGS_CR+0x12
#define CR13 IGS_CR+0x13
#define CR14 IGS_CR+0x14
#define CR15 IGS_CR+0x15
#define CR16 IGS_CR+0x16
#define CR17 IGS_CR+0x17
#define CR18 IGS_CR+0x18
#define CR19 IGS_CR+0x19
#define CR1A IGS_CR+0x1A
#define CR1B IGS_CR+0x1B
#define CR1C IGS_CR+0x1C
#define CR1D IGS_CR+0x1D
#define CR1E IGS_CR+0x1E
#define CR1F IGS_CR+0x1F
#define CR20 IGS_CR+0x20
#define CR21 IGS_CR+0x21
#define CR22 IGS_CR+0x22
#define CR23 IGS_CR+0x23
#define CR24 IGS_CR+0x24
#define CR25 IGS_CR+0x25
#define CR26 IGS_CR+0x26
#define CR27 IGS_CR+0x27
#define CR28 IGS_CR+0x28
#define CR29 IGS_CR+0x29
#define CR2A IGS_CR+0x2A
#define CR2B IGS_CR+0x2B
#define CR2C IGS_CR+0x2C
#define CR2D IGS_CR+0x2D
#define CR2E IGS_CR+0x2E
#define CR2F IGS_CR+0x2F
#define CR30 IGS_CR+0x30
#define CR31 IGS_CR+0x31
#define CR32 IGS_CR+0x32
#define CR33 IGS_CR+0x33
#define CR34 IGS_CR+0x34
#define CR35 IGS_CR+0x35
#define CR36 IGS_CR+0x36
#define CR37 IGS_CR+0x37
#define CR38 IGS_CR+0x38
#define CR39 IGS_CR+0x39
#define CR3A IGS_CR+0x3A
#define CR3B IGS_CR+0x3B
#define CR3C IGS_CR+0x3C
#define CR3D IGS_CR+0x3D
#define CR3E IGS_CR+0x3E
#define CR3F IGS_CR+0x3F
#define CR40 IGS_CR+0x40
#define CR41 IGS_CR+0x41
#define CR42 IGS_CR+0x42
#define CR43 IGS_CR+0x43
#define CR44 IGS_CR+0x44
#define CR45 IGS_CR+0x45
#define CR46 IGS_CR+0x46
#define CR47 IGS_CR+0x47
#define CR48 IGS_CR+0x48
#define CR_FIRST CR00
#define CR_LAST CR48
#define SR00 IGS_SR+0x00
#define SR01 IGS_SR+0x01
#define SR02 IGS_SR+0x02
#define SR03 IGS_SR+0x03
#define SR04 IGS_SR+0x04
#define SR_FIRST SR00
#define SR_LAST SR04
#define AR00 IGS_AR+0x00
#define AR01 IGS_AR+0x01
#define AR02 IGS_AR+0x02
#define AR03 IGS_AR+0x03
#define AR04 IGS_AR+0x04
#define AR05 IGS_AR+0x05
#define AR06 IGS_AR+0x06
#define AR07 IGS_AR+0x07
#define AR08 IGS_AR+0x08
#define AR09 IGS_AR+0x09
#define AR0A IGS_AR+0x0A
#define AR0B IGS_AR+0x0B
#define AR0C IGS_AR+0x0C
#define AR0D IGS_AR+0x0D
#define AR0E IGS_AR+0x0E
#define AR0F IGS_AR+0x0F
#define AR10 IGS_AR+0x10
#define AR11 IGS_AR+0x11
#define AR12 IGS_AR+0x12
#define AR13 IGS_AR+0x13
#define AR14 IGS_AR+0x14
#define AR_FIRST AR00
#define AR_LAST AR14
#define GR00 IGS_GR+0x00
#define GR01 IGS_GR+0x01
#define GR02 IGS_GR+0x02
#define GR03 IGS_GR+0x03
#define GR04 IGS_GR+0x04
#define GR05 IGS_GR+0x05
#define GR06 IGS_GR+0x06
#define GR07 IGS_GR+0x07
#define GR08 IGS_GR+0x08
#define GR09 IGS_GR+0x09
#define GR0A IGS_GR+0x0A
#define GR0B IGS_GR+0x0B
#define GR0C IGS_GR+0x0C
#define GR0D IGS_GR+0x0D
#define GR0E IGS_GR+0x0E
#define GR0F IGS_GR+0x0F
#define GR10 IGS_GR+0x10
#define GR11 IGS_GR+0x11
#define GR12 IGS_GR+0x12
#define GR13 IGS_GR+0x13
#define GR14 IGS_GR+0x14
#define GR15 IGS_GR+0x15
#define GR16 IGS_GR+0x16
#define GR17 IGS_GR+0x17
#define GR18 IGS_GR+0x18
#define GR19 IGS_GR+0x19
#define GR1A IGS_GR+0x1A
#define GR1B IGS_GR+0x1B
#define GR1C IGS_GR+0x1C
#define GR1D IGS_GR+0x1D
#define GR1E IGS_GR+0x1E
#define GR1F IGS_GR+0x1F
#define GR20 IGS_GR+0x20
#define GR21 IGS_GR+0x21
#define GR22 IGS_GR+0x22
#define GR23 IGS_GR+0x23
#define GR24 IGS_GR+0x24
#define GR25 IGS_GR+0x25
#define GR26 IGS_GR+0x26
#define GR27 IGS_GR+0x27
#define GR28 IGS_GR+0x28
#define GR29 IGS_GR+0x29
#define GR2A IGS_GR+0x2A
#define GR2B IGS_GR+0x2B
#define GR2C IGS_GR+0x2C
#define GR2D IGS_GR+0x2D
#define GR2E IGS_GR+0x2E
#define GR2F IGS_GR+0x2F
#define GR30 IGS_GR+0x30
#define GR31 IGS_GR+0x31
#define GR32 IGS_GR+0x32
#define GR33 IGS_GR+0x33
#define GR34 IGS_GR+0x34
#define GR35 IGS_GR+0x35
#define GR36 IGS_GR+0x36
#define GR37 IGS_GR+0x37
#define GR38 IGS_GR+0x38
#define GR39 IGS_GR+0x39
#define GR3A IGS_GR+0x3A
#define GR3B IGS_GR+0x3B
#define GR3C IGS_GR+0x3C
#define GR3D IGS_GR+0x3D
#define GR3E IGS_GR+0x3E
#define GR3F IGS_GR+0x3F
#define GR40 IGS_GR+0x40
#define GR41 IGS_GR+0x41
#define GR42 IGS_GR+0x42
#define GR43 IGS_GR+0x43
#define GR44 IGS_GR+0x44
#define GR45 IGS_GR+0x45
#define GR46 IGS_GR+0x46
#define GR47 IGS_GR+0x47
#define GR48 IGS_GR+0x48
#define GR49 IGS_GR+0x49
#define GR4A IGS_GR+0x4A
#define GR4B IGS_GR+0x4B
#define GR4C IGS_GR+0x4C
#define GR4D IGS_GR+0x4D
#define GR4E IGS_GR+0x4E
#define GR4F IGS_GR+0x4F
#define GR50 IGS_GR+0x50
#define GR51 IGS_GR+0x51
#define GR52 IGS_GR+0x52
#define GR53 IGS_GR+0x53
#define GR54 IGS_GR+0x54
#define GR55 IGS_GR+0x55
#define GR56 IGS_GR+0x56
#define GR57 IGS_GR+0x57
#define GR58 IGS_GR+0x58
#define GR59 IGS_GR+0x59
#define GR5A IGS_GR+0x5A
#define GR5B IGS_GR+0x5B
#define GR5C IGS_GR+0x5C
#define GR5D IGS_GR+0x5D
#define GR5E IGS_GR+0x5E
#define GR5F IGS_GR+0x5F
#define GR60 IGS_GR+0x60
#define GR61 IGS_GR+0x61
#define GR62 IGS_GR+0x62
#define GR63 IGS_GR+0x63
#define GR64 IGS_GR+0x64
#define GR65 IGS_GR+0x65
#define GR66 IGS_GR+0x66
#define GR67 IGS_GR+0x67
#define GR68 IGS_GR+0x68
#define GR69 IGS_GR+0x69
#define GR6A IGS_GR+0x6A
#define GR6B IGS_GR+0x6B
#define GR6C IGS_GR+0x6C
#define GR6D IGS_GR+0x6D
#define GR6E IGS_GR+0x6E
#define GR6F IGS_GR+0x6F
#define GR70 IGS_GR+0x70
#define GR71 IGS_GR+0x71
#define GR72 IGS_GR+0x72
#define GR73 IGS_GR+0x73
#define GR74 IGS_GR+0x74
#define GR75 IGS_GR+0x75
#define GR76 IGS_GR+0x76
#define GR77 IGS_GR+0x77
#define GR78 IGS_GR+0x78
#define GR79 IGS_GR+0x79
#define GR7A IGS_GR+0x7A
#define GR7B IGS_GR+0x7B
#define GR7C IGS_GR+0x7C
#define GR7D IGS_GR+0x7D
#define GR7E IGS_GR+0x7E
#define GR7F IGS_GR+0x7F
#define GR80 IGS_GR+0x80
#define GR81 IGS_GR+0x81
#define GR82 IGS_GR+0x82
#define GR83 IGS_GR+0x83
#define GR84 IGS_GR+0x84
#define GR85 IGS_GR+0x85
#define GR86 IGS_GR+0x86
#define GR87 IGS_GR+0x87
#define GR88 IGS_GR+0x88
#define GR89 IGS_GR+0x89
#define GR8A IGS_GR+0x8A
#define GR8B IGS_GR+0x8B
#define GR8C IGS_GR+0x8C
#define GR8D IGS_GR+0x8D
#define GR8E IGS_GR+0x8E
#define GR8F IGS_GR+0x8F
#define GR90 IGS_GR+0x90
#define GR91 IGS_GR+0x91
#define GR92 IGS_GR+0x92
#define GR93 IGS_GR+0x93
#define GR94 IGS_GR+0x94
#define GR95 IGS_GR+0x95
#define GR96 IGS_GR+0x96
#define GR97 IGS_GR+0x97
#define GR98 IGS_GR+0x98
#define GR99 IGS_GR+0x99
#define GR9A IGS_GR+0x9A
#define GR9B IGS_GR+0x9B
#define GR9C IGS_GR+0x9C
#define GR9D IGS_GR+0x9D
#define GR9E IGS_GR+0x9E
#define GR9F IGS_GR+0x9F
#define GRA0 IGS_GR+0xA0
#define GRA1 IGS_GR+0xA1
#define GRA2 IGS_GR+0xA2
#define GRA3 IGS_GR+0xA3
#define GRA4 IGS_GR+0xA4
#define GRA5 IGS_GR+0xA5
#define GRA6 IGS_GR+0xA6
#define GRA7 IGS_GR+0xA7
#define GRA8 IGS_GR+0xA8
#define GRA9 IGS_GR+0xA9
#define GRAA IGS_GR+0xAA
#define GRAB IGS_GR+0xAB
#define GRAC IGS_GR+0xAC
#define GRAD IGS_GR+0xAD
#define GRAE IGS_GR+0xAE
#define GRAF IGS_GR+0xAF
#define GRB0 IGS_GR+0xB0
#define GRB1 IGS_GR+0xB1
#define GRB2 IGS_GR+0xB2
#define GRB3 IGS_GR+0xB3
#define GRB4 IGS_GR+0xB4
#define GRB5 IGS_GR+0xB5
#define GRB6 IGS_GR+0xB6
#define GRB7 IGS_GR+0xB7
#define GRB8 IGS_GR+0xB8
#define GRB9 IGS_GR+0xB9
#define GRBA IGS_GR+0xBA
#define GRBB IGS_GR+0xBB
#define GRBC IGS_GR+0xBC
#define GRBD IGS_GR+0xBD
#define GRBE IGS_GR+0xBE
#define GRBF IGS_GR+0xBF
#define GR_FIRST GR00
#define GR_LAST GRBF
#define GREX3C IGS_GREX+(0x3c-IGS_GREXBASE)
VgaReg igs_h_total[] = {
CR00, 0, 8,
VGA_REG_END
};
VgaReg igs_h_de_end[] = {
CR01, 0, 8,
VGA_REG_END
};
VgaReg igs_h_bstart[] = {
CR02, 0, 8,
VGA_REG_END
};
VgaReg igs_h_bend[] = {
CR03, 0, 5,
CR05, 7, 1,
VGA_REG_END
};
VgaReg igs_de_skew[] = {
CR03, 5, 2,
VGA_REG_END
};
VgaReg igs_ena_vr_access[] = {
CR03, 7, 1,
VGA_REG_END
};
VgaReg igs_h_rstart[] = {
CR04, 0, 8,
VGA_REG_END
};
VgaReg igs_h_rend[] = {
CR05, 0, 5,
VGA_REG_END
};
VgaReg igs_h_rdelay[] = {
CR05, 5, 2,
VGA_REG_END
};
VgaReg igs_v_total[] = {
CR06, 0, 8,
CR07, 0, 1,
CR07, 5, 1,
GR11, 0, 1,
VGA_REG_END
};
VgaReg igs_v_rstart[] = {
CR10, 0, 8,
CR07, 2, 1,
CR07, 7, 1,
GR11, 2, 1,
VGA_REG_END
};
VgaReg igs_v_rend[] = {
CR11, 0, 4,
VGA_REG_END
};
VgaReg igs_clear_v_int[] = {
CR11, 4, 1,
VGA_REG_END
};
VgaReg igs_disable_v_int[] = {
CR11, 5, 1,
VGA_REG_END
};
VgaReg igs_bandwidth[] = {
CR11, 6, 1,
VGA_REG_END
};
VgaReg igs_crt_protect[] = {
CR11, 7, 1,
VGA_REG_END
};
VgaReg igs_v_de_end[] = {
CR12, 0, 8,
CR07, 1, 1,
CR07, 6, 1,
GR11, 1, 1,
VGA_REG_END
};
VgaReg igs_offset[] = {
CR13, 0, 8,
GR15, 4, 2,
VGA_REG_END
};
VgaReg igs_v_bstart[] = {
CR15, 0, 8,
CR07, 3, 1,
CR09, 5, 1,
GR11, 3, 1,
VGA_REG_END
};
VgaReg igs_v_bend[] = {
CR16, 0, 7,
VGA_REG_END
};
VgaReg igs_linecomp[] = {
CR18, 0, 8,
CR07, 4, 1,
CR09, 6, 1,
GR11, 4, 1,
VGA_REG_END
};
VgaReg igs_ivideo[] = {
GR11, 5, 1,
VGA_REG_END
};
VgaReg igs_num_fetch[] = {
GR14, 0, 8,
GR15, 0, 2,
VGA_REG_END
};
VgaReg igs_wcrt0[] = {
CR1F, 0, 1,
VGA_REG_END
};
VgaReg igs_wcrt1[] = {
CR1F, 1, 1,
VGA_REG_END
};
VgaReg igs_rcrts1[] = {
CR1F, 4, 1,
VGA_REG_END
};
VgaReg igs_selwk[] = {
CR1F, 6, 1,
VGA_REG_END
};
VgaReg igs_dot_clock_8[] = {
SR01, 0, 1,
VGA_REG_END
};
VgaReg igs_screen_off[] = {
SR01, 5, 1,
VGA_REG_END
};
VgaReg igs_enable_write_plane[] = {
SR02, 0, 4,
VGA_REG_END
};
VgaReg igs_mexhsyn[] = {
GR16, 0, 2,
VGA_REG_END
};
VgaReg igs_mexvsyn[] = {
GR16, 2, 2,
VGA_REG_END
};
VgaReg igs_pci_burst_write[] = {
GR30, 5, 1,
VGA_REG_END
};
VgaReg igs_pci_burst_read[] = {
GR30, 7, 1,
VGA_REG_END
};
VgaReg igs_iow_retry[] = {
GREX3C, 0, 1,
VGA_REG_END
};
VgaReg igs_mw_retry[] = {
GREX3C, 1, 1,
VGA_REG_END
};
VgaReg igs_mr_retry[] = {
GREX3C, 2, 1,
VGA_REG_END
};
VgaReg igs_biga22en[] = {
GR3D, 4, 1,
VGA_REG_END
};
VgaReg igs_biga24en[] = {
GR3D, 5, 1,
VGA_REG_END
};
VgaReg igs_biga22force[] = {
GR3D, 6, 1,
VGA_REG_END
};
VgaReg igs_bigswap[] = {
GR3F, 0, 6,
VGA_REG_END
};
/* #define IGS_BIGSWAP_8 0x3f */
/* #define IGS_BIGSWAP_16 0x2a */
/* #define IGS_BIGSWAP_32 0x00 */
VgaReg igs_sprite_x[] = {
GR50, 0, 8,
GR51, 0, 3,
VGA_REG_END
};
VgaReg igs_sprite_preset_x[] = {
GR52, 0, 6,
VGA_REG_END
};
VgaReg igs_sprite_y[] = {
GR53, 0, 8,
GR54, 0, 3,
VGA_REG_END
};
VgaReg igs_sprite_preset_y[] = {
GR55, 0, 6,
VGA_REG_END
};
VgaReg igs_sprite_visible[] = {
GR56, 0, 1,
VGA_REG_END
};
VgaReg igs_sprite_64x64[] = {
GR56, 1, 1,
VGA_REG_END
};
VgaReg igs_mgrext[] = {
GR57, 0, 1,
VGA_REG_END
};
VgaReg igs_hcshf[] = {
GR57, 4, 2,
VGA_REG_END
};
VgaReg igs_mbpfix[] = {
GR57, 6, 2,
VGA_REG_END
};
VgaReg igs_overscan_red[] = {
GR58, 0, 8,
VGA_REG_END
};
VgaReg igs_overscan_green[] = {
GR59, 0, 8,
VGA_REG_END
};
VgaReg igs_overscan_blue[] = {
GR5A, 0, 8,
VGA_REG_END
};
VgaReg igs_memgopg[] = {
GR73, 2, 1,
VGA_REG_END
};
VgaReg igs_memr2wpg[] = {
GR73, 1, 1,
VGA_REG_END
};
VgaReg igs_crtff16[] = {
GR73, 3, 1,
VGA_REG_END
};
VgaReg igs_fifomust[] = {
GR74, 0, 5,
VGA_REG_END
};
VgaReg igs_fifogen[] = {
GR75, 0, 5,
VGA_REG_END
};
VgaReg igs_mode_sel[] = {
GR77, 0, 4,
VGA_REG_END
};
/* #define IGS_MODE_TEXT 0 */
/* #define IGS_MODE_8 1 */
/* #define IGS_MODE_565 2 */
/* #define IGS_MODE_5551 6 */
/* #define IGS_MODE_8888 3 */
/* #define IGS_MODE_888 4 */
/* #define IGS_MODE_332 9 */
/* #define IGS_MODE_4444 10 */
VgaReg igs_sprite_addr[] = {
GR7E, 0, 8,
GR7F, 0, 4,
VGA_REG_END
};
VgaReg igs_fastmpie[] = {
GR9E, 0, 1,
VGA_REG_END
};
VgaReg igs_vclk_m[] = {
GRB0, 0, 8,
GRBA, 0, 3,
VGA_REG_END
};
VgaReg igs_vclk_n[] = {
GRB1, 0, 5,
GRBA, 3, 3,
VGA_REG_END
};
VgaReg igs_vfsel[] = {
GRB1, 5, 1,
VGA_REG_END
};
VgaReg igs_vclk_p[] = {
GRB1, 6, 2,
GRBA, 6, 1,
VGA_REG_END
};
VgaReg igs_frqlat[] = {
GRB9, 7, 1,
VGA_REG_END
};
VgaReg igs_dac_mask[] = {
IGS_DAC + 0, 0, 8,
VGA_REG_END
};
VgaReg igs_dac_read_index[] = {
IGS_DAC + 1, 0, 8,
VGA_REG_END
};
VgaReg igs_dac_write_index[] = {
IGS_DAC + 2, 0, 8,
VGA_REG_END
};
VgaReg igs_dac_data[] = {
IGS_DAC + 3, 0, 8,
VGA_REG_END
};
VgaReg igs_rampwdn[] = {
IGS_DACEX + 0, 0, 1,
VGA_REG_END
};
VgaReg igs_dac6_8[] = {
IGS_DACEX + 0, 1, 1,
VGA_REG_END
};
VgaReg igs_ramdacbypass[] = {
IGS_DACEX + 0, 4, 1,
VGA_REG_END
};
VgaReg igs_dacpwdn[] = {
IGS_DACEX + 0, 6, 1,
VGA_REG_END
};
VgaReg igs_cursor_read_index[] = {
IGS_DACEX + 1, 0, 8,
VGA_REG_END
};
VgaReg igs_cursor_write_index[] = {
IGS_DACEX + 2, 0, 8,
VGA_REG_END
};
VgaReg igs_cursor_data[] = {
IGS_DACEX + 3, 0, 8,
VGA_REG_END
};
VGA8
_igsInb (VgaCard *card, VGA16 port)
{
VGAVOL8 *reg;
if (card->closure)
return VgaReadMemb ((VGA32) card->closure + port);
else
return VgaInb (port);
}
void
_igsOutb (VgaCard *card, VGA8 value, VGA16 port)
{
if (card->closure)
VgaWriteMemb (value, (VGA32) card->closure + port);
else
VgaOutb (value, port);
}
void
_igsRegMap (VgaCard *card, VGA16 reg, VgaMap *map, VGABOOL write)
{
if (reg < IGS_SR + IGS_NSR)
{
map->access = VgaAccessIndIo;
map->port = 0x3c4;
map->addr = 0;
map->value = 1;
map->index = reg - IGS_SR;
}
else if (reg < IGS_GR + IGS_NGR)
{
map->access = VgaAccessIndIo;
map->port = 0x3ce;
map->addr = 0;
map->value = 1;
map->index = reg - IGS_GR;
}
else if (reg < IGS_GREX + IGS_NGREX)
{
VGA8 gr33;
map->access = VgaAccessDone;
_igsOutb (card, 0x33, 0x3ce);
gr33 = _igsInb (card, 0x3cf);
_igsOutb (card, gr33 | 0x40, 0x3cf);
_igsOutb (card, IGS_GREXBASE + reg - IGS_GREX, 0x3ce);
if (write)
_igsOutb (card, map->value, 0x3cf);
else
map->value = _igsInb (card, 0x3cf);
_igsOutb (card, 0x33, 0x3ce);
_igsOutb (card, gr33, 0x3cf);
return;
}
else if (reg < IGS_AR + IGS_NAR)
{
reg -= IGS_AR;
map->access = VgaAccessDone;
/* reset AFF to index */
(void) _igsInb (card, 0x3da);
if (reg >= 16)
reg |= 0x20;
_igsOutb (card, reg, 0x3c0);
if (write)
_igsOutb (card, map->value, 0x3c0);
else
map->value = _igsInb (card, 0x3c1);
if (!(reg & 0x20))
{
/* enable video display again */
(void) _igsInb (card, 0x3da);
_igsOutb (card, 0x20, 0x3c0);
}
return;
}
else if (reg < IGS_CR + IGS_NCR)
{
map->access = VgaAccessIndIo;
map->port = 0x3d4;
map->addr = 0;
map->value = 1;
map->index = reg - IGS_CR;
}
else if (reg < IGS_DAC + IGS_NDAC)
{
map->access = VgaAccessIo;
map->port = 0x3c6 + reg - IGS_DAC;
}
else if (reg < IGS_DACEX + IGS_NDACEX)
{
VGA8 gr56;
reg = 0x3c6 + reg - IGS_DACEX;
map->access = VgaAccessDone;
_igsOutb (card, 0x56, 0x3ce);
gr56 = _igsInb (card, 0x3cf);
_igsOutb (card, gr56 | 4, 0x3cf);
if (write)
_igsOutb (card, map->value, reg);
else
map->value = _igsInb (card, reg);
_igsOutb (card, gr56, 0x3cf);
return;
}
else switch (reg) {
case IGS_MISC_OUT:
map->access = VgaAccessIo;
if (write)
map->port = 0x3c2;
else
map->port = 0x3cc;
break;
case IGS_INPUT_STATUS_1:
map->access = VgaAccessIo;
map->port = 0x3da;
break;
}
if (card->closure)
{
map->port = map->port + (VGA32) card->closure;
if (map->access == VgaAccessIo)
map->access = VgaAccessMem;
if (map->access == VgaAccessIndIo)
map->access = VgaAccessIndMem;
}
}
VgaSave igsSaves[] = {
CR00, CR18,
SR01, SR02,
GR11, GRBA,
IGS_MISC_OUT, IGS_MISC_OUT,
VGA_SAVE_END
};
void
igsRegInit (IgsVga *igsvga, VGAVOL8 *mmio)
{
igsvga->card.map = _igsRegMap;
igsvga->card.closure = (void *) mmio;
igsvga->card.max = IGS_NREG;
igsvga->card.values = igsvga->values;
igsvga->card.saves = igsSaves;
}
void
igsSave (IgsVga *igsvga)
{
igsSetImm (igsvga, igs_wcrt0, 1);
igsSetImm (igsvga, igs_wcrt1, 1);
igsSetImm (igsvga, igs_rcrts1, 1);
igsSetImm (igsvga, igs_selwk, 1);
VgaPreserve (&igsvga->card);
}
void
igsReset (IgsVga *igsvga)
{
VgaRestore (&igsvga->card);
igsSetImm (igsvga, igs_frqlat, 0);
igsSetImm (igsvga, igs_frqlat, 1);
igsSetImm (igsvga, igs_frqlat, 0);
VgaFinish (&igsvga->card);
}
char *
igsRegName(char *buf, VGA16 reg)
{
if (reg < IGS_SR + IGS_NSR)
{
sprintf (buf, " SR%02X", reg - IGS_SR);
}
else if (reg < IGS_GR + IGS_NGR)
{
sprintf (buf, " GR%02X", reg - IGS_GR);
}
else if (reg < IGS_GREX + IGS_NGREX)
{
sprintf (buf, " GRX%02X", reg - IGS_GREX + IGS_GREXBASE);
}
else if (reg < IGS_AR + IGS_NAR)
{
sprintf (buf, " AR%02X", reg - IGS_AR);
}
else if (reg < IGS_CR + IGS_NCR)
{
sprintf (buf, " CR%02X", reg - IGS_CR);
}
else if (reg < IGS_DAC + IGS_NDAC)
{
sprintf (buf, " DAC%02X", reg - IGS_DAC);
}
else if (reg < IGS_DACEX + IGS_NDACEX)
{
sprintf (buf, "DACX%02X", reg - IGS_DACEX);
}
else switch (reg) {
case IGS_MISC_OUT:
sprintf (buf, "MISC_O");
break;
case IGS_INPUT_STATUS_1:
sprintf (buf, "IN_S_1");
break;
}
return buf;
}

70
hw/kdrive/igs/igsreg.h Normal file
View File

@ -0,0 +1,70 @@
/*
* $XFree86$
*
* Copyright © 2000 Keith Packard
*
* Permission to use, copy, modify, distribute, and sell this software and its
* documentation for any purpose is hereby granted without fee, provided that
* the above copyright notice appear in all copies and that both that
* copyright notice and this permission notice appear in supporting
* documentation, and that the name of Keith Packard not be used in
* advertising or publicity pertaining to distribution of the software without
* specific, written prior permission. Keith Packard makes no
* representations about the suitability of this software for any purpose. It
* is provided "as is" without express or implied warranty.
*
* KEITH PACKARD DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
* INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
* EVENT SHALL KEITH PACKARD BE LIABLE FOR ANY SPECIAL, INDIRECT OR
* CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
* DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
* TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
* PERFORMANCE OF THIS SOFTWARE.
*/
#ifndef _IGSREG_H_
#define _IGSREG_H_
#include "vga.h"
#define IGS_SR 0
#define IGS_NSR 5
#define IGS_GR (IGS_SR+IGS_NSR)
#define IGS_NGR 0xC0
#define IGS_GREX (IGS_GR+IGS_NGR)
#define IGS_GREXBASE 0x3c
#define IGS_NGREX 1
#define IGS_AR (IGS_GREX+IGS_NGREX)
#define IGS_NAR 0x15
#define IGS_CR (IGS_AR+IGS_NAR)
#define IGS_NCR 0x48
#define IGS_DAC (IGS_CR+IGS_NCR)
#define IGS_NDAC 4
#define IGS_DACEX (IGS_DAC+IGS_NDAC)
#define IGS_NDACEX 4
#define IGS_MISC_OUT (IGS_DACEX + IGS_NDACEX)
#define IGS_INPUT_STATUS_1 (IGS_MISC_OUT+1)
#define IGS_NREG (IGS_INPUT_STATUS_1+1)
#include "igsregs.t"
#define igsGet(sv,r) VgaGet(&(sv)->card, (r))
#define igsGetImm(sv,r) VgaGetImm(&(sv)->card, (r))
#define igsSet(sv,r,v) VgaSet(&(sv)->card, (r), (v))
#define igsSetImm(sv,r,v) VgaSetImm(&(sv)->card, (r), (v))
typedef struct _igsVga {
VgaCard card;
VgaValue values[IGS_NREG];
} IgsVga;
void
igsRegInit (IgsVga *igsvga, VGAVOL8 *mmio);
void
igsSave (IgsVga *igsvga);
void
igsReset (IgsVga *igsvga);
#endif /* _IGSREG_H_ */

View File

@ -1,5 +1,5 @@
/* /*
* $XFree86$ * $XFree86: xc/programs/Xserver/hw/kdrive/igs/igsstub.c,v 1.1 2000/05/06 22:17:44 keithp Exp $
* *
* Copyright © 2000 Keith Packard * Copyright © 2000 Keith Packard
* *
@ -31,7 +31,13 @@ InitCard (char *name)
CARD32 count; CARD32 count;
count = 0; count = 0;
#ifdef EMBED
attr.address[0] = 0x10000000; /* Adomo Wing video base address */
attr.io = 0;
attr.naddr = 1;
#else
while (LinuxFindPci (0x10ea, 0x5000, count, &attr)) while (LinuxFindPci (0x10ea, 0x5000, count, &attr))
#endif
{ {
KdCardInfoAdd (&igsFuncs, &attr, 0); KdCardInfoAdd (&igsFuncs, &attr, 0);
count++; count++;