Blame tests/util/kms.c

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