summaryrefslogtreecommitdiff
path: root/hw/kdrive/neomagic/neomagic.h
blob: 590319652db9d394d68e5ffda3e229eeb123ae2d (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
/*
 *
 * Copyright © 2004 Franco Catrin
 *
 * 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 Franco Catrin not be used in
 * advertising or publicity pertaining to distribution of the software without
 * specific, written prior permission.  Franco Catrin makes no
 * representations about the suitability of this software for any purpose.  It
 * is provided "as is" without express or implied warranty.
 *
 * FRANCO CATRIN DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
 * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
 * EVENT SHALL FRANCO CATRIN 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 _NEOMAGIC_H_
#define _NEOMAGIC_H_
#include <backend.h>
#include "kxv.h"
#include "klinux.h"


#define DEBUG
#ifdef DEBUG
#define DBGOUT(fmt,a...) fprintf (stderr, fmt, ##a)
#else
#define DBGOUT(fmt,a...)
#endif

#define ENTER()    DBGOUT("Enter %s\n", __FUNCTION__)
#define LEAVE() DBGOUT("Leave %s\n", __FUNCTION__)

#define NEO_VENDOR 0x10c8
#define CAP_NM2070  0x01 /* If it's a NM2070 series */
#define CAP_NM2090  0x02 /* If it's a NM2090 series */
#define CAP_NM2097  0x03 /* If it's a NM2097 series */
#define CAP_NM2200  0x04 /* If it's a NM2200 series */

#define NEO_BS0_BLT_BUSY        0x00000001
#define NEO_BS0_FIFO_AVAIL      0x00000002
#define NEO_BS0_FIFO_PEND       0x00000004

#define NEO_BC0_DST_Y_DEC       0x00000001
#define NEO_BC0_X_DEC           0x00000002
#define NEO_BC0_SRC_TRANS       0x00000004
#define NEO_BC0_SRC_IS_FG       0x00000008
#define NEO_BC0_SRC_Y_DEC       0x00000010
#define NEO_BC0_FILL_PAT        0x00000020
#define NEO_BC0_SRC_MONO        0x00000040
#define NEO_BC0_SYS_TO_VID      0x00000080

#define NEO_BC1_DEPTH8          0x00000100
#define NEO_BC1_DEPTH16         0x00000200
#define NEO_BC1_X_320           0x00000400
#define NEO_BC1_X_640           0x00000800
#define NEO_BC1_X_800           0x00000c00
#define NEO_BC1_X_1024          0x00001000
#define NEO_BC1_X_1152          0x00001400
#define NEO_BC1_X_1280          0x00001800
#define NEO_BC1_X_1600          0x00001c00
#define NEO_BC1_DST_TRANS       0x00002000
#define NEO_BC1_MSTR_BLT        0x00004000
#define NEO_BC1_FILTER_Z        0x00008000

#define NEO_BC2_WR_TR_DST       0x00800000

#define NEO_BC3_SRC_XY_ADDR     0x01000000
#define NEO_BC3_DST_XY_ADDR     0x02000000
#define NEO_BC3_CLIP_ON         0x04000000
#define NEO_BC3_FIFO_EN         0x08000000
#define NEO_BC3_BLT_ON_ADDR     0x10000000
#define NEO_BC3_SKIP_MAPPING    0x80000000

#define NEO_MODE1_DEPTH8        0x0100
#define NEO_MODE1_DEPTH16       0x0200
#define NEO_MODE1_DEPTH24       0x0300
#define NEO_MODE1_X_320         0x0400
#define NEO_MODE1_X_640         0x0800
#define NEO_MODE1_X_800         0x0c00
#define NEO_MODE1_X_1024        0x1000
#define NEO_MODE1_X_1152        0x1400
#define NEO_MODE1_X_1280        0x1800
#define NEO_MODE1_X_1600        0x1c00
#define NEO_MODE1_BLT_ON_ADDR   0x2000

typedef volatile CARD8    VOL8;
typedef volatile CARD16    VOL16;
typedef volatile CARD32    VOL32;

#define NEO_REG_SIZE(c)        (0x200000L)

typedef volatile struct {
    CARD32 bltStat;
    CARD32 bltCntl;
    CARD32 xpColor;
    CARD32 fgColor;
    CARD32 bgColor;
    CARD32 pitch;
    CARD32 clipLT;
    CARD32 clipRB;
    CARD32 srcBitOffset;
    CARD32 srcStart;
    CARD32 reserved0;
    CARD32 dstStart;
    CARD32 xyExt;

    CARD32 reserved1[19];

    CARD32 pageCntl;
    CARD32 pageBase;
    CARD32 postBase;
    CARD32 postPtr;
    CARD32 dataPtr;
} NeoMMIO;

typedef struct _neoCardInfo {
    VesaCardPrivRec backendCard;

    CARD32 reg_base;
    NeoMMIO *mmio;
    int dstOrg;
    int dstPitch;
    int dstPixelWidth;

    int srcOrg;
    int srcPitch;
    int srcPixelWidth;

    struct NeoChipInfo *chip;

    CARD32 bltCntl;

} NeoCardInfo;

struct NeoChipInfo {
    CARD16 vendor;
    CARD16 device;
    CARD8 caps;
    char *name;
    int videoRam;
    int maxClock;
    int cursorMem;
    int cursorOff;
    int linearSize;
    int maxWidth;
    int maxHeight;
};

#define getNeoCardInfo(kd) ((NeoCardInfo *) ((kd)->card->driver))
#define neoCardInfo(kd) NeoCardInfo *neoc = getNeoCardInfo(kd)

typedef struct _neoScreenInfo {
    VesaScreenPrivRec backendScreen;

    CARD8 *screen;
    CARD8 *off_screen;
    int off_screen_size;
    int pitch;
    int depth;
    KdVideoAdaptorPtr pAdaptor;
} NeoScreenInfo;

#define getNeoScreenInfo(kd) ((NeoScreenInfo *) ((kd)->screen->driver))
#define neoScreenInfo(kd) NeoScreenInfo *neos = getNeoScreenInfo(kd)

#define SetupNeo(s) KdScreenPriv(s); \
                    neoCardInfo(pScreenPriv); \
                    neoScreenInfo(pScreenPriv);

void
neoPreserve (KdCardInfo *card);

Bool
neoEnable (ScreenPtr pScreen);

void
neoDisable (ScreenPtr pScreen);

Bool
neoMapReg (KdCardInfo *card, NeoCardInfo *nvidiac);

void
neoUnmapReg (KdCardInfo *card, NeoCardInfo *nvidiac);

CARD8
neoGetIndex (NeoCardInfo *nvidiac, CARD16 addr,  CARD8 id);

void
neoSetIndex (NeoCardInfo *nvidiac, CARD16 addr,  CARD8 id, CARD8 val);

Bool
neoDrawInit (ScreenPtr pScreen);

void
neoDrawEnable (ScreenPtr pScreen);

void
neoDrawDisable (ScreenPtr pScreen);

void
neoDrawFini (ScreenPtr pScreen);

void
neoDrawSync (ScreenPtr pScreen);

extern KdCardFuncs  neoFuncs;

#endif /* _NEOMAGIC_H_ */