Subversion Repositories Kolibri OS

Rev

Rev 3480 | Rev 4104 | Go to most recent revision | Show entire file | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 3480 Rev 3746
Line 861... Line 861...
861
	struct drm_cmdline_mode *cmdline_mode;
861
	struct drm_cmdline_mode *cmdline_mode;
862
	cmdline_mode = &fb_connector->cmdline_mode;
862
	cmdline_mode = &fb_connector->cmdline_mode;
863
	return cmdline_mode->specified;
863
	return cmdline_mode->specified;
864
}
864
}
Line -... Line 865...
-
 
865
 
-
 
866
static struct drm_display_mode *drm_pick_cmdline_mode(struct drm_fb_helper_connector *fb_helper_conn,
-
 
867
						      int width, int height)
-
 
868
{
-
 
869
	struct drm_cmdline_mode *cmdline_mode;
-
 
870
	struct drm_display_mode *mode = NULL;
-
 
871
 
-
 
872
	return NULL;
-
 
873
 
-
 
874
	cmdline_mode = &fb_helper_conn->cmdline_mode;
-
 
875
	if (cmdline_mode->specified == false)
-
 
876
		return mode;
-
 
877
 
-
 
878
	/* attempt to find a matching mode in the list of modes
-
 
879
	 *  we have gotten so far, if not add a CVT mode that conforms
-
 
880
	 */
-
 
881
	if (cmdline_mode->rb || cmdline_mode->margins)
-
 
882
		goto create_mode;
-
 
883
 
-
 
884
	list_for_each_entry(mode, &fb_helper_conn->connector->modes, head) {
-
 
885
		/* check width/height */
-
 
886
		if (mode->hdisplay != cmdline_mode->xres ||
-
 
887
		    mode->vdisplay != cmdline_mode->yres)
-
 
888
			continue;
-
 
889
 
-
 
890
		if (cmdline_mode->refresh_specified) {
-
 
891
			if (mode->vrefresh != cmdline_mode->refresh)
-
 
892
				continue;
-
 
893
		}
-
 
894
 
-
 
895
		if (cmdline_mode->interlace) {
-
 
896
			if (!(mode->flags & DRM_MODE_FLAG_INTERLACE))
-
 
897
				continue;
-
 
898
		}
-
 
899
		return mode;
-
 
900
	}
-
 
901
 
-
 
902
create_mode:
-
 
903
	mode = drm_mode_create_from_cmdline_mode(fb_helper_conn->connector->dev,
-
 
904
						 cmdline_mode);
-
 
905
	list_add(&mode->head, &fb_helper_conn->connector->modes);
-
 
906
	return mode;
Line 865... Line 907...
865
 
907
}
866
 
908
 
867
static bool drm_connector_enabled(struct drm_connector *connector, bool strict)
909
static bool drm_connector_enabled(struct drm_connector *connector, bool strict)
Line 898... Line 940...
898
		connector = fb_helper->connector_info[i]->connector;
940
		connector = fb_helper->connector_info[i]->connector;
899
		enabled[i] = drm_connector_enabled(connector, false);
941
		enabled[i] = drm_connector_enabled(connector, false);
900
	}
942
	}
901
}
943
}
Line -... Line 944...
-
 
944
 
-
 
945
static bool drm_target_cloned(struct drm_fb_helper *fb_helper,
-
 
946
			      struct drm_display_mode **modes,
-
 
947
			      bool *enabled, int width, int height)
-
 
948
{
-
 
949
	int count, i, j;
-
 
950
	bool can_clone = false;
-
 
951
	struct drm_fb_helper_connector *fb_helper_conn;
-
 
952
	struct drm_display_mode *dmt_mode, *mode;
-
 
953
 
-
 
954
	/* only contemplate cloning in the single crtc case */
-
 
955
	if (fb_helper->crtc_count > 1)
-
 
956
		return false;
-
 
957
 
-
 
958
	count = 0;
-
 
959
	for (i = 0; i < fb_helper->connector_count; i++) {
-
 
960
		if (enabled[i])
-
 
961
			count++;
-
 
962
	}
-
 
963
 
-
 
964
	/* only contemplate cloning if more than one connector is enabled */
-
 
965
	if (count <= 1)
-
 
966
		return false;
-
 
967
 
-
 
968
	/* check the command line or if nothing common pick 1024x768 */
-
 
969
	can_clone = true;
-
 
970
	for (i = 0; i < fb_helper->connector_count; i++) {
-
 
971
		if (!enabled[i])
-
 
972
			continue;
-
 
973
		fb_helper_conn = fb_helper->connector_info[i];
-
 
974
		modes[i] = drm_pick_cmdline_mode(fb_helper_conn, width, height);
-
 
975
		if (!modes[i]) {
-
 
976
			can_clone = false;
-
 
977
			break;
-
 
978
		}
-
 
979
		for (j = 0; j < i; j++) {
-
 
980
			if (!enabled[j])
-
 
981
				continue;
-
 
982
			if (!drm_mode_equal(modes[j], modes[i]))
-
 
983
				can_clone = false;
-
 
984
		}
-
 
985
	}
-
 
986
 
-
 
987
	if (can_clone) {
-
 
988
		DRM_DEBUG_KMS("can clone using command line\n");
-
 
989
		return true;
-
 
990
	}
-
 
991
 
-
 
992
	/* try and find a 1024x768 mode on each connector */
-
 
993
	can_clone = true;
-
 
994
	dmt_mode = drm_mode_find_dmt(fb_helper->dev, 1024, 768, 60, false);
-
 
995
 
-
 
996
	for (i = 0; i < fb_helper->connector_count; i++) {
-
 
997
 
-
 
998
		if (!enabled[i])
-
 
999
			continue;
-
 
1000
 
-
 
1001
		fb_helper_conn = fb_helper->connector_info[i];
-
 
1002
		list_for_each_entry(mode, &fb_helper_conn->connector->modes, head) {
-
 
1003
			if (drm_mode_equal(mode, dmt_mode))
-
 
1004
				modes[i] = mode;
-
 
1005
		}
-
 
1006
		if (!modes[i])
-
 
1007
			can_clone = false;
-
 
1008
	}
-
 
1009
 
-
 
1010
	if (can_clone) {
-
 
1011
		DRM_DEBUG_KMS("can clone using 1024x768\n");
-
 
1012
		return true;
-
 
1013
	}
-
 
1014
	DRM_INFO("kms: can't enable cloning when we probably wanted to.\n");
-
 
1015
	return false;
Line 902... Line 1016...
902
 
1016
}
903
 
1017
 
904
static bool drm_target_preferred(struct drm_fb_helper *fb_helper,
1018
static bool drm_target_preferred(struct drm_fb_helper *fb_helper,
905
				 struct drm_display_mode **modes,
1019
				 struct drm_display_mode **modes,
Line 916... Line 1030...
916
 
1030
 
917
		DRM_DEBUG_KMS("looking for cmdline mode on connector %d\n",
1031
		DRM_DEBUG_KMS("looking for cmdline mode on connector %d\n",
Line 918... Line 1032...
918
			      fb_helper_conn->connector->base.id);
1032
			      fb_helper_conn->connector->base.id);
919
 
1033
 
920
		/* got for command line mode first */
-
 
921
//       modes[i] = drm_pick_cmdline_mode(fb_helper_conn, width, height);
-
 
922
 
-
 
923
        modes[i] = NULL;
1034
		/* got for command line mode first */
924
 
1035
		modes[i] = drm_pick_cmdline_mode(fb_helper_conn, width, height);
925
		if (!modes[i]) {
1036
		if (!modes[i]) {
926
			DRM_DEBUG_KMS("looking for preferred mode on connector %d\n",
1037
			DRM_DEBUG_KMS("looking for preferred mode on connector %d\n",
927
				      fb_helper_conn->connector->base.id);
1038
				      fb_helper_conn->connector->base.id);
Line 1027... Line 1138...
1027
	struct drm_fb_helper_crtc **crtcs;
1138
	struct drm_fb_helper_crtc **crtcs;
1028
	struct drm_display_mode **modes;
1139
	struct drm_display_mode **modes;
1029
	struct drm_mode_set *modeset;
1140
	struct drm_mode_set *modeset;
1030
	bool *enabled;
1141
	bool *enabled;
1031
	int width, height;
1142
	int width, height;
1032
	int i, ret;
1143
	int i;
Line 1033... Line 1144...
1033
 
1144
 
Line 1034... Line 1145...
1034
	DRM_DEBUG_KMS("\n");
1145
	DRM_DEBUG_KMS("\n");
1035
 
1146
 
Line 1048... Line 1159...
1048
	}
1159
	}
Line 1049... Line 1160...
1049
 
1160
 
Line -... Line 1161...
-
 
1161
 
1050
 
1162
	drm_enable_connectors(fb_helper, enabled);
1051
	drm_enable_connectors(fb_helper, enabled);
-
 
1052
 
1163
 
-
 
1164
	if (!(fb_helper->funcs->initial_config &&
-
 
1165
	      fb_helper->funcs->initial_config(fb_helper, crtcs, modes,
1053
    //ret = drm_target_cloned(fb_helper, modes, enabled, width, height);
1166
					       enabled, width, height))) {
1054
 
1167
		memset(modes, 0, dev->mode_config.num_connector*sizeof(modes[0]));
1055
    ret = 0;
1168
		memset(crtcs, 0, dev->mode_config.num_connector*sizeof(crtcs[0]));
1056
 
1169
 
-
 
1170
		if (!drm_target_cloned(fb_helper,
1057
	if (!ret) {
1171
				       modes, enabled, width, height) &&
1058
		ret = drm_target_preferred(fb_helper, modes, enabled, width, height);
-
 
Line 1059... Line 1172...
1059
		if (!ret)
1172
		    !drm_target_preferred(fb_helper,
-
 
1173
					  modes, enabled, width, height))
Line 1060... Line 1174...
1060
			DRM_ERROR("Unable to find initial modes\n");
1174
			DRM_ERROR("Unable to find initial modes\n");
-
 
1175
 
Line 1061... Line 1176...
1061
	}
1176
		DRM_DEBUG_KMS("picking CRTCs for %dx%d config\n",
1062
 
1177
			      width, height);
1063
	DRM_DEBUG_KMS("picking CRTCs for %dx%d config\n", width, height);
1178
 
1064
 
1179
	drm_pick_crtcs(fb_helper, crtcs, modes, 0, width, height);