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