]> asedeno.scripts.mit.edu Git - linux.git/blobdiff - drivers/gpu/drm/drm_writeback.c
drm: writeback: Add job prepare and cleanup operations
[linux.git] / drivers / gpu / drm / drm_writeback.c
index 1b497d3530b58ed6ec6e2e39da883058c2148d12..79ac014701c887cefd369d94e8317f7c3e04c586 100644 (file)
@@ -239,6 +239,43 @@ int drm_writeback_connector_init(struct drm_device *dev,
 }
 EXPORT_SYMBOL(drm_writeback_connector_init);
 
+int drm_writeback_set_fb(struct drm_connector_state *conn_state,
+                        struct drm_framebuffer *fb)
+{
+       WARN_ON(conn_state->connector->connector_type != DRM_MODE_CONNECTOR_WRITEBACK);
+
+       if (!conn_state->writeback_job) {
+               conn_state->writeback_job =
+                       kzalloc(sizeof(*conn_state->writeback_job), GFP_KERNEL);
+               if (!conn_state->writeback_job)
+                       return -ENOMEM;
+
+               conn_state->writeback_job->connector =
+                       drm_connector_to_writeback(conn_state->connector);
+       }
+
+       drm_framebuffer_assign(&conn_state->writeback_job->fb, fb);
+       return 0;
+}
+
+int drm_writeback_prepare_job(struct drm_writeback_job *job)
+{
+       struct drm_writeback_connector *connector = job->connector;
+       const struct drm_connector_helper_funcs *funcs =
+               connector->base.helper_private;
+       int ret;
+
+       if (funcs->prepare_writeback_job) {
+               ret = funcs->prepare_writeback_job(connector, job);
+               if (ret < 0)
+                       return ret;
+       }
+
+       job->prepared = true;
+       return 0;
+}
+EXPORT_SYMBOL(drm_writeback_prepare_job);
+
 /**
  * drm_writeback_queue_job - Queue a writeback job for later signalling
  * @wb_connector: The writeback connector to queue a job on
@@ -275,6 +312,13 @@ EXPORT_SYMBOL(drm_writeback_queue_job);
 
 void drm_writeback_cleanup_job(struct drm_writeback_job *job)
 {
+       struct drm_writeback_connector *connector = job->connector;
+       const struct drm_connector_helper_funcs *funcs =
+               connector->base.helper_private;
+
+       if (job->prepared && funcs->cleanup_writeback_job)
+               funcs->cleanup_writeback_job(connector, job);
+
        if (job->fb)
                drm_framebuffer_put(job->fb);