1f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu/*
2f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu * DRM based mode setting test program
3f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu * Copyright 2008 Tungsten Graphics
4f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu *   Jakob Bornecrantz <jakob@tungstengraphics.com>
5f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu * Copyright 2008 Intel Corporation
6f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu *   Jesse Barnes <jesse.barnes@intel.com>
7f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu *
8f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu * Permission is hereby granted, free of charge, to any person obtaining a
9f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu * copy of this software and associated documentation files (the "Software"),
10f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu * to deal in the Software without restriction, including without limitation
11f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu * the rights to use, copy, modify, merge, publish, distribute, sublicense,
12f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu * and/or sell copies of the Software, and to permit persons to whom the
13f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu * Software is furnished to do so, subject to the following conditions:
14f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu *
15f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu * The above copyright notice and this permission notice shall be included in
16f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu * all copies or substantial portions of the Software.
17f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu *
18f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
19f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
20f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
21f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
22f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
23f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
24f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu * IN THE SOFTWARE.
25f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu */
26f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu
27f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu/*
28f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu * This fairly simple test program dumps output in a similar format to the
29f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu * "xrandr" tool everyone knows & loves.  It's necessarily slightly different
30f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu * since the kernel separates outputs into encoder and connector structures,
31f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu * each with their own unique ID.  The program also allows test testing of the
32f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu * memory management and mode setting APIs by allowing the user to specify a
33f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu * connector and mode to use for mode setting.  If all works as expected, a
34f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu * blue background should be painted on the monitor attached to the specified
35f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu * connector after the selected mode is set.
36f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu *
37f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu * TODO: use cairo to write the mode info on the selected output once
38f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu *       the mode has been programmed, along with possible test patterns.
39f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu */
40f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu#include "config.h"
41f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu
42f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu#include <assert.h>
43f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu#include <stdio.h>
44f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu#include <stdlib.h>
45f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu#include <stdint.h>
46f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu#include <unistd.h>
47f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu#include <string.h>
48f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu#include <errno.h>
49f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu
50f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu#include "xf86drm.h"
51f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu#include "xf86drmMode.h"
52f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu#include "intel_bufmgr.h"
53f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu
54f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu#ifdef HAVE_CAIRO
55f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu#include <math.h>
56f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu#include <cairo.h>
57f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu#endif
58f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu
59f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun RyudrmModeRes *resources;
60f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryuint fd, modes;
61f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu
62f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu#define ARRAY_SIZE(arr) (sizeof(arr) / sizeof((arr)[0]))
63f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu
64f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryustruct type_name {
65f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu	int type;
66f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu	char *name;
67f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu};
68f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu
69f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu#define type_name_fn(res) \
70f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryuchar * res##_str(int type) {			\
71f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu	int i;						\
72f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu	for (i = 0; i < ARRAY_SIZE(res##_names); i++) { \
73f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu		if (res##_names[i].type == type)	\
74f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu			return res##_names[i].name;	\
75f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu	}						\
76f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu	return "(invalid)";				\
77f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu}
78f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu
79f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryustruct type_name encoder_type_names[] = {
80f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu	{ DRM_MODE_ENCODER_NONE, "none" },
81f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu	{ DRM_MODE_ENCODER_DAC, "DAC" },
82f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu	{ DRM_MODE_ENCODER_TMDS, "TMDS" },
83f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu	{ DRM_MODE_ENCODER_LVDS, "LVDS" },
84f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu	{ DRM_MODE_ENCODER_TVDAC, "TVDAC" },
85f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu};
86f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu
87f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryutype_name_fn(encoder_type)
88f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu
89f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryustruct type_name connector_status_names[] = {
90f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu	{ DRM_MODE_CONNECTED, "connected" },
91f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu	{ DRM_MODE_DISCONNECTED, "disconnected" },
92f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu	{ DRM_MODE_UNKNOWNCONNECTION, "unknown" },
93f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu};
94f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu
95f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryutype_name_fn(connector_status)
96f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu
97f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryustruct type_name connector_type_names[] = {
98f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu	{ DRM_MODE_CONNECTOR_Unknown, "unknown" },
99f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu	{ DRM_MODE_CONNECTOR_VGA, "VGA" },
100f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu	{ DRM_MODE_CONNECTOR_DVII, "DVI-I" },
101f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu	{ DRM_MODE_CONNECTOR_DVID, "DVI-D" },
102f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu	{ DRM_MODE_CONNECTOR_DVIA, "DVI-A" },
103f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu	{ DRM_MODE_CONNECTOR_Composite, "composite" },
104f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu	{ DRM_MODE_CONNECTOR_SVIDEO, "s-video" },
105f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu	{ DRM_MODE_CONNECTOR_LVDS, "LVDS" },
106f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu	{ DRM_MODE_CONNECTOR_Component, "component" },
107f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu	{ DRM_MODE_CONNECTOR_9PinDIN, "9-pin DIN" },
108f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu	{ DRM_MODE_CONNECTOR_DisplayPort, "displayport" },
109f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu	{ DRM_MODE_CONNECTOR_HDMIA, "HDMI-A" },
110f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu	{ DRM_MODE_CONNECTOR_HDMIB, "HDMI-B" },
111f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu};
112f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu
113f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryutype_name_fn(connector_type)
114f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu
115f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryuvoid dump_encoders(void)
116f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu{
117f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu	drmModeEncoder *encoder;
118f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu	int i;
119f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu
120f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu	printf("Encoders:\n");
121f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu	printf("id\tcrtc\ttype\tpossible crtcs\tpossible clones\t\n");
122f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu	for (i = 0; i < resources->count_encoders; i++) {
123f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu		encoder = drmModeGetEncoder(fd, resources->encoders[i]);
124f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu
125f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu		if (!encoder) {
126f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu			fprintf(stderr, "could not get encoder %i: %s\n",
127f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu				resources->encoders[i], strerror(errno));
128f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu			continue;
129f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu		}
130f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu		printf("%d\t%d\t%s\t0x%08x\t0x%08x\n",
131f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu		       encoder->encoder_id,
132f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu		       encoder->crtc_id,
133f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu		       encoder_type_str(encoder->encoder_type),
134f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu		       encoder->possible_crtcs,
135f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu		       encoder->possible_clones);
136f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu		drmModeFreeEncoder(encoder);
137f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu	}
138f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu	printf("\n");
139f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu}
140f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu
141f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryuvoid dump_mode(drmModeModeInfo *mode)
142f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu{
143f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu	printf("  %s %.02f %d %d %d %d %d %d %d %d\n",
144f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu	       mode->name,
145f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu	       (float)mode->vrefresh / 1000,
146f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu	       mode->hdisplay,
147f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu	       mode->hsync_start,
148f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu	       mode->hsync_end,
149f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu	       mode->htotal,
150f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu	       mode->vdisplay,
151f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu	       mode->vsync_start,
152f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu	       mode->vsync_end,
153f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu	       mode->vtotal);
154f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu}
155f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu
156f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryustatic void
157f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryudump_props(drmModeConnector *connector)
158f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu{
159f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu	drmModePropertyPtr props;
160f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu	int i;
161f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu
162f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu	for (i = 0; i < connector->count_props; i++) {
163f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu		props = drmModeGetProperty(fd, connector->props[i]);
164f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu		printf("\t%s, flags %d\n", props->name, props->flags);
165f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu		drmModeFreeProperty(props);
166f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu	}
167f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu}
168f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu
169f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryuvoid dump_connectors(void)
170f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu{
171f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu	drmModeConnector *connector;
172f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu	int i, j;
173f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu
174f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu	printf("Connectors:\n");
175f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu	printf("id\tencoder\tstatus\t\ttype\tsize (mm)\tmodes\n");
176f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu	for (i = 0; i < resources->count_connectors; i++) {
177f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu		connector = drmModeGetConnector(fd, resources->connectors[i]);
178f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu
179f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu		if (!connector) {
180f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu			fprintf(stderr, "could not get connector %i: %s\n",
181f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu				resources->connectors[i], strerror(errno));
182f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu			continue;
183f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu		}
184f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu
185f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu		printf("%d\t%d\t%s\t%s\t%dx%d\t\t%d\n",
186f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu		       connector->connector_id,
187f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu		       connector->encoder_id,
188f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu		       connector_status_str(connector->connection),
189f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu		       connector_type_str(connector->connector_type),
190f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu		       connector->mmWidth, connector->mmHeight,
191f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu		       connector->count_modes);
192f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu
193f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu		if (!connector->count_modes)
194f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu			continue;
195f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu
196f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu		printf("  modes:\n");
197f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu		printf("  name refresh (Hz) hdisp hss hse htot vdisp "
198f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu		       "vss vse vtot)\n");
199f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu		for (j = 0; j < connector->count_modes; j++)
200f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu			dump_mode(&connector->modes[j]);
201f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu
202f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu		drmModeFreeConnector(connector);
203f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu
204f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu		printf("  props:\n");
205f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu		dump_props(connector);
206f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu	}
207f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu	printf("\n");
208f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu}
209f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu
210f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryuvoid dump_crtcs(void)
211f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu{
212f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu	drmModeCrtc *crtc;
213f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu	int i;
214f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu
215f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu	printf("CRTCs:\n");
216f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu	printf("id\tfb\tpos\tsize\n");
217f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu	for (i = 0; i < resources->count_crtcs; i++) {
218f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu		crtc = drmModeGetCrtc(fd, resources->crtcs[i]);
219f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu
220f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu		if (!crtc) {
221f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu			fprintf(stderr, "could not get crtc %i: %s\n",
222f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu				resources->crtcs[i], strerror(errno));
223f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu			continue;
224f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu		}
225f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu		printf("%d\t%d\t(%d,%d)\t(%dx%d)\n",
226f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu		       crtc->crtc_id,
227f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu		       crtc->buffer_id,
228f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu		       crtc->x, crtc->y,
229f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu		       crtc->width, crtc->height);
230f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu		dump_mode(&crtc->mode);
231f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu
232f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu		drmModeFreeCrtc(crtc);
233f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu	}
234f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu	printf("\n");
235f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu}
236f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu
237f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryuvoid dump_framebuffers(void)
238f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu{
239f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu	drmModeFB *fb;
240f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu	int i;
241f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu
242f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu	printf("Frame buffers:\n");
243f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu	printf("id\tsize\tpitch\n");
244f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu	for (i = 0; i < resources->count_fbs; i++) {
245f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu		fb = drmModeGetFB(fd, resources->fbs[i]);
246f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu
247f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu		if (!fb) {
248f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu			fprintf(stderr, "could not get fb %i: %s\n",
249f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu				resources->fbs[i], strerror(errno));
250f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu			continue;
251f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu		}
252f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu		printf("%d\t(%dx%d)\t%d\n",
253f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu		       fb->fb_id,
254f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu		       fb->width, fb->height);
255f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu
256f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu		drmModeFreeFB(fb);
257f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu	}
258f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu	printf("\n");
259f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu}
260f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu
261f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu/*
262f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu * Mode setting with the kernel interfaces is a bit of a chore.
263f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu * First you have to find the connector in question and make sure the
264f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu * requested mode is available.
265f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu * Then you need to find the encoder attached to that connector so you
266f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu * can bind it with a free crtc.
267f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu */
268f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryustruct connector {
269f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu	int id;
270f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu	char mode_str[64];
271f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu	drmModeModeInfo *mode;
272f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu	drmModeEncoder *encoder;
273f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu	int crtc;
274f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu};
275f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu
276f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryustatic void
277f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryuconnector_find_mode(struct connector *c)
278f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu{
279f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu	drmModeConnector *connector;
280f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu	int i, j, size, ret, width, height;
281f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu
282f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu	/* First, find the connector & mode */
283f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu	c->mode = NULL;
284f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu	for (i = 0; i < resources->count_connectors; i++) {
285f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu		connector = drmModeGetConnector(fd, resources->connectors[i]);
286f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu
287f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu		if (!connector) {
288f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu			fprintf(stderr, "could not get connector %i: %s\n",
289f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu				resources->connectors[i], strerror(errno));
290f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu			drmModeFreeConnector(connector);
291f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu			continue;
292f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu		}
293f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu
294f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu		if (!connector->count_modes) {
295f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu			drmModeFreeConnector(connector);
296f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu			continue;
297f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu		}
298f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu
299f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu		if (connector->connector_id != c->id) {
300f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu			drmModeFreeConnector(connector);
301f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu			continue;
302f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu		}
303f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu
304f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu		for (j = 0; j < connector->count_modes; j++) {
305f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu			c->mode = &connector->modes[j];
306f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu			if (!strcmp(c->mode->name, c->mode_str))
307f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu				break;
308f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu		}
309f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu
310f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu		/* Found it, break out */
311f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu		if (c->mode)
312f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu			break;
313f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu
314f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu		drmModeFreeConnector(connector);
315f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu	}
316f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu
317f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu	if (!c->mode) {
318f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu		fprintf(stderr, "failed to find mode \"%s\"\n", c->mode_str);
319f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu		return;
320f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu	}
321f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu
322f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu	/* Now get the encoder */
323f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu	for (i = 0; i < resources->count_encoders; i++) {
324f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu		c->encoder = drmModeGetEncoder(fd, resources->encoders[i]);
325f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu
326f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu		if (!c->encoder) {
327f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu			fprintf(stderr, "could not get encoder %i: %s\n",
328f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu				resources->encoders[i], strerror(errno));
329f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu			drmModeFreeEncoder(c->encoder);
330f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu			continue;
331f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu		}
332f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu
333f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu		if (c->encoder->encoder_id  == connector->encoder_id)
334f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu			break;
335f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu
336f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu		drmModeFreeEncoder(c->encoder);
337f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu	}
338f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu
339f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu	if (c->crtc == -1)
340f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu		c->crtc = c->encoder->crtc_id;
341f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu}
342f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu
343f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu#ifdef HAVE_CAIRO
344f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu
345f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryustatic int
346f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryucreate_test_buffer(drm_intel_bufmgr *bufmgr,
347f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu		   int width, int height, int *stride_out, drm_intel_bo **bo_out)
348f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu{
349f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu	drm_intel_bo *bo;
350f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu	unsigned int *fb_ptr;
351f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu	int size, ret, i, stride;
352f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu	div_t d;
353f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu	cairo_surface_t *surface;
354f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu	cairo_t *cr;
355f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu	char buf[64];
356f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu	int x, y;
357f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu
358f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu	surface = cairo_image_surface_create(CAIRO_FORMAT_ARGB32, width, height);
359f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu	stride = cairo_image_surface_get_stride(surface);
360f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu	size = stride * height;
361f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu	fb_ptr = (unsigned int *) cairo_image_surface_get_data(surface);
362f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu
363f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu	/* paint the buffer with colored tiles */
364f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu	for (i = 0; i < width * height; i++) {
365f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu		d = div(i, width);
366f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu		fb_ptr[i] = 0x00130502 * (d.quot >> 6) + 0x000a1120 * (d.rem >> 6);
367f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu	}
368f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu
369f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu	cr = cairo_create(surface);
370f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu	cairo_set_line_cap(cr, CAIRO_LINE_CAP_SQUARE);
371f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu	for (x = 0; x < width; x += 250)
372f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu		for (y = 0; y < height; y += 250) {
373f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu			cairo_set_operator(cr, CAIRO_OPERATOR_OVER);
374f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu			cairo_move_to(cr, x, y - 20);
375f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu			cairo_line_to(cr, x, y + 20);
376f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu			cairo_move_to(cr, x - 20, y);
377f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu			cairo_line_to(cr, x + 20, y);
378f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu			cairo_new_sub_path(cr);
379f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu			cairo_arc(cr, x, y, 10, 0, M_PI * 2);
380f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu			cairo_set_line_width(cr, 4);
381f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu			cairo_set_source_rgb(cr, 0, 0, 0);
382f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu			cairo_stroke_preserve(cr);
383f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu			cairo_set_source_rgb(cr, 1, 1, 1);
384f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu			cairo_set_line_width(cr, 2);
385f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu			cairo_stroke(cr);
386f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu			snprintf(buf, sizeof buf, "%d, %d", x, y);
387f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu			cairo_move_to(cr, x + 20, y + 20);
388f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu			cairo_text_path(cr, buf);
389f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu			cairo_set_source_rgb(cr, 0, 0, 0);
390f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu			cairo_stroke_preserve(cr);
391f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu			cairo_set_source_rgb(cr, 1, 1, 1);
392f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu			cairo_fill(cr);
393f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu		}
394f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu
395f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu	cairo_destroy(cr);
396f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu
397f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu	bo = drm_intel_bo_alloc(bufmgr, "frontbuffer", size, 4096);
398f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu	if (!bo) {
399f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu		fprintf(stderr, "failed to alloc buffer: %s\n",
400f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu			strerror(errno));
401f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu		return -1;
402f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu	}
403f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu
404f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu	drm_intel_bo_subdata(bo, 0, size, fb_ptr);
405f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu
406f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu	cairo_surface_destroy(surface);
407f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu
408f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu	*bo_out = bo;
409f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu	*stride_out = stride;
410f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu
411f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu	return 0;
412f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu}
413f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu
414f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu#else
415f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu
416f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryustatic int
417f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryucreate_test_buffer(drm_intel_bufmgr *bufmgr,
418f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu		   int width, int height, int *stride_out, drm_intel_bo **bo_out)
419f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu{
420f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu	drm_intel_bo *bo;
421f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu	unsigned int *fb_ptr;
422f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu	int size, ret, i, stride;
423f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu	div_t d;
424f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu
425f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu	/* Mode size at 32 bpp */
426f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu	stride = width * 4;
427f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu	size = stride * height;
428f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu
429f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu	bo = drm_intel_bo_alloc(bufmgr, "frontbuffer", size, 4096);
430f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu	if (!bo) {
431f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu		fprintf(stderr, "failed to alloc buffer: %s\n",
432f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu			strerror(errno));
433f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu		return -1;
434f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu	}
435f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu
436f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu	ret = drm_intel_gem_bo_map_gtt(bo);
437f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu	if (ret) {
438f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu		fprintf(stderr, "failed to GTT map buffer: %s\n",
439f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu			strerror(errno));
440f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu		return -1;
441f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu	}
442f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu
443f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu	fb_ptr = bo->virtual;
444f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu
445f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu	/* paint the buffer with colored tiles */
446f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu	for (i = 0; i < width * height; i++) {
447f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu		d = div(i, width);
448f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu		fb_ptr[i] = 0x00130502 * (d.quot >> 6) + 0x000a1120 * (d.rem >> 6);
449f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu	}
450f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu	drm_intel_gem_bo_unmap_gtt(bo);
451f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu
452f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu	*bo_out = bo;
453f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu	*stride_out = stride;
454f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu
455f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu	return 0;
456f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu}
457f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu
458f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu#endif
459f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu
460f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryustatic void
461f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryuset_mode(struct connector *c, int count)
462f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu{
463f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu	drmModeConnector *connector;
464f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu	drmModeEncoder *encoder = NULL;
465f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu	struct drm_mode_modeinfo *mode = NULL;
466f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu	drm_intel_bufmgr *bufmgr;
467f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu	drm_intel_bo *bo;
468f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu	unsigned int fb_id;
469f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu	int i, j, ret, width, height, x, stride;
470f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu
471f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu	width = 0;
472f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu	height = 0;
473f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu	for (i = 0; i < count; i++) {
474f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu		connector_find_mode(&c[i]);
475f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu		if (c[i].mode == NULL)
476f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu			continue;
477f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu		width += c[i].mode->hdisplay;
478f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu		if (height < c[i].mode->vdisplay)
479f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu			height = c[i].mode->vdisplay;
480f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu	}
481f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu
482f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu	bufmgr = drm_intel_bufmgr_gem_init(fd, 2<<20);
483f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu	if (!bufmgr) {
484f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu		fprintf(stderr, "failed to init bufmgr: %s\n", strerror(errno));
485f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu		return;
486f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu	}
487f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu
488f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu	if (create_test_buffer(bufmgr, width, height, &stride, &bo))
489f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu		return;
490f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu
491f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu	ret = drmModeAddFB(fd, width, height, 32, 32, stride, bo->handle,
492f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu			   &fb_id);
493f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu	if (ret) {
494f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu		fprintf(stderr, "failed to add fb: %s\n", strerror(errno));
495f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu		return;
496f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu	}
497f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu
498f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu	x = 0;
499f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu	for (i = 0; i < count; i++) {
500f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu		int crtc_id;
501f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu		if (c[i].mode == NULL)
502f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu			continue;
503f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu
504f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu		printf("setting mode %s on connector %d, crtc %d\n",
505f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu		       c[i].mode_str, c[i].id, c[i].crtc);
506f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu
507f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu		ret = drmModeSetCrtc(fd, c[i].crtc, fb_id, x, 0,
508f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu				     &c[i].id, 1, c[i].mode);
509f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu		x += c[i].mode->hdisplay;
510f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu
511f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu		if (ret) {
512f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu			fprintf(stderr, "failed to set mode: %s\n", strerror(errno));
513f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu			return;
514f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu		}
515f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu	}
516f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu}
517f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu
518f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryuextern char *optarg;
519f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryuextern int optind, opterr, optopt;
520f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryustatic char optstr[] = "ecpmfs:";
521f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu
522f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryuvoid usage(char *name)
523f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu{
524f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu	fprintf(stderr, "usage: %s [-ecpmf]\n", name);
525f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu	fprintf(stderr, "\t-e\tlist encoders\n");
526f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu	fprintf(stderr, "\t-c\tlist connectors\n");
527f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu	fprintf(stderr, "\t-p\tlist CRTCs (pipes)\n");
528f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu	fprintf(stderr, "\t-m\tlist modes\n");
529f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu	fprintf(stderr, "\t-f\tlist framebuffers\n");
530f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu	fprintf(stderr, "\t-s <connector_id>:<mode>\tset a mode\n");
531f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu	fprintf(stderr, "\t-s <connector_id>@<crtc_id>:<mode>\tset a mode\n");
532f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu	fprintf(stderr, "\n\tDefault is to dump all info.\n");
533f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu	exit(0);
534f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu}
535f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu
536f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu#define dump_resource(res) if (res) dump_##res()
537f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu
538f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryuint main(int argc, char **argv)
539f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu{
540f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu	int c;
541f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu	int encoders = 0, connectors = 0, crtcs = 0, framebuffers = 0;
542f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu	char *modules[] = { "i915", "radeon" };
543f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu	char *modeset = NULL, *mode, *connector;
544f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu	int i, connector_id, count = 0;
545f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu	struct connector con_args[2];
546f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu
547f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu	opterr = 0;
548f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu	while ((c = getopt(argc, argv, optstr)) != -1) {
549f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu		switch (c) {
550f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu		case 'e':
551f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu			encoders = 1;
552f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu			break;
553f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu		case 'c':
554f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu			connectors = 1;
555f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu			break;
556f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu		case 'p':
557f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu			crtcs = 1;
558f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu			break;
559f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu		case 'm':
560f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu			modes = 1;
561f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu			break;
562f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu		case 'f':
563f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu			framebuffers = 1;
564f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu			break;
565f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu		case 's':
566f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu			modeset = strdup(optarg);
567f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu			con_args[count].crtc = -1;
568f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu			if (sscanf(optarg, "%d:%64s",
569f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu				   &con_args[count].id,
570f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu				   &con_args[count].mode_str) != 2 &&
571f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu			    sscanf(optarg, "%d@%d:%64s",
572f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu				   &con_args[count].id,
573f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu				   &con_args[count].crtc,
574f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu				   &con_args[count].mode_str) != 3)
575f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu				usage(argv[0]);
576f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu			count++;
577f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu			break;
578f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu		default:
579f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu			usage(argv[0]);
580f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu			break;
581f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu		}
582f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu	}
583f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu
584f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu	if (argc == 1)
585f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu		encoders = connectors = crtcs = modes = framebuffers = 1;
586f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu
587f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu	for (i = 0; i < ARRAY_SIZE(modules); i++) {
588f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu		printf("trying to load module %s...", modules[i]);
589f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu		fd = drmOpen(modules[i], NULL);
590f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu		if (fd < 0) {
591f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu			printf("failed.\n");
592f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu		} else {
593f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu			printf("success.\n");
594f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu			break;
595f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu		}
596f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu	}
597f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu
598f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu	if (i == ARRAY_SIZE(modules)) {
599f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu		fprintf(stderr, "failed to load any modules, aborting.\n");
600f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu		return -1;
601f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu	}
602f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu
603f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu	resources = drmModeGetResources(fd);
604f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu	if (!resources) {
605f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu		fprintf(stderr, "drmModeGetResources failed: %s\n",
606f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu			strerror(errno));
607f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu		drmClose(fd);
608f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu		return 1;
609f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu	}
610f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu
611f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu	dump_resource(encoders);
612f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu	dump_resource(connectors);
613f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu	dump_resource(crtcs);
614f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu	dump_resource(framebuffers);
615f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu
616f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu	if (count > 0) {
617f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu		set_mode(con_args, count);
618f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu		getchar();
619f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu	}
620f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu
621f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu	drmModeFreeResources(resources);
622f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu
623f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu	return 0;
624f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu}
625