Branch data Line data Source code
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 : : struct drm_writeback_connector { 19 : : struct drm_connector base; 20 : : 21 : : /** 22 : : * @encoder: Internal encoder used by the connector to fulfill 23 : : * the DRM framework requirements. The users of the 24 : : * @drm_writeback_connector control the behaviour of the @encoder 25 : : * by passing the @enc_funcs parameter to drm_writeback_connector_init() 26 : : * function. 27 : : */ 28 : : struct drm_encoder encoder; 29 : : 30 : : /** 31 : : * @pixel_formats_blob_ptr: 32 : : * 33 : : * DRM blob property data for the pixel formats list on writeback 34 : : * connectors 35 : : * See also drm_writeback_connector_init() 36 : : */ 37 : : struct drm_property_blob *pixel_formats_blob_ptr; 38 : : 39 : : /** @job_lock: Protects job_queue */ 40 : : spinlock_t job_lock; 41 : : 42 : : /** 43 : : * @job_queue: 44 : : * 45 : : * Holds a list of a connector's writeback jobs; the last item is the 46 : : * most recent. The first item may be either waiting for the hardware 47 : : * to begin writing, or currently being written. 48 : : * 49 : : * See also: drm_writeback_queue_job() and 50 : : * drm_writeback_signal_completion() 51 : : */ 52 : : struct list_head job_queue; 53 : : 54 : : /** 55 : : * @fence_context: 56 : : * 57 : : * timeline context used for fence operations. 58 : : */ 59 : : unsigned int fence_context; 60 : : /** 61 : : * @fence_lock: 62 : : * 63 : : * spinlock to protect the fences in the fence_context. 64 : : */ 65 : : spinlock_t fence_lock; 66 : : /** 67 : : * @fence_seqno: 68 : : * 69 : : * Seqno variable used as monotonic counter for the fences 70 : : * created on the connector's timeline. 71 : : */ 72 : : unsigned long fence_seqno; 73 : : /** 74 : : * @timeline_name: 75 : : * 76 : : * The name of the connector's fence timeline. 77 : : */ 78 : : char timeline_name[32]; 79 : : }; 80 : : 81 : : struct drm_writeback_job { 82 : : /** 83 : : * @connector: 84 : : * 85 : : * Back-pointer to the writeback connector associated with the job 86 : : */ 87 : : struct drm_writeback_connector *connector; 88 : : 89 : : /** 90 : : * @prepared: 91 : : * 92 : : * Set when the job has been prepared with drm_writeback_prepare_job() 93 : : */ 94 : : bool prepared; 95 : : 96 : : /** 97 : : * @cleanup_work: 98 : : * 99 : : * Used to allow drm_writeback_signal_completion to defer dropping the 100 : : * framebuffer reference to a workqueue 101 : : */ 102 : : struct work_struct cleanup_work; 103 : : 104 : : /** 105 : : * @list_entry: 106 : : * 107 : : * List item for the writeback connector's @job_queue 108 : : */ 109 : : struct list_head list_entry; 110 : : 111 : : /** 112 : : * @fb: 113 : : * 114 : : * Framebuffer to be written to by the writeback connector. Do not set 115 : : * directly, use drm_writeback_set_fb() 116 : : */ 117 : : struct drm_framebuffer *fb; 118 : : 119 : : /** 120 : : * @out_fence: 121 : : * 122 : : * Fence which will signal once the writeback has completed 123 : : */ 124 : : struct dma_fence *out_fence; 125 : : 126 : : /** 127 : : * @priv: 128 : : * 129 : : * Driver-private data 130 : : */ 131 : : void *priv; 132 : : }; 133 : : 134 : : static inline struct drm_writeback_connector * 135 : 0 : drm_connector_to_writeback(struct drm_connector *connector) 136 : : { 137 : 0 : return container_of(connector, struct drm_writeback_connector, base); 138 : : } 139 : : 140 : : int drm_writeback_connector_init(struct drm_device *dev, 141 : : struct drm_writeback_connector *wb_connector, 142 : : const struct drm_connector_funcs *con_funcs, 143 : : const struct drm_encoder_helper_funcs *enc_helper_funcs, 144 : : const u32 *formats, int n_formats); 145 : : 146 : : int drm_writeback_set_fb(struct drm_connector_state *conn_state, 147 : : struct drm_framebuffer *fb); 148 : : 149 : : int drm_writeback_prepare_job(struct drm_writeback_job *job); 150 : : 151 : : void drm_writeback_queue_job(struct drm_writeback_connector *wb_connector, 152 : : struct drm_connector_state *conn_state); 153 : : 154 : : void drm_writeback_cleanup_job(struct drm_writeback_job *job); 155 : : 156 : : void 157 : : drm_writeback_signal_completion(struct drm_writeback_connector *wb_connector, 158 : : int status); 159 : : 160 : : struct dma_fence * 161 : : drm_writeback_get_out_fence(struct drm_writeback_connector *wb_connector); 162 : : #endif