aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRik Faith2001-02-28 03:27:44 -0600
committerRik Faith2001-02-28 03:27:44 -0600
commit88dbee54ed400a3fd5594fab506518c171167805 (patch)
tree12b1b92826c3039c05cd0f43d6a0c72a37877ae6 /tests/dristat.c
parentc4a247d26228b2506fcb1c5cac2302a22e91219e (diff)
downloadexternal-libdrm-88dbee54ed400a3fd5594fab506518c171167805.tar.gz
external-libdrm-88dbee54ed400a3fd5594fab506518c171167805.tar.xz
external-libdrm-88dbee54ed400a3fd5594fab506518c171167805.zip
Implement drmOpen* without /proc dependence (Fallback to /proc is included
for backward compatibility.) Move statistic-gathering drm* calls from dristat.c to xf86drm.c
Diffstat (limited to 'tests/dristat.c')
-rw-r--r--tests/dristat.c239
1 files changed, 23 insertions, 216 deletions
diff --git a/tests/dristat.c b/tests/dristat.c
index f429efd3..47193ab4 100644
--- a/tests/dristat.c
+++ b/tests/dristat.c
@@ -35,28 +35,11 @@
35#include "../xf86drmHash.c" 35#include "../xf86drmHash.c"
36#include "../xf86drm.c" 36#include "../xf86drm.c"
37 37
38#define DRM_DIR_NAME "/dev/dri"
39#define DRM_DEV_NAME "%s/card%d"
40
41#define DRM_VERSION 0x00000001 38#define DRM_VERSION 0x00000001
42#define DRM_MEMORY 0x00000002 39#define DRM_MEMORY 0x00000002
43#define DRM_CLIENTS 0x00000004 40#define DRM_CLIENTS 0x00000004
44#define DRM_STATS 0x00000008 41#define DRM_STATS 0x00000008
45 42#define DRM_BUSID 0x00000010
46typedef struct drmStatsS {
47 unsigned long count;
48 struct {
49 unsigned long value;
50 const char *long_format;
51 const char *long_name;
52 const char *rate_format;
53 const char *rate_name;
54 int isvalue;
55 const char *mult_names;
56 int mult;
57 int verbose;
58 } data[15];
59} drmStatsT;
60 43
61static void getversion(int fd) 44static void getversion(int fd)
62{ 45{
@@ -78,6 +61,15 @@ static void getversion(int fd)
78 } 61 }
79} 62}
80 63
64static void getbusid(int fd)
65{
66 const char *busid = drmGetBusid(fd);
67
68 printf(" Busid: %s\n", *busid ? busid : "(not set)");
69 drmFreeBusid(busid);
70}
71
72#if 0
81typedef struct { 73typedef struct {
82 unsigned long offset; /* Requested physical address (0 for SAREA)*/ 74 unsigned long offset; /* Requested physical address (0 for SAREA)*/
83 unsigned long size; /* Requested physical size (bytes) */ 75 unsigned long size; /* Requested physical size (bytes) */
@@ -88,160 +80,7 @@ typedef struct {
88 int mtrr; /* MTRR slot used */ 80 int mtrr; /* MTRR slot used */
89 /* Private data */ 81 /* Private data */
90} drmVmRec, *drmVmPtr; 82} drmVmRec, *drmVmPtr;
91 83#endif
92int drmGetMap(int fd, int idx, drmHandle *offset, drmSize *size,
93 drmMapType *type, drmMapFlags *flags, drmHandle *handle,
94 int *mtrr)
95{
96 drm_map_t map;
97
98 map.offset = idx;
99 if (ioctl(fd, DRM_IOCTL_GET_MAP, &map)) return -errno;
100 *offset = map.offset;
101 *size = map.size;
102 *type = map.type;
103 *flags = map.flags;
104 *handle = (unsigned long)map.handle;
105 *mtrr = map.mtrr;
106 return 0;
107}
108
109int drmGetClient(int fd, int idx, int *auth, int *pid, int *uid,
110 unsigned long *magic, unsigned long *iocs)
111{
112 drm_client_t client;
113
114 client.idx = idx;
115 if (ioctl(fd, DRM_IOCTL_GET_CLIENT, &client)) return -errno;
116 *auth = client.auth;
117 *pid = client.pid;
118 *uid = client.uid;
119 *magic = client.magic;
120 *iocs = client.iocs;
121 return 0;
122}
123
124int drmGetStats(int fd, drmStatsT *stats)
125{
126 drm_stats_t s;
127 int i;
128
129 if (ioctl(fd, DRM_IOCTL_GET_STATS, &s)) return -errno;
130
131 stats->count = 0;
132 memset(stats, 0, sizeof(*stats));
133 if (s.count > sizeof(stats->data)/sizeof(stats->data[0]))
134 return -1;
135
136#define SET_VALUE \
137 stats->data[i].long_format = "%-20.20s"; \
138 stats->data[i].rate_format = "%8.8s"; \
139 stats->data[i].isvalue = 1; \
140 stats->data[i].verbose = 0
141
142#define SET_COUNT \
143 stats->data[i].long_format = "%-20.20s"; \
144 stats->data[i].rate_format = "%5.5s"; \
145 stats->data[i].isvalue = 0; \
146 stats->data[i].mult_names = "kgm"; \
147 stats->data[i].mult = 1000; \
148 stats->data[i].verbose = 0
149
150#define SET_BYTE \
151 stats->data[i].long_format = "%-9.9s"; \
152 stats->data[i].rate_format = "%5.5s"; \
153 stats->data[i].isvalue = 0; \
154 stats->data[i].mult_names = "KGM"; \
155 stats->data[i].mult = 1024; \
156 stats->data[i].verbose = 0
157
158
159 stats->count = s.count;
160 for (i = 0; i < s.count; i++) {
161 stats->data[i].value = s.data[i].value;
162 switch (s.data[i].type) {
163 case _DRM_STAT_LOCK:
164 stats->data[i].long_name = "Lock";
165 stats->data[i].rate_name = "Lock";
166 SET_VALUE;
167 break;
168 case _DRM_STAT_OPENS:
169 stats->data[i].long_name = "Opens";
170 stats->data[i].rate_name = "O";
171 SET_COUNT;
172 stats->data[i].verbose = 1;
173 break;
174 case _DRM_STAT_CLOSES:
175 stats->data[i].long_name = "Closes";
176 stats->data[i].rate_name = "Lock";
177 SET_COUNT;
178 stats->data[i].verbose = 1;
179 break;
180 case _DRM_STAT_IOCTLS:
181 stats->data[i].long_name = "Ioctls";
182 stats->data[i].rate_name = "Ioc/s";
183 SET_COUNT;
184 break;
185 case _DRM_STAT_LOCKS:
186 stats->data[i].long_name = "Locks";
187 stats->data[i].rate_name = "Lck/s";
188 SET_COUNT;
189 break;
190 case _DRM_STAT_UNLOCKS:
191 stats->data[i].long_name = "Unlocks";
192 stats->data[i].rate_name = "Unl/s";
193 SET_COUNT;
194 break;
195 case _DRM_STAT_IRQ:
196 stats->data[i].long_name = "IRQs";
197 stats->data[i].rate_name = "IRQ/s";
198 SET_COUNT;
199 break;
200 case _DRM_STAT_PRIMARY:
201 stats->data[i].long_name = "Primary Bytes";
202 stats->data[i].rate_name = "PB/s";
203 SET_BYTE;
204 break;
205 case _DRM_STAT_SECONDARY:
206 stats->data[i].long_name = "Secondary Bytes";
207 stats->data[i].rate_name = "SB/s";
208 SET_BYTE;
209 break;
210 case _DRM_STAT_DMA:
211 stats->data[i].long_name = "DMA";
212 stats->data[i].rate_name = "DMA/s";
213 SET_COUNT;
214 break;
215 case _DRM_STAT_SPECIAL:
216 stats->data[i].long_name = "Special DMA";
217 stats->data[i].rate_name = "dma/s";
218 SET_COUNT;
219 break;
220 case _DRM_STAT_MISSED:
221 stats->data[i].long_name = "Miss";
222 stats->data[i].rate_name = "Ms/s";
223 SET_COUNT;
224 break;
225 case _DRM_STAT_VALUE:
226 stats->data[i].long_name = "Value";
227 stats->data[i].rate_name = "Value";
228 SET_VALUE;
229 break;
230 case _DRM_STAT_BYTE:
231 stats->data[i].long_name = "Bytes";
232 stats->data[i].rate_name = "B/s";
233 SET_BYTE;
234 break;
235 case _DRM_STAT_COUNT:
236 default:
237 stats->data[i].long_name = "Count";
238 stats->data[i].rate_name = "Cnt/s";
239 SET_COUNT;
240 break;
241 }
242 }
243 return 0;
244}
245 84
246static void getvm(int fd) 85static void getvm(int fd)
247{ 86{
@@ -255,7 +94,7 @@ static void getvm(int fd)
255 drmHandle handle; 94 drmHandle handle;
256 int mtrr; 95 int mtrr;
257 96
258 printf(" VM map information:\n"); 97 printf(" VM map information (Restricted locked kernel WC Lock):\n");
259 printf(" slot offset size type flags address mtrr\n"); 98 printf(" slot offset size type flags address mtrr\n");
260 99
261 for (i = 0; 100 for (i = 0;
@@ -298,7 +137,7 @@ static void getclients(int fd)
298 int procfd; 137 int procfd;
299 138
300 printf(" DRI client information:\n"); 139 printf(" DRI client information:\n");
301 printf(" a pid uid magic ioctls prog\n"); 140 printf(" a pid uid magic ioctls prog\n");
302 141
303 for (i = 0; !drmGetClient(fd, i, &auth, &pid, &uid, &magic, &iocs); i++) { 142 for (i = 0; !drmGetClient(fd, i, &auth, &pid, &uid, &magic, &iocs); i++) {
304 sprintf(buf, "/proc/%d/cmdline", pid); 143 sprintf(buf, "/proc/%d/cmdline", pid);
@@ -307,12 +146,16 @@ static void getclients(int fd)
307 read(procfd, cmd, sizeof(cmd)-1); 146 read(procfd, cmd, sizeof(cmd)-1);
308 close(procfd); 147 close(procfd);
309 } 148 }
310 if (*cmd) 149 if (*cmd) {
150 char *pt;
151
152 for (pt = cmd; *pt; pt++) if (!isprint(*pt)) *pt = ' ';
311 printf(" %c %5d %5d %10lu %10lu %s\n", 153 printf(" %c %5d %5d %10lu %10lu %s\n",
312 auth ? 'y' : 'n', pid, uid, magic, iocs, cmd); 154 auth ? 'y' : 'n', pid, uid, magic, iocs, cmd);
313 else 155 } else {
314 printf(" %c %5d %5d %10lu %10lu\n", 156 printf(" %c %5d %5d %10lu %10lu\n",
315 auth ? 'y' : 'n', pid, uid, magic, iocs); 157 auth ? 'y' : 'n', pid, uid, magic, iocs);
158 }
316 } 159 }
317} 160}
318 161
@@ -394,44 +237,6 @@ static void getstats(int fd, int i)
394 237
395} 238}
396 239
397static int drmOpenMinor(int minor, uid_t user, gid_t group,
398 mode_t dirmode, mode_t devmode, int force)
399{
400 struct stat st;
401 char buf[64];
402 long dev = makedev(DRM_MAJOR, minor);
403 int setdir = 0;
404 int setdev = 0;
405 int fd;
406
407 if (stat(DRM_DIR_NAME, &st) || !S_ISDIR(st.st_mode)) {
408 remove(DRM_DIR_NAME);
409 mkdir(DRM_DIR_NAME, dirmode);
410 ++setdir;
411 }
412
413 if (force || setdir) {
414 chown(DRM_DIR_NAME, user, group);
415 chmod(DRM_DIR_NAME, dirmode);
416 }
417
418 sprintf(buf, DRM_DEV_NAME, DRM_DIR_NAME, minor);
419 if (stat(buf, &st) || st.st_rdev != dev) {
420 remove(buf);
421 mknod(buf, S_IFCHR, dev);
422 ++setdev;
423 }
424
425 if (force || setdev) {
426 chown(buf, user, group);
427 chmod(buf, devmode);
428 }
429
430 if ((fd = open(buf, O_RDWR, 0)) >= 0) return fd;
431 if (setdev) remove(buf);
432 return -errno;
433}
434
435int main(int argc, char **argv) 240int main(int argc, char **argv)
436{ 241{
437 int c; 242 int c;
@@ -442,13 +247,14 @@ int main(int argc, char **argv)
442 char buf[64]; 247 char buf[64];
443 int i; 248 int i;
444 249
445 while ((c = getopt(argc, argv, "avmcsM:i:")) != EOF) 250 while ((c = getopt(argc, argv, "avmcsbM:i:")) != EOF)
446 switch (c) { 251 switch (c) {
447 case 'a': mask = ~0; break; 252 case 'a': mask = ~0; break;
448 case 'v': mask |= DRM_VERSION; break; 253 case 'v': mask |= DRM_VERSION; break;
449 case 'm': mask |= DRM_MEMORY; break; 254 case 'm': mask |= DRM_MEMORY; break;
450 case 'c': mask |= DRM_CLIENTS; break; 255 case 'c': mask |= DRM_CLIENTS; break;
451 case 's': mask |= DRM_STATS; break; 256 case 's': mask |= DRM_STATS; break;
257 case 'b': mask |= DRM_BUSID; break;
452 case 'i': interval = strtol(optarg, NULL, 0); break; 258 case 'i': interval = strtol(optarg, NULL, 0); break;
453 case 'M': minor = strtol(optarg, NULL, 0); break; 259 case 'M': minor = strtol(optarg, NULL, 0); break;
454 default: 260 default:
@@ -458,9 +264,10 @@ int main(int argc, char **argv)
458 264
459 for (i = 0; i < 16; i++) if (!minor || i == minor) { 265 for (i = 0; i < 16; i++) if (!minor || i == minor) {
460 sprintf(buf, DRM_DEV_NAME, DRM_DIR_NAME, i); 266 sprintf(buf, DRM_DEV_NAME, DRM_DIR_NAME, i);
461 fd = drmOpenMinor(i, 0, 0, 0700, 0600, 0); 267 fd = drmOpenMinor(i, 1);
462 if (fd >= 0) { 268 if (fd >= 0) {
463 printf("%s\n", buf); 269 printf("%s\n", buf);
270 if (mask & DRM_BUSID) getbusid(fd);
464 if (mask & DRM_VERSION) getversion(fd); 271 if (mask & DRM_VERSION) getversion(fd);
465 if (mask & DRM_MEMORY) getvm(fd); 272 if (mask & DRM_MEMORY) getvm(fd);
466 if (mask & DRM_CLIENTS) getclients(fd); 273 if (mask & DRM_CLIENTS) getclients(fd);