* @ddev: DRM base driver structure
* @display_indexes_num: Max number of display streams supported
* @irq_handler_list_table_lock: Synchronizes access to IRQ tables
+ * @irq_wq: Dedicated high-priority unbound workqueue for deferred IRQ work
+ * @vmin_vmax_wq: Dedicated unbound workqueue for deferred vmin/vmax updates
* @backlight_dev: Backlight control device
* @backlight_link: Link on which to control backlight
* @backlight_caps: Capabilities of the backlight device
dmub_outbox_params[1];
spinlock_t irq_handler_list_table_lock;
+ struct workqueue_struct *irq_wq;
+ struct workqueue_struct *vmin_vmax_wq;
struct backlight_device *backlight_dev[AMDGPU_DM_MAX_NUM_EDP];
spin_lock_init(&adev->dm.irq_handler_list_table_lock);
+ adev->dm.irq_wq = alloc_workqueue("amdgpu_dm_irq",
+ WQ_UNBOUND | WQ_HIGHPRI, 0);
+
+ if (!adev->dm.irq_wq)
+ return -ENOMEM;
+
+ adev->dm.vmin_vmax_wq = alloc_workqueue("amdgpu_dm_vmin_vmax",
+ WQ_UNBOUND, 0);
+
+ if (!adev->dm.vmin_vmax_wq) {
+ destroy_workqueue(adev->dm.irq_wq);
+ adev->dm.irq_wq = NULL;
+ return -ENOMEM;
+ }
+
for (src = 0; src < DAL_IRQ_SOURCES_NUMBER; src++) {
/* low context handler list init */
lh = &adev->dm.irq_handler_list_low_tab[src];
list_del(&handler->list);
kfree(handler);
}
+
+ if (adev->dm.vmin_vmax_wq) {
+ destroy_workqueue(adev->dm.vmin_vmax_wq);
+ adev->dm.vmin_vmax_wq = NULL;
+ }
+
+ if (adev->dm.irq_wq) {
+ destroy_workqueue(adev->dm.irq_wq);
+ adev->dm.irq_wq = NULL;
+ }
}
EXPORT_IF_KUNIT(amdgpu_dm_irq_fini);
goto out_unlock;
list_for_each_entry(handler_data, handler_list, list) {
- if (queue_work(system_highpri_wq, &handler_data->work)) {
+ if (queue_work(adev->dm.irq_wq, &handler_data->work)) {
work_queued = true;
break;
}
INIT_WORK(&handler_data_add->work, dm_irq_work_func);
- if (queue_work(system_highpri_wq, &handler_data_add->work))
+ if (queue_work(adev->dm.irq_wq, &handler_data_add->work))
DRM_DEBUG("Queued work for handling interrupt from "
"display for IRQ source %d\n",
irq_source);
offload_work->stream = stream;
offload_work->adjust = adjust_copy;
- queue_work(system_percpu_wq, &offload_work->work);
+ queue_work(adev->dm.vmin_vmax_wq, &offload_work->work);
}
STATIC_IFN_KUNIT void dm_vupdate_high_irq(void *interrupt_params)