8 #include "xf86drmMode.h"
10 const char* getConnectionText(drmModeConnection conn)
13 case DRM_MODE_CONNECTED:
15 case DRM_MODE_DISCONNECTED:
16 return "disconnected";
23 struct drm_mode_modeinfo* findMode(drmModeResPtr res, uint32_t id)
26 for (i = 0; i < res->count_modes; i++) {
27 if (res->modes[i].id == id)
28 return &res->modes[i];
34 int printMode(struct drm_mode_modeinfo *mode)
37 printf("Mode: %s\n", mode->name);
38 printf("\tclock : %i\n", mode->clock);
39 printf("\thdisplay : %i\n", mode->hdisplay);
40 printf("\thsync_start : %i\n", mode->hsync_start);
41 printf("\thsync_end : %i\n", mode->hsync_end);
42 printf("\thtotal : %i\n", mode->htotal);
43 printf("\thskew : %i\n", mode->hskew);
44 printf("\tvdisplay : %i\n", mode->vdisplay);
45 printf("\tvsync_start : %i\n", mode->vsync_start);
46 printf("\tvsync_end : %i\n", mode->vsync_end);
47 printf("\tvtotal : %i\n", mode->vtotal);
48 printf("\tvscan : %i\n", mode->vscan);
49 printf("\tvrefresh : %i\n", mode->vrefresh);
50 printf("\tflags : %i\n", mode->flags);
52 printf("Mode: %i \"%s\" %ix%i %.0f\n", mode->id, mode->name,
53 mode->hdisplay, mode->vdisplay, mode->vrefresh / 1000.0);
58 int printOutput(int fd, drmModeResPtr res, drmModeOutputPtr output, uint32_t id)
61 struct drm_mode_modeinfo *mode = NULL;
63 printf("Output: %s\n", output->name);
64 printf("\tid : %i\n", id);
65 printf("\tcrtc id : %i\n", output->crtc);
66 printf("\tconn : %s\n", getConnectionText(output->connection));
67 printf("\tsize : %ix%i (mm)\n", output->mmWidth, output->mmHeight);
68 printf("\tcount_crtcs : %i\n", output->count_crtcs);
69 printf("\tcrtcs : %i\n", output->crtcs);
70 printf("\tcount_clones : %i\n", output->count_clones);
71 printf("\tclones : %i\n", output->clones);
72 printf("\tcount_modes : %i\n", output->count_modes);
74 for (i = 0; i < output->count_modes; i++) {
75 mode = findMode(res, output->modes[i]);
78 printf("\t\tmode: %i \"%s\" %ix%i %.0f\n", mode->id, mode->name,
79 mode->hdisplay, mode->vdisplay, mode->vrefresh / 1000.0);
81 printf("\t\tmode: Invalid mode %i\n", output->modes[i]);
87 int printCrtc(int fd, drmModeResPtr res, drmModeCrtcPtr crtc, uint32_t id)
90 printf("\tid : %i\n", id);
91 printf("\tx : %i\n", crtc->x);
92 printf("\ty : %i\n", crtc->y);
93 printf("\twidth : %i\n", crtc->width);
94 printf("\theight : %i\n", crtc->height);
95 printf("\tmode : %i\n", crtc->mode);
96 printf("\tnum outputs : %i\n", crtc->count_outputs);
97 printf("\toutputs : %i\n", crtc->outputs);
98 printf("\tnum possible : %i\n", crtc->count_possibles);
99 printf("\tpossibles : %i\n", crtc->possibles);
104 int printFrameBuffer(int fd, drmModeResPtr res, drmModeFBPtr fb)
106 printf("Framebuffer\n");
107 printf("\thandle : %i\n", fb->handle);
108 printf("\twidth : %i\n", fb->width);
109 printf("\theight : %i\n", fb->height);
110 printf("\tpitch : %i\n", fb->pitch);;
111 printf("\tbpp : %i\n", fb->bpp);
112 printf("\tdepth : %i\n", fb->depth);
113 printf("\tbuffer_id : %i\n", fb->buffer_id);
118 int printRes(int fd, drmModeResPtr res)
121 drmModeOutputPtr output;
125 for (i = 0; i < res->count_modes; i++) {
126 printMode(&res->modes[i]);
129 for (i = 0; i < res->count_outputs; i++) {
130 output = drmModeGetOutput(fd, res->outputs[i]);
133 printf("Could not get output %i\n", i);
135 printOutput(fd, res, output, res->outputs[i]);
136 drmModeFreeOutput(output);
140 for (i = 0; i < res->count_crtcs; i++) {
141 crtc = drmModeGetCrtc(fd, res->crtcs[i]);
144 printf("Could not get crtc %i\n", i);
146 printCrtc(fd, res, crtc, res->crtcs[i]);
147 drmModeFreeCrtc(crtc);
151 for (i = 0; i < res->count_fbs; i++) {
152 fb = drmModeGetFB(fd, res->fbs[i]);
155 printf("Could not get fb %i\n", res->fbs[i]);
157 printFrameBuffer(fd, res, fb);
165 static struct drm_mode_modeinfo mode = {
178 .vrefresh = 60000, /* vertical refresh * 1000 */
182 int testMode(int fd, drmModeResPtr res)
184 uint32_t output = res->outputs[0];
185 uint32_t newMode = 0;
189 printf("Test: adding mode to output %i\n", output);
191 /* printMode(&mode); */
193 printf("\tAdding mode\n");
194 newMode = drmModeAddMode(fd, &mode);
198 printf("\tAttaching mode %i to output %i\n", newMode, output);
200 ret = drmModeAttachMode(fd, output, newMode);
205 printf("\tDetaching mode %i from output %i\n", newMode, output);
206 ret = drmModeDetachMode(fd, output, newMode);
211 printf("\tRemoveing new mode %i\n", newMode);
212 ret = drmModeRmMode(fd, newMode);
219 error = drmModeRmMode(fd, newMode);
222 printf("\tFailed\n");
225 printf("\tFailed to delete mode %i\n", newMode);
231 int testFrameBufferGet(int fd, uint32_t fb)
235 printf("Test: get framebuffer %i\n", fb);
237 frame = drmModeGetFB(fd, fb);
240 printf("\tFailed\n");
242 printFrameBuffer(fd, frame);
243 drmModeFreeFB(frame);
250 int testFrameBufferAdd(int fd, drmModeResPtr res)
254 drmModeFBPtr frame = 0;
257 printf("Test: adding framebuffer\n");
259 printf("\tCreating BO\n");
266 printf("\tAdding FB\n");
267 ret = drmModeAddFB(fd, 640, 480, 32, 8, 0, &bo, &fb);
271 frame = drmModeGetFB(fd, fb);
274 printf("Couldn't retrive created framebuffer\n");
276 printFrameBuffer(fd, res, frame);
277 drmModeFreeFB(frame);
280 printf("\tRemoveing FB\n");
282 ret = drmModeRmFB(fd, fb);
285 printf("\tFailed this shouldn't happen!\n");
289 printf("\tRemoveing BO\n");
291 ret = drmBODestroy(fb, &bo);
296 drmBODestroy(fd, &bo);
299 printf("\tFailed\n");
305 int main(int argc, char **argv)
308 const char *driver = "i915"; /* hardcoded for now */
311 printf("Starting test\n");
313 fd = drmOpen(driver, NULL);
316 printf("Failed to open the card fb\n");
320 res = drmModeGetResources(fd);
322 printf("Failed to get resources from card\n");
331 testFrameBufferAdd(fd, res);
333 drmModeFreeResources(res);