--- a/sys/dev/drm/amd/amdgpu/amdgpu_irq.c +++ b/sys/dev/drm/amd/amdgpu/amdgpu_irq.c @@ -433,6 +433,13 @@ return; } + if (!src->funcs->process) { + /* NB: optional callback - e.g. dce_virtual crtc_irq */ + DRM_DEBUG("Unprocessed interrupt src_id: %d\n", + src_id); + return; + } + r = src->funcs->process(adev, src, entry); if (r) DRM_ERROR("error processing interrupt (%d)\n", r); @@ -464,6 +471,13 @@ else state = AMDGPU_IRQ_STATE_DISABLE; + /* NB: optional callback - not every registered source has a + * .set (cf. amdgpu_irq_get/put/amdgpu_irq_disable_all) */ + if (!src->funcs->set) { + spin_unlock_irqrestore(&adev->irq.lock, irqflags); + return -EINVAL; + } + r = src->funcs->set(adev, src, type, state); spin_unlock_irqrestore(&adev->irq.lock, irqflags); return r;