From 16a8f824face8067029ef6f3d10f1723d87b23f6 Mon Sep 17 00:00:00 2001
From: Dave Airlie <airlied@redhat.com>
Date: Fri, 30 May 2008 12:10:01 +1000
Subject: libdrm: add encoder retrival

---
 libdrm/xf86drmMode.c | 27 +++++++++++++++++++++++++++
 libdrm/xf86drmMode.h | 15 +++++++++++++++
 2 files changed, 42 insertions(+)

diff --git a/libdrm/xf86drmMode.c b/libdrm/xf86drmMode.c
index ae15fd65..e5798f96 100644
--- a/libdrm/xf86drmMode.c
+++ b/libdrm/xf86drmMode.c
@@ -139,6 +139,8 @@ drmModeResPtr drmModeGetResources(int fd)
 		res.crtc_id_ptr = VOID2U64(drmMalloc(res.count_crtcs*sizeof(uint32_t)));
 	if (res.count_outputs)
 		res.output_id_ptr = VOID2U64(drmMalloc(res.count_outputs*sizeof(uint32_t)));
+	if (res.count_encoders)
+		res.encoder_id_ptr = VOID2U64(drmMalloc(res.count_encoders*sizeof(uint32_t)));
 
 	if (ioctl(fd, DRM_IOCTL_MODE_GETRESOURCES, &res)) {
 		r = NULL;
@@ -164,11 +166,13 @@ drmModeResPtr drmModeGetResources(int fd)
 	r->fbs           = drmAllocCpy(U642VOID(res.fb_id_ptr), res.count_fbs, sizeof(uint32_t));
 	r->crtcs         = drmAllocCpy(U642VOID(res.crtc_id_ptr), res.count_crtcs, sizeof(uint32_t));
 	r->outputs       = drmAllocCpy(U642VOID(res.output_id_ptr), res.count_outputs, sizeof(uint32_t));
+	r->encoders      = drmAllocCpy(U642VOID(res.encoder_id_ptr), res.count_encoders, sizeof(uint32_t));
 
 err_allocs:
 	drmFree(U642VOID(res.fb_id_ptr));
 	drmFree(U642VOID(res.crtc_id_ptr));
 	drmFree(U642VOID(res.output_id_ptr));
+	drmFree(U642VOID(res.encoder_id_ptr));
 
 	return r;
 }
@@ -333,6 +337,29 @@ int drmModeMoveCursor(int fd, uint32_t crtcId, int x, int y)
 	return ioctl(fd, DRM_IOCTL_MODE_CURSOR, &arg);
 }
 
+/*
+ * Encoder get 
+ */
+drmModeEncoderPtr drmModeGetEncoder(int fd, uint32_t encoder_id)
+{
+	struct drm_mode_get_encoder enc;
+	drmModeEncoderPtr r = NULL;
+
+	enc.encoder_id = encoder_id;
+	enc.encoder_type = 0;
+	enc.crtcs = 0;
+	enc.clones = 0;
+
+	if (ioctl(fd, DRM_IOCTL_MODE_GETENCODER, &enc))
+		return 0;
+
+	r->encoder_type = enc.encoder_type;
+	r->crtcs = enc.crtcs;
+	r->clones = enc.clones;
+
+	return r;
+}
+
 /*
  * Output manipulation
  */
diff --git a/libdrm/xf86drmMode.h b/libdrm/xf86drmMode.h
index 5171b592..a5ecd099 100644
--- a/libdrm/xf86drmMode.h
+++ b/libdrm/xf86drmMode.h
@@ -63,6 +63,9 @@ typedef struct _drmModeRes {
 	int count_outputs;
 	uint32_t *outputs;
 
+	int count_encoders;
+	uint32_t *encoders;
+
 	uint32_t min_width, max_width;
 	uint32_t min_height, max_height;
 } drmModeRes, *drmModeResPtr;
@@ -106,6 +109,13 @@ typedef struct _drmModeCrtc {
 
 } drmModeCrtc, *drmModeCrtcPtr;
 
+typedef struct _drmModeEncoder {
+	unsigned int encoder_id;
+	unsigned int encoder_type;
+	uint32_t crtcs;
+	uint32_t clones;
+} drmModeEncoder, *drmModeEncoderPtr;
+
 typedef enum {
 	DRM_MODE_CONNECTED         = 1,
 	DRM_MODE_DISCONNECTED      = 2,
@@ -221,6 +231,11 @@ int drmModeSetCursor(int fd, uint32_t crtcId, uint32_t bo_handle, uint32_t width
  */
 int drmModeMoveCursor(int fd, uint32_t crtcId, int x, int y);
 
+/**
+ * Encoder functions
+ */
+drmModeEncoderPtr drmModeGetEncoder(int fd, uint32_t encoder_id);
+
 /*
  * Output manipulation
  */
-- 
cgit v1.2.3