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

drm/atomic: Wire file_priv through for property changes

We need this to make sure lessees can only connect their
plane/connectors to crtc objects they own. And note that this is
irrespective of whether the lessor is atomic or not, lessor cannot
prevent lessees from enabling atomic.

Cc: stable@vger.kernel.org
Cc: Keith Packard <keithp@keithp.com>
Reviewed-by: Dave Airlie <airlied@redhat.com>
Signed-off-by: Daniel Vetter <daniel.vetter@intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20190228144910.26488-7-daniel.vetter@ffwll.ch

+23 -15
+19 -13
drivers/gpu/drm/drm_atomic_uapi.c
··· 512 512 } 513 513 514 514 static int drm_atomic_plane_set_property(struct drm_plane *plane, 515 - struct drm_plane_state *state, struct drm_property *property, 516 - uint64_t val) 515 + struct drm_plane_state *state, struct drm_file *file_priv, 516 + struct drm_property *property, uint64_t val) 517 517 { 518 518 struct drm_device *dev = plane->dev; 519 519 struct drm_mode_config *config = &dev->mode_config; ··· 521 521 int ret; 522 522 523 523 if (property == config->prop_fb_id) { 524 - struct drm_framebuffer *fb = drm_framebuffer_lookup(dev, NULL, val); 524 + struct drm_framebuffer *fb; 525 + fb = drm_framebuffer_lookup(dev, file_priv, val); 525 526 drm_atomic_set_fb_for_plane(state, fb); 526 527 if (fb) 527 528 drm_framebuffer_put(fb); ··· 538 537 return -EINVAL; 539 538 540 539 } else if (property == config->prop_crtc_id) { 541 - struct drm_crtc *crtc = drm_crtc_find(dev, NULL, val); 540 + struct drm_crtc *crtc = drm_crtc_find(dev, file_priv, val); 542 541 return drm_atomic_set_crtc_for_plane(state, crtc); 543 542 } else if (property == config->prop_crtc_x) { 544 543 state->crtc_x = U642I64(val); ··· 669 668 } 670 669 671 670 static int drm_atomic_connector_set_property(struct drm_connector *connector, 672 - struct drm_connector_state *state, struct drm_property *property, 673 - uint64_t val) 671 + struct drm_connector_state *state, struct drm_file *file_priv, 672 + struct drm_property *property, uint64_t val) 674 673 { 675 674 struct drm_device *dev = connector->dev; 676 675 struct drm_mode_config *config = &dev->mode_config; 677 676 678 677 if (property == config->prop_crtc_id) { 679 - struct drm_crtc *crtc = drm_crtc_find(dev, NULL, val); 678 + struct drm_crtc *crtc = drm_crtc_find(dev, file_priv, val); 680 679 return drm_atomic_set_crtc_for_connector(state, crtc); 681 680 } else if (property == config->dpms_property) { 682 681 /* setting DPMS property requires special handling, which ··· 737 736 } else if (property == connector->colorspace_property) { 738 737 state->colorspace = val; 739 738 } else if (property == config->writeback_fb_id_property) { 740 - struct drm_framebuffer *fb = drm_framebuffer_lookup(dev, NULL, val); 741 - int ret = drm_atomic_set_writeback_fb_for_connector(state, fb); 739 + struct drm_framebuffer *fb; 740 + int ret; 741 + fb = drm_framebuffer_lookup(dev, file_priv, val); 742 + ret = drm_atomic_set_writeback_fb_for_connector(state, fb); 742 743 if (fb) 743 744 drm_framebuffer_put(fb); 744 745 return ret; ··· 937 934 } 938 935 939 936 int drm_atomic_set_property(struct drm_atomic_state *state, 937 + struct drm_file *file_priv, 940 938 struct drm_mode_object *obj, 941 939 struct drm_property *prop, 942 940 uint64_t prop_value) ··· 960 956 } 961 957 962 958 ret = drm_atomic_connector_set_property(connector, 963 - connector_state, prop, prop_value); 959 + connector_state, file_priv, 960 + prop, prop_value); 964 961 break; 965 962 } 966 963 case DRM_MODE_OBJECT_CRTC: { ··· 989 984 } 990 985 991 986 ret = drm_atomic_plane_set_property(plane, 992 - plane_state, prop, prop_value); 987 + plane_state, file_priv, 988 + prop, prop_value); 993 989 break; 994 990 } 995 991 default: ··· 1360 1354 goto out; 1361 1355 } 1362 1356 1363 - ret = drm_atomic_set_property(state, obj, prop, 1364 - prop_value); 1357 + ret = drm_atomic_set_property(state, file_priv, 1358 + obj, prop, prop_value); 1365 1359 if (ret) { 1366 1360 drm_mode_object_put(obj); 1367 1361 goto out;
+1
drivers/gpu/drm/drm_crtc_internal.h
··· 214 214 struct drm_connector *connector, 215 215 int mode); 216 216 int drm_atomic_set_property(struct drm_atomic_state *state, 217 + struct drm_file *file_priv, 217 218 struct drm_mode_object *obj, 218 219 struct drm_property *prop, 219 220 uint64_t prop_value);
+3 -2
drivers/gpu/drm/drm_mode_object.c
··· 451 451 } 452 452 453 453 static int set_property_atomic(struct drm_mode_object *obj, 454 + struct drm_file *file_priv, 454 455 struct drm_property *prop, 455 456 uint64_t prop_value) 456 457 { ··· 478 477 obj_to_connector(obj), 479 478 prop_value); 480 479 } else { 481 - ret = drm_atomic_set_property(state, obj, prop, prop_value); 480 + ret = drm_atomic_set_property(state, file_priv, obj, prop, prop_value); 482 481 if (ret) 483 482 goto out; 484 483 ret = drm_atomic_commit(state); ··· 521 520 goto out_unref; 522 521 523 522 if (drm_drv_uses_atomic_modeset(property->dev)) 524 - ret = set_property_atomic(arg_obj, property, arg->value); 523 + ret = set_property_atomic(arg_obj, file_priv, property, arg->value); 525 524 else 526 525 ret = set_property_legacy(arg_obj, property, arg->value); 527 526