3 * Copyright © 2004 Franco Catrin
5 * Permission to use, copy, modify, distribute, and sell this software and its
6 * documentation for any purpose is hereby granted without fee, provided that
7 * the above copyright notice appear in all copies and that both that
8 * copyright notice and this permission notice appear in supporting
9 * documentation, and that the name of Franco Catrin not be used in
10 * advertising or publicity pertaining to distribution of the software without
11 * specific, written prior permission. Franco Catrin makes no
12 * representations about the suitability of this software for any purpose. It
13 * is provided "as is" without express or implied warranty.
15 * FRANCO CATRIN DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
16 * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
17 * EVENT SHALL FRANCO CATRIN BE LIABLE FOR ANY SPECIAL, INDIRECT OR
18 * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
19 * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
20 * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
21 * PERFORMANCE OF THIS SOFTWARE.
25 #include <kdrive-config.h>
30 struct NeoChipInfo neoChips
[] = {
31 {NEO_VENDOR
, 0x0001, CAP_NM2070
, "MagicGraph 128(NM2070)",
32 896, 65000, 2048, 0x100, 1024, 1024, 1024},
33 {NEO_VENDOR
, 0x0002, CAP_NM2090
, "MagicGraph 128V(NM2090)",
34 1152, 80000, 2048, 0x100, 2048, 1024, 1024},
35 {NEO_VENDOR
, 0x0003, CAP_NM2090
, "MagicGraph 128ZV(NM2093)",
36 1152, 80000, 2048, 0x100, 2048, 1024, 1024},
37 {NEO_VENDOR
, 0x0083, CAP_NM2097
, "MagicGraph 128ZV+(NM2097)",
38 1152, 80000, 1024, 0x100, 2048, 1024, 1024},
39 {NEO_VENDOR
, 0x0004, CAP_NM2097
, "MagicGraph 128XD(NM2160)",
40 2048, 90000, 1024, 0x100, 2048, 1024, 1024},
41 {NEO_VENDOR
, 0x0005, CAP_NM2200
, "MagicGraph 256AV(NM2200)",
42 2560, 110000, 1024, 0x1000, 4096, 1280, 1024},
43 {NEO_VENDOR
, 0x0025, CAP_NM2200
, "MagicGraph 256AV+(NM2230)",
44 3008, 110000, 1024, 0x1000, 4096, 1280, 1024},
45 {NEO_VENDOR
, 0x0006, CAP_NM2200
, "MagicGraph 256ZX(NM2360)",
46 4096, 110000, 1024, 0x1000, 4096, 1280, 1024},
47 {NEO_VENDOR
, 0x0016, CAP_NM2200
, "MagicGraph 256XL+(NM2380)",
48 6144, 110000, 1024, 0x1000, 8192, 1280, 1024},
53 neoCardInit(KdCardInfo
*card
)
56 struct NeoChipInfo
*chip
;
58 neoc
=(NeoCardInfo
*) xalloc(sizeof(NeoCardInfo
));
63 if(!vesaInitialize(card
, &neoc
->backendCard
)) {
68 for(chip
= neoChips
; chip
->name
!= NULL
; ++chip
) {
69 if(chip
->device
== card
->attr
.deviceID
) {
75 ErrorF("Using Neomagic card: %s\n", neoc
->chip
->name
);
77 neoMapReg(card
, neoc
);
85 neoScreenInit(KdScreenInfo
*screen
)
88 int screen_size
, memory
;
90 neos
= xcalloc(sizeof(NeoScreenInfo
), 1);
95 memset (neos
, '\0', sizeof (NeoScreenInfo
));
98 if(!vesaScreenInitialize(screen
, &neos
->backendScreen
)) {
103 screen
->softCursor
= TRUE
; // no hardware color cursor available
105 neos
->screen
= neos
->backendScreen
.fb
;
107 memory
= neos
->backendScreen
.fb_size
;
108 screen_size
= screen
->fb
[0].byteStride
* screen
->height
;
109 memory
-= screen_size
;
111 if(memory
> screen
->fb
[0].byteStride
) {
112 neos
->off_screen
= neos
->screen
+ screen_size
;
113 neos
->off_screen_size
= memory
;
115 neos
->off_screen
= 0;
116 neos
->off_screen_size
= 0;
119 screen
->driver
= neos
;
125 neoInitScreen(ScreenPtr pScreen
)
127 return vesaInitScreen(pScreen
);
131 neoFinishInitScreen(ScreenPtr pScreen
)
133 return vesaFinishInitScreen(pScreen
);
137 neoCreateResources(ScreenPtr pScreen
)
139 return vesaCreateResources(pScreen
);
143 neoPreserve(KdCardInfo
*card
)
149 neoGetIndex(NeoCardInfo
*nvidiac
, CARD16 addr
, CARD8 index
)
157 neoSetIndex(NeoCardInfo
*nvidiac
, CARD16 addr
, CARD8 index
, CARD8 val
)
163 static void neoLock(NeoCardInfo
*neoc
){
165 neoSetIndex(neoc
, 0x3ce, 0x09, 0x00);
166 neoSetIndex(neoc
, 0x3ce, 0x11, 0x0); // disable MMIO and linear mode
167 cr11
= neoGetIndex(neoc
, 0x3d4, 0x11);
168 neoSetIndex(neoc
, 0x3d4, 0x11, cr11
| 0x80);
171 static void neoUnlock(NeoCardInfo
*neoc
){
173 cr11
= neoGetIndex(neoc
, 0x3d4, 0x11);
174 neoSetIndex(neoc
, 0x3d4, 0x11, cr11
& 0x7F);
175 neoSetIndex(neoc
, 0x3ce, 0x09, 0x26);
176 neoSetIndex(neoc
, 0x3ce, 0x11, 0xc0); // enable MMIO and linear mode
181 neoMapReg(KdCardInfo
*card
, NeoCardInfo
*neoc
)
183 neoc
->reg_base
= card
->attr
.address
[1] & 0xFFF80000;
184 if(!neoc
->reg_base
) {
188 neoc
->mmio
= KdMapDevice(neoc
->reg_base
, NEO_REG_SIZE(card
));
193 KdSetMappedMode(neoc
->reg_base
, NEO_REG_SIZE(card
), KD_MAPPED_MODE_REGISTERS
);
199 neoUnmapReg(KdCardInfo
*card
, NeoCardInfo
*neoc
)
203 neoSetIndex(neoc
, 0x3ce, 0x82,0);
204 KdResetMappedMode(neoc
->reg_base
, NEO_REG_SIZE(card
), KD_MAPPED_MODE_REGISTERS
);
205 KdUnmapDevice((void *)neoc
->mmio
, NEO_REG_SIZE(card
));
211 neoSetMMIO(KdCardInfo
*card
, NeoCardInfo
*neoc
)
214 neoMapReg(card
, neoc
);
219 neoResetMMIO(KdCardInfo
*card
, NeoCardInfo
*neoc
)
221 neoUnmapReg(card
, neoc
);
227 neoEnable(ScreenPtr pScreen
)
229 KdScreenPriv(pScreen
);
230 neoCardInfo(pScreenPriv
);
232 if(!vesaEnable(pScreen
)) {
236 neoSetMMIO(pScreenPriv
->card
, neoc
);
241 neoDisable(ScreenPtr pScreen
)
243 KdScreenPriv(pScreen
);
244 neoCardInfo(pScreenPriv
);
246 neoResetMMIO(pScreenPriv
->card
, neoc
);
248 vesaDisable(pScreen
);
252 neoGetColors(ScreenPtr pScreen
, int fb
, int n
, xColorItem
*pdefs
)
254 vesaGetColors(pScreen
, fb
, n
, pdefs
);
258 neoPutColors(ScreenPtr pScreen
, int fb
, int n
, xColorItem
*pdefs
)
260 vesaPutColors(pScreen
, fb
, n
, pdefs
);
264 neoDPMS(ScreenPtr pScreen
, int mode
)
266 return vesaDPMS(pScreen
, mode
);
270 neoRestore(KdCardInfo
*card
)
272 NeoCardInfo
*neoc
= card
->driver
;
274 neoResetMMIO(card
, neoc
);
279 neoScreenFini(KdScreenInfo
*screen
)
281 NeoScreenInfo
*neos
=(NeoScreenInfo
*) screen
->driver
;
283 vesaScreenFini(screen
);
289 neoCardFini(KdCardInfo
*card
)
291 NeoCardInfo
*neoc
= card
->driver
;
293 neoUnmapReg(card
, neoc
);
297 #define neoCursorInit 0 // initCursor
298 #define neoCursorEnable 0 // enableCursor
299 #define neoCursorDisable 0 // disableCursor
300 #define neoCursorFini 0 // finiCursor */
301 #define neoRecolorCursor 0 // recolorCursor */
302 //#define neoDrawInit 0 // initAccel
303 //#define neoDrawEnable 0 // enableAccel
304 //#define neoDrawSync 0 // syncAccel
305 //#define neoDrawDisable 0 // disableAccel
306 //#define neoDrawFini 0 // finiAccel
308 KdCardFuncs neoFuncs
= {
309 neoCardInit
, // cardinit
310 neoScreenInit
, // scrinit
311 neoInitScreen
, // initScreen
312 neoFinishInitScreen
, // finishInitScreen
313 neoCreateResources
, // createRes
314 neoPreserve
, // preserve
317 neoDisable
, // disable
318 neoRestore
, // restore
319 neoScreenFini
, // scrfini
320 neoCardFini
, // cardfini
322 neoCursorInit
, // initCursor
323 neoCursorEnable
, // enableCursor
324 neoCursorDisable
, // disableCursor
325 neoCursorFini
, // finiCursor
326 neoRecolorCursor
, // recolorCursor
328 neoDrawInit
, // initAccel
329 neoDrawEnable
, // enableAccel
330 neoDrawDisable
, // disableAccel
331 neoDrawFini
, // finiAccel
333 neoGetColors
, // getColors
334 neoPutColors
, // putColors