aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/radeon/evergreen_hdmi.c
diff options
context:
space:
mode:
authorThierry Reding <thierry.reding@avionic-design.de>2013-01-14 07:36:30 -0500
committerThierry Reding <thierry.reding@avionic-design.de>2013-02-22 02:20:20 -0500
commite3b2e0347e3b3b81cc322b413abf98a349d275df (patch)
tree11e6141f0a4fabc371952514a7ff61918bef4b90 /drivers/gpu/drm/radeon/evergreen_hdmi.c
parentac24c2204a76e5b42aa103bf963ae0eda1b827f3 (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.c85
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 */
59static 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 */
74static void evergreen_hdmi_videoinfoframe( 60static 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 */