diff options
author | Rik Faith | 2001-02-28 03:27:44 -0600 |
---|---|---|
committer | Rik Faith | 2001-02-28 03:27:44 -0600 |
commit | 88dbee54ed400a3fd5594fab506518c171167805 (patch) | |
tree | 12b1b92826c3039c05cd0f43d6a0c72a37877ae6 /tests/dristat.c | |
parent | c4a247d26228b2506fcb1c5cac2302a22e91219e (diff) | |
download | external-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.c | 239 |
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 | |
46 | typedef 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 | ||
61 | static void getversion(int fd) | 44 | static void getversion(int fd) |
62 | { | 45 | { |
@@ -78,6 +61,15 @@ static void getversion(int fd) | |||
78 | } | 61 | } |
79 | } | 62 | } |
80 | 63 | ||
64 | static 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 | ||
81 | typedef struct { | 73 | typedef 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 | |
92 | int 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 | |||
109 | int 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 | |||
124 | int 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 | ||
246 | static void getvm(int fd) | 85 | static 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 | ||
397 | static 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 | |||
435 | int main(int argc, char **argv) | 240 | int 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); |