123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131 |
- /* SPDX-License-Identifier: GPL-2.0 */
- /*
- * (C) COPYRIGHT 2016 ARM Limited. All rights reserved.
- * Author: Brian Starkey <brian.starkey@arm.com>
- *
- * This program is free software and is provided to you under the terms of the
- * GNU General Public License version 2 as published by the Free Software
- * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
- */
- #ifndef __DRM_WRITEBACK_H__
- #define __DRM_WRITEBACK_H__
- #include <drm/drm_connector.h>
- #include <drm/drm_encoder.h>
- #include <linux/workqueue.h>
- struct drm_writeback_connector {
- struct drm_connector base;
- /**
- * @encoder: Internal encoder used by the connector to fulfill
- * the DRM framework requirements. The users of the
- * @drm_writeback_connector control the behaviour of the @encoder
- * by passing the @enc_funcs parameter to drm_writeback_connector_init()
- * function.
- */
- struct drm_encoder encoder;
- /**
- * @pixel_formats_blob_ptr:
- *
- * DRM blob property data for the pixel formats list on writeback
- * connectors
- * See also drm_writeback_connector_init()
- */
- struct drm_property_blob *pixel_formats_blob_ptr;
- /** @job_lock: Protects job_queue */
- spinlock_t job_lock;
- /**
- * @job_queue:
- *
- * Holds a list of a connector's writeback jobs; the last item is the
- * most recent. The first item may be either waiting for the hardware
- * to begin writing, or currently being written.
- *
- * See also: drm_writeback_queue_job() and
- * drm_writeback_signal_completion()
- */
- struct list_head job_queue;
- /**
- * @fence_context:
- *
- * timeline context used for fence operations.
- */
- unsigned int fence_context;
- /**
- * @fence_lock:
- *
- * spinlock to protect the fences in the fence_context.
- */
- spinlock_t fence_lock;
- /**
- * @fence_seqno:
- *
- * Seqno variable used as monotonic counter for the fences
- * created on the connector's timeline.
- */
- unsigned long fence_seqno;
- /**
- * @timeline_name:
- *
- * The name of the connector's fence timeline.
- */
- char timeline_name[32];
- };
- struct drm_writeback_job {
- /**
- * @cleanup_work:
- *
- * Used to allow drm_writeback_signal_completion to defer dropping the
- * framebuffer reference to a workqueue
- */
- struct work_struct cleanup_work;
- /**
- * @list_entry:
- *
- * List item for the writeback connector's @job_queue
- */
- struct list_head list_entry;
- /**
- * @fb:
- *
- * Framebuffer to be written to by the writeback connector. Do not set
- * directly, use drm_atomic_set_writeback_fb_for_connector()
- */
- struct drm_framebuffer *fb;
- /**
- * @out_fence:
- *
- * Fence which will signal once the writeback has completed
- */
- struct dma_fence *out_fence;
- };
- int drm_writeback_connector_init(struct drm_device *dev,
- struct drm_writeback_connector *wb_connector,
- const struct drm_connector_funcs *con_funcs,
- const struct drm_encoder_helper_funcs *enc_helper_funcs,
- const u32 *formats, int n_formats);
- void drm_writeback_queue_job(struct drm_writeback_connector *wb_connector,
- struct drm_writeback_job *job);
- void drm_writeback_cleanup_job(struct drm_writeback_job *job);
- void
- drm_writeback_signal_completion(struct drm_writeback_connector *wb_connector,
- int status);
- struct dma_fence *
- drm_writeback_get_out_fence(struct drm_writeback_connector *wb_connector);
- #endif
|