Rev 3480 | Rev 4539 | 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); |