xref: /openbmc/linux/include/drm/drm_writeback.h (revision 57b8280a)
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