Rev 1182 | Rev 1233 | Go to most recent revision | Show entire file | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 1182 | Rev 1221 | ||
---|---|---|---|
Line 30... | Line 30... | ||
30 | */ |
30 | */ |
Line 31... | Line 31... | ||
31 | 31 | ||
32 | #include "drmP.h" |
32 | #include "drmP.h" |
33 | #include "drm_crtc.h" |
33 | #include "drm_crtc.h" |
- | 34 | #include "drm_crtc_helper.h" |
|
Line 34... | Line 35... | ||
34 | #include "drm_crtc_helper.h" |
35 | #include "drm_fb_helper.h" |
35 | 36 | ||
36 | static void drm_mode_validate_flag(struct drm_connector *connector, |
37 | static void drm_mode_validate_flag(struct drm_connector *connector, |
37 | int flags) |
38 | int flags) |
Line 88... | Line 89... | ||
88 | DRM_DEBUG_KMS("%s\n", drm_get_connector_name(connector)); |
89 | DRM_DEBUG_KMS("%s\n", drm_get_connector_name(connector)); |
89 | /* set all modes to the unverified state */ |
90 | /* set all modes to the unverified state */ |
90 | list_for_each_entry_safe(mode, t, &connector->modes, head) |
91 | list_for_each_entry_safe(mode, t, &connector->modes, head) |
91 | mode->status = MODE_UNVERIFIED; |
92 | mode->status = MODE_UNVERIFIED; |
Line -... | Line 93... | ||
- | 93 | ||
- | 94 | if (connector->force) { |
|
- | 95 | if (connector->force == DRM_FORCE_ON) |
|
- | 96 | connector->status = connector_status_connected; |
|
- | 97 | else |
|
- | 98 | connector->status = connector_status_disconnected; |
|
- | 99 | if (connector->funcs->force) |
|
- | 100 | connector->funcs->force(connector); |
|
92 | 101 | } else |
|
Line 93... | Line 102... | ||
93 | connector->status = connector->funcs->detect(connector); |
102 | connector->status = connector->funcs->detect(connector); |
94 | 103 | ||
95 | if (connector->status == connector_status_disconnected) { |
104 | if (connector->status == connector_status_disconnected) { |
Line 265... | Line 274... | ||
265 | return mode; |
274 | return mode; |
266 | } |
275 | } |
267 | return NULL; |
276 | return NULL; |
268 | } |
277 | } |
Line -... | Line 278... | ||
- | 278 | ||
- | 279 | static bool drm_has_cmdline_mode(struct drm_connector *connector) |
|
- | 280 | { |
|
- | 281 | struct drm_fb_helper_connector *fb_help_conn = connector->fb_helper_private; |
|
- | 282 | struct drm_fb_helper_cmdline_mode *cmdline_mode; |
|
- | 283 | ||
- | 284 | if (!fb_help_conn) |
|
- | 285 | return false; |
|
- | 286 | ||
- | 287 | cmdline_mode = &fb_help_conn->cmdline_mode; |
|
- | 288 | return cmdline_mode->specified; |
|
- | 289 | } |
|
- | 290 | ||
- | 291 | static struct drm_display_mode *drm_pick_cmdline_mode(struct drm_connector *connector, int width, int height) |
|
- | 292 | { |
|
- | 293 | struct drm_fb_helper_connector *fb_help_conn = connector->fb_helper_private; |
|
- | 294 | struct drm_fb_helper_cmdline_mode *cmdline_mode; |
|
- | 295 | struct drm_display_mode *mode = NULL; |
|
- | 296 | ||
- | 297 | if (!fb_help_conn) |
|
- | 298 | return mode; |
|
- | 299 | ||
- | 300 | cmdline_mode = &fb_help_conn->cmdline_mode; |
|
- | 301 | if (cmdline_mode->specified == false) |
|
- | 302 | return mode; |
|
- | 303 | ||
- | 304 | /* attempt to find a matching mode in the list of modes |
|
- | 305 | * we have gotten so far, if not add a CVT mode that conforms |
|
- | 306 | */ |
|
- | 307 | if (cmdline_mode->rb || cmdline_mode->margins) |
|
- | 308 | goto create_mode; |
|
- | 309 | ||
- | 310 | list_for_each_entry(mode, &connector->modes, head) { |
|
- | 311 | /* check width/height */ |
|
- | 312 | if (mode->hdisplay != cmdline_mode->xres || |
|
- | 313 | mode->vdisplay != cmdline_mode->yres) |
|
- | 314 | continue; |
|
- | 315 | ||
- | 316 | if (cmdline_mode->refresh_specified) { |
|
- | 317 | if (mode->vrefresh != cmdline_mode->refresh) |
|
- | 318 | continue; |
|
- | 319 | } |
|
- | 320 | ||
- | 321 | if (cmdline_mode->interlace) { |
|
- | 322 | if (!(mode->flags & DRM_MODE_FLAG_INTERLACE)) |
|
- | 323 | continue; |
|
- | 324 | } |
|
- | 325 | return mode; |
|
- | 326 | } |
|
- | 327 | ||
- | 328 | create_mode: |
|
- | 329 | mode = drm_cvt_mode(connector->dev, cmdline_mode->xres, |
|
- | 330 | cmdline_mode->yres, |
|
- | 331 | cmdline_mode->refresh_specified ? cmdline_mode->refresh : 60, |
|
- | 332 | cmdline_mode->rb, cmdline_mode->interlace, |
|
- | 333 | cmdline_mode->margins); |
|
- | 334 | list_add(&mode->head, &connector->modes); |
|
- | 335 | return mode; |
|
- | 336 | } |
|
269 | 337 | ||
270 | static bool drm_connector_enabled(struct drm_connector *connector, bool strict) |
338 | static bool drm_connector_enabled(struct drm_connector *connector, bool strict) |
271 | { |
339 | { |
Line 272... | Line 340... | ||
272 | bool enable; |
340 | bool enable; |
Line 315... | Line 383... | ||
315 | if (enabled[i] == false) { |
383 | if (enabled[i] == false) { |
316 | i++; |
384 | i++; |
317 | continue; |
385 | continue; |
318 | } |
386 | } |
Line 319... | Line 387... | ||
319 | 387 | ||
320 | DRM_DEBUG_KMS("looking for preferred mode on connector %d\n", |
388 | DRM_DEBUG_KMS("looking for cmdline mode on connector %d\n", |
Line -... | Line 389... | ||
- | 389 | connector->base.id); |
|
- | 390 | ||
- | 391 | /* got for command line mode first */ |
|
- | 392 | modes[i] = drm_pick_cmdline_mode(connector, width, height); |
|
- | 393 | if (!modes[i]) { |
|
321 | connector->base.id); |
394 | DRM_DEBUG_KMS("looking for preferred mode on connector %d\n", |
- | 395 | connector->base.id); |
|
322 | 396 | modes[i] = drm_has_preferred_mode(connector, width, height); |
|
323 | modes[i] = drm_has_preferred_mode(connector, width, height); |
397 | } |
324 | /* No preferred modes, pick one off the list */ |
398 | /* No preferred modes, pick one off the list */ |
325 | if (!modes[i] && !list_empty(&connector->modes)) { |
399 | if (!modes[i] && !list_empty(&connector->modes)) { |
326 | list_for_each_entry(modes[i], &connector->modes, head) |
400 | list_for_each_entry(modes[i], &connector->modes, head) |
Line 367... | Line 441... | ||
367 | return best_score; |
441 | return best_score; |
Line 368... | Line 442... | ||
368 | 442 | ||
369 | my_score = 1; |
443 | my_score = 1; |
370 | if (connector->status == connector_status_connected) |
444 | if (connector->status == connector_status_connected) |
- | 445 | my_score++; |
|
- | 446 | if (drm_has_cmdline_mode(connector)) |
|
371 | my_score++; |
447 | my_score++; |
372 | if (drm_has_preferred_mode(connector, width, height)) |
448 | if (drm_has_preferred_mode(connector, width, height)) |
Line 373... | Line 449... | ||
373 | my_score++; |
449 | my_score++; |
374 | 450 | ||
Line 466... | Line 542... | ||
466 | 542 | ||
467 | if (mode && crtc) { |
543 | if (mode && crtc) { |
468 | DRM_DEBUG_KMS("desired mode %s set on crtc %d\n", |
544 | DRM_DEBUG_KMS("desired mode %s set on crtc %d\n", |
469 | mode->name, crtc->base.id); |
545 | mode->name, crtc->base.id); |
470 | crtc->desired_mode = mode; |
- | |
471 | crtc->enabled = true; |
546 | crtc->desired_mode = mode; |
472 | connector->encoder->crtc = crtc; |
547 | connector->encoder->crtc = crtc; |
473 | } else { |
548 | } else { |
474 | connector->encoder->crtc = NULL; |
549 | connector->encoder->crtc = NULL; |
475 | connector->encoder = NULL; |
550 | connector->encoder = NULL; |