[PATCH 4/9] drm/amdkfd: Workaround PASID missing in gfx9 interrupt payload under non HWS
Alex Deucher
alexdeucher at gmail.com
Tue Nov 6 21:34:43 UTC 2018
On Mon, Nov 5, 2018 at 8:41 PM Kuehling, Felix <Felix.Kuehling at amd.com> wrote:
>
> From: Yong Zhao <Yong.Zhao at amd.com>
>
> This is a known gfx9 HW issue, and this change can perfectly workaround
> the issue.
>
> Signed-off-by: Yong Zhao <Yong.Zhao at amd.com>
> Reviewed-by: Felix Kuehling <Felix.Kuehling at amd.com>
> Signed-off-by: Felix Kuehling <Felix.Kuehling at amd.com>
Acked-by: Alex Deucher <alexander.deucher at amd.com>
> ---
> 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 at lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/amd-gfx
More information about the amd-gfx
mailing list