Patches 1-3 are Reviewed-by: Felix Kuehling <Felix.Kuehling@xxxxxxx> I applied all 10 patches and tested them with kfdtest on Fiji and Vega10. It seems to not break anything obvious. I think I found a problem in patch 9 and have a question about patch 8 regarding the context in which interrupt processing functions would run. I sent separate emails for both. Regards, Felix On 2018-12-05 4:15 a.m., Christian König wrote: > This allows us to filter out VM faults in the GMC code. > > v2: don't filter out all faults > v3: fix copy&paste typo, send all IV to the KFD, don't change message level > > Signed-off-by: Christian König <christian.koenig@xxxxxxx> > --- > drivers/gpu/drm/amd/amdgpu/amdgpu_irq.c | 38 +++++++++++-------------- > 1 file changed, 17 insertions(+), 21 deletions(-) > > diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_irq.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_irq.c > index 6b6524f04ce0..79b6f456f2c5 100644 > --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_irq.c > +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_irq.c > @@ -149,9 +149,6 @@ static void amdgpu_irq_callback(struct amdgpu_device *adev, > if (!amdgpu_ih_prescreen_iv(adev)) > return; > > - /* Before dispatching irq to IP blocks, send it to amdkfd */ > - amdgpu_amdkfd_interrupt(adev, (const void *) &ih->ring[ring_index]); > - > entry.iv_entry = (const uint32_t *)&ih->ring[ring_index]; > amdgpu_ih_decode_iv(adev, &entry); > > @@ -371,39 +368,38 @@ void amdgpu_irq_dispatch(struct amdgpu_device *adev, > unsigned client_id = entry->client_id; > unsigned src_id = entry->src_id; > struct amdgpu_irq_src *src; > + bool handled = false; > int r; > > trace_amdgpu_iv(entry); > > if (client_id >= AMDGPU_IRQ_CLIENTID_MAX) { > DRM_DEBUG("Invalid client_id in IV: %d\n", client_id); > - return; > - } > > - if (src_id >= AMDGPU_MAX_IRQ_SRC_ID) { > + } else if (src_id >= AMDGPU_MAX_IRQ_SRC_ID) { > DRM_DEBUG("Invalid src_id in IV: %d\n", src_id); > - return; > - } > > - if (adev->irq.virq[src_id]) { > + } else if (adev->irq.virq[src_id]) { > generic_handle_irq(irq_find_mapping(adev->irq.domain, src_id)); > - } else { > - if (!adev->irq.client[client_id].sources) { > - DRM_DEBUG("Unregistered interrupt client_id: %d src_id: %d\n", > - client_id, src_id); > - return; > - } > > - src = adev->irq.client[client_id].sources[src_id]; > - if (!src) { > - DRM_DEBUG("Unhandled interrupt src_id: %d\n", src_id); > - return; > - } > + } else if (!adev->irq.client[client_id].sources) { > + DRM_DEBUG("Unregistered interrupt client_id: %d src_id: %d\n", > + client_id, src_id); > > + } else if ((src = adev->irq.client[client_id].sources[src_id])) { > r = src->funcs->process(adev, src, entry); > - if (r) > + if (r < 0) > DRM_ERROR("error processing interrupt (%d)\n", r); > + else if (r) > + handled = true; > + > + } else { > + DRM_DEBUG("Unhandled interrupt src_id: %d\n", src_id); > } > + > + /* Send it to amdkfd as well if it isn't already handled */ > + if (!handled) > + amdgpu_amdkfd_interrupt(adev, entry->iv_entry); > } > > /** _______________________________________________ amd-gfx mailing list amd-gfx@xxxxxxxxxxxxxxxxxxxxx https://lists.freedesktop.org/mailman/listinfo/amd-gfx