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