Merge branch 'linus-4.14-rc4-acp-prereq' of git://people.freedesktop.org/~agd5f/linux...
[sfrench/cifs-2.6.git] / drivers / gpu / drm / amd / amdkfd / cik_event_interrupt.c
index 211fc48697fa4b2be84e81e31b2e1c9a33fa975c..3d5ccb3755d4f8d1209524dda440cf6aafb4bced 100644 (file)
@@ -36,6 +36,7 @@ static bool cik_event_interrupt_isr(struct kfd_dev *dev,
        /* Do not process in ISR, just request it to be forwarded to WQ. */
        return (pasid != 0) &&
                (ihre->source_id == CIK_INTSRC_CP_END_OF_PIPE ||
+               ihre->source_id == CIK_INTSRC_SDMA_TRAP ||
                ihre->source_id == CIK_INTSRC_SQ_INTERRUPT_MSG ||
                ihre->source_id == CIK_INTSRC_CP_BAD_OPCODE);
 }
@@ -46,6 +47,7 @@ static void cik_event_interrupt_wq(struct kfd_dev *dev,
        unsigned int pasid;
        const struct cik_ih_ring_entry *ihre =
                        (const struct cik_ih_ring_entry *)ih_ring_entry;
+       uint32_t context_id = ihre->data & 0xfffffff;
 
        pasid = (ihre->ring_id & 0xffff0000) >> 16;
 
@@ -53,9 +55,11 @@ static void cik_event_interrupt_wq(struct kfd_dev *dev,
                return;
 
        if (ihre->source_id == CIK_INTSRC_CP_END_OF_PIPE)
-               kfd_signal_event_interrupt(pasid, 0, 0);
+               kfd_signal_event_interrupt(pasid, context_id, 28);
+       else if (ihre->source_id == CIK_INTSRC_SDMA_TRAP)
+               kfd_signal_event_interrupt(pasid, context_id, 28);
        else if (ihre->source_id == CIK_INTSRC_SQ_INTERRUPT_MSG)
-               kfd_signal_event_interrupt(pasid, ihre->data & 0xFF, 8);
+               kfd_signal_event_interrupt(pasid, context_id & 0xff, 8);
        else if (ihre->source_id == CIK_INTSRC_CP_BAD_OPCODE)
                kfd_signal_hw_exception_event(pasid);
 }