1
/* $XFree86: xc/lib/Xxf86dga/XF86DGA2.c,v 1.21 2002/12/14 04:41:12 dawes Exp $ */
4
Copyright (c) 1995 Jon Tombs
5
Copyright (c) 1995,1996 The XFree86 Project, Inc
9
/* THIS IS NOT AN X CONSORTIUM STANDARD */
11
#ifdef __UNIXOS2__ /* needed here to override certain constants in X headers */
19
#include <X11/Xlibint.h>
20
#include <X11/extensions/xf86dga.h>
21
#include <X11/extensions/xf86dgastr.h>
22
#include <X11/extensions/Xext.h>
23
#include <X11/extensions/extutil.h>
27
/* If you change this, change the Bases[] array below as well */
30
char *xdga_extension_name = XF86DGANAME;
32
static XExtensionInfo _xdga_info_data;
33
static XExtensionInfo *xdga_info = &_xdga_info_data;
36
Bool XDGAMapFramebuffer(int, char *, unsigned char*, CARD32, CARD32, CARD32);
37
void XDGAUnmapFramebuffer(int);
38
unsigned char* XDGAGetMappedMemory(int);
40
#define XDGACheckExtension(dpy,i,val) \
41
XextCheckExtension (dpy, i, xdga_extension_name, val)
43
/*****************************************************************************
45
* private utility routines *
47
*****************************************************************************/
49
static int xdga_close_display(Display *dpy, XExtCodes *codes);
50
static Bool xdga_wire_to_event(Display *dpy, XEvent *event, xEvent *wire_ev);
51
static Status xdga_event_to_wire(Display *dpy, XEvent *event, xEvent *wire_ev);
53
static XExtensionHooks xdga_extension_hooks = {
58
NULL, /* create_font */
60
xdga_close_display, /* close_display */
61
xdga_wire_to_event, /* wire_to_event */
62
xdga_event_to_wire, /* event_to_wire */
64
NULL, /* error_string */
67
static XEXT_GENERATE_CLOSE_DISPLAY (xdga_close_display, xdga_info)
70
XEXT_GENERATE_FIND_DISPLAY (xdga_find_display, xdga_info,
72
&xdga_extension_hooks,
91
dgaEvent *wire = (dgaEvent *) wire_ev;
92
XDGAButtonEvent *bevent;
94
XDGAMotionEvent *mevent;
95
XExtDisplayInfo *info = xdga_find_display (dpy);
97
XDGACheckExtension (dpy, info, False);
99
switch((wire->u.u.type & 0x7f) - info->codes->first_event) {
101
mevent = (XDGAMotionEvent*)event;
102
mevent->type = wire->u.u.type & 0x7F;
103
mevent->serial = _XSetLastRequestRead(dpy, (xGenericReply *)wire);
104
mevent->display = dpy;
105
mevent->screen = wire->u.event.screen;
106
mevent->time = wire->u.event.time;
107
mevent->state = wire->u.event.state;
108
mevent->dx = wire->u.event.dx;
109
mevent->dy = wire->u.event.dy;
113
bevent = (XDGAButtonEvent*)event;
114
bevent->type = wire->u.u.type & 0x7F;
115
bevent->serial = _XSetLastRequestRead(dpy, (xGenericReply *)wire);
116
bevent->display = dpy;
117
bevent->screen = wire->u.event.screen;
118
bevent->time = wire->u.event.time;
119
bevent->state = wire->u.event.state;
120
bevent->button = wire->u.u.detail;
124
kevent = (XDGAKeyEvent*)event;
125
kevent->type = wire->u.u.type & 0x7F;
126
kevent->serial = _XSetLastRequestRead(dpy, (xGenericReply *)wire);
127
kevent->display = dpy;
128
kevent->screen = wire->u.event.screen;
129
kevent->time = wire->u.event.time;
130
kevent->state = wire->u.event.state;
131
kevent->keycode = wire->u.u.detail;
139
Bool XDGAQueryExtension (
144
XExtDisplayInfo *info = xdga_find_display (dpy);
146
if (XextHasExtension(info)) {
147
*event_basep = info->codes->first_event;
148
*error_basep = info->codes->first_error;
156
Bool XDGAQueryVersion(
161
XExtDisplayInfo *info = xdga_find_display (dpy);
162
xXDGAQueryVersionReply rep;
163
xXDGAQueryVersionReq *req;
165
XDGACheckExtension (dpy, info, False);
168
GetReq(XDGAQueryVersion, req);
169
req->reqType = info->codes->major_opcode;
170
req->dgaReqType = X_XDGAQueryVersion;
171
if (!_XReply(dpy, (xReply *)&rep, 0, xFalse)) {
176
*majorVersion = rep.majorVersion;
177
*minorVersion = rep.minorVersion;
180
if (*majorVersion >= 2)
184
for (i = 0, j = info->codes->first_event;
185
i < XF86DGANumberEvents;
188
XESetWireToEvent (dpy, j, xdga_wire_to_event);
189
XESetEventToWire (dpy, j, xdga_event_to_wire);
191
XDGASetClientVersion(dpy);
196
Bool XDGASetClientVersion(
199
XExtDisplayInfo *info = xdga_find_display (dpy);
200
xXDGASetClientVersionReq *req;
202
XDGACheckExtension (dpy, info, False);
205
GetReq(XDGASetClientVersion, req);
206
req->reqType = info->codes->major_opcode;
207
req->dgaReqType = X_XDGASetClientVersion;
208
req->major = XDGA_MAJOR_VERSION;
209
req->minor = XDGA_MINOR_VERSION;
215
Bool XDGAOpenFramebuffer(
219
XExtDisplayInfo *info = xdga_find_display (dpy);
220
xXDGAOpenFramebufferReply rep;
221
xXDGAOpenFramebufferReq *req;
222
char *deviceName = NULL;
225
XDGACheckExtension (dpy, info, False);
228
GetReq(XDGAOpenFramebuffer, req);
229
req->reqType = info->codes->major_opcode;
230
req->dgaReqType = X_XDGAOpenFramebuffer;
231
req->screen = screen;
232
if (!_XReply(dpy, (xReply *)&rep, 0, xFalse)) {
239
deviceName = Xmalloc(rep.length << 2);
240
_XRead(dpy, deviceName, rep.length << 2);
243
ret = XDGAMapFramebuffer(screen, deviceName,
244
(unsigned char*)(long)rep.mem1,
245
rep.size, rep.offset, rep.extra);
255
void XDGACloseFramebuffer(
259
XExtDisplayInfo *info = xdga_find_display (dpy);
260
xXDGACloseFramebufferReq *req;
262
XextSimpleCheckExtension (dpy, info, xdga_extension_name);
264
XDGAUnmapFramebuffer(screen);
267
GetReq(XDGACloseFramebuffer, req);
268
req->reqType = info->codes->major_opcode;
269
req->dgaReqType = X_XDGACloseFramebuffer;
270
req->screen = screen;
277
XDGAMode* XDGAQueryModes(
282
XExtDisplayInfo *dinfo = xdga_find_display (dpy);
283
xXDGAQueryModesReply rep;
284
xXDGAQueryModesReq *req;
285
XDGAMode *modes = NULL;
289
XDGACheckExtension (dpy, dinfo, NULL);
292
GetReq(XDGAQueryModes, req);
293
req->reqType = dinfo->codes->major_opcode;
294
req->dgaReqType = X_XDGAQueryModes;
295
req->screen = screen;
297
if (_XReply(dpy, (xReply *)&rep, 0, xFalse)) {
303
size = rep.length << 2;
304
size -= rep.number * sz_xXDGAModeInfo; /* find text size */
305
modes = (XDGAMode*)Xmalloc((rep.number * sizeof(XDGAMode)) + size);
306
offset = (char*)(&modes[rep.number]); /* start of text */
310
for(i = 0; i < rep.number; i++) {
311
_XRead(dpy, (char*)(&info), sz_xXDGAModeInfo);
313
modes[i].num = info.num;
314
modes[i].verticalRefresh =
315
(float)info.vsync_num / (float)info.vsync_den;
316
modes[i].flags = info.flags;
317
modes[i].imageWidth = info.image_width;
318
modes[i].imageHeight = info.image_height;
319
modes[i].pixmapWidth = info.pixmap_width;
320
modes[i].pixmapHeight = info.pixmap_height;
321
modes[i].bytesPerScanline = info.bytes_per_scanline;
322
modes[i].byteOrder = info.byte_order;
323
modes[i].depth = info.depth;
324
modes[i].bitsPerPixel = info.bpp;
325
modes[i].redMask = info.red_mask;
326
modes[i].greenMask = info.green_mask;
327
modes[i].blueMask = info.blue_mask;
328
modes[i].visualClass = info.visual_class;
329
modes[i].viewportWidth = info.viewport_width;
330
modes[i].viewportHeight = info.viewport_height;
331
modes[i].xViewportStep = info.viewport_xstep;
332
modes[i].yViewportStep = info.viewport_ystep;
333
modes[i].maxViewportX = info.viewport_xmax;
334
modes[i].maxViewportY = info.viewport_ymax;
335
modes[i].viewportFlags = info.viewport_flags;
336
modes[i].reserved1 = info.reserved1;
337
modes[i].reserved2 = info.reserved2;
339
_XRead(dpy, offset, info.name_size);
340
modes[i].name = offset;
341
offset += info.name_size;
345
_XEatData(dpy, rep.length << 2);
362
XExtDisplayInfo *dinfo = xdga_find_display (dpy);
363
xXDGASetModeReply rep;
364
xXDGASetModeReq *req;
365
XDGADevice *dev = NULL;
368
XDGACheckExtension (dpy, dinfo, NULL);
371
GetReq(XDGASetMode, req);
372
req->reqType = dinfo->codes->major_opcode;
373
req->dgaReqType = X_XDGASetMode;
374
req->screen = screen;
376
req->pid = pid = XAllocID(dpy);
378
if (_XReply(dpy, (xReply *)&rep, 0, xFalse)) {
383
size = rep.length << 2;
384
size -= sz_xXDGAModeInfo; /* get text size */
386
dev = (XDGADevice*)Xmalloc(sizeof(XDGADevice) + size);
389
_XRead(dpy, (char*)(&info), sz_xXDGAModeInfo);
391
dev->mode.num = info.num;
392
dev->mode.verticalRefresh =
393
(float)info.vsync_num / (float)info.vsync_den;
394
dev->mode.flags = info.flags;
395
dev->mode.imageWidth = info.image_width;
396
dev->mode.imageHeight = info.image_height;
397
dev->mode.pixmapWidth = info.pixmap_width;
398
dev->mode.pixmapHeight = info.pixmap_height;
399
dev->mode.bytesPerScanline = info.bytes_per_scanline;
400
dev->mode.byteOrder = info.byte_order;
401
dev->mode.depth = info.depth;
402
dev->mode.bitsPerPixel = info.bpp;
403
dev->mode.redMask = info.red_mask;
404
dev->mode.greenMask = info.green_mask;
405
dev->mode.blueMask = info.blue_mask;
406
dev->mode.visualClass = info.visual_class;
407
dev->mode.viewportWidth = info.viewport_width;
408
dev->mode.viewportHeight = info.viewport_height;
409
dev->mode.xViewportStep = info.viewport_xstep;
410
dev->mode.yViewportStep = info.viewport_ystep;
411
dev->mode.maxViewportX = info.viewport_xmax;
412
dev->mode.maxViewportY = info.viewport_ymax;
413
dev->mode.viewportFlags = info.viewport_flags;
414
dev->mode.reserved1 = info.reserved1;
415
dev->mode.reserved2 = info.reserved2;
417
dev->mode.name = (char*)(&dev[1]);
418
_XRead(dpy, dev->mode.name, info.name_size);
420
dev->pixmap = (rep.flags & XDGAPixmap) ? pid : 0;
421
dev->data = XDGAGetMappedMemory(screen);
424
dev->data += rep.offset;
426
/* not sure what to do if the allocation fails */
437
void XDGASetViewport(
444
XExtDisplayInfo *info = xdga_find_display (dpy);
445
xXDGASetViewportReq *req;
447
XextSimpleCheckExtension (dpy, info, xdga_extension_name);
450
GetReq(XDGASetViewport, req);
451
req->reqType = info->codes->major_opcode;
452
req->dgaReqType = X_XDGASetViewport;
453
req->screen = screen;
462
void XDGAInstallColormap(
467
XExtDisplayInfo *info = xdga_find_display (dpy);
468
xXDGAInstallColormapReq *req;
470
XextSimpleCheckExtension (dpy, info, xdga_extension_name);
473
GetReq(XDGAInstallColormap, req);
474
req->reqType = info->codes->major_opcode;
475
req->dgaReqType = X_XDGAInstallColormap;
476
req->screen = screen;
482
void XDGASelectInput(
487
XExtDisplayInfo *info = xdga_find_display (dpy);
488
xXDGASelectInputReq *req;
490
XextSimpleCheckExtension (dpy, info, xdga_extension_name);
493
GetReq(XDGASelectInput, req);
494
req->reqType = info->codes->major_opcode;
495
req->dgaReqType = X_XDGASelectInput;
496
req->screen = screen;
502
void XDGAFillRectangle(
511
XExtDisplayInfo *info = xdga_find_display (dpy);
512
xXDGAFillRectangleReq *req;
514
XextSimpleCheckExtension (dpy, info, xdga_extension_name);
517
GetReq(XDGAFillRectangle, req);
518
req->reqType = info->codes->major_opcode;
519
req->dgaReqType = X_XDGAFillRectangle;
520
req->screen = screen;
524
req->height = height;
540
XExtDisplayInfo *info = xdga_find_display (dpy);
541
xXDGACopyAreaReq *req;
543
XextSimpleCheckExtension (dpy, info, xdga_extension_name);
546
GetReq(XDGACopyArea, req);
547
req->reqType = info->codes->major_opcode;
548
req->dgaReqType = X_XDGACopyArea;
549
req->screen = screen;
553
req->height = height;
560
void XDGACopyTransparentArea(
571
XExtDisplayInfo *info = xdga_find_display (dpy);
572
xXDGACopyTransparentAreaReq *req;
574
XextSimpleCheckExtension (dpy, info, xdga_extension_name);
577
GetReq(XDGACopyTransparentArea, req);
578
req->reqType = info->codes->major_opcode;
579
req->dgaReqType = X_XDGACopyTransparentArea;
580
req->screen = screen;
584
req->height = height;
593
int XDGAGetViewportStatus(
597
XExtDisplayInfo *info = xdga_find_display (dpy);
598
xXDGAGetViewportStatusReply rep;
599
xXDGAGetViewportStatusReq *req;
602
XDGACheckExtension (dpy, info, 0);
605
GetReq(XDGAGetViewportStatus, req);
606
req->reqType = info->codes->major_opcode;
607
req->dgaReqType = X_XDGAGetViewportStatus;
608
req->screen = screen;
609
if (!_XReply(dpy, (xReply *)&rep, 0, xFalse))
620
XExtDisplayInfo *info = xdga_find_display (dpy);
624
XextSimpleCheckExtension (dpy, info, xdga_extension_name);
627
GetReq(XDGASync, req);
628
req->reqType = info->codes->major_opcode;
629
req->dgaReqType = X_XDGASync;
630
req->screen = screen;
631
_XReply(dpy, (xReply *)&rep, 0, xFalse);
637
void XDGAChangePixmapMode(
644
XExtDisplayInfo *info = xdga_find_display (dpy);
645
xXDGAChangePixmapModeReq *req;
646
xXDGAChangePixmapModeReply rep;
648
XextSimpleCheckExtension (dpy, info, xdga_extension_name);
651
GetReq(XDGAChangePixmapMode, req);
652
req->reqType = info->codes->major_opcode;
653
req->dgaReqType = X_XDGAChangePixmapMode;
654
req->screen = screen;
658
_XReply(dpy, (xReply *)&rep, 0, xFalse);
665
Colormap XDGACreateColormap(
671
XExtDisplayInfo *info = xdga_find_display (dpy);
672
xXDGACreateColormapReq *req;
675
XDGACheckExtension (dpy, info, -1);
678
GetReq(XDGACreateColormap, req);
679
req->reqType = info->codes->major_opcode;
680
req->dgaReqType = X_XDGACreateColormap;
681
req->screen = screen;
682
req->mode = dev->mode.num;
684
cid = req->id = XAllocID(dpy);
692
void XDGAKeyEventToXKeyEvent(
697
xk->serial = dk->serial;
698
xk->send_event = False;
699
xk->display = dk->display;
700
xk->window = RootWindow(dk->display, dk->screen);
701
xk->root = xk->window;
702
xk->subwindow = None;
704
xk->x = xk->y = xk->x_root = xk->y_root = 0;
705
xk->state = dk->state;
706
xk->keycode = dk->keycode;
707
xk->same_screen = True;
711
#include <X11/extensions/xf86dga.h>
716
# define HAS_SVR3_MMAP
717
# include <sys/types.h>
720
# include <sys/at_ansi.h>
723
# include <sys/sysmacros.h>
724
# include <sys/immu.h>
725
# include <sys/region.h>
727
# include <sys/mmap.h>
729
# if defined(Lynx) && defined(NO_MMAP)
730
# include <sys/types.h>
734
# if !defined(__UNIXOS2__)
735
# include <sys/mman.h>
739
#include <sys/wait.h>
743
#if defined(SVR4) && !defined(sun) && !defined(SCO325)
744
#define DEV_MEM "/dev/pmem"
745
#elif defined(SVR4) && defined(sun)
746
#define DEV_MEM "/dev/xsvc"
748
#define DEV_MEM "/dev/mem"
753
typedef struct _DGAMapRec{
754
unsigned char *physical;
755
unsigned char *virtual;
759
struct _DGAMapRec *next;
760
} DGAMapRec, *DGAMapPtr;
763
DGAMapPhysical(int, char*, unsigned char*, CARD32, CARD32, CARD32, DGAMapPtr);
764
static void DGAUnmapPhysical(DGAMapPtr);
766
static DGAMapPtr _Maps = NULL;
770
XDGAGetMappedMemory(int screen)
772
DGAMapPtr pMap = _Maps;
773
unsigned char *pntr = NULL;
775
while(pMap != NULL) {
776
if(pMap->screen == screen) {
777
pntr = pMap->virtual;
789
char *name, /* optional device name */
790
unsigned char* base, /* physical memory */
791
CARD32 size, /* size */
792
CARD32 offset, /* optional offset */
793
CARD32 extra /* optional extra data */
795
DGAMapPtr pMap = _Maps;
798
/* is it already mapped ? */
799
while(pMap != NULL) {
800
if(pMap->screen == screen)
805
if(extra & XDGANeedRoot) {
806
/* we should probably check if we have root permissions and
811
pMap = (DGAMapPtr)Xmalloc(sizeof(DGAMapRec));
813
result = DGAMapPhysical(screen, name, base, size, offset, extra, pMap);
825
XDGAUnmapFramebuffer(int screen)
827
DGAMapPtr pMap = _Maps;
828
DGAMapPtr pPrev = NULL;
830
/* is it already mapped */
831
while(pMap != NULL) {
832
if(pMap->screen == screen)
841
DGAUnmapPhysical(pMap);
846
pPrev->next = pMap->next;
855
char *name, /* optional device name */
856
unsigned char* base, /* physical memory */
857
CARD32 size, /* size */
858
CARD32 offset, /* optional offset */
859
CARD32 extra, /* optional extra data */
862
#if defined(ISC) && defined(HAS_SVR3_MMAP)
863
struct kd_memloc mloc;
864
#elif defined(__UNIXOS2__)
872
pMap->screen = screen;
873
pMap->physical = base;
876
#if defined(ISC) && defined(HAS_SVR3_MMAP)
877
if ((pMap->fd = open("/dev/mmap", O_RDWR)) < 0)
879
mloc.vaddr = (char *)0;
880
mloc.physaddr = (char *)base;
884
if ((pMap->virtual = (void *)ioctl(pMap->fd, MAP, &mloc)) == (void *)-1)
886
#elif defined (__UNIXOS2__)
888
* Dragon warning here! /dev/pmap$ is never closed, except on progam exit.
889
* Consecutive calling of this routine will make PMAP$ driver run out
890
* of memory handles. Some umap/close mechanism should be provided
893
rc = DosOpen("/dev/pmap$", &hfd, &action, 0, FILE_NORMAL, FILE_OPEN,
894
OPEN_ACCESS_READWRITE | OPEN_SHARE_DENYNONE, (PEAOP2)NULL);
906
#define XFREE86_PMAP 0x76
907
#define PMAP_MAP 0x44
911
rc = DosDevIOCtl(hfd, XFREE86_PMAP, PMAP_MAP,
912
(PULONG)&pmap, sizeof(pmap), &plen,
913
(PULONG)&dmap, sizeof(dmap), &dlen);
915
pMap->virtual = dmap.a.user;
920
#elif defined (Lynx) && defined(NO_MMAP)
921
pMap->virtual = smem_create("XF86DGA", (char*)base, size, SM_READ|SM_WRITE);
928
if ((pMap->fd = open(name, O_RDWR)) < 0)
930
pMap->virtual = mmap(NULL, size, PROT_READ | PROT_WRITE,
931
MAP_FILE | MAP_SHARED, pMap->fd, (off_t)base);
932
if (pMap->virtual == (void *)-1)
936
#if !defined(ISC) && !defined(HAS_SVR3_MMAP) \
937
&& !(defined(Lynx) && defined(NO_MMAP)) \
938
&& !defined(__UNIXOS2__)
939
mprotect(pMap->virtual, size, PROT_READ | PROT_WRITE);
948
DGAUnmapPhysical(DGAMapPtr pMap)
950
#if !defined(ISC) && !defined(HAS_SVR3_MMAP) \
951
&& !(defined(Lynx) && defined(NO_MMAP)) \
952
&& !defined(__UNIXOS2__)
953
mprotect(pMap->virtual,pMap->size, PROT_READ);
954
#elif defined(Lynx) && defined(NO_MMAP)
955
/* XXX this doesn't allow enable after disable */
956
smem_create(NULL, pMap->virtual, pMap->size, SM_DETACH);
957
smem_remove("XF86DGA");
961
/* We need to unmap and close too !!!!!!!!!!*/