Blame tests/proptest/proptest.c

Packit 631bab
/*
Packit 631bab
 * Copyright © 2012 Intel Corporation
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 (including the next
Packit 631bab
 * paragraph) shall be included in all copies or substantial portions of the
Packit 631bab
 * 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
Packit 631bab
 * THE 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
 * Authors:
Packit 631bab
 *    Paulo Zanoni <paulo.r.zanoni@intel.com>
Packit 631bab
 *
Packit 631bab
 */
Packit 631bab
Packit 631bab
#include <assert.h>
Packit 631bab
#include <errno.h>
Packit 631bab
#include <getopt.h>
Packit 631bab
#include <inttypes.h>
Packit 631bab
#include <stdlib.h>
Packit 631bab
#include <stdio.h>
Packit 631bab
#include <string.h>
Packit 631bab
Packit 631bab
#include "xf86drm.h"
Packit 631bab
#include "xf86drmMode.h"
Packit 631bab
Packit 631bab
#include "util/common.h"
Packit 631bab
#include "util/kms.h"
Packit 631bab
Packit 631bab
static inline int64_t U642I64(uint64_t val)
Packit 631bab
{
Packit 631bab
	return (int64_t)*((int64_t *)&val;;
Packit 631bab
}
Packit 631bab
Packit 631bab
int fd;
Packit 631bab
drmModeResPtr res = NULL;
Packit 631bab
Packit 631bab
/* dump_blob and dump_prop shamelessly copied from ../modetest/modetest.c */
Packit 631bab
static void
Packit 631bab
dump_blob(uint32_t blob_id)
Packit 631bab
{
Packit 631bab
	uint32_t i;
Packit 631bab
	unsigned char *blob_data;
Packit 631bab
	drmModePropertyBlobPtr blob;
Packit 631bab
Packit 631bab
	blob = drmModeGetPropertyBlob(fd, blob_id);
Packit 631bab
	if (!blob) {
Packit 631bab
		printf("\n");
Packit 631bab
		return;
Packit 631bab
	}
Packit 631bab
Packit 631bab
	blob_data = blob->data;
Packit 631bab
Packit 631bab
	for (i = 0; i < blob->length; i++) {
Packit 631bab
		if (i % 16 == 0)
Packit 631bab
			printf("\n\t\t\t");
Packit 631bab
		printf("%.2hhx", blob_data[i]);
Packit 631bab
	}
Packit 631bab
	printf("\n");
Packit 631bab
Packit 631bab
	drmModeFreePropertyBlob(blob);
Packit 631bab
}
Packit 631bab
Packit 631bab
static void
Packit 631bab
dump_prop(uint32_t prop_id, uint64_t value)
Packit 631bab
{
Packit 631bab
	int i;
Packit 631bab
	drmModePropertyPtr prop;
Packit 631bab
Packit 631bab
	prop = drmModeGetProperty(fd, prop_id);
Packit 631bab
Packit 631bab
	printf("\t%d", prop_id);
Packit 631bab
	if (!prop) {
Packit 631bab
		printf("\n");
Packit 631bab
		return;
Packit 631bab
	}
Packit 631bab
Packit 631bab
	printf(" %s:\n", prop->name);
Packit 631bab
Packit 631bab
	printf("\t\tflags:");
Packit 631bab
	if (prop->flags & DRM_MODE_PROP_PENDING)
Packit 631bab
		printf(" pending");
Packit 631bab
	if (prop->flags & DRM_MODE_PROP_IMMUTABLE)
Packit 631bab
		printf(" immutable");
Packit 631bab
	if (drm_property_type_is(prop, DRM_MODE_PROP_SIGNED_RANGE))
Packit 631bab
		printf(" signed range");
Packit 631bab
	if (drm_property_type_is(prop, DRM_MODE_PROP_RANGE))
Packit 631bab
		printf(" range");
Packit 631bab
	if (drm_property_type_is(prop, DRM_MODE_PROP_ENUM))
Packit 631bab
		printf(" enum");
Packit 631bab
	if (drm_property_type_is(prop, DRM_MODE_PROP_BITMASK))
Packit 631bab
		printf(" bitmask");
Packit 631bab
	if (drm_property_type_is(prop, DRM_MODE_PROP_BLOB))
Packit 631bab
		printf(" blob");
Packit 631bab
	if (drm_property_type_is(prop, DRM_MODE_PROP_OBJECT))
Packit 631bab
		printf(" object");
Packit 631bab
	printf("\n");
Packit 631bab
Packit 631bab
Packit 631bab
	if (drm_property_type_is(prop, DRM_MODE_PROP_SIGNED_RANGE)) {
Packit 631bab
		printf("\t\tvalues:");
Packit 631bab
		for (i = 0; i < prop->count_values; i++)
Packit 631bab
			printf(" %"PRId64, U642I64(prop->values[i]));
Packit 631bab
		printf("\n");
Packit 631bab
	}
Packit 631bab
Packit 631bab
	if (drm_property_type_is(prop, DRM_MODE_PROP_RANGE)) {
Packit 631bab
		printf("\t\tvalues:");
Packit 631bab
		for (i = 0; i < prop->count_values; i++)
Packit 631bab
			printf(" %"PRIu64, prop->values[i]);
Packit 631bab
		printf("\n");
Packit 631bab
	}
Packit 631bab
Packit 631bab
	if (drm_property_type_is(prop, DRM_MODE_PROP_ENUM)) {
Packit 631bab
		printf("\t\tenums:");
Packit 631bab
		for (i = 0; i < prop->count_enums; i++)
Packit 631bab
			printf(" %s=%llu", prop->enums[i].name,
Packit 631bab
			       prop->enums[i].value);
Packit 631bab
		printf("\n");
Packit 631bab
	} else if (drm_property_type_is(prop, DRM_MODE_PROP_BITMASK)) {
Packit 631bab
		printf("\t\tvalues:");
Packit 631bab
		for (i = 0; i < prop->count_enums; i++)
Packit 631bab
			printf(" %s=0x%llx", prop->enums[i].name,
Packit 631bab
			       (1LL << prop->enums[i].value));
Packit 631bab
		printf("\n");
Packit 631bab
	} else {
Packit 631bab
		assert(prop->count_enums == 0);
Packit 631bab
	}
Packit 631bab
Packit 631bab
	if (drm_property_type_is(prop, DRM_MODE_PROP_BLOB)) {
Packit 631bab
		printf("\t\tblobs:\n");
Packit 631bab
		for (i = 0; i < prop->count_blobs; i++)
Packit 631bab
			dump_blob(prop->blob_ids[i]);
Packit 631bab
		printf("\n");
Packit 631bab
	} else {
Packit 631bab
		assert(prop->count_blobs == 0);
Packit 631bab
	}
Packit 631bab
Packit 631bab
	printf("\t\tvalue:");
Packit 631bab
	if (drm_property_type_is(prop, DRM_MODE_PROP_BLOB))
Packit 631bab
		dump_blob(value);
Packit 631bab
	else if (drm_property_type_is(prop, DRM_MODE_PROP_SIGNED_RANGE))
Packit 631bab
		printf(" %"PRId64"\n", value);
Packit 631bab
	else
Packit 631bab
		printf(" %"PRIu64"\n", value);
Packit 631bab
Packit 631bab
	drmModeFreeProperty(prop);
Packit 631bab
}
Packit 631bab
Packit 631bab
static void listObjectProperties(uint32_t id, uint32_t type)
Packit 631bab
{
Packit 631bab
	unsigned int i;
Packit 631bab
	drmModeObjectPropertiesPtr props;
Packit 631bab
Packit 631bab
	props = drmModeObjectGetProperties(fd, id, type);
Packit 631bab
Packit 631bab
	if (!props) {
Packit 631bab
		printf("\tNo properties: %s.\n", strerror(errno));
Packit 631bab
		return;
Packit 631bab
	}
Packit 631bab
Packit 631bab
	for (i = 0; i < props->count_props; i++)
Packit 631bab
		dump_prop(props->props[i], props->prop_values[i]);
Packit 631bab
Packit 631bab
	drmModeFreeObjectProperties(props);
Packit 631bab
}
Packit 631bab
Packit 631bab
static void listConnectorProperties(void)
Packit 631bab
{
Packit 631bab
	int i;
Packit 631bab
	drmModeConnectorPtr c;
Packit 631bab
Packit 631bab
	for (i = 0; i < res->count_connectors; i++) {
Packit 631bab
		c = drmModeGetConnector(fd, res->connectors[i]);
Packit 631bab
Packit 631bab
		if (!c) {
Packit 631bab
			fprintf(stderr, "Could not get connector %u: %s\n",
Packit 631bab
				res->connectors[i], strerror(errno));
Packit 631bab
			continue;
Packit 631bab
		}
Packit 631bab
Packit 631bab
		printf("Connector %u (%s-%u)\n", c->connector_id,
Packit 631bab
		       util_lookup_connector_type_name(c->connector_type),
Packit 631bab
		       c->connector_type_id);
Packit 631bab
Packit 631bab
		listObjectProperties(c->connector_id,
Packit 631bab
				     DRM_MODE_OBJECT_CONNECTOR);
Packit 631bab
Packit 631bab
		drmModeFreeConnector(c);
Packit 631bab
	}
Packit 631bab
}
Packit 631bab
Packit 631bab
static void listCrtcProperties(void)
Packit 631bab
{
Packit 631bab
	int i;
Packit 631bab
	drmModeCrtcPtr c;
Packit 631bab
Packit 631bab
	for (i = 0; i < res->count_crtcs; i++) {
Packit 631bab
		c = drmModeGetCrtc(fd, res->crtcs[i]);
Packit 631bab
Packit 631bab
		if (!c) {
Packit 631bab
			fprintf(stderr, "Could not get crtc %u: %s\n",
Packit 631bab
				res->crtcs[i], strerror(errno));
Packit 631bab
			continue;
Packit 631bab
		}
Packit 631bab
Packit 631bab
		printf("CRTC %u\n", c->crtc_id);
Packit 631bab
Packit 631bab
		listObjectProperties(c->crtc_id, DRM_MODE_OBJECT_CRTC);
Packit 631bab
Packit 631bab
		drmModeFreeCrtc(c);
Packit 631bab
	}
Packit 631bab
}
Packit 631bab
Packit 631bab
static void listAllProperties(void)
Packit 631bab
{
Packit 631bab
	listConnectorProperties();
Packit 631bab
	listCrtcProperties();
Packit 631bab
}
Packit 631bab
Packit 631bab
static int setProperty(char *argv[])
Packit 631bab
{
Packit 631bab
	uint32_t obj_id, obj_type, prop_id;
Packit 631bab
	uint64_t value;
Packit 631bab
Packit 631bab
	obj_id = atoi(argv[0]);
Packit 631bab
Packit 631bab
	if (!strcmp(argv[1], "connector")) {
Packit 631bab
		obj_type = DRM_MODE_OBJECT_CONNECTOR;
Packit 631bab
	} else if (!strcmp(argv[1], "crtc")) {
Packit 631bab
		obj_type = DRM_MODE_OBJECT_CRTC;
Packit 631bab
	} else {
Packit 631bab
		fprintf(stderr, "Invalid object type.\n");
Packit 631bab
		return 1;
Packit 631bab
	}
Packit 631bab
Packit 631bab
	prop_id = atoi(argv[2]);
Packit 631bab
	value = atoll(argv[3]);
Packit 631bab
Packit 631bab
	return drmModeObjectSetProperty(fd, obj_id, obj_type, prop_id, value);
Packit 631bab
}
Packit 631bab
Packit 631bab
static void usage(const char *program)
Packit 631bab
{
Packit 631bab
	printf("Usage:\n"
Packit 631bab
"  %s [options]\n"
Packit 631bab
"  %s [options] [obj id] [obj type] [prop id] [value]\n"
Packit 631bab
"\n"
Packit 631bab
"options:\n"
Packit 631bab
"  -D DEVICE  use the given device\n"
Packit 631bab
"  -M MODULE  use the given driver\n"
Packit 631bab
"\n"
Packit 631bab
"The first form just prints all the existing properties. The second one is\n"
Packit 631bab
"used to set the value of a specified property. The object type can be one of\n"
Packit 631bab
"the following strings:\n"
Packit 631bab
"  connector crtc\n"
Packit 631bab
"\n"
Packit 631bab
"Example:\n"
Packit 631bab
"  proptest 7 connector 2 1\n"
Packit 631bab
"will set property 2 of connector 7 to 1\n", program, program);
Packit 631bab
}
Packit 631bab
Packit 631bab
int main(int argc, char *argv[])
Packit 631bab
{
Packit 631bab
	static const char optstr[] = "D:M:";
Packit 631bab
	int c, args, ret = 0;
Packit 631bab
	char *device = NULL;
Packit 631bab
	char *module = NULL;
Packit 631bab
Packit 631bab
	while ((c = getopt(argc, argv, optstr)) != -1) {
Packit 631bab
		switch (c) {
Packit 631bab
		case 'D':
Packit 631bab
			device = optarg;
Packit 631bab
			break;
Packit 631bab
Packit 631bab
		case 'M':
Packit 631bab
			module = optarg;
Packit 631bab
			break;
Packit 631bab
Packit 631bab
		default:
Packit 631bab
			usage(argv[0]);
Packit 631bab
			break;
Packit 631bab
		}
Packit 631bab
	}
Packit 631bab
Packit 631bab
	args = argc - optind;
Packit 631bab
Packit 631bab
	fd = util_open(device, module);
Packit 631bab
	if (fd < 0)
Packit 631bab
		return 1;
Packit 631bab
Packit 631bab
	res = drmModeGetResources(fd);
Packit 631bab
	if (!res) {
Packit 631bab
		fprintf(stderr, "Failed to get resources: %s\n",
Packit 631bab
			strerror(errno));
Packit 631bab
		ret = 1;
Packit 631bab
		goto done;
Packit 631bab
	}
Packit 631bab
Packit 631bab
	if (args < 1) {
Packit 631bab
		listAllProperties();
Packit 631bab
	} else if (args == 4) {
Packit 631bab
		ret = setProperty(&argv[optind]);
Packit 631bab
	} else {
Packit 631bab
		usage(argv[0]);
Packit 631bab
		ret = 1;
Packit 631bab
	}
Packit 631bab
Packit 631bab
	drmModeFreeResources(res);
Packit 631bab
done:
Packit 631bab
	drmClose(fd);
Packit 631bab
	return ret;
Packit 631bab
}