Lines Matching +full:pixel +full:- +full:array

1 // SPDX-License-Identifier: GPL-2.0
12 #include <linux/dma-fence.h>
55 * Write-only object property storing a DRM_MODE_OBJECT_FB: it stores the
63 * Immutable blob property to store the supported pixel formats table. The
64 * data is an array of u32 DRM_FORMAT_* fourcc values.
65 * Userspace can use this blob to find out what pixel formats are supported
71 * writeback is finished. The value should be the address of a 32-bit
78 * out-fence for the commit and use it appropriately.
82 #define fence_to_wb_connector(x) container_of(x->lock, \
91 return wb_connector->base.dev->driver->name; in drm_writeback_fence_get_driver_name()
100 return wb_connector->timeline_name; in drm_writeback_fence_get_timeline_name()
112 if (!dev->mode_config.writeback_fb_id_property) { in create_writeback_properties()
117 return -ENOMEM; in create_writeback_properties()
118 dev->mode_config.writeback_fb_id_property = prop; in create_writeback_properties()
121 if (!dev->mode_config.writeback_pixel_formats_property) { in create_writeback_properties()
127 return -ENOMEM; in create_writeback_properties()
128 dev->mode_config.writeback_pixel_formats_property = prop; in create_writeback_properties()
131 if (!dev->mode_config.writeback_out_fence_ptr_property) { in create_writeback_properties()
136 return -ENOMEM; in create_writeback_properties()
137 dev->mode_config.writeback_out_fence_ptr_property = prop; in create_writeback_properties()
148 * drm_writeback_connector_init - Initialize a writeback connector and its properties
153 * @formats: Array of supported pixel formats for the writeback engine
154 * @n_formats: Length of the formats array
157 * This function creates the writeback-connector-specific properties if they
178 drm_encoder_helper_add(&wb_connector->encoder, enc_helper_funcs); in drm_writeback_connector_init()
180 wb_connector->encoder.possible_crtcs = possible_crtcs; in drm_writeback_connector_init()
182 ret = drm_encoder_init(dev, &wb_connector->encoder, in drm_writeback_connector_init()
188 ret = drm_writeback_connector_init_with_encoder(dev, wb_connector, &wb_connector->encoder, in drm_writeback_connector_init()
192 drm_encoder_cleanup(&wb_connector->encoder); in drm_writeback_connector_init()
199 * drm_writeback_connector_init_with_encoder - Initialize a writeback connector with
206 * @formats: Array of supported pixel formats for the writeback engine
207 * @n_formats: Length of the formats array
209 * This function creates the writeback-connector-specific properties if they
233 struct drm_connector *connector = &wb_connector->base; in drm_writeback_connector_init_with_encoder()
234 struct drm_mode_config *config = &dev->mode_config; in drm_writeback_connector_init_with_encoder()
246 connector->interlace_allowed = 0; in drm_writeback_connector_init_with_encoder()
257 INIT_LIST_HEAD(&wb_connector->job_queue); in drm_writeback_connector_init_with_encoder()
258 spin_lock_init(&wb_connector->job_lock); in drm_writeback_connector_init_with_encoder()
260 wb_connector->fence_context = dma_fence_context_alloc(1); in drm_writeback_connector_init_with_encoder()
261 spin_lock_init(&wb_connector->fence_lock); in drm_writeback_connector_init_with_encoder()
262 snprintf(wb_connector->timeline_name, in drm_writeback_connector_init_with_encoder()
263 sizeof(wb_connector->timeline_name), in drm_writeback_connector_init_with_encoder()
264 "CONNECTOR:%d-%s", connector->base.id, connector->name); in drm_writeback_connector_init_with_encoder()
266 drm_object_attach_property(&connector->base, in drm_writeback_connector_init_with_encoder()
267 config->writeback_out_fence_ptr_property, 0); in drm_writeback_connector_init_with_encoder()
269 drm_object_attach_property(&connector->base, in drm_writeback_connector_init_with_encoder()
270 config->writeback_fb_id_property, 0); in drm_writeback_connector_init_with_encoder()
272 drm_object_attach_property(&connector->base, in drm_writeback_connector_init_with_encoder()
273 config->writeback_pixel_formats_property, in drm_writeback_connector_init_with_encoder()
274 blob->base.id); in drm_writeback_connector_init_with_encoder()
275 wb_connector->pixel_formats_blob_ptr = blob; in drm_writeback_connector_init_with_encoder()
290 WARN_ON(conn_state->connector->connector_type != DRM_MODE_CONNECTOR_WRITEBACK); in drm_writeback_set_fb()
292 if (!conn_state->writeback_job) { in drm_writeback_set_fb()
293 conn_state->writeback_job = in drm_writeback_set_fb()
294 kzalloc(sizeof(*conn_state->writeback_job), GFP_KERNEL); in drm_writeback_set_fb()
295 if (!conn_state->writeback_job) in drm_writeback_set_fb()
296 return -ENOMEM; in drm_writeback_set_fb()
298 conn_state->writeback_job->connector = in drm_writeback_set_fb()
299 drm_connector_to_writeback(conn_state->connector); in drm_writeback_set_fb()
302 drm_framebuffer_assign(&conn_state->writeback_job->fb, fb); in drm_writeback_set_fb()
308 struct drm_writeback_connector *connector = job->connector; in drm_writeback_prepare_job()
310 connector->base.helper_private; in drm_writeback_prepare_job()
313 if (funcs->prepare_writeback_job) { in drm_writeback_prepare_job()
314 ret = funcs->prepare_writeback_job(connector, job); in drm_writeback_prepare_job()
319 job->prepared = true; in drm_writeback_prepare_job()
325 * drm_writeback_queue_job - Queue a writeback job for later signalling
331 * @conn_state->writeback_job to NULL, and so no access to the job may be
349 job = conn_state->writeback_job; in drm_writeback_queue_job()
350 conn_state->writeback_job = NULL; in drm_writeback_queue_job()
352 spin_lock_irqsave(&wb_connector->job_lock, flags); in drm_writeback_queue_job()
353 list_add_tail(&job->list_entry, &wb_connector->job_queue); in drm_writeback_queue_job()
354 spin_unlock_irqrestore(&wb_connector->job_lock, flags); in drm_writeback_queue_job()
360 struct drm_writeback_connector *connector = job->connector; in drm_writeback_cleanup_job()
362 connector->base.helper_private; in drm_writeback_cleanup_job()
364 if (job->prepared && funcs->cleanup_writeback_job) in drm_writeback_cleanup_job()
365 funcs->cleanup_writeback_job(connector, job); in drm_writeback_cleanup_job()
367 if (job->fb) in drm_writeback_cleanup_job()
368 drm_framebuffer_put(job->fb); in drm_writeback_cleanup_job()
370 if (job->out_fence) in drm_writeback_cleanup_job()
371 dma_fence_put(job->out_fence); in drm_writeback_cleanup_job()
394 * drm_writeback_signal_completion - Signal the completion of a writeback job
417 spin_lock_irqsave(&wb_connector->job_lock, flags); in drm_writeback_signal_completion()
418 job = list_first_entry_or_null(&wb_connector->job_queue, in drm_writeback_signal_completion()
422 list_del(&job->list_entry); in drm_writeback_signal_completion()
424 spin_unlock_irqrestore(&wb_connector->job_lock, flags); in drm_writeback_signal_completion()
429 out_fence = job->out_fence; in drm_writeback_signal_completion()
435 job->out_fence = NULL; in drm_writeback_signal_completion()
438 INIT_WORK(&job->cleanup_work, cleanup_work); in drm_writeback_signal_completion()
439 queue_work(system_long_wq, &job->cleanup_work); in drm_writeback_signal_completion()
448 if (WARN_ON(wb_connector->base.connector_type != in drm_writeback_get_out_fence()
457 &wb_connector->fence_lock, wb_connector->fence_context, in drm_writeback_get_out_fence()
458 ++wb_connector->fence_seqno); in drm_writeback_get_out_fence()