]> CyberLeo.Net >> Repos - FreeBSD/releng/10.0.git/blob - sys/dev/drm2/radeon/radeon_encoders.c
- Copy stable/10 (r259064) to releng/10.0 as part of the
[FreeBSD/releng/10.0.git] / sys / dev / drm2 / radeon / radeon_encoders.c
1 /*
2  * Copyright 2007-8 Advanced Micro Devices, Inc.
3  * Copyright 2008 Red Hat Inc.
4  *
5  * Permission is hereby granted, free of charge, to any person obtaining a
6  * copy of this software and associated documentation files (the "Software"),
7  * to deal in the Software without restriction, including without limitation
8  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
9  * and/or sell copies of the Software, and to permit persons to whom the
10  * Software is furnished to do so, subject to the following conditions:
11  *
12  * The above copyright notice and this permission notice shall be included in
13  * all copies or substantial portions of the Software.
14  *
15  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
18  * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
19  * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
20  * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
21  * OTHER DEALINGS IN THE SOFTWARE.
22  *
23  * Authors: Dave Airlie
24  *          Alex Deucher
25  */
26
27 #include <sys/cdefs.h>
28 __FBSDID("$FreeBSD$");
29
30 #include <dev/drm2/drmP.h>
31 #include <dev/drm2/drm_crtc_helper.h>
32 #include <dev/drm2/radeon/radeon_drm.h>
33 #include "radeon.h"
34 #include "atom.h"
35
36
37 static uint32_t radeon_encoder_clones(struct drm_encoder *encoder)
38 {
39         struct drm_device *dev = encoder->dev;
40         struct radeon_device *rdev = dev->dev_private;
41         struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder);
42         struct drm_encoder *clone_encoder;
43         uint32_t index_mask = 0;
44         int count;
45
46         /* DIG routing gets problematic */
47         if (rdev->family >= CHIP_R600)
48                 return index_mask;
49         /* LVDS/TV are too wacky */
50         if (radeon_encoder->devices & ATOM_DEVICE_LCD_SUPPORT)
51                 return index_mask;
52         /* DVO requires 2x ppll clocks depending on tmds chip */
53         if (radeon_encoder->devices & ATOM_DEVICE_DFP2_SUPPORT)
54                 return index_mask;
55
56         count = -1;
57         list_for_each_entry(clone_encoder, &dev->mode_config.encoder_list, head) {
58                 struct radeon_encoder *radeon_clone = to_radeon_encoder(clone_encoder);
59                 count++;
60
61                 if (clone_encoder == encoder)
62                         continue;
63                 if (radeon_clone->devices & (ATOM_DEVICE_LCD_SUPPORT))
64                         continue;
65                 if (radeon_clone->devices & ATOM_DEVICE_DFP2_SUPPORT)
66                         continue;
67                 else
68                         index_mask |= (1 << count);
69         }
70         return index_mask;
71 }
72
73 void radeon_setup_encoder_clones(struct drm_device *dev)
74 {
75         struct drm_encoder *encoder;
76
77         list_for_each_entry(encoder, &dev->mode_config.encoder_list, head) {
78                 encoder->possible_clones = radeon_encoder_clones(encoder);
79         }
80 }
81
82 uint32_t
83 radeon_get_encoder_enum(struct drm_device *dev, uint32_t supported_device, uint8_t dac)
84 {
85         struct radeon_device *rdev = dev->dev_private;
86         uint32_t ret = 0;
87
88         switch (supported_device) {
89         case ATOM_DEVICE_CRT1_SUPPORT:
90         case ATOM_DEVICE_TV1_SUPPORT:
91         case ATOM_DEVICE_TV2_SUPPORT:
92         case ATOM_DEVICE_CRT2_SUPPORT:
93         case ATOM_DEVICE_CV_SUPPORT:
94                 switch (dac) {
95                 case 1: /* dac a */
96                         if ((rdev->family == CHIP_RS300) ||
97                             (rdev->family == CHIP_RS400) ||
98                             (rdev->family == CHIP_RS480))
99                                 ret = ENCODER_INTERNAL_DAC2_ENUM_ID1;
100                         else if (ASIC_IS_AVIVO(rdev))
101                                 ret = ENCODER_INTERNAL_KLDSCP_DAC1_ENUM_ID1;
102                         else
103                                 ret = ENCODER_INTERNAL_DAC1_ENUM_ID1;
104                         break;
105                 case 2: /* dac b */
106                         if (ASIC_IS_AVIVO(rdev))
107                                 ret = ENCODER_INTERNAL_KLDSCP_DAC2_ENUM_ID1;
108                         else {
109                                 /*if (rdev->family == CHIP_R200)
110                                   ret = ENCODER_INTERNAL_DVO1_ENUM_ID1;
111                                   else*/
112                                 ret = ENCODER_INTERNAL_DAC2_ENUM_ID1;
113                         }
114                         break;
115                 case 3: /* external dac */
116                         if (ASIC_IS_AVIVO(rdev))
117                                 ret = ENCODER_INTERNAL_KLDSCP_DVO1_ENUM_ID1;
118                         else
119                                 ret = ENCODER_INTERNAL_DVO1_ENUM_ID1;
120                         break;
121                 }
122                 break;
123         case ATOM_DEVICE_LCD1_SUPPORT:
124                 if (ASIC_IS_AVIVO(rdev))
125                         ret = ENCODER_INTERNAL_LVTM1_ENUM_ID1;
126                 else
127                         ret = ENCODER_INTERNAL_LVDS_ENUM_ID1;
128                 break;
129         case ATOM_DEVICE_DFP1_SUPPORT:
130                 if ((rdev->family == CHIP_RS300) ||
131                     (rdev->family == CHIP_RS400) ||
132                     (rdev->family == CHIP_RS480))
133                         ret = ENCODER_INTERNAL_DVO1_ENUM_ID1;
134                 else if (ASIC_IS_AVIVO(rdev))
135                         ret = ENCODER_INTERNAL_KLDSCP_TMDS1_ENUM_ID1;
136                 else
137                         ret = ENCODER_INTERNAL_TMDS1_ENUM_ID1;
138                 break;
139         case ATOM_DEVICE_LCD2_SUPPORT:
140         case ATOM_DEVICE_DFP2_SUPPORT:
141                 if ((rdev->family == CHIP_RS600) ||
142                     (rdev->family == CHIP_RS690) ||
143                     (rdev->family == CHIP_RS740))
144                         ret = ENCODER_INTERNAL_DDI_ENUM_ID1;
145                 else if (ASIC_IS_AVIVO(rdev))
146                         ret = ENCODER_INTERNAL_KLDSCP_DVO1_ENUM_ID1;
147                 else
148                         ret = ENCODER_INTERNAL_DVO1_ENUM_ID1;
149                 break;
150         case ATOM_DEVICE_DFP3_SUPPORT:
151                 ret = ENCODER_INTERNAL_LVTM1_ENUM_ID1;
152                 break;
153         }
154
155         return ret;
156 }
157
158 void
159 radeon_link_encoder_connector(struct drm_device *dev)
160 {
161         struct radeon_device *rdev = dev->dev_private;
162         struct drm_connector *connector;
163         struct radeon_connector *radeon_connector;
164         struct drm_encoder *encoder;
165         struct radeon_encoder *radeon_encoder;
166
167         /* walk the list and link encoders to connectors */
168         list_for_each_entry(connector, &dev->mode_config.connector_list, head) {
169                 radeon_connector = to_radeon_connector(connector);
170                 list_for_each_entry(encoder, &dev->mode_config.encoder_list, head) {
171                         radeon_encoder = to_radeon_encoder(encoder);
172                         if (radeon_encoder->devices & radeon_connector->devices) {
173                                 drm_mode_connector_attach_encoder(connector, encoder);
174                                 if (radeon_encoder->devices & (ATOM_DEVICE_LCD_SUPPORT)) {
175                                         if (rdev->is_atom_bios)
176                                                 radeon_atom_backlight_init(radeon_encoder, connector);
177                                         else
178                                                 radeon_legacy_backlight_init(radeon_encoder, connector);
179                                         rdev->mode_info.bl_encoder = radeon_encoder;
180                                 }
181                         }
182                 }
183         }
184 }
185
186 void radeon_encoder_set_active_device(struct drm_encoder *encoder)
187 {
188         struct drm_device *dev = encoder->dev;
189         struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder);
190         struct drm_connector *connector;
191
192         list_for_each_entry(connector, &dev->mode_config.connector_list, head) {
193                 if (connector->encoder == encoder) {
194                         struct radeon_connector *radeon_connector = to_radeon_connector(connector);
195                         radeon_encoder->active_device = radeon_encoder->devices & radeon_connector->devices;
196                         DRM_DEBUG_KMS("setting active device to %08x from %08x %08x for encoder %d\n",
197                                   radeon_encoder->active_device, radeon_encoder->devices,
198                                   radeon_connector->devices, encoder->encoder_type);
199                 }
200         }
201 }
202
203 struct drm_connector *
204 radeon_get_connector_for_encoder(struct drm_encoder *encoder)
205 {
206         struct drm_device *dev = encoder->dev;
207         struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder);
208         struct drm_connector *connector;
209         struct radeon_connector *radeon_connector;
210
211         list_for_each_entry(connector, &dev->mode_config.connector_list, head) {
212                 radeon_connector = to_radeon_connector(connector);
213                 if (radeon_encoder->active_device & radeon_connector->devices)
214                         return connector;
215         }
216         return NULL;
217 }
218
219 struct drm_connector *
220 radeon_get_connector_for_encoder_init(struct drm_encoder *encoder)
221 {
222         struct drm_device *dev = encoder->dev;
223         struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder);
224         struct drm_connector *connector;
225         struct radeon_connector *radeon_connector;
226
227         list_for_each_entry(connector, &dev->mode_config.connector_list, head) {
228                 radeon_connector = to_radeon_connector(connector);
229                 if (radeon_encoder->devices & radeon_connector->devices)
230                         return connector;
231         }
232         return NULL;
233 }
234
235 struct drm_encoder *radeon_get_external_encoder(struct drm_encoder *encoder)
236 {
237         struct drm_device *dev = encoder->dev;
238         struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder);
239         struct drm_encoder *other_encoder;
240         struct radeon_encoder *other_radeon_encoder;
241
242         if (radeon_encoder->is_ext_encoder)
243                 return NULL;
244
245         list_for_each_entry(other_encoder, &dev->mode_config.encoder_list, head) {
246                 if (other_encoder == encoder)
247                         continue;
248                 other_radeon_encoder = to_radeon_encoder(other_encoder);
249                 if (other_radeon_encoder->is_ext_encoder &&
250                     (radeon_encoder->devices & other_radeon_encoder->devices))
251                         return other_encoder;
252         }
253         return NULL;
254 }
255
256 u16 radeon_encoder_get_dp_bridge_encoder_id(struct drm_encoder *encoder)
257 {
258         struct drm_encoder *other_encoder = radeon_get_external_encoder(encoder);
259
260         if (other_encoder) {
261                 struct radeon_encoder *radeon_encoder = to_radeon_encoder(other_encoder);
262
263                 switch (radeon_encoder->encoder_id) {
264                 case ENCODER_OBJECT_ID_TRAVIS:
265                 case ENCODER_OBJECT_ID_NUTMEG:
266                         return radeon_encoder->encoder_id;
267                 default:
268                         return ENCODER_OBJECT_ID_NONE;
269                 }
270         }
271         return ENCODER_OBJECT_ID_NONE;
272 }
273
274 void radeon_panel_mode_fixup(struct drm_encoder *encoder,
275                              struct drm_display_mode *adjusted_mode)
276 {
277         struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder);
278         struct drm_device *dev = encoder->dev;
279         struct radeon_device *rdev = dev->dev_private;
280         struct drm_display_mode *native_mode = &radeon_encoder->native_mode;
281         unsigned hblank = native_mode->htotal - native_mode->hdisplay;
282         unsigned vblank = native_mode->vtotal - native_mode->vdisplay;
283         unsigned hover = native_mode->hsync_start - native_mode->hdisplay;
284         unsigned vover = native_mode->vsync_start - native_mode->vdisplay;
285         unsigned hsync_width = native_mode->hsync_end - native_mode->hsync_start;
286         unsigned vsync_width = native_mode->vsync_end - native_mode->vsync_start;
287
288         adjusted_mode->clock = native_mode->clock;
289         adjusted_mode->flags = native_mode->flags;
290
291         if (ASIC_IS_AVIVO(rdev)) {
292                 adjusted_mode->hdisplay = native_mode->hdisplay;
293                 adjusted_mode->vdisplay = native_mode->vdisplay;
294         }
295
296         adjusted_mode->htotal = native_mode->hdisplay + hblank;
297         adjusted_mode->hsync_start = native_mode->hdisplay + hover;
298         adjusted_mode->hsync_end = adjusted_mode->hsync_start + hsync_width;
299
300         adjusted_mode->vtotal = native_mode->vdisplay + vblank;
301         adjusted_mode->vsync_start = native_mode->vdisplay + vover;
302         adjusted_mode->vsync_end = adjusted_mode->vsync_start + vsync_width;
303
304         drm_mode_set_crtcinfo(adjusted_mode, CRTC_INTERLACE_HALVE_V);
305
306         if (ASIC_IS_AVIVO(rdev)) {
307                 adjusted_mode->crtc_hdisplay = native_mode->hdisplay;
308                 adjusted_mode->crtc_vdisplay = native_mode->vdisplay;
309         }
310
311         adjusted_mode->crtc_htotal = adjusted_mode->crtc_hdisplay + hblank;
312         adjusted_mode->crtc_hsync_start = adjusted_mode->crtc_hdisplay + hover;
313         adjusted_mode->crtc_hsync_end = adjusted_mode->crtc_hsync_start + hsync_width;
314
315         adjusted_mode->crtc_vtotal = adjusted_mode->crtc_vdisplay + vblank;
316         adjusted_mode->crtc_vsync_start = adjusted_mode->crtc_vdisplay + vover;
317         adjusted_mode->crtc_vsync_end = adjusted_mode->crtc_vsync_start + vsync_width;
318
319 }
320
321 bool radeon_dig_monitor_is_duallink(struct drm_encoder *encoder,
322                                     u32 pixel_clock)
323 {
324         struct drm_device *dev = encoder->dev;
325         struct radeon_device *rdev = dev->dev_private;
326         struct drm_connector *connector;
327         struct radeon_connector *radeon_connector;
328         struct radeon_connector_atom_dig *dig_connector;
329
330         connector = radeon_get_connector_for_encoder(encoder);
331         /* if we don't have an active device yet, just use one of
332          * the connectors tied to the encoder.
333          */
334         if (!connector)
335                 connector = radeon_get_connector_for_encoder_init(encoder);
336         radeon_connector = to_radeon_connector(connector);
337
338         switch (connector->connector_type) {
339         case DRM_MODE_CONNECTOR_DVII:
340         case DRM_MODE_CONNECTOR_HDMIB:
341                 if (radeon_connector->use_digital) {
342                         /* HDMI 1.3 supports up to 340 Mhz over single link */
343                         if (ASIC_IS_DCE6(rdev) && drm_detect_hdmi_monitor(radeon_connector->edid)) {
344                                 if (pixel_clock > 340000)
345                                         return true;
346                                 else
347                                         return false;
348                         } else {
349                                 if (pixel_clock > 165000)
350                                         return true;
351                                 else
352                                         return false;
353                         }
354                 } else
355                         return false;
356         case DRM_MODE_CONNECTOR_DVID:
357         case DRM_MODE_CONNECTOR_HDMIA:
358         case DRM_MODE_CONNECTOR_DisplayPort:
359                 dig_connector = radeon_connector->con_priv;
360                 if ((dig_connector->dp_sink_type == CONNECTOR_OBJECT_ID_DISPLAYPORT) ||
361                     (dig_connector->dp_sink_type == CONNECTOR_OBJECT_ID_eDP))
362                         return false;
363                 else {
364                         /* HDMI 1.3 supports up to 340 Mhz over single link */
365                         if (ASIC_IS_DCE6(rdev) && drm_detect_hdmi_monitor(radeon_connector->edid)) {
366                                 if (pixel_clock > 340000)
367                                         return true;
368                                 else
369                                         return false;
370                         } else {
371                                 if (pixel_clock > 165000)
372                                         return true;
373                                 else
374                                         return false;
375                         }
376                 }
377         default:
378                 return false;
379         }
380 }
381