Rev 3764 | Rev 5271 | Go to most recent revision | Show entire file | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 3764 | Rev 5078 | ||
---|---|---|---|
Line 29... | Line 29... | ||
29 | #include |
29 | #include |
30 | #include |
30 | #include |
31 | #include "radeon.h" |
31 | #include "radeon.h" |
32 | #include "atom.h" |
32 | #include "atom.h" |
Line 33... | Line -... | ||
33 | - | ||
Line 34... | Line -... | ||
34 | #define DISABLE_DP 0 |
- | |
35 | - | ||
36 | - | ||
37 | extern void |
- | |
38 | radeon_combios_connected_scratch_regs(struct drm_connector *connector, |
- | |
39 | struct drm_encoder *encoder, |
- | |
40 | bool connected); |
- | |
41 | extern void |
- | |
42 | radeon_atombios_connected_scratch_regs(struct drm_connector *connector, |
- | |
43 | struct drm_encoder *encoder, |
33 | |
44 | bool connected); |
34 | |
45 | 35 | ||
46 | void radeon_connector_hotplug(struct drm_connector *connector) |
36 | void radeon_connector_hotplug(struct drm_connector *connector) |
47 | { |
37 | { |
Line 56... | Line 46... | ||
56 | return; |
46 | return; |
Line 57... | Line 47... | ||
57 | 47 | ||
Line 58... | Line 48... | ||
58 | radeon_hpd_set_polarity(rdev, radeon_connector->hpd.hpd); |
48 | radeon_hpd_set_polarity(rdev, radeon_connector->hpd.hpd); |
- | 49 | ||
59 | 50 | /* if the connector is already off, don't turn it back on */ |
|
60 | /* if the connector is already off, don't turn it back on */ |
51 | /* FIXME: This access isn't protected by any locks. */ |
Line 61... | Line 52... | ||
61 | if (connector->dpms != DRM_MODE_DPMS_ON) |
52 | if (connector->dpms != DRM_MODE_DPMS_ON) |
62 | return; |
53 | return; |
Line 97... | Line 88... | ||
97 | { |
88 | { |
98 | struct drm_crtc *crtc = encoder->crtc; |
89 | struct drm_crtc *crtc = encoder->crtc; |
Line 99... | Line 90... | ||
99 | 90 | ||
100 | if (crtc && crtc->enabled) { |
91 | if (crtc && crtc->enabled) { |
101 | drm_crtc_helper_set_mode(crtc, &crtc->mode, |
92 | drm_crtc_helper_set_mode(crtc, &crtc->mode, |
102 | crtc->x, crtc->y, crtc->fb); |
93 | crtc->x, crtc->y, crtc->primary->fb); |
103 | } |
94 | } |
Line 104... | Line 95... | ||
104 | } |
95 | } |
105 | 96 | ||
106 | int radeon_get_monitor_bpc(struct drm_connector *connector) |
97 | int radeon_get_monitor_bpc(struct drm_connector *connector) |
107 | { |
98 | { |
108 | struct drm_device *dev = connector->dev; |
99 | struct drm_device *dev = connector->dev; |
109 | struct radeon_device *rdev = dev->dev_private; |
100 | struct radeon_device *rdev = dev->dev_private; |
110 | struct radeon_connector *radeon_connector = to_radeon_connector(connector); |
101 | struct radeon_connector *radeon_connector = to_radeon_connector(connector); |
- | 102 | struct radeon_connector_atom_dig *dig_connector; |
|
Line 111... | Line 103... | ||
111 | struct radeon_connector_atom_dig *dig_connector; |
103 | int bpc = 8; |
112 | int bpc = 8; |
104 | int mode_clock, max_tmds_clock; |
113 | 105 | ||
114 | switch (connector->connector_type) { |
106 | switch (connector->connector_type) { |
115 | case DRM_MODE_CONNECTOR_DVII: |
107 | case DRM_MODE_CONNECTOR_DVII: |
116 | case DRM_MODE_CONNECTOR_HDMIB: |
108 | case DRM_MODE_CONNECTOR_HDMIB: |
117 | if (radeon_connector->use_digital) { |
109 | if (radeon_connector->use_digital) { |
118 | if (drm_detect_hdmi_monitor(radeon_connector->edid)) { |
110 | if (drm_detect_hdmi_monitor(radeon_connector_edid(connector))) { |
119 | if (connector->display_info.bpc) |
111 | if (connector->display_info.bpc) |
120 | bpc = connector->display_info.bpc; |
112 | bpc = connector->display_info.bpc; |
121 | } |
113 | } |
122 | } |
114 | } |
123 | break; |
115 | break; |
124 | case DRM_MODE_CONNECTOR_DVID: |
116 | case DRM_MODE_CONNECTOR_DVID: |
125 | case DRM_MODE_CONNECTOR_HDMIA: |
117 | case DRM_MODE_CONNECTOR_HDMIA: |
126 | if (drm_detect_hdmi_monitor(radeon_connector->edid)) { |
118 | if (drm_detect_hdmi_monitor(radeon_connector_edid(connector))) { |
127 | if (connector->display_info.bpc) |
119 | if (connector->display_info.bpc) |
128 | bpc = connector->display_info.bpc; |
120 | bpc = connector->display_info.bpc; |
129 | } |
121 | } |
130 | break; |
122 | break; |
131 | case DRM_MODE_CONNECTOR_DisplayPort: |
123 | case DRM_MODE_CONNECTOR_DisplayPort: |
132 | dig_connector = radeon_connector->con_priv; |
124 | dig_connector = radeon_connector->con_priv; |
133 | if ((dig_connector->dp_sink_type == CONNECTOR_OBJECT_ID_DISPLAYPORT) || |
125 | if ((dig_connector->dp_sink_type == CONNECTOR_OBJECT_ID_DISPLAYPORT) || |
134 | (dig_connector->dp_sink_type == CONNECTOR_OBJECT_ID_eDP) || |
126 | (dig_connector->dp_sink_type == CONNECTOR_OBJECT_ID_eDP) || |
135 | drm_detect_hdmi_monitor(radeon_connector->edid)) { |
127 | drm_detect_hdmi_monitor(radeon_connector_edid(connector))) { |
136 | if (connector->display_info.bpc) |
128 | if (connector->display_info.bpc) |
137 | bpc = connector->display_info.bpc; |
129 | bpc = connector->display_info.bpc; |
Line 153... | Line 145... | ||
153 | else if (dig->lcd_misc & ATOM_PANEL_MISC_V13_8BIT_PER_COLOR) |
145 | else if (dig->lcd_misc & ATOM_PANEL_MISC_V13_8BIT_PER_COLOR) |
154 | bpc = 8; |
146 | bpc = 8; |
155 | } |
147 | } |
156 | break; |
148 | break; |
157 | } |
149 | } |
- | 150 | ||
- | 151 | if (drm_detect_hdmi_monitor(radeon_connector_edid(connector))) { |
|
- | 152 | /* hdmi deep color only implemented on DCE4+ */ |
|
- | 153 | if ((bpc > 8) && !ASIC_IS_DCE4(rdev)) { |
|
- | 154 | DRM_DEBUG("%s: HDMI deep color %d bpc unsupported. Using 8 bpc.\n", |
|
- | 155 | connector->name, bpc); |
|
- | 156 | bpc = 8; |
|
- | 157 | } |
|
- | 158 | ||
- | 159 | /* |
|
- | 160 | * Pre DCE-8 hw can't handle > 12 bpc, and more than 12 bpc doesn't make |
|
- | 161 | * much sense without support for > 12 bpc framebuffers. RGB 4:4:4 at |
|
- | 162 | * 12 bpc is always supported on hdmi deep color sinks, as this is |
|
- | 163 | * required by the HDMI-1.3 spec. Clamp to a safe 12 bpc maximum. |
|
- | 164 | */ |
|
- | 165 | if (bpc > 12) { |
|
- | 166 | DRM_DEBUG("%s: HDMI deep color %d bpc unsupported. Using 12 bpc.\n", |
|
- | 167 | connector->name, bpc); |
|
- | 168 | bpc = 12; |
|
- | 169 | } |
|
- | 170 | ||
- | 171 | /* Any defined maximum tmds clock limit we must not exceed? */ |
|
- | 172 | if (connector->max_tmds_clock > 0) { |
|
- | 173 | /* mode_clock is clock in kHz for mode to be modeset on this connector */ |
|
- | 174 | mode_clock = radeon_connector->pixelclock_for_modeset; |
|
- | 175 | ||
- | 176 | /* Maximum allowable input clock in kHz */ |
|
- | 177 | max_tmds_clock = connector->max_tmds_clock * 1000; |
|
- | 178 | ||
- | 179 | DRM_DEBUG("%s: hdmi mode dotclock %d kHz, max tmds input clock %d kHz.\n", |
|
- | 180 | connector->name, mode_clock, max_tmds_clock); |
|
- | 181 | ||
- | 182 | /* Check if bpc is within clock limit. Try to degrade gracefully otherwise */ |
|
- | 183 | if ((bpc == 12) && (mode_clock * 3/2 > max_tmds_clock)) { |
|
- | 184 | if ((connector->display_info.edid_hdmi_dc_modes & DRM_EDID_HDMI_DC_30) && |
|
- | 185 | (mode_clock * 5/4 <= max_tmds_clock)) |
|
- | 186 | bpc = 10; |
|
- | 187 | else |
|
- | 188 | bpc = 8; |
|
- | 189 | ||
- | 190 | DRM_DEBUG("%s: HDMI deep color 12 bpc exceeds max tmds clock. Using %d bpc.\n", |
|
- | 191 | connector->name, bpc); |
|
- | 192 | } |
|
- | 193 | ||
- | 194 | if ((bpc == 10) && (mode_clock * 5/4 > max_tmds_clock)) { |
|
- | 195 | bpc = 8; |
|
- | 196 | DRM_DEBUG("%s: HDMI deep color 10 bpc exceeds max tmds clock. Using %d bpc.\n", |
|
- | 197 | connector->name, bpc); |
|
- | 198 | } |
|
- | 199 | } |
|
- | 200 | else if (bpc > 8) { |
|
- | 201 | /* max_tmds_clock missing, but hdmi spec mandates it for deep color. */ |
|
- | 202 | DRM_DEBUG("%s: Required max tmds clock for HDMI deep color missing. Using 8 bpc.\n", |
|
- | 203 | connector->name); |
|
- | 204 | bpc = 8; |
|
- | 205 | } |
|
- | 206 | } |
|
- | 207 | ||
- | 208 | if ((radeon_deep_color == 0) && (bpc > 8)) { |
|
- | 209 | DRM_DEBUG("%s: Deep color disabled. Set radeon module param deep_color=1 to enable.\n", |
|
- | 210 | connector->name); |
|
- | 211 | bpc = 8; |
|
- | 212 | } |
|
- | 213 | ||
- | 214 | DRM_DEBUG("%s: Display bpc=%d, returned bpc=%d\n", |
|
- | 215 | connector->name, connector->display_info.bpc, bpc); |
|
- | 216 | ||
158 | return bpc; |
217 | return bpc; |
159 | } |
218 | } |
Line 160... | Line 219... | ||
160 | 219 | ||
161 | static void |
220 | static void |
Line 164... | Line 223... | ||
164 | struct drm_device *dev = connector->dev; |
223 | struct drm_device *dev = connector->dev; |
165 | struct radeon_device *rdev = dev->dev_private; |
224 | struct radeon_device *rdev = dev->dev_private; |
166 | struct drm_encoder *best_encoder = NULL; |
225 | struct drm_encoder *best_encoder = NULL; |
167 | struct drm_encoder *encoder = NULL; |
226 | struct drm_encoder *encoder = NULL; |
168 | struct drm_connector_helper_funcs *connector_funcs = connector->helper_private; |
227 | struct drm_connector_helper_funcs *connector_funcs = connector->helper_private; |
169 | struct drm_mode_object *obj; |
- | |
170 | bool connected; |
228 | bool connected; |
171 | int i; |
229 | int i; |
Line 172... | Line 230... | ||
172 | 230 | ||
Line 173... | Line 231... | ||
173 | best_encoder = connector_funcs->best_encoder(connector); |
231 | best_encoder = connector_funcs->best_encoder(connector); |
174 | 232 | ||
175 | for (i = 0; i < DRM_CONNECTOR_MAX_ENCODER; i++) { |
233 | for (i = 0; i < DRM_CONNECTOR_MAX_ENCODER; i++) { |
Line 176... | Line 234... | ||
176 | if (connector->encoder_ids[i] == 0) |
234 | if (connector->encoder_ids[i] == 0) |
177 | break; |
235 | break; |
178 | - | ||
179 | obj = drm_mode_object_find(connector->dev, |
236 | |
180 | connector->encoder_ids[i], |
237 | encoder = drm_encoder_find(connector->dev, |
Line 181... | Line -... | ||
181 | DRM_MODE_OBJECT_ENCODER); |
- | |
182 | if (!obj) |
- | |
183 | continue; |
238 | connector->encoder_ids[i]); |
184 | 239 | if (!encoder) |
|
185 | encoder = obj_to_encoder(obj); |
240 | continue; |
186 | 241 | ||
Line 197... | Line 252... | ||
197 | } |
252 | } |
198 | } |
253 | } |
Line 199... | Line 254... | ||
199 | 254 | ||
200 | static struct drm_encoder *radeon_find_encoder(struct drm_connector *connector, int encoder_type) |
255 | static struct drm_encoder *radeon_find_encoder(struct drm_connector *connector, int encoder_type) |
201 | { |
- | |
202 | struct drm_mode_object *obj; |
256 | { |
203 | struct drm_encoder *encoder; |
257 | struct drm_encoder *encoder; |
Line 204... | Line 258... | ||
204 | int i; |
258 | int i; |
205 | 259 | ||
206 | for (i = 0; i < DRM_CONNECTOR_MAX_ENCODER; i++) { |
260 | for (i = 0; i < DRM_CONNECTOR_MAX_ENCODER; i++) { |
Line 207... | Line 261... | ||
207 | if (connector->encoder_ids[i] == 0) |
261 | if (connector->encoder_ids[i] == 0) |
208 | break; |
262 | break; |
209 | 263 | ||
Line 210... | Line -... | ||
210 | obj = drm_mode_object_find(connector->dev, connector->encoder_ids[i], DRM_MODE_OBJECT_ENCODER); |
- | |
211 | if (!obj) |
264 | encoder = drm_encoder_find(connector->dev, connector->encoder_ids[i]); |
212 | continue; |
265 | if (!encoder) |
213 | 266 | continue; |
|
214 | encoder = obj_to_encoder(obj); |
267 | |
215 | if (encoder->encoder_type == encoder_type) |
268 | if (encoder->encoder_type == encoder_type) |
Line -... | Line 269... | ||
- | 269 | return encoder; |
|
- | 270 | } |
|
- | 271 | return NULL; |
|
- | 272 | } |
|
- | 273 | ||
- | 274 | struct edid *radeon_connector_edid(struct drm_connector *connector) |
|
- | 275 | { |
|
- | 276 | struct radeon_connector *radeon_connector = to_radeon_connector(connector); |
|
- | 277 | struct drm_property_blob *edid_blob = connector->edid_blob_ptr; |
|
- | 278 | ||
- | 279 | if (radeon_connector->edid) { |
|
- | 280 | return radeon_connector->edid; |
|
- | 281 | } else if (edid_blob) { |
|
- | 282 | struct edid *edid = kmemdup(edid_blob->data, edid_blob->length, GFP_KERNEL); |
|
- | 283 | if (edid) |
|
- | 284 | radeon_connector->edid = edid; |
|
- | 285 | } |
|
- | 286 | return radeon_connector->edid; |
|
- | 287 | } |
|
- | 288 | ||
- | 289 | static void radeon_connector_get_edid(struct drm_connector *connector) |
|
- | 290 | { |
|
- | 291 | struct drm_device *dev = connector->dev; |
|
- | 292 | struct radeon_device *rdev = dev->dev_private; |
|
- | 293 | struct radeon_connector *radeon_connector = to_radeon_connector(connector); |
|
- | 294 | ||
- | 295 | if (radeon_connector->edid) |
|
- | 296 | return; |
|
- | 297 | ||
- | 298 | /* on hw with routers, select right port */ |
|
- | 299 | if (radeon_connector->router.ddc_valid) |
|
- | 300 | radeon_router_select_ddc_port(radeon_connector); |
|
- | 301 | ||
- | 302 | if ((radeon_connector_encoder_get_dp_bridge_encoder_id(connector) != |
|
- | 303 | ENCODER_OBJECT_ID_NONE) && |
|
- | 304 | radeon_connector->ddc_bus->has_aux) { |
|
- | 305 | radeon_connector->edid = drm_get_edid(connector, |
|
- | 306 | &radeon_connector->ddc_bus->aux.ddc); |
|
- | 307 | } else if ((connector->connector_type == DRM_MODE_CONNECTOR_DisplayPort) || |
|
- | 308 | (connector->connector_type == DRM_MODE_CONNECTOR_eDP)) { |
|
- | 309 | struct radeon_connector_atom_dig *dig = radeon_connector->con_priv; |
|
- | 310 | ||
- | 311 | if ((dig->dp_sink_type == CONNECTOR_OBJECT_ID_DISPLAYPORT || |
|
- | 312 | dig->dp_sink_type == CONNECTOR_OBJECT_ID_eDP) && |
|
- | 313 | radeon_connector->ddc_bus->has_aux) |
|
- | 314 | radeon_connector->edid = drm_get_edid(&radeon_connector->base, |
|
- | 315 | &radeon_connector->ddc_bus->aux.ddc); |
|
- | 316 | else if (radeon_connector->ddc_bus) |
|
- | 317 | radeon_connector->edid = drm_get_edid(&radeon_connector->base, |
|
- | 318 | &radeon_connector->ddc_bus->adapter); |
|
- | 319 | } else if (radeon_connector->ddc_bus) { |
|
- | 320 | radeon_connector->edid = drm_get_edid(&radeon_connector->base, |
|
- | 321 | &radeon_connector->ddc_bus->adapter); |
|
- | 322 | } |
|
- | 323 | ||
- | 324 | if (!radeon_connector->edid) { |
|
- | 325 | if (rdev->is_atom_bios) { |
|
- | 326 | /* some laptops provide a hardcoded edid in rom for LCDs */ |
|
- | 327 | if (((connector->connector_type == DRM_MODE_CONNECTOR_LVDS) || |
|
- | 328 | (connector->connector_type == DRM_MODE_CONNECTOR_eDP))) |
|
- | 329 | radeon_connector->edid = radeon_bios_get_hardcoded_edid(rdev); |
|
- | 330 | } else { |
|
- | 331 | /* some servers provide a hardcoded edid in rom for KVMs */ |
|
- | 332 | radeon_connector->edid = radeon_bios_get_hardcoded_edid(rdev); |
|
- | 333 | } |
|
- | 334 | } |
|
- | 335 | } |
|
- | 336 | ||
- | 337 | static void radeon_connector_free_edid(struct drm_connector *connector) |
|
- | 338 | { |
|
- | 339 | struct radeon_connector *radeon_connector = to_radeon_connector(connector); |
|
- | 340 | ||
- | 341 | if (radeon_connector->edid) { |
|
- | 342 | kfree(radeon_connector->edid); |
|
- | 343 | radeon_connector->edid = NULL; |
|
- | 344 | } |
|
- | 345 | } |
|
- | 346 | ||
- | 347 | static int radeon_ddc_get_modes(struct drm_connector *connector) |
|
- | 348 | { |
|
- | 349 | struct radeon_connector *radeon_connector = to_radeon_connector(connector); |
|
- | 350 | int ret; |
|
- | 351 | ||
- | 352 | if (radeon_connector->edid) { |
|
- | 353 | drm_mode_connector_update_edid_property(connector, radeon_connector->edid); |
|
- | 354 | ret = drm_add_edid_modes(connector, radeon_connector->edid); |
|
- | 355 | drm_edid_to_eld(connector, radeon_connector->edid); |
|
- | 356 | return ret; |
|
216 | return encoder; |
357 | } |
217 | } |
358 | drm_mode_connector_update_edid_property(connector, NULL); |
218 | return NULL; |
359 | return 0; |
219 | } |
- | |
220 | - | ||
221 | static struct drm_encoder *radeon_best_single_encoder(struct drm_connector *connector) |
- | |
222 | { |
360 | } |
223 | int enc_id = connector->encoder_ids[0]; |
361 | |
224 | struct drm_mode_object *obj; |
362 | static struct drm_encoder *radeon_best_single_encoder(struct drm_connector *connector) |
225 | struct drm_encoder *encoder; |
- | |
226 | 363 | { |
|
227 | /* pick the encoder ids */ |
- | |
228 | if (enc_id) { |
- | |
229 | obj = drm_mode_object_find(connector->dev, enc_id, DRM_MODE_OBJECT_ENCODER); |
364 | int enc_id = connector->encoder_ids[0]; |
- | 365 | /* pick the encoder ids */ |
|
- | 366 | if (enc_id) |
|
- | 367 | return drm_encoder_find(connector->dev, enc_id); |
|
- | 368 | return NULL; |
|
- | 369 | } |
|
- | 370 | ||
- | 371 | static void radeon_get_native_mode(struct drm_connector *connector) |
|
230 | if (!obj) |
372 | { |
- | 373 | struct drm_encoder *encoder = radeon_best_single_encoder(connector); |
|
- | 374 | struct radeon_encoder *radeon_encoder; |
|
- | 375 | ||
- | 376 | if (encoder == NULL) |
|
- | 377 | return; |
|
- | 378 | ||
- | 379 | radeon_encoder = to_radeon_encoder(encoder); |
|
- | 380 | ||
- | 381 | if (!list_empty(&connector->probed_modes)) { |
|
- | 382 | struct drm_display_mode *preferred_mode = |
|
- | 383 | list_first_entry(&connector->probed_modes, |
|
- | 384 | struct drm_display_mode, head); |
|
231 | return NULL; |
385 | |
Line 232... | Line 386... | ||
232 | encoder = obj_to_encoder(obj); |
386 | radeon_encoder->native_mode = *preferred_mode; |
233 | return encoder; |
387 | } else { |
234 | } |
388 | radeon_encoder->native_mode.clock = 0; |
Line 268... | Line 422... | ||
268 | 422 | ||
269 | if (radeon_conflict->use_digital) |
423 | if (radeon_conflict->use_digital) |
Line 270... | Line 424... | ||
270 | continue; |
424 | continue; |
271 | 425 | ||
- | 426 | if (priority == true) { |
|
272 | if (priority == true) { |
427 | DRM_DEBUG_KMS("1: conflicting encoders switching off %s\n", |
- | 428 | conflict->name); |
|
273 | DRM_DEBUG_KMS("1: conflicting encoders switching off %s\n", drm_get_connector_name(conflict)); |
429 | DRM_DEBUG_KMS("in favor of %s\n", |
274 | DRM_DEBUG_KMS("in favor of %s\n", drm_get_connector_name(connector)); |
430 | connector->name); |
275 | conflict->status = connector_status_disconnected; |
431 | conflict->status = connector_status_disconnected; |
276 | radeon_connector_update_scratch_regs(conflict, connector_status_disconnected); |
432 | radeon_connector_update_scratch_regs(conflict, connector_status_disconnected); |
- | 433 | } else { |
|
277 | } else { |
434 | DRM_DEBUG_KMS("2: conflicting encoders switching off %s\n", |
- | 435 | connector->name); |
|
278 | DRM_DEBUG_KMS("2: conflicting encoders switching off %s\n", drm_get_connector_name(connector)); |
436 | DRM_DEBUG_KMS("in favor of %s\n", |
279 | DRM_DEBUG_KMS("in favor of %s\n", drm_get_connector_name(conflict)); |
437 | conflict->name); |
280 | current_status = connector_status_disconnected; |
438 | current_status = connector_status_disconnected; |
281 | } |
439 | } |
282 | break; |
440 | break; |
Line 397... | Line 555... | ||
397 | dig->coherent_mode = new_coherent_mode; |
555 | dig->coherent_mode = new_coherent_mode; |
398 | radeon_property_change_mode(&radeon_encoder->base); |
556 | radeon_property_change_mode(&radeon_encoder->base); |
399 | } |
557 | } |
400 | } |
558 | } |
Line -... | Line 559... | ||
- | 559 | ||
- | 560 | if (property == rdev->mode_info.audio_property) { |
|
- | 561 | struct radeon_connector *radeon_connector = to_radeon_connector(connector); |
|
- | 562 | /* need to find digital encoder on connector */ |
|
- | 563 | encoder = radeon_find_encoder(connector, DRM_MODE_ENCODER_TMDS); |
|
- | 564 | if (!encoder) |
|
- | 565 | return 0; |
|
- | 566 | ||
- | 567 | radeon_encoder = to_radeon_encoder(encoder); |
|
- | 568 | ||
- | 569 | if (radeon_connector->audio != val) { |
|
- | 570 | radeon_connector->audio = val; |
|
- | 571 | radeon_property_change_mode(&radeon_encoder->base); |
|
- | 572 | } |
|
- | 573 | } |
|
- | 574 | ||
- | 575 | if (property == rdev->mode_info.dither_property) { |
|
- | 576 | struct radeon_connector *radeon_connector = to_radeon_connector(connector); |
|
- | 577 | /* need to find digital encoder on connector */ |
|
- | 578 | encoder = radeon_find_encoder(connector, DRM_MODE_ENCODER_TMDS); |
|
- | 579 | if (!encoder) |
|
- | 580 | return 0; |
|
- | 581 | ||
- | 582 | radeon_encoder = to_radeon_encoder(encoder); |
|
- | 583 | ||
- | 584 | if (radeon_connector->dither != val) { |
|
- | 585 | radeon_connector->dither = val; |
|
- | 586 | radeon_property_change_mode(&radeon_encoder->base); |
|
- | 587 | } |
|
- | 588 | } |
|
401 | 589 | ||
402 | if (property == rdev->mode_info.underscan_property) { |
590 | if (property == rdev->mode_info.underscan_property) { |
403 | /* need to find digital encoder on connector */ |
591 | /* need to find digital encoder on connector */ |
404 | encoder = radeon_find_encoder(connector, DRM_MODE_ENCODER_TMDS); |
592 | encoder = radeon_find_encoder(connector, DRM_MODE_ENCODER_TMDS); |
405 | if (!encoder) |
593 | if (!encoder) |
Line 499... | Line 687... | ||
499 | radeon_legacy_get_tmds_info_from_table(radeon_encoder, tmds); |
687 | radeon_legacy_get_tmds_info_from_table(radeon_encoder, tmds); |
500 | } |
688 | } |
501 | radeon_property_change_mode(&radeon_encoder->base); |
689 | radeon_property_change_mode(&radeon_encoder->base); |
502 | } |
690 | } |
Line -... | Line 691... | ||
- | 691 | ||
- | 692 | if (property == dev->mode_config.scaling_mode_property) { |
|
- | 693 | enum radeon_rmx_type rmx_type; |
|
- | 694 | ||
- | 695 | if (connector->encoder) |
|
- | 696 | radeon_encoder = to_radeon_encoder(connector->encoder); |
|
- | 697 | else { |
|
- | 698 | struct drm_connector_helper_funcs *connector_funcs = connector->helper_private; |
|
- | 699 | radeon_encoder = to_radeon_encoder(connector_funcs->best_encoder(connector)); |
|
- | 700 | } |
|
- | 701 | ||
- | 702 | switch (val) { |
|
- | 703 | default: |
|
- | 704 | case DRM_MODE_SCALE_NONE: rmx_type = RMX_OFF; break; |
|
- | 705 | case DRM_MODE_SCALE_CENTER: rmx_type = RMX_CENTER; break; |
|
- | 706 | case DRM_MODE_SCALE_ASPECT: rmx_type = RMX_ASPECT; break; |
|
- | 707 | case DRM_MODE_SCALE_FULLSCREEN: rmx_type = RMX_FULL; break; |
|
- | 708 | } |
|
- | 709 | if (radeon_encoder->rmx_type == rmx_type) |
|
- | 710 | return 0; |
|
- | 711 | ||
- | 712 | if ((rmx_type != DRM_MODE_SCALE_NONE) && |
|
- | 713 | (radeon_encoder->native_mode.clock == 0)) |
|
- | 714 | return 0; |
|
- | 715 | ||
- | 716 | radeon_encoder->rmx_type = rmx_type; |
|
- | 717 | ||
- | 718 | radeon_property_change_mode(&radeon_encoder->base); |
|
- | 719 | } |
|
503 | 720 | ||
504 | return 0; |
721 | return 0; |
Line 505... | Line 722... | ||
505 | } |
722 | } |
506 | 723 | ||
Line 539... | Line 756... | ||
539 | } |
756 | } |
540 | } |
757 | } |
Line 541... | Line 758... | ||
541 | 758 | ||
542 | static int radeon_lvds_get_modes(struct drm_connector *connector) |
759 | static int radeon_lvds_get_modes(struct drm_connector *connector) |
543 | { |
- | |
544 | struct radeon_connector *radeon_connector = to_radeon_connector(connector); |
760 | { |
545 | struct drm_encoder *encoder; |
761 | struct drm_encoder *encoder; |
546 | int ret = 0; |
762 | int ret = 0; |
Line 547... | Line 763... | ||
547 | struct drm_display_mode *mode; |
763 | struct drm_display_mode *mode; |
548 | 764 | ||
549 | if (radeon_connector->ddc_bus) { |
765 | radeon_connector_get_edid(connector); |
550 | ret = radeon_ddc_get_modes(radeon_connector); |
766 | ret = radeon_ddc_get_modes(connector); |
551 | if (ret > 0) { |
767 | if (ret > 0) { |
552 | encoder = radeon_best_single_encoder(connector); |
768 | encoder = radeon_best_single_encoder(connector); |
553 | if (encoder) { |
769 | if (encoder) { |
554 | radeon_fixup_lvds_native_mode(encoder, connector); |
770 | radeon_fixup_lvds_native_mode(encoder, connector); |
555 | /* add scaled modes */ |
771 | /* add scaled modes */ |
556 | radeon_add_common_modes(encoder, connector); |
772 | radeon_add_common_modes(encoder, connector); |
557 | } |
773 | } |
558 | return ret; |
- | |
Line 559... | Line 774... | ||
559 | } |
774 | return ret; |
560 | } |
775 | } |
561 | 776 | ||
Line 624... | Line 839... | ||
624 | ret = connector_status_connected; |
839 | ret = connector_status_connected; |
Line 625... | Line 840... | ||
625 | 840 | ||
Line 626... | Line 841... | ||
626 | } |
841 | } |
- | 842 | ||
627 | 843 | /* check for edid as well */ |
|
628 | /* check for edid as well */ |
844 | radeon_connector_get_edid(connector); |
629 | if (radeon_connector->edid) |
- | |
630 | ret = connector_status_connected; |
- | |
631 | else { |
- | |
632 | if (radeon_connector->ddc_bus) { |
- | |
633 | radeon_connector->edid = drm_get_edid(&radeon_connector->base, |
- | |
634 | &radeon_connector->ddc_bus->adapter); |
- | |
635 | if (radeon_connector->edid) |
- | |
636 | ret = connector_status_connected; |
- | |
637 | } |
845 | if (radeon_connector->edid) |
Line 638... | Line 846... | ||
638 | } |
846 | ret = connector_status_connected; |
639 | /* check acpi lid status ??? */ |
847 | /* check acpi lid status ??? */ |
640 | 848 | ||
Line 641... | Line 849... | ||
641 | radeon_connector_update_scratch_regs(connector, ret); |
849 | radeon_connector_update_scratch_regs(connector, ret); |
642 | return ret; |
850 | return ret; |
643 | } |
851 | } |
Line 644... | Line 852... | ||
644 | 852 | ||
645 | static void radeon_connector_destroy(struct drm_connector *connector) |
- | |
646 | { |
853 | static void radeon_connector_destroy(struct drm_connector *connector) |
647 | struct radeon_connector *radeon_connector = to_radeon_connector(connector); |
854 | { |
648 | 855 | struct radeon_connector *radeon_connector = to_radeon_connector(connector); |
|
649 | if (radeon_connector->edid) |
856 | |
650 | kfree(radeon_connector->edid); |
857 | radeon_connector_free_edid(connector); |
Line 651... | Line 858... | ||
651 | kfree(radeon_connector->con_priv); |
858 | kfree(radeon_connector->con_priv); |
Line 704... | Line 911... | ||
704 | .set_property = radeon_lvds_set_property, |
911 | .set_property = radeon_lvds_set_property, |
705 | }; |
912 | }; |
Line 706... | Line 913... | ||
706 | 913 | ||
707 | static int radeon_vga_get_modes(struct drm_connector *connector) |
914 | static int radeon_vga_get_modes(struct drm_connector *connector) |
708 | { |
- | |
709 | struct radeon_connector *radeon_connector = to_radeon_connector(connector); |
915 | { |
Line -... | Line 916... | ||
- | 916 | int ret; |
|
710 | int ret; |
917 | |
- | 918 | radeon_connector_get_edid(connector); |
|
- | 919 | ret = radeon_ddc_get_modes(connector); |
|
Line 711... | Line 920... | ||
711 | 920 | ||
712 | ret = radeon_ddc_get_modes(radeon_connector); |
921 | radeon_get_native_mode(connector); |
Line 713... | Line 922... | ||
713 | 922 | ||
Line 745... | Line 954... | ||
745 | 954 | ||
746 | if (radeon_connector->ddc_bus) |
955 | if (radeon_connector->ddc_bus) |
747 | dret = radeon_ddc_probe(radeon_connector, false); |
956 | dret = radeon_ddc_probe(radeon_connector, false); |
748 | if (dret) { |
957 | if (dret) { |
749 | radeon_connector->detected_by_load = false; |
958 | radeon_connector->detected_by_load = false; |
750 | if (radeon_connector->edid) { |
- | |
751 | kfree(radeon_connector->edid); |
959 | radeon_connector_free_edid(connector); |
752 | radeon_connector->edid = NULL; |
- | |
753 | } |
- | |
Line 754... | Line 960... | ||
754 | radeon_connector->edid = drm_get_edid(&radeon_connector->base, &radeon_connector->ddc_bus->adapter); |
960 | radeon_connector_get_edid(connector); |
755 | 961 | ||
756 | if (!radeon_connector->edid) { |
962 | if (!radeon_connector->edid) { |
757 | DRM_ERROR("%s: probed a monitor but no|invalid EDID\n", |
963 | DRM_ERROR("%s: probed a monitor but no|invalid EDID\n", |
758 | drm_get_connector_name(connector)); |
964 | connector->name); |
- | 965 | ret = connector_status_connected; |
|
759 | ret = connector_status_connected; |
966 | } else { |
Line 760... | Line 967... | ||
760 | } else { |
967 | radeon_connector->use_digital = |
761 | radeon_connector->use_digital = !!(radeon_connector->edid->input & DRM_EDID_INPUT_DIGITAL); |
968 | !!(radeon_connector->edid->input & DRM_EDID_INPUT_DIGITAL); |
762 | 969 | ||
763 | /* some oems have boards with separate digital and analog connectors |
970 | /* some oems have boards with separate digital and analog connectors |
764 | * with a shared ddc line (often vga + hdmi) |
- | |
765 | */ |
971 | * with a shared ddc line (often vga + hdmi) |
766 | if (radeon_connector->use_digital && radeon_connector->shared_ddc) { |
972 | */ |
767 | kfree(radeon_connector->edid); |
973 | if (radeon_connector->use_digital && radeon_connector->shared_ddc) { |
768 | radeon_connector->edid = NULL; |
974 | radeon_connector_free_edid(connector); |
769 | ret = connector_status_disconnected; |
975 | ret = connector_status_disconnected; |
- | 976 | } else { |
|
770 | } else |
977 | ret = connector_status_connected; |
Line 771... | Line 978... | ||
771 | ret = connector_status_connected; |
978 | } |
772 | } |
979 | } |
773 | } else { |
980 | } else { |
774 | 981 | ||
775 | /* if we aren't forcing don't do destructive polling */ |
982 | /* if we aren't forcing don't do destructive polling */ |
776 | if (!force) { |
983 | if (!force) { |
777 | /* only return the previous status if we last |
984 | /* only return the previous status if we last |
778 | * detected a monitor via load. |
- | |
779 | */ |
985 | * detected a monitor via load. |
780 | if (radeon_connector->detected_by_load) |
986 | */ |
Line 781... | Line 987... | ||
781 | return connector->status; |
987 | if (radeon_connector->detected_by_load) |
782 | else |
988 | ret = connector->status; |
783 | return ret; |
989 | goto out; |
Line 803... | Line 1009... | ||
803 | rdev->mode_info.bios_hardcoded_edid_size) { |
1009 | rdev->mode_info.bios_hardcoded_edid_size) { |
804 | ret = connector_status_connected; |
1010 | ret = connector_status_connected; |
805 | } |
1011 | } |
Line 806... | Line 1012... | ||
806 | 1012 | ||
- | 1013 | radeon_connector_update_scratch_regs(connector, ret); |
|
- | 1014 | ||
807 | radeon_connector_update_scratch_regs(connector, ret); |
1015 | out: |
808 | return ret; |
1016 | return ret; |
Line 809... | Line 1017... | ||
809 | } |
1017 | } |
810 | 1018 | ||
Line 859... | Line 1067... | ||
859 | { |
1067 | { |
860 | struct drm_encoder *encoder; |
1068 | struct drm_encoder *encoder; |
861 | struct drm_encoder_helper_funcs *encoder_funcs; |
1069 | struct drm_encoder_helper_funcs *encoder_funcs; |
862 | struct radeon_connector *radeon_connector = to_radeon_connector(connector); |
1070 | struct radeon_connector *radeon_connector = to_radeon_connector(connector); |
863 | enum drm_connector_status ret = connector_status_disconnected; |
1071 | enum drm_connector_status ret = connector_status_disconnected; |
- | 1072 | int r; |
|
Line 864... | Line 1073... | ||
864 | 1073 | ||
865 | if (!radeon_connector->dac_load_detect) |
1074 | if (!radeon_connector->dac_load_detect) |
Line 866... | Line 1075... | ||
866 | return ret; |
1075 | return ret; |
Line 890... | Line 1099... | ||
890 | .fill_modes = drm_helper_probe_single_connector_modes, |
1099 | .fill_modes = drm_helper_probe_single_connector_modes, |
891 | .destroy = radeon_connector_destroy, |
1100 | .destroy = radeon_connector_destroy, |
892 | .set_property = radeon_connector_set_property, |
1101 | .set_property = radeon_connector_set_property, |
893 | }; |
1102 | }; |
Line 894... | Line -... | ||
894 | - | ||
895 | static int radeon_dvi_get_modes(struct drm_connector *connector) |
- | |
896 | { |
- | |
897 | struct radeon_connector *radeon_connector = to_radeon_connector(connector); |
- | |
898 | int ret; |
- | |
899 | - | ||
900 | ret = radeon_ddc_get_modes(radeon_connector); |
- | |
901 | return ret; |
- | |
902 | } |
- | |
903 | 1103 | ||
904 | static bool radeon_check_hpd_status_unchanged(struct drm_connector *connector) |
1104 | static bool radeon_check_hpd_status_unchanged(struct drm_connector *connector) |
905 | { |
1105 | { |
906 | struct drm_device *dev = connector->dev; |
1106 | struct drm_device *dev = connector->dev; |
907 | struct radeon_device *rdev = dev->dev_private; |
1107 | struct radeon_device *rdev = dev->dev_private; |
Line 939... | Line 1139... | ||
939 | struct drm_device *dev = connector->dev; |
1139 | struct drm_device *dev = connector->dev; |
940 | struct radeon_device *rdev = dev->dev_private; |
1140 | struct radeon_device *rdev = dev->dev_private; |
941 | struct radeon_connector *radeon_connector = to_radeon_connector(connector); |
1141 | struct radeon_connector *radeon_connector = to_radeon_connector(connector); |
942 | struct drm_encoder *encoder = NULL; |
1142 | struct drm_encoder *encoder = NULL; |
943 | struct drm_encoder_helper_funcs *encoder_funcs; |
1143 | struct drm_encoder_helper_funcs *encoder_funcs; |
944 | struct drm_mode_object *obj; |
- | |
945 | int i; |
1144 | int i, r; |
946 | enum drm_connector_status ret = connector_status_disconnected; |
1145 | enum drm_connector_status ret = connector_status_disconnected; |
947 | bool dret = false, broken_edid = false; |
1146 | bool dret = false, broken_edid = false; |
Line -... | Line 1147... | ||
- | 1147 | ||
948 | 1148 | ||
949 | if (!force && radeon_check_hpd_status_unchanged(connector)) |
1149 | if (!force && radeon_check_hpd_status_unchanged(connector)) { |
- | 1150 | ret = connector->status; |
|
- | 1151 | goto exit; |
|
Line 950... | Line 1152... | ||
950 | return connector->status; |
1152 | } |
951 | 1153 | ||
952 | if (radeon_connector->ddc_bus) |
1154 | if (radeon_connector->ddc_bus) |
953 | dret = radeon_ddc_probe(radeon_connector, false); |
1155 | dret = radeon_ddc_probe(radeon_connector, false); |
954 | if (dret) { |
1156 | if (dret) { |
955 | radeon_connector->detected_by_load = false; |
- | |
956 | if (radeon_connector->edid) { |
1157 | radeon_connector->detected_by_load = false; |
957 | kfree(radeon_connector->edid); |
- | |
958 | radeon_connector->edid = NULL; |
- | |
Line 959... | Line 1158... | ||
959 | } |
1158 | radeon_connector_free_edid(connector); |
960 | radeon_connector->edid = drm_get_edid(&radeon_connector->base, &radeon_connector->ddc_bus->adapter); |
1159 | radeon_connector_get_edid(connector); |
961 | 1160 | ||
962 | if (!radeon_connector->edid) { |
1161 | if (!radeon_connector->edid) { |
963 | DRM_ERROR("%s: probed a monitor but no|invalid EDID\n", |
1162 | DRM_ERROR("%s: probed a monitor but no|invalid EDID\n", |
964 | drm_get_connector_name(connector)); |
1163 | connector->name); |
- | 1164 | /* rs690 seems to have a problem with connectors not existing and always |
|
965 | /* rs690 seems to have a problem with connectors not existing and always |
1165 | * return a block of 0's. If we see this just stop polling on this output */ |
966 | * return a block of 0's. If we see this just stop polling on this output */ |
1166 | if ((rdev->family == CHIP_RS690 || rdev->family == CHIP_RS740) && |
- | 1167 | radeon_connector->base.null_edid_counter) { |
|
967 | if ((rdev->family == CHIP_RS690 || rdev->family == CHIP_RS740) && radeon_connector->base.null_edid_counter) { |
1168 | ret = connector_status_disconnected; |
968 | ret = connector_status_disconnected; |
1169 | DRM_ERROR("%s: detected RS690 floating bus bug, stopping ddc detect\n", |
969 | DRM_ERROR("%s: detected RS690 floating bus bug, stopping ddc detect\n", drm_get_connector_name(connector)); |
1170 | connector->name); |
970 | radeon_connector->ddc_bus = NULL; |
1171 | radeon_connector->ddc_bus = NULL; |
971 | } else { |
1172 | } else { |
972 | ret = connector_status_connected; |
1173 | ret = connector_status_connected; |
- | 1174 | broken_edid = true; /* defer use_digital to later */ |
|
973 | broken_edid = true; /* defer use_digital to later */ |
1175 | } |
Line 974... | Line 1176... | ||
974 | } |
1176 | } else { |
975 | } else { |
1177 | radeon_connector->use_digital = |
976 | radeon_connector->use_digital = !!(radeon_connector->edid->input & DRM_EDID_INPUT_DIGITAL); |
1178 | !!(radeon_connector->edid->input & DRM_EDID_INPUT_DIGITAL); |
977 | 1179 | ||
978 | /* some oems have boards with separate digital and analog connectors |
- | |
979 | * with a shared ddc line (often vga + hdmi) |
1180 | /* some oems have boards with separate digital and analog connectors |
980 | */ |
1181 | * with a shared ddc line (often vga + hdmi) |
981 | if ((!radeon_connector->use_digital) && radeon_connector->shared_ddc) { |
1182 | */ |
982 | kfree(radeon_connector->edid); |
1183 | if ((!radeon_connector->use_digital) && radeon_connector->shared_ddc) { |
983 | radeon_connector->edid = NULL; |
1184 | radeon_connector_free_edid(connector); |
984 | ret = connector_status_disconnected; |
1185 | ret = connector_status_disconnected; |
985 | } else |
1186 | } else { |
986 | ret = connector_status_connected; |
1187 | ret = connector_status_connected; |
987 | 1188 | } |
|
988 | /* This gets complicated. We have boards with VGA + HDMI with a |
1189 | /* This gets complicated. We have boards with VGA + HDMI with a |
Line 1002... | Line 1203... | ||
1002 | radeon_connector->ddc_bus->rec.i2c_id)) { |
1203 | radeon_connector->ddc_bus->rec.i2c_id)) { |
1003 | /* cases where both connectors are digital */ |
1204 | /* cases where both connectors are digital */ |
1004 | if (list_connector->connector_type != DRM_MODE_CONNECTOR_VGA) { |
1205 | if (list_connector->connector_type != DRM_MODE_CONNECTOR_VGA) { |
1005 | /* hpd is our only option in this case */ |
1206 | /* hpd is our only option in this case */ |
1006 | if (!radeon_hpd_sense(rdev, radeon_connector->hpd.hpd)) { |
1207 | if (!radeon_hpd_sense(rdev, radeon_connector->hpd.hpd)) { |
1007 | kfree(radeon_connector->edid); |
- | |
1008 | radeon_connector->edid = NULL; |
1208 | radeon_connector_free_edid(connector); |
1009 | ret = connector_status_disconnected; |
1209 | ret = connector_status_disconnected; |
1010 | } |
1210 | } |
1011 | } |
1211 | } |
1012 | } |
1212 | } |
1013 | } |
1213 | } |
Line 1037... | Line 1237... | ||
1037 | if (radeon_connector->dac_load_detect) { |
1237 | if (radeon_connector->dac_load_detect) { |
1038 | for (i = 0; i < DRM_CONNECTOR_MAX_ENCODER; i++) { |
1238 | for (i = 0; i < DRM_CONNECTOR_MAX_ENCODER; i++) { |
1039 | if (connector->encoder_ids[i] == 0) |
1239 | if (connector->encoder_ids[i] == 0) |
1040 | break; |
1240 | break; |
Line 1041... | Line 1241... | ||
1041 | 1241 | ||
1042 | obj = drm_mode_object_find(connector->dev, |
1242 | encoder = drm_encoder_find(connector->dev, |
1043 | connector->encoder_ids[i], |
- | |
1044 | DRM_MODE_OBJECT_ENCODER); |
1243 | connector->encoder_ids[i]); |
1045 | if (!obj) |
1244 | if (!encoder) |
Line 1046... | Line -... | ||
1046 | continue; |
- | |
1047 | - | ||
1048 | encoder = obj_to_encoder(obj); |
1245 | continue; |
1049 | 1246 | ||
1050 | if (encoder->encoder_type != DRM_MODE_ENCODER_DAC && |
1247 | if (encoder->encoder_type != DRM_MODE_ENCODER_DAC && |
Line 1051... | Line 1248... | ||
1051 | encoder->encoder_type != DRM_MODE_ENCODER_TVDAC) |
1248 | encoder->encoder_type != DRM_MODE_ENCODER_TVDAC) |
Line 1096... | Line 1293... | ||
1096 | ret = connector_status_connected; |
1293 | ret = connector_status_connected; |
1097 | } |
1294 | } |
Line 1098... | Line 1295... | ||
1098 | 1295 | ||
1099 | /* updated in get modes as well since we need to know if it's analog or digital */ |
1296 | /* updated in get modes as well since we need to know if it's analog or digital */ |
- | 1297 | radeon_connector_update_scratch_regs(connector, ret); |
|
- | 1298 | ||
1100 | radeon_connector_update_scratch_regs(connector, ret); |
1299 | exit: |
1101 | return ret; |
1300 | return ret; |
Line 1102... | Line 1301... | ||
1102 | } |
1301 | } |
1103 | 1302 | ||
1104 | /* okay need to be smart in here about which encoder to pick */ |
1303 | /* okay need to be smart in here about which encoder to pick */ |
1105 | static struct drm_encoder *radeon_dvi_encoder(struct drm_connector *connector) |
1304 | static struct drm_encoder *radeon_dvi_encoder(struct drm_connector *connector) |
1106 | { |
1305 | { |
1107 | int enc_id = connector->encoder_ids[0]; |
- | |
1108 | struct radeon_connector *radeon_connector = to_radeon_connector(connector); |
1306 | int enc_id = connector->encoder_ids[0]; |
1109 | struct drm_mode_object *obj; |
1307 | struct radeon_connector *radeon_connector = to_radeon_connector(connector); |
1110 | struct drm_encoder *encoder; |
1308 | struct drm_encoder *encoder; |
1111 | int i; |
1309 | int i; |
1112 | for (i = 0; i < DRM_CONNECTOR_MAX_ENCODER; i++) { |
1310 | for (i = 0; i < DRM_CONNECTOR_MAX_ENCODER; i++) { |
Line 1113... | Line 1311... | ||
1113 | if (connector->encoder_ids[i] == 0) |
1311 | if (connector->encoder_ids[i] == 0) |
1114 | break; |
1312 | break; |
1115 | 1313 | ||
Line 1116... | Line -... | ||
1116 | obj = drm_mode_object_find(connector->dev, connector->encoder_ids[i], DRM_MODE_OBJECT_ENCODER); |
- | |
1117 | if (!obj) |
- | |
1118 | continue; |
1314 | encoder = drm_encoder_find(connector->dev, connector->encoder_ids[i]); |
1119 | 1315 | if (!encoder) |
|
1120 | encoder = obj_to_encoder(obj); |
1316 | continue; |
1121 | 1317 | ||
1122 | if (radeon_connector->use_digital == true) { |
1318 | if (radeon_connector->use_digital == true) { |
Line 1131... | Line 1327... | ||
1131 | 1327 | ||
Line 1132... | Line 1328... | ||
1132 | /* see if we have a default encoder TODO */ |
1328 | /* see if we have a default encoder TODO */ |
1133 | 1329 | ||
1134 | /* then check use digitial */ |
1330 | /* then check use digitial */ |
1135 | /* pick the first one */ |
1331 | /* pick the first one */ |
1136 | if (enc_id) { |
- | |
1137 | obj = drm_mode_object_find(connector->dev, enc_id, DRM_MODE_OBJECT_ENCODER); |
- | |
1138 | if (!obj) |
- | |
1139 | return NULL; |
- | |
1140 | encoder = obj_to_encoder(obj); |
- | |
1141 | return encoder; |
1332 | if (enc_id) |
1142 | } |
1333 | return drm_encoder_find(connector->dev, enc_id); |
Line 1143... | Line 1334... | ||
1143 | return NULL; |
1334 | return NULL; |
1144 | } |
1335 | } |
Line 1170... | Line 1361... | ||
1170 | if (radeon_connector->use_digital && (mode->clock > 165000)) { |
1361 | if (radeon_connector->use_digital && (mode->clock > 165000)) { |
1171 | if ((radeon_connector->connector_object_id == CONNECTOR_OBJECT_ID_DUAL_LINK_DVI_I) || |
1362 | if ((radeon_connector->connector_object_id == CONNECTOR_OBJECT_ID_DUAL_LINK_DVI_I) || |
1172 | (radeon_connector->connector_object_id == CONNECTOR_OBJECT_ID_DUAL_LINK_DVI_D) || |
1363 | (radeon_connector->connector_object_id == CONNECTOR_OBJECT_ID_DUAL_LINK_DVI_D) || |
1173 | (radeon_connector->connector_object_id == CONNECTOR_OBJECT_ID_HDMI_TYPE_B)) |
1364 | (radeon_connector->connector_object_id == CONNECTOR_OBJECT_ID_HDMI_TYPE_B)) |
1174 | return MODE_OK; |
1365 | return MODE_OK; |
1175 | else if (radeon_connector->connector_object_id == CONNECTOR_OBJECT_ID_HDMI_TYPE_A) { |
1366 | else if (ASIC_IS_DCE6(rdev) && drm_detect_hdmi_monitor(radeon_connector_edid(connector))) { |
1176 | if (ASIC_IS_DCE6(rdev)) { |
- | |
1177 | /* HDMI 1.3+ supports max clock of 340 Mhz */ |
1367 | /* HDMI 1.3+ supports max clock of 340 Mhz */ |
1178 | if (mode->clock > 340000) |
1368 | if (mode->clock > 340000) |
1179 | return MODE_CLOCK_HIGH; |
1369 | return MODE_CLOCK_HIGH; |
1180 | else |
1370 | else |
1181 | return MODE_OK; |
1371 | return MODE_OK; |
1182 | } else |
- | |
1183 | return MODE_CLOCK_HIGH; |
- | |
1184 | } else |
1372 | } else { |
1185 | return MODE_CLOCK_HIGH; |
1373 | return MODE_CLOCK_HIGH; |
1186 | } |
1374 | } |
- | 1375 | } |
|
Line 1187... | Line 1376... | ||
1187 | 1376 | ||
1188 | /* check against the max pixel clock */ |
1377 | /* check against the max pixel clock */ |
1189 | if ((mode->clock / 10) > rdev->clock.max_pixel_clock) |
1378 | if ((mode->clock / 10) > rdev->clock.max_pixel_clock) |
Line 1190... | Line 1379... | ||
1190 | return MODE_CLOCK_HIGH; |
1379 | return MODE_CLOCK_HIGH; |
1191 | 1380 | ||
Line 1192... | Line 1381... | ||
1192 | return MODE_OK; |
1381 | return MODE_OK; |
1193 | } |
1382 | } |
1194 | 1383 | ||
1195 | static const struct drm_connector_helper_funcs radeon_dvi_connector_helper_funcs = { |
1384 | static const struct drm_connector_helper_funcs radeon_dvi_connector_helper_funcs = { |
1196 | .get_modes = radeon_dvi_get_modes, |
1385 | .get_modes = radeon_vga_get_modes, |
Line 1197... | Line 1386... | ||
1197 | .mode_valid = radeon_dvi_mode_valid, |
1386 | .mode_valid = radeon_dvi_mode_valid, |
Line 1205... | Line 1394... | ||
1205 | .set_property = radeon_connector_set_property, |
1394 | .set_property = radeon_connector_set_property, |
1206 | .destroy = radeon_connector_destroy, |
1395 | .destroy = radeon_connector_destroy, |
1207 | .force = radeon_dvi_force, |
1396 | .force = radeon_dvi_force, |
1208 | }; |
1397 | }; |
Line 1209... | Line -... | ||
1209 | - | ||
1210 | static void radeon_dp_connector_destroy(struct drm_connector *connector) |
- | |
1211 | { |
- | |
1212 | struct radeon_connector *radeon_connector = to_radeon_connector(connector); |
- | |
1213 | struct radeon_connector_atom_dig *radeon_dig_connector = radeon_connector->con_priv; |
- | |
1214 | - | ||
1215 | if (radeon_connector->edid) |
- | |
1216 | kfree(radeon_connector->edid); |
- | |
1217 | if (radeon_dig_connector->dp_i2c_bus) |
- | |
1218 | radeon_i2c_destroy(radeon_dig_connector->dp_i2c_bus); |
- | |
1219 | kfree(radeon_connector->con_priv); |
- | |
1220 | // drm_sysfs_connector_remove(connector); |
- | |
1221 | drm_connector_cleanup(connector); |
- | |
1222 | kfree(connector); |
- | |
1223 | } |
- | |
1224 | 1398 | ||
1225 | static int radeon_dp_get_modes(struct drm_connector *connector) |
1399 | static int radeon_dp_get_modes(struct drm_connector *connector) |
1226 | { |
1400 | { |
1227 | struct radeon_connector *radeon_connector = to_radeon_connector(connector); |
1401 | struct radeon_connector *radeon_connector = to_radeon_connector(connector); |
1228 | struct radeon_connector_atom_dig *radeon_dig_connector = radeon_connector->con_priv; |
1402 | struct radeon_connector_atom_dig *radeon_dig_connector = radeon_connector->con_priv; |
Line 1235... | Line 1409... | ||
1235 | 1409 | ||
1236 | if (connector->connector_type == DRM_MODE_CONNECTOR_eDP) { |
1410 | if (connector->connector_type == DRM_MODE_CONNECTOR_eDP) { |
1237 | if (!radeon_dig_connector->edp_on) |
1411 | if (!radeon_dig_connector->edp_on) |
1238 | atombios_set_edp_panel_power(connector, |
1412 | atombios_set_edp_panel_power(connector, |
- | 1413 | ATOM_TRANSMITTER_ACTION_POWER_ON); |
|
1239 | ATOM_TRANSMITTER_ACTION_POWER_ON); |
1414 | radeon_connector_get_edid(connector); |
1240 | ret = radeon_ddc_get_modes(radeon_connector); |
1415 | ret = radeon_ddc_get_modes(connector); |
1241 | if (!radeon_dig_connector->edp_on) |
1416 | if (!radeon_dig_connector->edp_on) |
1242 | atombios_set_edp_panel_power(connector, |
1417 | atombios_set_edp_panel_power(connector, |
1243 | ATOM_TRANSMITTER_ACTION_POWER_OFF); |
1418 | ATOM_TRANSMITTER_ACTION_POWER_OFF); |
1244 | } else { |
1419 | } else { |
1245 | /* need to setup ddc on the bridge */ |
1420 | /* need to setup ddc on the bridge */ |
1246 | if (radeon_connector_encoder_get_dp_bridge_encoder_id(connector) != |
1421 | if (radeon_connector_encoder_get_dp_bridge_encoder_id(connector) != |
1247 | ENCODER_OBJECT_ID_NONE) { |
1422 | ENCODER_OBJECT_ID_NONE) { |
1248 | if (encoder) |
1423 | if (encoder) |
1249 | radeon_atom_ext_encoder_setup_ddc(encoder); |
1424 | radeon_atom_ext_encoder_setup_ddc(encoder); |
- | 1425 | } |
|
1250 | } |
1426 | radeon_connector_get_edid(connector); |
1251 | ret = radeon_ddc_get_modes(radeon_connector); |
1427 | ret = radeon_ddc_get_modes(connector); |
Line 1252... | Line 1428... | ||
1252 | } |
1428 | } |
1253 | 1429 | ||
1254 | if (ret > 0) { |
1430 | if (ret > 0) { |
Line 1279... | Line 1455... | ||
1279 | if (radeon_connector_encoder_get_dp_bridge_encoder_id(connector) != |
1455 | if (radeon_connector_encoder_get_dp_bridge_encoder_id(connector) != |
1280 | ENCODER_OBJECT_ID_NONE) { |
1456 | ENCODER_OBJECT_ID_NONE) { |
1281 | if (encoder) |
1457 | if (encoder) |
1282 | radeon_atom_ext_encoder_setup_ddc(encoder); |
1458 | radeon_atom_ext_encoder_setup_ddc(encoder); |
1283 | } |
1459 | } |
- | 1460 | radeon_connector_get_edid(connector); |
|
1284 | ret = radeon_ddc_get_modes(radeon_connector); |
1461 | ret = radeon_ddc_get_modes(connector); |
- | 1462 | ||
- | 1463 | radeon_get_native_mode(connector); |
|
1285 | } |
1464 | } |
Line 1286... | Line 1465... | ||
1286 | 1465 | ||
1287 | return ret; |
1466 | return ret; |
Line 1288... | Line 1467... | ||
1288 | } |
1467 | } |
1289 | 1468 | ||
1290 | u16 radeon_connector_encoder_get_dp_bridge_encoder_id(struct drm_connector *connector) |
- | |
1291 | { |
1469 | u16 radeon_connector_encoder_get_dp_bridge_encoder_id(struct drm_connector *connector) |
1292 | struct drm_mode_object *obj; |
1470 | { |
1293 | struct drm_encoder *encoder; |
1471 | struct drm_encoder *encoder; |
Line 1294... | Line 1472... | ||
1294 | struct radeon_encoder *radeon_encoder; |
1472 | struct radeon_encoder *radeon_encoder; |
1295 | int i; |
1473 | int i; |
1296 | 1474 | ||
Line 1297... | Line 1475... | ||
1297 | for (i = 0; i < DRM_CONNECTOR_MAX_ENCODER; i++) { |
1475 | for (i = 0; i < DRM_CONNECTOR_MAX_ENCODER; i++) { |
1298 | if (connector->encoder_ids[i] == 0) |
1476 | if (connector->encoder_ids[i] == 0) |
1299 | break; |
1477 | break; |
Line 1300... | Line -... | ||
1300 | - | ||
1301 | obj = drm_mode_object_find(connector->dev, connector->encoder_ids[i], DRM_MODE_OBJECT_ENCODER); |
1478 | |
Line 1302... | Line 1479... | ||
1302 | if (!obj) |
1479 | encoder = drm_encoder_find(connector->dev, connector->encoder_ids[i]); |
1303 | continue; |
1480 | if (!encoder) |
1304 | 1481 | continue; |
|
Line 1315... | Line 1492... | ||
1315 | } |
1492 | } |
Line 1316... | Line 1493... | ||
1316 | 1493 | ||
1317 | return ENCODER_OBJECT_ID_NONE; |
1494 | return ENCODER_OBJECT_ID_NONE; |
Line 1318... | Line 1495... | ||
1318 | } |
1495 | } |
1319 | 1496 | ||
1320 | bool radeon_connector_encoder_is_hbr2(struct drm_connector *connector) |
- | |
1321 | { |
1497 | static bool radeon_connector_encoder_is_hbr2(struct drm_connector *connector) |
1322 | struct drm_mode_object *obj; |
1498 | { |
1323 | struct drm_encoder *encoder; |
1499 | struct drm_encoder *encoder; |
1324 | struct radeon_encoder *radeon_encoder; |
1500 | struct radeon_encoder *radeon_encoder; |
Line 1325... | Line 1501... | ||
1325 | int i; |
1501 | int i; |
1326 | bool found = false; |
1502 | bool found = false; |
1327 | 1503 | ||
Line 1328... | Line 1504... | ||
1328 | for (i = 0; i < DRM_CONNECTOR_MAX_ENCODER; i++) { |
1504 | for (i = 0; i < DRM_CONNECTOR_MAX_ENCODER; i++) { |
1329 | if (connector->encoder_ids[i] == 0) |
1505 | if (connector->encoder_ids[i] == 0) |
1330 | break; |
1506 | break; |
Line 1331... | Line -... | ||
1331 | - | ||
1332 | obj = drm_mode_object_find(connector->dev, connector->encoder_ids[i], DRM_MODE_OBJECT_ENCODER); |
1507 | |
1333 | if (!obj) |
1508 | encoder = drm_encoder_find(connector->dev, connector->encoder_ids[i]); |
1334 | continue; |
1509 | if (!encoder) |
1335 | 1510 | continue; |
|
Line 1346... | Line 1521... | ||
1346 | { |
1521 | { |
1347 | struct drm_device *dev = connector->dev; |
1522 | struct drm_device *dev = connector->dev; |
1348 | struct radeon_device *rdev = dev->dev_private; |
1523 | struct radeon_device *rdev = dev->dev_private; |
Line 1349... | Line 1524... | ||
1349 | 1524 | ||
1350 | if (ASIC_IS_DCE5(rdev) && |
1525 | if (ASIC_IS_DCE5(rdev) && |
1351 | (rdev->clock.dp_extclk >= 53900) && |
1526 | (rdev->clock.default_dispclk >= 53900) && |
1352 | radeon_connector_encoder_is_hbr2(connector)) { |
1527 | radeon_connector_encoder_is_hbr2(connector)) { |
1353 | return true; |
1528 | return true; |
Line 1354... | Line 1529... | ||
1354 | } |
1529 | } |
Line 1363... | Line 1538... | ||
1363 | struct radeon_device *rdev = dev->dev_private; |
1538 | struct radeon_device *rdev = dev->dev_private; |
1364 | struct radeon_connector *radeon_connector = to_radeon_connector(connector); |
1539 | struct radeon_connector *radeon_connector = to_radeon_connector(connector); |
1365 | enum drm_connector_status ret = connector_status_disconnected; |
1540 | enum drm_connector_status ret = connector_status_disconnected; |
1366 | struct radeon_connector_atom_dig *radeon_dig_connector = radeon_connector->con_priv; |
1541 | struct radeon_connector_atom_dig *radeon_dig_connector = radeon_connector->con_priv; |
1367 | struct drm_encoder *encoder = radeon_best_single_encoder(connector); |
1542 | struct drm_encoder *encoder = radeon_best_single_encoder(connector); |
- | 1543 | int r; |
|
Line 1368... | Line -... | ||
1368 | - | ||
1369 | - | ||
1370 | #if DISABLE_DP |
- | |
1371 | connector->status = connector_status_disconnected; |
- | |
1372 | return connector->status; |
- | |
1373 | #endif |
1544 | |
1374 | 1545 | ||
1375 | if (!force && radeon_check_hpd_status_unchanged(connector)) |
- | |
1376 | return connector->status; |
- | |
1377 | - | ||
1378 | if (radeon_connector->edid) { |
1546 | if (!force && radeon_check_hpd_status_unchanged(connector)) { |
1379 | kfree(radeon_connector->edid); |
1547 | ret = connector->status; |
Line -... | Line 1548... | ||
- | 1548 | goto out; |
|
- | 1549 | } |
|
1380 | radeon_connector->edid = NULL; |
1550 | |
1381 | } |
1551 | radeon_connector_free_edid(connector); |
1382 | 1552 | ||
1383 | if ((connector->connector_type == DRM_MODE_CONNECTOR_eDP) || |
1553 | if ((connector->connector_type == DRM_MODE_CONNECTOR_eDP) || |
1384 | (connector->connector_type == DRM_MODE_CONNECTOR_LVDS)) { |
1554 | (connector->connector_type == DRM_MODE_CONNECTOR_LVDS)) { |
Line 1427... | Line 1597... | ||
1427 | } else { |
1597 | } else { |
1428 | if (radeon_dig_connector->dp_sink_type == CONNECTOR_OBJECT_ID_DISPLAYPORT) { |
1598 | if (radeon_dig_connector->dp_sink_type == CONNECTOR_OBJECT_ID_DISPLAYPORT) { |
1429 | if (radeon_dp_getdpcd(radeon_connector)) |
1599 | if (radeon_dp_getdpcd(radeon_connector)) |
1430 | ret = connector_status_connected; |
1600 | ret = connector_status_connected; |
1431 | } else { |
1601 | } else { |
1432 | /* try non-aux ddc (DP to DVI/HMDI/etc. adapter) */ |
1602 | /* try non-aux ddc (DP to DVI/HDMI/etc. adapter) */ |
1433 | if (radeon_ddc_probe(radeon_connector, false)) |
1603 | if (radeon_ddc_probe(radeon_connector, false)) |
1434 | ret = connector_status_connected; |
1604 | ret = connector_status_connected; |
1435 | } |
1605 | } |
1436 | } |
1606 | } |
1437 | } |
1607 | } |
Line 1438... | Line 1608... | ||
1438 | 1608 | ||
- | 1609 | radeon_connector_update_scratch_regs(connector, ret); |
|
1439 | radeon_connector_update_scratch_regs(connector, ret); |
1610 | out: |
1440 | return ret; |
1611 | return ret; |
Line 1441... | Line 1612... | ||
1441 | } |
1612 | } |
1442 | 1613 | ||
1443 | static int radeon_dp_mode_valid(struct drm_connector *connector, |
1614 | static int radeon_dp_mode_valid(struct drm_connector *connector, |
- | 1615 | struct drm_display_mode *mode) |
|
- | 1616 | { |
|
1444 | struct drm_display_mode *mode) |
1617 | struct drm_device *dev = connector->dev; |
1445 | { |
1618 | struct radeon_device *rdev = dev->dev_private; |
Line 1446... | Line 1619... | ||
1446 | struct radeon_connector *radeon_connector = to_radeon_connector(connector); |
1619 | struct radeon_connector *radeon_connector = to_radeon_connector(connector); |
Line 1471... | Line 1644... | ||
1471 | if ((mode->hdisplay != native_mode->hdisplay) || |
1644 | if ((mode->hdisplay != native_mode->hdisplay) || |
1472 | (mode->vdisplay != native_mode->vdisplay)) |
1645 | (mode->vdisplay != native_mode->vdisplay)) |
1473 | return MODE_PANEL; |
1646 | return MODE_PANEL; |
1474 | } |
1647 | } |
1475 | } |
1648 | } |
1476 | return MODE_OK; |
- | |
1477 | } else { |
1649 | } else { |
1478 | if ((radeon_dig_connector->dp_sink_type == CONNECTOR_OBJECT_ID_DISPLAYPORT) || |
1650 | if ((radeon_dig_connector->dp_sink_type == CONNECTOR_OBJECT_ID_DISPLAYPORT) || |
1479 | (radeon_dig_connector->dp_sink_type == CONNECTOR_OBJECT_ID_eDP)) |
1651 | (radeon_dig_connector->dp_sink_type == CONNECTOR_OBJECT_ID_eDP)) { |
1480 | return radeon_dp_mode_valid_helper(connector, mode); |
1652 | return radeon_dp_mode_valid_helper(connector, mode); |
1481 | else |
1653 | } else { |
- | 1654 | if (ASIC_IS_DCE6(rdev) && drm_detect_hdmi_monitor(radeon_connector_edid(connector))) { |
|
- | 1655 | /* HDMI 1.3+ supports max clock of 340 Mhz */ |
|
- | 1656 | if (mode->clock > 340000) |
|
- | 1657 | return MODE_CLOCK_HIGH; |
|
- | 1658 | } else { |
|
- | 1659 | if (mode->clock > 165000) |
|
1482 | return MODE_OK; |
1660 | return MODE_CLOCK_HIGH; |
- | 1661 | } |
|
- | 1662 | } |
|
1483 | } |
1663 | } |
- | 1664 | ||
- | 1665 | return MODE_OK; |
|
1484 | } |
1666 | } |
Line 1485... | Line 1667... | ||
1485 | 1667 | ||
1486 | static const struct drm_connector_helper_funcs radeon_dp_connector_helper_funcs = { |
1668 | static const struct drm_connector_helper_funcs radeon_dp_connector_helper_funcs = { |
1487 | .get_modes = radeon_dp_get_modes, |
1669 | .get_modes = radeon_dp_get_modes, |
Line 1492... | Line 1674... | ||
1492 | static const struct drm_connector_funcs radeon_dp_connector_funcs = { |
1674 | static const struct drm_connector_funcs radeon_dp_connector_funcs = { |
1493 | .dpms = drm_helper_connector_dpms, |
1675 | .dpms = drm_helper_connector_dpms, |
1494 | .detect = radeon_dp_detect, |
1676 | .detect = radeon_dp_detect, |
1495 | .fill_modes = drm_helper_probe_single_connector_modes, |
1677 | .fill_modes = drm_helper_probe_single_connector_modes, |
1496 | .set_property = radeon_connector_set_property, |
1678 | .set_property = radeon_connector_set_property, |
1497 | .destroy = radeon_dp_connector_destroy, |
1679 | .destroy = radeon_connector_destroy, |
- | 1680 | .force = radeon_dvi_force, |
|
- | 1681 | }; |
|
- | 1682 | ||
- | 1683 | static const struct drm_connector_funcs radeon_edp_connector_funcs = { |
|
- | 1684 | .dpms = drm_helper_connector_dpms, |
|
- | 1685 | .detect = radeon_dp_detect, |
|
- | 1686 | .fill_modes = drm_helper_probe_single_connector_modes, |
|
- | 1687 | .set_property = radeon_lvds_set_property, |
|
- | 1688 | .destroy = radeon_connector_destroy, |
|
- | 1689 | .force = radeon_dvi_force, |
|
- | 1690 | }; |
|
- | 1691 | ||
- | 1692 | static const struct drm_connector_funcs radeon_lvds_bridge_connector_funcs = { |
|
- | 1693 | .dpms = drm_helper_connector_dpms, |
|
- | 1694 | .detect = radeon_dp_detect, |
|
- | 1695 | .fill_modes = drm_helper_probe_single_connector_modes, |
|
- | 1696 | .set_property = radeon_lvds_set_property, |
|
- | 1697 | .destroy = radeon_connector_destroy, |
|
1498 | .force = radeon_dvi_force, |
1698 | .force = radeon_dvi_force, |
1499 | }; |
1699 | }; |
Line 1500... | Line 1700... | ||
1500 | 1700 | ||
1501 | void |
1701 | void |
Line 1516... | Line 1716... | ||
1516 | struct drm_encoder *encoder; |
1716 | struct drm_encoder *encoder; |
1517 | struct radeon_encoder *radeon_encoder; |
1717 | struct radeon_encoder *radeon_encoder; |
1518 | uint32_t subpixel_order = SubPixelNone; |
1718 | uint32_t subpixel_order = SubPixelNone; |
1519 | bool shared_ddc = false; |
1719 | bool shared_ddc = false; |
1520 | bool is_dp_bridge = false; |
1720 | bool is_dp_bridge = false; |
- | 1721 | bool has_aux = false; |
|
Line 1521... | Line 1722... | ||
1521 | 1722 | ||
1522 | if (connector_type == DRM_MODE_CONNECTOR_Unknown) |
1723 | if (connector_type == DRM_MODE_CONNECTOR_Unknown) |
Line 1523... | Line 1724... | ||
1523 | return; |
1724 | return; |
Line 1587... | Line 1788... | ||
1587 | radeon_dig_connector = kzalloc(sizeof(struct radeon_connector_atom_dig), GFP_KERNEL); |
1788 | radeon_dig_connector = kzalloc(sizeof(struct radeon_connector_atom_dig), GFP_KERNEL); |
1588 | if (!radeon_dig_connector) |
1789 | if (!radeon_dig_connector) |
1589 | goto failed; |
1790 | goto failed; |
1590 | radeon_dig_connector->igp_lane_info = igp_lane_info; |
1791 | radeon_dig_connector->igp_lane_info = igp_lane_info; |
1591 | radeon_connector->con_priv = radeon_dig_connector; |
1792 | radeon_connector->con_priv = radeon_dig_connector; |
1592 | drm_connector_init(dev, &radeon_connector->base, &radeon_dp_connector_funcs, connector_type); |
- | |
1593 | drm_connector_helper_add(&radeon_connector->base, &radeon_dp_connector_helper_funcs); |
- | |
1594 | if (i2c_bus->valid) { |
1793 | if (i2c_bus->valid) { |
1595 | /* add DP i2c bus */ |
- | |
1596 | if (connector_type == DRM_MODE_CONNECTOR_eDP) |
- | |
1597 | radeon_dig_connector->dp_i2c_bus = radeon_i2c_create_dp(dev, i2c_bus, "eDP-auxch"); |
- | |
1598 | else |
- | |
1599 | radeon_dig_connector->dp_i2c_bus = radeon_i2c_create_dp(dev, i2c_bus, "DP-auxch"); |
- | |
1600 | if (!radeon_dig_connector->dp_i2c_bus) |
- | |
1601 | DRM_ERROR("DP: Failed to assign dp ddc bus! Check dmesg for i2c errors.\n"); |
- | |
1602 | radeon_connector->ddc_bus = radeon_i2c_lookup(rdev, i2c_bus); |
1794 | radeon_connector->ddc_bus = radeon_i2c_lookup(rdev, i2c_bus); |
1603 | if (!radeon_connector->ddc_bus) |
1795 | if (radeon_connector->ddc_bus) |
- | 1796 | has_aux = true; |
|
- | 1797 | else |
|
1604 | DRM_ERROR("DP: Failed to assign ddc bus! Check dmesg for i2c errors.\n"); |
1798 | DRM_ERROR("DP: Failed to assign ddc bus! Check dmesg for i2c errors.\n"); |
1605 | } |
1799 | } |
1606 | switch (connector_type) { |
1800 | switch (connector_type) { |
1607 | case DRM_MODE_CONNECTOR_VGA: |
1801 | case DRM_MODE_CONNECTOR_VGA: |
1608 | case DRM_MODE_CONNECTOR_DVIA: |
1802 | case DRM_MODE_CONNECTOR_DVIA: |
1609 | default: |
1803 | default: |
- | 1804 | drm_connector_init(dev, &radeon_connector->base, |
|
- | 1805 | &radeon_dp_connector_funcs, connector_type); |
|
- | 1806 | drm_connector_helper_add(&radeon_connector->base, |
|
- | 1807 | &radeon_dp_connector_helper_funcs); |
|
1610 | connector->interlace_allowed = true; |
1808 | connector->interlace_allowed = true; |
1611 | connector->doublescan_allowed = true; |
1809 | connector->doublescan_allowed = true; |
1612 | radeon_connector->dac_load_detect = true; |
1810 | radeon_connector->dac_load_detect = true; |
1613 | drm_object_attach_property(&radeon_connector->base.base, |
1811 | drm_object_attach_property(&radeon_connector->base.base, |
1614 | rdev->mode_info.load_detect_property, |
1812 | rdev->mode_info.load_detect_property, |
1615 | 1); |
1813 | 1); |
- | 1814 | drm_object_attach_property(&radeon_connector->base.base, |
|
- | 1815 | dev->mode_config.scaling_mode_property, |
|
- | 1816 | DRM_MODE_SCALE_NONE); |
|
1616 | break; |
1817 | break; |
1617 | case DRM_MODE_CONNECTOR_DVII: |
1818 | case DRM_MODE_CONNECTOR_DVII: |
1618 | case DRM_MODE_CONNECTOR_DVID: |
1819 | case DRM_MODE_CONNECTOR_DVID: |
1619 | case DRM_MODE_CONNECTOR_HDMIA: |
1820 | case DRM_MODE_CONNECTOR_HDMIA: |
1620 | case DRM_MODE_CONNECTOR_HDMIB: |
1821 | case DRM_MODE_CONNECTOR_HDMIB: |
1621 | case DRM_MODE_CONNECTOR_DisplayPort: |
1822 | case DRM_MODE_CONNECTOR_DisplayPort: |
- | 1823 | drm_connector_init(dev, &radeon_connector->base, |
|
- | 1824 | &radeon_dp_connector_funcs, connector_type); |
|
- | 1825 | drm_connector_helper_add(&radeon_connector->base, |
|
- | 1826 | &radeon_dp_connector_helper_funcs); |
|
1622 | drm_object_attach_property(&radeon_connector->base.base, |
1827 | drm_object_attach_property(&radeon_connector->base.base, |
1623 | rdev->mode_info.underscan_property, |
1828 | rdev->mode_info.underscan_property, |
1624 | UNDERSCAN_OFF); |
1829 | UNDERSCAN_OFF); |
1625 | drm_object_attach_property(&radeon_connector->base.base, |
1830 | drm_object_attach_property(&radeon_connector->base.base, |
1626 | rdev->mode_info.underscan_hborder_property, |
1831 | rdev->mode_info.underscan_hborder_property, |
1627 | 0); |
1832 | 0); |
1628 | drm_object_attach_property(&radeon_connector->base.base, |
1833 | drm_object_attach_property(&radeon_connector->base.base, |
1629 | rdev->mode_info.underscan_vborder_property, |
1834 | rdev->mode_info.underscan_vborder_property, |
1630 | 0); |
1835 | 0); |
- | 1836 | ||
- | 1837 | drm_object_attach_property(&radeon_connector->base.base, |
|
- | 1838 | dev->mode_config.scaling_mode_property, |
|
- | 1839 | DRM_MODE_SCALE_NONE); |
|
- | 1840 | ||
- | 1841 | drm_object_attach_property(&radeon_connector->base.base, |
|
- | 1842 | rdev->mode_info.dither_property, |
|
- | 1843 | RADEON_FMT_DITHER_DISABLE); |
|
- | 1844 | ||
- | 1845 | if (radeon_audio != 0) |
|
- | 1846 | drm_object_attach_property(&radeon_connector->base.base, |
|
- | 1847 | rdev->mode_info.audio_property, |
|
- | 1848 | RADEON_AUDIO_AUTO); |
|
- | 1849 | ||
1631 | subpixel_order = SubPixelHorizontalRGB; |
1850 | subpixel_order = SubPixelHorizontalRGB; |
1632 | connector->interlace_allowed = true; |
1851 | connector->interlace_allowed = true; |
1633 | if (connector_type == DRM_MODE_CONNECTOR_HDMIB) |
1852 | if (connector_type == DRM_MODE_CONNECTOR_HDMIB) |
1634 | connector->doublescan_allowed = true; |
1853 | connector->doublescan_allowed = true; |
1635 | else |
1854 | else |
Line 1641... | Line 1860... | ||
1641 | 1); |
1860 | 1); |
1642 | } |
1861 | } |
1643 | break; |
1862 | break; |
1644 | case DRM_MODE_CONNECTOR_LVDS: |
1863 | case DRM_MODE_CONNECTOR_LVDS: |
1645 | case DRM_MODE_CONNECTOR_eDP: |
1864 | case DRM_MODE_CONNECTOR_eDP: |
- | 1865 | drm_connector_init(dev, &radeon_connector->base, |
|
- | 1866 | &radeon_lvds_bridge_connector_funcs, connector_type); |
|
- | 1867 | drm_connector_helper_add(&radeon_connector->base, |
|
- | 1868 | &radeon_dp_connector_helper_funcs); |
|
1646 | drm_object_attach_property(&radeon_connector->base.base, |
1869 | drm_object_attach_property(&radeon_connector->base.base, |
1647 | dev->mode_config.scaling_mode_property, |
1870 | dev->mode_config.scaling_mode_property, |
1648 | DRM_MODE_SCALE_FULLSCREEN); |
1871 | DRM_MODE_SCALE_FULLSCREEN); |
1649 | subpixel_order = SubPixelHorizontalRGB; |
1872 | subpixel_order = SubPixelHorizontalRGB; |
1650 | connector->interlace_allowed = false; |
1873 | connector->interlace_allowed = false; |
Line 1663... | Line 1886... | ||
1663 | } |
1886 | } |
1664 | radeon_connector->dac_load_detect = true; |
1887 | radeon_connector->dac_load_detect = true; |
1665 | drm_object_attach_property(&radeon_connector->base.base, |
1888 | drm_object_attach_property(&radeon_connector->base.base, |
1666 | rdev->mode_info.load_detect_property, |
1889 | rdev->mode_info.load_detect_property, |
1667 | 1); |
1890 | 1); |
- | 1891 | if (ASIC_IS_AVIVO(rdev)) |
|
- | 1892 | drm_object_attach_property(&radeon_connector->base.base, |
|
- | 1893 | dev->mode_config.scaling_mode_property, |
|
- | 1894 | DRM_MODE_SCALE_NONE); |
|
1668 | /* no HPD on analog connectors */ |
1895 | /* no HPD on analog connectors */ |
1669 | radeon_connector->hpd.hpd = RADEON_HPD_NONE; |
1896 | radeon_connector->hpd.hpd = RADEON_HPD_NONE; |
1670 | connector->polled = DRM_CONNECTOR_POLL_CONNECT; |
1897 | connector->polled = DRM_CONNECTOR_POLL_CONNECT; |
1671 | connector->interlace_allowed = true; |
1898 | connector->interlace_allowed = true; |
1672 | connector->doublescan_allowed = true; |
1899 | connector->doublescan_allowed = true; |
Line 1681... | Line 1908... | ||
1681 | } |
1908 | } |
1682 | radeon_connector->dac_load_detect = true; |
1909 | radeon_connector->dac_load_detect = true; |
1683 | drm_object_attach_property(&radeon_connector->base.base, |
1910 | drm_object_attach_property(&radeon_connector->base.base, |
1684 | rdev->mode_info.load_detect_property, |
1911 | rdev->mode_info.load_detect_property, |
1685 | 1); |
1912 | 1); |
- | 1913 | if (ASIC_IS_AVIVO(rdev)) |
|
- | 1914 | drm_object_attach_property(&radeon_connector->base.base, |
|
- | 1915 | dev->mode_config.scaling_mode_property, |
|
- | 1916 | DRM_MODE_SCALE_NONE); |
|
1686 | /* no HPD on analog connectors */ |
1917 | /* no HPD on analog connectors */ |
1687 | radeon_connector->hpd.hpd = RADEON_HPD_NONE; |
1918 | radeon_connector->hpd.hpd = RADEON_HPD_NONE; |
1688 | connector->interlace_allowed = true; |
1919 | connector->interlace_allowed = true; |
1689 | connector->doublescan_allowed = true; |
1920 | connector->doublescan_allowed = true; |
1690 | break; |
1921 | break; |
Line 1714... | Line 1945... | ||
1714 | rdev->mode_info.underscan_hborder_property, |
1945 | rdev->mode_info.underscan_hborder_property, |
1715 | 0); |
1946 | 0); |
1716 | drm_object_attach_property(&radeon_connector->base.base, |
1947 | drm_object_attach_property(&radeon_connector->base.base, |
1717 | rdev->mode_info.underscan_vborder_property, |
1948 | rdev->mode_info.underscan_vborder_property, |
1718 | 0); |
1949 | 0); |
- | 1950 | drm_object_attach_property(&radeon_connector->base.base, |
|
- | 1951 | rdev->mode_info.dither_property, |
|
- | 1952 | RADEON_FMT_DITHER_DISABLE); |
|
- | 1953 | drm_object_attach_property(&radeon_connector->base.base, |
|
- | 1954 | dev->mode_config.scaling_mode_property, |
|
- | 1955 | DRM_MODE_SCALE_NONE); |
|
- | 1956 | } |
|
- | 1957 | if (ASIC_IS_DCE2(rdev) && (radeon_audio != 0)) { |
|
- | 1958 | drm_object_attach_property(&radeon_connector->base.base, |
|
- | 1959 | rdev->mode_info.audio_property, |
|
- | 1960 | RADEON_AUDIO_AUTO); |
|
1719 | } |
1961 | } |
1720 | if (connector_type == DRM_MODE_CONNECTOR_DVII) { |
1962 | if (connector_type == DRM_MODE_CONNECTOR_DVII) { |
1721 | radeon_connector->dac_load_detect = true; |
1963 | radeon_connector->dac_load_detect = true; |
1722 | drm_object_attach_property(&radeon_connector->base.base, |
1964 | drm_object_attach_property(&radeon_connector->base.base, |
1723 | rdev->mode_info.load_detect_property, |
1965 | rdev->mode_info.load_detect_property, |
Line 1754... | Line 1996... | ||
1754 | rdev->mode_info.underscan_hborder_property, |
1996 | rdev->mode_info.underscan_hborder_property, |
1755 | 0); |
1997 | 0); |
1756 | drm_object_attach_property(&radeon_connector->base.base, |
1998 | drm_object_attach_property(&radeon_connector->base.base, |
1757 | rdev->mode_info.underscan_vborder_property, |
1999 | rdev->mode_info.underscan_vborder_property, |
1758 | 0); |
2000 | 0); |
- | 2001 | drm_object_attach_property(&radeon_connector->base.base, |
|
- | 2002 | rdev->mode_info.dither_property, |
|
- | 2003 | RADEON_FMT_DITHER_DISABLE); |
|
- | 2004 | drm_object_attach_property(&radeon_connector->base.base, |
|
- | 2005 | dev->mode_config.scaling_mode_property, |
|
- | 2006 | DRM_MODE_SCALE_NONE); |
|
- | 2007 | } |
|
- | 2008 | if (ASIC_IS_DCE2(rdev) && (radeon_audio != 0)) { |
|
- | 2009 | drm_object_attach_property(&radeon_connector->base.base, |
|
- | 2010 | rdev->mode_info.audio_property, |
|
- | 2011 | RADEON_AUDIO_AUTO); |
|
1759 | } |
2012 | } |
1760 | subpixel_order = SubPixelHorizontalRGB; |
2013 | subpixel_order = SubPixelHorizontalRGB; |
1761 | connector->interlace_allowed = true; |
2014 | connector->interlace_allowed = true; |
1762 | if (connector_type == DRM_MODE_CONNECTOR_HDMIB) |
2015 | if (connector_type == DRM_MODE_CONNECTOR_HDMIB) |
1763 | connector->doublescan_allowed = true; |
2016 | connector->doublescan_allowed = true; |
Line 1771... | Line 2024... | ||
1771 | radeon_dig_connector->igp_lane_info = igp_lane_info; |
2024 | radeon_dig_connector->igp_lane_info = igp_lane_info; |
1772 | radeon_connector->con_priv = radeon_dig_connector; |
2025 | radeon_connector->con_priv = radeon_dig_connector; |
1773 | drm_connector_init(dev, &radeon_connector->base, &radeon_dp_connector_funcs, connector_type); |
2026 | drm_connector_init(dev, &radeon_connector->base, &radeon_dp_connector_funcs, connector_type); |
1774 | drm_connector_helper_add(&radeon_connector->base, &radeon_dp_connector_helper_funcs); |
2027 | drm_connector_helper_add(&radeon_connector->base, &radeon_dp_connector_helper_funcs); |
1775 | if (i2c_bus->valid) { |
2028 | if (i2c_bus->valid) { |
1776 | /* add DP i2c bus */ |
- | |
1777 | radeon_dig_connector->dp_i2c_bus = radeon_i2c_create_dp(dev, i2c_bus, "DP-auxch"); |
- | |
1778 | if (!radeon_dig_connector->dp_i2c_bus) |
- | |
1779 | DRM_ERROR("DP: Failed to assign dp ddc bus! Check dmesg for i2c errors.\n"); |
- | |
1780 | radeon_connector->ddc_bus = radeon_i2c_lookup(rdev, i2c_bus); |
2029 | radeon_connector->ddc_bus = radeon_i2c_lookup(rdev, i2c_bus); |
1781 | if (!radeon_connector->ddc_bus) |
2030 | if (radeon_connector->ddc_bus) |
- | 2031 | has_aux = true; |
|
- | 2032 | else |
|
1782 | DRM_ERROR("DP: Failed to assign ddc bus! Check dmesg for i2c errors.\n"); |
2033 | DRM_ERROR("DP: Failed to assign ddc bus! Check dmesg for i2c errors.\n"); |
1783 | } |
2034 | } |
1784 | subpixel_order = SubPixelHorizontalRGB; |
2035 | subpixel_order = SubPixelHorizontalRGB; |
1785 | drm_object_attach_property(&radeon_connector->base.base, |
2036 | drm_object_attach_property(&radeon_connector->base.base, |
1786 | rdev->mode_info.coherent_mode_property, |
2037 | rdev->mode_info.coherent_mode_property, |
Line 1793... | Line 2044... | ||
1793 | rdev->mode_info.underscan_hborder_property, |
2044 | rdev->mode_info.underscan_hborder_property, |
1794 | 0); |
2045 | 0); |
1795 | drm_object_attach_property(&radeon_connector->base.base, |
2046 | drm_object_attach_property(&radeon_connector->base.base, |
1796 | rdev->mode_info.underscan_vborder_property, |
2047 | rdev->mode_info.underscan_vborder_property, |
1797 | 0); |
2048 | 0); |
- | 2049 | drm_object_attach_property(&radeon_connector->base.base, |
|
- | 2050 | rdev->mode_info.dither_property, |
|
- | 2051 | RADEON_FMT_DITHER_DISABLE); |
|
- | 2052 | drm_object_attach_property(&radeon_connector->base.base, |
|
- | 2053 | dev->mode_config.scaling_mode_property, |
|
- | 2054 | DRM_MODE_SCALE_NONE); |
|
- | 2055 | } |
|
- | 2056 | if (ASIC_IS_DCE2(rdev) && (radeon_audio != 0)) { |
|
- | 2057 | drm_object_attach_property(&radeon_connector->base.base, |
|
- | 2058 | rdev->mode_info.audio_property, |
|
- | 2059 | RADEON_AUDIO_AUTO); |
|
1798 | } |
2060 | } |
1799 | connector->interlace_allowed = true; |
2061 | connector->interlace_allowed = true; |
1800 | /* in theory with a DP to VGA converter... */ |
2062 | /* in theory with a DP to VGA converter... */ |
1801 | connector->doublescan_allowed = false; |
2063 | connector->doublescan_allowed = false; |
1802 | break; |
2064 | break; |
Line 1804... | Line 2066... | ||
1804 | radeon_dig_connector = kzalloc(sizeof(struct radeon_connector_atom_dig), GFP_KERNEL); |
2066 | radeon_dig_connector = kzalloc(sizeof(struct radeon_connector_atom_dig), GFP_KERNEL); |
1805 | if (!radeon_dig_connector) |
2067 | if (!radeon_dig_connector) |
1806 | goto failed; |
2068 | goto failed; |
1807 | radeon_dig_connector->igp_lane_info = igp_lane_info; |
2069 | radeon_dig_connector->igp_lane_info = igp_lane_info; |
1808 | radeon_connector->con_priv = radeon_dig_connector; |
2070 | radeon_connector->con_priv = radeon_dig_connector; |
1809 | drm_connector_init(dev, &radeon_connector->base, &radeon_dp_connector_funcs, connector_type); |
2071 | drm_connector_init(dev, &radeon_connector->base, &radeon_edp_connector_funcs, connector_type); |
1810 | drm_connector_helper_add(&radeon_connector->base, &radeon_dp_connector_helper_funcs); |
2072 | drm_connector_helper_add(&radeon_connector->base, &radeon_dp_connector_helper_funcs); |
1811 | if (i2c_bus->valid) { |
2073 | if (i2c_bus->valid) { |
1812 | /* add DP i2c bus */ |
- | |
1813 | radeon_dig_connector->dp_i2c_bus = radeon_i2c_create_dp(dev, i2c_bus, "eDP-auxch"); |
- | |
1814 | if (!radeon_dig_connector->dp_i2c_bus) |
- | |
1815 | DRM_ERROR("DP: Failed to assign dp ddc bus! Check dmesg for i2c errors.\n"); |
- | |
1816 | radeon_connector->ddc_bus = radeon_i2c_lookup(rdev, i2c_bus); |
2074 | radeon_connector->ddc_bus = radeon_i2c_lookup(rdev, i2c_bus); |
1817 | if (!radeon_connector->ddc_bus) |
2075 | if (radeon_connector->ddc_bus) |
- | 2076 | has_aux = true; |
|
- | 2077 | else |
|
1818 | DRM_ERROR("DP: Failed to assign ddc bus! Check dmesg for i2c errors.\n"); |
2078 | DRM_ERROR("DP: Failed to assign ddc bus! Check dmesg for i2c errors.\n"); |
1819 | } |
2079 | } |
1820 | drm_object_attach_property(&radeon_connector->base.base, |
2080 | drm_object_attach_property(&radeon_connector->base.base, |
1821 | dev->mode_config.scaling_mode_property, |
2081 | dev->mode_config.scaling_mode_property, |
1822 | DRM_MODE_SCALE_FULLSCREEN); |
2082 | DRM_MODE_SCALE_FULLSCREEN); |
Line 1869... | Line 2129... | ||
1869 | connector->polled = DRM_CONNECTOR_POLL_CONNECT; |
2129 | connector->polled = DRM_CONNECTOR_POLL_CONNECT; |
1870 | } else |
2130 | } else |
1871 | connector->polled = DRM_CONNECTOR_POLL_HPD; |
2131 | connector->polled = DRM_CONNECTOR_POLL_HPD; |
Line 1872... | Line 2132... | ||
1872 | 2132 | ||
1873 | connector->display_info.subpixel_order = subpixel_order; |
2133 | connector->display_info.subpixel_order = subpixel_order; |
- | 2134 | drm_connector_register(connector); |
|
- | 2135 | ||
- | 2136 | if (has_aux) |
|
- | 2137 | radeon_dp_aux_init(radeon_connector); |
|
1874 | drm_sysfs_connector_add(connector); |
2138 | |
Line 1875... | Line 2139... | ||
1875 | return; |
2139 | return; |
1876 | 2140 | ||
1877 | failed: |
2141 | failed: |
Line 2026... | Line 2290... | ||
2026 | if (i2c_bus->valid) |
2290 | if (i2c_bus->valid) |
2027 | connector->polled = DRM_CONNECTOR_POLL_CONNECT; |
2291 | connector->polled = DRM_CONNECTOR_POLL_CONNECT; |
2028 | } else |
2292 | } else |
2029 | connector->polled = DRM_CONNECTOR_POLL_HPD; |
2293 | connector->polled = DRM_CONNECTOR_POLL_HPD; |
2030 | connector->display_info.subpixel_order = subpixel_order; |
2294 | connector->display_info.subpixel_order = subpixel_order; |
2031 | drm_sysfs_connector_add(connector); |
2295 | drm_connector_register(connector); |
2032 | }>>>>>>->>>>>>>>> |
2296 | }>>>>>>->>>>>>>>>=> |