18c2ecf20Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 */
28c2ecf20Sopenharmony_ci/*
38c2ecf20Sopenharmony_ci * (C) COPYRIGHT 2016 ARM Limited. All rights reserved.
48c2ecf20Sopenharmony_ci * Author: Brian Starkey <brian.starkey@arm.com>
58c2ecf20Sopenharmony_ci *
68c2ecf20Sopenharmony_ci * This program is free software and is provided to you under the terms of the
78c2ecf20Sopenharmony_ci * GNU General Public License version 2 as published by the Free Software
88c2ecf20Sopenharmony_ci * Foundation, and any use by you of this program is subject to the terms
98c2ecf20Sopenharmony_ci * of such GNU licence.
108c2ecf20Sopenharmony_ci */
118c2ecf20Sopenharmony_ci
128c2ecf20Sopenharmony_ci#ifndef __DRM_WRITEBACK_H__
138c2ecf20Sopenharmony_ci#define __DRM_WRITEBACK_H__
148c2ecf20Sopenharmony_ci#include <drm/drm_connector.h>
158c2ecf20Sopenharmony_ci#include <drm/drm_encoder.h>
168c2ecf20Sopenharmony_ci#include <linux/workqueue.h>
178c2ecf20Sopenharmony_ci
188c2ecf20Sopenharmony_ci/**
198c2ecf20Sopenharmony_ci * struct drm_writeback_connector - DRM writeback connector
208c2ecf20Sopenharmony_ci */
218c2ecf20Sopenharmony_cistruct drm_writeback_connector {
228c2ecf20Sopenharmony_ci	/**
238c2ecf20Sopenharmony_ci	 * @base: base drm_connector object
248c2ecf20Sopenharmony_ci	 */
258c2ecf20Sopenharmony_ci	struct drm_connector base;
268c2ecf20Sopenharmony_ci
278c2ecf20Sopenharmony_ci	/**
288c2ecf20Sopenharmony_ci	 * @encoder: Internal encoder used by the connector to fulfill
298c2ecf20Sopenharmony_ci	 * the DRM framework requirements. The users of the
308c2ecf20Sopenharmony_ci	 * @drm_writeback_connector control the behaviour of the @encoder
318c2ecf20Sopenharmony_ci	 * by passing the @enc_funcs parameter to drm_writeback_connector_init()
328c2ecf20Sopenharmony_ci	 * function.
338c2ecf20Sopenharmony_ci	 */
348c2ecf20Sopenharmony_ci	struct drm_encoder encoder;
358c2ecf20Sopenharmony_ci
368c2ecf20Sopenharmony_ci	/**
378c2ecf20Sopenharmony_ci	 * @pixel_formats_blob_ptr:
388c2ecf20Sopenharmony_ci	 *
398c2ecf20Sopenharmony_ci	 * DRM blob property data for the pixel formats list on writeback
408c2ecf20Sopenharmony_ci	 * connectors
418c2ecf20Sopenharmony_ci	 * See also drm_writeback_connector_init()
428c2ecf20Sopenharmony_ci	 */
438c2ecf20Sopenharmony_ci	struct drm_property_blob *pixel_formats_blob_ptr;
448c2ecf20Sopenharmony_ci
458c2ecf20Sopenharmony_ci	/** @job_lock: Protects job_queue */
468c2ecf20Sopenharmony_ci	spinlock_t job_lock;
478c2ecf20Sopenharmony_ci
488c2ecf20Sopenharmony_ci	/**
498c2ecf20Sopenharmony_ci	 * @job_queue:
508c2ecf20Sopenharmony_ci	 *
518c2ecf20Sopenharmony_ci	 * Holds a list of a connector's writeback jobs; the last item is the
528c2ecf20Sopenharmony_ci	 * most recent. The first item may be either waiting for the hardware
538c2ecf20Sopenharmony_ci	 * to begin writing, or currently being written.
548c2ecf20Sopenharmony_ci	 *
558c2ecf20Sopenharmony_ci	 * See also: drm_writeback_queue_job() and
568c2ecf20Sopenharmony_ci	 * drm_writeback_signal_completion()
578c2ecf20Sopenharmony_ci	 */
588c2ecf20Sopenharmony_ci	struct list_head job_queue;
598c2ecf20Sopenharmony_ci
608c2ecf20Sopenharmony_ci	/**
618c2ecf20Sopenharmony_ci	 * @fence_context:
628c2ecf20Sopenharmony_ci	 *
638c2ecf20Sopenharmony_ci	 * timeline context used for fence operations.
648c2ecf20Sopenharmony_ci	 */
658c2ecf20Sopenharmony_ci	unsigned int fence_context;
668c2ecf20Sopenharmony_ci	/**
678c2ecf20Sopenharmony_ci	 * @fence_lock:
688c2ecf20Sopenharmony_ci	 *
698c2ecf20Sopenharmony_ci	 * spinlock to protect the fences in the fence_context.
708c2ecf20Sopenharmony_ci	 */
718c2ecf20Sopenharmony_ci	spinlock_t fence_lock;
728c2ecf20Sopenharmony_ci	/**
738c2ecf20Sopenharmony_ci	 * @fence_seqno:
748c2ecf20Sopenharmony_ci	 *
758c2ecf20Sopenharmony_ci	 * Seqno variable used as monotonic counter for the fences
768c2ecf20Sopenharmony_ci	 * created on the connector's timeline.
778c2ecf20Sopenharmony_ci	 */
788c2ecf20Sopenharmony_ci	unsigned long fence_seqno;
798c2ecf20Sopenharmony_ci	/**
808c2ecf20Sopenharmony_ci	 * @timeline_name:
818c2ecf20Sopenharmony_ci	 *
828c2ecf20Sopenharmony_ci	 * The name of the connector's fence timeline.
838c2ecf20Sopenharmony_ci	 */
848c2ecf20Sopenharmony_ci	char timeline_name[32];
858c2ecf20Sopenharmony_ci};
868c2ecf20Sopenharmony_ci
878c2ecf20Sopenharmony_ci/**
888c2ecf20Sopenharmony_ci * struct drm_writeback_job - DRM writeback job
898c2ecf20Sopenharmony_ci */
908c2ecf20Sopenharmony_cistruct drm_writeback_job {
918c2ecf20Sopenharmony_ci	/**
928c2ecf20Sopenharmony_ci	 * @connector:
938c2ecf20Sopenharmony_ci	 *
948c2ecf20Sopenharmony_ci	 * Back-pointer to the writeback connector associated with the job
958c2ecf20Sopenharmony_ci	 */
968c2ecf20Sopenharmony_ci	struct drm_writeback_connector *connector;
978c2ecf20Sopenharmony_ci
988c2ecf20Sopenharmony_ci	/**
998c2ecf20Sopenharmony_ci	 * @prepared:
1008c2ecf20Sopenharmony_ci	 *
1018c2ecf20Sopenharmony_ci	 * Set when the job has been prepared with drm_writeback_prepare_job()
1028c2ecf20Sopenharmony_ci	 */
1038c2ecf20Sopenharmony_ci	bool prepared;
1048c2ecf20Sopenharmony_ci
1058c2ecf20Sopenharmony_ci	/**
1068c2ecf20Sopenharmony_ci	 * @cleanup_work:
1078c2ecf20Sopenharmony_ci	 *
1088c2ecf20Sopenharmony_ci	 * Used to allow drm_writeback_signal_completion to defer dropping the
1098c2ecf20Sopenharmony_ci	 * framebuffer reference to a workqueue
1108c2ecf20Sopenharmony_ci	 */
1118c2ecf20Sopenharmony_ci	struct work_struct cleanup_work;
1128c2ecf20Sopenharmony_ci
1138c2ecf20Sopenharmony_ci	/**
1148c2ecf20Sopenharmony_ci	 * @list_entry:
1158c2ecf20Sopenharmony_ci	 *
1168c2ecf20Sopenharmony_ci	 * List item for the writeback connector's @job_queue
1178c2ecf20Sopenharmony_ci	 */
1188c2ecf20Sopenharmony_ci	struct list_head list_entry;
1198c2ecf20Sopenharmony_ci
1208c2ecf20Sopenharmony_ci	/**
1218c2ecf20Sopenharmony_ci	 * @fb:
1228c2ecf20Sopenharmony_ci	 *
1238c2ecf20Sopenharmony_ci	 * Framebuffer to be written to by the writeback connector. Do not set
1248c2ecf20Sopenharmony_ci	 * directly, use drm_writeback_set_fb()
1258c2ecf20Sopenharmony_ci	 */
1268c2ecf20Sopenharmony_ci	struct drm_framebuffer *fb;
1278c2ecf20Sopenharmony_ci
1288c2ecf20Sopenharmony_ci	/**
1298c2ecf20Sopenharmony_ci	 * @out_fence:
1308c2ecf20Sopenharmony_ci	 *
1318c2ecf20Sopenharmony_ci	 * Fence which will signal once the writeback has completed
1328c2ecf20Sopenharmony_ci	 */
1338c2ecf20Sopenharmony_ci	struct dma_fence *out_fence;
1348c2ecf20Sopenharmony_ci
1358c2ecf20Sopenharmony_ci	/**
1368c2ecf20Sopenharmony_ci	 * @priv:
1378c2ecf20Sopenharmony_ci	 *
1388c2ecf20Sopenharmony_ci	 * Driver-private data
1398c2ecf20Sopenharmony_ci	 */
1408c2ecf20Sopenharmony_ci	void *priv;
1418c2ecf20Sopenharmony_ci};
1428c2ecf20Sopenharmony_ci
1438c2ecf20Sopenharmony_cistatic inline struct drm_writeback_connector *
1448c2ecf20Sopenharmony_cidrm_connector_to_writeback(struct drm_connector *connector)
1458c2ecf20Sopenharmony_ci{
1468c2ecf20Sopenharmony_ci	return container_of(connector, struct drm_writeback_connector, base);
1478c2ecf20Sopenharmony_ci}
1488c2ecf20Sopenharmony_ci
1498c2ecf20Sopenharmony_ciint drm_writeback_connector_init(struct drm_device *dev,
1508c2ecf20Sopenharmony_ci				 struct drm_writeback_connector *wb_connector,
1518c2ecf20Sopenharmony_ci				 const struct drm_connector_funcs *con_funcs,
1528c2ecf20Sopenharmony_ci				 const struct drm_encoder_helper_funcs *enc_helper_funcs,
1538c2ecf20Sopenharmony_ci				 const u32 *formats, int n_formats);
1548c2ecf20Sopenharmony_ci
1558c2ecf20Sopenharmony_ciint drm_writeback_set_fb(struct drm_connector_state *conn_state,
1568c2ecf20Sopenharmony_ci			 struct drm_framebuffer *fb);
1578c2ecf20Sopenharmony_ci
1588c2ecf20Sopenharmony_ciint drm_writeback_prepare_job(struct drm_writeback_job *job);
1598c2ecf20Sopenharmony_ci
1608c2ecf20Sopenharmony_civoid drm_writeback_queue_job(struct drm_writeback_connector *wb_connector,
1618c2ecf20Sopenharmony_ci			     struct drm_connector_state *conn_state);
1628c2ecf20Sopenharmony_ci
1638c2ecf20Sopenharmony_civoid drm_writeback_cleanup_job(struct drm_writeback_job *job);
1648c2ecf20Sopenharmony_ci
1658c2ecf20Sopenharmony_civoid
1668c2ecf20Sopenharmony_cidrm_writeback_signal_completion(struct drm_writeback_connector *wb_connector,
1678c2ecf20Sopenharmony_ci				int status);
1688c2ecf20Sopenharmony_ci
1698c2ecf20Sopenharmony_cistruct dma_fence *
1708c2ecf20Sopenharmony_cidrm_writeback_get_out_fence(struct drm_writeback_connector *wb_connector);
1718c2ecf20Sopenharmony_ci#endif
172