linux/include/drm/drm_writeback.h
<<
>>
Prefs
   1/* SPDX-License-Identifier: GPL-2.0 */
   2/*
   3 * (C) COPYRIGHT 2016 ARM Limited. All rights reserved.
   4 * Author: Brian Starkey <brian.starkey@arm.com>
   5 *
   6 * This program is free software and is provided to you under the terms of the
   7 * GNU General Public License version 2 as published by the Free Software
   8 * Foundation, and any use by you of this program is subject to the terms
   9 * of such GNU licence.
  10 */
  11
  12#ifndef __DRM_WRITEBACK_H__
  13#define __DRM_WRITEBACK_H__
  14#include <drm/drm_connector.h>
  15#include <drm/drm_encoder.h>
  16#include <linux/workqueue.h>
  17
  18/**
  19 * struct drm_writeback_connector - DRM writeback connector
  20 */
  21struct drm_writeback_connector {
  22        /**
  23         * @base: base drm_connector object
  24         */
  25        struct drm_connector base;
  26
  27        /**
  28         * @encoder: Internal encoder used by the connector to fulfill
  29         * the DRM framework requirements. The users of the
  30         * @drm_writeback_connector control the behaviour of the @encoder
  31         * by passing the @enc_funcs parameter to drm_writeback_connector_init()
  32         * function.
  33         */
  34        struct drm_encoder encoder;
  35
  36        /**
  37         * @pixel_formats_blob_ptr:
  38         *
  39         * DRM blob property data for the pixel formats list on writeback
  40         * connectors
  41         * See also drm_writeback_connector_init()
  42         */
  43        struct drm_property_blob *pixel_formats_blob_ptr;
  44
  45        /** @job_lock: Protects job_queue */
  46        spinlock_t job_lock;
  47
  48        /**
  49         * @job_queue:
  50         *
  51         * Holds a list of a connector's writeback jobs; the last item is the
  52         * most recent. The first item may be either waiting for the hardware
  53         * to begin writing, or currently being written.
  54         *
  55         * See also: drm_writeback_queue_job() and
  56         * drm_writeback_signal_completion()
  57         */
  58        struct list_head job_queue;
  59
  60        /**
  61         * @fence_context:
  62         *
  63         * timeline context used for fence operations.
  64         */
  65        unsigned int fence_context;
  66        /**
  67         * @fence_lock:
  68         *
  69         * spinlock to protect the fences in the fence_context.
  70         */
  71        spinlock_t fence_lock;
  72        /**
  73         * @fence_seqno:
  74         *
  75         * Seqno variable used as monotonic counter for the fences
  76         * created on the connector's timeline.
  77         */
  78        unsigned long fence_seqno;
  79        /**
  80         * @timeline_name:
  81         *
  82         * The name of the connector's fence timeline.
  83         */
  84        char timeline_name[32];
  85};
  86
  87/**
  88 * struct drm_writeback_job - DRM writeback job
  89 */
  90struct drm_writeback_job {
  91        /**
  92         * @connector:
  93         *
  94         * Back-pointer to the writeback connector associated with the job
  95         */
  96        struct drm_writeback_connector *connector;
  97
  98        /**
  99         * @prepared:
 100         *
 101         * Set when the job has been prepared with drm_writeback_prepare_job()
 102         */
 103        bool prepared;
 104
 105        /**
 106         * @cleanup_work:
 107         *
 108         * Used to allow drm_writeback_signal_completion to defer dropping the
 109         * framebuffer reference to a workqueue
 110         */
 111        struct work_struct cleanup_work;
 112
 113        /**
 114         * @list_entry:
 115         *
 116         * List item for the writeback connector's @job_queue
 117         */
 118        struct list_head list_entry;
 119
 120        /**
 121         * @fb:
 122         *
 123         * Framebuffer to be written to by the writeback connector. Do not set
 124         * directly, use drm_writeback_set_fb()
 125         */
 126        struct drm_framebuffer *fb;
 127
 128        /**
 129         * @out_fence:
 130         *
 131         * Fence which will signal once the writeback has completed
 132         */
 133        struct dma_fence *out_fence;
 134
 135        /**
 136         * @priv:
 137         *
 138         * Driver-private data
 139         */
 140        void *priv;
 141};
 142
 143static inline struct drm_writeback_connector *
 144drm_connector_to_writeback(struct drm_connector *connector)
 145{
 146        return container_of(connector, struct drm_writeback_connector, base);
 147}
 148
 149int drm_writeback_connector_init(struct drm_device *dev,
 150                                 struct drm_writeback_connector *wb_connector,
 151                                 const struct drm_connector_funcs *con_funcs,
 152                                 const struct drm_encoder_helper_funcs *enc_helper_funcs,
 153                                 const u32 *formats, int n_formats);
 154
 155int drm_writeback_set_fb(struct drm_connector_state *conn_state,
 156                         struct drm_framebuffer *fb);
 157
 158int drm_writeback_prepare_job(struct drm_writeback_job *job);
 159
 160void drm_writeback_queue_job(struct drm_writeback_connector *wb_connector,
 161                             struct drm_connector_state *conn_state);
 162
 163void drm_writeback_cleanup_job(struct drm_writeback_job *job);
 164
 165void
 166drm_writeback_signal_completion(struct drm_writeback_connector *wb_connector,
 167                                int status);
 168
 169struct dma_fence *
 170drm_writeback_get_out_fence(struct drm_writeback_connector *wb_connector);
 171#endif
 172