@@ -24,9 +24,11 @@
* DEALINGS IN THE SOFTWARE.
*
* Authors: Rickard E. (Rik) Faith <faith@valinux.com>
+ * Authors: Aaron Plattner <aplattner@nvidia.com>
*
*/
+#include <inttypes.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
@@ -35,11 +37,14 @@
#include "xf86drmHash.c"
#include "xf86drm.c"
+#define ARRAY_SIZE(arr) (sizeof(arr) / sizeof((arr)[0]))
+
#define DRM_VERSION 0x00000001
#define DRM_MEMORY 0x00000002
#define DRM_CLIENTS 0x00000004
#define DRM_STATS 0x00000008
#define DRM_BUSID 0x00000010
+#define DRM_CAPS 0x00000020
static void getversion(int fd)
{
@@ -228,6 +233,65 @@ static void getstats(int fd, int i)
}
+enum cap_type {
+ CAP_BOOL,
+ CAP_UINT,
+ CAP_PRIME
+};
+
+static void printcap(enum cap_type type, uint64_t value)
+{
+ switch (type) {
+ case CAP_BOOL:
+ if (value) printf("yes");
+ else printf("no");
+ break;
+ case CAP_UINT:
+ printf("%" PRIu64, value);
+ break;
+ case CAP_PRIME:
+ if (value == 0) printf("none");
+ else {
+ if (value & DRM_PRIME_CAP_IMPORT) printf("import ");
+ if (value & DRM_PRIME_CAP_EXPORT) printf("export");
+ }
+ break;
+ }
+}
+
+static void getcaps(int fd)
+{
+ const struct {
+ uint64_t capability;
+ enum cap_type type;
+ const char *name;
+ } caps[] = {
+ { DRM_CAP_DUMB_BUFFER, CAP_BOOL, "Dumb framebuffer" },
+ { DRM_CAP_VBLANK_HIGH_CRTC, CAP_BOOL, "VBlank high crtc" },
+ { DRM_CAP_DUMB_PREFERRED_DEPTH, CAP_UINT, "Preferred depth" },
+ { DRM_CAP_DUMB_PREFER_SHADOW, CAP_BOOL, "Prefer shadow" },
+ { DRM_CAP_PRIME, CAP_PRIME, "Prime" },
+ };
+ int i;
+
+ printf(" Device capabilities:\n");
+
+ for (i = 0; i < ARRAY_SIZE(caps); i++) {
+ uint64_t value;
+ int ret = drmGetCap(fd, caps[i].capability, &value);
+
+ printf(" %s: ", caps[i].name);
+
+ if (ret) {
+ printf("<error>\n");
+ continue;
+ }
+
+ printcap(caps[i].type, value);
+ printf("\n");
+ }
+}
+
int main(int argc, char **argv)
{
int c;
@@ -238,7 +302,7 @@ int main(int argc, char **argv)
char buf[64];
int i;
- while ((c = getopt(argc, argv, "avmcsbM:i:")) != EOF)
+ while ((c = getopt(argc, argv, "avmcCsbM:i:")) != EOF)
switch (c) {
case 'a': mask = ~0; break;
case 'v': mask |= DRM_VERSION; break;
@@ -246,6 +310,7 @@ int main(int argc, char **argv)
case 'c': mask |= DRM_CLIENTS; break;
case 's': mask |= DRM_STATS; break;
case 'b': mask |= DRM_BUSID; break;
+ case 'C': mask |= DRM_CAPS; break;
case 'i': interval = strtol(optarg, NULL, 0); break;
case 'M': minor = strtol(optarg, NULL, 0); break;
default:
@@ -254,6 +319,7 @@ int main(int argc, char **argv)
fprintf( stderr, " -a Show all available information\n" );
fprintf( stderr, " -b Show DRM bus ID's\n" );
fprintf( stderr, " -c Display information about DRM clients\n" );
+ fprintf( stderr, " -C Display DRM device capabilities\n" );
fprintf( stderr, " -i [interval] Continuously display statistics every [interval] seconds\n" );
fprintf( stderr, " -v Display DRM module and card version information\n" );
fprintf( stderr, " -m Display memory use information\n" );
@@ -272,6 +338,7 @@ int main(int argc, char **argv)
if (mask & DRM_MEMORY) getvm(fd);
if (mask & DRM_CLIENTS) getclients(fd);
if (mask & DRM_STATS) getstats(fd, interval);
+ if (mask & DRM_CAPS) getcaps(fd);
close(fd);
}
}
Signed-off-by: Aaron Plattner <aplattner@nvidia.com> --- Example output of dristat -C: /dev/dri/card0 Device capabilities: Dumb framebuffer: yes VBlank high crtc: yes Preferred depth: 24 Prefer shadow: yes Prime: import export tests/dristat.c | 69 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 68 insertions(+), 1 deletion(-)