patch to import Jon Smirl's work from Bitkeeper
[mesa.git] / src / glx / mini / drmtest.c
1 #include <assert.h>
2 #include <unistd.h>
3 #include <stdio.h>
4 #include <string.h>
5 #include "xf86drm.h"
6
7 char *pciBusID = "PCI:1:0:0";
8 #define DRM_PAGE_SIZE 4096
9 void *pSAREA;
10
11
12 static int client( void )
13 {
14 int fd, ret, err;
15 drmContext clientContext;
16
17 fprintf(stderr, "Opening client drm\n");
18
19 fd = drmOpen(NULL,pciBusID);
20 if (fd < 0) {
21 fprintf(stderr, "failed to open DRM: %s\n", strerror(-fd));
22 return 1;
23 }
24
25
26 fprintf(stderr, "Create server context\n");
27 if ((err = drmCreateContext(fd, &clientContext)) != 0) {
28 fprintf(stderr, "%s: drmCreateContext failed %d\n", __FUNCTION__, err);
29 return 0;
30 }
31
32
33 fprintf(stderr, "DRM_LOCK( %d %p %d )\n", fd, pSAREA, clientContext);
34 DRM_LOCK(fd, pSAREA, clientContext, 0);
35 fprintf(stderr, "locked\n");
36 DRM_UNLOCK(fd, pSAREA, clientContext);
37 fprintf(stderr, "DRM_UNLOCK finished\n");
38
39
40 fprintf(stderr, "Closing client drm: %d\n", fd);
41 ret = drmClose(fd);
42 fprintf(stderr, "done %d\n", ret);
43
44 return ret;
45 }
46
47 int main( int argc, char *argv[] )
48 {
49 char *drmModuleName = "radeon";
50 int drmFD;
51 int err;
52 int SAREASize;
53 drmHandle hSAREA;
54 drmContext serverContext;
55
56 /* Note that drmOpen will try to load the kernel module, if needed. */
57 drmFD = drmOpen(drmModuleName, NULL );
58 if (drmFD < 0) {
59 /* failed to open DRM */
60 fprintf(stderr, "[drm] drmOpen failed\n");
61 return 0;
62 }
63
64
65 if ((err = drmSetBusid(drmFD, pciBusID)) < 0) {
66 drmClose(drmFD);
67 fprintf(stderr, "[drm] drmSetBusid failed (%d, %s), %s\n",
68 drmFD, pciBusID, strerror(-err));
69 return 0;
70 }
71
72
73 SAREASize = DRM_PAGE_SIZE;
74
75 if (drmAddMap( drmFD,
76 0,
77 SAREASize,
78 DRM_SHM,
79 DRM_CONTAINS_LOCK,
80 &hSAREA) < 0)
81 {
82 drmClose(drmFD);
83 fprintf(stderr, "[drm] drmAddMap failed\n");
84 return 0;
85 }
86
87 fprintf(stderr, "[drm] added %d byte SAREA at 0x%08lx\n",
88 SAREASize, hSAREA);
89
90 if (drmMap( drmFD,
91 hSAREA,
92 SAREASize,
93 (drmAddressPtr)(&pSAREA)) < 0)
94 {
95 drmClose(drmFD);
96 fprintf(stderr, "[drm] drmMap failed\n");
97 return 0;
98 }
99
100 memset(pSAREA, 0, SAREASize);
101 fprintf(stderr, "[drm] mapped SAREA 0x%08lx to %p, size %d\n",
102 hSAREA, pSAREA, SAREASize);
103
104 fprintf(stderr, "Create server context\n");
105 if ((err = drmCreateContext(drmFD, &serverContext)) != 0) {
106 fprintf(stderr, "%s: drmCreateContext failed %d\n", __FUNCTION__, err);
107 return 0;
108 }
109
110
111 fprintf(stderr, "DRM_LOCK( %d %p %d )\n", drmFD, pSAREA, serverContext);
112 DRM_LOCK(drmFD, pSAREA, serverContext, 0);
113 fprintf(stderr, "locked\n");
114 DRM_UNLOCK(drmFD, pSAREA, serverContext);
115 fprintf(stderr, "DRM_UNLOCK finished\n");
116
117
118 client();
119
120
121 fprintf(stderr, "DRM_LOCK( %d %p %d )\n", drmFD, pSAREA, serverContext);
122 DRM_LOCK(drmFD, pSAREA, serverContext, 0);
123 fprintf(stderr, "locked\n");
124 DRM_UNLOCK(drmFD, pSAREA, serverContext);
125 fprintf(stderr, "DRM_UNLOCK finished\n");
126
127
128 drmUnmap(pSAREA, SAREASize);
129 fprintf(stderr, "[drm] unmapped SAREA 0x%08lx from %p, size %d\n",
130 hSAREA, pSAREA, SAREASize);
131 pSAREA = 0;
132
133 fprintf(stderr, "%s: Closing DRM fd\n", __FUNCTION__);
134 (void)drmClose(drmFD);
135
136 return 0;
137 }
138
139
140