Message ID | 1338919594-25392-4-git-send-email-rob.clark@linaro.org |
---|---|
State | New |
Headers | show |
Hi, Rob and Paulo. On 06/06/2012 03:06 AM, Rob Clark wrote: > From: Paulo Zanoni<paulo.r.zanoni@intel.com> > > A small program that allows us to see and modify properties. > > Reviewed-by: Rob Clark<rob@ti.com> > Signed-off-by: Paulo Zanoni<paulo.r.zanoni@intel.com> > --- > configure.ac | 1 + > tests/Makefile.am | 2 +- > tests/proptest/Makefile.am | 11 ++ > tests/proptest/proptest.c | 317 ++++++++++++++++++++++++++++++++++++++++++++ > 4 files changed, 330 insertions(+), 1 deletion(-) > create mode 100644 tests/proptest/Makefile.am > create mode 100644 tests/proptest/proptest.c > > diff --git a/configure.ac b/configure.ac > index e6e9a9f..73558ce 100644 > --- a/configure.ac > +++ b/configure.ac > @@ -329,6 +329,7 @@ AC_CONFIG_FILES([ > tests/modeprint/Makefile > tests/modetest/Makefile > tests/kmstest/Makefile > + tests/proptest/Makefile > tests/radeon/Makefile > tests/vbltest/Makefile > include/Makefile > diff --git a/tests/Makefile.am b/tests/Makefile.am > index a3a59bd..1442854 100644 > --- a/tests/Makefile.am > +++ b/tests/Makefile.am > @@ -10,7 +10,7 @@ check_PROGRAMS = \ > dristat \ > drmstat > > -SUBDIRS = modeprint > +SUBDIRS = modeprint proptest > > if HAVE_LIBKMS > SUBDIRS += kmstest modetest > diff --git a/tests/proptest/Makefile.am b/tests/proptest/Makefile.am > new file mode 100644 > index 0000000..f81a3c0 > --- /dev/null > +++ b/tests/proptest/Makefile.am > @@ -0,0 +1,11 @@ > +AM_CFLAGS = \ > + -I$(top_srcdir)/include/drm \ > + -I$(top_srcdir) > + > +noinst_PROGRAMS = \ > + proptest > + > +proptest_SOURCES = \ > + proptest.c > +proptest_LDADD = \ > + $(top_builddir)/libdrm.la > diff --git a/tests/proptest/proptest.c b/tests/proptest/proptest.c > new file mode 100644 > index 0000000..52896fe > --- /dev/null > +++ b/tests/proptest/proptest.c > @@ -0,0 +1,317 @@ > +/* > + * Copyright (c) 2012 Intel Corporation > + * > + * 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 (including the next > + * paragraph) 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. > + * > + * Authors: > + * Paulo Zanoni<paulo.r.zanoni@intel.com> > + * > + */ > + > +#include<assert.h> > +#include<errno.h> > +#include<inttypes.h> > +#include<stdlib.h> > +#include<stdio.h> > +#include<string.h> > + > +#include "xf86drm.h" > +#include "xf86drmMode.h" > + > +#define ARRAY_SIZE(arr) (sizeof(arr) / sizeof((arr)[0])) > + > +int fd; > +drmModeResPtr res = NULL; > + > +const char *connector_type_str(uint32_t type) > +{ > + switch (type) { > + case DRM_MODE_CONNECTOR_Unknown: > + return "Unknown"; > + case DRM_MODE_CONNECTOR_VGA: > + return "VGA"; > + case DRM_MODE_CONNECTOR_DVII: > + return "DVI-I"; > + case DRM_MODE_CONNECTOR_DVID: > + return "DVI-D"; > + case DRM_MODE_CONNECTOR_DVIA: > + return "DVI-A"; > + case DRM_MODE_CONNECTOR_Composite: > + return "Composite"; > + case DRM_MODE_CONNECTOR_SVIDEO: > + return "SVIDEO"; > + case DRM_MODE_CONNECTOR_LVDS: > + return "LVDS"; > + case DRM_MODE_CONNECTOR_Component: > + return "Component"; > + case DRM_MODE_CONNECTOR_9PinDIN: > + return "9PinDin"; > + case DRM_MODE_CONNECTOR_DisplayPort: > + return "DisplayPort"; > + case DRM_MODE_CONNECTOR_HDMIA: > + return "HDMI-A"; > + case DRM_MODE_CONNECTOR_HDMIB: > + return "HDMI-B"; > + case DRM_MODE_CONNECTOR_TV: > + return "TV"; > + case DRM_MODE_CONNECTOR_eDP: > + return "eDP"; > + default: > + return "Invalid"; > + } > +} > + > +/* dump_blob and dump_prop shamelessly copied from ../modetest/modetest.c */ > +static void > +dump_blob(uint32_t blob_id) > +{ > + uint32_t i; > + unsigned char *blob_data; > + drmModePropertyBlobPtr blob; > + > + blob = drmModeGetPropertyBlob(fd, blob_id); > + if (!blob) > + return; > + > + blob_data = blob->data; > + > + for (i = 0; i< blob->length; i++) { > + if (i % 16 == 0) > + printf("\n\t\t\t"); > + printf("%.2hhx", blob_data[i]); > + } > + printf("\n"); > + > + drmModeFreePropertyBlob(blob); > +} > + > +static void > +dump_prop(uint32_t prop_id, uint64_t value) > +{ > + int i; > + drmModePropertyPtr prop; > + > + prop = drmModeGetProperty(fd, prop_id); > + > + printf("\t%d", prop_id); > + if (!prop) { > + printf("\n"); > + return; > + } > + > + printf(" %s:\n", prop->name); > + > + printf("\t\tflags:"); > + if (prop->flags& DRM_MODE_PROP_PENDING) > + printf(" pending"); > + if (prop->flags& DRM_MODE_PROP_RANGE) > + printf(" range"); > + if (prop->flags& DRM_MODE_PROP_IMMUTABLE) > + printf(" immutable"); > + if (prop->flags& DRM_MODE_PROP_ENUM) > + printf(" enum"); > + if (prop->flags& DRM_MODE_PROP_BLOB) > + printf(" blob"); > + printf("\n"); > + > + if (prop->flags& DRM_MODE_PROP_RANGE) { > + printf("\t\tvalues:"); > + for (i = 0; i< prop->count_values; i++) > + printf(" %"PRIu64, prop->values[i]); > + printf("\n"); > + } > + > + if (prop->flags& DRM_MODE_PROP_ENUM) { > + printf("\t\tenums:"); > + for (i = 0; i< prop->count_enums; i++) > + printf(" %s=%llu", prop->enums[i].name, > + prop->enums[i].value); > + printf("\n"); > + } else { > + assert(prop->count_enums == 0); > + } > + > + if (prop->flags& DRM_MODE_PROP_BLOB) { > + printf("\t\tblobs:\n"); "\n" seems to be unnecessary. > + for (i = 0; i< prop->count_blobs; i++) > + dump_blob(prop->blob_ids[i]); > + printf("\n"); > + } else { > + assert(prop->count_blobs == 0); > + } > + > + printf("\t\tvalue:"); > + if (prop->flags& DRM_MODE_PROP_BLOB) > + dump_blob(value); Here needs printf("\n"); > + else > + printf(" %"PRIu64"\n", value); > + > + drmModeFreeProperty(prop); > +} > + > +static void listObjectProperties(uint32_t id, uint32_t type) > +{ > + unsigned int i; > + drmModeObjectPropertiesPtr props; > + > + props = drmModeObjectGetProperties(fd, id, type); > + > + if (!props) { > + printf("\tNo properties: %s.\n", strerror(errno)); > + return; > + } > + > + for (i = 0; i< props->count_props; i++) > + dump_prop(props->props[i], props->prop_values[i]); > + > + drmModeFreeObjectProperties(props); > +} > + > +static void listConnectorProperties(void) > +{ > + int i; > + drmModeConnectorPtr c; > + > + for (i = 0; i< res->count_connectors; i++) { > + c = drmModeGetConnector(fd, res->connectors[i]); > + > + if (!c) { > + fprintf(stderr, "Could not get connector %u: %s\n", > + res->connectors[i], strerror(errno)); > + continue; > + } > + > + printf("Connector %u (%s-%u)\n", c->connector_id, > + connector_type_str(c->connector_type), > + c->connector_type_id); > + > + listObjectProperties(c->connector_id, > + DRM_MODE_OBJECT_CONNECTOR); > + > + drmModeFreeConnector(c); > + } > +} > + > +static void listCrtcProperties(void) > +{ > + int i; > + drmModeCrtcPtr c; > + > + for (i = 0; i< res->count_crtcs; i++) { > + c = drmModeGetCrtc(fd, res->crtcs[i]); > + > + if (!c) { > + fprintf(stderr, "Could not get crtc %u: %s\n", > + res->crtcs[i], strerror(errno)); > + continue; > + } > + > + printf("CRTC %u\n", c->crtc_id); > + > + listObjectProperties(c->crtc_id, DRM_MODE_OBJECT_CRTC); > + > + drmModeFreeCrtc(c); > + } > +} > + > +static void listAllProperties(void) > +{ > + listConnectorProperties(); > + listCrtcProperties(); > +} > + > +static int setProperty(char *argv[]) > +{ > + uint32_t obj_id, obj_type, prop_id; > + uint64_t value; > + > + obj_id = atoi(argv[1]); > + > + if (!strcmp(argv[2], "connector")) { > + obj_type = DRM_MODE_OBJECT_CONNECTOR; > + } else if (!strcmp(argv[2], "crtc")) { > + obj_type = DRM_MODE_OBJECT_CRTC; > + } else { > + fprintf(stderr, "Invalid object type.\n"); > + return 1; > + } > + > + prop_id = atoi(argv[3]); > + value = atoll(argv[4]); > + > + return drmModeObjectSetProperty(fd, obj_id, obj_type, prop_id, value); > +} > + > +static void printUsage(void) > +{ > + printf("Usage:\n" > +" proptest\n" > +" proptest [obj id] [obj type] [prop id] [value]\n" > +"\n" > +"The first form just prints all the existing properties. The second one is\n" > +"used to set the value of a specified property. The object type can be one of\n" > +"the following strings:\n" > +" connector crtc\n" > +"\n" > +"Example:\n" > +" proptest 7 connector 2 1\n" > +"will set property 2 of connector 7 to 1\n"); > +} > + > +int main(int argc, char *argv[]) > +{ > + char *modules[] = { "i915", "radeon", "nouveau", "vmwgfx", "omapdrm" }; Please add "exynos" > + unsigned int i, ret = 0; > + > + for (i = 0; i< ARRAY_SIZE(modules); i++){ > + fd = drmOpen(modules[i], NULL); > + if (fd>= 0) { > + printf("Module %s loaded.\n", modules[i]); > + break; > + } > + } > + > + if (i == ARRAY_SIZE(modules)) { > + fprintf(stderr, "Failed to load drm modules.\n"); > + return 1; > + } > + > + res = drmModeGetResources(fd); > + if (!res) { > + fprintf(stderr, "Failed to get resources: %s\n", > + strerror(errno)); > + ret = 1; > + goto done; > + } > + > + if (argc< 2) { > + listAllProperties(); > + } else if (argc == 5) { > + ret = setProperty(argv); > + } else { > + printUsage(); > + ret = 1; > + } > + > + drmModeFreeResources(res); > +done: > + drmClose(fd); > + return ret; > +} Thanks.
diff --git a/configure.ac b/configure.ac index e6e9a9f..73558ce 100644 --- a/configure.ac +++ b/configure.ac @@ -329,6 +329,7 @@ AC_CONFIG_FILES([ tests/modeprint/Makefile tests/modetest/Makefile tests/kmstest/Makefile + tests/proptest/Makefile tests/radeon/Makefile tests/vbltest/Makefile include/Makefile diff --git a/tests/Makefile.am b/tests/Makefile.am index a3a59bd..1442854 100644 --- a/tests/Makefile.am +++ b/tests/Makefile.am @@ -10,7 +10,7 @@ check_PROGRAMS = \ dristat \ drmstat -SUBDIRS = modeprint +SUBDIRS = modeprint proptest if HAVE_LIBKMS SUBDIRS += kmstest modetest diff --git a/tests/proptest/Makefile.am b/tests/proptest/Makefile.am new file mode 100644 index 0000000..f81a3c0 --- /dev/null +++ b/tests/proptest/Makefile.am @@ -0,0 +1,11 @@ +AM_CFLAGS = \ + -I$(top_srcdir)/include/drm \ + -I$(top_srcdir) + +noinst_PROGRAMS = \ + proptest + +proptest_SOURCES = \ + proptest.c +proptest_LDADD = \ + $(top_builddir)/libdrm.la diff --git a/tests/proptest/proptest.c b/tests/proptest/proptest.c new file mode 100644 index 0000000..52896fe --- /dev/null +++ b/tests/proptest/proptest.c @@ -0,0 +1,317 @@ +/* + * Copyright (c) 2012 Intel Corporation + * + * 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 (including the next + * paragraph) 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. + * + * Authors: + * Paulo Zanoni <paulo.r.zanoni@intel.com> + * + */ + +#include <assert.h> +#include <errno.h> +#include <inttypes.h> +#include <stdlib.h> +#include <stdio.h> +#include <string.h> + +#include "xf86drm.h" +#include "xf86drmMode.h" + +#define ARRAY_SIZE(arr) (sizeof(arr) / sizeof((arr)[0])) + +int fd; +drmModeResPtr res = NULL; + +const char *connector_type_str(uint32_t type) +{ + switch (type) { + case DRM_MODE_CONNECTOR_Unknown: + return "Unknown"; + case DRM_MODE_CONNECTOR_VGA: + return "VGA"; + case DRM_MODE_CONNECTOR_DVII: + return "DVI-I"; + case DRM_MODE_CONNECTOR_DVID: + return "DVI-D"; + case DRM_MODE_CONNECTOR_DVIA: + return "DVI-A"; + case DRM_MODE_CONNECTOR_Composite: + return "Composite"; + case DRM_MODE_CONNECTOR_SVIDEO: + return "SVIDEO"; + case DRM_MODE_CONNECTOR_LVDS: + return "LVDS"; + case DRM_MODE_CONNECTOR_Component: + return "Component"; + case DRM_MODE_CONNECTOR_9PinDIN: + return "9PinDin"; + case DRM_MODE_CONNECTOR_DisplayPort: + return "DisplayPort"; + case DRM_MODE_CONNECTOR_HDMIA: + return "HDMI-A"; + case DRM_MODE_CONNECTOR_HDMIB: + return "HDMI-B"; + case DRM_MODE_CONNECTOR_TV: + return "TV"; + case DRM_MODE_CONNECTOR_eDP: + return "eDP"; + default: + return "Invalid"; + } +} + +/* dump_blob and dump_prop shamelessly copied from ../modetest/modetest.c */ +static void +dump_blob(uint32_t blob_id) +{ + uint32_t i; + unsigned char *blob_data; + drmModePropertyBlobPtr blob; + + blob = drmModeGetPropertyBlob(fd, blob_id); + if (!blob) + return; + + blob_data = blob->data; + + for (i = 0; i < blob->length; i++) { + if (i % 16 == 0) + printf("\n\t\t\t"); + printf("%.2hhx", blob_data[i]); + } + printf("\n"); + + drmModeFreePropertyBlob(blob); +} + +static void +dump_prop(uint32_t prop_id, uint64_t value) +{ + int i; + drmModePropertyPtr prop; + + prop = drmModeGetProperty(fd, prop_id); + + printf("\t%d", prop_id); + if (!prop) { + printf("\n"); + return; + } + + printf(" %s:\n", prop->name); + + printf("\t\tflags:"); + if (prop->flags & DRM_MODE_PROP_PENDING) + printf(" pending"); + if (prop->flags & DRM_MODE_PROP_RANGE) + printf(" range"); + if (prop->flags & DRM_MODE_PROP_IMMUTABLE) + printf(" immutable"); + if (prop->flags & DRM_MODE_PROP_ENUM) + printf(" enum"); + if (prop->flags & DRM_MODE_PROP_BLOB) + printf(" blob"); + printf("\n"); + + if (prop->flags & DRM_MODE_PROP_RANGE) { + printf("\t\tvalues:"); + for (i = 0; i < prop->count_values; i++) + printf(" %"PRIu64, prop->values[i]); + printf("\n"); + } + + if (prop->flags & DRM_MODE_PROP_ENUM) { + printf("\t\tenums:"); + for (i = 0; i < prop->count_enums; i++) + printf(" %s=%llu", prop->enums[i].name, + prop->enums[i].value); + printf("\n"); + } else { + assert(prop->count_enums == 0); + } + + if (prop->flags & DRM_MODE_PROP_BLOB) { + printf("\t\tblobs:\n"); + for (i = 0; i < prop->count_blobs; i++) + dump_blob(prop->blob_ids[i]); + printf("\n"); + } else { + assert(prop->count_blobs == 0); + } + + printf("\t\tvalue:"); + if (prop->flags & DRM_MODE_PROP_BLOB) + dump_blob(value); + else + printf(" %"PRIu64"\n", value); + + drmModeFreeProperty(prop); +} + +static void listObjectProperties(uint32_t id, uint32_t type) +{ + unsigned int i; + drmModeObjectPropertiesPtr props; + + props = drmModeObjectGetProperties(fd, id, type); + + if (!props) { + printf("\tNo properties: %s.\n", strerror(errno)); + return; + } + + for (i = 0; i < props->count_props; i++) + dump_prop(props->props[i], props->prop_values[i]); + + drmModeFreeObjectProperties(props); +} + +static void listConnectorProperties(void) +{ + int i; + drmModeConnectorPtr c; + + for (i = 0; i < res->count_connectors; i++) { + c = drmModeGetConnector(fd, res->connectors[i]); + + if (!c) { + fprintf(stderr, "Could not get connector %u: %s\n", + res->connectors[i], strerror(errno)); + continue; + } + + printf("Connector %u (%s-%u)\n", c->connector_id, + connector_type_str(c->connector_type), + c->connector_type_id); + + listObjectProperties(c->connector_id, + DRM_MODE_OBJECT_CONNECTOR); + + drmModeFreeConnector(c); + } +} + +static void listCrtcProperties(void) +{ + int i; + drmModeCrtcPtr c; + + for (i = 0; i < res->count_crtcs; i++) { + c = drmModeGetCrtc(fd, res->crtcs[i]); + + if (!c) { + fprintf(stderr, "Could not get crtc %u: %s\n", + res->crtcs[i], strerror(errno)); + continue; + } + + printf("CRTC %u\n", c->crtc_id); + + listObjectProperties(c->crtc_id, DRM_MODE_OBJECT_CRTC); + + drmModeFreeCrtc(c); + } +} + +static void listAllProperties(void) +{ + listConnectorProperties(); + listCrtcProperties(); +} + +static int setProperty(char *argv[]) +{ + uint32_t obj_id, obj_type, prop_id; + uint64_t value; + + obj_id = atoi(argv[1]); + + if (!strcmp(argv[2], "connector")) { + obj_type = DRM_MODE_OBJECT_CONNECTOR; + } else if (!strcmp(argv[2], "crtc")) { + obj_type = DRM_MODE_OBJECT_CRTC; + } else { + fprintf(stderr, "Invalid object type.\n"); + return 1; + } + + prop_id = atoi(argv[3]); + value = atoll(argv[4]); + + return drmModeObjectSetProperty(fd, obj_id, obj_type, prop_id, value); +} + +static void printUsage(void) +{ + printf("Usage:\n" +" proptest\n" +" proptest [obj id] [obj type] [prop id] [value]\n" +"\n" +"The first form just prints all the existing properties. The second one is\n" +"used to set the value of a specified property. The object type can be one of\n" +"the following strings:\n" +" connector crtc\n" +"\n" +"Example:\n" +" proptest 7 connector 2 1\n" +"will set property 2 of connector 7 to 1\n"); +} + +int main(int argc, char *argv[]) +{ + char *modules[] = { "i915", "radeon", "nouveau", "vmwgfx", "omapdrm" }; + unsigned int i, ret = 0; + + for (i = 0; i < ARRAY_SIZE(modules); i++){ + fd = drmOpen(modules[i], NULL); + if (fd >= 0) { + printf("Module %s loaded.\n", modules[i]); + break; + } + } + + if (i == ARRAY_SIZE(modules)) { + fprintf(stderr, "Failed to load drm modules.\n"); + return 1; + } + + res = drmModeGetResources(fd); + if (!res) { + fprintf(stderr, "Failed to get resources: %s\n", + strerror(errno)); + ret = 1; + goto done; + } + + if (argc < 2) { + listAllProperties(); + } else if (argc == 5) { + ret = setProperty(argv); + } else { + printUsage(); + ret = 1; + } + + drmModeFreeResources(res); +done: + drmClose(fd); + return ret; +}