[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