modetest.c revision 2c5ee84d30cbd3fba61a8426b1e6bdd4f385de13
1731cd5526e5c732d51307b26e784f454a724a699Jesse Barnes/* 2731cd5526e5c732d51307b26e784f454a724a699Jesse Barnes * DRM based mode setting test program 3731cd5526e5c732d51307b26e784f454a724a699Jesse Barnes * Copyright 2008 Tungsten Graphics 4731cd5526e5c732d51307b26e784f454a724a699Jesse Barnes * Jakob Bornecrantz <jakob@tungstengraphics.com> 5731cd5526e5c732d51307b26e784f454a724a699Jesse Barnes * Copyright 2008 Intel Corporation 6731cd5526e5c732d51307b26e784f454a724a699Jesse Barnes * Jesse Barnes <jesse.barnes@intel.com> 7731cd5526e5c732d51307b26e784f454a724a699Jesse Barnes * 8731cd5526e5c732d51307b26e784f454a724a699Jesse Barnes * Permission is hereby granted, free of charge, to any person obtaining a 9731cd5526e5c732d51307b26e784f454a724a699Jesse Barnes * copy of this software and associated documentation files (the "Software"), 10731cd5526e5c732d51307b26e784f454a724a699Jesse Barnes * to deal in the Software without restriction, including without limitation 11731cd5526e5c732d51307b26e784f454a724a699Jesse Barnes * the rights to use, copy, modify, merge, publish, distribute, sublicense, 12731cd5526e5c732d51307b26e784f454a724a699Jesse Barnes * and/or sell copies of the Software, and to permit persons to whom the 13731cd5526e5c732d51307b26e784f454a724a699Jesse Barnes * Software is furnished to do so, subject to the following conditions: 14731cd5526e5c732d51307b26e784f454a724a699Jesse Barnes * 15731cd5526e5c732d51307b26e784f454a724a699Jesse Barnes * The above copyright notice and this permission notice shall be included in 16731cd5526e5c732d51307b26e784f454a724a699Jesse Barnes * all copies or substantial portions of the Software. 17731cd5526e5c732d51307b26e784f454a724a699Jesse Barnes * 18731cd5526e5c732d51307b26e784f454a724a699Jesse Barnes * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 19731cd5526e5c732d51307b26e784f454a724a699Jesse Barnes * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 20731cd5526e5c732d51307b26e784f454a724a699Jesse Barnes * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 21731cd5526e5c732d51307b26e784f454a724a699Jesse Barnes * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 22731cd5526e5c732d51307b26e784f454a724a699Jesse Barnes * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 23731cd5526e5c732d51307b26e784f454a724a699Jesse Barnes * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS 24731cd5526e5c732d51307b26e784f454a724a699Jesse Barnes * IN THE SOFTWARE. 25731cd5526e5c732d51307b26e784f454a724a699Jesse Barnes */ 26731cd5526e5c732d51307b26e784f454a724a699Jesse Barnes 27731cd5526e5c732d51307b26e784f454a724a699Jesse Barnes/* 28731cd5526e5c732d51307b26e784f454a724a699Jesse Barnes * This fairly simple test program dumps output in a similar format to the 29731cd5526e5c732d51307b26e784f454a724a699Jesse Barnes * "xrandr" tool everyone knows & loves. It's necessarily slightly different 30731cd5526e5c732d51307b26e784f454a724a699Jesse Barnes * since the kernel separates outputs into encoder and connector structures, 31731cd5526e5c732d51307b26e784f454a724a699Jesse Barnes * each with their own unique ID. The program also allows test testing of the 32731cd5526e5c732d51307b26e784f454a724a699Jesse Barnes * memory management and mode setting APIs by allowing the user to specify a 33731cd5526e5c732d51307b26e784f454a724a699Jesse Barnes * connector and mode to use for mode setting. If all works as expected, a 34731cd5526e5c732d51307b26e784f454a724a699Jesse Barnes * blue background should be painted on the monitor attached to the specified 35731cd5526e5c732d51307b26e784f454a724a699Jesse Barnes * connector after the selected mode is set. 36731cd5526e5c732d51307b26e784f454a724a699Jesse Barnes * 37731cd5526e5c732d51307b26e784f454a724a699Jesse Barnes * TODO: use cairo to write the mode info on the selected output once 38731cd5526e5c732d51307b26e784f454a724a699Jesse Barnes * the mode has been programmed, along with possible test patterns. 39731cd5526e5c732d51307b26e784f454a724a699Jesse Barnes */ 407a389aab86bde183de8806878b8cf055f662ee73Kristian Høgsberg#include "config.h" 417a389aab86bde183de8806878b8cf055f662ee73Kristian Høgsberg 42731cd5526e5c732d51307b26e784f454a724a699Jesse Barnes#include <assert.h> 432c5ee84d30cbd3fba61a8426b1e6bdd4f385de13Laurent Pinchart#include <ctype.h> 447badcca4925480ffdc4f3aa5efb88624ce451e70Laurent Pinchart#include <stdbool.h> 45731cd5526e5c732d51307b26e784f454a724a699Jesse Barnes#include <stdio.h> 46731cd5526e5c732d51307b26e784f454a724a699Jesse Barnes#include <stdlib.h> 47731cd5526e5c732d51307b26e784f454a724a699Jesse Barnes#include <stdint.h> 48d72a44c7c4f5eea9c1e5bb0c36cb9e0224b9ca22Paulo Zanoni#include <inttypes.h> 49731cd5526e5c732d51307b26e784f454a724a699Jesse Barnes#include <unistd.h> 50731cd5526e5c732d51307b26e784f454a724a699Jesse Barnes#include <string.h> 51731cd5526e5c732d51307b26e784f454a724a699Jesse Barnes#include <errno.h> 521e1b3c0a93281ce8df42bbdddfe3e51dccc4d5eaKristian Høgsberg#include <sys/poll.h> 53e4a519635f75bde38aeb5b09f2ff4efbf73453e9Matthew W. S. Bell#include <sys/time.h> 54731cd5526e5c732d51307b26e784f454a724a699Jesse Barnes 55731cd5526e5c732d51307b26e784f454a724a699Jesse Barnes#include "xf86drm.h" 56731cd5526e5c732d51307b26e784f454a724a699Jesse Barnes#include "xf86drmMode.h" 57d55de747a2bdec5b4885a6c86ea6707e15dfefb5Rob Clark#include "drm_fourcc.h" 588fef29093fae2a08f8c1cb4946687bf4bb62a1caBenjamin Franzke#include "libkms.h" 59731cd5526e5c732d51307b26e784f454a724a699Jesse Barnes 60db004badef9315ba6a5f165d0974dd5afd5a6178Laurent Pinchart#include "buffers.h" 617a389aab86bde183de8806878b8cf055f662ee73Kristian Høgsberg 6202fa8f79b05456184028f014432647b19601a288Laurent Pinchartstruct crtc { 6302fa8f79b05456184028f014432647b19601a288Laurent Pinchart drmModeCrtc *crtc; 6402fa8f79b05456184028f014432647b19601a288Laurent Pinchart drmModeObjectProperties *props; 6502fa8f79b05456184028f014432647b19601a288Laurent Pinchart drmModePropertyRes **props_info; 6656592680bbb1bb73d08bdce317046d0401dcfba0Laurent Pinchart drmModeModeInfo *mode; 6702fa8f79b05456184028f014432647b19601a288Laurent Pinchart}; 6802fa8f79b05456184028f014432647b19601a288Laurent Pinchart 6902fa8f79b05456184028f014432647b19601a288Laurent Pinchartstruct encoder { 7002fa8f79b05456184028f014432647b19601a288Laurent Pinchart drmModeEncoder *encoder; 7102fa8f79b05456184028f014432647b19601a288Laurent Pinchart}; 7202fa8f79b05456184028f014432647b19601a288Laurent Pinchart 7302fa8f79b05456184028f014432647b19601a288Laurent Pinchartstruct connector { 7402fa8f79b05456184028f014432647b19601a288Laurent Pinchart drmModeConnector *connector; 7502fa8f79b05456184028f014432647b19601a288Laurent Pinchart drmModeObjectProperties *props; 7602fa8f79b05456184028f014432647b19601a288Laurent Pinchart drmModePropertyRes **props_info; 7702fa8f79b05456184028f014432647b19601a288Laurent Pinchart}; 7802fa8f79b05456184028f014432647b19601a288Laurent Pinchart 7902fa8f79b05456184028f014432647b19601a288Laurent Pinchartstruct fb { 8002fa8f79b05456184028f014432647b19601a288Laurent Pinchart drmModeFB *fb; 8102fa8f79b05456184028f014432647b19601a288Laurent Pinchart}; 8202fa8f79b05456184028f014432647b19601a288Laurent Pinchart 8302fa8f79b05456184028f014432647b19601a288Laurent Pinchartstruct plane { 8402fa8f79b05456184028f014432647b19601a288Laurent Pinchart drmModePlane *plane; 8502fa8f79b05456184028f014432647b19601a288Laurent Pinchart drmModeObjectProperties *props; 8602fa8f79b05456184028f014432647b19601a288Laurent Pinchart drmModePropertyRes **props_info; 8702fa8f79b05456184028f014432647b19601a288Laurent Pinchart}; 8802fa8f79b05456184028f014432647b19601a288Laurent Pinchart 8902fa8f79b05456184028f014432647b19601a288Laurent Pinchartstruct resources { 9002fa8f79b05456184028f014432647b19601a288Laurent Pinchart drmModeRes *res; 9102fa8f79b05456184028f014432647b19601a288Laurent Pinchart drmModePlaneRes *plane_res; 9202fa8f79b05456184028f014432647b19601a288Laurent Pinchart 9302fa8f79b05456184028f014432647b19601a288Laurent Pinchart struct crtc *crtcs; 9402fa8f79b05456184028f014432647b19601a288Laurent Pinchart struct encoder *encoders; 9502fa8f79b05456184028f014432647b19601a288Laurent Pinchart struct connector *connectors; 9602fa8f79b05456184028f014432647b19601a288Laurent Pinchart struct fb *fbs; 9702fa8f79b05456184028f014432647b19601a288Laurent Pinchart struct plane *planes; 9802fa8f79b05456184028f014432647b19601a288Laurent Pinchart}; 9902fa8f79b05456184028f014432647b19601a288Laurent Pinchart 100549fe0ba627a67b6ae1334eb5cf274a3dfb1fd69Laurent Pinchartstruct device { 101549fe0ba627a67b6ae1334eb5cf274a3dfb1fd69Laurent Pinchart int fd; 102549fe0ba627a67b6ae1334eb5cf274a3dfb1fd69Laurent Pinchart 103549fe0ba627a67b6ae1334eb5cf274a3dfb1fd69Laurent Pinchart struct resources *resources; 104549fe0ba627a67b6ae1334eb5cf274a3dfb1fd69Laurent Pinchart struct kms_driver *kms; 1053813e0f8e1ee4885823cdd0b50b05970257adddcLaurent Pinchart 1063813e0f8e1ee4885823cdd0b50b05970257adddcLaurent Pinchart struct { 1073813e0f8e1ee4885823cdd0b50b05970257adddcLaurent Pinchart unsigned int width; 1083813e0f8e1ee4885823cdd0b50b05970257adddcLaurent Pinchart unsigned int height; 1093813e0f8e1ee4885823cdd0b50b05970257adddcLaurent Pinchart 1103813e0f8e1ee4885823cdd0b50b05970257adddcLaurent Pinchart unsigned int fb_id; 1113813e0f8e1ee4885823cdd0b50b05970257adddcLaurent Pinchart struct kms_bo *bo; 1123813e0f8e1ee4885823cdd0b50b05970257adddcLaurent Pinchart } mode; 113549fe0ba627a67b6ae1334eb5cf274a3dfb1fd69Laurent Pinchart}; 114731cd5526e5c732d51307b26e784f454a724a699Jesse Barnes 115731cd5526e5c732d51307b26e784f454a724a699Jesse Barnes#define ARRAY_SIZE(arr) (sizeof(arr) / sizeof((arr)[0])) 116731cd5526e5c732d51307b26e784f454a724a699Jesse Barnes 117731cd5526e5c732d51307b26e784f454a724a699Jesse Barnesstruct type_name { 118731cd5526e5c732d51307b26e784f454a724a699Jesse Barnes int type; 119ca9c8f06e0f560082dcd0943e9be29ba9a915ee3Laurent Pinchart const char *name; 120731cd5526e5c732d51307b26e784f454a724a699Jesse Barnes}; 121731cd5526e5c732d51307b26e784f454a724a699Jesse Barnes 122731cd5526e5c732d51307b26e784f454a724a699Jesse Barnes#define type_name_fn(res) \ 123ca9c8f06e0f560082dcd0943e9be29ba9a915ee3Laurent Pinchartconst char * res##_str(int type) { \ 1249b44fbd393b8db571badae41881f490145404ae0Paulo Zanoni unsigned int i; \ 125731cd5526e5c732d51307b26e784f454a724a699Jesse Barnes for (i = 0; i < ARRAY_SIZE(res##_names); i++) { \ 126731cd5526e5c732d51307b26e784f454a724a699Jesse Barnes if (res##_names[i].type == type) \ 127731cd5526e5c732d51307b26e784f454a724a699Jesse Barnes return res##_names[i].name; \ 128731cd5526e5c732d51307b26e784f454a724a699Jesse Barnes } \ 129731cd5526e5c732d51307b26e784f454a724a699Jesse Barnes return "(invalid)"; \ 130731cd5526e5c732d51307b26e784f454a724a699Jesse Barnes} 131731cd5526e5c732d51307b26e784f454a724a699Jesse Barnes 132731cd5526e5c732d51307b26e784f454a724a699Jesse Barnesstruct type_name encoder_type_names[] = { 133731cd5526e5c732d51307b26e784f454a724a699Jesse Barnes { DRM_MODE_ENCODER_NONE, "none" }, 134731cd5526e5c732d51307b26e784f454a724a699Jesse Barnes { DRM_MODE_ENCODER_DAC, "DAC" }, 135731cd5526e5c732d51307b26e784f454a724a699Jesse Barnes { DRM_MODE_ENCODER_TMDS, "TMDS" }, 136731cd5526e5c732d51307b26e784f454a724a699Jesse Barnes { DRM_MODE_ENCODER_LVDS, "LVDS" }, 137731cd5526e5c732d51307b26e784f454a724a699Jesse Barnes { DRM_MODE_ENCODER_TVDAC, "TVDAC" }, 138731cd5526e5c732d51307b26e784f454a724a699Jesse Barnes}; 139731cd5526e5c732d51307b26e784f454a724a699Jesse Barnes 140ca9c8f06e0f560082dcd0943e9be29ba9a915ee3Laurent Pinchartstatic type_name_fn(encoder_type) 141731cd5526e5c732d51307b26e784f454a724a699Jesse Barnes 142731cd5526e5c732d51307b26e784f454a724a699Jesse Barnesstruct type_name connector_status_names[] = { 143731cd5526e5c732d51307b26e784f454a724a699Jesse Barnes { DRM_MODE_CONNECTED, "connected" }, 144731cd5526e5c732d51307b26e784f454a724a699Jesse Barnes { DRM_MODE_DISCONNECTED, "disconnected" }, 145731cd5526e5c732d51307b26e784f454a724a699Jesse Barnes { DRM_MODE_UNKNOWNCONNECTION, "unknown" }, 146731cd5526e5c732d51307b26e784f454a724a699Jesse Barnes}; 147731cd5526e5c732d51307b26e784f454a724a699Jesse Barnes 148ca9c8f06e0f560082dcd0943e9be29ba9a915ee3Laurent Pinchartstatic type_name_fn(connector_status) 149731cd5526e5c732d51307b26e784f454a724a699Jesse Barnes 150731cd5526e5c732d51307b26e784f454a724a699Jesse Barnesstruct type_name connector_type_names[] = { 151731cd5526e5c732d51307b26e784f454a724a699Jesse Barnes { DRM_MODE_CONNECTOR_Unknown, "unknown" }, 152731cd5526e5c732d51307b26e784f454a724a699Jesse Barnes { DRM_MODE_CONNECTOR_VGA, "VGA" }, 153731cd5526e5c732d51307b26e784f454a724a699Jesse Barnes { DRM_MODE_CONNECTOR_DVII, "DVI-I" }, 154731cd5526e5c732d51307b26e784f454a724a699Jesse Barnes { DRM_MODE_CONNECTOR_DVID, "DVI-D" }, 155731cd5526e5c732d51307b26e784f454a724a699Jesse Barnes { DRM_MODE_CONNECTOR_DVIA, "DVI-A" }, 156731cd5526e5c732d51307b26e784f454a724a699Jesse Barnes { DRM_MODE_CONNECTOR_Composite, "composite" }, 157731cd5526e5c732d51307b26e784f454a724a699Jesse Barnes { DRM_MODE_CONNECTOR_SVIDEO, "s-video" }, 158731cd5526e5c732d51307b26e784f454a724a699Jesse Barnes { DRM_MODE_CONNECTOR_LVDS, "LVDS" }, 159731cd5526e5c732d51307b26e784f454a724a699Jesse Barnes { DRM_MODE_CONNECTOR_Component, "component" }, 160731cd5526e5c732d51307b26e784f454a724a699Jesse Barnes { DRM_MODE_CONNECTOR_9PinDIN, "9-pin DIN" }, 1612c26a106fcfb692badef4c42faaed46508a3d1d3Ville Syrjälä { DRM_MODE_CONNECTOR_DisplayPort, "DP" }, 162731cd5526e5c732d51307b26e784f454a724a699Jesse Barnes { DRM_MODE_CONNECTOR_HDMIA, "HDMI-A" }, 163731cd5526e5c732d51307b26e784f454a724a699Jesse Barnes { DRM_MODE_CONNECTOR_HDMIB, "HDMI-B" }, 164b8abe6139e5c6779ee87d983346f0f65bf67462eJesse Barnes { DRM_MODE_CONNECTOR_TV, "TV" }, 1652c26a106fcfb692badef4c42faaed46508a3d1d3Ville Syrjälä { DRM_MODE_CONNECTOR_eDP, "eDP" }, 166731cd5526e5c732d51307b26e784f454a724a699Jesse Barnes}; 167731cd5526e5c732d51307b26e784f454a724a699Jesse Barnes 168ca9c8f06e0f560082dcd0943e9be29ba9a915ee3Laurent Pinchartstatic type_name_fn(connector_type) 169731cd5526e5c732d51307b26e784f454a724a699Jesse Barnes 170c0ed9b23ecb48b8301f66d2270e638249709e94eKristian Høgsberg#define bit_name_fn(res) \ 171ca9c8f06e0f560082dcd0943e9be29ba9a915ee3Laurent Pinchartconst char * res##_str(int type) { \ 172ca9c8f06e0f560082dcd0943e9be29ba9a915ee3Laurent Pinchart unsigned int i; \ 173c0ed9b23ecb48b8301f66d2270e638249709e94eKristian Høgsberg const char *sep = ""; \ 174c0ed9b23ecb48b8301f66d2270e638249709e94eKristian Høgsberg for (i = 0; i < ARRAY_SIZE(res##_names); i++) { \ 175c0ed9b23ecb48b8301f66d2270e638249709e94eKristian Høgsberg if (type & (1 << i)) { \ 176c0ed9b23ecb48b8301f66d2270e638249709e94eKristian Høgsberg printf("%s%s", sep, res##_names[i]); \ 177c0ed9b23ecb48b8301f66d2270e638249709e94eKristian Høgsberg sep = ", "; \ 178c0ed9b23ecb48b8301f66d2270e638249709e94eKristian Høgsberg } \ 179c0ed9b23ecb48b8301f66d2270e638249709e94eKristian Høgsberg } \ 1806fa2b29d226306870eebe93afb2106ca7d79569bTobias Klausmann return NULL; \ 181c0ed9b23ecb48b8301f66d2270e638249709e94eKristian Høgsberg} 182c0ed9b23ecb48b8301f66d2270e638249709e94eKristian Høgsberg 183c0ed9b23ecb48b8301f66d2270e638249709e94eKristian Høgsbergstatic const char *mode_type_names[] = { 184c0ed9b23ecb48b8301f66d2270e638249709e94eKristian Høgsberg "builtin", 185c0ed9b23ecb48b8301f66d2270e638249709e94eKristian Høgsberg "clock_c", 186c0ed9b23ecb48b8301f66d2270e638249709e94eKristian Høgsberg "crtc_c", 187c0ed9b23ecb48b8301f66d2270e638249709e94eKristian Høgsberg "preferred", 188c0ed9b23ecb48b8301f66d2270e638249709e94eKristian Høgsberg "default", 189c0ed9b23ecb48b8301f66d2270e638249709e94eKristian Høgsberg "userdef", 190c0ed9b23ecb48b8301f66d2270e638249709e94eKristian Høgsberg "driver", 191c0ed9b23ecb48b8301f66d2270e638249709e94eKristian Høgsberg}; 192c0ed9b23ecb48b8301f66d2270e638249709e94eKristian Høgsberg 193ca9c8f06e0f560082dcd0943e9be29ba9a915ee3Laurent Pinchartstatic bit_name_fn(mode_type) 194c0ed9b23ecb48b8301f66d2270e638249709e94eKristian Høgsberg 195c0ed9b23ecb48b8301f66d2270e638249709e94eKristian Høgsbergstatic const char *mode_flag_names[] = { 196c0ed9b23ecb48b8301f66d2270e638249709e94eKristian Høgsberg "phsync", 197c0ed9b23ecb48b8301f66d2270e638249709e94eKristian Høgsberg "nhsync", 198c0ed9b23ecb48b8301f66d2270e638249709e94eKristian Høgsberg "pvsync", 199c0ed9b23ecb48b8301f66d2270e638249709e94eKristian Høgsberg "nvsync", 200c0ed9b23ecb48b8301f66d2270e638249709e94eKristian Høgsberg "interlace", 201c0ed9b23ecb48b8301f66d2270e638249709e94eKristian Høgsberg "dblscan", 202c0ed9b23ecb48b8301f66d2270e638249709e94eKristian Høgsberg "csync", 203c0ed9b23ecb48b8301f66d2270e638249709e94eKristian Høgsberg "pcsync", 204c0ed9b23ecb48b8301f66d2270e638249709e94eKristian Høgsberg "ncsync", 205c0ed9b23ecb48b8301f66d2270e638249709e94eKristian Høgsberg "hskew", 206c0ed9b23ecb48b8301f66d2270e638249709e94eKristian Høgsberg "bcast", 207c0ed9b23ecb48b8301f66d2270e638249709e94eKristian Høgsberg "pixmux", 208c0ed9b23ecb48b8301f66d2270e638249709e94eKristian Høgsberg "dblclk", 209c0ed9b23ecb48b8301f66d2270e638249709e94eKristian Høgsberg "clkdiv2" 210c0ed9b23ecb48b8301f66d2270e638249709e94eKristian Høgsberg}; 211c0ed9b23ecb48b8301f66d2270e638249709e94eKristian Høgsberg 212ca9c8f06e0f560082dcd0943e9be29ba9a915ee3Laurent Pinchartstatic bit_name_fn(mode_flag) 213c0ed9b23ecb48b8301f66d2270e638249709e94eKristian Høgsberg 214549fe0ba627a67b6ae1334eb5cf274a3dfb1fd69Laurent Pinchartstatic void dump_encoders(struct device *dev) 215731cd5526e5c732d51307b26e784f454a724a699Jesse Barnes{ 216731cd5526e5c732d51307b26e784f454a724a699Jesse Barnes drmModeEncoder *encoder; 217731cd5526e5c732d51307b26e784f454a724a699Jesse Barnes int i; 218731cd5526e5c732d51307b26e784f454a724a699Jesse Barnes 219731cd5526e5c732d51307b26e784f454a724a699Jesse Barnes printf("Encoders:\n"); 220731cd5526e5c732d51307b26e784f454a724a699Jesse Barnes printf("id\tcrtc\ttype\tpossible crtcs\tpossible clones\t\n"); 221549fe0ba627a67b6ae1334eb5cf274a3dfb1fd69Laurent Pinchart for (i = 0; i < dev->resources->res->count_encoders; i++) { 222549fe0ba627a67b6ae1334eb5cf274a3dfb1fd69Laurent Pinchart encoder = dev->resources->encoders[i].encoder; 22302fa8f79b05456184028f014432647b19601a288Laurent Pinchart if (!encoder) 224731cd5526e5c732d51307b26e784f454a724a699Jesse Barnes continue; 22502fa8f79b05456184028f014432647b19601a288Laurent Pinchart 226731cd5526e5c732d51307b26e784f454a724a699Jesse Barnes printf("%d\t%d\t%s\t0x%08x\t0x%08x\n", 227731cd5526e5c732d51307b26e784f454a724a699Jesse Barnes encoder->encoder_id, 228731cd5526e5c732d51307b26e784f454a724a699Jesse Barnes encoder->crtc_id, 229731cd5526e5c732d51307b26e784f454a724a699Jesse Barnes encoder_type_str(encoder->encoder_type), 230731cd5526e5c732d51307b26e784f454a724a699Jesse Barnes encoder->possible_crtcs, 231731cd5526e5c732d51307b26e784f454a724a699Jesse Barnes encoder->possible_clones); 232731cd5526e5c732d51307b26e784f454a724a699Jesse Barnes } 2330243c9f801a35de3465a0321c02f18a4d07ce5b8Kristian Høgsberg printf("\n"); 2340243c9f801a35de3465a0321c02f18a4d07ce5b8Kristian Høgsberg} 2350243c9f801a35de3465a0321c02f18a4d07ce5b8Kristian Høgsberg 236ca9c8f06e0f560082dcd0943e9be29ba9a915ee3Laurent Pinchartstatic void dump_mode(drmModeModeInfo *mode) 2370243c9f801a35de3465a0321c02f18a4d07ce5b8Kristian Høgsberg{ 238c0ed9b23ecb48b8301f66d2270e638249709e94eKristian Høgsberg printf(" %s %d %d %d %d %d %d %d %d %d", 2390243c9f801a35de3465a0321c02f18a4d07ce5b8Kristian Høgsberg mode->name, 240694ef59532253727176ed0ce9077ae3ec41dd457Marcin Kościelnicki mode->vrefresh, 2410243c9f801a35de3465a0321c02f18a4d07ce5b8Kristian Høgsberg mode->hdisplay, 2420243c9f801a35de3465a0321c02f18a4d07ce5b8Kristian Høgsberg mode->hsync_start, 2430243c9f801a35de3465a0321c02f18a4d07ce5b8Kristian Høgsberg mode->hsync_end, 2440243c9f801a35de3465a0321c02f18a4d07ce5b8Kristian Høgsberg mode->htotal, 2450243c9f801a35de3465a0321c02f18a4d07ce5b8Kristian Høgsberg mode->vdisplay, 2460243c9f801a35de3465a0321c02f18a4d07ce5b8Kristian Høgsberg mode->vsync_start, 2470243c9f801a35de3465a0321c02f18a4d07ce5b8Kristian Høgsberg mode->vsync_end, 2480243c9f801a35de3465a0321c02f18a4d07ce5b8Kristian Høgsberg mode->vtotal); 249c0ed9b23ecb48b8301f66d2270e638249709e94eKristian Høgsberg 250c0ed9b23ecb48b8301f66d2270e638249709e94eKristian Høgsberg printf(" flags: "); 251c0ed9b23ecb48b8301f66d2270e638249709e94eKristian Høgsberg mode_flag_str(mode->flags); 252c0ed9b23ecb48b8301f66d2270e638249709e94eKristian Høgsberg printf("; type: "); 253c0ed9b23ecb48b8301f66d2270e638249709e94eKristian Høgsberg mode_type_str(mode->type); 254c0ed9b23ecb48b8301f66d2270e638249709e94eKristian Høgsberg printf("\n"); 255731cd5526e5c732d51307b26e784f454a724a699Jesse Barnes} 256731cd5526e5c732d51307b26e784f454a724a699Jesse Barnes 257549fe0ba627a67b6ae1334eb5cf274a3dfb1fd69Laurent Pinchartstatic void dump_blob(struct device *dev, uint32_t blob_id) 258d72a44c7c4f5eea9c1e5bb0c36cb9e0224b9ca22Paulo Zanoni{ 259d72a44c7c4f5eea9c1e5bb0c36cb9e0224b9ca22Paulo Zanoni uint32_t i; 260d72a44c7c4f5eea9c1e5bb0c36cb9e0224b9ca22Paulo Zanoni unsigned char *blob_data; 261d72a44c7c4f5eea9c1e5bb0c36cb9e0224b9ca22Paulo Zanoni drmModePropertyBlobPtr blob; 262d72a44c7c4f5eea9c1e5bb0c36cb9e0224b9ca22Paulo Zanoni 263549fe0ba627a67b6ae1334eb5cf274a3dfb1fd69Laurent Pinchart blob = drmModeGetPropertyBlob(dev->fd, blob_id); 264d72a44c7c4f5eea9c1e5bb0c36cb9e0224b9ca22Paulo Zanoni if (!blob) 265d72a44c7c4f5eea9c1e5bb0c36cb9e0224b9ca22Paulo Zanoni return; 266d72a44c7c4f5eea9c1e5bb0c36cb9e0224b9ca22Paulo Zanoni 267d72a44c7c4f5eea9c1e5bb0c36cb9e0224b9ca22Paulo Zanoni blob_data = blob->data; 268d72a44c7c4f5eea9c1e5bb0c36cb9e0224b9ca22Paulo Zanoni 269d72a44c7c4f5eea9c1e5bb0c36cb9e0224b9ca22Paulo Zanoni for (i = 0; i < blob->length; i++) { 270d72a44c7c4f5eea9c1e5bb0c36cb9e0224b9ca22Paulo Zanoni if (i % 16 == 0) 271d72a44c7c4f5eea9c1e5bb0c36cb9e0224b9ca22Paulo Zanoni printf("\n\t\t\t"); 272d72a44c7c4f5eea9c1e5bb0c36cb9e0224b9ca22Paulo Zanoni printf("%.2hhx", blob_data[i]); 273d72a44c7c4f5eea9c1e5bb0c36cb9e0224b9ca22Paulo Zanoni } 274d72a44c7c4f5eea9c1e5bb0c36cb9e0224b9ca22Paulo Zanoni printf("\n"); 275d72a44c7c4f5eea9c1e5bb0c36cb9e0224b9ca22Paulo Zanoni 276d72a44c7c4f5eea9c1e5bb0c36cb9e0224b9ca22Paulo Zanoni drmModeFreePropertyBlob(blob); 277d72a44c7c4f5eea9c1e5bb0c36cb9e0224b9ca22Paulo Zanoni} 278d72a44c7c4f5eea9c1e5bb0c36cb9e0224b9ca22Paulo Zanoni 279549fe0ba627a67b6ae1334eb5cf274a3dfb1fd69Laurent Pinchartstatic void dump_prop(struct device *dev, drmModePropertyPtr prop, 280549fe0ba627a67b6ae1334eb5cf274a3dfb1fd69Laurent Pinchart uint32_t prop_id, uint64_t value) 2819fc85b4084b69fefab3dbdf1f6cf97ccb47c963aKristian Høgsberg{ 2829fc85b4084b69fefab3dbdf1f6cf97ccb47c963aKristian Høgsberg int i; 283d72a44c7c4f5eea9c1e5bb0c36cb9e0224b9ca22Paulo Zanoni printf("\t%d", prop_id); 284d72a44c7c4f5eea9c1e5bb0c36cb9e0224b9ca22Paulo Zanoni if (!prop) { 285d72a44c7c4f5eea9c1e5bb0c36cb9e0224b9ca22Paulo Zanoni printf("\n"); 286d72a44c7c4f5eea9c1e5bb0c36cb9e0224b9ca22Paulo Zanoni return; 287d72a44c7c4f5eea9c1e5bb0c36cb9e0224b9ca22Paulo Zanoni } 288d72a44c7c4f5eea9c1e5bb0c36cb9e0224b9ca22Paulo Zanoni 289d72a44c7c4f5eea9c1e5bb0c36cb9e0224b9ca22Paulo Zanoni printf(" %s:\n", prop->name); 290d72a44c7c4f5eea9c1e5bb0c36cb9e0224b9ca22Paulo Zanoni 291d72a44c7c4f5eea9c1e5bb0c36cb9e0224b9ca22Paulo Zanoni printf("\t\tflags:"); 292d72a44c7c4f5eea9c1e5bb0c36cb9e0224b9ca22Paulo Zanoni if (prop->flags & DRM_MODE_PROP_PENDING) 293d72a44c7c4f5eea9c1e5bb0c36cb9e0224b9ca22Paulo Zanoni printf(" pending"); 294d72a44c7c4f5eea9c1e5bb0c36cb9e0224b9ca22Paulo Zanoni if (prop->flags & DRM_MODE_PROP_RANGE) 295d72a44c7c4f5eea9c1e5bb0c36cb9e0224b9ca22Paulo Zanoni printf(" range"); 296d72a44c7c4f5eea9c1e5bb0c36cb9e0224b9ca22Paulo Zanoni if (prop->flags & DRM_MODE_PROP_IMMUTABLE) 297d72a44c7c4f5eea9c1e5bb0c36cb9e0224b9ca22Paulo Zanoni printf(" immutable"); 298d72a44c7c4f5eea9c1e5bb0c36cb9e0224b9ca22Paulo Zanoni if (prop->flags & DRM_MODE_PROP_ENUM) 299d72a44c7c4f5eea9c1e5bb0c36cb9e0224b9ca22Paulo Zanoni printf(" enum"); 3006df9e6af4b34ef2c5278941ee78de029e4040485Rob Clark if (prop->flags & DRM_MODE_PROP_BITMASK) 3016df9e6af4b34ef2c5278941ee78de029e4040485Rob Clark printf(" bitmask"); 302d72a44c7c4f5eea9c1e5bb0c36cb9e0224b9ca22Paulo Zanoni if (prop->flags & DRM_MODE_PROP_BLOB) 303d72a44c7c4f5eea9c1e5bb0c36cb9e0224b9ca22Paulo Zanoni printf(" blob"); 304d72a44c7c4f5eea9c1e5bb0c36cb9e0224b9ca22Paulo Zanoni printf("\n"); 3059fc85b4084b69fefab3dbdf1f6cf97ccb47c963aKristian Høgsberg 306d72a44c7c4f5eea9c1e5bb0c36cb9e0224b9ca22Paulo Zanoni if (prop->flags & DRM_MODE_PROP_RANGE) { 307d72a44c7c4f5eea9c1e5bb0c36cb9e0224b9ca22Paulo Zanoni printf("\t\tvalues:"); 308d72a44c7c4f5eea9c1e5bb0c36cb9e0224b9ca22Paulo Zanoni for (i = 0; i < prop->count_values; i++) 309d72a44c7c4f5eea9c1e5bb0c36cb9e0224b9ca22Paulo Zanoni printf(" %"PRIu64, prop->values[i]); 310d72a44c7c4f5eea9c1e5bb0c36cb9e0224b9ca22Paulo Zanoni printf("\n"); 3119fc85b4084b69fefab3dbdf1f6cf97ccb47c963aKristian Høgsberg } 312d72a44c7c4f5eea9c1e5bb0c36cb9e0224b9ca22Paulo Zanoni 313d72a44c7c4f5eea9c1e5bb0c36cb9e0224b9ca22Paulo Zanoni if (prop->flags & DRM_MODE_PROP_ENUM) { 314d72a44c7c4f5eea9c1e5bb0c36cb9e0224b9ca22Paulo Zanoni printf("\t\tenums:"); 315d72a44c7c4f5eea9c1e5bb0c36cb9e0224b9ca22Paulo Zanoni for (i = 0; i < prop->count_enums; i++) 316d72a44c7c4f5eea9c1e5bb0c36cb9e0224b9ca22Paulo Zanoni printf(" %s=%llu", prop->enums[i].name, 317d72a44c7c4f5eea9c1e5bb0c36cb9e0224b9ca22Paulo Zanoni prop->enums[i].value); 318d72a44c7c4f5eea9c1e5bb0c36cb9e0224b9ca22Paulo Zanoni printf("\n"); 3196df9e6af4b34ef2c5278941ee78de029e4040485Rob Clark } else if (prop->flags & DRM_MODE_PROP_BITMASK) { 3206df9e6af4b34ef2c5278941ee78de029e4040485Rob Clark printf("\t\tvalues:"); 3216df9e6af4b34ef2c5278941ee78de029e4040485Rob Clark for (i = 0; i < prop->count_enums; i++) 3226df9e6af4b34ef2c5278941ee78de029e4040485Rob Clark printf(" %s=0x%llx", prop->enums[i].name, 3236df9e6af4b34ef2c5278941ee78de029e4040485Rob Clark (1LL << prop->enums[i].value)); 3246df9e6af4b34ef2c5278941ee78de029e4040485Rob Clark printf("\n"); 325d72a44c7c4f5eea9c1e5bb0c36cb9e0224b9ca22Paulo Zanoni } else { 326d72a44c7c4f5eea9c1e5bb0c36cb9e0224b9ca22Paulo Zanoni assert(prop->count_enums == 0); 327d72a44c7c4f5eea9c1e5bb0c36cb9e0224b9ca22Paulo Zanoni } 328d72a44c7c4f5eea9c1e5bb0c36cb9e0224b9ca22Paulo Zanoni 329d72a44c7c4f5eea9c1e5bb0c36cb9e0224b9ca22Paulo Zanoni if (prop->flags & DRM_MODE_PROP_BLOB) { 330d72a44c7c4f5eea9c1e5bb0c36cb9e0224b9ca22Paulo Zanoni printf("\t\tblobs:\n"); 331d72a44c7c4f5eea9c1e5bb0c36cb9e0224b9ca22Paulo Zanoni for (i = 0; i < prop->count_blobs; i++) 332549fe0ba627a67b6ae1334eb5cf274a3dfb1fd69Laurent Pinchart dump_blob(dev, prop->blob_ids[i]); 333d72a44c7c4f5eea9c1e5bb0c36cb9e0224b9ca22Paulo Zanoni printf("\n"); 334d72a44c7c4f5eea9c1e5bb0c36cb9e0224b9ca22Paulo Zanoni } else { 335d72a44c7c4f5eea9c1e5bb0c36cb9e0224b9ca22Paulo Zanoni assert(prop->count_blobs == 0); 336d72a44c7c4f5eea9c1e5bb0c36cb9e0224b9ca22Paulo Zanoni } 337d72a44c7c4f5eea9c1e5bb0c36cb9e0224b9ca22Paulo Zanoni 338d72a44c7c4f5eea9c1e5bb0c36cb9e0224b9ca22Paulo Zanoni printf("\t\tvalue:"); 339d72a44c7c4f5eea9c1e5bb0c36cb9e0224b9ca22Paulo Zanoni if (prop->flags & DRM_MODE_PROP_BLOB) 340549fe0ba627a67b6ae1334eb5cf274a3dfb1fd69Laurent Pinchart dump_blob(dev, value); 341d72a44c7c4f5eea9c1e5bb0c36cb9e0224b9ca22Paulo Zanoni else 342d72a44c7c4f5eea9c1e5bb0c36cb9e0224b9ca22Paulo Zanoni printf(" %"PRIu64"\n", value); 3439fc85b4084b69fefab3dbdf1f6cf97ccb47c963aKristian Høgsberg} 3449fc85b4084b69fefab3dbdf1f6cf97ccb47c963aKristian Høgsberg 345549fe0ba627a67b6ae1334eb5cf274a3dfb1fd69Laurent Pinchartstatic void dump_connectors(struct device *dev) 346731cd5526e5c732d51307b26e784f454a724a699Jesse Barnes{ 347731cd5526e5c732d51307b26e784f454a724a699Jesse Barnes int i, j; 348731cd5526e5c732d51307b26e784f454a724a699Jesse Barnes 349731cd5526e5c732d51307b26e784f454a724a699Jesse Barnes printf("Connectors:\n"); 3501e1b3c0a93281ce8df42bbdddfe3e51dccc4d5eaKristian Høgsberg printf("id\tencoder\tstatus\t\ttype\tsize (mm)\tmodes\tencoders\n"); 351549fe0ba627a67b6ae1334eb5cf274a3dfb1fd69Laurent Pinchart for (i = 0; i < dev->resources->res->count_connectors; i++) { 352549fe0ba627a67b6ae1334eb5cf274a3dfb1fd69Laurent Pinchart struct connector *_connector = &dev->resources->connectors[i]; 35302fa8f79b05456184028f014432647b19601a288Laurent Pinchart drmModeConnector *connector = _connector->connector; 35402fa8f79b05456184028f014432647b19601a288Laurent Pinchart if (!connector) 355731cd5526e5c732d51307b26e784f454a724a699Jesse Barnes continue; 356731cd5526e5c732d51307b26e784f454a724a699Jesse Barnes 3571e1b3c0a93281ce8df42bbdddfe3e51dccc4d5eaKristian Høgsberg printf("%d\t%d\t%s\t%s\t%dx%d\t\t%d\t", 358731cd5526e5c732d51307b26e784f454a724a699Jesse Barnes connector->connector_id, 359731cd5526e5c732d51307b26e784f454a724a699Jesse Barnes connector->encoder_id, 360731cd5526e5c732d51307b26e784f454a724a699Jesse Barnes connector_status_str(connector->connection), 361731cd5526e5c732d51307b26e784f454a724a699Jesse Barnes connector_type_str(connector->connector_type), 362731cd5526e5c732d51307b26e784f454a724a699Jesse Barnes connector->mmWidth, connector->mmHeight, 363731cd5526e5c732d51307b26e784f454a724a699Jesse Barnes connector->count_modes); 364731cd5526e5c732d51307b26e784f454a724a699Jesse Barnes 3651e1b3c0a93281ce8df42bbdddfe3e51dccc4d5eaKristian Høgsberg for (j = 0; j < connector->count_encoders; j++) 3661e1b3c0a93281ce8df42bbdddfe3e51dccc4d5eaKristian Høgsberg printf("%s%d", j > 0 ? ", " : "", connector->encoders[j]); 3671e1b3c0a93281ce8df42bbdddfe3e51dccc4d5eaKristian Høgsberg printf("\n"); 3681e1b3c0a93281ce8df42bbdddfe3e51dccc4d5eaKristian Høgsberg 369a10bcaaf668ab16233df10c2742dcb497e17d588Paulo Zanoni if (connector->count_modes) { 370a10bcaaf668ab16233df10c2742dcb497e17d588Paulo Zanoni printf(" modes:\n"); 371d72a44c7c4f5eea9c1e5bb0c36cb9e0224b9ca22Paulo Zanoni printf("\tname refresh (Hz) hdisp hss hse htot vdisp " 372a10bcaaf668ab16233df10c2742dcb497e17d588Paulo Zanoni "vss vse vtot)\n"); 373a10bcaaf668ab16233df10c2742dcb497e17d588Paulo Zanoni for (j = 0; j < connector->count_modes; j++) 374a10bcaaf668ab16233df10c2742dcb497e17d588Paulo Zanoni dump_mode(&connector->modes[j]); 37502fa8f79b05456184028f014432647b19601a288Laurent Pinchart } 376a10bcaaf668ab16233df10c2742dcb497e17d588Paulo Zanoni 37702fa8f79b05456184028f014432647b19601a288Laurent Pinchart if (_connector->props) { 378a10bcaaf668ab16233df10c2742dcb497e17d588Paulo Zanoni printf(" props:\n"); 37902fa8f79b05456184028f014432647b19601a288Laurent Pinchart for (j = 0; j < (int)_connector->props->count_props; j++) 380549fe0ba627a67b6ae1334eb5cf274a3dfb1fd69Laurent Pinchart dump_prop(dev, _connector->props_info[j], 38102fa8f79b05456184028f014432647b19601a288Laurent Pinchart _connector->props->props[j], 38202fa8f79b05456184028f014432647b19601a288Laurent Pinchart _connector->props->prop_values[j]); 383a10bcaaf668ab16233df10c2742dcb497e17d588Paulo Zanoni } 384731cd5526e5c732d51307b26e784f454a724a699Jesse Barnes } 3850243c9f801a35de3465a0321c02f18a4d07ce5b8Kristian Høgsberg printf("\n"); 386731cd5526e5c732d51307b26e784f454a724a699Jesse Barnes} 387731cd5526e5c732d51307b26e784f454a724a699Jesse Barnes 388549fe0ba627a67b6ae1334eb5cf274a3dfb1fd69Laurent Pinchartstatic void dump_crtcs(struct device *dev) 389731cd5526e5c732d51307b26e784f454a724a699Jesse Barnes{ 390731cd5526e5c732d51307b26e784f454a724a699Jesse Barnes int i; 39186dece4cf2f7180b854fbd318fa1a57793f0deacPaulo Zanoni uint32_t j; 392731cd5526e5c732d51307b26e784f454a724a699Jesse Barnes 3930243c9f801a35de3465a0321c02f18a4d07ce5b8Kristian Høgsberg printf("CRTCs:\n"); 3940243c9f801a35de3465a0321c02f18a4d07ce5b8Kristian Høgsberg printf("id\tfb\tpos\tsize\n"); 395549fe0ba627a67b6ae1334eb5cf274a3dfb1fd69Laurent Pinchart for (i = 0; i < dev->resources->res->count_crtcs; i++) { 396549fe0ba627a67b6ae1334eb5cf274a3dfb1fd69Laurent Pinchart struct crtc *_crtc = &dev->resources->crtcs[i]; 39702fa8f79b05456184028f014432647b19601a288Laurent Pinchart drmModeCrtc *crtc = _crtc->crtc; 39802fa8f79b05456184028f014432647b19601a288Laurent Pinchart if (!crtc) 399731cd5526e5c732d51307b26e784f454a724a699Jesse Barnes continue; 40002fa8f79b05456184028f014432647b19601a288Laurent Pinchart 4010243c9f801a35de3465a0321c02f18a4d07ce5b8Kristian Høgsberg printf("%d\t%d\t(%d,%d)\t(%dx%d)\n", 4020243c9f801a35de3465a0321c02f18a4d07ce5b8Kristian Høgsberg crtc->crtc_id, 4030243c9f801a35de3465a0321c02f18a4d07ce5b8Kristian Høgsberg crtc->buffer_id, 4040243c9f801a35de3465a0321c02f18a4d07ce5b8Kristian Høgsberg crtc->x, crtc->y, 4050243c9f801a35de3465a0321c02f18a4d07ce5b8Kristian Høgsberg crtc->width, crtc->height); 4060243c9f801a35de3465a0321c02f18a4d07ce5b8Kristian Høgsberg dump_mode(&crtc->mode); 4070243c9f801a35de3465a0321c02f18a4d07ce5b8Kristian Høgsberg 40802fa8f79b05456184028f014432647b19601a288Laurent Pinchart if (_crtc->props) { 40902fa8f79b05456184028f014432647b19601a288Laurent Pinchart printf(" props:\n"); 41002fa8f79b05456184028f014432647b19601a288Laurent Pinchart for (j = 0; j < _crtc->props->count_props; j++) 411549fe0ba627a67b6ae1334eb5cf274a3dfb1fd69Laurent Pinchart dump_prop(dev, _crtc->props_info[j], 41202fa8f79b05456184028f014432647b19601a288Laurent Pinchart _crtc->props->props[j], 41302fa8f79b05456184028f014432647b19601a288Laurent Pinchart _crtc->props->prop_values[j]); 41486dece4cf2f7180b854fbd318fa1a57793f0deacPaulo Zanoni } else { 41502fa8f79b05456184028f014432647b19601a288Laurent Pinchart printf(" no properties found\n"); 41686dece4cf2f7180b854fbd318fa1a57793f0deacPaulo Zanoni } 417731cd5526e5c732d51307b26e784f454a724a699Jesse Barnes } 4180243c9f801a35de3465a0321c02f18a4d07ce5b8Kristian Høgsberg printf("\n"); 419731cd5526e5c732d51307b26e784f454a724a699Jesse Barnes} 420731cd5526e5c732d51307b26e784f454a724a699Jesse Barnes 421549fe0ba627a67b6ae1334eb5cf274a3dfb1fd69Laurent Pinchartstatic void dump_framebuffers(struct device *dev) 422731cd5526e5c732d51307b26e784f454a724a699Jesse Barnes{ 423731cd5526e5c732d51307b26e784f454a724a699Jesse Barnes drmModeFB *fb; 424731cd5526e5c732d51307b26e784f454a724a699Jesse Barnes int i; 425731cd5526e5c732d51307b26e784f454a724a699Jesse Barnes 4260243c9f801a35de3465a0321c02f18a4d07ce5b8Kristian Høgsberg printf("Frame buffers:\n"); 4270243c9f801a35de3465a0321c02f18a4d07ce5b8Kristian Høgsberg printf("id\tsize\tpitch\n"); 428549fe0ba627a67b6ae1334eb5cf274a3dfb1fd69Laurent Pinchart for (i = 0; i < dev->resources->res->count_fbs; i++) { 429549fe0ba627a67b6ae1334eb5cf274a3dfb1fd69Laurent Pinchart fb = dev->resources->fbs[i].fb; 43002fa8f79b05456184028f014432647b19601a288Laurent Pinchart if (!fb) 431731cd5526e5c732d51307b26e784f454a724a699Jesse Barnes continue; 43202fa8f79b05456184028f014432647b19601a288Laurent Pinchart 433e4a519635f75bde38aeb5b09f2ff4efbf73453e9Matthew W. S. Bell printf("%u\t(%ux%u)\t%u\n", 4340243c9f801a35de3465a0321c02f18a4d07ce5b8Kristian Høgsberg fb->fb_id, 435e4a519635f75bde38aeb5b09f2ff4efbf73453e9Matthew W. S. Bell fb->width, fb->height, 436e4a519635f75bde38aeb5b09f2ff4efbf73453e9Matthew W. S. Bell fb->pitch); 437731cd5526e5c732d51307b26e784f454a724a699Jesse Barnes } 4380243c9f801a35de3465a0321c02f18a4d07ce5b8Kristian Høgsberg printf("\n"); 439731cd5526e5c732d51307b26e784f454a724a699Jesse Barnes} 440731cd5526e5c732d51307b26e784f454a724a699Jesse Barnes 441549fe0ba627a67b6ae1334eb5cf274a3dfb1fd69Laurent Pinchartstatic void dump_planes(struct device *dev) 442d55de747a2bdec5b4885a6c86ea6707e15dfefb5Rob Clark{ 4439b44fbd393b8db571badae41881f490145404ae0Paulo Zanoni unsigned int i, j; 444d55de747a2bdec5b4885a6c86ea6707e15dfefb5Rob Clark 445d55de747a2bdec5b4885a6c86ea6707e15dfefb5Rob Clark printf("Planes:\n"); 4468e56579b203a11c718c5e3da6fdb03b4f9b9fe56Ville Syrjälä printf("id\tcrtc\tfb\tCRTC x,y\tx,y\tgamma size\tpossible crtcs\n"); 44702fa8f79b05456184028f014432647b19601a288Laurent Pinchart 448549fe0ba627a67b6ae1334eb5cf274a3dfb1fd69Laurent Pinchart if (!dev->resources->plane_res) 44902fa8f79b05456184028f014432647b19601a288Laurent Pinchart return; 45002fa8f79b05456184028f014432647b19601a288Laurent Pinchart 451549fe0ba627a67b6ae1334eb5cf274a3dfb1fd69Laurent Pinchart for (i = 0; i < dev->resources->plane_res->count_planes; i++) { 452549fe0ba627a67b6ae1334eb5cf274a3dfb1fd69Laurent Pinchart struct plane *plane = &dev->resources->planes[i]; 45302fa8f79b05456184028f014432647b19601a288Laurent Pinchart drmModePlane *ovr = plane->plane; 45402fa8f79b05456184028f014432647b19601a288Laurent Pinchart if (!ovr) 455d55de747a2bdec5b4885a6c86ea6707e15dfefb5Rob Clark continue; 456d55de747a2bdec5b4885a6c86ea6707e15dfefb5Rob Clark 4578e56579b203a11c718c5e3da6fdb03b4f9b9fe56Ville Syrjälä printf("%d\t%d\t%d\t%d,%d\t\t%d,%d\t%-8d\t0x%08x\n", 458d55de747a2bdec5b4885a6c86ea6707e15dfefb5Rob Clark ovr->plane_id, ovr->crtc_id, ovr->fb_id, 459d55de747a2bdec5b4885a6c86ea6707e15dfefb5Rob Clark ovr->crtc_x, ovr->crtc_y, ovr->x, ovr->y, 4608e56579b203a11c718c5e3da6fdb03b4f9b9fe56Ville Syrjälä ovr->gamma_size, ovr->possible_crtcs); 461d55de747a2bdec5b4885a6c86ea6707e15dfefb5Rob Clark 462d55de747a2bdec5b4885a6c86ea6707e15dfefb5Rob Clark if (!ovr->count_formats) 463d55de747a2bdec5b4885a6c86ea6707e15dfefb5Rob Clark continue; 464d55de747a2bdec5b4885a6c86ea6707e15dfefb5Rob Clark 465d55de747a2bdec5b4885a6c86ea6707e15dfefb5Rob Clark printf(" formats:"); 466d55de747a2bdec5b4885a6c86ea6707e15dfefb5Rob Clark for (j = 0; j < ovr->count_formats; j++) 467d55de747a2bdec5b4885a6c86ea6707e15dfefb5Rob Clark printf(" %4.4s", (char *)&ovr->formats[j]); 468d55de747a2bdec5b4885a6c86ea6707e15dfefb5Rob Clark printf("\n"); 469d55de747a2bdec5b4885a6c86ea6707e15dfefb5Rob Clark 47002fa8f79b05456184028f014432647b19601a288Laurent Pinchart if (plane->props) { 47102fa8f79b05456184028f014432647b19601a288Laurent Pinchart printf(" props:\n"); 47202fa8f79b05456184028f014432647b19601a288Laurent Pinchart for (j = 0; j < plane->props->count_props; j++) 473549fe0ba627a67b6ae1334eb5cf274a3dfb1fd69Laurent Pinchart dump_prop(dev, plane->props_info[j], 47402fa8f79b05456184028f014432647b19601a288Laurent Pinchart plane->props->props[j], 47502fa8f79b05456184028f014432647b19601a288Laurent Pinchart plane->props->prop_values[j]); 47625e4cb4659c62817aae2ca3b83f2d4f598d6474bRob Clark } else { 47702fa8f79b05456184028f014432647b19601a288Laurent Pinchart printf(" no properties found\n"); 47825e4cb4659c62817aae2ca3b83f2d4f598d6474bRob Clark } 479d55de747a2bdec5b4885a6c86ea6707e15dfefb5Rob Clark } 480d55de747a2bdec5b4885a6c86ea6707e15dfefb5Rob Clark printf("\n"); 481d55de747a2bdec5b4885a6c86ea6707e15dfefb5Rob Clark 482d55de747a2bdec5b4885a6c86ea6707e15dfefb5Rob Clark return; 483d55de747a2bdec5b4885a6c86ea6707e15dfefb5Rob Clark} 484d55de747a2bdec5b4885a6c86ea6707e15dfefb5Rob Clark 48502fa8f79b05456184028f014432647b19601a288Laurent Pinchartstatic void free_resources(struct resources *res) 48602fa8f79b05456184028f014432647b19601a288Laurent Pinchart{ 48702fa8f79b05456184028f014432647b19601a288Laurent Pinchart if (!res) 48802fa8f79b05456184028f014432647b19601a288Laurent Pinchart return; 48902fa8f79b05456184028f014432647b19601a288Laurent Pinchart 49002fa8f79b05456184028f014432647b19601a288Laurent Pinchart#define free_resource(_res, __res, type, Type) \ 49102fa8f79b05456184028f014432647b19601a288Laurent Pinchart do { \ 49202fa8f79b05456184028f014432647b19601a288Laurent Pinchart int i; \ 49302fa8f79b05456184028f014432647b19601a288Laurent Pinchart if (!(_res)->type##s) \ 49402fa8f79b05456184028f014432647b19601a288Laurent Pinchart break; \ 49502fa8f79b05456184028f014432647b19601a288Laurent Pinchart for (i = 0; i < (int)(_res)->__res->count_##type##s; ++i) { \ 49602fa8f79b05456184028f014432647b19601a288Laurent Pinchart if (!(_res)->type##s[i].type) \ 49702fa8f79b05456184028f014432647b19601a288Laurent Pinchart break; \ 49802fa8f79b05456184028f014432647b19601a288Laurent Pinchart drmModeFree##Type((_res)->type##s[i].type); \ 49902fa8f79b05456184028f014432647b19601a288Laurent Pinchart } \ 50002fa8f79b05456184028f014432647b19601a288Laurent Pinchart free((_res)->type##s); \ 50102fa8f79b05456184028f014432647b19601a288Laurent Pinchart } while (0) 50202fa8f79b05456184028f014432647b19601a288Laurent Pinchart 50302fa8f79b05456184028f014432647b19601a288Laurent Pinchart#define free_properties(_res, __res, type) \ 50402fa8f79b05456184028f014432647b19601a288Laurent Pinchart do { \ 50502fa8f79b05456184028f014432647b19601a288Laurent Pinchart int i; \ 50602fa8f79b05456184028f014432647b19601a288Laurent Pinchart for (i = 0; i < (int)(_res)->__res->count_##type##s; ++i) { \ 50702fa8f79b05456184028f014432647b19601a288Laurent Pinchart drmModeFreeObjectProperties(res->type##s[i].props); \ 50802fa8f79b05456184028f014432647b19601a288Laurent Pinchart free(res->type##s[i].props_info); \ 50902fa8f79b05456184028f014432647b19601a288Laurent Pinchart } \ 51002fa8f79b05456184028f014432647b19601a288Laurent Pinchart } while (0) 51102fa8f79b05456184028f014432647b19601a288Laurent Pinchart 51202fa8f79b05456184028f014432647b19601a288Laurent Pinchart if (res->res) { 51302fa8f79b05456184028f014432647b19601a288Laurent Pinchart free_properties(res, res, crtc); 51402fa8f79b05456184028f014432647b19601a288Laurent Pinchart 51502fa8f79b05456184028f014432647b19601a288Laurent Pinchart free_resource(res, res, crtc, Crtc); 51602fa8f79b05456184028f014432647b19601a288Laurent Pinchart free_resource(res, res, encoder, Encoder); 51702fa8f79b05456184028f014432647b19601a288Laurent Pinchart free_resource(res, res, connector, Connector); 51802fa8f79b05456184028f014432647b19601a288Laurent Pinchart free_resource(res, res, fb, FB); 51902fa8f79b05456184028f014432647b19601a288Laurent Pinchart 52002fa8f79b05456184028f014432647b19601a288Laurent Pinchart drmModeFreeResources(res->res); 52102fa8f79b05456184028f014432647b19601a288Laurent Pinchart } 52202fa8f79b05456184028f014432647b19601a288Laurent Pinchart 52302fa8f79b05456184028f014432647b19601a288Laurent Pinchart if (res->plane_res) { 52402fa8f79b05456184028f014432647b19601a288Laurent Pinchart free_properties(res, plane_res, plane); 52502fa8f79b05456184028f014432647b19601a288Laurent Pinchart 52602fa8f79b05456184028f014432647b19601a288Laurent Pinchart free_resource(res, plane_res, plane, Plane); 52702fa8f79b05456184028f014432647b19601a288Laurent Pinchart 52802fa8f79b05456184028f014432647b19601a288Laurent Pinchart drmModeFreePlaneResources(res->plane_res); 52902fa8f79b05456184028f014432647b19601a288Laurent Pinchart } 53002fa8f79b05456184028f014432647b19601a288Laurent Pinchart 53102fa8f79b05456184028f014432647b19601a288Laurent Pinchart free(res); 53202fa8f79b05456184028f014432647b19601a288Laurent Pinchart} 53302fa8f79b05456184028f014432647b19601a288Laurent Pinchart 534549fe0ba627a67b6ae1334eb5cf274a3dfb1fd69Laurent Pinchartstatic struct resources *get_resources(struct device *dev) 53502fa8f79b05456184028f014432647b19601a288Laurent Pinchart{ 53602fa8f79b05456184028f014432647b19601a288Laurent Pinchart struct resources *res; 53756592680bbb1bb73d08bdce317046d0401dcfba0Laurent Pinchart int i; 53802fa8f79b05456184028f014432647b19601a288Laurent Pinchart 53902fa8f79b05456184028f014432647b19601a288Laurent Pinchart res = malloc(sizeof *res); 54002fa8f79b05456184028f014432647b19601a288Laurent Pinchart if (res == 0) 54102fa8f79b05456184028f014432647b19601a288Laurent Pinchart return NULL; 54202fa8f79b05456184028f014432647b19601a288Laurent Pinchart 54302fa8f79b05456184028f014432647b19601a288Laurent Pinchart memset(res, 0, sizeof *res); 54402fa8f79b05456184028f014432647b19601a288Laurent Pinchart 545549fe0ba627a67b6ae1334eb5cf274a3dfb1fd69Laurent Pinchart res->res = drmModeGetResources(dev->fd); 54602fa8f79b05456184028f014432647b19601a288Laurent Pinchart if (!res->res) { 54702fa8f79b05456184028f014432647b19601a288Laurent Pinchart fprintf(stderr, "drmModeGetResources failed: %s\n", 54802fa8f79b05456184028f014432647b19601a288Laurent Pinchart strerror(errno)); 54902fa8f79b05456184028f014432647b19601a288Laurent Pinchart goto error; 55002fa8f79b05456184028f014432647b19601a288Laurent Pinchart } 55102fa8f79b05456184028f014432647b19601a288Laurent Pinchart 55202fa8f79b05456184028f014432647b19601a288Laurent Pinchart res->crtcs = malloc(res->res->count_crtcs * sizeof *res->crtcs); 55302fa8f79b05456184028f014432647b19601a288Laurent Pinchart res->encoders = malloc(res->res->count_encoders * sizeof *res->encoders); 55402fa8f79b05456184028f014432647b19601a288Laurent Pinchart res->connectors = malloc(res->res->count_connectors * sizeof *res->connectors); 55502fa8f79b05456184028f014432647b19601a288Laurent Pinchart res->fbs = malloc(res->res->count_fbs * sizeof *res->fbs); 55602fa8f79b05456184028f014432647b19601a288Laurent Pinchart 55702fa8f79b05456184028f014432647b19601a288Laurent Pinchart if (!res->crtcs || !res->encoders || !res->connectors || !res->fbs) 55802fa8f79b05456184028f014432647b19601a288Laurent Pinchart goto error; 55902fa8f79b05456184028f014432647b19601a288Laurent Pinchart 56002fa8f79b05456184028f014432647b19601a288Laurent Pinchart memset(res->crtcs , 0, res->res->count_crtcs * sizeof *res->crtcs); 56102fa8f79b05456184028f014432647b19601a288Laurent Pinchart memset(res->encoders, 0, res->res->count_encoders * sizeof *res->encoders); 56202fa8f79b05456184028f014432647b19601a288Laurent Pinchart memset(res->connectors, 0, res->res->count_connectors * sizeof *res->connectors); 56302fa8f79b05456184028f014432647b19601a288Laurent Pinchart memset(res->fbs, 0, res->res->count_fbs * sizeof *res->fbs); 56402fa8f79b05456184028f014432647b19601a288Laurent Pinchart 56502fa8f79b05456184028f014432647b19601a288Laurent Pinchart#define get_resource(_res, __res, type, Type) \ 56602fa8f79b05456184028f014432647b19601a288Laurent Pinchart do { \ 56702fa8f79b05456184028f014432647b19601a288Laurent Pinchart int i; \ 56802fa8f79b05456184028f014432647b19601a288Laurent Pinchart for (i = 0; i < (int)(_res)->__res->count_##type##s; ++i) { \ 56902fa8f79b05456184028f014432647b19601a288Laurent Pinchart (_res)->type##s[i].type = \ 570549fe0ba627a67b6ae1334eb5cf274a3dfb1fd69Laurent Pinchart drmModeGet##Type(dev->fd, (_res)->__res->type##s[i]); \ 57102fa8f79b05456184028f014432647b19601a288Laurent Pinchart if (!(_res)->type##s[i].type) \ 57202fa8f79b05456184028f014432647b19601a288Laurent Pinchart fprintf(stderr, "could not get %s %i: %s\n", \ 57302fa8f79b05456184028f014432647b19601a288Laurent Pinchart #type, (_res)->__res->type##s[i], \ 57402fa8f79b05456184028f014432647b19601a288Laurent Pinchart strerror(errno)); \ 57502fa8f79b05456184028f014432647b19601a288Laurent Pinchart } \ 57602fa8f79b05456184028f014432647b19601a288Laurent Pinchart } while (0) 57702fa8f79b05456184028f014432647b19601a288Laurent Pinchart 57802fa8f79b05456184028f014432647b19601a288Laurent Pinchart get_resource(res, res, crtc, Crtc); 57902fa8f79b05456184028f014432647b19601a288Laurent Pinchart get_resource(res, res, encoder, Encoder); 58002fa8f79b05456184028f014432647b19601a288Laurent Pinchart get_resource(res, res, connector, Connector); 58102fa8f79b05456184028f014432647b19601a288Laurent Pinchart get_resource(res, res, fb, FB); 58202fa8f79b05456184028f014432647b19601a288Laurent Pinchart 58302fa8f79b05456184028f014432647b19601a288Laurent Pinchart#define get_properties(_res, __res, type, Type) \ 58402fa8f79b05456184028f014432647b19601a288Laurent Pinchart do { \ 58502fa8f79b05456184028f014432647b19601a288Laurent Pinchart int i; \ 58602fa8f79b05456184028f014432647b19601a288Laurent Pinchart for (i = 0; i < (int)(_res)->__res->count_##type##s; ++i) { \ 58702fa8f79b05456184028f014432647b19601a288Laurent Pinchart struct type *obj = &res->type##s[i]; \ 58802fa8f79b05456184028f014432647b19601a288Laurent Pinchart unsigned int j; \ 58902fa8f79b05456184028f014432647b19601a288Laurent Pinchart obj->props = \ 590549fe0ba627a67b6ae1334eb5cf274a3dfb1fd69Laurent Pinchart drmModeObjectGetProperties(dev->fd, obj->type->type##_id, \ 59102fa8f79b05456184028f014432647b19601a288Laurent Pinchart DRM_MODE_OBJECT_##Type); \ 59202fa8f79b05456184028f014432647b19601a288Laurent Pinchart if (!obj->props) { \ 59302fa8f79b05456184028f014432647b19601a288Laurent Pinchart fprintf(stderr, \ 59402fa8f79b05456184028f014432647b19601a288Laurent Pinchart "could not get %s %i properties: %s\n", \ 59502fa8f79b05456184028f014432647b19601a288Laurent Pinchart #type, obj->type->type##_id, \ 59602fa8f79b05456184028f014432647b19601a288Laurent Pinchart strerror(errno)); \ 59702fa8f79b05456184028f014432647b19601a288Laurent Pinchart continue; \ 59802fa8f79b05456184028f014432647b19601a288Laurent Pinchart } \ 59902fa8f79b05456184028f014432647b19601a288Laurent Pinchart obj->props_info = malloc(obj->props->count_props * \ 60002fa8f79b05456184028f014432647b19601a288Laurent Pinchart sizeof *obj->props_info); \ 60102fa8f79b05456184028f014432647b19601a288Laurent Pinchart if (!obj->props_info) \ 60202fa8f79b05456184028f014432647b19601a288Laurent Pinchart continue; \ 60302fa8f79b05456184028f014432647b19601a288Laurent Pinchart for (j = 0; j < obj->props->count_props; ++j) \ 60402fa8f79b05456184028f014432647b19601a288Laurent Pinchart obj->props_info[j] = \ 605549fe0ba627a67b6ae1334eb5cf274a3dfb1fd69Laurent Pinchart drmModeGetProperty(dev->fd, obj->props->props[j]); \ 60602fa8f79b05456184028f014432647b19601a288Laurent Pinchart } \ 60702fa8f79b05456184028f014432647b19601a288Laurent Pinchart } while (0) 60802fa8f79b05456184028f014432647b19601a288Laurent Pinchart 60902fa8f79b05456184028f014432647b19601a288Laurent Pinchart get_properties(res, res, crtc, CRTC); 61002fa8f79b05456184028f014432647b19601a288Laurent Pinchart get_properties(res, res, connector, CONNECTOR); 61102fa8f79b05456184028f014432647b19601a288Laurent Pinchart 61256592680bbb1bb73d08bdce317046d0401dcfba0Laurent Pinchart for (i = 0; i < res->res->count_crtcs; ++i) 61356592680bbb1bb73d08bdce317046d0401dcfba0Laurent Pinchart res->crtcs[i].mode = &res->crtcs[i].crtc->mode; 61456592680bbb1bb73d08bdce317046d0401dcfba0Laurent Pinchart 615549fe0ba627a67b6ae1334eb5cf274a3dfb1fd69Laurent Pinchart res->plane_res = drmModeGetPlaneResources(dev->fd); 61602fa8f79b05456184028f014432647b19601a288Laurent Pinchart if (!res->plane_res) { 61702fa8f79b05456184028f014432647b19601a288Laurent Pinchart fprintf(stderr, "drmModeGetPlaneResources failed: %s\n", 61802fa8f79b05456184028f014432647b19601a288Laurent Pinchart strerror(errno)); 61902fa8f79b05456184028f014432647b19601a288Laurent Pinchart return res; 62002fa8f79b05456184028f014432647b19601a288Laurent Pinchart } 62102fa8f79b05456184028f014432647b19601a288Laurent Pinchart 62202fa8f79b05456184028f014432647b19601a288Laurent Pinchart res->planes = malloc(res->plane_res->count_planes * sizeof *res->planes); 62302fa8f79b05456184028f014432647b19601a288Laurent Pinchart if (!res->planes) 62402fa8f79b05456184028f014432647b19601a288Laurent Pinchart goto error; 62502fa8f79b05456184028f014432647b19601a288Laurent Pinchart 62602fa8f79b05456184028f014432647b19601a288Laurent Pinchart memset(res->planes, 0, res->plane_res->count_planes * sizeof *res->planes); 62702fa8f79b05456184028f014432647b19601a288Laurent Pinchart 62802fa8f79b05456184028f014432647b19601a288Laurent Pinchart get_resource(res, plane_res, plane, Plane); 62902fa8f79b05456184028f014432647b19601a288Laurent Pinchart get_properties(res, plane_res, plane, PLANE); 63002fa8f79b05456184028f014432647b19601a288Laurent Pinchart 63102fa8f79b05456184028f014432647b19601a288Laurent Pinchart return res; 63202fa8f79b05456184028f014432647b19601a288Laurent Pinchart 63302fa8f79b05456184028f014432647b19601a288Laurent Pincharterror: 63402fa8f79b05456184028f014432647b19601a288Laurent Pinchart free_resources(res); 63502fa8f79b05456184028f014432647b19601a288Laurent Pinchart return NULL; 63602fa8f79b05456184028f014432647b19601a288Laurent Pinchart} 63702fa8f79b05456184028f014432647b19601a288Laurent Pinchart 6382c5ee84d30cbd3fba61a8426b1e6bdd4f385de13Laurent Pinchartstatic drmModeConnector *get_connector_by_id(struct device *dev, uint32_t id) 6392c5ee84d30cbd3fba61a8426b1e6bdd4f385de13Laurent Pinchart{ 6402c5ee84d30cbd3fba61a8426b1e6bdd4f385de13Laurent Pinchart drmModeConnector *connector; 6412c5ee84d30cbd3fba61a8426b1e6bdd4f385de13Laurent Pinchart int i; 6422c5ee84d30cbd3fba61a8426b1e6bdd4f385de13Laurent Pinchart 6432c5ee84d30cbd3fba61a8426b1e6bdd4f385de13Laurent Pinchart for (i = 0; i < dev->resources->res->count_connectors; i++) { 6442c5ee84d30cbd3fba61a8426b1e6bdd4f385de13Laurent Pinchart connector = dev->resources->connectors[i].connector; 6452c5ee84d30cbd3fba61a8426b1e6bdd4f385de13Laurent Pinchart if (connector && connector->connector_id == id) 6462c5ee84d30cbd3fba61a8426b1e6bdd4f385de13Laurent Pinchart return connector; 6472c5ee84d30cbd3fba61a8426b1e6bdd4f385de13Laurent Pinchart } 6482c5ee84d30cbd3fba61a8426b1e6bdd4f385de13Laurent Pinchart 6492c5ee84d30cbd3fba61a8426b1e6bdd4f385de13Laurent Pinchart return NULL; 6502c5ee84d30cbd3fba61a8426b1e6bdd4f385de13Laurent Pinchart} 6512c5ee84d30cbd3fba61a8426b1e6bdd4f385de13Laurent Pinchart 6522c5ee84d30cbd3fba61a8426b1e6bdd4f385de13Laurent Pinchartstatic drmModeEncoder *get_encoder_by_id(struct device *dev, uint32_t id) 6532c5ee84d30cbd3fba61a8426b1e6bdd4f385de13Laurent Pinchart{ 6542c5ee84d30cbd3fba61a8426b1e6bdd4f385de13Laurent Pinchart drmModeEncoder *encoder; 6552c5ee84d30cbd3fba61a8426b1e6bdd4f385de13Laurent Pinchart int i; 6562c5ee84d30cbd3fba61a8426b1e6bdd4f385de13Laurent Pinchart 6572c5ee84d30cbd3fba61a8426b1e6bdd4f385de13Laurent Pinchart for (i = 0; i < dev->resources->res->count_encoders; i++) { 6582c5ee84d30cbd3fba61a8426b1e6bdd4f385de13Laurent Pinchart encoder = dev->resources->encoders[i].encoder; 6592c5ee84d30cbd3fba61a8426b1e6bdd4f385de13Laurent Pinchart if (encoder && encoder->encoder_id == id) 6602c5ee84d30cbd3fba61a8426b1e6bdd4f385de13Laurent Pinchart return encoder; 6612c5ee84d30cbd3fba61a8426b1e6bdd4f385de13Laurent Pinchart } 6622c5ee84d30cbd3fba61a8426b1e6bdd4f385de13Laurent Pinchart 6632c5ee84d30cbd3fba61a8426b1e6bdd4f385de13Laurent Pinchart return NULL; 6642c5ee84d30cbd3fba61a8426b1e6bdd4f385de13Laurent Pinchart} 6652c5ee84d30cbd3fba61a8426b1e6bdd4f385de13Laurent Pinchart 666a94ee624292bff96ea1d38e8a0a3fbeefec42fb6Laurent Pinchart/* ----------------------------------------------------------------------------- 667b1e0bdeb70b68754c6c4ab1c7d0161709960d49cLaurent Pinchart * Pipes and planes 668a94ee624292bff96ea1d38e8a0a3fbeefec42fb6Laurent Pinchart */ 669a94ee624292bff96ea1d38e8a0a3fbeefec42fb6Laurent Pinchart 670731cd5526e5c732d51307b26e784f454a724a699Jesse Barnes/* 671731cd5526e5c732d51307b26e784f454a724a699Jesse Barnes * Mode setting with the kernel interfaces is a bit of a chore. 672731cd5526e5c732d51307b26e784f454a724a699Jesse Barnes * First you have to find the connector in question and make sure the 673731cd5526e5c732d51307b26e784f454a724a699Jesse Barnes * requested mode is available. 674731cd5526e5c732d51307b26e784f454a724a699Jesse Barnes * Then you need to find the encoder attached to that connector so you 675731cd5526e5c732d51307b26e784f454a724a699Jesse Barnes * can bind it with a free crtc. 676731cd5526e5c732d51307b26e784f454a724a699Jesse Barnes */ 677b1e0bdeb70b68754c6c4ab1c7d0161709960d49cLaurent Pinchartstruct pipe_arg { 6782c5ee84d30cbd3fba61a8426b1e6bdd4f385de13Laurent Pinchart uint32_t *con_ids; 6792c5ee84d30cbd3fba61a8426b1e6bdd4f385de13Laurent Pinchart unsigned int num_cons; 680a6349d0a0f9d3e017ac761ba912279c7d1e94eb7Laurent Pinchart uint32_t crtc_id; 681669fde3472ae71c55cc7526e3b3bd6fe00d6a5a5Kristian Høgsberg char mode_str[64]; 682cc90ffa9b18fc6f925a3a2c36131332b8af558f8Laurent Pinchart char format_str[5]; 683cc90ffa9b18fc6f925a3a2c36131332b8af558f8Laurent Pinchart unsigned int fourcc; 6849fc85b4084b69fefab3dbdf1f6cf97ccb47c963aKristian Høgsberg drmModeModeInfo *mode; 685a6349d0a0f9d3e017ac761ba912279c7d1e94eb7Laurent Pinchart struct crtc *crtc; 6861e1b3c0a93281ce8df42bbdddfe3e51dccc4d5eaKristian Høgsberg unsigned int fb_id[2], current_fb_id; 6871e1b3c0a93281ce8df42bbdddfe3e51dccc4d5eaKristian Høgsberg struct timeval start; 6881e1b3c0a93281ce8df42bbdddfe3e51dccc4d5eaKristian Høgsberg 6891e1b3c0a93281ce8df42bbdddfe3e51dccc4d5eaKristian Høgsberg int swap_count; 690d55de747a2bdec5b4885a6c86ea6707e15dfefb5Rob Clark}; 691d55de747a2bdec5b4885a6c86ea6707e15dfefb5Rob Clark 69202fa8f79b05456184028f014432647b19601a288Laurent Pinchartstruct plane_arg { 693eabf199dffb0d42e959c50aa820b39228196e031Laurent Pinchart uint32_t crtc_id; /* the id of CRTC to bind to */ 6947badcca4925480ffdc4f3aa5efb88624ce451e70Laurent Pinchart bool has_position; 6957badcca4925480ffdc4f3aa5efb88624ce451e70Laurent Pinchart int32_t x, y; 696d55de747a2bdec5b4885a6c86ea6707e15dfefb5Rob Clark uint32_t w, h; 697d55de747a2bdec5b4885a6c86ea6707e15dfefb5Rob Clark unsigned int fb_id; 698b83ad866220911e5be1704e6df085705e5ba8eaeRob Clark char format_str[5]; /* need to leave room for terminating \0 */ 6990375222c714e8b7ba55f12d5cb389383be1cf54dLaurent Pinchart unsigned int fourcc; 700d55de747a2bdec5b4885a6c86ea6707e15dfefb5Rob Clark}; 701669fde3472ae71c55cc7526e3b3bd6fe00d6a5a5Kristian Høgsberg 7022c5ee84d30cbd3fba61a8426b1e6bdd4f385de13Laurent Pinchartstatic drmModeModeInfo * 7032c5ee84d30cbd3fba61a8426b1e6bdd4f385de13Laurent Pinchartconnector_find_mode(struct device *dev, uint32_t con_id, const char *mode_str) 704731cd5526e5c732d51307b26e784f454a724a699Jesse Barnes{ 705731cd5526e5c732d51307b26e784f454a724a699Jesse Barnes drmModeConnector *connector; 7062c5ee84d30cbd3fba61a8426b1e6bdd4f385de13Laurent Pinchart drmModeModeInfo *mode; 7072c5ee84d30cbd3fba61a8426b1e6bdd4f385de13Laurent Pinchart int i; 708731cd5526e5c732d51307b26e784f454a724a699Jesse Barnes 7092c5ee84d30cbd3fba61a8426b1e6bdd4f385de13Laurent Pinchart connector = get_connector_by_id(dev, con_id); 7102c5ee84d30cbd3fba61a8426b1e6bdd4f385de13Laurent Pinchart if (!connector || !connector->count_modes) 7112c5ee84d30cbd3fba61a8426b1e6bdd4f385de13Laurent Pinchart return NULL; 7122c5ee84d30cbd3fba61a8426b1e6bdd4f385de13Laurent Pinchart 7132c5ee84d30cbd3fba61a8426b1e6bdd4f385de13Laurent Pinchart for (i = 0; i < connector->count_modes; i++) { 7142c5ee84d30cbd3fba61a8426b1e6bdd4f385de13Laurent Pinchart mode = &connector->modes[i]; 7152c5ee84d30cbd3fba61a8426b1e6bdd4f385de13Laurent Pinchart if (!strcmp(mode->name, mode_str)) 7162c5ee84d30cbd3fba61a8426b1e6bdd4f385de13Laurent Pinchart return mode; 7172c5ee84d30cbd3fba61a8426b1e6bdd4f385de13Laurent Pinchart } 7182c5ee84d30cbd3fba61a8426b1e6bdd4f385de13Laurent Pinchart 7192c5ee84d30cbd3fba61a8426b1e6bdd4f385de13Laurent Pinchart return NULL; 7202c5ee84d30cbd3fba61a8426b1e6bdd4f385de13Laurent Pinchart} 7212c5ee84d30cbd3fba61a8426b1e6bdd4f385de13Laurent Pinchart 7222c5ee84d30cbd3fba61a8426b1e6bdd4f385de13Laurent Pinchartstatic struct crtc *pipe_find_crtc(struct device *dev, struct pipe_arg *pipe) 7232c5ee84d30cbd3fba61a8426b1e6bdd4f385de13Laurent Pinchart{ 7242c5ee84d30cbd3fba61a8426b1e6bdd4f385de13Laurent Pinchart uint32_t possible_crtcs = ~0; 7252c5ee84d30cbd3fba61a8426b1e6bdd4f385de13Laurent Pinchart uint32_t active_crtcs = 0; 7262c5ee84d30cbd3fba61a8426b1e6bdd4f385de13Laurent Pinchart unsigned int crtc_idx; 7272c5ee84d30cbd3fba61a8426b1e6bdd4f385de13Laurent Pinchart unsigned int i; 7282c5ee84d30cbd3fba61a8426b1e6bdd4f385de13Laurent Pinchart int j; 7292c5ee84d30cbd3fba61a8426b1e6bdd4f385de13Laurent Pinchart 7302c5ee84d30cbd3fba61a8426b1e6bdd4f385de13Laurent Pinchart for (i = 0; i < pipe->num_cons; ++i) { 7312c5ee84d30cbd3fba61a8426b1e6bdd4f385de13Laurent Pinchart drmModeConnector *connector; 7322c5ee84d30cbd3fba61a8426b1e6bdd4f385de13Laurent Pinchart drmModeEncoder *encoder; 7332c5ee84d30cbd3fba61a8426b1e6bdd4f385de13Laurent Pinchart 7342c5ee84d30cbd3fba61a8426b1e6bdd4f385de13Laurent Pinchart connector = get_connector_by_id(dev, pipe->con_ids[i]); 73502fa8f79b05456184028f014432647b19601a288Laurent Pinchart if (!connector) 7362c5ee84d30cbd3fba61a8426b1e6bdd4f385de13Laurent Pinchart return NULL; 737731cd5526e5c732d51307b26e784f454a724a699Jesse Barnes 7382c5ee84d30cbd3fba61a8426b1e6bdd4f385de13Laurent Pinchart encoder = get_encoder_by_id(dev, connector->encoder_id); 7392c5ee84d30cbd3fba61a8426b1e6bdd4f385de13Laurent Pinchart if (!encoder) 7402c5ee84d30cbd3fba61a8426b1e6bdd4f385de13Laurent Pinchart return NULL; 741731cd5526e5c732d51307b26e784f454a724a699Jesse Barnes 7422c5ee84d30cbd3fba61a8426b1e6bdd4f385de13Laurent Pinchart possible_crtcs &= encoder->possible_crtcs; 743731cd5526e5c732d51307b26e784f454a724a699Jesse Barnes 7442c5ee84d30cbd3fba61a8426b1e6bdd4f385de13Laurent Pinchart for (j = 0; j < dev->resources->res->count_crtcs; ++j) { 7452c5ee84d30cbd3fba61a8426b1e6bdd4f385de13Laurent Pinchart drmModeCrtc *crtc = dev->resources->crtcs[j].crtc; 7462c5ee84d30cbd3fba61a8426b1e6bdd4f385de13Laurent Pinchart if (crtc && crtc->crtc_id == encoder->crtc_id) { 7472c5ee84d30cbd3fba61a8426b1e6bdd4f385de13Laurent Pinchart active_crtcs |= 1 << j; 748731cd5526e5c732d51307b26e784f454a724a699Jesse Barnes break; 7492c5ee84d30cbd3fba61a8426b1e6bdd4f385de13Laurent Pinchart } 750731cd5526e5c732d51307b26e784f454a724a699Jesse Barnes } 751731cd5526e5c732d51307b26e784f454a724a699Jesse Barnes } 752731cd5526e5c732d51307b26e784f454a724a699Jesse Barnes 7532c5ee84d30cbd3fba61a8426b1e6bdd4f385de13Laurent Pinchart if (!possible_crtcs) 7542c5ee84d30cbd3fba61a8426b1e6bdd4f385de13Laurent Pinchart return NULL; 7552c5ee84d30cbd3fba61a8426b1e6bdd4f385de13Laurent Pinchart 7562c5ee84d30cbd3fba61a8426b1e6bdd4f385de13Laurent Pinchart /* Return the first possible and active CRTC if one exists, or the first 7572c5ee84d30cbd3fba61a8426b1e6bdd4f385de13Laurent Pinchart * possible CRTC otherwise. 7582c5ee84d30cbd3fba61a8426b1e6bdd4f385de13Laurent Pinchart */ 7592c5ee84d30cbd3fba61a8426b1e6bdd4f385de13Laurent Pinchart if (possible_crtcs & active_crtcs) 7602c5ee84d30cbd3fba61a8426b1e6bdd4f385de13Laurent Pinchart crtc_idx = ffs(possible_crtcs & active_crtcs); 7612c5ee84d30cbd3fba61a8426b1e6bdd4f385de13Laurent Pinchart else 7622c5ee84d30cbd3fba61a8426b1e6bdd4f385de13Laurent Pinchart crtc_idx = ffs(possible_crtcs); 7632c5ee84d30cbd3fba61a8426b1e6bdd4f385de13Laurent Pinchart 7642c5ee84d30cbd3fba61a8426b1e6bdd4f385de13Laurent Pinchart return &dev->resources->crtcs[crtc_idx - 1]; 7652c5ee84d30cbd3fba61a8426b1e6bdd4f385de13Laurent Pinchart} 7662c5ee84d30cbd3fba61a8426b1e6bdd4f385de13Laurent Pinchart 7672c5ee84d30cbd3fba61a8426b1e6bdd4f385de13Laurent Pinchartstatic int pipe_find_crtc_and_mode(struct device *dev, struct pipe_arg *pipe) 7682c5ee84d30cbd3fba61a8426b1e6bdd4f385de13Laurent Pinchart{ 7692c5ee84d30cbd3fba61a8426b1e6bdd4f385de13Laurent Pinchart drmModeModeInfo *mode; 7702c5ee84d30cbd3fba61a8426b1e6bdd4f385de13Laurent Pinchart int i; 7712c5ee84d30cbd3fba61a8426b1e6bdd4f385de13Laurent Pinchart 7722c5ee84d30cbd3fba61a8426b1e6bdd4f385de13Laurent Pinchart pipe->mode = NULL; 7732c5ee84d30cbd3fba61a8426b1e6bdd4f385de13Laurent Pinchart 7742c5ee84d30cbd3fba61a8426b1e6bdd4f385de13Laurent Pinchart for (i = 0; i < (int)pipe->num_cons; i++) { 7752c5ee84d30cbd3fba61a8426b1e6bdd4f385de13Laurent Pinchart mode = connector_find_mode(dev, pipe->con_ids[i], 7762c5ee84d30cbd3fba61a8426b1e6bdd4f385de13Laurent Pinchart pipe->mode_str); 7772c5ee84d30cbd3fba61a8426b1e6bdd4f385de13Laurent Pinchart if (mode == NULL) { 7782c5ee84d30cbd3fba61a8426b1e6bdd4f385de13Laurent Pinchart fprintf(stderr, 7792c5ee84d30cbd3fba61a8426b1e6bdd4f385de13Laurent Pinchart "failed to find mode \"%s\" for connector %u\n", 7802c5ee84d30cbd3fba61a8426b1e6bdd4f385de13Laurent Pinchart pipe->mode_str, pipe->con_ids[i]); 7812c5ee84d30cbd3fba61a8426b1e6bdd4f385de13Laurent Pinchart return -EINVAL; 7822c5ee84d30cbd3fba61a8426b1e6bdd4f385de13Laurent Pinchart } 783731cd5526e5c732d51307b26e784f454a724a699Jesse Barnes } 784731cd5526e5c732d51307b26e784f454a724a699Jesse Barnes 785a6349d0a0f9d3e017ac761ba912279c7d1e94eb7Laurent Pinchart /* If the CRTC ID was specified, get the corresponding CRTC. Otherwise 7862c5ee84d30cbd3fba61a8426b1e6bdd4f385de13Laurent Pinchart * locate a CRTC that can be attached to all the connectors. 787a6349d0a0f9d3e017ac761ba912279c7d1e94eb7Laurent Pinchart */ 7882c5ee84d30cbd3fba61a8426b1e6bdd4f385de13Laurent Pinchart if (pipe->crtc_id != (uint32_t)-1) { 7892c5ee84d30cbd3fba61a8426b1e6bdd4f385de13Laurent Pinchart for (i = 0; i < dev->resources->res->count_crtcs; i++) { 7902c5ee84d30cbd3fba61a8426b1e6bdd4f385de13Laurent Pinchart struct crtc *crtc = &dev->resources->crtcs[i]; 7912c5ee84d30cbd3fba61a8426b1e6bdd4f385de13Laurent Pinchart 7922c5ee84d30cbd3fba61a8426b1e6bdd4f385de13Laurent Pinchart if (pipe->crtc_id == crtc->crtc->crtc_id) { 7932c5ee84d30cbd3fba61a8426b1e6bdd4f385de13Laurent Pinchart pipe->crtc = crtc; 794a6349d0a0f9d3e017ac761ba912279c7d1e94eb7Laurent Pinchart break; 795a6349d0a0f9d3e017ac761ba912279c7d1e94eb7Laurent Pinchart } 796a6349d0a0f9d3e017ac761ba912279c7d1e94eb7Laurent Pinchart } 7972c5ee84d30cbd3fba61a8426b1e6bdd4f385de13Laurent Pinchart } else { 7982c5ee84d30cbd3fba61a8426b1e6bdd4f385de13Laurent Pinchart pipe->crtc = pipe_find_crtc(dev, pipe); 799a6349d0a0f9d3e017ac761ba912279c7d1e94eb7Laurent Pinchart } 800a6349d0a0f9d3e017ac761ba912279c7d1e94eb7Laurent Pinchart 8012c5ee84d30cbd3fba61a8426b1e6bdd4f385de13Laurent Pinchart if (!pipe->crtc) { 8022c5ee84d30cbd3fba61a8426b1e6bdd4f385de13Laurent Pinchart fprintf(stderr, "failed to find CRTC for pipe\n"); 8032c5ee84d30cbd3fba61a8426b1e6bdd4f385de13Laurent Pinchart return -EINVAL; 8042c5ee84d30cbd3fba61a8426b1e6bdd4f385de13Laurent Pinchart } 805731cd5526e5c732d51307b26e784f454a724a699Jesse Barnes 8062c5ee84d30cbd3fba61a8426b1e6bdd4f385de13Laurent Pinchart pipe->mode = mode; 8072c5ee84d30cbd3fba61a8426b1e6bdd4f385de13Laurent Pinchart pipe->crtc->mode = mode; 808a6349d0a0f9d3e017ac761ba912279c7d1e94eb7Laurent Pinchart 8092c5ee84d30cbd3fba61a8426b1e6bdd4f385de13Laurent Pinchart return 0; 810669fde3472ae71c55cc7526e3b3bd6fe00d6a5a5Kristian Høgsberg} 811669fde3472ae71c55cc7526e3b3bd6fe00d6a5a5Kristian Høgsberg 812d725227cec822b8cfbeb541be17aae30b7612b9fLaurent Pinchart/* ----------------------------------------------------------------------------- 813d725227cec822b8cfbeb541be17aae30b7612b9fLaurent Pinchart * Properties 814d725227cec822b8cfbeb541be17aae30b7612b9fLaurent Pinchart */ 815d725227cec822b8cfbeb541be17aae30b7612b9fLaurent Pinchart 816d725227cec822b8cfbeb541be17aae30b7612b9fLaurent Pinchartstruct property_arg { 817d725227cec822b8cfbeb541be17aae30b7612b9fLaurent Pinchart uint32_t obj_id; 818d725227cec822b8cfbeb541be17aae30b7612b9fLaurent Pinchart uint32_t obj_type; 819d725227cec822b8cfbeb541be17aae30b7612b9fLaurent Pinchart char name[DRM_PROP_NAME_LEN+1]; 820d725227cec822b8cfbeb541be17aae30b7612b9fLaurent Pinchart uint32_t prop_id; 821d725227cec822b8cfbeb541be17aae30b7612b9fLaurent Pinchart uint64_t value; 822d725227cec822b8cfbeb541be17aae30b7612b9fLaurent Pinchart}; 823d725227cec822b8cfbeb541be17aae30b7612b9fLaurent Pinchart 824549fe0ba627a67b6ae1334eb5cf274a3dfb1fd69Laurent Pinchartstatic void set_property(struct device *dev, struct property_arg *p) 825d725227cec822b8cfbeb541be17aae30b7612b9fLaurent Pinchart{ 826d725227cec822b8cfbeb541be17aae30b7612b9fLaurent Pinchart drmModeObjectProperties *props; 827d725227cec822b8cfbeb541be17aae30b7612b9fLaurent Pinchart drmModePropertyRes **props_info; 828d725227cec822b8cfbeb541be17aae30b7612b9fLaurent Pinchart const char *obj_type; 829d725227cec822b8cfbeb541be17aae30b7612b9fLaurent Pinchart int ret; 830d725227cec822b8cfbeb541be17aae30b7612b9fLaurent Pinchart int i; 831d725227cec822b8cfbeb541be17aae30b7612b9fLaurent Pinchart 832d725227cec822b8cfbeb541be17aae30b7612b9fLaurent Pinchart p->obj_type = 0; 833d725227cec822b8cfbeb541be17aae30b7612b9fLaurent Pinchart p->prop_id = 0; 834d725227cec822b8cfbeb541be17aae30b7612b9fLaurent Pinchart 835d725227cec822b8cfbeb541be17aae30b7612b9fLaurent Pinchart#define find_object(_res, __res, type, Type) \ 836d725227cec822b8cfbeb541be17aae30b7612b9fLaurent Pinchart do { \ 837d725227cec822b8cfbeb541be17aae30b7612b9fLaurent Pinchart for (i = 0; i < (int)(_res)->__res->count_##type##s; ++i) { \ 838d725227cec822b8cfbeb541be17aae30b7612b9fLaurent Pinchart struct type *obj = &(_res)->type##s[i]; \ 839d725227cec822b8cfbeb541be17aae30b7612b9fLaurent Pinchart if (obj->type->type##_id != p->obj_id) \ 840d725227cec822b8cfbeb541be17aae30b7612b9fLaurent Pinchart continue; \ 841d725227cec822b8cfbeb541be17aae30b7612b9fLaurent Pinchart p->obj_type = DRM_MODE_OBJECT_##Type; \ 842d725227cec822b8cfbeb541be17aae30b7612b9fLaurent Pinchart obj_type = #Type; \ 843d725227cec822b8cfbeb541be17aae30b7612b9fLaurent Pinchart props = obj->props; \ 844d725227cec822b8cfbeb541be17aae30b7612b9fLaurent Pinchart props_info = obj->props_info; \ 845d725227cec822b8cfbeb541be17aae30b7612b9fLaurent Pinchart } \ 846d725227cec822b8cfbeb541be17aae30b7612b9fLaurent Pinchart } while(0) \ 847d725227cec822b8cfbeb541be17aae30b7612b9fLaurent Pinchart 848549fe0ba627a67b6ae1334eb5cf274a3dfb1fd69Laurent Pinchart find_object(dev->resources, res, crtc, CRTC); 849d725227cec822b8cfbeb541be17aae30b7612b9fLaurent Pinchart if (p->obj_type == 0) 850549fe0ba627a67b6ae1334eb5cf274a3dfb1fd69Laurent Pinchart find_object(dev->resources, res, connector, CONNECTOR); 851d725227cec822b8cfbeb541be17aae30b7612b9fLaurent Pinchart if (p->obj_type == 0) 852549fe0ba627a67b6ae1334eb5cf274a3dfb1fd69Laurent Pinchart find_object(dev->resources, plane_res, plane, PLANE); 853d725227cec822b8cfbeb541be17aae30b7612b9fLaurent Pinchart if (p->obj_type == 0) { 854d725227cec822b8cfbeb541be17aae30b7612b9fLaurent Pinchart fprintf(stderr, "Object %i not found, can't set property\n", 855d725227cec822b8cfbeb541be17aae30b7612b9fLaurent Pinchart p->obj_id); 856d725227cec822b8cfbeb541be17aae30b7612b9fLaurent Pinchart return; 857d725227cec822b8cfbeb541be17aae30b7612b9fLaurent Pinchart } 858d725227cec822b8cfbeb541be17aae30b7612b9fLaurent Pinchart 859d725227cec822b8cfbeb541be17aae30b7612b9fLaurent Pinchart if (!props) { 860d725227cec822b8cfbeb541be17aae30b7612b9fLaurent Pinchart fprintf(stderr, "%s %i has no properties\n", 861d725227cec822b8cfbeb541be17aae30b7612b9fLaurent Pinchart obj_type, p->obj_id); 862d725227cec822b8cfbeb541be17aae30b7612b9fLaurent Pinchart return; 863d725227cec822b8cfbeb541be17aae30b7612b9fLaurent Pinchart } 864d725227cec822b8cfbeb541be17aae30b7612b9fLaurent Pinchart 865d725227cec822b8cfbeb541be17aae30b7612b9fLaurent Pinchart for (i = 0; i < (int)props->count_props; ++i) { 866d725227cec822b8cfbeb541be17aae30b7612b9fLaurent Pinchart if (!props_info[i]) 867d725227cec822b8cfbeb541be17aae30b7612b9fLaurent Pinchart continue; 868d725227cec822b8cfbeb541be17aae30b7612b9fLaurent Pinchart if (strcmp(props_info[i]->name, p->name) == 0) 869d725227cec822b8cfbeb541be17aae30b7612b9fLaurent Pinchart break; 870d725227cec822b8cfbeb541be17aae30b7612b9fLaurent Pinchart } 871d725227cec822b8cfbeb541be17aae30b7612b9fLaurent Pinchart 872d725227cec822b8cfbeb541be17aae30b7612b9fLaurent Pinchart if (i == (int)props->count_props) { 873d725227cec822b8cfbeb541be17aae30b7612b9fLaurent Pinchart fprintf(stderr, "%s %i has no %s property\n", 874d725227cec822b8cfbeb541be17aae30b7612b9fLaurent Pinchart obj_type, p->obj_id, p->name); 875d725227cec822b8cfbeb541be17aae30b7612b9fLaurent Pinchart return; 876d725227cec822b8cfbeb541be17aae30b7612b9fLaurent Pinchart } 877d725227cec822b8cfbeb541be17aae30b7612b9fLaurent Pinchart 878d725227cec822b8cfbeb541be17aae30b7612b9fLaurent Pinchart p->prop_id = props->props[i]; 879d725227cec822b8cfbeb541be17aae30b7612b9fLaurent Pinchart 880549fe0ba627a67b6ae1334eb5cf274a3dfb1fd69Laurent Pinchart ret = drmModeObjectSetProperty(dev->fd, p->obj_id, p->obj_type, 881549fe0ba627a67b6ae1334eb5cf274a3dfb1fd69Laurent Pinchart p->prop_id, p->value); 882d725227cec822b8cfbeb541be17aae30b7612b9fLaurent Pinchart if (ret < 0) 883d725227cec822b8cfbeb541be17aae30b7612b9fLaurent Pinchart fprintf(stderr, "failed to set %s %i property %s to %" PRIu64 ": %s\n", 884d725227cec822b8cfbeb541be17aae30b7612b9fLaurent Pinchart obj_type, p->obj_id, p->name, p->value, strerror(errno)); 885d725227cec822b8cfbeb541be17aae30b7612b9fLaurent Pinchart} 886d725227cec822b8cfbeb541be17aae30b7612b9fLaurent Pinchart 8873fdc1777ee156ebfa4281b49d8783adbbcae3ee1Laurent Pinchart/* -------------------------------------------------------------------------- */ 8883fdc1777ee156ebfa4281b49d8783adbbcae3ee1Laurent Pinchart 889ca9c8f06e0f560082dcd0943e9be29ba9a915ee3Laurent Pinchartstatic void 8903fdc1777ee156ebfa4281b49d8783adbbcae3ee1Laurent Pinchartpage_flip_handler(int fd, unsigned int frame, 8913fdc1777ee156ebfa4281b49d8783adbbcae3ee1Laurent Pinchart unsigned int sec, unsigned int usec, void *data) 8923fdc1777ee156ebfa4281b49d8783adbbcae3ee1Laurent Pinchart{ 893b1e0bdeb70b68754c6c4ab1c7d0161709960d49cLaurent Pinchart struct pipe_arg *pipe; 8943fdc1777ee156ebfa4281b49d8783adbbcae3ee1Laurent Pinchart unsigned int new_fb_id; 8953fdc1777ee156ebfa4281b49d8783adbbcae3ee1Laurent Pinchart struct timeval end; 8963fdc1777ee156ebfa4281b49d8783adbbcae3ee1Laurent Pinchart double t; 8973fdc1777ee156ebfa4281b49d8783adbbcae3ee1Laurent Pinchart 898b1e0bdeb70b68754c6c4ab1c7d0161709960d49cLaurent Pinchart pipe = data; 899b1e0bdeb70b68754c6c4ab1c7d0161709960d49cLaurent Pinchart if (pipe->current_fb_id == pipe->fb_id[0]) 900b1e0bdeb70b68754c6c4ab1c7d0161709960d49cLaurent Pinchart new_fb_id = pipe->fb_id[1]; 9013fdc1777ee156ebfa4281b49d8783adbbcae3ee1Laurent Pinchart else 902b1e0bdeb70b68754c6c4ab1c7d0161709960d49cLaurent Pinchart new_fb_id = pipe->fb_id[0]; 9033fdc1777ee156ebfa4281b49d8783adbbcae3ee1Laurent Pinchart 9042c5ee84d30cbd3fba61a8426b1e6bdd4f385de13Laurent Pinchart drmModePageFlip(fd, pipe->crtc->crtc->crtc_id, new_fb_id, 905b1e0bdeb70b68754c6c4ab1c7d0161709960d49cLaurent Pinchart DRM_MODE_PAGE_FLIP_EVENT, pipe); 906b1e0bdeb70b68754c6c4ab1c7d0161709960d49cLaurent Pinchart pipe->current_fb_id = new_fb_id; 907b1e0bdeb70b68754c6c4ab1c7d0161709960d49cLaurent Pinchart pipe->swap_count++; 908b1e0bdeb70b68754c6c4ab1c7d0161709960d49cLaurent Pinchart if (pipe->swap_count == 60) { 9093fdc1777ee156ebfa4281b49d8783adbbcae3ee1Laurent Pinchart gettimeofday(&end, NULL); 9103fdc1777ee156ebfa4281b49d8783adbbcae3ee1Laurent Pinchart t = end.tv_sec + end.tv_usec * 1e-6 - 911b1e0bdeb70b68754c6c4ab1c7d0161709960d49cLaurent Pinchart (pipe->start.tv_sec + pipe->start.tv_usec * 1e-6); 912b1e0bdeb70b68754c6c4ab1c7d0161709960d49cLaurent Pinchart fprintf(stderr, "freq: %.02fHz\n", pipe->swap_count / t); 913b1e0bdeb70b68754c6c4ab1c7d0161709960d49cLaurent Pinchart pipe->swap_count = 0; 914b1e0bdeb70b68754c6c4ab1c7d0161709960d49cLaurent Pinchart pipe->start = end; 9153fdc1777ee156ebfa4281b49d8783adbbcae3ee1Laurent Pinchart } 9163fdc1777ee156ebfa4281b49d8783adbbcae3ee1Laurent Pinchart} 9173fdc1777ee156ebfa4281b49d8783adbbcae3ee1Laurent Pinchart 918eabf199dffb0d42e959c50aa820b39228196e031Laurent Pinchartstatic int set_plane(struct device *dev, struct plane_arg *p) 919d55de747a2bdec5b4885a6c86ea6707e15dfefb5Rob Clark{ 920d55de747a2bdec5b4885a6c86ea6707e15dfefb5Rob Clark drmModePlane *ovr; 921d55de747a2bdec5b4885a6c86ea6707e15dfefb5Rob Clark uint32_t handles[4], pitches[4], offsets[4] = {0}; /* we only use [0] */ 922d55de747a2bdec5b4885a6c86ea6707e15dfefb5Rob Clark uint32_t plane_id = 0; 923d55de747a2bdec5b4885a6c86ea6707e15dfefb5Rob Clark struct kms_bo *plane_bo; 9240375222c714e8b7ba55f12d5cb389383be1cf54dLaurent Pinchart uint32_t plane_flags = 0; 925ca9c8f06e0f560082dcd0943e9be29ba9a915ee3Laurent Pinchart int crtc_x, crtc_y, crtc_w, crtc_h; 9263813e0f8e1ee4885823cdd0b50b05970257adddcLaurent Pinchart struct crtc *crtc = NULL; 927605efd7e05e94b8d9d742d3a8af1040776e2742dLaurent Pinchart unsigned int pipe; 9289b44fbd393b8db571badae41881f490145404ae0Paulo Zanoni unsigned int i; 929d55de747a2bdec5b4885a6c86ea6707e15dfefb5Rob Clark 930605efd7e05e94b8d9d742d3a8af1040776e2742dLaurent Pinchart /* Find an unused plane which can be connected to our CRTC. Find the 931605efd7e05e94b8d9d742d3a8af1040776e2742dLaurent Pinchart * CRTC index first, then iterate over available planes. 932605efd7e05e94b8d9d742d3a8af1040776e2742dLaurent Pinchart */ 933605efd7e05e94b8d9d742d3a8af1040776e2742dLaurent Pinchart for (i = 0; i < (unsigned int)dev->resources->res->count_crtcs; i++) { 934eabf199dffb0d42e959c50aa820b39228196e031Laurent Pinchart if (p->crtc_id == dev->resources->res->crtcs[i]) { 935eabf199dffb0d42e959c50aa820b39228196e031Laurent Pinchart crtc = &dev->resources->crtcs[i]; 936605efd7e05e94b8d9d742d3a8af1040776e2742dLaurent Pinchart pipe = i; 937605efd7e05e94b8d9d742d3a8af1040776e2742dLaurent Pinchart break; 938605efd7e05e94b8d9d742d3a8af1040776e2742dLaurent Pinchart } 939605efd7e05e94b8d9d742d3a8af1040776e2742dLaurent Pinchart } 940605efd7e05e94b8d9d742d3a8af1040776e2742dLaurent Pinchart 941eabf199dffb0d42e959c50aa820b39228196e031Laurent Pinchart if (!crtc) { 942eabf199dffb0d42e959c50aa820b39228196e031Laurent Pinchart fprintf(stderr, "CRTC %u not found\n", p->crtc_id); 943605efd7e05e94b8d9d742d3a8af1040776e2742dLaurent Pinchart return -1; 944605efd7e05e94b8d9d742d3a8af1040776e2742dLaurent Pinchart } 945605efd7e05e94b8d9d742d3a8af1040776e2742dLaurent Pinchart 946549fe0ba627a67b6ae1334eb5cf274a3dfb1fd69Laurent Pinchart for (i = 0; i < dev->resources->plane_res->count_planes && !plane_id; i++) { 947549fe0ba627a67b6ae1334eb5cf274a3dfb1fd69Laurent Pinchart ovr = dev->resources->planes[i].plane; 94802fa8f79b05456184028f014432647b19601a288Laurent Pinchart if (!ovr) 94902fa8f79b05456184028f014432647b19601a288Laurent Pinchart continue; 950d55de747a2bdec5b4885a6c86ea6707e15dfefb5Rob Clark 951605efd7e05e94b8d9d742d3a8af1040776e2742dLaurent Pinchart if ((ovr->possible_crtcs & (1 << pipe)) && !ovr->crtc_id) 952d55de747a2bdec5b4885a6c86ea6707e15dfefb5Rob Clark plane_id = ovr->plane_id; 953d55de747a2bdec5b4885a6c86ea6707e15dfefb5Rob Clark } 954d55de747a2bdec5b4885a6c86ea6707e15dfefb5Rob Clark 955d55de747a2bdec5b4885a6c86ea6707e15dfefb5Rob Clark if (!plane_id) { 956eabf199dffb0d42e959c50aa820b39228196e031Laurent Pinchart fprintf(stderr, "no unused plane available for CRTC %u\n", 957eabf199dffb0d42e959c50aa820b39228196e031Laurent Pinchart crtc->crtc->crtc_id); 958d55de747a2bdec5b4885a6c86ea6707e15dfefb5Rob Clark return -1; 959d55de747a2bdec5b4885a6c86ea6707e15dfefb5Rob Clark } 960d55de747a2bdec5b4885a6c86ea6707e15dfefb5Rob Clark 961581c7cf86a96a81e76288c8abca03c7f29eac3afLaurent Pinchart fprintf(stderr, "testing %dx%d@%s overlay plane %u\n", 962581c7cf86a96a81e76288c8abca03c7f29eac3afLaurent Pinchart p->w, p->h, p->format_str, plane_id); 963581c7cf86a96a81e76288c8abca03c7f29eac3afLaurent Pinchart 964549fe0ba627a67b6ae1334eb5cf274a3dfb1fd69Laurent Pinchart plane_bo = create_test_buffer(dev->kms, p->fourcc, p->w, p->h, handles, 965a94ee624292bff96ea1d38e8a0a3fbeefec42fb6Laurent Pinchart pitches, offsets, PATTERN_TILES); 9663fdc1777ee156ebfa4281b49d8783adbbcae3ee1Laurent Pinchart if (plane_bo == NULL) 9673fdc1777ee156ebfa4281b49d8783adbbcae3ee1Laurent Pinchart return -1; 968d55de747a2bdec5b4885a6c86ea6707e15dfefb5Rob Clark 969d55de747a2bdec5b4885a6c86ea6707e15dfefb5Rob Clark /* just use single plane format for now.. */ 970549fe0ba627a67b6ae1334eb5cf274a3dfb1fd69Laurent Pinchart if (drmModeAddFB2(dev->fd, p->w, p->h, p->fourcc, 971d55de747a2bdec5b4885a6c86ea6707e15dfefb5Rob Clark handles, pitches, offsets, &p->fb_id, plane_flags)) { 972d55de747a2bdec5b4885a6c86ea6707e15dfefb5Rob Clark fprintf(stderr, "failed to add fb: %s\n", strerror(errno)); 973d55de747a2bdec5b4885a6c86ea6707e15dfefb5Rob Clark return -1; 974d55de747a2bdec5b4885a6c86ea6707e15dfefb5Rob Clark } 975d55de747a2bdec5b4885a6c86ea6707e15dfefb5Rob Clark 9767badcca4925480ffdc4f3aa5efb88624ce451e70Laurent Pinchart if (!p->has_position) { 9777badcca4925480ffdc4f3aa5efb88624ce451e70Laurent Pinchart /* Default to the middle of the screen */ 978eabf199dffb0d42e959c50aa820b39228196e031Laurent Pinchart crtc_x = (crtc->mode->hdisplay - p->w) / 2; 979eabf199dffb0d42e959c50aa820b39228196e031Laurent Pinchart crtc_y = (crtc->mode->vdisplay - p->h) / 2; 9807badcca4925480ffdc4f3aa5efb88624ce451e70Laurent Pinchart } else { 9817badcca4925480ffdc4f3aa5efb88624ce451e70Laurent Pinchart crtc_x = p->x; 9827badcca4925480ffdc4f3aa5efb88624ce451e70Laurent Pinchart crtc_y = p->y; 9837badcca4925480ffdc4f3aa5efb88624ce451e70Laurent Pinchart } 9847badcca4925480ffdc4f3aa5efb88624ce451e70Laurent Pinchart crtc_w = p->w; 9857badcca4925480ffdc4f3aa5efb88624ce451e70Laurent Pinchart crtc_h = p->h; 986d55de747a2bdec5b4885a6c86ea6707e15dfefb5Rob Clark 987d55de747a2bdec5b4885a6c86ea6707e15dfefb5Rob Clark /* note src coords (last 4 args) are in Q16 format */ 988eabf199dffb0d42e959c50aa820b39228196e031Laurent Pinchart if (drmModeSetPlane(dev->fd, plane_id, crtc->crtc->crtc_id, p->fb_id, 989d55de747a2bdec5b4885a6c86ea6707e15dfefb5Rob Clark plane_flags, crtc_x, crtc_y, crtc_w, crtc_h, 990d55de747a2bdec5b4885a6c86ea6707e15dfefb5Rob Clark 0, 0, p->w << 16, p->h << 16)) { 991d55de747a2bdec5b4885a6c86ea6707e15dfefb5Rob Clark fprintf(stderr, "failed to enable plane: %s\n", 992d55de747a2bdec5b4885a6c86ea6707e15dfefb5Rob Clark strerror(errno)); 993d55de747a2bdec5b4885a6c86ea6707e15dfefb5Rob Clark return -1; 994d55de747a2bdec5b4885a6c86ea6707e15dfefb5Rob Clark } 995d55de747a2bdec5b4885a6c86ea6707e15dfefb5Rob Clark 996eabf199dffb0d42e959c50aa820b39228196e031Laurent Pinchart ovr->crtc_id = crtc->crtc->crtc_id; 99702fa8f79b05456184028f014432647b19601a288Laurent Pinchart 998d55de747a2bdec5b4885a6c86ea6707e15dfefb5Rob Clark return 0; 999d55de747a2bdec5b4885a6c86ea6707e15dfefb5Rob Clark} 1000d55de747a2bdec5b4885a6c86ea6707e15dfefb5Rob Clark 1001b1e0bdeb70b68754c6c4ab1c7d0161709960d49cLaurent Pinchartstatic void set_mode(struct device *dev, struct pipe_arg *pipes, unsigned int count) 10027a389aab86bde183de8806878b8cf055f662ee73Kristian Høgsberg{ 10033fdc1777ee156ebfa4281b49d8783adbbcae3ee1Laurent Pinchart uint32_t handles[4], pitches[4], offsets[4] = {0}; /* we only use [0] */ 10043813e0f8e1ee4885823cdd0b50b05970257adddcLaurent Pinchart unsigned int fb_id; 10053813e0f8e1ee4885823cdd0b50b05970257adddcLaurent Pinchart struct kms_bo *bo; 10063813e0f8e1ee4885823cdd0b50b05970257adddcLaurent Pinchart unsigned int i; 10072c5ee84d30cbd3fba61a8426b1e6bdd4f385de13Laurent Pinchart unsigned int j; 10083813e0f8e1ee4885823cdd0b50b05970257adddcLaurent Pinchart int ret, x; 10093813e0f8e1ee4885823cdd0b50b05970257adddcLaurent Pinchart 10103813e0f8e1ee4885823cdd0b50b05970257adddcLaurent Pinchart dev->mode.width = 0; 10113813e0f8e1ee4885823cdd0b50b05970257adddcLaurent Pinchart dev->mode.height = 0; 10127a389aab86bde183de8806878b8cf055f662ee73Kristian Høgsberg 10137a389aab86bde183de8806878b8cf055f662ee73Kristian Høgsberg for (i = 0; i < count; i++) { 1014b1e0bdeb70b68754c6c4ab1c7d0161709960d49cLaurent Pinchart struct pipe_arg *pipe = &pipes[i]; 1015b1e0bdeb70b68754c6c4ab1c7d0161709960d49cLaurent Pinchart 10162c5ee84d30cbd3fba61a8426b1e6bdd4f385de13Laurent Pinchart ret = pipe_find_crtc_and_mode(dev, pipe); 10172c5ee84d30cbd3fba61a8426b1e6bdd4f385de13Laurent Pinchart if (ret < 0) 10187a389aab86bde183de8806878b8cf055f662ee73Kristian Høgsberg continue; 10192c5ee84d30cbd3fba61a8426b1e6bdd4f385de13Laurent Pinchart 1020b1e0bdeb70b68754c6c4ab1c7d0161709960d49cLaurent Pinchart dev->mode.width += pipe->mode->hdisplay; 1021b1e0bdeb70b68754c6c4ab1c7d0161709960d49cLaurent Pinchart if (dev->mode.height < pipe->mode->vdisplay) 1022b1e0bdeb70b68754c6c4ab1c7d0161709960d49cLaurent Pinchart dev->mode.height = pipe->mode->vdisplay; 10237a389aab86bde183de8806878b8cf055f662ee73Kristian Høgsberg } 10247a389aab86bde183de8806878b8cf055f662ee73Kristian Høgsberg 1025b1e0bdeb70b68754c6c4ab1c7d0161709960d49cLaurent Pinchart bo = create_test_buffer(dev->kms, pipes[0].fourcc, 10263813e0f8e1ee4885823cdd0b50b05970257adddcLaurent Pinchart dev->mode.width, dev->mode.height, 10273813e0f8e1ee4885823cdd0b50b05970257adddcLaurent Pinchart handles, pitches, offsets, PATTERN_SMPTE); 10283fdc1777ee156ebfa4281b49d8783adbbcae3ee1Laurent Pinchart if (bo == NULL) 10297a389aab86bde183de8806878b8cf055f662ee73Kristian Høgsberg return; 1030731cd5526e5c732d51307b26e784f454a724a699Jesse Barnes 1031b1e0bdeb70b68754c6c4ab1c7d0161709960d49cLaurent Pinchart ret = drmModeAddFB2(dev->fd, dev->mode.width, dev->mode.height, 1032b1e0bdeb70b68754c6c4ab1c7d0161709960d49cLaurent Pinchart pipes[0].fourcc, handles, pitches, offsets, &fb_id, 0); 1033731cd5526e5c732d51307b26e784f454a724a699Jesse Barnes if (ret) { 1034680b9c4fa3dfb329bd74ec08c17cfc876ea2fc5bJakob Bornecrantz fprintf(stderr, "failed to add fb (%ux%u): %s\n", 10353813e0f8e1ee4885823cdd0b50b05970257adddcLaurent Pinchart dev->mode.width, dev->mode.height, strerror(errno)); 1036731cd5526e5c732d51307b26e784f454a724a699Jesse Barnes return; 1037731cd5526e5c732d51307b26e784f454a724a699Jesse Barnes } 1038731cd5526e5c732d51307b26e784f454a724a699Jesse Barnes 1039669fde3472ae71c55cc7526e3b3bd6fe00d6a5a5Kristian Høgsberg x = 0; 1040669fde3472ae71c55cc7526e3b3bd6fe00d6a5a5Kristian Høgsberg for (i = 0; i < count; i++) { 1041b1e0bdeb70b68754c6c4ab1c7d0161709960d49cLaurent Pinchart struct pipe_arg *pipe = &pipes[i]; 1042b1e0bdeb70b68754c6c4ab1c7d0161709960d49cLaurent Pinchart 1043b1e0bdeb70b68754c6c4ab1c7d0161709960d49cLaurent Pinchart if (pipe->mode == NULL) 1044669fde3472ae71c55cc7526e3b3bd6fe00d6a5a5Kristian Høgsberg continue; 10458b8803695b24d4cb4d041437a4709be06e59471bKristian Høgsberg 10462c5ee84d30cbd3fba61a8426b1e6bdd4f385de13Laurent Pinchart printf("setting mode %s@%s on connectors ", 10472c5ee84d30cbd3fba61a8426b1e6bdd4f385de13Laurent Pinchart pipe->mode_str, pipe->format_str); 10482c5ee84d30cbd3fba61a8426b1e6bdd4f385de13Laurent Pinchart for (j = 0; j < pipe->num_cons; ++j) 10492c5ee84d30cbd3fba61a8426b1e6bdd4f385de13Laurent Pinchart printf("%u, ", pipe->con_ids[j]); 10502c5ee84d30cbd3fba61a8426b1e6bdd4f385de13Laurent Pinchart printf("crtc %d\n", pipe->crtc->crtc->crtc_id); 10518b8803695b24d4cb4d041437a4709be06e59471bKristian Høgsberg 10522c5ee84d30cbd3fba61a8426b1e6bdd4f385de13Laurent Pinchart ret = drmModeSetCrtc(dev->fd, pipe->crtc->crtc->crtc_id, fb_id, 10532c5ee84d30cbd3fba61a8426b1e6bdd4f385de13Laurent Pinchart x, 0, pipe->con_ids, pipe->num_cons, 10542c5ee84d30cbd3fba61a8426b1e6bdd4f385de13Laurent Pinchart pipe->mode); 1055d23146f3f0ad14c8ad482a4832cae859c8d646f2Jakob Bornecrantz 1056d23146f3f0ad14c8ad482a4832cae859c8d646f2Jakob Bornecrantz /* XXX: Actually check if this is needed */ 1057549fe0ba627a67b6ae1334eb5cf274a3dfb1fd69Laurent Pinchart drmModeDirtyFB(dev->fd, fb_id, NULL, 0); 1058d23146f3f0ad14c8ad482a4832cae859c8d646f2Jakob Bornecrantz 1059b1e0bdeb70b68754c6c4ab1c7d0161709960d49cLaurent Pinchart x += pipe->mode->hdisplay; 1060669fde3472ae71c55cc7526e3b3bd6fe00d6a5a5Kristian Høgsberg 1061669fde3472ae71c55cc7526e3b3bd6fe00d6a5a5Kristian Høgsberg if (ret) { 1062669fde3472ae71c55cc7526e3b3bd6fe00d6a5a5Kristian Høgsberg fprintf(stderr, "failed to set mode: %s\n", strerror(errno)); 1063669fde3472ae71c55cc7526e3b3bd6fe00d6a5a5Kristian Høgsberg return; 1064669fde3472ae71c55cc7526e3b3bd6fe00d6a5a5Kristian Høgsberg } 1065731cd5526e5c732d51307b26e784f454a724a699Jesse Barnes } 10661e1b3c0a93281ce8df42bbdddfe3e51dccc4d5eaKristian Høgsberg 10673813e0f8e1ee4885823cdd0b50b05970257adddcLaurent Pinchart dev->mode.bo = bo; 10683813e0f8e1ee4885823cdd0b50b05970257adddcLaurent Pinchart dev->mode.fb_id = fb_id; 10693813e0f8e1ee4885823cdd0b50b05970257adddcLaurent Pinchart} 10703813e0f8e1ee4885823cdd0b50b05970257adddcLaurent Pinchart 10713813e0f8e1ee4885823cdd0b50b05970257adddcLaurent Pinchartstatic void set_planes(struct device *dev, struct plane_arg *p, unsigned int count) 10723813e0f8e1ee4885823cdd0b50b05970257adddcLaurent Pinchart{ 10733813e0f8e1ee4885823cdd0b50b05970257adddcLaurent Pinchart unsigned int i; 10743813e0f8e1ee4885823cdd0b50b05970257adddcLaurent Pinchart 10753813e0f8e1ee4885823cdd0b50b05970257adddcLaurent Pinchart /* set up planes/overlays */ 10763813e0f8e1ee4885823cdd0b50b05970257adddcLaurent Pinchart for (i = 0; i < count; i++) 10773813e0f8e1ee4885823cdd0b50b05970257adddcLaurent Pinchart if (set_plane(dev, &p[i])) 10783813e0f8e1ee4885823cdd0b50b05970257adddcLaurent Pinchart return; 10793813e0f8e1ee4885823cdd0b50b05970257adddcLaurent Pinchart} 10803813e0f8e1ee4885823cdd0b50b05970257adddcLaurent Pinchart 1081b1e0bdeb70b68754c6c4ab1c7d0161709960d49cLaurent Pinchartstatic void test_page_flip(struct device *dev, struct pipe_arg *pipes, unsigned int count) 10823813e0f8e1ee4885823cdd0b50b05970257adddcLaurent Pinchart{ 10833813e0f8e1ee4885823cdd0b50b05970257adddcLaurent Pinchart uint32_t handles[4], pitches[4], offsets[4] = {0}; /* we only use [0] */ 10843813e0f8e1ee4885823cdd0b50b05970257adddcLaurent Pinchart unsigned int other_fb_id; 10853813e0f8e1ee4885823cdd0b50b05970257adddcLaurent Pinchart struct kms_bo *other_bo; 10863813e0f8e1ee4885823cdd0b50b05970257adddcLaurent Pinchart drmEventContext evctx; 10873813e0f8e1ee4885823cdd0b50b05970257adddcLaurent Pinchart unsigned int i; 10883813e0f8e1ee4885823cdd0b50b05970257adddcLaurent Pinchart int ret; 1089549fe0ba627a67b6ae1334eb5cf274a3dfb1fd69Laurent Pinchart 1090b1e0bdeb70b68754c6c4ab1c7d0161709960d49cLaurent Pinchart other_bo = create_test_buffer(dev->kms, pipes[0].fourcc, 10913813e0f8e1ee4885823cdd0b50b05970257adddcLaurent Pinchart dev->mode.width, dev->mode.height, 10923813e0f8e1ee4885823cdd0b50b05970257adddcLaurent Pinchart handles, pitches, offsets, PATTERN_PLAIN); 10933fdc1777ee156ebfa4281b49d8783adbbcae3ee1Laurent Pinchart if (other_bo == NULL) 10941e1b3c0a93281ce8df42bbdddfe3e51dccc4d5eaKristian Høgsberg return; 10951e1b3c0a93281ce8df42bbdddfe3e51dccc4d5eaKristian Høgsberg 1096b1e0bdeb70b68754c6c4ab1c7d0161709960d49cLaurent Pinchart ret = drmModeAddFB2(dev->fd, dev->mode.width, dev->mode.height, 1097b1e0bdeb70b68754c6c4ab1c7d0161709960d49cLaurent Pinchart pipes[0].fourcc, handles, pitches, offsets, 1098b1e0bdeb70b68754c6c4ab1c7d0161709960d49cLaurent Pinchart &other_fb_id, 0); 10991e1b3c0a93281ce8df42bbdddfe3e51dccc4d5eaKristian Høgsberg if (ret) { 11001e1b3c0a93281ce8df42bbdddfe3e51dccc4d5eaKristian Høgsberg fprintf(stderr, "failed to add fb: %s\n", strerror(errno)); 11011e1b3c0a93281ce8df42bbdddfe3e51dccc4d5eaKristian Høgsberg return; 11021e1b3c0a93281ce8df42bbdddfe3e51dccc4d5eaKristian Høgsberg } 11031e1b3c0a93281ce8df42bbdddfe3e51dccc4d5eaKristian Høgsberg 11041e1b3c0a93281ce8df42bbdddfe3e51dccc4d5eaKristian Høgsberg for (i = 0; i < count; i++) { 1105b1e0bdeb70b68754c6c4ab1c7d0161709960d49cLaurent Pinchart struct pipe_arg *pipe = &pipes[i]; 1106b1e0bdeb70b68754c6c4ab1c7d0161709960d49cLaurent Pinchart 1107b1e0bdeb70b68754c6c4ab1c7d0161709960d49cLaurent Pinchart if (pipe->mode == NULL) 11081e1b3c0a93281ce8df42bbdddfe3e51dccc4d5eaKristian Høgsberg continue; 11091e1b3c0a93281ce8df42bbdddfe3e51dccc4d5eaKristian Høgsberg 11102c5ee84d30cbd3fba61a8426b1e6bdd4f385de13Laurent Pinchart ret = drmModePageFlip(dev->fd, pipe->crtc->crtc->crtc_id, 11112c5ee84d30cbd3fba61a8426b1e6bdd4f385de13Laurent Pinchart other_fb_id, DRM_MODE_PAGE_FLIP_EVENT, 11122c5ee84d30cbd3fba61a8426b1e6bdd4f385de13Laurent Pinchart pipe); 11133c8adda6e1e6b0471b3d70a63d795622bbeb1580Jakob Bornecrantz if (ret) { 11143c8adda6e1e6b0471b3d70a63d795622bbeb1580Jakob Bornecrantz fprintf(stderr, "failed to page flip: %s\n", strerror(errno)); 11153c8adda6e1e6b0471b3d70a63d795622bbeb1580Jakob Bornecrantz return; 11163c8adda6e1e6b0471b3d70a63d795622bbeb1580Jakob Bornecrantz } 1117b1e0bdeb70b68754c6c4ab1c7d0161709960d49cLaurent Pinchart gettimeofday(&pipe->start, NULL); 1118b1e0bdeb70b68754c6c4ab1c7d0161709960d49cLaurent Pinchart pipe->swap_count = 0; 1119b1e0bdeb70b68754c6c4ab1c7d0161709960d49cLaurent Pinchart pipe->fb_id[0] = dev->mode.fb_id; 1120b1e0bdeb70b68754c6c4ab1c7d0161709960d49cLaurent Pinchart pipe->fb_id[1] = other_fb_id; 1121b1e0bdeb70b68754c6c4ab1c7d0161709960d49cLaurent Pinchart pipe->current_fb_id = other_fb_id; 11221e1b3c0a93281ce8df42bbdddfe3e51dccc4d5eaKristian Høgsberg } 11231e1b3c0a93281ce8df42bbdddfe3e51dccc4d5eaKristian Høgsberg 11241e1b3c0a93281ce8df42bbdddfe3e51dccc4d5eaKristian Høgsberg memset(&evctx, 0, sizeof evctx); 11251e1b3c0a93281ce8df42bbdddfe3e51dccc4d5eaKristian Høgsberg evctx.version = DRM_EVENT_CONTEXT_VERSION; 11261e1b3c0a93281ce8df42bbdddfe3e51dccc4d5eaKristian Høgsberg evctx.vblank_handler = NULL; 11276f1eba0548cd6a96e91a4e8be7b91ba6a936eb98Jesse Barnes evctx.page_flip_handler = page_flip_handler; 11281e1b3c0a93281ce8df42bbdddfe3e51dccc4d5eaKristian Høgsberg 11291e1b3c0a93281ce8df42bbdddfe3e51dccc4d5eaKristian Høgsberg while (1) { 1130e6b3f906cef26e1efb8625f5dd4e460b4c79a771Jesse Barnes#if 0 11311e1b3c0a93281ce8df42bbdddfe3e51dccc4d5eaKristian Høgsberg struct pollfd pfd[2]; 11321e1b3c0a93281ce8df42bbdddfe3e51dccc4d5eaKristian Høgsberg 11331e1b3c0a93281ce8df42bbdddfe3e51dccc4d5eaKristian Høgsberg pfd[0].fd = 0; 11341e1b3c0a93281ce8df42bbdddfe3e51dccc4d5eaKristian Høgsberg pfd[0].events = POLLIN; 11351e1b3c0a93281ce8df42bbdddfe3e51dccc4d5eaKristian Høgsberg pfd[1].fd = fd; 11361e1b3c0a93281ce8df42bbdddfe3e51dccc4d5eaKristian Høgsberg pfd[1].events = POLLIN; 11371e1b3c0a93281ce8df42bbdddfe3e51dccc4d5eaKristian Høgsberg 11381e1b3c0a93281ce8df42bbdddfe3e51dccc4d5eaKristian Høgsberg if (poll(pfd, 2, -1) < 0) { 11391e1b3c0a93281ce8df42bbdddfe3e51dccc4d5eaKristian Høgsberg fprintf(stderr, "poll error\n"); 11401e1b3c0a93281ce8df42bbdddfe3e51dccc4d5eaKristian Høgsberg break; 11411e1b3c0a93281ce8df42bbdddfe3e51dccc4d5eaKristian Høgsberg } 11421e1b3c0a93281ce8df42bbdddfe3e51dccc4d5eaKristian Høgsberg 11431e1b3c0a93281ce8df42bbdddfe3e51dccc4d5eaKristian Høgsberg if (pfd[0].revents) 11441e1b3c0a93281ce8df42bbdddfe3e51dccc4d5eaKristian Høgsberg break; 1145e6b3f906cef26e1efb8625f5dd4e460b4c79a771Jesse Barnes#else 1146e6b3f906cef26e1efb8625f5dd4e460b4c79a771Jesse Barnes struct timeval timeout = { .tv_sec = 3, .tv_usec = 0 }; 1147e6b3f906cef26e1efb8625f5dd4e460b4c79a771Jesse Barnes fd_set fds; 1148e6b3f906cef26e1efb8625f5dd4e460b4c79a771Jesse Barnes int ret; 1149e6b3f906cef26e1efb8625f5dd4e460b4c79a771Jesse Barnes 1150e6b3f906cef26e1efb8625f5dd4e460b4c79a771Jesse Barnes FD_ZERO(&fds); 1151e6b3f906cef26e1efb8625f5dd4e460b4c79a771Jesse Barnes FD_SET(0, &fds); 1152549fe0ba627a67b6ae1334eb5cf274a3dfb1fd69Laurent Pinchart FD_SET(dev->fd, &fds); 1153549fe0ba627a67b6ae1334eb5cf274a3dfb1fd69Laurent Pinchart ret = select(dev->fd + 1, &fds, NULL, NULL, &timeout); 1154e6b3f906cef26e1efb8625f5dd4e460b4c79a771Jesse Barnes 1155e6b3f906cef26e1efb8625f5dd4e460b4c79a771Jesse Barnes if (ret <= 0) { 1156e6b3f906cef26e1efb8625f5dd4e460b4c79a771Jesse Barnes fprintf(stderr, "select timed out or error (ret %d)\n", 1157e6b3f906cef26e1efb8625f5dd4e460b4c79a771Jesse Barnes ret); 1158e6b3f906cef26e1efb8625f5dd4e460b4c79a771Jesse Barnes continue; 1159e6b3f906cef26e1efb8625f5dd4e460b4c79a771Jesse Barnes } else if (FD_ISSET(0, &fds)) { 1160e6b3f906cef26e1efb8625f5dd4e460b4c79a771Jesse Barnes break; 1161e6b3f906cef26e1efb8625f5dd4e460b4c79a771Jesse Barnes } 1162e6b3f906cef26e1efb8625f5dd4e460b4c79a771Jesse Barnes#endif 11631e1b3c0a93281ce8df42bbdddfe3e51dccc4d5eaKristian Høgsberg 1164549fe0ba627a67b6ae1334eb5cf274a3dfb1fd69Laurent Pinchart drmHandleEvent(dev->fd, &evctx); 11651e1b3c0a93281ce8df42bbdddfe3e51dccc4d5eaKristian Høgsberg } 11668fef29093fae2a08f8c1cb4946687bf4bb62a1caBenjamin Franzke 11678fef29093fae2a08f8c1cb4946687bf4bb62a1caBenjamin Franzke kms_bo_destroy(&other_bo); 1168731cd5526e5c732d51307b26e784f454a724a699Jesse Barnes} 1169731cd5526e5c732d51307b26e784f454a724a699Jesse Barnes 1170cc90ffa9b18fc6f925a3a2c36131332b8af558f8Laurent Pinchart#define min(a, b) ((a) < (b) ? (a) : (b)) 1171cc90ffa9b18fc6f925a3a2c36131332b8af558f8Laurent Pinchart 1172b1e0bdeb70b68754c6c4ab1c7d0161709960d49cLaurent Pinchartstatic int parse_connector(struct pipe_arg *pipe, const char *arg) 11730375222c714e8b7ba55f12d5cb389383be1cf54dLaurent Pinchart{ 1174cc90ffa9b18fc6f925a3a2c36131332b8af558f8Laurent Pinchart unsigned int len; 11752c5ee84d30cbd3fba61a8426b1e6bdd4f385de13Laurent Pinchart unsigned int i; 1176cc90ffa9b18fc6f925a3a2c36131332b8af558f8Laurent Pinchart const char *p; 1177cc90ffa9b18fc6f925a3a2c36131332b8af558f8Laurent Pinchart char *endp; 1178cc90ffa9b18fc6f925a3a2c36131332b8af558f8Laurent Pinchart 1179b1e0bdeb70b68754c6c4ab1c7d0161709960d49cLaurent Pinchart pipe->crtc_id = (uint32_t)-1; 1180b1e0bdeb70b68754c6c4ab1c7d0161709960d49cLaurent Pinchart strcpy(pipe->format_str, "XR24"); 1181cc90ffa9b18fc6f925a3a2c36131332b8af558f8Laurent Pinchart 11822c5ee84d30cbd3fba61a8426b1e6bdd4f385de13Laurent Pinchart /* Count the number of connectors and allocate them. */ 11832c5ee84d30cbd3fba61a8426b1e6bdd4f385de13Laurent Pinchart pipe->num_cons = 1; 11842c5ee84d30cbd3fba61a8426b1e6bdd4f385de13Laurent Pinchart for (p = arg; isdigit(*p) || *p == ','; ++p) { 11852c5ee84d30cbd3fba61a8426b1e6bdd4f385de13Laurent Pinchart if (*p == ',') 11862c5ee84d30cbd3fba61a8426b1e6bdd4f385de13Laurent Pinchart pipe->num_cons++; 11872c5ee84d30cbd3fba61a8426b1e6bdd4f385de13Laurent Pinchart } 11882c5ee84d30cbd3fba61a8426b1e6bdd4f385de13Laurent Pinchart 11892c5ee84d30cbd3fba61a8426b1e6bdd4f385de13Laurent Pinchart pipe->con_ids = malloc(pipe->num_cons * sizeof *pipe->con_ids); 11902c5ee84d30cbd3fba61a8426b1e6bdd4f385de13Laurent Pinchart if (pipe->con_ids == NULL) 11912c5ee84d30cbd3fba61a8426b1e6bdd4f385de13Laurent Pinchart return -1; 11922c5ee84d30cbd3fba61a8426b1e6bdd4f385de13Laurent Pinchart 11932c5ee84d30cbd3fba61a8426b1e6bdd4f385de13Laurent Pinchart /* Parse the connectors. */ 11942c5ee84d30cbd3fba61a8426b1e6bdd4f385de13Laurent Pinchart for (i = 0, p = arg; i < pipe->num_cons; ++i, p = endp + 1) { 11952c5ee84d30cbd3fba61a8426b1e6bdd4f385de13Laurent Pinchart pipe->con_ids[i] = strtoul(p, &endp, 10); 11962c5ee84d30cbd3fba61a8426b1e6bdd4f385de13Laurent Pinchart if (*endp != ',') 11972c5ee84d30cbd3fba61a8426b1e6bdd4f385de13Laurent Pinchart break; 11982c5ee84d30cbd3fba61a8426b1e6bdd4f385de13Laurent Pinchart } 11992c5ee84d30cbd3fba61a8426b1e6bdd4f385de13Laurent Pinchart 12002c5ee84d30cbd3fba61a8426b1e6bdd4f385de13Laurent Pinchart if (i != pipe->num_cons - 1) 12012c5ee84d30cbd3fba61a8426b1e6bdd4f385de13Laurent Pinchart return -1; 12022c5ee84d30cbd3fba61a8426b1e6bdd4f385de13Laurent Pinchart 12032c5ee84d30cbd3fba61a8426b1e6bdd4f385de13Laurent Pinchart /* Parse the remaining parameters. */ 1204cc90ffa9b18fc6f925a3a2c36131332b8af558f8Laurent Pinchart if (*endp == '@') { 1205cc90ffa9b18fc6f925a3a2c36131332b8af558f8Laurent Pinchart arg = endp + 1; 1206b1e0bdeb70b68754c6c4ab1c7d0161709960d49cLaurent Pinchart pipe->crtc_id = strtoul(arg, &endp, 10); 1207cc90ffa9b18fc6f925a3a2c36131332b8af558f8Laurent Pinchart } 1208cc90ffa9b18fc6f925a3a2c36131332b8af558f8Laurent Pinchart if (*endp != ':') 1209cc90ffa9b18fc6f925a3a2c36131332b8af558f8Laurent Pinchart return -1; 12100375222c714e8b7ba55f12d5cb389383be1cf54dLaurent Pinchart 1211cc90ffa9b18fc6f925a3a2c36131332b8af558f8Laurent Pinchart arg = endp + 1; 12120375222c714e8b7ba55f12d5cb389383be1cf54dLaurent Pinchart 1213cc90ffa9b18fc6f925a3a2c36131332b8af558f8Laurent Pinchart p = strchrnul(arg, '@'); 1214b1e0bdeb70b68754c6c4ab1c7d0161709960d49cLaurent Pinchart len = min(sizeof pipe->mode_str - 1, (unsigned int)(p - arg)); 1215b1e0bdeb70b68754c6c4ab1c7d0161709960d49cLaurent Pinchart strncpy(pipe->mode_str, arg, len); 1216b1e0bdeb70b68754c6c4ab1c7d0161709960d49cLaurent Pinchart pipe->mode_str[len] = '\0'; 12170375222c714e8b7ba55f12d5cb389383be1cf54dLaurent Pinchart 1218cc90ffa9b18fc6f925a3a2c36131332b8af558f8Laurent Pinchart if (*p == '@') { 1219b1e0bdeb70b68754c6c4ab1c7d0161709960d49cLaurent Pinchart strncpy(pipe->format_str, p + 1, 4); 1220b1e0bdeb70b68754c6c4ab1c7d0161709960d49cLaurent Pinchart pipe->format_str[4] = '\0'; 1221ebd7904877d08525beb5039e4ea2f5b6c0a7c23fRob Clark } 1222cc90ffa9b18fc6f925a3a2c36131332b8af558f8Laurent Pinchart 1223b1e0bdeb70b68754c6c4ab1c7d0161709960d49cLaurent Pinchart pipe->fourcc = format_fourcc(pipe->format_str); 1224b1e0bdeb70b68754c6c4ab1c7d0161709960d49cLaurent Pinchart if (pipe->fourcc == 0) { 1225b1e0bdeb70b68754c6c4ab1c7d0161709960d49cLaurent Pinchart fprintf(stderr, "unknown format %s\n", pipe->format_str); 1226ebd7904877d08525beb5039e4ea2f5b6c0a7c23fRob Clark return -1; 1227cc90ffa9b18fc6f925a3a2c36131332b8af558f8Laurent Pinchart } 1228cc90ffa9b18fc6f925a3a2c36131332b8af558f8Laurent Pinchart 1229cc90ffa9b18fc6f925a3a2c36131332b8af558f8Laurent Pinchart return 0; 12300375222c714e8b7ba55f12d5cb389383be1cf54dLaurent Pinchart} 12310375222c714e8b7ba55f12d5cb389383be1cf54dLaurent Pinchart 12327badcca4925480ffdc4f3aa5efb88624ce451e70Laurent Pinchartstatic int parse_plane(struct plane_arg *plane, const char *p) 12330375222c714e8b7ba55f12d5cb389383be1cf54dLaurent Pinchart{ 12347badcca4925480ffdc4f3aa5efb88624ce451e70Laurent Pinchart char *end; 12350375222c714e8b7ba55f12d5cb389383be1cf54dLaurent Pinchart 12367badcca4925480ffdc4f3aa5efb88624ce451e70Laurent Pinchart memset(plane, 0, sizeof *plane); 12370375222c714e8b7ba55f12d5cb389383be1cf54dLaurent Pinchart 1238eabf199dffb0d42e959c50aa820b39228196e031Laurent Pinchart plane->crtc_id = strtoul(p, &end, 10); 12397badcca4925480ffdc4f3aa5efb88624ce451e70Laurent Pinchart if (*end != ':') 12407badcca4925480ffdc4f3aa5efb88624ce451e70Laurent Pinchart return -EINVAL; 12417badcca4925480ffdc4f3aa5efb88624ce451e70Laurent Pinchart 12427badcca4925480ffdc4f3aa5efb88624ce451e70Laurent Pinchart p = end + 1; 12437badcca4925480ffdc4f3aa5efb88624ce451e70Laurent Pinchart plane->w = strtoul(p, &end, 10); 12447badcca4925480ffdc4f3aa5efb88624ce451e70Laurent Pinchart if (*end != 'x') 12457badcca4925480ffdc4f3aa5efb88624ce451e70Laurent Pinchart return -EINVAL; 12467badcca4925480ffdc4f3aa5efb88624ce451e70Laurent Pinchart 12477badcca4925480ffdc4f3aa5efb88624ce451e70Laurent Pinchart p = end + 1; 12487badcca4925480ffdc4f3aa5efb88624ce451e70Laurent Pinchart plane->h = strtoul(p, &end, 10); 12497badcca4925480ffdc4f3aa5efb88624ce451e70Laurent Pinchart 12507badcca4925480ffdc4f3aa5efb88624ce451e70Laurent Pinchart if (*end == '+' || *end == '-') { 12517badcca4925480ffdc4f3aa5efb88624ce451e70Laurent Pinchart plane->x = strtol(end, &end, 10); 12527badcca4925480ffdc4f3aa5efb88624ce451e70Laurent Pinchart if (*end != '+' && *end != '-') 12537badcca4925480ffdc4f3aa5efb88624ce451e70Laurent Pinchart return -EINVAL; 12547badcca4925480ffdc4f3aa5efb88624ce451e70Laurent Pinchart plane->y = strtol(end, &end, 10); 12557badcca4925480ffdc4f3aa5efb88624ce451e70Laurent Pinchart 12567badcca4925480ffdc4f3aa5efb88624ce451e70Laurent Pinchart plane->has_position = true; 12577badcca4925480ffdc4f3aa5efb88624ce451e70Laurent Pinchart } 12587badcca4925480ffdc4f3aa5efb88624ce451e70Laurent Pinchart 12597badcca4925480ffdc4f3aa5efb88624ce451e70Laurent Pinchart if (*end == '@') { 12607badcca4925480ffdc4f3aa5efb88624ce451e70Laurent Pinchart p = end + 1; 12617badcca4925480ffdc4f3aa5efb88624ce451e70Laurent Pinchart if (strlen(p) != 4) 12627badcca4925480ffdc4f3aa5efb88624ce451e70Laurent Pinchart return -EINVAL; 12637badcca4925480ffdc4f3aa5efb88624ce451e70Laurent Pinchart 12647badcca4925480ffdc4f3aa5efb88624ce451e70Laurent Pinchart strcpy(plane->format_str, p); 12657badcca4925480ffdc4f3aa5efb88624ce451e70Laurent Pinchart } else { 12667badcca4925480ffdc4f3aa5efb88624ce451e70Laurent Pinchart strcpy(plane->format_str, "XR24"); 12677badcca4925480ffdc4f3aa5efb88624ce451e70Laurent Pinchart } 12687badcca4925480ffdc4f3aa5efb88624ce451e70Laurent Pinchart 12697badcca4925480ffdc4f3aa5efb88624ce451e70Laurent Pinchart plane->fourcc = format_fourcc(plane->format_str); 12707badcca4925480ffdc4f3aa5efb88624ce451e70Laurent Pinchart if (plane->fourcc == 0) { 12717badcca4925480ffdc4f3aa5efb88624ce451e70Laurent Pinchart fprintf(stderr, "unknown format %s\n", plane->format_str); 12727badcca4925480ffdc4f3aa5efb88624ce451e70Laurent Pinchart return -EINVAL; 12730375222c714e8b7ba55f12d5cb389383be1cf54dLaurent Pinchart } 12740375222c714e8b7ba55f12d5cb389383be1cf54dLaurent Pinchart 12750375222c714e8b7ba55f12d5cb389383be1cf54dLaurent Pinchart return 0; 12760375222c714e8b7ba55f12d5cb389383be1cf54dLaurent Pinchart} 12770375222c714e8b7ba55f12d5cb389383be1cf54dLaurent Pinchart 1278d725227cec822b8cfbeb541be17aae30b7612b9fLaurent Pinchartstatic int parse_property(struct property_arg *p, const char *arg) 1279d725227cec822b8cfbeb541be17aae30b7612b9fLaurent Pinchart{ 1280d725227cec822b8cfbeb541be17aae30b7612b9fLaurent Pinchart if (sscanf(arg, "%d:%32[^:]:%" SCNu64, &p->obj_id, p->name, &p->value) != 3) 1281d725227cec822b8cfbeb541be17aae30b7612b9fLaurent Pinchart return -1; 1282d725227cec822b8cfbeb541be17aae30b7612b9fLaurent Pinchart 1283d725227cec822b8cfbeb541be17aae30b7612b9fLaurent Pinchart p->obj_type = 0; 1284d725227cec822b8cfbeb541be17aae30b7612b9fLaurent Pinchart p->name[DRM_PROP_NAME_LEN] = '\0'; 1285d725227cec822b8cfbeb541be17aae30b7612b9fLaurent Pinchart 1286d725227cec822b8cfbeb541be17aae30b7612b9fLaurent Pinchart return 0; 1287d725227cec822b8cfbeb541be17aae30b7612b9fLaurent Pinchart} 1288d725227cec822b8cfbeb541be17aae30b7612b9fLaurent Pinchart 1289ca9c8f06e0f560082dcd0943e9be29ba9a915ee3Laurent Pinchartstatic void usage(char *name) 1290731cd5526e5c732d51307b26e784f454a724a699Jesse Barnes{ 1291d725227cec822b8cfbeb541be17aae30b7612b9fLaurent Pinchart fprintf(stderr, "usage: %s [-cdefMmPpsvw]\n", name); 1292ef07acf5b79f86ef86efe6e72c1de5726c97e41dLaurent Pinchart 1293ef07acf5b79f86ef86efe6e72c1de5726c97e41dLaurent Pinchart fprintf(stderr, "\n Query options:\n\n"); 1294731cd5526e5c732d51307b26e784f454a724a699Jesse Barnes fprintf(stderr, "\t-c\tlist connectors\n"); 1295ef07acf5b79f86ef86efe6e72c1de5726c97e41dLaurent Pinchart fprintf(stderr, "\t-e\tlist encoders\n"); 1296731cd5526e5c732d51307b26e784f454a724a699Jesse Barnes fprintf(stderr, "\t-f\tlist framebuffers\n"); 1297ef07acf5b79f86ef86efe6e72c1de5726c97e41dLaurent Pinchart fprintf(stderr, "\t-p\tlist CRTCs and planes (pipes)\n"); 1298ef07acf5b79f86ef86efe6e72c1de5726c97e41dLaurent Pinchart 1299ef07acf5b79f86ef86efe6e72c1de5726c97e41dLaurent Pinchart fprintf(stderr, "\n Test options:\n\n"); 1300eabf199dffb0d42e959c50aa820b39228196e031Laurent Pinchart fprintf(stderr, "\t-P <crtc_id>:<w>x<h>[+<x>+<y>][@<format>]\tset a plane\n"); 13012c5ee84d30cbd3fba61a8426b1e6bdd4f385de13Laurent Pinchart fprintf(stderr, "\t-s <connector_id>[,<connector_id>][@<crtc_id>]:<mode>[@<format>]\tset a mode\n"); 1302ef07acf5b79f86ef86efe6e72c1de5726c97e41dLaurent Pinchart fprintf(stderr, "\t-v\ttest vsynced page flipping\n"); 1303d725227cec822b8cfbeb541be17aae30b7612b9fLaurent Pinchart fprintf(stderr, "\t-w <obj_id>:<prop_name>:<value>\tset property\n"); 1304ef07acf5b79f86ef86efe6e72c1de5726c97e41dLaurent Pinchart 130545901fdae66441ffec681e3dbd46b5530107a045Laurent Pinchart fprintf(stderr, "\n Generic options:\n\n"); 1306ab52756a3632fdc38a915a9bbda0b2089b09e38eLaurent Pinchart fprintf(stderr, "\t-d\tdrop master after mode set\n"); 130745901fdae66441ffec681e3dbd46b5530107a045Laurent Pinchart fprintf(stderr, "\t-M module\tuse the given driver\n"); 130845901fdae66441ffec681e3dbd46b5530107a045Laurent Pinchart 1309731cd5526e5c732d51307b26e784f454a724a699Jesse Barnes fprintf(stderr, "\n\tDefault is to dump all info.\n"); 1310731cd5526e5c732d51307b26e784f454a724a699Jesse Barnes exit(0); 1311731cd5526e5c732d51307b26e784f454a724a699Jesse Barnes} 1312731cd5526e5c732d51307b26e784f454a724a699Jesse Barnes 13139b44fbd393b8db571badae41881f490145404ae0Paulo Zanonistatic int page_flipping_supported(void) 131459d97e7d6807d9cd076d4e8374aca1d9e8027a6bKristian Høgsberg{ 13158fef29093fae2a08f8c1cb4946687bf4bb62a1caBenjamin Franzke /*FIXME: generic ioctl needed? */ 13168fef29093fae2a08f8c1cb4946687bf4bb62a1caBenjamin Franzke return 1; 13178fef29093fae2a08f8c1cb4946687bf4bb62a1caBenjamin Franzke#if 0 131859d97e7d6807d9cd076d4e8374aca1d9e8027a6bKristian Høgsberg int ret, value; 131959d97e7d6807d9cd076d4e8374aca1d9e8027a6bKristian Høgsberg struct drm_i915_getparam gp; 132059d97e7d6807d9cd076d4e8374aca1d9e8027a6bKristian Høgsberg 132159d97e7d6807d9cd076d4e8374aca1d9e8027a6bKristian Høgsberg gp.param = I915_PARAM_HAS_PAGEFLIPPING; 132259d97e7d6807d9cd076d4e8374aca1d9e8027a6bKristian Høgsberg gp.value = &value; 132359d97e7d6807d9cd076d4e8374aca1d9e8027a6bKristian Høgsberg 132459d97e7d6807d9cd076d4e8374aca1d9e8027a6bKristian Høgsberg ret = drmCommandWriteRead(fd, DRM_I915_GETPARAM, &gp, sizeof(gp)); 132559d97e7d6807d9cd076d4e8374aca1d9e8027a6bKristian Høgsberg if (ret) { 132659d97e7d6807d9cd076d4e8374aca1d9e8027a6bKristian Høgsberg fprintf(stderr, "drm_i915_getparam: %m\n"); 132759d97e7d6807d9cd076d4e8374aca1d9e8027a6bKristian Høgsberg return 0; 132859d97e7d6807d9cd076d4e8374aca1d9e8027a6bKristian Høgsberg } 132959d97e7d6807d9cd076d4e8374aca1d9e8027a6bKristian Høgsberg 1330e4a519635f75bde38aeb5b09f2ff4efbf73453e9Matthew W. S. Bell return *gp.value; 13318fef29093fae2a08f8c1cb4946687bf4bb62a1caBenjamin Franzke#endif 133259d97e7d6807d9cd076d4e8374aca1d9e8027a6bKristian Høgsberg} 133359d97e7d6807d9cd076d4e8374aca1d9e8027a6bKristian Høgsberg 1334dab3c80203e562cfdbe33e7d1627c9dde2f5a7deLaurent Pinchartstatic char optstr[] = "cdefM:P:ps:vw:"; 1335ef07acf5b79f86ef86efe6e72c1de5726c97e41dLaurent Pinchart 1336731cd5526e5c732d51307b26e784f454a724a699Jesse Barnesint main(int argc, char **argv) 1337731cd5526e5c732d51307b26e784f454a724a699Jesse Barnes{ 1338549fe0ba627a67b6ae1334eb5cf274a3dfb1fd69Laurent Pinchart struct device dev; 1339549fe0ba627a67b6ae1334eb5cf274a3dfb1fd69Laurent Pinchart 1340731cd5526e5c732d51307b26e784f454a724a699Jesse Barnes int c; 1341d55de747a2bdec5b4885a6c86ea6707e15dfefb5Rob Clark int encoders = 0, connectors = 0, crtcs = 0, planes = 0, framebuffers = 0; 1342ab52756a3632fdc38a915a9bbda0b2089b09e38eLaurent Pinchart int drop_master = 0; 13431e1b3c0a93281ce8df42bbdddfe3e51dccc4d5eaKristian Høgsberg int test_vsync = 0; 1344ca9c8f06e0f560082dcd0943e9be29ba9a915ee3Laurent Pinchart const char *modules[] = { "i915", "radeon", "nouveau", "vmwgfx", "omapdrm", "exynos", "tilcdc" }; 134545901fdae66441ffec681e3dbd46b5530107a045Laurent Pinchart char *module = NULL; 13469b44fbd393b8db571badae41881f490145404ae0Paulo Zanoni unsigned int i; 13479b44fbd393b8db571badae41881f490145404ae0Paulo Zanoni int count = 0, plane_count = 0; 1348d725227cec822b8cfbeb541be17aae30b7612b9fLaurent Pinchart unsigned int prop_count = 0; 1349b1e0bdeb70b68754c6c4ab1c7d0161709960d49cLaurent Pinchart struct pipe_arg *pipe_args = NULL; 13506e0c74c5f8860748f03dad4548d3ef2cf2df5489Laurent Pinchart struct plane_arg *plane_args = NULL; 1351d725227cec822b8cfbeb541be17aae30b7612b9fLaurent Pinchart struct property_arg *prop_args = NULL; 135245901fdae66441ffec681e3dbd46b5530107a045Laurent Pinchart unsigned int args = 0; 1353549fe0ba627a67b6ae1334eb5cf274a3dfb1fd69Laurent Pinchart int ret; 1354549fe0ba627a67b6ae1334eb5cf274a3dfb1fd69Laurent Pinchart 13553813e0f8e1ee4885823cdd0b50b05970257adddcLaurent Pinchart memset(&dev, 0, sizeof dev); 13563813e0f8e1ee4885823cdd0b50b05970257adddcLaurent Pinchart 1357731cd5526e5c732d51307b26e784f454a724a699Jesse Barnes opterr = 0; 1358731cd5526e5c732d51307b26e784f454a724a699Jesse Barnes while ((c = getopt(argc, argv, optstr)) != -1) { 135945901fdae66441ffec681e3dbd46b5530107a045Laurent Pinchart args++; 136045901fdae66441ffec681e3dbd46b5530107a045Laurent Pinchart 1361731cd5526e5c732d51307b26e784f454a724a699Jesse Barnes switch (c) { 1362731cd5526e5c732d51307b26e784f454a724a699Jesse Barnes case 'c': 1363731cd5526e5c732d51307b26e784f454a724a699Jesse Barnes connectors = 1; 1364731cd5526e5c732d51307b26e784f454a724a699Jesse Barnes break; 1365ab52756a3632fdc38a915a9bbda0b2089b09e38eLaurent Pinchart case 'd': 1366ab52756a3632fdc38a915a9bbda0b2089b09e38eLaurent Pinchart drop_master = 1; 1367ab52756a3632fdc38a915a9bbda0b2089b09e38eLaurent Pinchart break; 1368ef07acf5b79f86ef86efe6e72c1de5726c97e41dLaurent Pinchart case 'e': 1369ef07acf5b79f86ef86efe6e72c1de5726c97e41dLaurent Pinchart encoders = 1; 1370ef07acf5b79f86ef86efe6e72c1de5726c97e41dLaurent Pinchart break; 1371ef07acf5b79f86ef86efe6e72c1de5726c97e41dLaurent Pinchart case 'f': 1372ef07acf5b79f86ef86efe6e72c1de5726c97e41dLaurent Pinchart framebuffers = 1; 1373731cd5526e5c732d51307b26e784f454a724a699Jesse Barnes break; 137445901fdae66441ffec681e3dbd46b5530107a045Laurent Pinchart case 'M': 137545901fdae66441ffec681e3dbd46b5530107a045Laurent Pinchart module = optarg; 137645901fdae66441ffec681e3dbd46b5530107a045Laurent Pinchart /* Preserve the default behaviour of dumping all information. */ 137745901fdae66441ffec681e3dbd46b5530107a045Laurent Pinchart args--; 137845901fdae66441ffec681e3dbd46b5530107a045Laurent Pinchart break; 1379ef07acf5b79f86ef86efe6e72c1de5726c97e41dLaurent Pinchart case 'P': 13806e0c74c5f8860748f03dad4548d3ef2cf2df5489Laurent Pinchart plane_args = realloc(plane_args, 13816e0c74c5f8860748f03dad4548d3ef2cf2df5489Laurent Pinchart (plane_count + 1) * sizeof *plane_args); 13826e0c74c5f8860748f03dad4548d3ef2cf2df5489Laurent Pinchart if (plane_args == NULL) { 13836e0c74c5f8860748f03dad4548d3ef2cf2df5489Laurent Pinchart fprintf(stderr, "memory allocation failed\n"); 13846e0c74c5f8860748f03dad4548d3ef2cf2df5489Laurent Pinchart return 1; 13856e0c74c5f8860748f03dad4548d3ef2cf2df5489Laurent Pinchart } 13866e0c74c5f8860748f03dad4548d3ef2cf2df5489Laurent Pinchart 1387ef07acf5b79f86ef86efe6e72c1de5726c97e41dLaurent Pinchart if (parse_plane(&plane_args[plane_count], optarg) < 0) 1388ef07acf5b79f86ef86efe6e72c1de5726c97e41dLaurent Pinchart usage(argv[0]); 13896e0c74c5f8860748f03dad4548d3ef2cf2df5489Laurent Pinchart 1390ef07acf5b79f86ef86efe6e72c1de5726c97e41dLaurent Pinchart plane_count++; 1391731cd5526e5c732d51307b26e784f454a724a699Jesse Barnes break; 1392ef07acf5b79f86ef86efe6e72c1de5726c97e41dLaurent Pinchart case 'p': 1393ef07acf5b79f86ef86efe6e72c1de5726c97e41dLaurent Pinchart crtcs = 1; 1394ef07acf5b79f86ef86efe6e72c1de5726c97e41dLaurent Pinchart planes = 1; 13951e1b3c0a93281ce8df42bbdddfe3e51dccc4d5eaKristian Høgsberg break; 1396731cd5526e5c732d51307b26e784f454a724a699Jesse Barnes case 's': 1397b1e0bdeb70b68754c6c4ab1c7d0161709960d49cLaurent Pinchart pipe_args = realloc(pipe_args, 1398b1e0bdeb70b68754c6c4ab1c7d0161709960d49cLaurent Pinchart (count + 1) * sizeof *pipe_args); 1399b1e0bdeb70b68754c6c4ab1c7d0161709960d49cLaurent Pinchart if (pipe_args == NULL) { 14006e0c74c5f8860748f03dad4548d3ef2cf2df5489Laurent Pinchart fprintf(stderr, "memory allocation failed\n"); 14016e0c74c5f8860748f03dad4548d3ef2cf2df5489Laurent Pinchart return 1; 14026e0c74c5f8860748f03dad4548d3ef2cf2df5489Laurent Pinchart } 14036e0c74c5f8860748f03dad4548d3ef2cf2df5489Laurent Pinchart 1404b1e0bdeb70b68754c6c4ab1c7d0161709960d49cLaurent Pinchart if (parse_connector(&pipe_args[count], optarg) < 0) 1405669fde3472ae71c55cc7526e3b3bd6fe00d6a5a5Kristian Høgsberg usage(argv[0]); 14066e0c74c5f8860748f03dad4548d3ef2cf2df5489Laurent Pinchart 1407669fde3472ae71c55cc7526e3b3bd6fe00d6a5a5Kristian Høgsberg count++; 1408731cd5526e5c732d51307b26e784f454a724a699Jesse Barnes break; 1409ef07acf5b79f86ef86efe6e72c1de5726c97e41dLaurent Pinchart case 'v': 1410ef07acf5b79f86ef86efe6e72c1de5726c97e41dLaurent Pinchart test_vsync = 1; 1411d55de747a2bdec5b4885a6c86ea6707e15dfefb5Rob Clark break; 1412d725227cec822b8cfbeb541be17aae30b7612b9fLaurent Pinchart case 'w': 1413d725227cec822b8cfbeb541be17aae30b7612b9fLaurent Pinchart prop_args = realloc(prop_args, 1414d725227cec822b8cfbeb541be17aae30b7612b9fLaurent Pinchart (prop_count + 1) * sizeof *prop_args); 1415d725227cec822b8cfbeb541be17aae30b7612b9fLaurent Pinchart if (prop_args == NULL) { 1416d725227cec822b8cfbeb541be17aae30b7612b9fLaurent Pinchart fprintf(stderr, "memory allocation failed\n"); 1417d725227cec822b8cfbeb541be17aae30b7612b9fLaurent Pinchart return 1; 1418d725227cec822b8cfbeb541be17aae30b7612b9fLaurent Pinchart } 1419d725227cec822b8cfbeb541be17aae30b7612b9fLaurent Pinchart 1420d725227cec822b8cfbeb541be17aae30b7612b9fLaurent Pinchart if (parse_property(&prop_args[prop_count], optarg) < 0) 1421d725227cec822b8cfbeb541be17aae30b7612b9fLaurent Pinchart usage(argv[0]); 1422d725227cec822b8cfbeb541be17aae30b7612b9fLaurent Pinchart 1423d725227cec822b8cfbeb541be17aae30b7612b9fLaurent Pinchart prop_count++; 1424d725227cec822b8cfbeb541be17aae30b7612b9fLaurent Pinchart break; 1425731cd5526e5c732d51307b26e784f454a724a699Jesse Barnes default: 1426731cd5526e5c732d51307b26e784f454a724a699Jesse Barnes usage(argv[0]); 1427731cd5526e5c732d51307b26e784f454a724a699Jesse Barnes break; 1428731cd5526e5c732d51307b26e784f454a724a699Jesse Barnes } 1429731cd5526e5c732d51307b26e784f454a724a699Jesse Barnes } 1430731cd5526e5c732d51307b26e784f454a724a699Jesse Barnes 143145901fdae66441ffec681e3dbd46b5530107a045Laurent Pinchart if (!args) 1432dab3c80203e562cfdbe33e7d1627c9dde2f5a7deLaurent Pinchart encoders = connectors = crtcs = planes = framebuffers = 1; 1433731cd5526e5c732d51307b26e784f454a724a699Jesse Barnes 143445901fdae66441ffec681e3dbd46b5530107a045Laurent Pinchart if (module) { 1435549fe0ba627a67b6ae1334eb5cf274a3dfb1fd69Laurent Pinchart dev.fd = drmOpen(module, NULL); 1436549fe0ba627a67b6ae1334eb5cf274a3dfb1fd69Laurent Pinchart if (dev.fd < 0) { 143745901fdae66441ffec681e3dbd46b5530107a045Laurent Pinchart fprintf(stderr, "failed to open device '%s'.\n", module); 143845901fdae66441ffec681e3dbd46b5530107a045Laurent Pinchart return 1; 143945901fdae66441ffec681e3dbd46b5530107a045Laurent Pinchart } 144045901fdae66441ffec681e3dbd46b5530107a045Laurent Pinchart } else { 144145901fdae66441ffec681e3dbd46b5530107a045Laurent Pinchart for (i = 0; i < ARRAY_SIZE(modules); i++) { 144245901fdae66441ffec681e3dbd46b5530107a045Laurent Pinchart printf("trying to open device '%s'...", modules[i]); 1443549fe0ba627a67b6ae1334eb5cf274a3dfb1fd69Laurent Pinchart dev.fd = drmOpen(modules[i], NULL); 1444549fe0ba627a67b6ae1334eb5cf274a3dfb1fd69Laurent Pinchart if (dev.fd < 0) { 144545901fdae66441ffec681e3dbd46b5530107a045Laurent Pinchart printf("failed.\n"); 144645901fdae66441ffec681e3dbd46b5530107a045Laurent Pinchart } else { 144745901fdae66441ffec681e3dbd46b5530107a045Laurent Pinchart printf("success.\n"); 144845901fdae66441ffec681e3dbd46b5530107a045Laurent Pinchart break; 144945901fdae66441ffec681e3dbd46b5530107a045Laurent Pinchart } 145045901fdae66441ffec681e3dbd46b5530107a045Laurent Pinchart } 145145901fdae66441ffec681e3dbd46b5530107a045Laurent Pinchart 1452549fe0ba627a67b6ae1334eb5cf274a3dfb1fd69Laurent Pinchart if (dev.fd < 0) { 145345901fdae66441ffec681e3dbd46b5530107a045Laurent Pinchart fprintf(stderr, "no device found.\n"); 145445901fdae66441ffec681e3dbd46b5530107a045Laurent Pinchart return 1; 1455731cd5526e5c732d51307b26e784f454a724a699Jesse Barnes } 1456731cd5526e5c732d51307b26e784f454a724a699Jesse Barnes } 1457731cd5526e5c732d51307b26e784f454a724a699Jesse Barnes 14589b44fbd393b8db571badae41881f490145404ae0Paulo Zanoni if (test_vsync && !page_flipping_supported()) { 145959d97e7d6807d9cd076d4e8374aca1d9e8027a6bKristian Høgsberg fprintf(stderr, "page flipping not supported by drm.\n"); 146059d97e7d6807d9cd076d4e8374aca1d9e8027a6bKristian Høgsberg return -1; 146159d97e7d6807d9cd076d4e8374aca1d9e8027a6bKristian Høgsberg } 146259d97e7d6807d9cd076d4e8374aca1d9e8027a6bKristian Høgsberg 14633813e0f8e1ee4885823cdd0b50b05970257adddcLaurent Pinchart if (test_vsync && !count) { 14643813e0f8e1ee4885823cdd0b50b05970257adddcLaurent Pinchart fprintf(stderr, "page flipping requires at least one -s option.\n"); 14653813e0f8e1ee4885823cdd0b50b05970257adddcLaurent Pinchart return -1; 14663813e0f8e1ee4885823cdd0b50b05970257adddcLaurent Pinchart } 14673813e0f8e1ee4885823cdd0b50b05970257adddcLaurent Pinchart 1468549fe0ba627a67b6ae1334eb5cf274a3dfb1fd69Laurent Pinchart dev.resources = get_resources(&dev); 1469549fe0ba627a67b6ae1334eb5cf274a3dfb1fd69Laurent Pinchart if (!dev.resources) { 1470549fe0ba627a67b6ae1334eb5cf274a3dfb1fd69Laurent Pinchart drmClose(dev.fd); 1471731cd5526e5c732d51307b26e784f454a724a699Jesse Barnes return 1; 1472731cd5526e5c732d51307b26e784f454a724a699Jesse Barnes } 1473731cd5526e5c732d51307b26e784f454a724a699Jesse Barnes 1474549fe0ba627a67b6ae1334eb5cf274a3dfb1fd69Laurent Pinchart#define dump_resource(dev, res) if (res) dump_##res(dev) 1475549fe0ba627a67b6ae1334eb5cf274a3dfb1fd69Laurent Pinchart 1476549fe0ba627a67b6ae1334eb5cf274a3dfb1fd69Laurent Pinchart dump_resource(&dev, encoders); 1477549fe0ba627a67b6ae1334eb5cf274a3dfb1fd69Laurent Pinchart dump_resource(&dev, connectors); 1478549fe0ba627a67b6ae1334eb5cf274a3dfb1fd69Laurent Pinchart dump_resource(&dev, crtcs); 1479549fe0ba627a67b6ae1334eb5cf274a3dfb1fd69Laurent Pinchart dump_resource(&dev, planes); 1480549fe0ba627a67b6ae1334eb5cf274a3dfb1fd69Laurent Pinchart dump_resource(&dev, framebuffers); 1481731cd5526e5c732d51307b26e784f454a724a699Jesse Barnes 1482d725227cec822b8cfbeb541be17aae30b7612b9fLaurent Pinchart for (i = 0; i < prop_count; ++i) 1483549fe0ba627a67b6ae1334eb5cf274a3dfb1fd69Laurent Pinchart set_property(&dev, &prop_args[i]); 1484d725227cec822b8cfbeb541be17aae30b7612b9fLaurent Pinchart 14853813e0f8e1ee4885823cdd0b50b05970257adddcLaurent Pinchart if (count || plane_count) { 1486549fe0ba627a67b6ae1334eb5cf274a3dfb1fd69Laurent Pinchart ret = kms_create(dev.fd, &dev.kms); 1487549fe0ba627a67b6ae1334eb5cf274a3dfb1fd69Laurent Pinchart if (ret) { 1488549fe0ba627a67b6ae1334eb5cf274a3dfb1fd69Laurent Pinchart fprintf(stderr, "failed to create kms driver: %s\n", 1489549fe0ba627a67b6ae1334eb5cf274a3dfb1fd69Laurent Pinchart strerror(-ret)); 1490549fe0ba627a67b6ae1334eb5cf274a3dfb1fd69Laurent Pinchart return 1; 1491549fe0ba627a67b6ae1334eb5cf274a3dfb1fd69Laurent Pinchart } 1492549fe0ba627a67b6ae1334eb5cf274a3dfb1fd69Laurent Pinchart 14933813e0f8e1ee4885823cdd0b50b05970257adddcLaurent Pinchart if (count) 1494b1e0bdeb70b68754c6c4ab1c7d0161709960d49cLaurent Pinchart set_mode(&dev, pipe_args, count); 14953813e0f8e1ee4885823cdd0b50b05970257adddcLaurent Pinchart 14963813e0f8e1ee4885823cdd0b50b05970257adddcLaurent Pinchart if (plane_count) 14973813e0f8e1ee4885823cdd0b50b05970257adddcLaurent Pinchart set_planes(&dev, plane_args, plane_count); 14983813e0f8e1ee4885823cdd0b50b05970257adddcLaurent Pinchart 14993813e0f8e1ee4885823cdd0b50b05970257adddcLaurent Pinchart if (test_vsync) 1500b1e0bdeb70b68754c6c4ab1c7d0161709960d49cLaurent Pinchart test_page_flip(&dev, pipe_args, count); 15013813e0f8e1ee4885823cdd0b50b05970257adddcLaurent Pinchart 1502ab52756a3632fdc38a915a9bbda0b2089b09e38eLaurent Pinchart if (drop_master) 1503549fe0ba627a67b6ae1334eb5cf274a3dfb1fd69Laurent Pinchart drmDropMaster(dev.fd); 1504549fe0ba627a67b6ae1334eb5cf274a3dfb1fd69Laurent Pinchart 15053813e0f8e1ee4885823cdd0b50b05970257adddcLaurent Pinchart kms_bo_destroy(&dev.mode.bo); 1506549fe0ba627a67b6ae1334eb5cf274a3dfb1fd69Laurent Pinchart kms_destroy(&dev.kms); 15073813e0f8e1ee4885823cdd0b50b05970257adddcLaurent Pinchart 15082c113a1b159f57ab94b54316ece49c677cfe04ceKristian Høgsberg getchar(); 1509731cd5526e5c732d51307b26e784f454a724a699Jesse Barnes } 1510731cd5526e5c732d51307b26e784f454a724a699Jesse Barnes 1511549fe0ba627a67b6ae1334eb5cf274a3dfb1fd69Laurent Pinchart free_resources(dev.resources); 1512731cd5526e5c732d51307b26e784f454a724a699Jesse Barnes 1513731cd5526e5c732d51307b26e784f454a724a699Jesse Barnes return 0; 1514731cd5526e5c732d51307b26e784f454a724a699Jesse Barnes} 1515