Rev 5060 | Rev 6084 | Go to most recent revision | Show entire file | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 5060 | Rev 5271 | ||
---|---|---|---|
Line 124... | Line 124... | ||
124 | struct drm_fb_helper_connector **temp; |
124 | struct drm_fb_helper_connector **temp; |
125 | struct drm_fb_helper_connector *fb_helper_connector; |
125 | struct drm_fb_helper_connector *fb_helper_connector; |
Line 126... | Line 126... | ||
126 | 126 | ||
127 | WARN_ON(!mutex_is_locked(&fb_helper->dev->mode_config.mutex)); |
127 | WARN_ON(!mutex_is_locked(&fb_helper->dev->mode_config.mutex)); |
128 | if (fb_helper->connector_count + 1 > fb_helper->connector_info_alloc_count) { |
128 | if (fb_helper->connector_count + 1 > fb_helper->connector_info_alloc_count) { |
129 | temp = krealloc(fb_helper->connector_info, sizeof(struct drm_fb_helper_connector) * (fb_helper->connector_count + 1), GFP_KERNEL); |
129 | temp = krealloc(fb_helper->connector_info, sizeof(struct drm_fb_helper_connector *) * (fb_helper->connector_count + 1), GFP_KERNEL); |
130 | if (!temp) |
130 | if (!temp) |
Line 131... | Line 131... | ||
131 | return -ENOMEM; |
131 | return -ENOMEM; |
132 | 132 | ||
Line 168... | Line 168... | ||
168 | fb_helper->connector_count--; |
168 | fb_helper->connector_count--; |
169 | kfree(fb_helper_connector); |
169 | kfree(fb_helper_connector); |
170 | return 0; |
170 | return 0; |
171 | } |
171 | } |
172 | EXPORT_SYMBOL(drm_fb_helper_remove_one_connector); |
172 | EXPORT_SYMBOL(drm_fb_helper_remove_one_connector); |
- | 173 | ||
173 | static void drm_fb_helper_save_lut_atomic(struct drm_crtc *crtc, struct drm_fb_helper *helper) |
174 | static void drm_fb_helper_save_lut_atomic(struct drm_crtc *crtc, struct drm_fb_helper *helper) |
174 | { |
175 | { |
175 | uint16_t *r_base, *g_base, *b_base; |
176 | uint16_t *r_base, *g_base, *b_base; |
176 | int i; |
177 | int i; |
Line 208... | Line 209... | ||
208 | bool error = false; |
209 | bool error = false; |
209 | int i; |
210 | int i; |
Line 210... | Line 211... | ||
210 | 211 | ||
Line 211... | Line 212... | ||
211 | drm_warn_on_modeset_not_all_locked(dev); |
212 | drm_warn_on_modeset_not_all_locked(dev); |
212 | 213 | ||
213 | list_for_each_entry(plane, &dev->mode_config.plane_list, head) |
214 | list_for_each_entry(plane, &dev->mode_config.plane_list, head) { |
Line -... | Line 215... | ||
- | 215 | if (plane->type != DRM_PLANE_TYPE_PRIMARY) |
|
- | 216 | drm_plane_force_disable(plane); |
|
- | 217 | ||
- | 218 | if (dev->mode_config.rotation_property) { |
|
- | 219 | drm_mode_plane_set_obj_prop(plane, |
|
- | 220 | dev->mode_config.rotation_property, |
|
- | 221 | BIT(DRM_ROTATE_0)); |
|
214 | if (plane->type != DRM_PLANE_TYPE_PRIMARY) |
222 | } |
215 | drm_plane_force_disable(plane); |
223 | } |
216 | 224 | ||
217 | for (i = 0; i < fb_helper->crtc_count; i++) { |
225 | for (i = 0; i < fb_helper->crtc_count; i++) { |
Line 241... | Line 249... | ||
241 | */ |
249 | */ |
242 | bool drm_fb_helper_restore_fbdev_mode_unlocked(struct drm_fb_helper *fb_helper) |
250 | bool drm_fb_helper_restore_fbdev_mode_unlocked(struct drm_fb_helper *fb_helper) |
243 | { |
251 | { |
244 | struct drm_device *dev = fb_helper->dev; |
252 | struct drm_device *dev = fb_helper->dev; |
245 | bool ret; |
253 | bool ret; |
- | 254 | bool do_delayed = false; |
|
- | 255 | ||
246 | drm_modeset_lock_all(dev); |
256 | drm_modeset_lock_all(dev); |
247 | ret = restore_fbdev_mode(fb_helper); |
257 | ret = restore_fbdev_mode(fb_helper); |
248 | drm_modeset_unlock_all(dev); |
258 | drm_modeset_unlock_all(dev); |
249 | return ret; |
259 | return ret; |
250 | } |
260 | } |
Line 704... | Line 714... | ||
704 | return -EINVAL; |
714 | return -EINVAL; |
705 | } |
715 | } |
Line 706... | Line 716... | ||
706 | 716 | ||
Line 707... | Line -... | ||
707 | drm_fb_helper_restore_fbdev_mode_unlocked(fb_helper); |
- | |
708 | - | ||
709 | if (fb_helper->delayed_hotplug) { |
- | |
710 | fb_helper->delayed_hotplug = false; |
- | |
711 | drm_fb_helper_hotplug_event(fb_helper); |
717 | drm_fb_helper_restore_fbdev_mode_unlocked(fb_helper); |
712 | } |
718 | |
713 | return 0; |
719 | return 0; |
Line 714... | Line 720... | ||
714 | } |
720 | } |
Line 782... | Line 788... | ||
782 | /* first up get a count of crtcs now in use and new min/maxes width/heights */ |
788 | /* first up get a count of crtcs now in use and new min/maxes width/heights */ |
783 | for (i = 0; i < fb_helper->connector_count; i++) { |
789 | for (i = 0; i < fb_helper->connector_count; i++) { |
784 | struct drm_fb_helper_connector *fb_helper_conn = fb_helper->connector_info[i]; |
790 | struct drm_fb_helper_connector *fb_helper_conn = fb_helper->connector_info[i]; |
785 | struct drm_cmdline_mode *cmdline_mode; |
791 | struct drm_cmdline_mode *cmdline_mode; |
Line 786... | Line 792... | ||
786 | 792 | ||
Line 787... | Line 793... | ||
787 | cmdline_mode = &fb_helper_conn->cmdline_mode; |
793 | cmdline_mode = &fb_helper_conn->connector->cmdline_mode; |
788 | 794 | ||
789 | if (cmdline_mode->bpp_specified) { |
795 | if (cmdline_mode->bpp_specified) { |
790 | switch (cmdline_mode->bpp) { |
796 | switch (cmdline_mode->bpp) { |
Line 811... | Line 817... | ||
811 | } |
817 | } |
Line 812... | Line 818... | ||
812 | 818 | ||
813 | crtc_count = 0; |
819 | crtc_count = 0; |
814 | for (i = 0; i < fb_helper->crtc_count; i++) { |
820 | for (i = 0; i < fb_helper->crtc_count; i++) { |
- | 821 | struct drm_display_mode *desired_mode; |
|
815 | struct drm_display_mode *desired_mode; |
822 | int x, y; |
816 | desired_mode = fb_helper->crtc_info[i].desired_mode; |
- | |
- | 823 | desired_mode = fb_helper->crtc_info[i].desired_mode; |
|
- | 824 | x = fb_helper->crtc_info[i].x; |
|
817 | 825 | y = fb_helper->crtc_info[i].y; |
|
818 | if (desired_mode) { |
826 | if (desired_mode) { |
819 | if (gamma_size == 0) |
827 | if (gamma_size == 0) |
820 | gamma_size = fb_helper->crtc_info[i].mode_set.crtc->gamma_size; |
828 | gamma_size = fb_helper->crtc_info[i].mode_set.crtc->gamma_size; |
821 | if (desired_mode->hdisplay < sizes.fb_width) |
829 | if (desired_mode->hdisplay + x < sizes.fb_width) |
822 | sizes.fb_width = desired_mode->hdisplay; |
830 | sizes.fb_width = desired_mode->hdisplay + x; |
823 | if (desired_mode->vdisplay < sizes.fb_height) |
831 | if (desired_mode->vdisplay + y < sizes.fb_height) |
824 | sizes.fb_height = desired_mode->vdisplay; |
832 | sizes.fb_height = desired_mode->vdisplay + y; |
825 | if (desired_mode->hdisplay > sizes.surface_width) |
833 | if (desired_mode->hdisplay + x > sizes.surface_width) |
826 | sizes.surface_width = desired_mode->hdisplay; |
834 | sizes.surface_width = desired_mode->hdisplay + x; |
827 | if (desired_mode->vdisplay > sizes.surface_height) |
835 | if (desired_mode->vdisplay + y > sizes.surface_height) |
828 | sizes.surface_height = desired_mode->vdisplay; |
836 | sizes.surface_height = desired_mode->vdisplay + y; |
829 | crtc_count++; |
837 | crtc_count++; |
830 | } |
838 | } |
Line 831... | Line 839... | ||
831 | } |
839 | } |
Line 856... | Line 864... | ||
856 | if (fb_helper->crtc_info[i].mode_set.num_connectors) |
864 | if (fb_helper->crtc_info[i].mode_set.num_connectors) |
857 | fb_helper->crtc_info[i].mode_set.fb = fb_helper->fb; |
865 | fb_helper->crtc_info[i].mode_set.fb = fb_helper->fb; |
Line 858... | Line 866... | ||
858 | 866 | ||
- | 867 | ||
- | 868 | info->var.pixclock = 0; |
|
Line 859... | Line 869... | ||
859 | 869 | dev_info(fb_helper->dev->dev, "fb%d: %s frame buffer device\n", |
|
Line 860... | Line 870... | ||
860 | info->var.pixclock = 0; |
870 | info->node, info->fix.id); |
861 | 871 | ||
Line 1015... | Line 1025... | ||
1015 | } |
1025 | } |
1016 | EXPORT_SYMBOL(drm_has_preferred_mode); |
1026 | EXPORT_SYMBOL(drm_has_preferred_mode); |
Line 1017... | Line 1027... | ||
1017 | 1027 | ||
1018 | static bool drm_has_cmdline_mode(struct drm_fb_helper_connector *fb_connector) |
1028 | static bool drm_has_cmdline_mode(struct drm_fb_helper_connector *fb_connector) |
1019 | { |
- | |
1020 | struct drm_cmdline_mode *cmdline_mode; |
1029 | { |
1021 | cmdline_mode = &fb_connector->cmdline_mode; |
- | |
1022 | return cmdline_mode->specified; |
1030 | return fb_connector->connector->cmdline_mode.specified; |
Line 1023... | Line 1031... | ||
1023 | } |
1031 | } |
1024 | 1032 | ||
1025 | struct drm_display_mode *drm_pick_cmdline_mode(struct drm_fb_helper_connector *fb_helper_conn, |
1033 | struct drm_display_mode *drm_pick_cmdline_mode(struct drm_fb_helper_connector *fb_helper_conn, |
Line 1029... | Line 1037... | ||
1029 | struct drm_display_mode *mode = NULL; |
1037 | struct drm_display_mode *mode = NULL; |
1030 | bool prefer_non_interlace; |
1038 | bool prefer_non_interlace; |
Line 1031... | Line 1039... | ||
1031 | 1039 | ||
Line 1032... | Line -... | ||
1032 | return NULL; |
- | |
1033 | 1040 | return NULL; |
|
1034 | cmdline_mode = &fb_helper_conn->cmdline_mode; |
1041 | |
Line 1035... | Line 1042... | ||
1035 | if (cmdline_mode->specified == false) |
1042 | if (cmdline_mode->specified == false) |
1036 | return mode; |
1043 | return mode; |
Line 1113... | Line 1120... | ||
1113 | } |
1120 | } |
1114 | } |
1121 | } |
Line 1115... | Line 1122... | ||
1115 | 1122 | ||
1116 | static bool drm_target_cloned(struct drm_fb_helper *fb_helper, |
1123 | static bool drm_target_cloned(struct drm_fb_helper *fb_helper, |
- | 1124 | struct drm_display_mode **modes, |
|
1117 | struct drm_display_mode **modes, |
1125 | struct drm_fb_offset *offsets, |
1118 | bool *enabled, int width, int height) |
1126 | bool *enabled, int width, int height) |
1119 | { |
1127 | { |
1120 | int count, i, j; |
1128 | int count, i, j; |
1121 | bool can_clone = false; |
1129 | bool can_clone = false; |
Line 1184... | Line 1192... | ||
1184 | } |
1192 | } |
1185 | DRM_INFO("kms: can't enable cloning when we probably wanted to.\n"); |
1193 | DRM_INFO("kms: can't enable cloning when we probably wanted to.\n"); |
1186 | return false; |
1194 | return false; |
1187 | } |
1195 | } |
Line -... | Line 1196... | ||
- | 1196 | ||
- | 1197 | static int drm_get_tile_offsets(struct drm_fb_helper *fb_helper, |
|
- | 1198 | struct drm_display_mode **modes, |
|
- | 1199 | struct drm_fb_offset *offsets, |
|
- | 1200 | int idx, |
|
- | 1201 | int h_idx, int v_idx) |
|
- | 1202 | { |
|
- | 1203 | struct drm_fb_helper_connector *fb_helper_conn; |
|
- | 1204 | int i; |
|
- | 1205 | int hoffset = 0, voffset = 0; |
|
- | 1206 | ||
- | 1207 | for (i = 0; i < fb_helper->connector_count; i++) { |
|
- | 1208 | fb_helper_conn = fb_helper->connector_info[i]; |
|
- | 1209 | if (!fb_helper_conn->connector->has_tile) |
|
- | 1210 | continue; |
|
- | 1211 | ||
- | 1212 | if (!modes[i] && (h_idx || v_idx)) { |
|
- | 1213 | DRM_DEBUG_KMS("no modes for connector tiled %d %d\n", i, |
|
- | 1214 | fb_helper_conn->connector->base.id); |
|
- | 1215 | continue; |
|
- | 1216 | } |
|
- | 1217 | if (fb_helper_conn->connector->tile_h_loc < h_idx) |
|
- | 1218 | hoffset += modes[i]->hdisplay; |
|
- | 1219 | ||
- | 1220 | if (fb_helper_conn->connector->tile_v_loc < v_idx) |
|
- | 1221 | voffset += modes[i]->vdisplay; |
|
- | 1222 | } |
|
- | 1223 | offsets[idx].x = hoffset; |
|
- | 1224 | offsets[idx].y = voffset; |
|
- | 1225 | DRM_DEBUG_KMS("returned %d %d for %d %d\n", hoffset, voffset, h_idx, v_idx); |
|
- | 1226 | return 0; |
|
- | 1227 | } |
|
1188 | 1228 | ||
1189 | static bool drm_target_preferred(struct drm_fb_helper *fb_helper, |
1229 | static bool drm_target_preferred(struct drm_fb_helper *fb_helper, |
- | 1230 | struct drm_display_mode **modes, |
|
1190 | struct drm_display_mode **modes, |
1231 | struct drm_fb_offset *offsets, |
1191 | bool *enabled, int width, int height) |
1232 | bool *enabled, int width, int height) |
1192 | { |
1233 | { |
1193 | struct drm_fb_helper_connector *fb_helper_conn; |
1234 | struct drm_fb_helper_connector *fb_helper_conn; |
- | 1235 | int i; |
|
- | 1236 | uint64_t conn_configured = 0, mask; |
|
- | 1237 | int tile_pass = 0; |
|
1194 | int i; |
1238 | mask = (1 << fb_helper->connector_count) - 1; |
1195 | 1239 | retry: |
|
1196 | for (i = 0; i < fb_helper->connector_count; i++) { |
1240 | for (i = 0; i < fb_helper->connector_count; i++) { |
Line -... | Line 1241... | ||
- | 1241 | fb_helper_conn = fb_helper->connector_info[i]; |
|
- | 1242 | ||
- | 1243 | if (conn_configured & (1 << i)) |
|
1197 | fb_helper_conn = fb_helper->connector_info[i]; |
1244 | continue; |
- | 1245 | ||
- | 1246 | if (enabled[i] == false) { |
|
- | 1247 | conn_configured |= (1 << i); |
|
- | 1248 | continue; |
|
- | 1249 | } |
|
- | 1250 | ||
- | 1251 | /* first pass over all the untiled connectors */ |
|
- | 1252 | if (tile_pass == 0 && fb_helper_conn->connector->has_tile) |
|
- | 1253 | continue; |
|
- | 1254 | ||
- | 1255 | if (tile_pass == 1) { |
|
- | 1256 | if (fb_helper_conn->connector->tile_h_loc != 0 || |
|
- | 1257 | fb_helper_conn->connector->tile_v_loc != 0) |
|
- | 1258 | continue; |
|
- | 1259 | ||
- | 1260 | } else { |
|
- | 1261 | if (fb_helper_conn->connector->tile_h_loc != tile_pass -1 && |
|
1198 | 1262 | fb_helper_conn->connector->tile_v_loc != tile_pass - 1) |
|
Line -... | Line 1263... | ||
- | 1263 | /* if this tile_pass doesn't cover any of the tiles - keep going */ |
|
- | 1264 | continue; |
|
- | 1265 | ||
- | 1266 | /* find the tile offsets for this pass - need |
|
- | 1267 | to find all tiles left and above */ |
|
1199 | if (enabled[i] == false) |
1268 | drm_get_tile_offsets(fb_helper, modes, offsets, |
1200 | continue; |
1269 | i, fb_helper_conn->connector->tile_h_loc, fb_helper_conn->connector->tile_v_loc); |
Line 1201... | Line 1270... | ||
1201 | 1270 | } |
|
1202 | DRM_DEBUG_KMS("looking for cmdline mode on connector %d\n", |
1271 | DRM_DEBUG_KMS("looking for cmdline mode on connector %d\n", |
1203 | fb_helper_conn->connector->base.id); |
1272 | fb_helper_conn->connector->base.id); |
1204 | 1273 | ||
1205 | /* got for command line mode first */ |
1274 | /* got for command line mode first */ |
1206 | modes[i] = drm_pick_cmdline_mode(fb_helper_conn, width, height); |
1275 | modes[i] = drm_pick_cmdline_mode(fb_helper_conn, width, height); |
1207 | if (!modes[i]) { |
1276 | if (!modes[i]) { |
1208 | DRM_DEBUG_KMS("looking for preferred mode on connector %d\n", |
1277 | DRM_DEBUG_KMS("looking for preferred mode on connector %d %d\n", |
1209 | fb_helper_conn->connector->base.id); |
1278 | fb_helper_conn->connector->base.id, fb_helper_conn->connector->tile_group ? fb_helper_conn->connector->tile_group->id : 0); |
1210 | modes[i] = drm_has_preferred_mode(fb_helper_conn, width, height); |
1279 | modes[i] = drm_has_preferred_mode(fb_helper_conn, width, height); |
1211 | } |
1280 | } |
1212 | /* No preferred modes, pick one off the list */ |
1281 | /* No preferred modes, pick one off the list */ |
1213 | if (!modes[i] && !list_empty(&fb_helper_conn->connector->modes)) { |
1282 | if (!modes[i] && !list_empty(&fb_helper_conn->connector->modes)) { |
1214 | list_for_each_entry(modes[i], &fb_helper_conn->connector->modes, head) |
1283 | list_for_each_entry(modes[i], &fb_helper_conn->connector->modes, head) |
- | 1284 | break; |
|
- | 1285 | } |
|
- | 1286 | DRM_DEBUG_KMS("found mode %s\n", modes[i] ? modes[i]->name : |
|
- | 1287 | "none"); |
|
- | 1288 | conn_configured |= (1 << i); |
|
- | 1289 | } |
|
1215 | break; |
1290 | |
1216 | } |
1291 | if ((conn_configured & mask) != mask) { |
1217 | DRM_DEBUG_KMS("found mode %s\n", modes[i] ? modes[i]->name : |
1292 | tile_pass++; |
Line 1218... | Line 1293... | ||
1218 | "none"); |
1293 | goto retry; |
Line 1303... | Line 1378... | ||
1303 | static void drm_setup_crtcs(struct drm_fb_helper *fb_helper) |
1378 | static void drm_setup_crtcs(struct drm_fb_helper *fb_helper) |
1304 | { |
1379 | { |
1305 | struct drm_device *dev = fb_helper->dev; |
1380 | struct drm_device *dev = fb_helper->dev; |
1306 | struct drm_fb_helper_crtc **crtcs; |
1381 | struct drm_fb_helper_crtc **crtcs; |
1307 | struct drm_display_mode **modes; |
1382 | struct drm_display_mode **modes; |
- | 1383 | struct drm_fb_offset *offsets; |
|
1308 | struct drm_mode_set *modeset; |
1384 | struct drm_mode_set *modeset; |
1309 | bool *enabled; |
1385 | bool *enabled; |
1310 | int width, height; |
1386 | int width, height; |
1311 | int i; |
1387 | int i; |
Line 1317... | Line 1393... | ||
1317 | 1393 | ||
1318 | crtcs = kcalloc(dev->mode_config.num_connector, |
1394 | crtcs = kcalloc(dev->mode_config.num_connector, |
1319 | sizeof(struct drm_fb_helper_crtc *), GFP_KERNEL); |
1395 | sizeof(struct drm_fb_helper_crtc *), GFP_KERNEL); |
1320 | modes = kcalloc(dev->mode_config.num_connector, |
1396 | modes = kcalloc(dev->mode_config.num_connector, |
- | 1397 | sizeof(struct drm_display_mode *), GFP_KERNEL); |
|
- | 1398 | offsets = kcalloc(dev->mode_config.num_connector, |
|
1321 | sizeof(struct drm_display_mode *), GFP_KERNEL); |
1399 | sizeof(struct drm_fb_offset), GFP_KERNEL); |
1322 | enabled = kcalloc(dev->mode_config.num_connector, |
1400 | enabled = kcalloc(dev->mode_config.num_connector, |
1323 | sizeof(bool), GFP_KERNEL); |
1401 | sizeof(bool), GFP_KERNEL); |
1324 | if (!crtcs || !modes || !enabled) { |
1402 | if (!crtcs || !modes || !enabled || !offsets) { |
1325 | DRM_ERROR("Memory allocation failed\n"); |
1403 | DRM_ERROR("Memory allocation failed\n"); |
1326 | goto out; |
1404 | goto out; |
Line 1327... | Line 1405... | ||
1327 | } |
1405 | } |
Line 1328... | Line 1406... | ||
1328 | 1406 | ||
1329 | 1407 | ||
- | 1408 | drm_enable_connectors(fb_helper, enabled); |
|
1330 | drm_enable_connectors(fb_helper, enabled); |
1409 | |
1331 | 1410 | if (!(fb_helper->funcs->initial_config && |
|
1332 | if (!(fb_helper->funcs->initial_config && |
1411 | fb_helper->funcs->initial_config(fb_helper, crtcs, modes, |
- | 1412 | offsets, |
|
Line 1333... | Line 1413... | ||
1333 | fb_helper->funcs->initial_config(fb_helper, crtcs, modes, |
1413 | enabled, width, height))) { |
1334 | enabled, width, height))) { |
1414 | memset(modes, 0, dev->mode_config.num_connector*sizeof(modes[0])); |
1335 | memset(modes, 0, dev->mode_config.num_connector*sizeof(modes[0])); |
1415 | memset(crtcs, 0, dev->mode_config.num_connector*sizeof(crtcs[0])); |
1336 | memset(crtcs, 0, dev->mode_config.num_connector*sizeof(crtcs[0])); |
1416 | memset(offsets, 0, dev->mode_config.num_connector*sizeof(offsets[0])); |
1337 | 1417 | ||
Line 1338... | Line 1418... | ||
1338 | if (!drm_target_cloned(fb_helper, |
1418 | if (!drm_target_cloned(fb_helper, modes, offsets, |
1339 | modes, enabled, width, height) && |
1419 | enabled, width, height) && |
Line 1356... | Line 1436... | ||
1356 | } |
1436 | } |
Line 1357... | Line 1437... | ||
1357 | 1437 | ||
1358 | for (i = 0; i < fb_helper->connector_count; i++) { |
1438 | for (i = 0; i < fb_helper->connector_count; i++) { |
1359 | struct drm_display_mode *mode = modes[i]; |
1439 | struct drm_display_mode *mode = modes[i]; |
- | 1440 | struct drm_fb_helper_crtc *fb_crtc = crtcs[i]; |
|
1360 | struct drm_fb_helper_crtc *fb_crtc = crtcs[i]; |
1441 | struct drm_fb_offset *offset = &offsets[i]; |
Line 1361... | Line 1442... | ||
1361 | modeset = &fb_crtc->mode_set; |
1442 | modeset = &fb_crtc->mode_set; |
1362 | 1443 | ||
1363 | if (mode && fb_crtc) { |
1444 | if (mode && fb_crtc) { |
1364 | DRM_DEBUG_KMS("desired mode %s set on crtc %d\n", |
1445 | DRM_DEBUG_KMS("desired mode %s set on crtc %d (%d,%d)\n", |
- | 1446 | mode->name, fb_crtc->mode_set.crtc->base.id, offset->x, offset->y); |
|
- | 1447 | fb_crtc->desired_mode = mode; |
|
1365 | mode->name, fb_crtc->mode_set.crtc->base.id); |
1448 | fb_crtc->x = offset->x; |
1366 | fb_crtc->desired_mode = mode; |
1449 | fb_crtc->y = offset->y; |
1367 | if (modeset->mode) |
1450 | if (modeset->mode) |
1368 | drm_mode_destroy(dev, modeset->mode); |
1451 | drm_mode_destroy(dev, modeset->mode); |
1369 | modeset->mode = drm_mode_duplicate(dev, |
1452 | modeset->mode = drm_mode_duplicate(dev, |
1370 | fb_crtc->desired_mode); |
1453 | fb_crtc->desired_mode); |
- | 1454 | modeset->connectors[modeset->num_connectors++] = fb_helper->connector_info[i]->connector; |
|
- | 1455 | modeset->fb = fb_helper->fb; |
|
1371 | modeset->connectors[modeset->num_connectors++] = fb_helper->connector_info[i]->connector; |
1456 | modeset->x = offset->x; |
1372 | modeset->fb = fb_helper->fb; |
1457 | modeset->y = offset->y; |
Line 1373... | Line 1458... | ||
1373 | } |
1458 | } |
1374 | } |
1459 | } |
1375 | 1460 | ||
1376 | /* Clear out any old modes if there are no more connected outputs. */ |
1461 | /* Clear out any old modes if there are no more connected outputs. */ |
1377 | for (i = 0; i < fb_helper->crtc_count; i++) { |
1462 | for (i = 0; i < fb_helper->crtc_count; i++) { |
1378 | modeset = &fb_helper->crtc_info[i].mode_set; |
- | |
1379 | if (modeset->num_connectors == 0) { |
1463 | modeset = &fb_helper->crtc_info[i].mode_set; |
1380 | BUG_ON(modeset->fb); |
1464 | if (modeset->num_connectors == 0) { |
1381 | BUG_ON(modeset->num_connectors); |
1465 | BUG_ON(modeset->fb); |
1382 | if (modeset->mode) |
1466 | if (modeset->mode) |
1383 | drm_mode_destroy(dev, modeset->mode); |
1467 | drm_mode_destroy(dev, modeset->mode); |
1384 | modeset->mode = NULL; |
1468 | modeset->mode = NULL; |
1385 | } |
1469 | } |
1386 | } |
1470 | } |
- | 1471 | out: |
|
1387 | out: |
1472 | kfree(crtcs); |
1388 | kfree(crtcs); |
1473 | kfree(modes); |
Line 1389... | Line 1474... | ||
1389 | kfree(modes); |
1474 | kfree(offsets); |
1390 | kfree(enabled); |
1475 | kfree(enabled); |
Line 1414... | Line 1499... | ||
1414 | bool drm_fb_helper_initial_config(struct drm_fb_helper *fb_helper, int bpp_sel) |
1499 | bool drm_fb_helper_initial_config(struct drm_fb_helper *fb_helper, int bpp_sel) |
1415 | { |
1500 | { |
1416 | struct drm_device *dev = fb_helper->dev; |
1501 | struct drm_device *dev = fb_helper->dev; |
1417 | int count = 0; |
1502 | int count = 0; |
Line 1418... | Line -... | ||
1418 | - | ||
1419 | // drm_fb_helper_parse_command_line(fb_helper); |
- | |
1420 | 1503 | ||
1421 | mutex_lock(&dev->mode_config.mutex); |
1504 | mutex_lock(&dev->mode_config.mutex); |
1422 | count = drm_fb_helper_probe_connector_modes(fb_helper, |
1505 | count = drm_fb_helper_probe_connector_modes(fb_helper, |
1423 | dev->mode_config.max_width, |
1506 | dev->mode_config.max_width, |
1424 | dev->mode_config.max_height); |
1507 | dev->mode_config.max_height); |