]> git.karo-electronics.de Git - karo-tx-linux.git/blobdiff - drivers/gpu/drm/drm_atomic.c
Merge tag 'powerpc-4.12-1' of git://git.kernel.org/pub/scm/linux/kernel/git/powerpc...
[karo-tx-linux.git] / drivers / gpu / drm / drm_atomic.c
index 39e470eb8aeaf9e36469c6a8afe5c36c2a68890b..f32506a7c1d61e91494e47f6a731fddaf1cc991c 100644 (file)
@@ -150,7 +150,7 @@ void drm_atomic_state_default_clear(struct drm_atomic_state *state)
                                                       state->connectors[i].state);
                state->connectors[i].ptr = NULL;
                state->connectors[i].state = NULL;
-               drm_connector_unreference(connector);
+               drm_connector_put(connector);
        }
 
        for (i = 0; i < config->num_crtc; i++) {
@@ -324,7 +324,7 @@ int drm_atomic_set_mode_for_crtc(struct drm_crtc_state *state,
        if (mode && memcmp(&state->mode, mode, sizeof(*mode)) == 0)
                return 0;
 
-       drm_property_unreference_blob(state->mode_blob);
+       drm_property_blob_put(state->mode_blob);
        state->mode_blob = NULL;
 
        if (mode) {
@@ -370,7 +370,7 @@ int drm_atomic_set_mode_prop_for_crtc(struct drm_crtc_state *state,
        if (blob == state->mode_blob)
                return 0;
 
-       drm_property_unreference_blob(state->mode_blob);
+       drm_property_blob_put(state->mode_blob);
        state->mode_blob = NULL;
 
        memset(&state->mode, 0, sizeof(state->mode));
@@ -382,7 +382,7 @@ int drm_atomic_set_mode_prop_for_crtc(struct drm_crtc_state *state,
                                            blob->data))
                        return -EINVAL;
 
-               state->mode_blob = drm_property_reference_blob(blob);
+               state->mode_blob = drm_property_blob_get(blob);
                state->enable = true;
                DRM_DEBUG_ATOMIC("Set [MODE:%s] for CRTC state %p\n",
                                 state->mode.name, state);
@@ -415,9 +415,9 @@ drm_atomic_replace_property_blob(struct drm_property_blob **blob,
        if (old_blob == new_blob)
                return;
 
-       drm_property_unreference_blob(old_blob);
+       drm_property_blob_put(old_blob);
        if (new_blob)
-               drm_property_reference_blob(new_blob);
+               drm_property_blob_get(new_blob);
        *blob = new_blob;
        *replaced = true;
 
@@ -439,13 +439,13 @@ drm_atomic_replace_property_blob_from_id(struct drm_crtc *crtc,
                        return -EINVAL;
 
                if (expected_size > 0 && expected_size != new_blob->length) {
-                       drm_property_unreference_blob(new_blob);
+                       drm_property_blob_put(new_blob);
                        return -EINVAL;
                }
        }
 
        drm_atomic_replace_property_blob(blob, new_blob, replaced);
-       drm_property_unreference_blob(new_blob);
+       drm_property_blob_put(new_blob);
 
        return 0;
 }
@@ -480,7 +480,7 @@ int drm_atomic_crtc_set_property(struct drm_crtc *crtc,
                struct drm_property_blob *mode =
                        drm_property_lookup_blob(dev, val);
                ret = drm_atomic_set_mode_prop_for_crtc(state, mode);
-               drm_property_unreference_blob(mode);
+               drm_property_blob_put(mode);
                return ret;
        } else if (property == config->degamma_lut_property) {
                ret = drm_atomic_replace_property_blob_from_id(crtc,
@@ -737,7 +737,7 @@ int drm_atomic_plane_set_property(struct drm_plane *plane,
                struct drm_framebuffer *fb = drm_framebuffer_lookup(dev, val);
                drm_atomic_set_fb_for_plane(state, fb);
                if (fb)
-                       drm_framebuffer_unreference(fb);
+                       drm_framebuffer_put(fb);
        } else if (property == config->prop_in_fence_fd) {
                if (state->fence)
                        return -EINVAL;
@@ -1030,7 +1030,7 @@ drm_atomic_get_connector_state(struct drm_atomic_state *state,
        if (!connector_state)
                return ERR_PTR(-ENOMEM);
 
-       drm_connector_reference(connector);
+       drm_connector_get(connector);
        state->connectors[index].state = connector_state;
        state->connectors[index].old_state = connector->state;
        state->connectors[index].new_state = connector_state;
@@ -1374,13 +1374,13 @@ drm_atomic_set_crtc_for_connector(struct drm_connector_state *conn_state,
                return 0;
 
        if (conn_state->crtc) {
-               crtc_state = drm_atomic_get_existing_crtc_state(conn_state->state,
-                                                               conn_state->crtc);
+               crtc_state = drm_atomic_get_new_crtc_state(conn_state->state,
+                                                          conn_state->crtc);
 
                crtc_state->connector_mask &=
                        ~(1 << drm_connector_index(conn_state->connector));
 
-               drm_connector_unreference(conn_state->connector);
+               drm_connector_put(conn_state->connector);
                conn_state->crtc = NULL;
        }
 
@@ -1392,7 +1392,7 @@ drm_atomic_set_crtc_for_connector(struct drm_connector_state *conn_state,
                crtc_state->connector_mask |=
                        1 << drm_connector_index(conn_state->connector);
 
-               drm_connector_reference(conn_state->connector);
+               drm_connector_get(conn_state->connector);
                conn_state->crtc = crtc;
 
                DRM_DEBUG_ATOMIC("Link connector state %p to [CRTC:%d:%s]\n",
@@ -1449,18 +1449,18 @@ drm_atomic_add_affected_connectors(struct drm_atomic_state *state,
         * Changed connectors are already in @state, so only need to look
         * at the connector_mask in crtc_state.
         */
-       drm_connector_list_iter_get(state->dev, &conn_iter);
+       drm_connector_list_iter_begin(state->dev, &conn_iter);
        drm_for_each_connector_iter(connector, &conn_iter) {
                if (!(crtc_state->connector_mask & (1 << drm_connector_index(connector))))
                        continue;
 
                conn_state = drm_atomic_get_connector_state(state, connector);
                if (IS_ERR(conn_state)) {
-                       drm_connector_list_iter_put(&conn_iter);
+                       drm_connector_list_iter_end(&conn_iter);
                        return PTR_ERR(conn_state);
                }
        }
-       drm_connector_list_iter_put(&conn_iter);
+       drm_connector_list_iter_end(&conn_iter);
 
        return 0;
 }
@@ -1492,7 +1492,7 @@ drm_atomic_add_affected_planes(struct drm_atomic_state *state,
 {
        struct drm_plane *plane;
 
-       WARN_ON(!drm_atomic_get_existing_crtc_state(state, crtc));
+       WARN_ON(!drm_atomic_get_new_crtc_state(state, crtc));
 
        drm_for_each_plane_mask(plane, state->dev, crtc->state->plane_mask) {
                struct drm_plane_state *plane_state =
@@ -1516,19 +1516,9 @@ EXPORT_SYMBOL(drm_atomic_add_affected_planes);
 void drm_atomic_legacy_backoff(struct drm_atomic_state *state)
 {
        struct drm_device *dev = state->dev;
-       unsigned crtc_mask = 0;
-       struct drm_crtc *crtc;
        int ret;
        bool global = false;
 
-       drm_for_each_crtc(crtc, dev) {
-               if (crtc->acquire_ctx != state->acquire_ctx)
-                       continue;
-
-               crtc_mask |= drm_crtc_mask(crtc);
-               crtc->acquire_ctx = NULL;
-       }
-
        if (WARN_ON(dev->mode_config.acquire_ctx == state->acquire_ctx)) {
                global = true;
 
@@ -1542,10 +1532,6 @@ retry:
        if (ret)
                goto retry;
 
-       drm_for_each_crtc(crtc, dev)
-               if (drm_crtc_mask(crtc) & crtc_mask)
-                       crtc->acquire_ctx = state->acquire_ctx;
-
        if (global)
                dev->mode_config.acquire_ctx = state->acquire_ctx;
 }
@@ -1690,6 +1676,44 @@ static void drm_atomic_print_state(const struct drm_atomic_state *state)
                drm_atomic_connector_print_state(&p, connector_state);
 }
 
+static void __drm_state_dump(struct drm_device *dev, struct drm_printer *p,
+                            bool take_locks)
+{
+       struct drm_mode_config *config = &dev->mode_config;
+       struct drm_plane *plane;
+       struct drm_crtc *crtc;
+       struct drm_connector *connector;
+       struct drm_connector_list_iter conn_iter;
+
+       if (!drm_core_check_feature(dev, DRIVER_ATOMIC))
+               return;
+
+       list_for_each_entry(plane, &config->plane_list, head) {
+               if (take_locks)
+                       drm_modeset_lock(&plane->mutex, NULL);
+               drm_atomic_plane_print_state(p, plane->state);
+               if (take_locks)
+                       drm_modeset_unlock(&plane->mutex);
+       }
+
+       list_for_each_entry(crtc, &config->crtc_list, head) {
+               if (take_locks)
+                       drm_modeset_lock(&crtc->mutex, NULL);
+               drm_atomic_crtc_print_state(p, crtc->state);
+               if (take_locks)
+                       drm_modeset_unlock(&crtc->mutex);
+       }
+
+       drm_connector_list_iter_begin(dev, &conn_iter);
+       if (take_locks)
+               drm_modeset_lock(&dev->mode_config.connection_mutex, NULL);
+       drm_for_each_connector_iter(connector, &conn_iter)
+               drm_atomic_connector_print_state(p, connector->state);
+       if (take_locks)
+               drm_modeset_unlock(&dev->mode_config.connection_mutex);
+       drm_connector_list_iter_end(&conn_iter);
+}
+
 /**
  * drm_state_dump - dump entire device atomic state
  * @dev: the drm device
@@ -1707,25 +1731,7 @@ static void drm_atomic_print_state(const struct drm_atomic_state *state)
  */
 void drm_state_dump(struct drm_device *dev, struct drm_printer *p)
 {
-       struct drm_mode_config *config = &dev->mode_config;
-       struct drm_plane *plane;
-       struct drm_crtc *crtc;
-       struct drm_connector *connector;
-       struct drm_connector_list_iter conn_iter;
-
-       if (!drm_core_check_feature(dev, DRIVER_ATOMIC))
-               return;
-
-       list_for_each_entry(plane, &config->plane_list, head)
-               drm_atomic_plane_print_state(p, plane->state);
-
-       list_for_each_entry(crtc, &config->crtc_list, head)
-               drm_atomic_crtc_print_state(p, crtc->state);
-
-       drm_connector_list_iter_get(dev, &conn_iter);
-       drm_for_each_connector_iter(connector, &conn_iter)
-               drm_atomic_connector_print_state(p, connector->state);
-       drm_connector_list_iter_put(&conn_iter);
+       __drm_state_dump(dev, p, false);
 }
 EXPORT_SYMBOL(drm_state_dump);
 
@@ -1736,9 +1742,7 @@ static int drm_state_info(struct seq_file *m, void *data)
        struct drm_device *dev = node->minor->dev;
        struct drm_printer p = drm_seq_file_printer(m);
 
-       drm_modeset_lock_all(dev);
-       drm_state_dump(dev, &p);
-       drm_modeset_unlock_all(dev);
+       __drm_state_dump(dev, &p, true);
 
        return 0;
 }
@@ -1865,12 +1869,12 @@ void drm_atomic_clean_old_fb(struct drm_device *dev,
                if (ret == 0) {
                        struct drm_framebuffer *new_fb = plane->state->fb;
                        if (new_fb)
-                               drm_framebuffer_reference(new_fb);
+                               drm_framebuffer_get(new_fb);
                        plane->fb = new_fb;
                        plane->crtc = plane->state->crtc;
 
                        if (plane->old_fb)
-                               drm_framebuffer_unreference(plane->old_fb);
+                               drm_framebuffer_put(plane->old_fb);
                }
                plane->old_fb = NULL;
        }
@@ -2077,94 +2081,6 @@ static void complete_crtc_signaling(struct drm_device *dev,
        kfree(fence_state);
 }
 
-int drm_atomic_remove_fb(struct drm_framebuffer *fb)
-{
-       struct drm_modeset_acquire_ctx ctx;
-       struct drm_device *dev = fb->dev;
-       struct drm_atomic_state *state;
-       struct drm_plane *plane;
-       struct drm_connector *conn;
-       struct drm_connector_state *conn_state;
-       int i, ret = 0;
-       unsigned plane_mask;
-
-       state = drm_atomic_state_alloc(dev);
-       if (!state)
-               return -ENOMEM;
-
-       drm_modeset_acquire_init(&ctx, 0);
-       state->acquire_ctx = &ctx;
-
-retry:
-       plane_mask = 0;
-       ret = drm_modeset_lock_all_ctx(dev, &ctx);
-       if (ret)
-               goto unlock;
-
-       drm_for_each_plane(plane, dev) {
-               struct drm_plane_state *plane_state;
-
-               if (plane->state->fb != fb)
-                       continue;
-
-               plane_state = drm_atomic_get_plane_state(state, plane);
-               if (IS_ERR(plane_state)) {
-                       ret = PTR_ERR(plane_state);
-                       goto unlock;
-               }
-
-               if (plane_state->crtc->primary == plane) {
-                       struct drm_crtc_state *crtc_state;
-
-                       crtc_state = drm_atomic_get_existing_crtc_state(state, plane_state->crtc);
-
-                       ret = drm_atomic_add_affected_connectors(state, plane_state->crtc);
-                       if (ret)
-                               goto unlock;
-
-                       crtc_state->active = false;
-                       ret = drm_atomic_set_mode_for_crtc(crtc_state, NULL);
-                       if (ret)
-                               goto unlock;
-               }
-
-               drm_atomic_set_fb_for_plane(plane_state, NULL);
-               ret = drm_atomic_set_crtc_for_plane(plane_state, NULL);
-               if (ret)
-                       goto unlock;
-
-               plane_mask |= BIT(drm_plane_index(plane));
-
-               plane->old_fb = plane->fb;
-       }
-
-       for_each_connector_in_state(state, conn, conn_state, i) {
-               ret = drm_atomic_set_crtc_for_connector(conn_state, NULL);
-
-               if (ret)
-                       goto unlock;
-       }
-
-       if (plane_mask)
-               ret = drm_atomic_commit(state);
-
-unlock:
-       if (plane_mask)
-               drm_atomic_clean_old_fb(dev, plane_mask, ret);
-
-       if (ret == -EDEADLK) {
-               drm_modeset_backoff(&ctx);
-               goto retry;
-       }
-
-       drm_atomic_state_put(state);
-
-       drm_modeset_drop_locks(&ctx);
-       drm_modeset_acquire_fini(&ctx);
-
-       return ret;
-}
-
 int drm_mode_atomic_ioctl(struct drm_device *dev,
                          void *data, struct drm_file *file_priv)
 {