Lines Matching +full:pixel +full:- +full:engine
1 // SPDX-License-Identifier: GPL-2.0
12 #include <linux/dma-fence.h>
57 * Write-only object property storing a DRM_MODE_OBJECT_FB: it stores the
65 * Immutable blob property to store the supported pixel formats table. The
67 * Userspace can use this blob to find out what pixel formats are supported
68 * by the connector's writeback engine.
73 * writeback is finished. The value should be the address of a 32-bit
80 * out-fence for the commit and use it appropriately.
84 #define fence_to_wb_connector(x) container_of(x->lock, \
93 return wb_connector->base.dev->driver->name; in drm_writeback_fence_get_driver_name()
102 return wb_connector->timeline_name; in drm_writeback_fence_get_timeline_name()
114 if (!dev->mode_config.writeback_fb_id_property) { in create_writeback_properties()
119 return -ENOMEM; in create_writeback_properties()
120 dev->mode_config.writeback_fb_id_property = prop; in create_writeback_properties()
123 if (!dev->mode_config.writeback_pixel_formats_property) { in create_writeback_properties()
129 return -ENOMEM; in create_writeback_properties()
130 dev->mode_config.writeback_pixel_formats_property = prop; in create_writeback_properties()
133 if (!dev->mode_config.writeback_out_fence_ptr_property) { in create_writeback_properties()
138 return -ENOMEM; in create_writeback_properties()
139 dev->mode_config.writeback_out_fence_ptr_property = prop; in create_writeback_properties()
150 * drm_writeback_connector_init - Initialize a writeback connector and its properties
155 * @formats: Array of supported pixel formats for the writeback engine
159 * This function creates the writeback-connector-specific properties if they
180 drm_encoder_helper_add(&wb_connector->encoder, enc_helper_funcs); in drm_writeback_connector_init()
182 wb_connector->encoder.possible_crtcs = possible_crtcs; in drm_writeback_connector_init()
184 ret = drm_encoder_init(dev, &wb_connector->encoder, in drm_writeback_connector_init()
190 ret = drm_writeback_connector_init_with_encoder(dev, wb_connector, &wb_connector->encoder, in drm_writeback_connector_init()
194 drm_encoder_cleanup(&wb_connector->encoder); in drm_writeback_connector_init()
202 if (dev->mode_config.writeback_pixel_formats_property) { in delete_writeback_properties()
203 drm_property_destroy(dev, dev->mode_config.writeback_pixel_formats_property); in delete_writeback_properties()
204 dev->mode_config.writeback_pixel_formats_property = NULL; in delete_writeback_properties()
206 if (dev->mode_config.writeback_out_fence_ptr_property) { in delete_writeback_properties()
207 drm_property_destroy(dev, dev->mode_config.writeback_out_fence_ptr_property); in delete_writeback_properties()
208 dev->mode_config.writeback_out_fence_ptr_property = NULL; in delete_writeback_properties()
210 if (dev->mode_config.writeback_fb_id_property) { in delete_writeback_properties()
211 drm_property_destroy(dev, dev->mode_config.writeback_fb_id_property); in delete_writeback_properties()
212 dev->mode_config.writeback_fb_id_property = NULL; in delete_writeback_properties()
217 * __drm_writeback_connector_init - Initialize a writeback connector with
223 * @formats: Array of supported pixel formats for the writeback engine
226 * This function creates the writeback-connector-specific properties if they
245 struct drm_connector *connector = &wb_connector->base; in __drm_writeback_connector_init()
246 struct drm_mode_config *config = &dev->mode_config; in __drm_writeback_connector_init()
253 connector->interlace_allowed = 0; in __drm_writeback_connector_init()
266 INIT_LIST_HEAD(&wb_connector->job_queue); in __drm_writeback_connector_init()
267 spin_lock_init(&wb_connector->job_lock); in __drm_writeback_connector_init()
269 wb_connector->fence_context = dma_fence_context_alloc(1); in __drm_writeback_connector_init()
270 spin_lock_init(&wb_connector->fence_lock); in __drm_writeback_connector_init()
271 snprintf(wb_connector->timeline_name, in __drm_writeback_connector_init()
272 sizeof(wb_connector->timeline_name), in __drm_writeback_connector_init()
273 "CONNECTOR:%d-%s", connector->base.id, connector->name); in __drm_writeback_connector_init()
275 drm_object_attach_property(&connector->base, in __drm_writeback_connector_init()
276 config->writeback_out_fence_ptr_property, 0); in __drm_writeback_connector_init()
278 drm_object_attach_property(&connector->base, in __drm_writeback_connector_init()
279 config->writeback_fb_id_property, 0); in __drm_writeback_connector_init()
281 drm_object_attach_property(&connector->base, in __drm_writeback_connector_init()
282 config->writeback_pixel_formats_property, in __drm_writeback_connector_init()
283 blob->base.id); in __drm_writeback_connector_init()
284 wb_connector->pixel_formats_blob_ptr = blob; in __drm_writeback_connector_init()
293 * drm_writeback_connector_init_with_encoder - Initialize a writeback connector with
300 * @formats: Array of supported pixel formats for the writeback engine
303 * This function creates the writeback-connector-specific properties if they
327 struct drm_connector *connector = &wb_connector->base; in drm_writeback_connector_init_with_encoder()
345 * drm_writeback_connector_cleanup - Cleanup the writeback connector
361 drm_property_blob_put(wb_connector->pixel_formats_blob_ptr); in drm_writeback_connector_cleanup()
363 spin_lock_irqsave(&wb_connector->job_lock, flags); in drm_writeback_connector_cleanup()
364 list_for_each_entry_safe(pos, n, &wb_connector->job_queue, list_entry) { in drm_writeback_connector_cleanup()
365 list_del(&pos->list_entry); in drm_writeback_connector_cleanup()
368 spin_unlock_irqrestore(&wb_connector->job_lock, flags); in drm_writeback_connector_cleanup()
372 * drmm_writeback_connector_init - Initialize a writeback connector with
379 * @formats: Array of supported pixel formats for the writeback engine
384 * This function creates the writeback-connector-specific properties if they
397 struct drm_connector *connector = &wb_connector->base; in drmm_writeback_connector_init()
422 WARN_ON(conn_state->connector->connector_type != DRM_MODE_CONNECTOR_WRITEBACK); in drm_writeback_set_fb()
424 if (!conn_state->writeback_job) { in drm_writeback_set_fb()
425 conn_state->writeback_job = in drm_writeback_set_fb()
426 kzalloc(sizeof(*conn_state->writeback_job), GFP_KERNEL); in drm_writeback_set_fb()
427 if (!conn_state->writeback_job) in drm_writeback_set_fb()
428 return -ENOMEM; in drm_writeback_set_fb()
430 conn_state->writeback_job->connector = in drm_writeback_set_fb()
431 drm_connector_to_writeback(conn_state->connector); in drm_writeback_set_fb()
434 drm_framebuffer_assign(&conn_state->writeback_job->fb, fb); in drm_writeback_set_fb()
440 struct drm_writeback_connector *connector = job->connector; in drm_writeback_prepare_job()
442 connector->base.helper_private; in drm_writeback_prepare_job()
445 if (funcs->prepare_writeback_job) { in drm_writeback_prepare_job()
446 ret = funcs->prepare_writeback_job(connector, job); in drm_writeback_prepare_job()
451 job->prepared = true; in drm_writeback_prepare_job()
457 * drm_writeback_queue_job - Queue a writeback job for later signalling
463 * @conn_state->writeback_job to NULL, and so no access to the job may be
481 job = conn_state->writeback_job; in drm_writeback_queue_job()
482 conn_state->writeback_job = NULL; in drm_writeback_queue_job()
484 spin_lock_irqsave(&wb_connector->job_lock, flags); in drm_writeback_queue_job()
485 list_add_tail(&job->list_entry, &wb_connector->job_queue); in drm_writeback_queue_job()
486 spin_unlock_irqrestore(&wb_connector->job_lock, flags); in drm_writeback_queue_job()
492 struct drm_writeback_connector *connector = job->connector; in drm_writeback_cleanup_job()
494 connector->base.helper_private; in drm_writeback_cleanup_job()
496 if (job->prepared && funcs->cleanup_writeback_job) in drm_writeback_cleanup_job()
497 funcs->cleanup_writeback_job(connector, job); in drm_writeback_cleanup_job()
499 if (job->fb) in drm_writeback_cleanup_job()
500 drm_framebuffer_put(job->fb); in drm_writeback_cleanup_job()
502 if (job->out_fence) in drm_writeback_cleanup_job()
503 dma_fence_put(job->out_fence); in drm_writeback_cleanup_job()
526 * drm_writeback_signal_completion - Signal the completion of a writeback job
549 spin_lock_irqsave(&wb_connector->job_lock, flags); in drm_writeback_signal_completion()
550 job = list_first_entry_or_null(&wb_connector->job_queue, in drm_writeback_signal_completion()
554 list_del(&job->list_entry); in drm_writeback_signal_completion()
556 spin_unlock_irqrestore(&wb_connector->job_lock, flags); in drm_writeback_signal_completion()
561 out_fence = job->out_fence; in drm_writeback_signal_completion()
567 job->out_fence = NULL; in drm_writeback_signal_completion()
570 INIT_WORK(&job->cleanup_work, cleanup_work); in drm_writeback_signal_completion()
571 queue_work(system_long_wq, &job->cleanup_work); in drm_writeback_signal_completion()
580 if (WARN_ON(wb_connector->base.connector_type != in drm_writeback_get_out_fence()
589 &wb_connector->fence_lock, wb_connector->fence_context, in drm_writeback_get_out_fence()
590 ++wb_connector->fence_seqno); in drm_writeback_get_out_fence()