Lines Matching +full:count +full:- +full:width

1 // SPDX-License-Identifier: MIT
4 * Copyright (c) 2006-2009 Red Hat Inc.
5 * Copyright (c) 2006-2008 Intel Corporation
39 struct drm_device *dev = client->dev; in drm_client_modeset_create()
40 unsigned int num_crtc = dev->mode_config.num_crtc; in drm_client_modeset_create()
47 client->modesets = kzalloc_objs(*client->modesets, num_crtc + 1); in drm_client_modeset_create()
48 if (!client->modesets) in drm_client_modeset_create()
49 return -ENOMEM; in drm_client_modeset_create()
51 mutex_init(&client->modeset_mutex); in drm_client_modeset_create()
54 client->modesets[i++].crtc = crtc; in drm_client_modeset_create()
60 for (modeset = client->modesets; modeset->crtc; modeset++) { in drm_client_modeset_create()
61 modeset->connectors = kzalloc_objs(*modeset->connectors, in drm_client_modeset_create()
63 if (!modeset->connectors) in drm_client_modeset_create()
72 return -ENOMEM; in drm_client_modeset_create()
82 drm_mode_destroy(client->dev, modeset->mode); in drm_client_modeset_release()
83 modeset->mode = NULL; in drm_client_modeset_release()
84 modeset->fb = NULL; in drm_client_modeset_release()
86 for (i = 0; i < modeset->num_connectors; i++) { in drm_client_modeset_release()
87 drm_connector_put(modeset->connectors[i]); in drm_client_modeset_release()
88 modeset->connectors[i] = NULL; in drm_client_modeset_release()
90 modeset->num_connectors = 0; in drm_client_modeset_release()
98 mutex_lock(&client->modeset_mutex); in drm_client_modeset_free()
103 kfree(modeset->connectors); in drm_client_modeset_free()
105 mutex_unlock(&client->modeset_mutex); in drm_client_modeset_free()
107 mutex_destroy(&client->modeset_mutex); in drm_client_modeset_free()
108 kfree(client->modesets); in drm_client_modeset_free()
117 if (modeset->crtc == crtc) in drm_client_find_modeset()
128 list_for_each_entry(mode, &connector->modes, head) { in drm_connector_get_tiled_mode()
129 if (mode->hdisplay == connector->tile_h_size && in drm_connector_get_tiled_mode()
130 mode->vdisplay == connector->tile_v_size) in drm_connector_get_tiled_mode()
141 list_for_each_entry(mode, &connector->modes, head) { in drm_connector_fallback_non_tiled_mode()
142 if (mode->hdisplay == connector->tile_h_size && in drm_connector_fallback_non_tiled_mode()
143 mode->vdisplay == connector->tile_v_size) in drm_connector_fallback_non_tiled_mode()
151 drm_connector_preferred_mode(struct drm_connector *connector, int width, int height) in drm_connector_preferred_mode() argument
155 list_for_each_entry(mode, &connector->modes, head) { in drm_connector_preferred_mode()
156 if (mode->hdisplay > width || in drm_connector_preferred_mode()
157 mode->vdisplay > height) in drm_connector_preferred_mode()
159 if (mode->type & DRM_MODE_TYPE_PREFERRED) in drm_connector_preferred_mode()
168 return list_first_entry_or_null(&connector->modes, in drm_connector_first_mode()
180 * Find a user-defined mode. If the user gave us a valid in drm_connector_pick_cmdline_mode()
185 list_for_each_entry(mode, &connector->modes, head) { in drm_connector_pick_cmdline_mode()
186 if (mode->type & DRM_MODE_TYPE_USERDEF) in drm_connector_pick_cmdline_mode()
190 cmdline_mode = &connector->cmdline_mode; in drm_connector_pick_cmdline_mode()
191 if (cmdline_mode->specified == false) in drm_connector_pick_cmdline_mode()
199 prefer_non_interlace = !cmdline_mode->interlace; in drm_connector_pick_cmdline_mode()
201 list_for_each_entry(mode, &connector->modes, head) { in drm_connector_pick_cmdline_mode()
202 /* check width/height */ in drm_connector_pick_cmdline_mode()
203 if (mode->hdisplay != cmdline_mode->xres || in drm_connector_pick_cmdline_mode()
204 mode->vdisplay != cmdline_mode->yres) in drm_connector_pick_cmdline_mode()
207 if (cmdline_mode->refresh_specified) { in drm_connector_pick_cmdline_mode()
208 if (drm_mode_vrefresh(mode) != cmdline_mode->refresh) in drm_connector_pick_cmdline_mode()
212 if (cmdline_mode->interlace) { in drm_connector_pick_cmdline_mode()
213 if (!(mode->flags & DRM_MODE_FLAG_INTERLACE)) in drm_connector_pick_cmdline_mode()
216 if (mode->flags & DRM_MODE_FLAG_INTERLACE) in drm_connector_pick_cmdline_mode()
234 if (connector->display_info.non_desktop) in drm_connector_enabled()
238 enable = connector->status == connector_status_connected; in drm_connector_enabled()
240 enable = connector->status != connector_status_disconnected; in drm_connector_enabled()
256 drm_dbg_kms(connector->dev, "[CONNECTOR:%d:%s] enabled? %s\n", in drm_client_connectors_enabled()
257 connector->base.id, connector->name, in drm_client_connectors_enabled()
258 connector->display_info.non_desktop ? in drm_client_connectors_enabled()
282 int count) in modes_destroy() argument
286 for (i = 0; i < count; i++) in modes_destroy()
295 bool enabled[], int width, int height) in drm_client_target_cloned() argument
297 int count, i; in drm_client_target_cloned() local
302 if (dev->mode_config.num_crtc > 1) in drm_client_target_cloned()
305 count = 0; in drm_client_target_cloned()
308 count++; in drm_client_target_cloned()
312 if (count <= 1) in drm_client_target_cloned()
359 list_for_each_entry(mode, &connectors[i]->modes, head) { in drm_client_target_cloned()
395 if (!connector->has_tile) in drm_client_get_tile_offsets()
401 connector->base.id, connector->name, i); in drm_client_get_tile_offsets()
404 if (connector->tile_h_loc < h_idx) in drm_client_get_tile_offsets()
405 hoffset += modes[i]->hdisplay; in drm_client_get_tile_offsets()
407 if (connector->tile_v_loc < v_idx) in drm_client_get_tile_offsets()
408 voffset += modes[i]->vdisplay; in drm_client_get_tile_offsets()
421 bool enabled[], int width, int height) in drm_client_target_preferred() argument
423 const u64 mask = BIT_ULL(connector_count) - 1; in drm_client_target_preferred()
430 if (connectors[i]->has_tile && in drm_client_target_preferred()
431 connectors[i]->status == connector_status_connected) in drm_client_target_preferred()
450 if (tile_pass == 0 && connector->has_tile) in drm_client_target_preferred()
454 if (connector->tile_h_loc != 0 || in drm_client_target_preferred()
455 connector->tile_v_loc != 0) in drm_client_target_preferred()
459 if (connector->tile_h_loc != tile_pass - 1 && in drm_client_target_preferred()
460 connector->tile_v_loc != tile_pass - 1) in drm_client_target_preferred()
461 /* if this tile_pass doesn't cover any of the tiles - keep going */ in drm_client_target_preferred()
465 * find the tile offsets for this pass - need to find in drm_client_target_preferred()
470 connector->tile_h_loc, connector->tile_v_loc); in drm_client_target_preferred()
480 drm_connector_preferred_mode(connector, width, height)); in drm_client_target_preferred()
497 if (connector->has_tile) { in drm_client_target_preferred()
499 connector->num_h_tile * connector->num_v_tile || in drm_client_target_preferred()
500 (connector->tile_h_loc == 0 && in drm_client_target_preferred()
501 connector->tile_v_loc == 0 && in drm_client_target_preferred()
515 connector->base.id, connector->name, in drm_client_target_preferred()
516 mode_type, modes[i]->name); in drm_client_target_preferred()
519 connector->base.id, connector->name); in drm_client_target_preferred()
537 if (encoder->possible_crtcs & drm_crtc_mask(crtc)) in connector_has_possible_crtc()
549 int n, int width, int height) in drm_client_pick_crtcs() argument
551 struct drm_device *dev = client->dev; in drm_client_pick_crtcs()
564 best_crtcs, modes, n + 1, width, height); in drm_client_pick_crtcs()
573 if (connector->status == connector_status_connected) in drm_client_pick_crtcs()
575 if (connector->cmdline_mode.specified) in drm_client_pick_crtcs()
577 if (drm_connector_preferred_mode(connector, width, height)) in drm_client_pick_crtcs()
585 struct drm_crtc *crtc = modeset->crtc; in drm_client_pick_crtcs()
597 if (dev->mode_config.num_crtc > 1) in drm_client_pick_crtcs()
607 crtcs, modes, n + 1, width, height); in drm_client_pick_crtcs()
625 bool enabled[], int width, int height) in drm_client_firmware_config() argument
627 const int count = min_t(unsigned int, connector_count, BITS_PER_LONG); in drm_client_firmware_config() local
629 struct drm_device *dev = client->dev; in drm_client_firmware_config()
641 if (drm_WARN_ON(dev, count <= 0)) in drm_client_firmware_config()
644 save_enabled = kzalloc_objs(bool, count); in drm_client_firmware_config()
653 memcpy(save_enabled, enabled, count); in drm_client_firmware_config()
654 mask = GENMASK(count - 1, 0); in drm_client_firmware_config()
656 for (i = 0; i < count; i++) { in drm_client_firmware_config()
657 if (connectors[i]->has_tile && in drm_client_firmware_config()
658 connectors[i]->status == connector_status_connected) in drm_client_firmware_config()
663 for (i = 0; i < count; i++) { in drm_client_firmware_config()
673 if (conn_seq == 0 && !connector->has_tile) in drm_client_firmware_config()
676 if (connector->status == connector_status_connected) in drm_client_firmware_config()
681 connector->base.id, connector->name); in drm_client_firmware_config()
686 if (connector->force == DRM_FORCE_OFF) { in drm_client_firmware_config()
688 connector->base.id, connector->name); in drm_client_firmware_config()
693 encoder = connector->state->best_encoder; in drm_client_firmware_config()
694 if (!encoder || drm_WARN_ON(dev, !connector->state->crtc)) { in drm_client_firmware_config()
695 if (connector->force > DRM_FORCE_OFF) in drm_client_firmware_config()
699 connector->base.id, connector->name); in drm_client_firmware_config()
707 crtc = connector->state->crtc; in drm_client_firmware_config()
714 for (j = 0; j < count; j++) { in drm_client_firmware_config()
717 connector->base.id, connector->name); in drm_client_firmware_config()
729 drm_connector_preferred_mode(connector, width, height)); in drm_client_firmware_config()
742 &crtc->state->mode); in drm_client_firmware_config()
749 if (connector->has_tile && in drm_client_firmware_config()
750 num_tiled_conns < connector->num_h_tile * connector->num_v_tile) { in drm_client_firmware_config()
758 connector->base.id, connector->name, in drm_client_firmware_config()
759 crtc->base.id, crtc->name, in drm_client_firmware_config()
760 mode_type, modes[i]->name); in drm_client_firmware_config()
769 for (i = 0; i < count; i++) { in drm_client_firmware_config()
772 if (connector->has_tile) in drm_client_firmware_config()
775 connector->tile_h_loc, connector->tile_v_loc); in drm_client_firmware_config()
784 num_connectors_enabled < dev->mode_config.num_crtc) { in drm_client_firmware_config()
794 memcpy(enabled, save_enabled, count); in drm_client_firmware_config()
806 * drm_client_modeset_probe() - Probe for displays
808 * @width: Maximum display mode width (optional)
817 int drm_client_modeset_probe(struct drm_client_dev *client, unsigned int width, unsigned int height) in drm_client_modeset_probe() argument
821 struct drm_device *dev = client->dev; in drm_client_modeset_probe()
832 if (!width) in drm_client_modeset_probe()
833 width = dev->mode_config.max_width; in drm_client_modeset_probe()
835 height = dev->mode_config.max_height; in drm_client_modeset_probe()
843 ret = -ENOMEM; in drm_client_modeset_probe()
861 ret = -ENOMEM; in drm_client_modeset_probe()
865 mutex_lock(&client->modeset_mutex); in drm_client_modeset_probe()
867 mutex_lock(&dev->mode_config.mutex); in drm_client_modeset_probe()
869 total_modes_count += connectors[i]->funcs->fill_modes(connectors[i], width, height); in drm_client_modeset_probe()
875 modes, offsets, enabled, width, height)) { in drm_client_modeset_probe()
881 offsets, enabled, width, height) && in drm_client_modeset_probe()
883 offsets, enabled, width, height)) in drm_client_modeset_probe()
887 width, height); in drm_client_modeset_probe()
890 crtcs, modes, 0, width, height); in drm_client_modeset_probe()
893 mutex_unlock(&dev->mode_config.mutex); in drm_client_modeset_probe()
907 crtc->base.id, crtc->name, in drm_client_modeset_probe()
908 mode->name, offset->x, offset->y); in drm_client_modeset_probe()
910 if (drm_WARN_ON_ONCE(dev, modeset->num_connectors == DRM_CLIENT_MAX_CLONED_CONNECTORS || in drm_client_modeset_probe()
911 (dev->mode_config.num_crtc > 1 && modeset->num_connectors == 1))) { in drm_client_modeset_probe()
912 ret = -EINVAL; in drm_client_modeset_probe()
916 drm_mode_destroy(dev, modeset->mode); in drm_client_modeset_probe()
917 modeset->mode = drm_mode_duplicate(dev, mode); in drm_client_modeset_probe()
918 if (!modeset->mode) { in drm_client_modeset_probe()
919 ret = -ENOMEM; in drm_client_modeset_probe()
924 modeset->connectors[modeset->num_connectors++] = connector; in drm_client_modeset_probe()
925 modeset->x = offset->x; in drm_client_modeset_probe()
926 modeset->y = offset->y; in drm_client_modeset_probe()
930 mutex_unlock(&client->modeset_mutex); in drm_client_modeset_probe()
948 * drm_client_rotation() - Check the initial rotation value
962 struct drm_connector *connector = modeset->connectors[0]; in drm_client_rotation()
963 struct drm_plane *plane = modeset->crtc->primary; in drm_client_rotation()
968 if (!modeset->num_connectors) in drm_client_rotation()
971 switch (connector->display_info.panel_orientation) { in drm_client_rotation()
997 cmdline = &connector->cmdline_mode; in drm_client_rotation()
998 if (cmdline->specified && cmdline->rotation_reflection) { in drm_client_rotation()
1004 cmdline_rot = ilog2(cmdline->rotation_reflection & DRM_MODE_ROTATE_MASK); in drm_client_rotation()
1008 cmdline_rest = cmdline->rotation_reflection & ~DRM_MODE_ROTATE_MASK; in drm_client_rotation()
1021 !plane->rotation_property) in drm_client_rotation()
1024 for (i = 0; i < plane->rotation_property->num_values; i++) in drm_client_rotation()
1025 valid_mask |= (1ULL << plane->rotation_property->values[i]); in drm_client_rotation()
1036 struct drm_device *dev = client->dev; in drm_client_modeset_commit_atomic()
1047 ret = -ENOMEM; in drm_client_modeset_commit_atomic()
1051 state->acquire_ctx = &ctx; in drm_client_modeset_commit_atomic()
1062 plane_state->rotation = DRM_MODE_ROTATE_0; in drm_client_modeset_commit_atomic()
1064 /* disable non-primary: */ in drm_client_modeset_commit_atomic()
1065 if (plane->type == DRM_PLANE_TYPE_PRIMARY) in drm_client_modeset_commit_atomic()
1074 struct drm_plane *primary = mode_set->crtc->primary; in drm_client_modeset_commit_atomic()
1082 plane_state->rotation = rotation; in drm_client_modeset_commit_atomic()
1094 struct drm_crtc *crtc = mode_set->crtc; in drm_client_modeset_commit_atomic()
1097 crtc_state->active = false; in drm_client_modeset_commit_atomic()
1107 if (ret == -EDEADLK) in drm_client_modeset_commit_atomic()
1126 struct drm_device *dev = client->dev; in drm_client_modeset_commit_legacy()
1133 if (plane->type != DRM_PLANE_TYPE_PRIMARY) in drm_client_modeset_commit_legacy()
1136 if (plane->rotation_property) in drm_client_modeset_commit_legacy()
1138 plane->rotation_property, in drm_client_modeset_commit_legacy()
1143 struct drm_crtc *crtc = mode_set->crtc; in drm_client_modeset_commit_legacy()
1145 if (crtc->funcs->cursor_set2) { in drm_client_modeset_commit_legacy()
1146 ret = crtc->funcs->cursor_set2(crtc, NULL, 0, 0, 0, 0, 0); in drm_client_modeset_commit_legacy()
1149 } else if (crtc->funcs->cursor_set) { in drm_client_modeset_commit_legacy()
1150 ret = crtc->funcs->cursor_set(crtc, NULL, 0, 0, 0); in drm_client_modeset_commit_legacy()
1166 * drm_client_modeset_check() - Check modeset configuration
1178 if (!drm_drv_uses_atomic_modeset(client->dev)) in drm_client_modeset_check()
1181 mutex_lock(&client->modeset_mutex); in drm_client_modeset_check()
1183 mutex_unlock(&client->modeset_mutex); in drm_client_modeset_check()
1190 * drm_client_modeset_commit_locked() - Force commit CRTC configuration
1202 struct drm_device *dev = client->dev; in drm_client_modeset_commit_locked()
1205 mutex_lock(&client->modeset_mutex); in drm_client_modeset_commit_locked()
1210 mutex_unlock(&client->modeset_mutex); in drm_client_modeset_commit_locked()
1217 * drm_client_modeset_commit() - Commit CRTC configuration
1227 struct drm_device *dev = client->dev; in drm_client_modeset_commit()
1231 return -EBUSY; in drm_client_modeset_commit()
1243 struct drm_device *dev = client->dev; in drm_client_modeset_dpms_legacy()
1253 if (!modeset->crtc->enabled) in drm_client_modeset_dpms_legacy()
1256 for (j = 0; j < modeset->num_connectors; j++) { in drm_client_modeset_dpms_legacy()
1257 connector = modeset->connectors[j]; in drm_client_modeset_dpms_legacy()
1258 connector->funcs->dpms(connector, dpms_mode); in drm_client_modeset_dpms_legacy()
1259 drm_object_property_set_value(&connector->base, in drm_client_modeset_dpms_legacy()
1260 dev->mode_config.dpms_property, dpms_mode); in drm_client_modeset_dpms_legacy()
1267 * drm_client_modeset_dpms() - Set DPMS mode
1278 struct drm_device *dev = client->dev; in drm_client_modeset_dpms()
1282 return -EBUSY; in drm_client_modeset_dpms()
1284 mutex_lock(&client->modeset_mutex); in drm_client_modeset_dpms()
1289 mutex_unlock(&client->modeset_mutex); in drm_client_modeset_dpms()
1298 * drm_client_modeset_wait_for_vblank() - Wait for the next VBLANK to occur
1304 * with -EBUSY.
1311 struct drm_device *dev = client->dev; in drm_client_modeset_wait_for_vblank()
1316 * Rate-limit update frequency to vblank. If there's a DRM master in drm_client_modeset_wait_for_vblank()
1321 return -EBUSY; in drm_client_modeset_wait_for_vblank()
1323 crtc = client->modesets[crtc_index].crtc; in drm_client_modeset_wait_for_vblank()