2017-03-29 19:42:32 +03:00
/* SPDX-License-Identifier: GPL-2.0 */
/*
* ( C ) COPYRIGHT 2016 ARM Limited . All rights reserved .
* Author : Brian Starkey < brian . starkey @ arm . com >
*
* This program is free software and is provided to you under the terms of the
* GNU General Public License version 2 as published by the Free Software
* Foundation , and any use by you of this program is subject to the terms
* of such GNU licence .
*/
# ifndef __DRM_WRITEBACK_H__
# define __DRM_WRITEBACK_H__
# include <drm/drm_connector.h>
# include <drm/drm_encoder.h>
# include <linux/workqueue.h>
2020-04-06 22:47:46 +03:00
/**
* struct drm_writeback_connector - DRM writeback connector
*/
2017-03-29 19:42:32 +03:00
struct drm_writeback_connector {
2020-04-06 22:47:46 +03:00
/**
* @ base : base drm_connector object
*/
2017-03-29 19:42:32 +03:00
struct drm_connector base ;
/**
* @ encoder : Internal encoder used by the connector to fulfill
* the DRM framework requirements . The users of the
* @ drm_writeback_connector control the behaviour of the @ encoder
* by passing the @ enc_funcs parameter to drm_writeback_connector_init ( )
* function .
2022-04-26 17:41:19 +03:00
* For users of drm_writeback_connector_init_with_encoder ( ) , this field
* is not valid as the encoder is managed within their drivers .
2017-03-29 19:42:32 +03:00
*/
struct drm_encoder encoder ;
/**
* @ pixel_formats_blob_ptr :
*
* DRM blob property data for the pixel formats list on writeback
* connectors
* See also drm_writeback_connector_init ( )
*/
struct drm_property_blob * pixel_formats_blob_ptr ;
/** @job_lock: Protects job_queue */
spinlock_t job_lock ;
/**
* @ job_queue :
*
* Holds a list of a connector ' s writeback jobs ; the last item is the
* most recent . The first item may be either waiting for the hardware
* to begin writing , or currently being written .
*
* See also : drm_writeback_queue_job ( ) and
* drm_writeback_signal_completion ( )
*/
struct list_head job_queue ;
2017-03-29 19:42:33 +03:00
/**
* @ fence_context :
*
* timeline context used for fence operations .
*/
unsigned int fence_context ;
/**
* @ fence_lock :
*
* spinlock to protect the fences in the fence_context .
*/
spinlock_t fence_lock ;
/**
* @ fence_seqno :
*
* Seqno variable used as monotonic counter for the fences
* created on the connector ' s timeline .
*/
unsigned long fence_seqno ;
/**
* @ timeline_name :
*
* The name of the connector ' s fence timeline .
*/
char timeline_name [ 32 ] ;
2017-03-29 19:42:32 +03:00
} ;
2020-04-06 22:47:46 +03:00
/**
* struct drm_writeback_job - DRM writeback job
*/
2017-03-29 19:42:32 +03:00
struct drm_writeback_job {
drm: writeback: Add job prepare and cleanup operations
As writeback jobs contain a framebuffer, drivers may need to prepare and
cleanup them the same way they can prepare and cleanup framebuffers for
planes. Add two new optional connector helper operations,
.prepare_writeback_job() and .cleanup_writeback_job() to support this.
The job prepare operation is called from
drm_atomic_helper_prepare_planes() to avoid a new atomic commit helper
that would need to be called by all drivers not using
drm_atomic_helper_commit(). The job cleanup operation is called from the
existing drm_writeback_cleanup_job() function, invoked both when
destroying the job as part of a aborted commit, or when the job
completes.
The drm_writeback_job structure is extended with a priv field to let
drivers store per-job data, such as mappings related to the writeback
framebuffer.
For internal plumbing reasons the drm_writeback_job structure needs to
store a back-pointer to the drm_writeback_connector. To avoid pushing
too much writeback-specific knowledge to drm_atomic_uapi.c, create a
drm_writeback_set_fb() function, move the writeback job setup code
there, and set the connector backpointer. The prepare_signaling()
function doesn't need to allocate writeback jobs and can ignore
connectors without a job, as it is called after the writeback jobs are
allocated to store framebuffers, and a writeback fence with a
framebuffer is an invalid configuration that gets rejected by the commit
check.
Signed-off-by: Laurent Pinchart <laurent.pinchart+renesas@ideasonboard.com>
Reviewed-by: Liviu Dudau <liviu.dudau@arm.com>
2019-02-21 04:01:38 +03:00
/**
* @ connector :
*
* Back - pointer to the writeback connector associated with the job
*/
struct drm_writeback_connector * connector ;
/**
* @ prepared :
*
* Set when the job has been prepared with drm_writeback_prepare_job ( )
*/
bool prepared ;
2017-03-29 19:42:32 +03:00
/**
* @ cleanup_work :
*
* Used to allow drm_writeback_signal_completion to defer dropping the
* framebuffer reference to a workqueue
*/
struct work_struct cleanup_work ;
/**
* @ list_entry :
*
* List item for the writeback connector ' s @ job_queue
*/
struct list_head list_entry ;
/**
* @ fb :
*
* Framebuffer to be written to by the writeback connector . Do not set
drm: writeback: Add job prepare and cleanup operations
As writeback jobs contain a framebuffer, drivers may need to prepare and
cleanup them the same way they can prepare and cleanup framebuffers for
planes. Add two new optional connector helper operations,
.prepare_writeback_job() and .cleanup_writeback_job() to support this.
The job prepare operation is called from
drm_atomic_helper_prepare_planes() to avoid a new atomic commit helper
that would need to be called by all drivers not using
drm_atomic_helper_commit(). The job cleanup operation is called from the
existing drm_writeback_cleanup_job() function, invoked both when
destroying the job as part of a aborted commit, or when the job
completes.
The drm_writeback_job structure is extended with a priv field to let
drivers store per-job data, such as mappings related to the writeback
framebuffer.
For internal plumbing reasons the drm_writeback_job structure needs to
store a back-pointer to the drm_writeback_connector. To avoid pushing
too much writeback-specific knowledge to drm_atomic_uapi.c, create a
drm_writeback_set_fb() function, move the writeback job setup code
there, and set the connector backpointer. The prepare_signaling()
function doesn't need to allocate writeback jobs and can ignore
connectors without a job, as it is called after the writeback jobs are
allocated to store framebuffers, and a writeback fence with a
framebuffer is an invalid configuration that gets rejected by the commit
check.
Signed-off-by: Laurent Pinchart <laurent.pinchart+renesas@ideasonboard.com>
Reviewed-by: Liviu Dudau <liviu.dudau@arm.com>
2019-02-21 04:01:38 +03:00
* directly , use drm_writeback_set_fb ( )
2017-03-29 19:42:32 +03:00
*/
struct drm_framebuffer * fb ;
2017-03-29 19:42:33 +03:00
/**
* @ out_fence :
*
* Fence which will signal once the writeback has completed
*/
struct dma_fence * out_fence ;
drm: writeback: Add job prepare and cleanup operations
As writeback jobs contain a framebuffer, drivers may need to prepare and
cleanup them the same way they can prepare and cleanup framebuffers for
planes. Add two new optional connector helper operations,
.prepare_writeback_job() and .cleanup_writeback_job() to support this.
The job prepare operation is called from
drm_atomic_helper_prepare_planes() to avoid a new atomic commit helper
that would need to be called by all drivers not using
drm_atomic_helper_commit(). The job cleanup operation is called from the
existing drm_writeback_cleanup_job() function, invoked both when
destroying the job as part of a aborted commit, or when the job
completes.
The drm_writeback_job structure is extended with a priv field to let
drivers store per-job data, such as mappings related to the writeback
framebuffer.
For internal plumbing reasons the drm_writeback_job structure needs to
store a back-pointer to the drm_writeback_connector. To avoid pushing
too much writeback-specific knowledge to drm_atomic_uapi.c, create a
drm_writeback_set_fb() function, move the writeback job setup code
there, and set the connector backpointer. The prepare_signaling()
function doesn't need to allocate writeback jobs and can ignore
connectors without a job, as it is called after the writeback jobs are
allocated to store framebuffers, and a writeback fence with a
framebuffer is an invalid configuration that gets rejected by the commit
check.
Signed-off-by: Laurent Pinchart <laurent.pinchart+renesas@ideasonboard.com>
Reviewed-by: Liviu Dudau <liviu.dudau@arm.com>
2019-02-21 04:01:38 +03:00
/**
* @ priv :
*
* Driver - private data
*/
void * priv ;
2017-03-29 19:42:32 +03:00
} ;
2018-07-03 10:50:15 +03:00
static inline struct drm_writeback_connector *
drm_connector_to_writeback ( struct drm_connector * connector )
{
return container_of ( connector , struct drm_writeback_connector , base ) ;
}
2017-03-29 19:42:32 +03:00
int drm_writeback_connector_init ( struct drm_device * dev ,
struct drm_writeback_connector * wb_connector ,
const struct drm_connector_funcs * con_funcs ,
const struct drm_encoder_helper_funcs * enc_helper_funcs ,
2022-04-26 17:41:18 +03:00
const u32 * formats , int n_formats ,
u32 possible_crtcs ) ;
2017-03-29 19:42:32 +03:00
2022-04-26 17:41:19 +03:00
int drm_writeback_connector_init_with_encoder ( struct drm_device * dev ,
struct drm_writeback_connector * wb_connector ,
struct drm_encoder * enc ,
const struct drm_connector_funcs * con_funcs , const u32 * formats ,
int n_formats ) ;
drm: writeback: Add job prepare and cleanup operations
As writeback jobs contain a framebuffer, drivers may need to prepare and
cleanup them the same way they can prepare and cleanup framebuffers for
planes. Add two new optional connector helper operations,
.prepare_writeback_job() and .cleanup_writeback_job() to support this.
The job prepare operation is called from
drm_atomic_helper_prepare_planes() to avoid a new atomic commit helper
that would need to be called by all drivers not using
drm_atomic_helper_commit(). The job cleanup operation is called from the
existing drm_writeback_cleanup_job() function, invoked both when
destroying the job as part of a aborted commit, or when the job
completes.
The drm_writeback_job structure is extended with a priv field to let
drivers store per-job data, such as mappings related to the writeback
framebuffer.
For internal plumbing reasons the drm_writeback_job structure needs to
store a back-pointer to the drm_writeback_connector. To avoid pushing
too much writeback-specific knowledge to drm_atomic_uapi.c, create a
drm_writeback_set_fb() function, move the writeback job setup code
there, and set the connector backpointer. The prepare_signaling()
function doesn't need to allocate writeback jobs and can ignore
connectors without a job, as it is called after the writeback jobs are
allocated to store framebuffers, and a writeback fence with a
framebuffer is an invalid configuration that gets rejected by the commit
check.
Signed-off-by: Laurent Pinchart <laurent.pinchart+renesas@ideasonboard.com>
Reviewed-by: Liviu Dudau <liviu.dudau@arm.com>
2019-02-21 04:01:38 +03:00
int drm_writeback_set_fb ( struct drm_connector_state * conn_state ,
struct drm_framebuffer * fb ) ;
int drm_writeback_prepare_job ( struct drm_writeback_job * job ) ;
2017-03-29 19:42:32 +03:00
void drm_writeback_queue_job ( struct drm_writeback_connector * wb_connector ,
2019-02-21 13:17:32 +03:00
struct drm_connector_state * conn_state ) ;
2017-03-29 19:42:32 +03:00
void drm_writeback_cleanup_job ( struct drm_writeback_job * job ) ;
2017-03-29 19:42:33 +03:00
void
drm_writeback_signal_completion ( struct drm_writeback_connector * wb_connector ,
int status ) ;
struct dma_fence *
drm_writeback_get_out_fence ( struct drm_writeback_connector * wb_connector ) ;
2017-03-29 19:42:32 +03:00
# endif