1*7688df22SAndroid Build Coastguard Worker /*
2*7688df22SAndroid Build Coastguard Worker * \file modedemo.c
3*7688df22SAndroid Build Coastguard Worker * Test program to dump DRM kernel mode setting related information.
4*7688df22SAndroid Build Coastguard Worker * Queries the kernel for all available information and dumps it to stdout.
5*7688df22SAndroid Build Coastguard Worker *
6*7688df22SAndroid Build Coastguard Worker * \author Jakob Bornecrantz <[email protected]>
7*7688df22SAndroid Build Coastguard Worker */
8*7688df22SAndroid Build Coastguard Worker
9*7688df22SAndroid Build Coastguard Worker /*
10*7688df22SAndroid Build Coastguard Worker * Copyright (c) 2007-2008 Tungsten Graphics, Inc., Cedar Park, Texas.
11*7688df22SAndroid Build Coastguard Worker * Copyright (c) 2007-2008 Jakob Bornecrantz <[email protected]>
12*7688df22SAndroid Build Coastguard Worker *
13*7688df22SAndroid Build Coastguard Worker * Permission is hereby granted, free of charge, to any person obtaining a
14*7688df22SAndroid Build Coastguard Worker * copy of this software and associated documentation files (the "Software"),
15*7688df22SAndroid Build Coastguard Worker * to deal in the Software without restriction, including without limitation
16*7688df22SAndroid Build Coastguard Worker * the rights to use, copy, modify, merge, publish, distribute, sublicense,
17*7688df22SAndroid Build Coastguard Worker * and/or sell copies of the Software, and to permit persons to whom the
18*7688df22SAndroid Build Coastguard Worker * Software is furnished to do so, subject to the following conditions:
19*7688df22SAndroid Build Coastguard Worker *
20*7688df22SAndroid Build Coastguard Worker * The above copyright notice and this permission notice shall be included in
21*7688df22SAndroid Build Coastguard Worker * all copies or substantial portions of the Software.
22*7688df22SAndroid Build Coastguard Worker *
23*7688df22SAndroid Build Coastguard Worker * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
24*7688df22SAndroid Build Coastguard Worker * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
25*7688df22SAndroid Build Coastguard Worker * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
26*7688df22SAndroid Build Coastguard Worker * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
27*7688df22SAndroid Build Coastguard Worker * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
28*7688df22SAndroid Build Coastguard Worker * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
29*7688df22SAndroid Build Coastguard Worker * IN THE SOFTWARE.
30*7688df22SAndroid Build Coastguard Worker *
31*7688df22SAndroid Build Coastguard Worker */
32*7688df22SAndroid Build Coastguard Worker
33*7688df22SAndroid Build Coastguard Worker #include <assert.h>
34*7688df22SAndroid Build Coastguard Worker #include <stdio.h>
35*7688df22SAndroid Build Coastguard Worker #include <stdlib.h>
36*7688df22SAndroid Build Coastguard Worker #include <stdint.h>
37*7688df22SAndroid Build Coastguard Worker #include <unistd.h>
38*7688df22SAndroid Build Coastguard Worker #include <string.h>
39*7688df22SAndroid Build Coastguard Worker #include <inttypes.h>
40*7688df22SAndroid Build Coastguard Worker
41*7688df22SAndroid Build Coastguard Worker #include "xf86drm.h"
42*7688df22SAndroid Build Coastguard Worker #include "xf86drmMode.h"
43*7688df22SAndroid Build Coastguard Worker
44*7688df22SAndroid Build Coastguard Worker #include "util/common.h"
45*7688df22SAndroid Build Coastguard Worker #include "util/kms.h"
46*7688df22SAndroid Build Coastguard Worker
47*7688df22SAndroid Build Coastguard Worker int current;
48*7688df22SAndroid Build Coastguard Worker int connectors;
49*7688df22SAndroid Build Coastguard Worker int full_props;
50*7688df22SAndroid Build Coastguard Worker int edid;
51*7688df22SAndroid Build Coastguard Worker int modes;
52*7688df22SAndroid Build Coastguard Worker int full_modes;
53*7688df22SAndroid Build Coastguard Worker int encoders;
54*7688df22SAndroid Build Coastguard Worker int crtcs;
55*7688df22SAndroid Build Coastguard Worker int fbs;
56*7688df22SAndroid Build Coastguard Worker char *module_name;
57*7688df22SAndroid Build Coastguard Worker
printMode(struct drm_mode_modeinfo * mode)58*7688df22SAndroid Build Coastguard Worker static int printMode(struct drm_mode_modeinfo *mode)
59*7688df22SAndroid Build Coastguard Worker {
60*7688df22SAndroid Build Coastguard Worker if (full_modes) {
61*7688df22SAndroid Build Coastguard Worker printf("Mode: %s\n", mode->name);
62*7688df22SAndroid Build Coastguard Worker printf("\tclock : %i\n", mode->clock);
63*7688df22SAndroid Build Coastguard Worker printf("\thdisplay : %i\n", mode->hdisplay);
64*7688df22SAndroid Build Coastguard Worker printf("\thsync_start : %i\n", mode->hsync_start);
65*7688df22SAndroid Build Coastguard Worker printf("\thsync_end : %i\n", mode->hsync_end);
66*7688df22SAndroid Build Coastguard Worker printf("\thtotal : %i\n", mode->htotal);
67*7688df22SAndroid Build Coastguard Worker printf("\thskew : %i\n", mode->hskew);
68*7688df22SAndroid Build Coastguard Worker printf("\tvdisplay : %i\n", mode->vdisplay);
69*7688df22SAndroid Build Coastguard Worker printf("\tvsync_start : %i\n", mode->vsync_start);
70*7688df22SAndroid Build Coastguard Worker printf("\tvsync_end : %i\n", mode->vsync_end);
71*7688df22SAndroid Build Coastguard Worker printf("\tvtotal : %i\n", mode->vtotal);
72*7688df22SAndroid Build Coastguard Worker printf("\tvscan : %i\n", mode->vscan);
73*7688df22SAndroid Build Coastguard Worker printf("\tvrefresh : %i\n", mode->vrefresh);
74*7688df22SAndroid Build Coastguard Worker printf("\tflags : %i\n", mode->flags);
75*7688df22SAndroid Build Coastguard Worker } else {
76*7688df22SAndroid Build Coastguard Worker printf("Mode: \"%s\" %ix%i %i\n", mode->name,
77*7688df22SAndroid Build Coastguard Worker mode->hdisplay, mode->vdisplay, mode->vrefresh);
78*7688df22SAndroid Build Coastguard Worker }
79*7688df22SAndroid Build Coastguard Worker return 0;
80*7688df22SAndroid Build Coastguard Worker }
81*7688df22SAndroid Build Coastguard Worker
printProperty(int fd,drmModeResPtr res,drmModePropertyPtr props,uint64_t value)82*7688df22SAndroid Build Coastguard Worker static int printProperty(int fd, drmModeResPtr res, drmModePropertyPtr props, uint64_t value)
83*7688df22SAndroid Build Coastguard Worker {
84*7688df22SAndroid Build Coastguard Worker const char *name = NULL;
85*7688df22SAndroid Build Coastguard Worker int j;
86*7688df22SAndroid Build Coastguard Worker
87*7688df22SAndroid Build Coastguard Worker printf("Property: %s\n", props->name);
88*7688df22SAndroid Build Coastguard Worker printf("\tid : %i\n", props->prop_id);
89*7688df22SAndroid Build Coastguard Worker printf("\tflags : %i\n", props->flags);
90*7688df22SAndroid Build Coastguard Worker printf("\tcount_values : %d\n", props->count_values);
91*7688df22SAndroid Build Coastguard Worker
92*7688df22SAndroid Build Coastguard Worker
93*7688df22SAndroid Build Coastguard Worker if (props->count_values) {
94*7688df22SAndroid Build Coastguard Worker printf("\tvalues :");
95*7688df22SAndroid Build Coastguard Worker for (j = 0; j < props->count_values; j++)
96*7688df22SAndroid Build Coastguard Worker printf(" %" PRIu64, props->values[j]);
97*7688df22SAndroid Build Coastguard Worker printf("\n");
98*7688df22SAndroid Build Coastguard Worker }
99*7688df22SAndroid Build Coastguard Worker
100*7688df22SAndroid Build Coastguard Worker
101*7688df22SAndroid Build Coastguard Worker printf("\tcount_enums : %d\n", props->count_enums);
102*7688df22SAndroid Build Coastguard Worker
103*7688df22SAndroid Build Coastguard Worker if (props->flags & DRM_MODE_PROP_BLOB) {
104*7688df22SAndroid Build Coastguard Worker drmModePropertyBlobPtr blob;
105*7688df22SAndroid Build Coastguard Worker
106*7688df22SAndroid Build Coastguard Worker blob = drmModeGetPropertyBlob(fd, value);
107*7688df22SAndroid Build Coastguard Worker if (blob) {
108*7688df22SAndroid Build Coastguard Worker printf("blob is %d length, %08X\n", blob->length, *(uint32_t *)blob->data);
109*7688df22SAndroid Build Coastguard Worker drmModeFreePropertyBlob(blob);
110*7688df22SAndroid Build Coastguard Worker } else {
111*7688df22SAndroid Build Coastguard Worker printf("error getting blob %" PRIu64 "\n", value);
112*7688df22SAndroid Build Coastguard Worker }
113*7688df22SAndroid Build Coastguard Worker
114*7688df22SAndroid Build Coastguard Worker } else {
115*7688df22SAndroid Build Coastguard Worker for (j = 0; j < props->count_enums; j++) {
116*7688df22SAndroid Build Coastguard Worker printf("\t\t%" PRIu64" = %s\n", (uint64_t)props->enums[j].value, props->enums[j].name);
117*7688df22SAndroid Build Coastguard Worker if (props->enums[j].value == value)
118*7688df22SAndroid Build Coastguard Worker name = props->enums[j].name;
119*7688df22SAndroid Build Coastguard Worker }
120*7688df22SAndroid Build Coastguard Worker
121*7688df22SAndroid Build Coastguard Worker if (props->count_enums && name) {
122*7688df22SAndroid Build Coastguard Worker printf("\tcon_value : %s\n", name);
123*7688df22SAndroid Build Coastguard Worker } else {
124*7688df22SAndroid Build Coastguard Worker printf("\tcon_value : %" PRIu64 "\n", value);
125*7688df22SAndroid Build Coastguard Worker }
126*7688df22SAndroid Build Coastguard Worker }
127*7688df22SAndroid Build Coastguard Worker
128*7688df22SAndroid Build Coastguard Worker return 0;
129*7688df22SAndroid Build Coastguard Worker }
130*7688df22SAndroid Build Coastguard Worker
printConnector(int fd,drmModeResPtr res,drmModeConnectorPtr connector,uint32_t id)131*7688df22SAndroid Build Coastguard Worker static int printConnector(int fd, drmModeResPtr res, drmModeConnectorPtr connector, uint32_t id)
132*7688df22SAndroid Build Coastguard Worker {
133*7688df22SAndroid Build Coastguard Worker int i = 0;
134*7688df22SAndroid Build Coastguard Worker struct drm_mode_modeinfo *mode = NULL;
135*7688df22SAndroid Build Coastguard Worker drmModePropertyPtr props;
136*7688df22SAndroid Build Coastguard Worker const char *connector_type_name = NULL;
137*7688df22SAndroid Build Coastguard Worker
138*7688df22SAndroid Build Coastguard Worker connector_type_name = drmModeGetConnectorTypeName(connector->connector_type);
139*7688df22SAndroid Build Coastguard Worker
140*7688df22SAndroid Build Coastguard Worker if (connector_type_name)
141*7688df22SAndroid Build Coastguard Worker printf("Connector: %s-%d\n", connector_type_name,
142*7688df22SAndroid Build Coastguard Worker connector->connector_type_id);
143*7688df22SAndroid Build Coastguard Worker else
144*7688df22SAndroid Build Coastguard Worker printf("Connector: %d-%d\n", connector->connector_type,
145*7688df22SAndroid Build Coastguard Worker connector->connector_type_id);
146*7688df22SAndroid Build Coastguard Worker printf("\tid : %i\n", id);
147*7688df22SAndroid Build Coastguard Worker printf("\tencoder id : %i\n", connector->encoder_id);
148*7688df22SAndroid Build Coastguard Worker printf("\tconn : %s\n", util_lookup_connector_status_name(connector->connection));
149*7688df22SAndroid Build Coastguard Worker printf("\tsize : %ix%i (mm)\n", connector->mmWidth, connector->mmHeight);
150*7688df22SAndroid Build Coastguard Worker printf("\tcount_modes : %i\n", connector->count_modes);
151*7688df22SAndroid Build Coastguard Worker printf("\tcount_props : %i\n", connector->count_props);
152*7688df22SAndroid Build Coastguard Worker if (connector->count_props) {
153*7688df22SAndroid Build Coastguard Worker printf("\tprops :");
154*7688df22SAndroid Build Coastguard Worker for (i = 0; i < connector->count_props; i++)
155*7688df22SAndroid Build Coastguard Worker printf(" %i", connector->props[i]);
156*7688df22SAndroid Build Coastguard Worker printf("\n");
157*7688df22SAndroid Build Coastguard Worker }
158*7688df22SAndroid Build Coastguard Worker
159*7688df22SAndroid Build Coastguard Worker printf("\tcount_encoders : %i\n", connector->count_encoders);
160*7688df22SAndroid Build Coastguard Worker if (connector->count_encoders) {
161*7688df22SAndroid Build Coastguard Worker printf("\tencoders :");
162*7688df22SAndroid Build Coastguard Worker for (i = 0; i < connector->count_encoders; i++)
163*7688df22SAndroid Build Coastguard Worker printf(" %i", connector->encoders[i]);
164*7688df22SAndroid Build Coastguard Worker printf("\n");
165*7688df22SAndroid Build Coastguard Worker }
166*7688df22SAndroid Build Coastguard Worker
167*7688df22SAndroid Build Coastguard Worker if (modes) {
168*7688df22SAndroid Build Coastguard Worker for (i = 0; i < connector->count_modes; i++) {
169*7688df22SAndroid Build Coastguard Worker mode = (struct drm_mode_modeinfo *)&connector->modes[i];
170*7688df22SAndroid Build Coastguard Worker printMode(mode);
171*7688df22SAndroid Build Coastguard Worker }
172*7688df22SAndroid Build Coastguard Worker }
173*7688df22SAndroid Build Coastguard Worker
174*7688df22SAndroid Build Coastguard Worker if (full_props) {
175*7688df22SAndroid Build Coastguard Worker for (i = 0; i < connector->count_props; i++) {
176*7688df22SAndroid Build Coastguard Worker props = drmModeGetProperty(fd, connector->props[i]);
177*7688df22SAndroid Build Coastguard Worker if (props) {
178*7688df22SAndroid Build Coastguard Worker printProperty(fd, res, props, connector->prop_values[i]);
179*7688df22SAndroid Build Coastguard Worker drmModeFreeProperty(props);
180*7688df22SAndroid Build Coastguard Worker }
181*7688df22SAndroid Build Coastguard Worker }
182*7688df22SAndroid Build Coastguard Worker }
183*7688df22SAndroid Build Coastguard Worker
184*7688df22SAndroid Build Coastguard Worker return 0;
185*7688df22SAndroid Build Coastguard Worker }
186*7688df22SAndroid Build Coastguard Worker
printEncoder(int fd,drmModeResPtr res,drmModeEncoderPtr encoder,uint32_t id)187*7688df22SAndroid Build Coastguard Worker static int printEncoder(int fd, drmModeResPtr res, drmModeEncoderPtr encoder, uint32_t id)
188*7688df22SAndroid Build Coastguard Worker {
189*7688df22SAndroid Build Coastguard Worker const char *encoder_name;
190*7688df22SAndroid Build Coastguard Worker
191*7688df22SAndroid Build Coastguard Worker encoder_name = util_lookup_encoder_type_name(encoder->encoder_type);
192*7688df22SAndroid Build Coastguard Worker if (encoder_name)
193*7688df22SAndroid Build Coastguard Worker printf("Encoder: %s\n", encoder_name);
194*7688df22SAndroid Build Coastguard Worker else
195*7688df22SAndroid Build Coastguard Worker printf("Encoder\n");
196*7688df22SAndroid Build Coastguard Worker printf("\tid :%i\n", id);
197*7688df22SAndroid Build Coastguard Worker printf("\tcrtc_id :%d\n", encoder->crtc_id);
198*7688df22SAndroid Build Coastguard Worker printf("\ttype :%d\n", encoder->encoder_type);
199*7688df22SAndroid Build Coastguard Worker printf("\tpossible_crtcs :0x%x\n", encoder->possible_crtcs);
200*7688df22SAndroid Build Coastguard Worker printf("\tpossible_clones :0x%x\n", encoder->possible_clones);
201*7688df22SAndroid Build Coastguard Worker return 0;
202*7688df22SAndroid Build Coastguard Worker }
203*7688df22SAndroid Build Coastguard Worker
printCrtc(int fd,drmModeResPtr res,drmModeCrtcPtr crtc,uint32_t id)204*7688df22SAndroid Build Coastguard Worker static int printCrtc(int fd, drmModeResPtr res, drmModeCrtcPtr crtc, uint32_t id)
205*7688df22SAndroid Build Coastguard Worker {
206*7688df22SAndroid Build Coastguard Worker printf("Crtc\n");
207*7688df22SAndroid Build Coastguard Worker printf("\tid : %i\n", id);
208*7688df22SAndroid Build Coastguard Worker printf("\tx : %i\n", crtc->x);
209*7688df22SAndroid Build Coastguard Worker printf("\ty : %i\n", crtc->y);
210*7688df22SAndroid Build Coastguard Worker printf("\twidth : %i\n", crtc->width);
211*7688df22SAndroid Build Coastguard Worker printf("\theight : %i\n", crtc->height);
212*7688df22SAndroid Build Coastguard Worker printf("\tmode : %p\n", &crtc->mode);
213*7688df22SAndroid Build Coastguard Worker printf("\tgamma size : %d\n", crtc->gamma_size);
214*7688df22SAndroid Build Coastguard Worker
215*7688df22SAndroid Build Coastguard Worker return 0;
216*7688df22SAndroid Build Coastguard Worker }
217*7688df22SAndroid Build Coastguard Worker
printFrameBuffer(int fd,drmModeResPtr res,drmModeFBPtr fb)218*7688df22SAndroid Build Coastguard Worker static int printFrameBuffer(int fd, drmModeResPtr res, drmModeFBPtr fb)
219*7688df22SAndroid Build Coastguard Worker {
220*7688df22SAndroid Build Coastguard Worker printf("Framebuffer\n");
221*7688df22SAndroid Build Coastguard Worker printf("\thandle : %i\n", fb->handle);
222*7688df22SAndroid Build Coastguard Worker printf("\twidth : %i\n", fb->width);
223*7688df22SAndroid Build Coastguard Worker printf("\theight : %i\n", fb->height);
224*7688df22SAndroid Build Coastguard Worker printf("\tpitch : %i\n", fb->pitch);
225*7688df22SAndroid Build Coastguard Worker printf("\tbpp : %i\n", fb->bpp);
226*7688df22SAndroid Build Coastguard Worker printf("\tdepth : %i\n", fb->depth);
227*7688df22SAndroid Build Coastguard Worker printf("\tbuffer_id : %i\n", fb->handle);
228*7688df22SAndroid Build Coastguard Worker
229*7688df22SAndroid Build Coastguard Worker return 0;
230*7688df22SAndroid Build Coastguard Worker }
231*7688df22SAndroid Build Coastguard Worker
printRes(int fd,drmModeResPtr res)232*7688df22SAndroid Build Coastguard Worker static int printRes(int fd, drmModeResPtr res)
233*7688df22SAndroid Build Coastguard Worker {
234*7688df22SAndroid Build Coastguard Worker int i;
235*7688df22SAndroid Build Coastguard Worker drmModeFBPtr fb;
236*7688df22SAndroid Build Coastguard Worker drmModeCrtcPtr crtc;
237*7688df22SAndroid Build Coastguard Worker drmModeEncoderPtr encoder;
238*7688df22SAndroid Build Coastguard Worker drmModeConnectorPtr connector;
239*7688df22SAndroid Build Coastguard Worker
240*7688df22SAndroid Build Coastguard Worker printf("Resources\n\n");
241*7688df22SAndroid Build Coastguard Worker
242*7688df22SAndroid Build Coastguard Worker printf("count_connectors : %i\n", res->count_connectors);
243*7688df22SAndroid Build Coastguard Worker printf("count_encoders : %i\n", res->count_encoders);
244*7688df22SAndroid Build Coastguard Worker printf("count_crtcs : %i\n", res->count_crtcs);
245*7688df22SAndroid Build Coastguard Worker printf("count_fbs : %i\n", res->count_fbs);
246*7688df22SAndroid Build Coastguard Worker
247*7688df22SAndroid Build Coastguard Worker printf("\n");
248*7688df22SAndroid Build Coastguard Worker
249*7688df22SAndroid Build Coastguard Worker if (connectors) {
250*7688df22SAndroid Build Coastguard Worker for (i = 0; i < res->count_connectors; i++) {
251*7688df22SAndroid Build Coastguard Worker connector = (current ? drmModeGetConnectorCurrent : drmModeGetConnector) (fd, res->connectors[i]);
252*7688df22SAndroid Build Coastguard Worker
253*7688df22SAndroid Build Coastguard Worker if (!connector)
254*7688df22SAndroid Build Coastguard Worker printf("Could not get connector %i\n", res->connectors[i]);
255*7688df22SAndroid Build Coastguard Worker else {
256*7688df22SAndroid Build Coastguard Worker printConnector(fd, res, connector, res->connectors[i]);
257*7688df22SAndroid Build Coastguard Worker drmModeFreeConnector(connector);
258*7688df22SAndroid Build Coastguard Worker }
259*7688df22SAndroid Build Coastguard Worker }
260*7688df22SAndroid Build Coastguard Worker printf("\n");
261*7688df22SAndroid Build Coastguard Worker }
262*7688df22SAndroid Build Coastguard Worker
263*7688df22SAndroid Build Coastguard Worker
264*7688df22SAndroid Build Coastguard Worker if (encoders) {
265*7688df22SAndroid Build Coastguard Worker for (i = 0; i < res->count_encoders; i++) {
266*7688df22SAndroid Build Coastguard Worker encoder = drmModeGetEncoder(fd, res->encoders[i]);
267*7688df22SAndroid Build Coastguard Worker
268*7688df22SAndroid Build Coastguard Worker if (!encoder)
269*7688df22SAndroid Build Coastguard Worker printf("Could not get encoder %i\n", res->encoders[i]);
270*7688df22SAndroid Build Coastguard Worker else {
271*7688df22SAndroid Build Coastguard Worker printEncoder(fd, res, encoder, res->encoders[i]);
272*7688df22SAndroid Build Coastguard Worker drmModeFreeEncoder(encoder);
273*7688df22SAndroid Build Coastguard Worker }
274*7688df22SAndroid Build Coastguard Worker }
275*7688df22SAndroid Build Coastguard Worker printf("\n");
276*7688df22SAndroid Build Coastguard Worker }
277*7688df22SAndroid Build Coastguard Worker
278*7688df22SAndroid Build Coastguard Worker if (crtcs) {
279*7688df22SAndroid Build Coastguard Worker for (i = 0; i < res->count_crtcs; i++) {
280*7688df22SAndroid Build Coastguard Worker crtc = drmModeGetCrtc(fd, res->crtcs[i]);
281*7688df22SAndroid Build Coastguard Worker
282*7688df22SAndroid Build Coastguard Worker if (!crtc)
283*7688df22SAndroid Build Coastguard Worker printf("Could not get crtc %i\n", res->crtcs[i]);
284*7688df22SAndroid Build Coastguard Worker else {
285*7688df22SAndroid Build Coastguard Worker printCrtc(fd, res, crtc, res->crtcs[i]);
286*7688df22SAndroid Build Coastguard Worker drmModeFreeCrtc(crtc);
287*7688df22SAndroid Build Coastguard Worker }
288*7688df22SAndroid Build Coastguard Worker }
289*7688df22SAndroid Build Coastguard Worker printf("\n");
290*7688df22SAndroid Build Coastguard Worker }
291*7688df22SAndroid Build Coastguard Worker
292*7688df22SAndroid Build Coastguard Worker if (fbs) {
293*7688df22SAndroid Build Coastguard Worker for (i = 0; i < res->count_fbs; i++) {
294*7688df22SAndroid Build Coastguard Worker fb = drmModeGetFB(fd, res->fbs[i]);
295*7688df22SAndroid Build Coastguard Worker
296*7688df22SAndroid Build Coastguard Worker if (!fb)
297*7688df22SAndroid Build Coastguard Worker printf("Could not get fb %i\n", res->fbs[i]);
298*7688df22SAndroid Build Coastguard Worker else {
299*7688df22SAndroid Build Coastguard Worker printFrameBuffer(fd, res, fb);
300*7688df22SAndroid Build Coastguard Worker drmModeFreeFB(fb);
301*7688df22SAndroid Build Coastguard Worker }
302*7688df22SAndroid Build Coastguard Worker }
303*7688df22SAndroid Build Coastguard Worker }
304*7688df22SAndroid Build Coastguard Worker
305*7688df22SAndroid Build Coastguard Worker return 0;
306*7688df22SAndroid Build Coastguard Worker }
307*7688df22SAndroid Build Coastguard Worker
args(int argc,char ** argv)308*7688df22SAndroid Build Coastguard Worker static void args(int argc, char **argv)
309*7688df22SAndroid Build Coastguard Worker {
310*7688df22SAndroid Build Coastguard Worker int defaults = 1;
311*7688df22SAndroid Build Coastguard Worker int i;
312*7688df22SAndroid Build Coastguard Worker
313*7688df22SAndroid Build Coastguard Worker fbs = 0;
314*7688df22SAndroid Build Coastguard Worker edid = 0;
315*7688df22SAndroid Build Coastguard Worker crtcs = 0;
316*7688df22SAndroid Build Coastguard Worker modes = 0;
317*7688df22SAndroid Build Coastguard Worker encoders = 0;
318*7688df22SAndroid Build Coastguard Worker full_modes = 0;
319*7688df22SAndroid Build Coastguard Worker full_props = 0;
320*7688df22SAndroid Build Coastguard Worker connectors = 0;
321*7688df22SAndroid Build Coastguard Worker current = 0;
322*7688df22SAndroid Build Coastguard Worker
323*7688df22SAndroid Build Coastguard Worker module_name = argv[1];
324*7688df22SAndroid Build Coastguard Worker
325*7688df22SAndroid Build Coastguard Worker for (i = 2; i < argc; i++) {
326*7688df22SAndroid Build Coastguard Worker if (strcmp(argv[i], "-fb") == 0) {
327*7688df22SAndroid Build Coastguard Worker fbs = 1;
328*7688df22SAndroid Build Coastguard Worker defaults = 0;
329*7688df22SAndroid Build Coastguard Worker } else if (strcmp(argv[i], "-crtcs") == 0) {
330*7688df22SAndroid Build Coastguard Worker crtcs = 1;
331*7688df22SAndroid Build Coastguard Worker defaults = 0;
332*7688df22SAndroid Build Coastguard Worker } else if (strcmp(argv[i], "-cons") == 0) {
333*7688df22SAndroid Build Coastguard Worker connectors = 1;
334*7688df22SAndroid Build Coastguard Worker modes = 1;
335*7688df22SAndroid Build Coastguard Worker defaults = 0;
336*7688df22SAndroid Build Coastguard Worker } else if (strcmp(argv[i], "-modes") == 0) {
337*7688df22SAndroid Build Coastguard Worker connectors = 1;
338*7688df22SAndroid Build Coastguard Worker modes = 1;
339*7688df22SAndroid Build Coastguard Worker defaults = 0;
340*7688df22SAndroid Build Coastguard Worker } else if (strcmp(argv[i], "-full") == 0) {
341*7688df22SAndroid Build Coastguard Worker connectors = 1;
342*7688df22SAndroid Build Coastguard Worker modes = 1;
343*7688df22SAndroid Build Coastguard Worker full_modes = 1;
344*7688df22SAndroid Build Coastguard Worker defaults = 0;
345*7688df22SAndroid Build Coastguard Worker } else if (strcmp(argv[i], "-props") == 0) {
346*7688df22SAndroid Build Coastguard Worker connectors = 1;
347*7688df22SAndroid Build Coastguard Worker full_props = 1;
348*7688df22SAndroid Build Coastguard Worker defaults = 0;
349*7688df22SAndroid Build Coastguard Worker } else if (strcmp(argv[i], "-edids") == 0) {
350*7688df22SAndroid Build Coastguard Worker connectors = 1;
351*7688df22SAndroid Build Coastguard Worker edid = 1;
352*7688df22SAndroid Build Coastguard Worker defaults = 0;
353*7688df22SAndroid Build Coastguard Worker } else if (strcmp(argv[i], "-encoders") == 0) {
354*7688df22SAndroid Build Coastguard Worker encoders = 1;
355*7688df22SAndroid Build Coastguard Worker defaults = 0;
356*7688df22SAndroid Build Coastguard Worker } else if (strcmp(argv[i], "-v") == 0) {
357*7688df22SAndroid Build Coastguard Worker fbs = 1;
358*7688df22SAndroid Build Coastguard Worker edid = 1;
359*7688df22SAndroid Build Coastguard Worker crtcs = 1;
360*7688df22SAndroid Build Coastguard Worker modes = 1;
361*7688df22SAndroid Build Coastguard Worker encoders = 1;
362*7688df22SAndroid Build Coastguard Worker full_modes = 1;
363*7688df22SAndroid Build Coastguard Worker full_props = 1;
364*7688df22SAndroid Build Coastguard Worker connectors = 1;
365*7688df22SAndroid Build Coastguard Worker defaults = 0;
366*7688df22SAndroid Build Coastguard Worker } else if (strcmp(argv[i], "-current") == 0) {
367*7688df22SAndroid Build Coastguard Worker current = 1;
368*7688df22SAndroid Build Coastguard Worker }
369*7688df22SAndroid Build Coastguard Worker }
370*7688df22SAndroid Build Coastguard Worker
371*7688df22SAndroid Build Coastguard Worker if (defaults) {
372*7688df22SAndroid Build Coastguard Worker fbs = 1;
373*7688df22SAndroid Build Coastguard Worker edid = 1;
374*7688df22SAndroid Build Coastguard Worker crtcs = 1;
375*7688df22SAndroid Build Coastguard Worker modes = 1;
376*7688df22SAndroid Build Coastguard Worker encoders = 1;
377*7688df22SAndroid Build Coastguard Worker full_modes = 0;
378*7688df22SAndroid Build Coastguard Worker full_props = 0;
379*7688df22SAndroid Build Coastguard Worker connectors = 1;
380*7688df22SAndroid Build Coastguard Worker }
381*7688df22SAndroid Build Coastguard Worker }
382*7688df22SAndroid Build Coastguard Worker
main(int argc,char ** argv)383*7688df22SAndroid Build Coastguard Worker int main(int argc, char **argv)
384*7688df22SAndroid Build Coastguard Worker {
385*7688df22SAndroid Build Coastguard Worker int fd;
386*7688df22SAndroid Build Coastguard Worker drmModeResPtr res;
387*7688df22SAndroid Build Coastguard Worker
388*7688df22SAndroid Build Coastguard Worker if (argc == 1) {
389*7688df22SAndroid Build Coastguard Worker printf("Please add modulename as first argument\n");
390*7688df22SAndroid Build Coastguard Worker return 1;
391*7688df22SAndroid Build Coastguard Worker }
392*7688df22SAndroid Build Coastguard Worker
393*7688df22SAndroid Build Coastguard Worker args(argc, argv);
394*7688df22SAndroid Build Coastguard Worker
395*7688df22SAndroid Build Coastguard Worker printf("Starting test\n");
396*7688df22SAndroid Build Coastguard Worker
397*7688df22SAndroid Build Coastguard Worker fd = drmOpen(module_name, NULL);
398*7688df22SAndroid Build Coastguard Worker
399*7688df22SAndroid Build Coastguard Worker if (fd < 0) {
400*7688df22SAndroid Build Coastguard Worker printf("Failed to open the card fd (%d)\n",fd);
401*7688df22SAndroid Build Coastguard Worker return 1;
402*7688df22SAndroid Build Coastguard Worker }
403*7688df22SAndroid Build Coastguard Worker
404*7688df22SAndroid Build Coastguard Worker res = drmModeGetResources(fd);
405*7688df22SAndroid Build Coastguard Worker if (res == 0) {
406*7688df22SAndroid Build Coastguard Worker printf("Failed to get resources from card\n");
407*7688df22SAndroid Build Coastguard Worker drmClose(fd);
408*7688df22SAndroid Build Coastguard Worker return 1;
409*7688df22SAndroid Build Coastguard Worker }
410*7688df22SAndroid Build Coastguard Worker
411*7688df22SAndroid Build Coastguard Worker printRes(fd, res);
412*7688df22SAndroid Build Coastguard Worker
413*7688df22SAndroid Build Coastguard Worker drmModeFreeResources(res);
414*7688df22SAndroid Build Coastguard Worker
415*7688df22SAndroid Build Coastguard Worker printf("Ok\n");
416*7688df22SAndroid Build Coastguard Worker
417*7688df22SAndroid Build Coastguard Worker return 0;
418*7688df22SAndroid Build Coastguard Worker }
419