|
@@ -887,17 +887,24 @@ static bool intel_sdvo_set_avi_infoframe(struct intel_sdvo *intel_sdvo)
|
|
|
};
|
|
|
uint8_t tx_rate = SDVO_HBUF_TX_VSYNC;
|
|
|
uint8_t set_buf_index[2] = { 1, 0 };
|
|
|
- uint64_t *data = (uint64_t *)&avi_if;
|
|
|
+ uint8_t sdvo_data[4 + sizeof(avi_if.body.avi)];
|
|
|
+ uint64_t *data = (uint64_t *)sdvo_data;
|
|
|
unsigned i;
|
|
|
|
|
|
intel_dip_infoframe_csum(&avi_if);
|
|
|
|
|
|
+ /* sdvo spec says that the ecc is handled by the hw, and it looks like
|
|
|
+ * we must not send the ecc field, either. */
|
|
|
+ memcpy(sdvo_data, &avi_if, 3);
|
|
|
+ sdvo_data[3] = avi_if.checksum;
|
|
|
+ memcpy(&sdvo_data[4], &avi_if.body, sizeof(avi_if.body.avi));
|
|
|
+
|
|
|
if (!intel_sdvo_set_value(intel_sdvo,
|
|
|
SDVO_CMD_SET_HBUF_INDEX,
|
|
|
set_buf_index, 2))
|
|
|
return false;
|
|
|
|
|
|
- for (i = 0; i < sizeof(avi_if); i += 8) {
|
|
|
+ for (i = 0; i < sizeof(sdvo_data); i += 8) {
|
|
|
if (!intel_sdvo_set_value(intel_sdvo,
|
|
|
SDVO_CMD_SET_HBUF_DATA,
|
|
|
data, 8))
|