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