Commit 97eb9eae authored by Laurent Pinchart's avatar Laurent Pinchart

drm: writeback: Cleanup job ownership handling when queuing job

The drm_writeback_queue_job() function takes ownership of the passed job
and requires the caller to manually set the connector state
writeback_job pointer to NULL. To simplify drivers and avoid errors
(such as the missing NULL set in the vc4 driver), pass the connector
state pointer to the function instead of the job pointer, and set the
writeback_job pointer to NULL internally.
Signed-off-by: default avatarLaurent Pinchart <laurent.pinchart+renesas@ideasonboard.com>
Reviewed-by: default avatarBrian Starkey <brian.starkey@arm.com>
Acked-by: default avatarEric Anholt <eric@anholt.net>
Acked-by: default avatarLiviu Dudau <liviu.dudau@arm.com>
Reviewed-by: default avatarKieran Bingham <kieran.bingham+renesas@ideasonboard.com>
parent a63722ae
...@@ -252,8 +252,7 @@ void malidp_mw_atomic_commit(struct drm_device *drm, ...@@ -252,8 +252,7 @@ void malidp_mw_atomic_commit(struct drm_device *drm,
&mw_state->addrs[0], &mw_state->addrs[0],
mw_state->format); mw_state->format);
drm_writeback_queue_job(mw_conn, conn_state->writeback_job); drm_writeback_queue_job(mw_conn, conn_state);
conn_state->writeback_job = NULL;
hwdev->hw->enable_memwrite(hwdev, mw_state->addrs, hwdev->hw->enable_memwrite(hwdev, mw_state->addrs,
mw_state->pitches, mw_state->n_planes, mw_state->pitches, mw_state->n_planes,
fb->width, fb->height, mw_state->format, fb->width, fb->height, mw_state->format,
......
...@@ -242,11 +242,12 @@ EXPORT_SYMBOL(drm_writeback_connector_init); ...@@ -242,11 +242,12 @@ EXPORT_SYMBOL(drm_writeback_connector_init);
/** /**
* drm_writeback_queue_job - Queue a writeback job for later signalling * drm_writeback_queue_job - Queue a writeback job for later signalling
* @wb_connector: The writeback connector to queue a job on * @wb_connector: The writeback connector to queue a job on
* @job: The job to queue * @conn_state: The connector state containing the job to queue
* *
* This function adds a job to the job_queue for a writeback connector. It * This function adds the job contained in @conn_state to the job_queue for a
* should be considered to take ownership of the writeback job, and so any other * writeback connector. It takes ownership of the writeback job and sets the
* references to the job must be cleared after calling this function. * @conn_state->writeback_job to NULL, and so no access to the job may be
* performed by the caller after this function returns.
* *
* Drivers must ensure that for a given writeback connector, jobs are queued in * Drivers must ensure that for a given writeback connector, jobs are queued in
* exactly the same order as they will be completed by the hardware (and * exactly the same order as they will be completed by the hardware (and
...@@ -258,10 +259,14 @@ EXPORT_SYMBOL(drm_writeback_connector_init); ...@@ -258,10 +259,14 @@ EXPORT_SYMBOL(drm_writeback_connector_init);
* See also: drm_writeback_signal_completion() * See also: drm_writeback_signal_completion()
*/ */
void drm_writeback_queue_job(struct drm_writeback_connector *wb_connector, void drm_writeback_queue_job(struct drm_writeback_connector *wb_connector,
struct drm_writeback_job *job) struct drm_connector_state *conn_state)
{ {
struct drm_writeback_job *job;
unsigned long flags; unsigned long flags;
job = conn_state->writeback_job;
conn_state->writeback_job = NULL;
spin_lock_irqsave(&wb_connector->job_lock, flags); spin_lock_irqsave(&wb_connector->job_lock, flags);
list_add_tail(&job->list_entry, &wb_connector->job_queue); list_add_tail(&job->list_entry, &wb_connector->job_queue);
spin_unlock_irqrestore(&wb_connector->job_lock, flags); spin_unlock_irqrestore(&wb_connector->job_lock, flags);
......
...@@ -327,7 +327,7 @@ static void vc4_txp_connector_atomic_commit(struct drm_connector *conn, ...@@ -327,7 +327,7 @@ static void vc4_txp_connector_atomic_commit(struct drm_connector *conn,
TXP_WRITE(TXP_DST_CTRL, ctrl); TXP_WRITE(TXP_DST_CTRL, ctrl);
drm_writeback_queue_job(&txp->connector, conn_state->writeback_job); drm_writeback_queue_job(&txp->connector, conn_state);
} }
static const struct drm_connector_helper_funcs vc4_txp_connector_helper_funcs = { static const struct drm_connector_helper_funcs vc4_txp_connector_helper_funcs = {
......
...@@ -123,7 +123,7 @@ int drm_writeback_connector_init(struct drm_device *dev, ...@@ -123,7 +123,7 @@ int drm_writeback_connector_init(struct drm_device *dev,
const u32 *formats, int n_formats); const u32 *formats, int n_formats);
void drm_writeback_queue_job(struct drm_writeback_connector *wb_connector, void drm_writeback_queue_job(struct drm_writeback_connector *wb_connector,
struct drm_writeback_job *job); struct drm_connector_state *conn_state);
void drm_writeback_cleanup_job(struct drm_writeback_job *job); void drm_writeback_cleanup_job(struct drm_writeback_job *job);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment