diff options
| -rw-r--r-- | drivers/gpu/drm/i915/intel_sdvo.c | 62 | ||||
| -rw-r--r-- | drivers/gpu/drm/i915/intel_sdvo_regs.h | 2 |
2 files changed, 44 insertions, 20 deletions
diff --git a/drivers/gpu/drm/i915/intel_sdvo.c b/drivers/gpu/drm/i915/intel_sdvo.c index c01d97db0061..79d308da29ff 100644 --- a/drivers/gpu/drm/i915/intel_sdvo.c +++ b/drivers/gpu/drm/i915/intel_sdvo.c | |||
| @@ -894,6 +894,45 @@ static void intel_sdvo_dump_hdmi_buf(struct intel_sdvo *intel_sdvo) | |||
| 894 | } | 894 | } |
| 895 | #endif | 895 | #endif |
| 896 | 896 | ||
| 897 | static bool intel_sdvo_write_infoframe(struct intel_sdvo *intel_sdvo, | ||
| 898 | unsigned if_index, uint8_t tx_rate, | ||
| 899 | uint8_t *data, unsigned length) | ||
| 900 | { | ||
| 901 | uint8_t set_buf_index[2] = { if_index, 0 }; | ||
| 902 | uint8_t hbuf_size, tmp[8]; | ||
| 903 | int i; | ||
| 904 | |||
| 905 | if (!intel_sdvo_set_value(intel_sdvo, | ||
| 906 | SDVO_CMD_SET_HBUF_INDEX, | ||
| 907 | set_buf_index, 2)) | ||
| 908 | return false; | ||
| 909 | |||
| 910 | if (!intel_sdvo_get_value(intel_sdvo, SDVO_CMD_GET_HBUF_INFO, | ||
| 911 | &hbuf_size, 1)) | ||
| 912 | return false; | ||
| 913 | |||
| 914 | /* Buffer size is 0 based, hooray! */ | ||
| 915 | hbuf_size++; | ||
| 916 | |||
| 917 | DRM_DEBUG_KMS("writing sdvo hbuf: %i, hbuf_size %i, hbuf_size: %i\n", | ||
| 918 | if_index, length, hbuf_size); | ||
| 919 | |||
| 920 | for (i = 0; i < hbuf_size; i += 8) { | ||
| 921 | memset(tmp, 0, 8); | ||
| 922 | if (i < length) | ||
| 923 | memcpy(tmp, data + i, min_t(unsigned, 8, length - i)); | ||
| 924 | |||
| 925 | if (!intel_sdvo_set_value(intel_sdvo, | ||
| 926 | SDVO_CMD_SET_HBUF_DATA, | ||
| 927 | tmp, 8)) | ||
| 928 | return false; | ||
| 929 | } | ||
| 930 | |||
| 931 | return intel_sdvo_set_value(intel_sdvo, | ||
| 932 | SDVO_CMD_SET_HBUF_TXRATE, | ||
| 933 | &tx_rate, 1); | ||
| 934 | } | ||
| 935 | |||
| 897 | static bool intel_sdvo_set_avi_infoframe(struct intel_sdvo *intel_sdvo) | 936 | static bool intel_sdvo_set_avi_infoframe(struct intel_sdvo *intel_sdvo) |
| 898 | { | 937 | { |
| 899 | struct dip_infoframe avi_if = { | 938 | struct dip_infoframe avi_if = { |
| @@ -901,11 +940,7 @@ static bool intel_sdvo_set_avi_infoframe(struct intel_sdvo *intel_sdvo) | |||
| 901 | .ver = DIP_VERSION_AVI, | 940 | .ver = DIP_VERSION_AVI, |
| 902 | .len = DIP_LEN_AVI, | 941 | .len = DIP_LEN_AVI, |
| 903 | }; | 942 | }; |
| 904 | uint8_t tx_rate = SDVO_HBUF_TX_VSYNC; | ||
| 905 | uint8_t set_buf_index[2] = { 1, 0 }; | ||
| 906 | uint8_t sdvo_data[4 + sizeof(avi_if.body.avi)]; | 943 | uint8_t sdvo_data[4 + sizeof(avi_if.body.avi)]; |
| 907 | uint64_t *data = (uint64_t *)sdvo_data; | ||
| 908 | unsigned i; | ||
| 909 | 944 | ||
| 910 | intel_dip_infoframe_csum(&avi_if); | 945 | intel_dip_infoframe_csum(&avi_if); |
| 911 | 946 | ||
| @@ -915,22 +950,9 @@ static bool intel_sdvo_set_avi_infoframe(struct intel_sdvo *intel_sdvo) | |||
| 915 | sdvo_data[3] = avi_if.checksum; | 950 | sdvo_data[3] = avi_if.checksum; |
| 916 | memcpy(&sdvo_data[4], &avi_if.body, sizeof(avi_if.body.avi)); | 951 | memcpy(&sdvo_data[4], &avi_if.body, sizeof(avi_if.body.avi)); |
| 917 | 952 | ||
| 918 | if (!intel_sdvo_set_value(intel_sdvo, | 953 | return intel_sdvo_write_infoframe(intel_sdvo, SDVO_HBUF_INDEX_AVI_IF, |
| 919 | SDVO_CMD_SET_HBUF_INDEX, | 954 | SDVO_HBUF_TX_VSYNC, |
| 920 | set_buf_index, 2)) | 955 | sdvo_data, sizeof(sdvo_data)); |
| 921 | return false; | ||
| 922 | |||
| 923 | for (i = 0; i < sizeof(sdvo_data); i += 8) { | ||
| 924 | if (!intel_sdvo_set_value(intel_sdvo, | ||
| 925 | SDVO_CMD_SET_HBUF_DATA, | ||
| 926 | data, 8)) | ||
| 927 | return false; | ||
| 928 | data++; | ||
| 929 | } | ||
| 930 | |||
| 931 | return intel_sdvo_set_value(intel_sdvo, | ||
| 932 | SDVO_CMD_SET_HBUF_TXRATE, | ||
| 933 | &tx_rate, 1); | ||
| 934 | } | 956 | } |
| 935 | 957 | ||
| 936 | static bool intel_sdvo_set_tv_format(struct intel_sdvo *intel_sdvo) | 958 | static bool intel_sdvo_set_tv_format(struct intel_sdvo *intel_sdvo) |
diff --git a/drivers/gpu/drm/i915/intel_sdvo_regs.h b/drivers/gpu/drm/i915/intel_sdvo_regs.h index 9d030142ee43..770bdd6ecd9f 100644 --- a/drivers/gpu/drm/i915/intel_sdvo_regs.h +++ b/drivers/gpu/drm/i915/intel_sdvo_regs.h | |||
| @@ -708,6 +708,8 @@ struct intel_sdvo_enhancements_arg { | |||
| 708 | #define SDVO_CMD_SET_AUDIO_STAT 0x91 | 708 | #define SDVO_CMD_SET_AUDIO_STAT 0x91 |
| 709 | #define SDVO_CMD_GET_AUDIO_STAT 0x92 | 709 | #define SDVO_CMD_GET_AUDIO_STAT 0x92 |
| 710 | #define SDVO_CMD_SET_HBUF_INDEX 0x93 | 710 | #define SDVO_CMD_SET_HBUF_INDEX 0x93 |
| 711 | #define SDVO_HBUF_INDEX_ELD 0 | ||
| 712 | #define SDVO_HBUF_INDEX_AVI_IF 1 | ||
| 711 | #define SDVO_CMD_GET_HBUF_INDEX 0x94 | 713 | #define SDVO_CMD_GET_HBUF_INDEX 0x94 |
| 712 | #define SDVO_CMD_GET_HBUF_INFO 0x95 | 714 | #define SDVO_CMD_GET_HBUF_INFO 0x95 |
| 713 | #define SDVO_CMD_SET_HBUF_AV_SPLIT 0x96 | 715 | #define SDVO_CMD_SET_HBUF_AV_SPLIT 0x96 |
