1935774cdSBrian Starkey /* SPDX-License-Identifier: GPL-2.0 */ 2935774cdSBrian Starkey /* 3935774cdSBrian Starkey * (C) COPYRIGHT 2016 ARM Limited. All rights reserved. 4935774cdSBrian Starkey * Author: Brian Starkey <brian.starkey@arm.com> 5935774cdSBrian Starkey * 6935774cdSBrian Starkey * This program is free software and is provided to you under the terms of the 7935774cdSBrian Starkey * GNU General Public License version 2 as published by the Free Software 8935774cdSBrian Starkey * Foundation, and any use by you of this program is subject to the terms 9935774cdSBrian Starkey * of such GNU licence. 10935774cdSBrian Starkey */ 11935774cdSBrian Starkey 12935774cdSBrian Starkey #ifndef __DRM_WRITEBACK_H__ 13935774cdSBrian Starkey #define __DRM_WRITEBACK_H__ 14935774cdSBrian Starkey #include <drm/drm_connector.h> 15935774cdSBrian Starkey #include <drm/drm_encoder.h> 16935774cdSBrian Starkey #include <linux/workqueue.h> 17935774cdSBrian Starkey 18e2d7fc20SSam Ravnborg /** 19e2d7fc20SSam Ravnborg * struct drm_writeback_connector - DRM writeback connector 20e2d7fc20SSam Ravnborg */ 21935774cdSBrian Starkey struct drm_writeback_connector { 22e2d7fc20SSam Ravnborg /** 23e2d7fc20SSam Ravnborg * @base: base drm_connector object 24e2d7fc20SSam Ravnborg */ 25935774cdSBrian Starkey struct drm_connector base; 26935774cdSBrian Starkey 27935774cdSBrian Starkey /** 28935774cdSBrian Starkey * @encoder: Internal encoder used by the connector to fulfill 29935774cdSBrian Starkey * the DRM framework requirements. The users of the 30935774cdSBrian Starkey * @drm_writeback_connector control the behaviour of the @encoder 31935774cdSBrian Starkey * by passing the @enc_funcs parameter to drm_writeback_connector_init() 32935774cdSBrian Starkey * function. 33935774cdSBrian Starkey */ 34935774cdSBrian Starkey struct drm_encoder encoder; 35935774cdSBrian Starkey 36935774cdSBrian Starkey /** 37935774cdSBrian Starkey * @pixel_formats_blob_ptr: 38935774cdSBrian Starkey * 39935774cdSBrian Starkey * DRM blob property data for the pixel formats list on writeback 40935774cdSBrian Starkey * connectors 41935774cdSBrian Starkey * See also drm_writeback_connector_init() 42935774cdSBrian Starkey */ 43935774cdSBrian Starkey struct drm_property_blob *pixel_formats_blob_ptr; 44935774cdSBrian Starkey 45935774cdSBrian Starkey /** @job_lock: Protects job_queue */ 46935774cdSBrian Starkey spinlock_t job_lock; 47935774cdSBrian Starkey 48935774cdSBrian Starkey /** 49935774cdSBrian Starkey * @job_queue: 50935774cdSBrian Starkey * 51935774cdSBrian Starkey * Holds a list of a connector's writeback jobs; the last item is the 52935774cdSBrian Starkey * most recent. The first item may be either waiting for the hardware 53935774cdSBrian Starkey * to begin writing, or currently being written. 54935774cdSBrian Starkey * 55935774cdSBrian Starkey * See also: drm_writeback_queue_job() and 56935774cdSBrian Starkey * drm_writeback_signal_completion() 57935774cdSBrian Starkey */ 58935774cdSBrian Starkey struct list_head job_queue; 59b13cc8ddSBrian Starkey 60b13cc8ddSBrian Starkey /** 61b13cc8ddSBrian Starkey * @fence_context: 62b13cc8ddSBrian Starkey * 63b13cc8ddSBrian Starkey * timeline context used for fence operations. 64b13cc8ddSBrian Starkey */ 65b13cc8ddSBrian Starkey unsigned int fence_context; 66b13cc8ddSBrian Starkey /** 67b13cc8ddSBrian Starkey * @fence_lock: 68b13cc8ddSBrian Starkey * 69b13cc8ddSBrian Starkey * spinlock to protect the fences in the fence_context. 70b13cc8ddSBrian Starkey */ 71b13cc8ddSBrian Starkey spinlock_t fence_lock; 72b13cc8ddSBrian Starkey /** 73b13cc8ddSBrian Starkey * @fence_seqno: 74b13cc8ddSBrian Starkey * 75b13cc8ddSBrian Starkey * Seqno variable used as monotonic counter for the fences 76b13cc8ddSBrian Starkey * created on the connector's timeline. 77b13cc8ddSBrian Starkey */ 78b13cc8ddSBrian Starkey unsigned long fence_seqno; 79b13cc8ddSBrian Starkey /** 80b13cc8ddSBrian Starkey * @timeline_name: 81b13cc8ddSBrian Starkey * 82b13cc8ddSBrian Starkey * The name of the connector's fence timeline. 83b13cc8ddSBrian Starkey */ 84b13cc8ddSBrian Starkey char timeline_name[32]; 85935774cdSBrian Starkey }; 86935774cdSBrian Starkey 87e2d7fc20SSam Ravnborg /** 88e2d7fc20SSam Ravnborg * struct drm_writeback_job - DRM writeback job 89e2d7fc20SSam Ravnborg */ 90935774cdSBrian Starkey struct drm_writeback_job { 91935774cdSBrian Starkey /** 929d2230dcSLaurent Pinchart * @connector: 939d2230dcSLaurent Pinchart * 949d2230dcSLaurent Pinchart * Back-pointer to the writeback connector associated with the job 959d2230dcSLaurent Pinchart */ 969d2230dcSLaurent Pinchart struct drm_writeback_connector *connector; 979d2230dcSLaurent Pinchart 989d2230dcSLaurent Pinchart /** 999d2230dcSLaurent Pinchart * @prepared: 1009d2230dcSLaurent Pinchart * 1019d2230dcSLaurent Pinchart * Set when the job has been prepared with drm_writeback_prepare_job() 1029d2230dcSLaurent Pinchart */ 1039d2230dcSLaurent Pinchart bool prepared; 1049d2230dcSLaurent Pinchart 1059d2230dcSLaurent Pinchart /** 106935774cdSBrian Starkey * @cleanup_work: 107935774cdSBrian Starkey * 108935774cdSBrian Starkey * Used to allow drm_writeback_signal_completion to defer dropping the 109935774cdSBrian Starkey * framebuffer reference to a workqueue 110935774cdSBrian Starkey */ 111935774cdSBrian Starkey struct work_struct cleanup_work; 112935774cdSBrian Starkey 113935774cdSBrian Starkey /** 114935774cdSBrian Starkey * @list_entry: 115935774cdSBrian Starkey * 116935774cdSBrian Starkey * List item for the writeback connector's @job_queue 117935774cdSBrian Starkey */ 118935774cdSBrian Starkey struct list_head list_entry; 119935774cdSBrian Starkey 120935774cdSBrian Starkey /** 121935774cdSBrian Starkey * @fb: 122935774cdSBrian Starkey * 123935774cdSBrian Starkey * Framebuffer to be written to by the writeback connector. Do not set 1249d2230dcSLaurent Pinchart * directly, use drm_writeback_set_fb() 125935774cdSBrian Starkey */ 126935774cdSBrian Starkey struct drm_framebuffer *fb; 127b13cc8ddSBrian Starkey 128b13cc8ddSBrian Starkey /** 129b13cc8ddSBrian Starkey * @out_fence: 130b13cc8ddSBrian Starkey * 131b13cc8ddSBrian Starkey * Fence which will signal once the writeback has completed 132b13cc8ddSBrian Starkey */ 133b13cc8ddSBrian Starkey struct dma_fence *out_fence; 1349d2230dcSLaurent Pinchart 1359d2230dcSLaurent Pinchart /** 1369d2230dcSLaurent Pinchart * @priv: 1379d2230dcSLaurent Pinchart * 1389d2230dcSLaurent Pinchart * Driver-private data 1399d2230dcSLaurent Pinchart */ 1409d2230dcSLaurent Pinchart void *priv; 141935774cdSBrian Starkey }; 142935774cdSBrian Starkey 143b82c1f8fSBoris Brezillon static inline struct drm_writeback_connector * 144b82c1f8fSBoris Brezillon drm_connector_to_writeback(struct drm_connector *connector) 145b82c1f8fSBoris Brezillon { 146b82c1f8fSBoris Brezillon return container_of(connector, struct drm_writeback_connector, base); 147b82c1f8fSBoris Brezillon } 148b82c1f8fSBoris Brezillon 149935774cdSBrian Starkey int drm_writeback_connector_init(struct drm_device *dev, 150935774cdSBrian Starkey struct drm_writeback_connector *wb_connector, 151935774cdSBrian Starkey const struct drm_connector_funcs *con_funcs, 152935774cdSBrian Starkey const struct drm_encoder_helper_funcs *enc_helper_funcs, 153*57b8280aSAbhinav Kumar const u32 *formats, int n_formats, 154*57b8280aSAbhinav Kumar u32 possible_crtcs); 155935774cdSBrian Starkey 1569d2230dcSLaurent Pinchart int drm_writeback_set_fb(struct drm_connector_state *conn_state, 1579d2230dcSLaurent Pinchart struct drm_framebuffer *fb); 1589d2230dcSLaurent Pinchart 1599d2230dcSLaurent Pinchart int drm_writeback_prepare_job(struct drm_writeback_job *job); 1609d2230dcSLaurent Pinchart 161935774cdSBrian Starkey void drm_writeback_queue_job(struct drm_writeback_connector *wb_connector, 16297eb9eaeSLaurent Pinchart struct drm_connector_state *conn_state); 163935774cdSBrian Starkey 164935774cdSBrian Starkey void drm_writeback_cleanup_job(struct drm_writeback_job *job); 165b13cc8ddSBrian Starkey 166b13cc8ddSBrian Starkey void 167b13cc8ddSBrian Starkey drm_writeback_signal_completion(struct drm_writeback_connector *wb_connector, 168b13cc8ddSBrian Starkey int status); 169b13cc8ddSBrian Starkey 170b13cc8ddSBrian Starkey struct dma_fence * 171b13cc8ddSBrian Starkey drm_writeback_get_out_fence(struct drm_writeback_connector *wb_connector); 172935774cdSBrian Starkey #endif 173