xref: /aosp_15_r20/external/libdrm/tests/modeprint/modeprint.c (revision 7688df22e49036ff52a766b7101da3a49edadb8c)
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