xref: /openbmc/linux/include/drm/drm_writeback.h (revision 7933aecf)
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.
33*7933aecfSAbhinav Kumar 	 * For users of drm_writeback_connector_init_with_encoder(), this field
34*7933aecfSAbhinav Kumar 	 * is not valid as the encoder is managed within their drivers.
35935774cdSBrian Starkey 	 */
36935774cdSBrian Starkey 	struct drm_encoder encoder;
37935774cdSBrian Starkey 
38935774cdSBrian Starkey 	/**
39935774cdSBrian Starkey 	 * @pixel_formats_blob_ptr:
40935774cdSBrian Starkey 	 *
41935774cdSBrian Starkey 	 * DRM blob property data for the pixel formats list on writeback
42935774cdSBrian Starkey 	 * connectors
43935774cdSBrian Starkey 	 * See also drm_writeback_connector_init()
44935774cdSBrian Starkey 	 */
45935774cdSBrian Starkey 	struct drm_property_blob *pixel_formats_blob_ptr;
46935774cdSBrian Starkey 
47935774cdSBrian Starkey 	/** @job_lock: Protects job_queue */
48935774cdSBrian Starkey 	spinlock_t job_lock;
49935774cdSBrian Starkey 
50935774cdSBrian Starkey 	/**
51935774cdSBrian Starkey 	 * @job_queue:
52935774cdSBrian Starkey 	 *
53935774cdSBrian Starkey 	 * Holds a list of a connector's writeback jobs; the last item is the
54935774cdSBrian Starkey 	 * most recent. The first item may be either waiting for the hardware
55935774cdSBrian Starkey 	 * to begin writing, or currently being written.
56935774cdSBrian Starkey 	 *
57935774cdSBrian Starkey 	 * See also: drm_writeback_queue_job() and
58935774cdSBrian Starkey 	 * drm_writeback_signal_completion()
59935774cdSBrian Starkey 	 */
60935774cdSBrian Starkey 	struct list_head job_queue;
61b13cc8ddSBrian Starkey 
62b13cc8ddSBrian Starkey 	/**
63b13cc8ddSBrian Starkey 	 * @fence_context:
64b13cc8ddSBrian Starkey 	 *
65b13cc8ddSBrian Starkey 	 * timeline context used for fence operations.
66b13cc8ddSBrian Starkey 	 */
67b13cc8ddSBrian Starkey 	unsigned int fence_context;
68b13cc8ddSBrian Starkey 	/**
69b13cc8ddSBrian Starkey 	 * @fence_lock:
70b13cc8ddSBrian Starkey 	 *
71b13cc8ddSBrian Starkey 	 * spinlock to protect the fences in the fence_context.
72b13cc8ddSBrian Starkey 	 */
73b13cc8ddSBrian Starkey 	spinlock_t fence_lock;
74b13cc8ddSBrian Starkey 	/**
75b13cc8ddSBrian Starkey 	 * @fence_seqno:
76b13cc8ddSBrian Starkey 	 *
77b13cc8ddSBrian Starkey 	 * Seqno variable used as monotonic counter for the fences
78b13cc8ddSBrian Starkey 	 * created on the connector's timeline.
79b13cc8ddSBrian Starkey 	 */
80b13cc8ddSBrian Starkey 	unsigned long fence_seqno;
81b13cc8ddSBrian Starkey 	/**
82b13cc8ddSBrian Starkey 	 * @timeline_name:
83b13cc8ddSBrian Starkey 	 *
84b13cc8ddSBrian Starkey 	 * The name of the connector's fence timeline.
85b13cc8ddSBrian Starkey 	 */
86b13cc8ddSBrian Starkey 	char timeline_name[32];
87935774cdSBrian Starkey };
88935774cdSBrian Starkey 
89e2d7fc20SSam Ravnborg /**
90e2d7fc20SSam Ravnborg  * struct drm_writeback_job - DRM writeback job
91e2d7fc20SSam Ravnborg  */
92935774cdSBrian Starkey struct drm_writeback_job {
93935774cdSBrian Starkey 	/**
949d2230dcSLaurent Pinchart 	 * @connector:
959d2230dcSLaurent Pinchart 	 *
969d2230dcSLaurent Pinchart 	 * Back-pointer to the writeback connector associated with the job
979d2230dcSLaurent Pinchart 	 */
989d2230dcSLaurent Pinchart 	struct drm_writeback_connector *connector;
999d2230dcSLaurent Pinchart 
1009d2230dcSLaurent Pinchart 	/**
1019d2230dcSLaurent Pinchart 	 * @prepared:
1029d2230dcSLaurent Pinchart 	 *
1039d2230dcSLaurent Pinchart 	 * Set when the job has been prepared with drm_writeback_prepare_job()
1049d2230dcSLaurent Pinchart 	 */
1059d2230dcSLaurent Pinchart 	bool prepared;
1069d2230dcSLaurent Pinchart 
1079d2230dcSLaurent Pinchart 	/**
108935774cdSBrian Starkey 	 * @cleanup_work:
109935774cdSBrian Starkey 	 *
110935774cdSBrian Starkey 	 * Used to allow drm_writeback_signal_completion to defer dropping the
111935774cdSBrian Starkey 	 * framebuffer reference to a workqueue
112935774cdSBrian Starkey 	 */
113935774cdSBrian Starkey 	struct work_struct cleanup_work;
114935774cdSBrian Starkey 
115935774cdSBrian Starkey 	/**
116935774cdSBrian Starkey 	 * @list_entry:
117935774cdSBrian Starkey 	 *
118935774cdSBrian Starkey 	 * List item for the writeback connector's @job_queue
119935774cdSBrian Starkey 	 */
120935774cdSBrian Starkey 	struct list_head list_entry;
121935774cdSBrian Starkey 
122935774cdSBrian Starkey 	/**
123935774cdSBrian Starkey 	 * @fb:
124935774cdSBrian Starkey 	 *
125935774cdSBrian Starkey 	 * Framebuffer to be written to by the writeback connector. Do not set
1269d2230dcSLaurent Pinchart 	 * directly, use drm_writeback_set_fb()
127935774cdSBrian Starkey 	 */
128935774cdSBrian Starkey 	struct drm_framebuffer *fb;
129b13cc8ddSBrian Starkey 
130b13cc8ddSBrian Starkey 	/**
131b13cc8ddSBrian Starkey 	 * @out_fence:
132b13cc8ddSBrian Starkey 	 *
133b13cc8ddSBrian Starkey 	 * Fence which will signal once the writeback has completed
134b13cc8ddSBrian Starkey 	 */
135b13cc8ddSBrian Starkey 	struct dma_fence *out_fence;
1369d2230dcSLaurent Pinchart 
1379d2230dcSLaurent Pinchart 	/**
1389d2230dcSLaurent Pinchart 	 * @priv:
1399d2230dcSLaurent Pinchart 	 *
1409d2230dcSLaurent Pinchart 	 * Driver-private data
1419d2230dcSLaurent Pinchart 	 */
1429d2230dcSLaurent Pinchart 	void *priv;
143935774cdSBrian Starkey };
144935774cdSBrian Starkey 
145b82c1f8fSBoris Brezillon static inline struct drm_writeback_connector *
drm_connector_to_writeback(struct drm_connector * connector)146b82c1f8fSBoris Brezillon drm_connector_to_writeback(struct drm_connector *connector)
147b82c1f8fSBoris Brezillon {
148b82c1f8fSBoris Brezillon 	return container_of(connector, struct drm_writeback_connector, base);
149b82c1f8fSBoris Brezillon }
150b82c1f8fSBoris Brezillon 
151935774cdSBrian Starkey int drm_writeback_connector_init(struct drm_device *dev,
152935774cdSBrian Starkey 				 struct drm_writeback_connector *wb_connector,
153935774cdSBrian Starkey 				 const struct drm_connector_funcs *con_funcs,
154935774cdSBrian Starkey 				 const struct drm_encoder_helper_funcs *enc_helper_funcs,
15557b8280aSAbhinav Kumar 				 const u32 *formats, int n_formats,
15657b8280aSAbhinav Kumar 				 u32 possible_crtcs);
157935774cdSBrian Starkey 
158*7933aecfSAbhinav Kumar int drm_writeback_connector_init_with_encoder(struct drm_device *dev,
159*7933aecfSAbhinav Kumar 				struct drm_writeback_connector *wb_connector,
160*7933aecfSAbhinav Kumar 				struct drm_encoder *enc,
161*7933aecfSAbhinav Kumar 				const struct drm_connector_funcs *con_funcs, const u32 *formats,
162*7933aecfSAbhinav Kumar 				int n_formats);
163*7933aecfSAbhinav Kumar 
1649d2230dcSLaurent Pinchart int drm_writeback_set_fb(struct drm_connector_state *conn_state,
1659d2230dcSLaurent Pinchart 			 struct drm_framebuffer *fb);
1669d2230dcSLaurent Pinchart 
1679d2230dcSLaurent Pinchart int drm_writeback_prepare_job(struct drm_writeback_job *job);
1689d2230dcSLaurent Pinchart 
169935774cdSBrian Starkey void drm_writeback_queue_job(struct drm_writeback_connector *wb_connector,
17097eb9eaeSLaurent Pinchart 			     struct drm_connector_state *conn_state);
171935774cdSBrian Starkey 
172935774cdSBrian Starkey void drm_writeback_cleanup_job(struct drm_writeback_job *job);
173b13cc8ddSBrian Starkey 
174b13cc8ddSBrian Starkey void
175b13cc8ddSBrian Starkey drm_writeback_signal_completion(struct drm_writeback_connector *wb_connector,
176b13cc8ddSBrian Starkey 				int status);
177b13cc8ddSBrian Starkey 
178b13cc8ddSBrian Starkey struct dma_fence *
179b13cc8ddSBrian Starkey drm_writeback_get_out_fence(struct drm_writeback_connector *wb_connector);
180935774cdSBrian Starkey #endif
181