drm/i915/hdmi: HDMI source product description infoframe support
authorJesse Barnes <jbarnes@virtuousgeek.org>
Wed, 3 Aug 2011 16:22:56 +0000 (09:22 -0700)
committerKeith Packard <keithp@keithp.com>
Thu, 4 Aug 2011 00:43:15 +0000 (17:43 -0700)
Set an SPD infoframe if the sink supports it.

Signed-off-by: Jesse Barnes <jbarnes@virtuousgeek.org>
Signed-off-by: Keith Packard <keithp@keithp.com>
drivers/gpu/drm/i915/intel_drv.h
drivers/gpu/drm/i915/intel_hdmi.c

index 2f47dcf..7b330e7 100644 (file)
@@ -184,6 +184,22 @@ struct intel_crtc {
 #define DIP_VERSION_AVI 0x2
 #define DIP_LEN_AVI     13
 
+#define DIP_TYPE_SPD   0x3
+#define DIP_VERSION_SPD        0x1
+#define DIP_LEN_SPD    25
+#define DIP_SPD_UNKNOWN        0
+#define DIP_SPD_DSTB   0x1
+#define DIP_SPD_DVDP   0x2
+#define DIP_SPD_DVHS   0x3
+#define DIP_SPD_HDDVR  0x4
+#define DIP_SPD_DVC    0x5
+#define DIP_SPD_DSC    0x6
+#define DIP_SPD_VCD    0x7
+#define DIP_SPD_GAME   0x8
+#define DIP_SPD_PC     0x9
+#define DIP_SPD_BD     0xa
+#define DIP_SPD_SCD    0xb
+
 struct dip_infoframe {
        uint8_t type;           /* HB0 */
        uint8_t ver;            /* HB1 */
@@ -208,6 +224,11 @@ struct dip_infoframe {
                        uint16_t left_bar_end;
                        uint16_t right_bar_start;
                } avi;
+               struct {
+                       uint8_t vn[8];
+                       uint8_t pd[16];
+                       uint8_t sdi;
+               } spd;
                uint8_t payload[27];
        } __attribute__ ((packed)) body;
 } __attribute__((packed));
index d43cebd..226ba83 100644 (file)
@@ -201,6 +201,21 @@ static void intel_hdmi_set_avi_infoframe(struct drm_encoder *encoder)
        intel_set_infoframe(encoder, &avi_if);
 }
 
+static void intel_hdmi_set_spd_infoframe(struct drm_encoder *encoder)
+{
+       struct dip_infoframe spd_if;
+
+       memset(&spd_if, 0, sizeof(spd_if));
+       spd_if.type = DIP_TYPE_SPD;
+       spd_if.ver = DIP_VERSION_SPD;
+       spd_if.len = DIP_LEN_SPD;
+       strcpy(spd_if.body.spd.vn, "Intel");
+       strcpy(spd_if.body.spd.pd, "Integrated gfx");
+       spd_if.body.spd.sdi = DIP_SPD_PC;
+
+       intel_set_infoframe(encoder, &spd_if);
+}
+
 static void intel_hdmi_mode_set(struct drm_encoder *encoder,
                                struct drm_display_mode *mode,
                                struct drm_display_mode *adjusted_mode)
@@ -245,6 +260,7 @@ static void intel_hdmi_mode_set(struct drm_encoder *encoder,
        POSTING_READ(intel_hdmi->sdvox_reg);
 
        intel_hdmi_set_avi_infoframe(encoder);
+       intel_hdmi_set_spd_infoframe(encoder);
 }
 
 static void intel_hdmi_dpms(struct drm_encoder *encoder, int mode)