On Mon, Nov 5, 2018 at 8:41 PM Kuehling, Felix <Felix.Kuehling@xxxxxxx> wrote: > > From: Yong Zhao <Yong.Zhao@xxxxxxx> > > This is a known gfx9 HW issue, and this change can perfectly workaround > the issue. > > Signed-off-by: Yong Zhao <Yong.Zhao@xxxxxxx> > Reviewed-by: Felix Kuehling <Felix.Kuehling@xxxxxxx> > Signed-off-by: Felix Kuehling <Felix.Kuehling@xxxxxxx> Acked-by: Alex Deucher <alexander.deucher@xxxxxxx> > --- > drivers/gpu/drm/amd/amdkfd/kfd_int_process_v9.c | 25 ++++++++++++++++++++++--- > 1 file changed, 22 insertions(+), 3 deletions(-) > > diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_int_process_v9.c b/drivers/gpu/drm/amd/amdkfd/kfd_int_process_v9.c > index 8497864..a85904a 100644 > --- a/drivers/gpu/drm/amd/amdkfd/kfd_int_process_v9.c > +++ b/drivers/gpu/drm/amd/amdkfd/kfd_int_process_v9.c > @@ -23,7 +23,7 @@ > #include "kfd_priv.h" > #include "kfd_events.h" > #include "soc15_int.h" > - > +#include "kfd_device_queue_manager.h" > > static bool event_interrupt_isr_v9(struct kfd_dev *dev, > const uint32_t *ih_ring_entry, > @@ -43,14 +43,33 @@ static bool event_interrupt_isr_v9(struct kfd_dev *dev, > client_id = SOC15_CLIENT_ID_FROM_IH_ENTRY(ih_ring_entry); > pasid = SOC15_PASID_FROM_IH_ENTRY(ih_ring_entry); > > + /* This is a known issue for gfx9. Under non HWS, pasid is not set > + * in the interrupt payload, so we need to find out the pasid on our > + * own. > + */ > + if (!pasid && dev->dqm->sched_policy == KFD_SCHED_POLICY_NO_HWS) { > + const uint32_t pasid_mask = 0xffff; > + > + *patched_flag = true; > + memcpy(patched_ihre, ih_ring_entry, > + dev->device_info->ih_ring_entry_size); > + > + pasid = dev->kfd2kgd->get_atc_vmid_pasid_mapping_pasid( > + dev->kgd, vmid); > + > + /* Patch the pasid field */ > + patched_ihre[3] = cpu_to_le32((le32_to_cpu(patched_ihre[3]) > + & ~pasid_mask) | pasid); > + } > + > pr_debug("client id 0x%x, source id %d, vmid %d, pasid 0x%x. raw data:\n", > client_id, source_id, vmid, pasid); > pr_debug("%8X, %8X, %8X, %8X, %8X, %8X, %8X, %8X.\n", > data[0], data[1], data[2], data[3], > data[4], data[5], data[6], data[7]); > > - /* If there is no valid PASID, it's likely a firmware bug */ > - if (WARN_ONCE(pasid == 0, "FW bug: No PASID in KFD interrupt")) > + /* If there is no valid PASID, it's likely a bug */ > + if (WARN_ONCE(pasid == 0, "Bug: No PASID in KFD interrupt")) > return 0; > > /* Interrupt types we care about: various signals and faults. > -- > 2.7.4 > > _______________________________________________ > amd-gfx mailing list > amd-gfx@xxxxxxxxxxxxxxxxxxxxx > https://lists.freedesktop.org/mailman/listinfo/amd-gfx _______________________________________________ amd-gfx mailing list amd-gfx@xxxxxxxxxxxxxxxxxxxxx https://lists.freedesktop.org/mailman/listinfo/amd-gfx