diff options
author | Thierry Reding <thierry.reding@avionic-design.de> | 2013-01-14 07:36:30 -0500 |
---|---|---|
committer | Thierry Reding <thierry.reding@avionic-design.de> | 2013-02-22 02:20:20 -0500 |
commit | e3b2e0347e3b3b81cc322b413abf98a349d275df (patch) | |
tree | 11e6141f0a4fabc371952514a7ff61918bef4b90 /drivers/gpu/drm/radeon/evergreen_hdmi.c | |
parent | ac24c2204a76e5b42aa103bf963ae0eda1b827f3 (diff) |
drm/radeon: Use generic HDMI infoframe helpers
Use the generic HDMI infoframe helpers to get rid of the duplicate
implementation in the radeon driver.
Signed-off-by: Thierry Reding <thierry.reding@avionic-design.de>
Reviewed-by: Alex Deucher <alexander.deucher@amd.com>
Diffstat (limited to 'drivers/gpu/drm/radeon/evergreen_hdmi.c')
-rw-r--r-- | drivers/gpu/drm/radeon/evergreen_hdmi.c | 85 |
1 files changed, 19 insertions, 66 deletions
diff --git a/drivers/gpu/drm/radeon/evergreen_hdmi.c b/drivers/gpu/drm/radeon/evergreen_hdmi.c index 327c08b54180..4fdecc2b4040 100644 --- a/drivers/gpu/drm/radeon/evergreen_hdmi.c +++ b/drivers/gpu/drm/radeon/evergreen_hdmi.c | |||
@@ -24,6 +24,7 @@ | |||
24 | * Authors: Christian König | 24 | * Authors: Christian König |
25 | * Rafał Miłecki | 25 | * Rafał Miłecki |
26 | */ | 26 | */ |
27 | #include <linux/hdmi.h> | ||
27 | #include <drm/drmP.h> | 28 | #include <drm/drmP.h> |
28 | #include <drm/radeon_drm.h> | 29 | #include <drm/radeon_drm.h> |
29 | #include "radeon.h" | 30 | #include "radeon.h" |
@@ -54,79 +55,18 @@ static void evergreen_hdmi_update_ACR(struct drm_encoder *encoder, uint32_t cloc | |||
54 | } | 55 | } |
55 | 56 | ||
56 | /* | 57 | /* |
57 | * calculate the crc for a given info frame | ||
58 | */ | ||
59 | static void evergreen_hdmi_infoframe_checksum(uint8_t packetType, | ||
60 | uint8_t versionNumber, | ||
61 | uint8_t length, | ||
62 | uint8_t *frame) | ||
63 | { | ||
64 | int i; | ||
65 | frame[0] = packetType + versionNumber + length; | ||
66 | for (i = 1; i <= length; i++) | ||
67 | frame[0] += frame[i]; | ||
68 | frame[0] = 0x100 - frame[0]; | ||
69 | } | ||
70 | |||
71 | /* | ||
72 | * build a HDMI Video Info Frame | 58 | * build a HDMI Video Info Frame |
73 | */ | 59 | */ |
74 | static void evergreen_hdmi_videoinfoframe( | 60 | static void evergreen_hdmi_update_avi_infoframe(struct drm_encoder *encoder, |
75 | struct drm_encoder *encoder, | 61 | void *buffer, size_t size) |
76 | uint8_t color_format, | ||
77 | int active_information_present, | ||
78 | uint8_t active_format_aspect_ratio, | ||
79 | uint8_t scan_information, | ||
80 | uint8_t colorimetry, | ||
81 | uint8_t ex_colorimetry, | ||
82 | uint8_t quantization, | ||
83 | int ITC, | ||
84 | uint8_t picture_aspect_ratio, | ||
85 | uint8_t video_format_identification, | ||
86 | uint8_t pixel_repetition, | ||
87 | uint8_t non_uniform_picture_scaling, | ||
88 | uint8_t bar_info_data_valid, | ||
89 | uint16_t top_bar, | ||
90 | uint16_t bottom_bar, | ||
91 | uint16_t left_bar, | ||
92 | uint16_t right_bar | ||
93 | ) | ||
94 | { | 62 | { |
95 | struct drm_device *dev = encoder->dev; | 63 | struct drm_device *dev = encoder->dev; |
96 | struct radeon_device *rdev = dev->dev_private; | 64 | struct radeon_device *rdev = dev->dev_private; |
97 | struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder); | 65 | struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder); |
98 | struct radeon_encoder_atom_dig *dig = radeon_encoder->enc_priv; | 66 | struct radeon_encoder_atom_dig *dig = radeon_encoder->enc_priv; |
99 | uint32_t offset = dig->afmt->offset; | 67 | uint32_t offset = dig->afmt->offset; |
68 | uint8_t *frame = buffer + 3; | ||
100 | 69 | ||
101 | uint8_t frame[14]; | ||
102 | |||
103 | frame[0x0] = 0; | ||
104 | frame[0x1] = | ||
105 | (scan_information & 0x3) | | ||
106 | ((bar_info_data_valid & 0x3) << 2) | | ||
107 | ((active_information_present & 0x1) << 4) | | ||
108 | ((color_format & 0x3) << 5); | ||
109 | frame[0x2] = | ||
110 | (active_format_aspect_ratio & 0xF) | | ||
111 | ((picture_aspect_ratio & 0x3) << 4) | | ||
112 | ((colorimetry & 0x3) << 6); | ||
113 | frame[0x3] = | ||
114 | (non_uniform_picture_scaling & 0x3) | | ||
115 | ((quantization & 0x3) << 2) | | ||
116 | ((ex_colorimetry & 0x7) << 4) | | ||
117 | ((ITC & 0x1) << 7); | ||
118 | frame[0x4] = (video_format_identification & 0x7F); | ||
119 | frame[0x5] = (pixel_repetition & 0xF); | ||
120 | frame[0x6] = (top_bar & 0xFF); | ||
121 | frame[0x7] = (top_bar >> 8); | ||
122 | frame[0x8] = (bottom_bar & 0xFF); | ||
123 | frame[0x9] = (bottom_bar >> 8); | ||
124 | frame[0xA] = (left_bar & 0xFF); | ||
125 | frame[0xB] = (left_bar >> 8); | ||
126 | frame[0xC] = (right_bar & 0xFF); | ||
127 | frame[0xD] = (right_bar >> 8); | ||
128 | |||
129 | evergreen_hdmi_infoframe_checksum(0x82, 0x02, 0x0D, frame); | ||
130 | /* Our header values (type, version, length) should be alright, Intel | 70 | /* Our header values (type, version, length) should be alright, Intel |
131 | * is using the same. Checksum function also seems to be OK, it works | 71 | * is using the same. Checksum function also seems to be OK, it works |
132 | * fine for audio infoframe. However calculated value is always lower | 72 | * fine for audio infoframe. However calculated value is always lower |
@@ -154,7 +94,10 @@ void evergreen_hdmi_setmode(struct drm_encoder *encoder, struct drm_display_mode | |||
154 | struct radeon_device *rdev = dev->dev_private; | 94 | struct radeon_device *rdev = dev->dev_private; |
155 | struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder); | 95 | struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder); |
156 | struct radeon_encoder_atom_dig *dig = radeon_encoder->enc_priv; | 96 | struct radeon_encoder_atom_dig *dig = radeon_encoder->enc_priv; |
97 | u8 buffer[HDMI_INFOFRAME_HEADER_SIZE + HDMI_AVI_INFOFRAME_SIZE]; | ||
98 | struct hdmi_avi_infoframe frame; | ||
157 | uint32_t offset; | 99 | uint32_t offset; |
100 | ssize_t err; | ||
158 | 101 | ||
159 | /* Silent, r600_hdmi_enable will raise WARN for us */ | 102 | /* Silent, r600_hdmi_enable will raise WARN for us */ |
160 | if (!dig->afmt->enabled) | 103 | if (!dig->afmt->enabled) |
@@ -200,9 +143,19 @@ void evergreen_hdmi_setmode(struct drm_encoder *encoder, struct drm_display_mode | |||
200 | 143 | ||
201 | WREG32(HDMI_GC + offset, 0); /* unset HDMI_GC_AVMUTE */ | 144 | WREG32(HDMI_GC + offset, 0); /* unset HDMI_GC_AVMUTE */ |
202 | 145 | ||
203 | evergreen_hdmi_videoinfoframe(encoder, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, | 146 | err = drm_hdmi_avi_infoframe_from_display_mode(&frame, mode); |
204 | 0, 0, 0, 0, 0, 0); | 147 | if (err < 0) { |
148 | DRM_ERROR("failed to setup AVI infoframe: %zd\n", err); | ||
149 | return; | ||
150 | } | ||
151 | |||
152 | err = hdmi_avi_infoframe_pack(&frame, buffer, sizeof(buffer)); | ||
153 | if (err < 0) { | ||
154 | DRM_ERROR("failed to pack AVI infoframe: %zd\n", err); | ||
155 | return; | ||
156 | } | ||
205 | 157 | ||
158 | evergreen_hdmi_update_avi_infoframe(encoder, buffer, sizeof(buffer)); | ||
206 | evergreen_hdmi_update_ACR(encoder, mode->clock); | 159 | evergreen_hdmi_update_ACR(encoder, mode->clock); |
207 | 160 | ||
208 | /* it's unknown what these bits do excatly, but it's indeed quite useful for debugging */ | 161 | /* it's unknown what these bits do excatly, but it's indeed quite useful for debugging */ |