Blame tests/proptest/proptest.c

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