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