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: sta...@vger.kernel.org
Cc: Keith Packard <kei...@keithp.com>
Signed-off-by: Daniel Vetter <daniel.vet...@intel.com>
---
 drivers/gpu/drm/drm_atomic_uapi.c   | 32 +++++++++++++++++++-------------
 drivers/gpu/drm/drm_crtc_internal.h |  1 +
 drivers/gpu/drm/drm_mode_object.c   |  5 +++--
 3 files changed, 23 insertions(+), 15 deletions(-)

diff --git a/drivers/gpu/drm/drm_atomic_uapi.c 
b/drivers/gpu/drm/drm_atomic_uapi.c
index 4eb81f10bc54..f0dbfeb00926 100644
--- a/drivers/gpu/drm/drm_atomic_uapi.c
+++ b/drivers/gpu/drm/drm_atomic_uapi.c
@@ -512,8 +512,8 @@ drm_atomic_crtc_get_property(struct drm_crtc *crtc,
 }
 
 static int drm_atomic_plane_set_property(struct drm_plane *plane,
-               struct drm_plane_state *state, struct drm_property *property,
-               uint64_t val)
+               struct drm_plane_state *state, struct drm_file *file_priv,
+               struct drm_property *property, uint64_t val)
 {
        struct drm_device *dev = plane->dev;
        struct drm_mode_config *config = &dev->mode_config;
@@ -521,7 +521,8 @@ static int drm_atomic_plane_set_property(struct drm_plane 
*plane,
        int ret;
 
        if (property == config->prop_fb_id) {
-               struct drm_framebuffer *fb = drm_framebuffer_lookup(dev, NULL, 
val);
+               struct drm_framebuffer *fb;
+               fb = drm_framebuffer_lookup(dev, file_priv, val);
                drm_atomic_set_fb_for_plane(state, fb);
                if (fb)
                        drm_framebuffer_put(fb);
@@ -537,7 +538,7 @@ static int drm_atomic_plane_set_property(struct drm_plane 
*plane,
                        return -EINVAL;
 
        } else if (property == config->prop_crtc_id) {
-               struct drm_crtc *crtc = drm_crtc_find(dev, NULL, val);
+               struct drm_crtc *crtc = drm_crtc_find(dev, file_priv, val);
                return drm_atomic_set_crtc_for_plane(state, crtc);
        } else if (property == config->prop_crtc_x) {
                state->crtc_x = U642I64(val);
@@ -681,14 +682,14 @@ static int drm_atomic_set_writeback_fb_for_connector(
 }
 
 static int drm_atomic_connector_set_property(struct drm_connector *connector,
-               struct drm_connector_state *state, struct drm_property 
*property,
-               uint64_t val)
+               struct drm_connector_state *state, struct drm_file *file_priv,
+               struct drm_property *property, uint64_t val)
 {
        struct drm_device *dev = connector->dev;
        struct drm_mode_config *config = &dev->mode_config;
 
        if (property == config->prop_crtc_id) {
-               struct drm_crtc *crtc = drm_crtc_find(dev, NULL, val);
+               struct drm_crtc *crtc = drm_crtc_find(dev, file_priv, val);
                return drm_atomic_set_crtc_for_connector(state, crtc);
        } else if (property == config->dpms_property) {
                /* setting DPMS property requires special handling, which
@@ -749,8 +750,10 @@ static int drm_atomic_connector_set_property(struct 
drm_connector *connector,
        } else if (property == connector->colorspace_property) {
                state->colorspace = val;
        } else if (property == config->writeback_fb_id_property) {
-               struct drm_framebuffer *fb = drm_framebuffer_lookup(dev, NULL, 
val);
-               int ret = drm_atomic_set_writeback_fb_for_connector(state, fb);
+               struct drm_framebuffer *fb;
+               int ret;
+               fb = drm_framebuffer_lookup(dev, file_priv, val);
+               ret = drm_atomic_set_writeback_fb_for_connector(state, fb);
                if (fb)
                        drm_framebuffer_put(fb);
                return ret;
@@ -947,6 +950,7 @@ int drm_atomic_connector_commit_dpms(struct 
drm_atomic_state *state,
 }
 
 int drm_atomic_set_property(struct drm_atomic_state *state,
+                           struct drm_file *file_priv,
                            struct drm_mode_object *obj,
                            struct drm_property *prop,
                            uint64_t prop_value)
@@ -969,7 +973,8 @@ int drm_atomic_set_property(struct drm_atomic_state *state,
                }
 
                ret = drm_atomic_connector_set_property(connector,
-                               connector_state, prop, prop_value);
+                               connector_state, file_priv,
+                               prop, prop_value);
                break;
        }
        case DRM_MODE_OBJECT_CRTC: {
@@ -997,7 +1002,8 @@ int drm_atomic_set_property(struct drm_atomic_state *state,
                }
 
                ret = drm_atomic_plane_set_property(plane,
-                               plane_state, prop, prop_value);
+                               plane_state, file_priv,
+                               prop, prop_value);
                break;
        }
        default:
@@ -1369,8 +1375,8 @@ int drm_mode_atomic_ioctl(struct drm_device *dev,
                                goto out;
                        }
 
-                       ret = drm_atomic_set_property(state, obj, prop,
-                                                     prop_value);
+                       ret = drm_atomic_set_property(state, file_priv,
+                                                     obj, prop, prop_value);
                        if (ret) {
                                drm_mode_object_put(obj);
                                goto out;
diff --git a/drivers/gpu/drm/drm_crtc_internal.h 
b/drivers/gpu/drm/drm_crtc_internal.h
index 216f2a9ee3d4..0719a235d6cc 100644
--- a/drivers/gpu/drm/drm_crtc_internal.h
+++ b/drivers/gpu/drm/drm_crtc_internal.h
@@ -214,6 +214,7 @@ int drm_atomic_connector_commit_dpms(struct 
drm_atomic_state *state,
                                     struct drm_connector *connector,
                                     int mode);
 int drm_atomic_set_property(struct drm_atomic_state *state,
+                           struct drm_file *file_priv,
                            struct drm_mode_object *obj,
                            struct drm_property *prop,
                            uint64_t prop_value);
diff --git a/drivers/gpu/drm/drm_mode_object.c 
b/drivers/gpu/drm/drm_mode_object.c
index a9005c1c2384..f32507e65b79 100644
--- a/drivers/gpu/drm/drm_mode_object.c
+++ b/drivers/gpu/drm/drm_mode_object.c
@@ -451,6 +451,7 @@ static int set_property_legacy(struct drm_mode_object *obj,
 }
 
 static int set_property_atomic(struct drm_mode_object *obj,
+                              struct drm_file *file_priv,
                               struct drm_property *prop,
                               uint64_t prop_value)
 {
@@ -477,7 +478,7 @@ static int set_property_atomic(struct drm_mode_object *obj,
                                                       obj_to_connector(obj),
                                                       prop_value);
        } else {
-               ret = drm_atomic_set_property(state, obj, prop, prop_value);
+               ret = drm_atomic_set_property(state, file_priv, obj, prop, 
prop_value);
                if (ret)
                        goto out;
                ret = drm_atomic_commit(state);
@@ -520,7 +521,7 @@ int drm_mode_obj_set_property_ioctl(struct drm_device *dev, 
void *data,
                goto out_unref;
 
        if (drm_drv_uses_atomic_modeset(property->dev))
-               ret = set_property_atomic(arg_obj, property, arg->value);
+               ret = set_property_atomic(arg_obj, file_priv, property, 
arg->value);
        else
                ret = set_property_legacy(arg_obj, property, arg->value);
 
-- 
2.14.4

_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel

Reply via email to