| /* |
| * Copyright 2008 Tungsten Graphics |
| * Jakob Bornecrantz <jakob@tungstengraphics.com> |
| * Copyright 2008 Intel Corporation |
| * Jesse Barnes <jesse.barnes@intel.com> |
| * |
| * Permission is hereby granted, free of charge, to any person obtaining a |
| * copy of this software and associated documentation files (the "Software"), |
| * to deal in the Software without restriction, including without limitation |
| * the rights to use, copy, modify, merge, publish, distribute, sublicense, |
| * and/or sell copies of the Software, and to permit persons to whom the |
| * Software is furnished to do so, subject to the following conditions: |
| * |
| * The above copyright notice and this permission notice shall be included in |
| * all copies or substantial portions of the Software. |
| * |
| * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR |
| * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, |
| * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE |
| * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER |
| * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING |
| * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS |
| * IN THE SOFTWARE. |
| */ |
| |
| /* |
| * This fairly simple test program dumps output in a similar format to the |
| * "xrandr" tool everyone knows & loves. It's necessarily slightly different |
| * since the kernel separates outputs into encoder and connector structures, |
| * each with their own unique ID. The program also allows test testing of the |
| * memory management and mode setting APIs by allowing the user to specify a |
| * connector and mode to use for mode setting. If all works as expected, a |
| * blue background should be painted on the monitor attached to the specified |
| * connector after the selected mode is set. |
| * |
| * TODO: use cairo to write the mode info on the selected output once |
| * the mode has been programmed, along with possible test patterns. |
| */ |
| |
| #ifdef HAVE_CONFIG_H |
| #include "config.h" |
| #endif |
| |
| #include <errno.h> |
| #include <stdint.h> |
| #include <stdio.h> |
| #include <stdlib.h> |
| #include <string.h> |
| |
| #include "xf86drm.h" |
| #include "xf86drmMode.h" |
| |
| #include "common.h" |
| |
| struct type_name { |
| unsigned int type; |
| const char *name; |
| }; |
| |
| static const char *util_lookup_type_name(unsigned int type, |
| const struct type_name *table, |
| unsigned int count) |
| { |
| unsigned int i; |
| |
| for (i = 0; i < count; i++) |
| if (table[i].type == type) |
| return table[i].name; |
| |
| return NULL; |
| } |
| |
| static const struct type_name encoder_type_names[] = { |
| { DRM_MODE_ENCODER_NONE, "none" }, |
| { DRM_MODE_ENCODER_DAC, "DAC" }, |
| { DRM_MODE_ENCODER_TMDS, "TMDS" }, |
| { DRM_MODE_ENCODER_LVDS, "LVDS" }, |
| { DRM_MODE_ENCODER_TVDAC, "TVDAC" }, |
| { DRM_MODE_ENCODER_VIRTUAL, "Virtual" }, |
| { DRM_MODE_ENCODER_DSI, "DSI" }, |
| { DRM_MODE_ENCODER_DPMST, "DPMST" }, |
| { DRM_MODE_ENCODER_DPI, "DPI" }, |
| }; |
| |
| const char *util_lookup_encoder_type_name(unsigned int type) |
| { |
| return util_lookup_type_name(type, encoder_type_names, |
| ARRAY_SIZE(encoder_type_names)); |
| } |
| |
| static const struct type_name connector_status_names[] = { |
| { DRM_MODE_CONNECTED, "connected" }, |
| { DRM_MODE_DISCONNECTED, "disconnected" }, |
| { DRM_MODE_UNKNOWNCONNECTION, "unknown" }, |
| }; |
| |
| const char *util_lookup_connector_status_name(unsigned int status) |
| { |
| return util_lookup_type_name(status, connector_status_names, |
| ARRAY_SIZE(connector_status_names)); |
| } |
| |
| static const struct type_name connector_type_names[] = { |
| { DRM_MODE_CONNECTOR_Unknown, "unknown" }, |
| { DRM_MODE_CONNECTOR_VGA, "VGA" }, |
| { DRM_MODE_CONNECTOR_DVII, "DVI-I" }, |
| { DRM_MODE_CONNECTOR_DVID, "DVI-D" }, |
| { DRM_MODE_CONNECTOR_DVIA, "DVI-A" }, |
| { DRM_MODE_CONNECTOR_Composite, "composite" }, |
| { DRM_MODE_CONNECTOR_SVIDEO, "s-video" }, |
| { DRM_MODE_CONNECTOR_LVDS, "LVDS" }, |
| { DRM_MODE_CONNECTOR_Component, "component" }, |
| { DRM_MODE_CONNECTOR_9PinDIN, "9-pin DIN" }, |
| { DRM_MODE_CONNECTOR_DisplayPort, "DP" }, |
| { DRM_MODE_CONNECTOR_HDMIA, "HDMI-A" }, |
| { DRM_MODE_CONNECTOR_HDMIB, "HDMI-B" }, |
| { DRM_MODE_CONNECTOR_TV, "TV" }, |
| { DRM_MODE_CONNECTOR_eDP, "eDP" }, |
| { DRM_MODE_CONNECTOR_VIRTUAL, "Virtual" }, |
| { DRM_MODE_CONNECTOR_DSI, "DSI" }, |
| { DRM_MODE_CONNECTOR_DPI, "DPI" }, |
| }; |
| |
| const char *util_lookup_connector_type_name(unsigned int type) |
| { |
| return util_lookup_type_name(type, connector_type_names, |
| ARRAY_SIZE(connector_type_names)); |
| } |
| |
| static const char * const modules[] = { |
| "i915", |
| "amdgpu", |
| "radeon", |
| "nouveau", |
| "vmwgfx", |
| "omapdrm", |
| "exynos", |
| "tilcdc", |
| "msm", |
| "sti", |
| "tegra", |
| "imx-drm", |
| "rockchip", |
| "atmel-hlcdc", |
| "fsl-dcu-drm", |
| "vc4", |
| "virtio_gpu", |
| "mediatek", |
| "meson", |
| "pl111", |
| }; |
| |
| int util_open(const char *device, const char *module) |
| { |
| int fd; |
| |
| if (module) { |
| fd = drmOpen(module, device); |
| if (fd < 0) { |
| fprintf(stderr, "failed to open device '%s': %s\n", |
| module, strerror(errno)); |
| return -errno; |
| } |
| } else { |
| unsigned int i; |
| |
| for (i = 0; i < ARRAY_SIZE(modules); i++) { |
| printf("trying to open device '%s'...", modules[i]); |
| |
| fd = drmOpen(modules[i], device); |
| if (fd < 0) { |
| printf("failed\n"); |
| } else { |
| printf("done\n"); |
| break; |
| } |
| } |
| |
| if (fd < 0) { |
| fprintf(stderr, "no device found\n"); |
| return -ENODEV; |
| } |
| } |
| |
| return fd; |
| } |