Subversion Repositories Kolibri OS

Rev

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;