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 18935774cdSBrian Starkey struct drm_writeback_connector { 19935774cdSBrian Starkey struct drm_connector base; 20935774cdSBrian Starkey 21935774cdSBrian Starkey /** 22935774cdSBrian Starkey * @encoder: Internal encoder used by the connector to fulfill 23935774cdSBrian Starkey * the DRM framework requirements. The users of the 24935774cdSBrian Starkey * @drm_writeback_connector control the behaviour of the @encoder 25935774cdSBrian Starkey * by passing the @enc_funcs parameter to drm_writeback_connector_init() 26935774cdSBrian Starkey * function. 27935774cdSBrian Starkey */ 28935774cdSBrian Starkey struct drm_encoder encoder; 29935774cdSBrian Starkey 30935774cdSBrian Starkey /** 31935774cdSBrian Starkey * @pixel_formats_blob_ptr: 32935774cdSBrian Starkey * 33935774cdSBrian Starkey * DRM blob property data for the pixel formats list on writeback 34935774cdSBrian Starkey * connectors 35935774cdSBrian Starkey * See also drm_writeback_connector_init() 36935774cdSBrian Starkey */ 37935774cdSBrian Starkey struct drm_property_blob *pixel_formats_blob_ptr; 38935774cdSBrian Starkey 39935774cdSBrian Starkey /** @job_lock: Protects job_queue */ 40935774cdSBrian Starkey spinlock_t job_lock; 41935774cdSBrian Starkey 42935774cdSBrian Starkey /** 43935774cdSBrian Starkey * @job_queue: 44935774cdSBrian Starkey * 45935774cdSBrian Starkey * Holds a list of a connector's writeback jobs; the last item is the 46935774cdSBrian Starkey * most recent. The first item may be either waiting for the hardware 47935774cdSBrian Starkey * to begin writing, or currently being written. 48935774cdSBrian Starkey * 49935774cdSBrian Starkey * See also: drm_writeback_queue_job() and 50935774cdSBrian Starkey * drm_writeback_signal_completion() 51935774cdSBrian Starkey */ 52935774cdSBrian Starkey struct list_head job_queue; 53935774cdSBrian Starkey }; 54935774cdSBrian Starkey 55935774cdSBrian Starkey struct drm_writeback_job { 56935774cdSBrian Starkey /** 57935774cdSBrian Starkey * @cleanup_work: 58935774cdSBrian Starkey * 59935774cdSBrian Starkey * Used to allow drm_writeback_signal_completion to defer dropping the 60935774cdSBrian Starkey * framebuffer reference to a workqueue 61935774cdSBrian Starkey */ 62935774cdSBrian Starkey struct work_struct cleanup_work; 63935774cdSBrian Starkey 64935774cdSBrian Starkey /** 65935774cdSBrian Starkey * @list_entry: 66935774cdSBrian Starkey * 67935774cdSBrian Starkey * List item for the writeback connector's @job_queue 68935774cdSBrian Starkey */ 69935774cdSBrian Starkey struct list_head list_entry; 70935774cdSBrian Starkey 71935774cdSBrian Starkey /** 72935774cdSBrian Starkey * @fb: 73935774cdSBrian Starkey * 74935774cdSBrian Starkey * Framebuffer to be written to by the writeback connector. Do not set 75935774cdSBrian Starkey * directly, use drm_atomic_set_writeback_fb_for_connector() 76935774cdSBrian Starkey */ 77935774cdSBrian Starkey struct drm_framebuffer *fb; 78935774cdSBrian Starkey }; 79935774cdSBrian Starkey 80935774cdSBrian Starkey int drm_writeback_connector_init(struct drm_device *dev, 81935774cdSBrian Starkey struct drm_writeback_connector *wb_connector, 82935774cdSBrian Starkey const struct drm_connector_funcs *con_funcs, 83935774cdSBrian Starkey const struct drm_encoder_helper_funcs *enc_helper_funcs, 84935774cdSBrian Starkey const u32 *formats, int n_formats); 85935774cdSBrian Starkey 86935774cdSBrian Starkey void drm_writeback_queue_job(struct drm_writeback_connector *wb_connector, 87935774cdSBrian Starkey struct drm_writeback_job *job); 88935774cdSBrian Starkey 89935774cdSBrian Starkey void drm_writeback_cleanup_job(struct drm_writeback_job *job); 90935774cdSBrian Starkey void drm_writeback_signal_completion(struct drm_writeback_connector *wb_connector); 91935774cdSBrian Starkey #endif 92