drm: add more encoder interfaces
authorDave Airlie <airlied@redhat.com>
Fri, 30 May 2008 02:14:44 +0000 (12:14 +1000)
committerDave Airlie <airlied@redhat.com>
Fri, 30 May 2008 02:14:44 +0000 (12:14 +1000)
libdrm/xf86drmMode.c
libdrm/xf86drmMode.h
shared-core/drm.h

index e5798f9..672a5e2 100644 (file)
@@ -381,6 +381,8 @@ drmModeOutputPtr drmModeGetOutput(int fd, uint32_t output_id)
        out.count_props  = 0;
        out.props_ptr    = 0;
        out.prop_values_ptr = 0;
+       out.count_encoders  = 0;
+       out.encoders_ptr = 0;
 
        if (ioctl(fd, DRM_IOCTL_MODE_GETOUTPUT, &out))
                return 0;
@@ -393,6 +395,9 @@ drmModeOutputPtr drmModeGetOutput(int fd, uint32_t output_id)
        if (out.count_modes)
                out.modes_ptr = VOID2U64(drmMalloc(out.count_modes*sizeof(struct drm_mode_modeinfo)));
 
+       if (out.count_encoders)
+               out.encoders_ptr = VOID2U64(drmMalloc(out.count_encoders*sizeof(uint32_t)));
+
        if (ioctl(fd, DRM_IOCTL_MODE_GETOUTPUT, &out))
                goto err_allocs;
 
@@ -416,6 +421,8 @@ drmModeOutputPtr drmModeGetOutput(int fd, uint32_t output_id)
        r->props        = drmAllocCpy(U642VOID(out.props_ptr), out.count_props, sizeof(uint32_t));
        r->prop_values  = drmAllocCpy(U642VOID(out.prop_values_ptr), out.count_props, sizeof(uint64_t));
        r->modes        = drmAllocCpy(U642VOID(out.modes_ptr), out.count_modes, sizeof(struct drm_mode_modeinfo));
+       r->count_encoders = out.count_encoders;
+       r->encoders     = drmAllocCpy(U642VOID(out.encoders_ptr), out.count_encoders, sizeof(uint32_t));
        r->output_type  = out.output_type;
        r->output_type_id = out.output_type_id;
 
@@ -423,6 +430,7 @@ err_allocs:
        drmFree(U642VOID(out.prop_values_ptr));
        drmFree(U642VOID(out.props_ptr));
        drmFree(U642VOID(out.modes_ptr));
+       drmFree(U642VOID(out.encoders_ptr));
 
        return r;
 }
index a5ecd09..601a646 100644 (file)
@@ -154,6 +154,8 @@ typedef struct _drmModeOutput {
        uint32_t *props; /**< List of property ids */
        uint64_t *prop_values; /**< List of property values */
 
+       int count_encoders;
+       uint32_t *encoders; /**< List of encoder ids */
 } drmModeOutput, *drmModeOutputPtr;
 
 
index eb2033c..6cb6868 100644 (file)
@@ -1026,9 +1026,11 @@ struct drm_mode_card_res {
        uint64_t fb_id_ptr;
        uint64_t crtc_id_ptr;
        uint64_t output_id_ptr;
+       uint64_t encoder_id_ptr;
        int count_fbs;
        int count_crtcs;
        int count_outputs;
+       int count_encoders;
        int min_width, max_width;
        int min_height, max_height;
 };
@@ -1051,6 +1053,15 @@ struct drm_mode_crtc {
        struct drm_mode_modeinfo mode;
 };
 
+struct drm_mode_get_encoder {
+
+       uint32_t encoder_type;
+       uint32_t encoder_id;
+
+       uint32_t crtcs;
+       uint32_t clones;
+};
+
 #define DRM_MODE_OUTPUT_NONE 0
 #define DRM_MODE_OUTPUT_DAC  1
 #define DRM_MODE_OUTPUT_TMDS 2
@@ -1059,12 +1070,15 @@ struct drm_mode_crtc {
 
 struct drm_mode_get_output {
 
+       uint64_t encoders_ptr;
        uint64_t modes_ptr;
        uint64_t props_ptr;
        uint64_t prop_values_ptr;
 
        int count_modes;
        int count_props;
+       int count_encoders;
+
        unsigned int output; /**< Id */
        unsigned int crtc; /**< Id of crtc */
        unsigned int output_type;
@@ -1277,6 +1291,7 @@ struct drm_mode_hotplug {
 #define DRM_IOCTL_WAIT_HOTPLUG         DRM_IOWR(0xAE, union drm_wait_hotplug)
 
 #define DRM_IOCTL_MODE_REPLACEFB       DRM_IOWR(0xAF, struct drm_mode_fb_cmd)
+#define DRM_IOCTL_MODE_GETENCODER      DRM_IOWR(0xB0, struct drm_mode_get_encoder)
 /*@}*/
 
 /**