Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

drm/vmwgfx: Fix up the implicit display unit handling

Make the connector is_implicit property immutable.
As far as we know, no user-space application is writing to it.

Also move the verification that all implicit display units scan out
from the same framebuffer to atomic_check().

Signed-off-by: Thomas Hellstrom <thellstrom@vmware.com>
Reviewed-by: Sinclair Yeh <syeh@vmware.com>
Reviewed-by: Deepak Rawat <drawat@vmware.com>

+98 -291
-2
drivers/gpu/drm/vmwgfx/vmwgfx_drv.h
··· 484 484 struct vmw_overlay *overlay_priv; 485 485 struct drm_property *hotplug_mode_update_property; 486 486 struct drm_property *implicit_placement_property; 487 - unsigned num_implicit; 488 - struct vmw_framebuffer *implicit_fb; 489 487 struct mutex global_kms_state_mutex; 490 488 spinlock_t cursor_lock; 491 489 struct drm_atomic_state *suspend_state;
+88 -189
drivers/gpu/drm/vmwgfx/vmwgfx_kms.c
··· 457 457 struct drm_crtc *crtc = state->crtc; 458 458 struct vmw_connector_state *vcs; 459 459 struct vmw_display_unit *du = vmw_crtc_to_du(crtc); 460 - struct vmw_private *dev_priv = vmw_priv(crtc->dev); 461 - struct vmw_framebuffer *vfb = vmw_framebuffer_to_vfb(new_fb); 462 460 463 461 vcs = vmw_connector_state_to_vcs(du->connector.state); 464 - 465 - /* Only one active implicit framebuffer at a time. */ 466 - mutex_lock(&dev_priv->global_kms_state_mutex); 467 - if (vcs->is_implicit && dev_priv->implicit_fb && 468 - !(dev_priv->num_implicit == 1 && du->active_implicit) 469 - && dev_priv->implicit_fb != vfb) { 470 - DRM_ERROR("Multiple implicit framebuffers " 471 - "not supported.\n"); 472 - ret = -EINVAL; 473 - } 474 - mutex_unlock(&dev_priv->global_kms_state_mutex); 475 462 } 476 463 477 464 ··· 1507 1520 } 1508 1521 1509 1522 /** 1523 + * vmw_crtc_state_and_lock - Return new or current crtc state with locked 1524 + * crtc mutex 1525 + * @state: The atomic state pointer containing the new atomic state 1526 + * @crtc: The crtc 1527 + * 1528 + * This function returns the new crtc state if it's part of the state update. 1529 + * Otherwise returns the current crtc state. It also makes sure that the 1530 + * crtc mutex is locked. 1531 + * 1532 + * Returns: A valid crtc state pointer or NULL. It may also return a 1533 + * pointer error, in particular -EDEADLK if locking needs to be rerun. 1534 + */ 1535 + static struct drm_crtc_state * 1536 + vmw_crtc_state_and_lock(struct drm_atomic_state *state, struct drm_crtc *crtc) 1537 + { 1538 + struct drm_crtc_state *crtc_state; 1539 + 1540 + crtc_state = drm_atomic_get_new_crtc_state(state, crtc); 1541 + if (crtc_state) { 1542 + lockdep_assert_held(&crtc->mutex.mutex.base); 1543 + } else { 1544 + int ret = drm_modeset_lock(&crtc->mutex, state->acquire_ctx); 1545 + 1546 + if (ret != 0 && ret != -EALREADY) 1547 + return ERR_PTR(ret); 1548 + 1549 + crtc_state = crtc->state; 1550 + } 1551 + 1552 + return crtc_state; 1553 + } 1554 + 1555 + /** 1556 + * vmw_kms_check_implicit - Verify that all implicit display units scan out 1557 + * from the same fb after the new state is committed. 1558 + * @dev: The drm_device. 1559 + * @state: The new state to be checked. 1560 + * 1561 + * Returns: 1562 + * Zero on success, 1563 + * -EINVAL on invalid state, 1564 + * -EDEADLK if modeset locking needs to be rerun. 1565 + */ 1566 + static int vmw_kms_check_implicit(struct drm_device *dev, 1567 + struct drm_atomic_state *state) 1568 + { 1569 + struct drm_framebuffer *implicit_fb = NULL; 1570 + struct drm_crtc *crtc; 1571 + struct drm_crtc_state *crtc_state; 1572 + struct drm_plane_state *plane_state; 1573 + 1574 + drm_for_each_crtc(crtc, dev) { 1575 + struct vmw_display_unit *du = vmw_crtc_to_du(crtc); 1576 + 1577 + if (!du->is_implicit) 1578 + continue; 1579 + 1580 + crtc_state = vmw_crtc_state_and_lock(state, crtc); 1581 + if (IS_ERR(crtc_state)) 1582 + return PTR_ERR(crtc_state); 1583 + 1584 + if (!crtc_state || !crtc_state->enable) 1585 + continue; 1586 + 1587 + /* 1588 + * Can't move primary planes across crtcs, so this is OK. 1589 + * It also means we don't need to take the plane mutex. 1590 + */ 1591 + plane_state = du->primary.state; 1592 + if (plane_state->crtc != crtc) 1593 + continue; 1594 + 1595 + if (!implicit_fb) 1596 + implicit_fb = plane_state->fb; 1597 + else if (implicit_fb != plane_state->fb) 1598 + return -EINVAL; 1599 + } 1600 + 1601 + return 0; 1602 + } 1603 + 1604 + /** 1510 1605 * vmw_kms_check_topology - Validates topology in drm_atomic_state 1511 1606 * @dev: DRM device 1512 1607 * @state: the driver state object ··· 1702 1633 int i, ret; 1703 1634 1704 1635 ret = drm_atomic_helper_check(dev, state); 1636 + if (ret) 1637 + return ret; 1638 + 1639 + ret = vmw_kms_check_implicit(dev, state); 1705 1640 if (ret) 1706 1641 return ret; 1707 1642 ··· 2303 2230 return 1; 2304 2231 } 2305 2232 2306 - int vmw_du_connector_set_property(struct drm_connector *connector, 2307 - struct drm_property *property, 2308 - uint64_t val) 2309 - { 2310 - struct vmw_display_unit *du = vmw_connector_to_du(connector); 2311 - struct vmw_private *dev_priv = vmw_priv(connector->dev); 2312 - 2313 - if (property == dev_priv->implicit_placement_property) 2314 - du->is_implicit = val; 2315 - 2316 - return 0; 2317 - } 2318 - 2319 - 2320 - 2321 - /** 2322 - * vmw_du_connector_atomic_set_property - Atomic version of get property 2323 - * 2324 - * @crtc - crtc the property is associated with 2325 - * 2326 - * Returns: 2327 - * Zero on success, negative errno on failure. 2328 - */ 2329 - int 2330 - vmw_du_connector_atomic_set_property(struct drm_connector *connector, 2331 - struct drm_connector_state *state, 2332 - struct drm_property *property, 2333 - uint64_t val) 2334 - { 2335 - struct vmw_private *dev_priv = vmw_priv(connector->dev); 2336 - struct vmw_connector_state *vcs = vmw_connector_state_to_vcs(state); 2337 - struct vmw_display_unit *du = vmw_connector_to_du(connector); 2338 - 2339 - 2340 - if (property == dev_priv->implicit_placement_property) { 2341 - vcs->is_implicit = val; 2342 - 2343 - /* 2344 - * We should really be doing a drm_atomic_commit() to 2345 - * commit the new state, but since this doesn't cause 2346 - * an immedate state change, this is probably ok 2347 - */ 2348 - du->is_implicit = vcs->is_implicit; 2349 - } else { 2350 - return -EINVAL; 2351 - } 2352 - 2353 - return 0; 2354 - } 2355 - 2356 - 2357 - /** 2358 - * vmw_du_connector_atomic_get_property - Atomic version of get property 2359 - * 2360 - * @connector - connector the property is associated with 2361 - * 2362 - * Returns: 2363 - * Zero on success, negative errno on failure. 2364 - */ 2365 - int 2366 - vmw_du_connector_atomic_get_property(struct drm_connector *connector, 2367 - const struct drm_connector_state *state, 2368 - struct drm_property *property, 2369 - uint64_t *val) 2370 - { 2371 - struct vmw_private *dev_priv = vmw_priv(connector->dev); 2372 - struct vmw_connector_state *vcs = vmw_connector_state_to_vcs(state); 2373 - 2374 - if (property == dev_priv->implicit_placement_property) 2375 - *val = vcs->is_implicit; 2376 - else { 2377 - DRM_ERROR("Invalid Property %s\n", property->name); 2378 - return -EINVAL; 2379 - } 2380 - 2381 - return 0; 2382 - } 2383 - 2384 2233 /** 2385 2234 * vmw_kms_update_layout_ioctl - Handler for DRM_VMW_UPDATE_LAYOUT ioctl 2386 2235 * @dev: drm device for the ioctl ··· 2692 2697 } 2693 2698 2694 2699 /** 2695 - * vmw_kms_del_active - unregister a crtc binding to the implicit framebuffer 2696 - * 2697 - * @dev_priv: Pointer to a device private struct. 2698 - * @du: The display unit of the crtc. 2699 - */ 2700 - void vmw_kms_del_active(struct vmw_private *dev_priv, 2701 - struct vmw_display_unit *du) 2702 - { 2703 - mutex_lock(&dev_priv->global_kms_state_mutex); 2704 - if (du->active_implicit) { 2705 - if (--(dev_priv->num_implicit) == 0) 2706 - dev_priv->implicit_fb = NULL; 2707 - du->active_implicit = false; 2708 - } 2709 - mutex_unlock(&dev_priv->global_kms_state_mutex); 2710 - } 2711 - 2712 - /** 2713 - * vmw_kms_add_active - register a crtc binding to an implicit framebuffer 2714 - * 2715 - * @vmw_priv: Pointer to a device private struct. 2716 - * @du: The display unit of the crtc. 2717 - * @vfb: The implicit framebuffer 2718 - * 2719 - * Registers a binding to an implicit framebuffer. 2720 - */ 2721 - void vmw_kms_add_active(struct vmw_private *dev_priv, 2722 - struct vmw_display_unit *du, 2723 - struct vmw_framebuffer *vfb) 2724 - { 2725 - mutex_lock(&dev_priv->global_kms_state_mutex); 2726 - WARN_ON_ONCE(!dev_priv->num_implicit && dev_priv->implicit_fb); 2727 - 2728 - if (!du->active_implicit && du->is_implicit) { 2729 - dev_priv->implicit_fb = vfb; 2730 - du->active_implicit = true; 2731 - dev_priv->num_implicit++; 2732 - } 2733 - mutex_unlock(&dev_priv->global_kms_state_mutex); 2734 - } 2735 - 2736 - /** 2737 - * vmw_kms_screen_object_flippable - Check whether we can page-flip a crtc. 2738 - * 2739 - * @dev_priv: Pointer to device-private struct. 2740 - * @crtc: The crtc we want to flip. 2741 - * 2742 - * Returns true or false depending whether it's OK to flip this crtc 2743 - * based on the criterion that we must not have more than one implicit 2744 - * frame-buffer at any one time. 2745 - */ 2746 - bool vmw_kms_crtc_flippable(struct vmw_private *dev_priv, 2747 - struct drm_crtc *crtc) 2748 - { 2749 - struct vmw_display_unit *du = vmw_crtc_to_du(crtc); 2750 - bool ret; 2751 - 2752 - mutex_lock(&dev_priv->global_kms_state_mutex); 2753 - ret = !du->is_implicit || dev_priv->num_implicit == 1; 2754 - mutex_unlock(&dev_priv->global_kms_state_mutex); 2755 - 2756 - return ret; 2757 - } 2758 - 2759 - /** 2760 - * vmw_kms_update_implicit_fb - Update the implicit fb. 2761 - * 2762 - * @dev_priv: Pointer to device-private struct. 2763 - * @crtc: The crtc the new implicit frame-buffer is bound to. 2764 - */ 2765 - void vmw_kms_update_implicit_fb(struct vmw_private *dev_priv, 2766 - struct drm_crtc *crtc) 2767 - { 2768 - struct vmw_display_unit *du = vmw_crtc_to_du(crtc); 2769 - struct drm_plane *plane = crtc->primary; 2770 - struct vmw_framebuffer *vfb; 2771 - 2772 - mutex_lock(&dev_priv->global_kms_state_mutex); 2773 - 2774 - if (!du->is_implicit) 2775 - goto out_unlock; 2776 - 2777 - vfb = vmw_framebuffer_to_vfb(plane->state->fb); 2778 - WARN_ON_ONCE(dev_priv->num_implicit != 1 && 2779 - dev_priv->implicit_fb != vfb); 2780 - 2781 - dev_priv->implicit_fb = vfb; 2782 - out_unlock: 2783 - mutex_unlock(&dev_priv->global_kms_state_mutex); 2784 - } 2785 - 2786 - /** 2787 2700 * vmw_kms_create_implicit_placement_proparty - Set up the implicit placement 2788 2701 * property. 2789 2702 * 2790 2703 * @dev_priv: Pointer to a device private struct. 2791 - * @immutable: Whether the property is immutable. 2792 2704 * 2793 2705 * Sets up the implicit placement property unless it's already set up. 2794 2706 */ 2795 2707 void 2796 - vmw_kms_create_implicit_placement_property(struct vmw_private *dev_priv, 2797 - bool immutable) 2708 + vmw_kms_create_implicit_placement_property(struct vmw_private *dev_priv) 2798 2709 { 2799 2710 if (dev_priv->implicit_placement_property) 2800 2711 return; 2801 2712 2802 2713 dev_priv->implicit_placement_property = 2803 2714 drm_property_create_range(dev_priv->dev, 2804 - immutable ? 2805 - DRM_MODE_PROP_IMMUTABLE : 0, 2715 + DRM_MODE_PROP_IMMUTABLE, 2806 2716 "implicit_placement", 0, 1); 2807 - 2808 2717 } 2809 2718 2810 2719 /**
+2 -14
drivers/gpu/drm/vmwgfx/vmwgfx_kms.h
··· 307 307 struct vmw_connector_state { 308 308 struct drm_connector_state base; 309 309 310 - bool is_implicit; 311 - 312 310 /** 313 311 * @gui_x: 314 312 * ··· 368 370 int gui_x; 369 371 int gui_y; 370 372 bool is_implicit; 371 - bool active_implicit; 372 373 int set_gui_x; 373 374 int set_gui_y; 374 375 }; ··· 447 450 struct drm_crtc **p_crtc, 448 451 struct drm_display_mode **p_mode); 449 452 void vmw_guess_mode_timing(struct drm_display_mode *mode); 450 - void vmw_kms_del_active(struct vmw_private *dev_priv, 451 - struct vmw_display_unit *du); 452 - void vmw_kms_add_active(struct vmw_private *dev_priv, 453 - struct vmw_display_unit *du, 454 - struct vmw_framebuffer *vfb); 455 - bool vmw_kms_crtc_flippable(struct vmw_private *dev_priv, 456 - struct drm_crtc *crtc); 457 - void vmw_kms_update_implicit_fb(struct vmw_private *dev_priv, 458 - struct drm_crtc *crtc); 459 - void vmw_kms_create_implicit_placement_property(struct vmw_private *dev_priv, 460 - bool immutable); 453 + void vmw_kms_update_implicit_fb(struct vmw_private *dev_priv); 454 + void vmw_kms_create_implicit_placement_property(struct vmw_private *dev_priv); 461 455 462 456 /* Universal Plane Helpers */ 463 457 void vmw_du_primary_plane_destroy(struct drm_plane *plane);
+1 -8
drivers/gpu/drm/vmwgfx/vmwgfx_ldu.c
··· 263 263 .dpms = vmw_du_connector_dpms, 264 264 .detect = vmw_du_connector_detect, 265 265 .fill_modes = vmw_du_connector_fill_modes, 266 - .set_property = vmw_du_connector_set_property, 267 266 .destroy = vmw_ldu_connector_destroy, 268 267 .reset = vmw_du_connector_reset, 269 268 .atomic_duplicate_state = vmw_du_connector_duplicate_state, 270 269 .atomic_destroy_state = vmw_du_connector_destroy_state, 271 - .atomic_set_property = vmw_du_connector_atomic_set_property, 272 - .atomic_get_property = vmw_du_connector_atomic_get_property, 273 270 }; 274 271 275 272 static const struct ··· 413 416 414 417 drm_plane_helper_add(cursor, &vmw_ldu_cursor_plane_helper_funcs); 415 418 416 - 417 419 vmw_du_connector_reset(connector); 418 420 ret = drm_connector_init(dev, connector, &vmw_legacy_connector_funcs, 419 421 DRM_MODE_CONNECTOR_VIRTUAL); ··· 423 427 424 428 drm_connector_helper_add(connector, &vmw_ldu_connector_helper_funcs); 425 429 connector->status = vmw_du_connector_detect(connector, true); 426 - vmw_connector_state_to_vcs(connector->state)->is_implicit = true; 427 - 428 430 429 431 ret = drm_encoder_init(dev, encoder, &vmw_legacy_encoder_funcs, 430 432 DRM_MODE_ENCODER_VIRTUAL, NULL); ··· 440 446 DRM_ERROR("Failed to register connector\n"); 441 447 goto err_free_encoder; 442 448 } 443 - 444 449 445 450 vmw_du_crtc_reset(crtc); 446 451 ret = drm_crtc_init_with_planes(dev, crtc, &ldu->base.primary, ··· 506 513 if (ret != 0) 507 514 goto err_free; 508 515 509 - vmw_kms_create_implicit_placement_property(dev_priv, true); 516 + vmw_kms_create_implicit_placement_property(dev_priv); 510 517 511 518 if (dev_priv->capabilities & SVGA_CAP_MULTIMON) 512 519 for (i = 0; i < VMWGFX_NUM_DISPLAY_UNITS; ++i)
+4 -35
drivers/gpu/drm/vmwgfx/vmwgfx_scrn.c
··· 247 247 sou->buffer = vps->bo; 248 248 sou->buffer_size = vps->bo_size; 249 249 250 - if (sou->base.is_implicit) { 251 - x = crtc->x; 252 - y = crtc->y; 253 - } else { 254 - conn_state = sou->base.connector.state; 255 - vmw_conn_state = vmw_connector_state_to_vcs(conn_state); 250 + conn_state = sou->base.connector.state; 251 + vmw_conn_state = vmw_connector_state_to_vcs(conn_state); 256 252 257 - x = vmw_conn_state->gui_x; 258 - y = vmw_conn_state->gui_y; 259 - } 253 + x = vmw_conn_state->gui_x; 254 + y = vmw_conn_state->gui_y; 260 255 261 256 ret = vmw_sou_fifo_create(dev_priv, sou, x, y, &crtc->mode); 262 257 if (ret) 263 258 DRM_ERROR("Failed to define Screen Object %dx%d\n", 264 259 crtc->x, crtc->y); 265 260 266 - vmw_kms_add_active(dev_priv, &sou->base, vfb); 267 261 } else { 268 262 sou->buffer = NULL; 269 263 sou->buffer_size = 0; 270 - 271 - vmw_kms_del_active(dev_priv, &sou->base); 272 264 } 273 265 } 274 266 ··· 321 329 uint32_t flags, 322 330 struct drm_modeset_acquire_ctx *ctx) 323 331 { 324 - struct vmw_private *dev_priv = vmw_priv(crtc->dev); 325 332 int ret; 326 - 327 - if (!vmw_kms_crtc_flippable(dev_priv, crtc)) 328 - return -EINVAL; 329 333 330 334 ret = drm_atomic_helper_page_flip(crtc, new_fb, event, flags, ctx); 331 335 if (ret) { 332 336 DRM_ERROR("Page flip error %d.\n", ret); 333 337 return ret; 334 338 } 335 - 336 - if (vmw_crtc_to_du(crtc)->is_implicit) 337 - vmw_kms_update_implicit_fb(dev_priv, crtc); 338 339 339 340 return ret; 340 341 } ··· 368 383 .dpms = vmw_du_connector_dpms, 369 384 .detect = vmw_du_connector_detect, 370 385 .fill_modes = vmw_du_connector_fill_modes, 371 - .set_property = vmw_du_connector_set_property, 372 386 .destroy = vmw_sou_connector_destroy, 373 387 .reset = vmw_du_connector_reset, 374 388 .atomic_duplicate_state = vmw_du_connector_duplicate_state, 375 389 .atomic_destroy_state = vmw_du_connector_destroy_state, 376 - .atomic_set_property = vmw_du_connector_atomic_set_property, 377 - .atomic_get_property = vmw_du_connector_atomic_get_property, 378 390 }; 379 391 380 392 ··· 865 883 primary = &sou->base.primary; 866 884 cursor = &sou->base.cursor; 867 885 868 - sou->base.active_implicit = false; 869 886 sou->base.pref_active = (unit == 0); 870 887 sou->base.pref_width = dev_priv->initial_width; 871 888 sou->base.pref_height = dev_priv->initial_height; ··· 918 937 919 938 drm_connector_helper_add(connector, &vmw_sou_connector_helper_funcs); 920 939 connector->status = vmw_du_connector_detect(connector, true); 921 - vmw_connector_state_to_vcs(connector->state)->is_implicit = false; 922 - 923 940 924 941 ret = drm_encoder_init(dev, encoder, &vmw_screen_object_encoder_funcs, 925 942 DRM_MODE_ENCODER_VIRTUAL, NULL); ··· 956 977 dev->mode_config.suggested_x_property, 0); 957 978 drm_object_attach_property(&connector->base, 958 979 dev->mode_config.suggested_y_property, 0); 959 - if (dev_priv->implicit_placement_property) 960 - drm_object_attach_property 961 - (&connector->base, 962 - dev_priv->implicit_placement_property, 963 - sou->base.is_implicit); 964 - 965 980 return 0; 966 981 967 982 err_free_unregister: ··· 981 1008 } 982 1009 983 1010 ret = -ENOMEM; 984 - dev_priv->num_implicit = 0; 985 - dev_priv->implicit_fb = NULL; 986 1011 987 1012 ret = drm_vblank_init(dev, VMWGFX_NUM_DISPLAY_UNITS); 988 1013 if (unlikely(ret != 0)) 989 1014 return ret; 990 - 991 - vmw_kms_create_implicit_placement_property(dev_priv, false); 992 1015 993 1016 for (i = 0; i < VMWGFX_NUM_DISPLAY_UNITS; ++i) 994 1017 vmw_sou_init(dev_priv, i);
+3 -43
drivers/gpu/drm/vmwgfx/vmwgfx_stdu.c
··· 400 400 if (!crtc->state->enable) 401 401 return; 402 402 403 - if (stdu->base.is_implicit) { 404 - x = crtc->x; 405 - y = crtc->y; 406 - } else { 407 - x = vmw_conn_state->gui_x; 408 - y = vmw_conn_state->gui_y; 409 - } 403 + x = vmw_conn_state->gui_x; 404 + y = vmw_conn_state->gui_y; 410 405 411 406 vmw_svga_enable(dev_priv); 412 407 ret = vmw_stdu_define_st(dev_priv, stdu, &crtc->mode, x, y); ··· 416 421 { 417 422 } 418 423 419 - 420 424 static void vmw_stdu_crtc_atomic_enable(struct drm_crtc *crtc, 421 425 struct drm_crtc_state *old_state) 422 426 { 423 - struct drm_plane_state *plane_state = crtc->primary->state; 424 - struct vmw_private *dev_priv; 425 - struct vmw_screen_target_display_unit *stdu; 426 - struct vmw_framebuffer *vfb; 427 - struct drm_framebuffer *fb; 428 - 429 - 430 - stdu = vmw_crtc_to_stdu(crtc); 431 - dev_priv = vmw_priv(crtc->dev); 432 - fb = plane_state->fb; 433 - 434 - vfb = (fb) ? vmw_framebuffer_to_vfb(fb) : NULL; 435 - 436 - if (vfb) 437 - vmw_kms_add_active(dev_priv, &stdu->base, vfb); 438 - else 439 - vmw_kms_del_active(dev_priv, &stdu->base); 440 427 } 441 428 442 429 static void vmw_stdu_crtc_atomic_disable(struct drm_crtc *crtc, ··· 478 501 struct drm_modeset_acquire_ctx *ctx) 479 502 480 503 { 481 - struct vmw_private *dev_priv = vmw_priv(crtc->dev); 482 504 struct vmw_screen_target_display_unit *stdu = vmw_crtc_to_stdu(crtc); 483 505 int ret; 484 506 485 - if (!stdu->defined || !vmw_kms_crtc_flippable(dev_priv, crtc)) 507 + if (!stdu->defined) 486 508 return -EINVAL; 487 509 488 510 ret = drm_atomic_helper_page_flip(crtc, new_fb, event, flags, ctx); ··· 1022 1046 .dpms = vmw_du_connector_dpms, 1023 1047 .detect = vmw_du_connector_detect, 1024 1048 .fill_modes = vmw_du_connector_fill_modes, 1025 - .set_property = vmw_du_connector_set_property, 1026 1049 .destroy = vmw_stdu_connector_destroy, 1027 1050 .reset = vmw_du_connector_reset, 1028 1051 .atomic_duplicate_state = vmw_du_connector_duplicate_state, 1029 1052 .atomic_destroy_state = vmw_du_connector_destroy_state, 1030 - .atomic_set_property = vmw_du_connector_atomic_set_property, 1031 - .atomic_get_property = vmw_du_connector_atomic_get_property, 1032 1053 }; 1033 1054 1034 1055 ··· 1799 1826 stdu->base.pref_active = (unit == 0); 1800 1827 stdu->base.pref_width = dev_priv->initial_width; 1801 1828 stdu->base.pref_height = dev_priv->initial_height; 1802 - 1803 - /* 1804 - * Remove this after enabling atomic because property values can 1805 - * only exist in a state object 1806 - */ 1807 1829 stdu->base.is_implicit = false; 1808 1830 1809 1831 /* Initialize primary plane */ ··· 1844 1876 1845 1877 drm_connector_helper_add(connector, &vmw_stdu_connector_helper_funcs); 1846 1878 connector->status = vmw_du_connector_detect(connector, false); 1847 - vmw_connector_state_to_vcs(connector->state)->is_implicit = false; 1848 1879 1849 1880 ret = drm_encoder_init(dev, encoder, &vmw_stdu_encoder_funcs, 1850 1881 DRM_MODE_ENCODER_VIRTUAL, NULL); ··· 1881 1914 dev->mode_config.suggested_x_property, 0); 1882 1915 drm_object_attach_property(&connector->base, 1883 1916 dev->mode_config.suggested_y_property, 0); 1884 - if (dev_priv->implicit_placement_property) 1885 - drm_object_attach_property 1886 - (&connector->base, 1887 - dev_priv->implicit_placement_property, 1888 - stdu->base.is_implicit); 1889 1917 return 0; 1890 1918 1891 1919 err_free_unregister: ··· 1948 1986 return ret; 1949 1987 1950 1988 dev_priv->active_display_unit = vmw_du_screen_target; 1951 - 1952 - vmw_kms_create_implicit_placement_property(dev_priv, false); 1953 1989 1954 1990 for (i = 0; i < VMWGFX_NUM_DISPLAY_UNITS; ++i) { 1955 1991 ret = vmw_stdu_init(dev_priv, i);