diff options
-rw-r--r-- | drivers/gpu/drm/i915/intel_drv.h | 4 | ||||
-rw-r--r-- | drivers/gpu/drm/i915/intel_sdvo.c | 11 |
2 files changed, 11 insertions, 4 deletions
diff --git a/drivers/gpu/drm/i915/intel_drv.h b/drivers/gpu/drm/i915/intel_drv.h index d51f27faa202..3e0918834e7e 100644 --- a/drivers/gpu/drm/i915/intel_drv.h +++ b/drivers/gpu/drm/i915/intel_drv.h | |||
@@ -280,12 +280,12 @@ struct dip_infoframe { | |||
280 | uint16_t bottom_bar_start; | 280 | uint16_t bottom_bar_start; |
281 | uint16_t left_bar_end; | 281 | uint16_t left_bar_end; |
282 | uint16_t right_bar_start; | 282 | uint16_t right_bar_start; |
283 | } avi; | 283 | } __attribute__ ((packed)) avi; |
284 | struct { | 284 | struct { |
285 | uint8_t vn[8]; | 285 | uint8_t vn[8]; |
286 | uint8_t pd[16]; | 286 | uint8_t pd[16]; |
287 | uint8_t sdi; | 287 | uint8_t sdi; |
288 | } spd; | 288 | } __attribute__ ((packed)) spd; |
289 | uint8_t payload[27]; | 289 | uint8_t payload[27]; |
290 | } __attribute__ ((packed)) body; | 290 | } __attribute__ ((packed)) body; |
291 | } __attribute__((packed)); | 291 | } __attribute__((packed)); |
diff --git a/drivers/gpu/drm/i915/intel_sdvo.c b/drivers/gpu/drm/i915/intel_sdvo.c index 7d3f238e8265..125228e77c50 100644 --- a/drivers/gpu/drm/i915/intel_sdvo.c +++ b/drivers/gpu/drm/i915/intel_sdvo.c | |||
@@ -887,17 +887,24 @@ static bool intel_sdvo_set_avi_infoframe(struct intel_sdvo *intel_sdvo) | |||
887 | }; | 887 | }; |
888 | uint8_t tx_rate = SDVO_HBUF_TX_VSYNC; | 888 | uint8_t tx_rate = SDVO_HBUF_TX_VSYNC; |
889 | uint8_t set_buf_index[2] = { 1, 0 }; | 889 | uint8_t set_buf_index[2] = { 1, 0 }; |
890 | uint64_t *data = (uint64_t *)&avi_if; | 890 | uint8_t sdvo_data[4 + sizeof(avi_if.body.avi)]; |
891 | uint64_t *data = (uint64_t *)sdvo_data; | ||
891 | unsigned i; | 892 | unsigned i; |
892 | 893 | ||
893 | intel_dip_infoframe_csum(&avi_if); | 894 | intel_dip_infoframe_csum(&avi_if); |
894 | 895 | ||
896 | /* sdvo spec says that the ecc is handled by the hw, and it looks like | ||
897 | * we must not send the ecc field, either. */ | ||
898 | memcpy(sdvo_data, &avi_if, 3); | ||
899 | sdvo_data[3] = avi_if.checksum; | ||
900 | memcpy(&sdvo_data[4], &avi_if.body, sizeof(avi_if.body.avi)); | ||
901 | |||
895 | if (!intel_sdvo_set_value(intel_sdvo, | 902 | if (!intel_sdvo_set_value(intel_sdvo, |
896 | SDVO_CMD_SET_HBUF_INDEX, | 903 | SDVO_CMD_SET_HBUF_INDEX, |
897 | set_buf_index, 2)) | 904 | set_buf_index, 2)) |
898 | return false; | 905 | return false; |
899 | 906 | ||
900 | for (i = 0; i < sizeof(avi_if); i += 8) { | 907 | for (i = 0; i < sizeof(sdvo_data); i += 8) { |
901 | if (!intel_sdvo_set_value(intel_sdvo, | 908 | if (!intel_sdvo_set_value(intel_sdvo, |
902 | SDVO_CMD_SET_HBUF_DATA, | 909 | SDVO_CMD_SET_HBUF_DATA, |
903 | data, 8)) | 910 | data, 8)) |