2017-03-29 17:42:32 +01: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>
struct drm_writeback_connector {
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 .
*/
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 17:42:33 +01: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 17:42:32 +01:00
} ;
struct drm_writeback_job {
/**
* @ 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
* directly , use drm_atomic_set_writeback_fb_for_connector ( )
*/
struct drm_framebuffer * fb ;
2017-03-29 17:42:33 +01:00
/**
* @ out_fence :
*
* Fence which will signal once the writeback has completed
*/
struct dma_fence * out_fence ;
2017-03-29 17:42:32 +01: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 ,
const u32 * formats , int n_formats ) ;
void drm_writeback_queue_job ( struct drm_writeback_connector * wb_connector ,
struct drm_writeback_job * job ) ;
void drm_writeback_cleanup_job ( struct drm_writeback_job * job ) ;
2017-03-29 17:42:33 +01: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 17:42:32 +01:00
# endif