Blame tests/util/kms.c

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