Back to home page

OSCL-LXR

 
 

    


0001 /* SPDX-License-Identifier: GPL-2.0 */
0002 /*
0003  * (C) COPYRIGHT 2016 ARM Limited. All rights reserved.
0004  * Author: Brian Starkey <brian.starkey@arm.com>
0005  *
0006  * This program is free software and is provided to you under the terms of the
0007  * GNU General Public License version 2 as published by the Free Software
0008  * Foundation, and any use by you of this program is subject to the terms
0009  * of such GNU licence.
0010  */
0011 
0012 #ifndef __DRM_WRITEBACK_H__
0013 #define __DRM_WRITEBACK_H__
0014 #include <drm/drm_connector.h>
0015 #include <drm/drm_encoder.h>
0016 #include <linux/workqueue.h>
0017 
0018 /**
0019  * struct drm_writeback_connector - DRM writeback connector
0020  */
0021 struct drm_writeback_connector {
0022     /**
0023      * @base: base drm_connector object
0024      */
0025     struct drm_connector base;
0026 
0027     /**
0028      * @encoder: Internal encoder used by the connector to fulfill
0029      * the DRM framework requirements. The users of the
0030      * @drm_writeback_connector control the behaviour of the @encoder
0031      * by passing the @enc_funcs parameter to drm_writeback_connector_init()
0032      * function.
0033      * For users of drm_writeback_connector_init_with_encoder(), this field
0034      * is not valid as the encoder is managed within their drivers.
0035      */
0036     struct drm_encoder encoder;
0037 
0038     /**
0039      * @pixel_formats_blob_ptr:
0040      *
0041      * DRM blob property data for the pixel formats list on writeback
0042      * connectors
0043      * See also drm_writeback_connector_init()
0044      */
0045     struct drm_property_blob *pixel_formats_blob_ptr;
0046 
0047     /** @job_lock: Protects job_queue */
0048     spinlock_t job_lock;
0049 
0050     /**
0051      * @job_queue:
0052      *
0053      * Holds a list of a connector's writeback jobs; the last item is the
0054      * most recent. The first item may be either waiting for the hardware
0055      * to begin writing, or currently being written.
0056      *
0057      * See also: drm_writeback_queue_job() and
0058      * drm_writeback_signal_completion()
0059      */
0060     struct list_head job_queue;
0061 
0062     /**
0063      * @fence_context:
0064      *
0065      * timeline context used for fence operations.
0066      */
0067     unsigned int fence_context;
0068     /**
0069      * @fence_lock:
0070      *
0071      * spinlock to protect the fences in the fence_context.
0072      */
0073     spinlock_t fence_lock;
0074     /**
0075      * @fence_seqno:
0076      *
0077      * Seqno variable used as monotonic counter for the fences
0078      * created on the connector's timeline.
0079      */
0080     unsigned long fence_seqno;
0081     /**
0082      * @timeline_name:
0083      *
0084      * The name of the connector's fence timeline.
0085      */
0086     char timeline_name[32];
0087 };
0088 
0089 /**
0090  * struct drm_writeback_job - DRM writeback job
0091  */
0092 struct drm_writeback_job {
0093     /**
0094      * @connector:
0095      *
0096      * Back-pointer to the writeback connector associated with the job
0097      */
0098     struct drm_writeback_connector *connector;
0099 
0100     /**
0101      * @prepared:
0102      *
0103      * Set when the job has been prepared with drm_writeback_prepare_job()
0104      */
0105     bool prepared;
0106 
0107     /**
0108      * @cleanup_work:
0109      *
0110      * Used to allow drm_writeback_signal_completion to defer dropping the
0111      * framebuffer reference to a workqueue
0112      */
0113     struct work_struct cleanup_work;
0114 
0115     /**
0116      * @list_entry:
0117      *
0118      * List item for the writeback connector's @job_queue
0119      */
0120     struct list_head list_entry;
0121 
0122     /**
0123      * @fb:
0124      *
0125      * Framebuffer to be written to by the writeback connector. Do not set
0126      * directly, use drm_writeback_set_fb()
0127      */
0128     struct drm_framebuffer *fb;
0129 
0130     /**
0131      * @out_fence:
0132      *
0133      * Fence which will signal once the writeback has completed
0134      */
0135     struct dma_fence *out_fence;
0136 
0137     /**
0138      * @priv:
0139      *
0140      * Driver-private data
0141      */
0142     void *priv;
0143 };
0144 
0145 static inline struct drm_writeback_connector *
0146 drm_connector_to_writeback(struct drm_connector *connector)
0147 {
0148     return container_of(connector, struct drm_writeback_connector, base);
0149 }
0150 
0151 int drm_writeback_connector_init(struct drm_device *dev,
0152                  struct drm_writeback_connector *wb_connector,
0153                  const struct drm_connector_funcs *con_funcs,
0154                  const struct drm_encoder_helper_funcs *enc_helper_funcs,
0155                  const u32 *formats, int n_formats,
0156                  u32 possible_crtcs);
0157 
0158 int drm_writeback_connector_init_with_encoder(struct drm_device *dev,
0159                 struct drm_writeback_connector *wb_connector,
0160                 struct drm_encoder *enc,
0161                 const struct drm_connector_funcs *con_funcs, const u32 *formats,
0162                 int n_formats);
0163 
0164 int drm_writeback_set_fb(struct drm_connector_state *conn_state,
0165              struct drm_framebuffer *fb);
0166 
0167 int drm_writeback_prepare_job(struct drm_writeback_job *job);
0168 
0169 void drm_writeback_queue_job(struct drm_writeback_connector *wb_connector,
0170                  struct drm_connector_state *conn_state);
0171 
0172 void drm_writeback_cleanup_job(struct drm_writeback_job *job);
0173 
0174 void
0175 drm_writeback_signal_completion(struct drm_writeback_connector *wb_connector,
0176                 int status);
0177 
0178 struct dma_fence *
0179 drm_writeback_get_out_fence(struct drm_writeback_connector *wb_connector);
0180 #endif