[PATCH 6/8] drm/amdgpu: Add prescreening stage in IH processing

Alex Deucher alexdeucher at gmail.com
Wed Sep 13 19:42:42 UTC 2017


On Tue, Sep 12, 2017 at 7:05 PM, Felix Kuehling <Felix.Kuehling at amd.com> wrote:
> To filter out high-frequency interrupts that can be safely ignored.
>
> Signed-off-by: Felix Kuehling <Felix.Kuehling at amd.com>

Reviewed-by: Alex Deucher <alexander.deucher at amd.com>

> ---
>  drivers/gpu/drm/amd/amdgpu/amdgpu.h     |  2 ++
>  drivers/gpu/drm/amd/amdgpu/amdgpu_ih.c  |  6 ++++++
>  drivers/gpu/drm/amd/amdgpu/cik_ih.c     | 14 ++++++++++++++
>  drivers/gpu/drm/amd/amdgpu/cz_ih.c      | 14 ++++++++++++++
>  drivers/gpu/drm/amd/amdgpu/iceland_ih.c | 14 ++++++++++++++
>  drivers/gpu/drm/amd/amdgpu/si_ih.c      | 14 ++++++++++++++
>  drivers/gpu/drm/amd/amdgpu/tonga_ih.c   | 14 ++++++++++++++
>  drivers/gpu/drm/amd/amdgpu/vega10_ih.c  | 14 ++++++++++++++
>  8 files changed, 92 insertions(+)
>
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu.h b/drivers/gpu/drm/amd/amdgpu/amdgpu.h
> index c2ff78c..7f17bf5 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu.h
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu.h
> @@ -336,6 +336,7 @@ struct amdgpu_gart_funcs {
>  struct amdgpu_ih_funcs {
>         /* ring read/write ptr handling, called from interrupt context */
>         u32 (*get_wptr)(struct amdgpu_device *adev);
> +       bool (*prescreen_iv)(struct amdgpu_device *adev);
>         void (*decode_iv)(struct amdgpu_device *adev,
>                           struct amdgpu_iv_entry *entry);
>         void (*set_rptr)(struct amdgpu_device *adev);
> @@ -1761,6 +1762,7 @@ amdgpu_get_sdma_instance(struct amdgpu_ring *ring)
>  #define amdgpu_ring_init_cond_exec(r) (r)->funcs->init_cond_exec((r))
>  #define amdgpu_ring_patch_cond_exec(r,o) (r)->funcs->patch_cond_exec((r),(o))
>  #define amdgpu_ih_get_wptr(adev) (adev)->irq.ih_funcs->get_wptr((adev))
> +#define amdgpu_ih_prescreen_iv(adev) (adev)->irq.ih_funcs->prescreen_iv((adev))
>  #define amdgpu_ih_decode_iv(adev, iv) (adev)->irq.ih_funcs->decode_iv((adev), (iv))
>  #define amdgpu_ih_set_rptr(adev) (adev)->irq.ih_funcs->set_rptr((adev))
>  #define amdgpu_display_vblank_get_counter(adev, crtc) (adev)->mode_info.funcs->vblank_get_counter((adev), (crtc))
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ih.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_ih.c
> index 3ab4c65..c834a40 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ih.c
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ih.c
> @@ -169,6 +169,12 @@ int amdgpu_ih_process(struct amdgpu_device *adev)
>         while (adev->irq.ih.rptr != wptr) {
>                 u32 ring_index = adev->irq.ih.rptr >> 2;
>
> +               /* Prescreening of high-frequency interrupts */
> +               if (!amdgpu_ih_prescreen_iv(adev)) {
> +                       adev->irq.ih.rptr &= adev->irq.ih.ptr_mask;
> +                       continue;
> +               }
> +
>                 /* Before dispatching irq to IP blocks, send it to amdkfd */
>                 amdgpu_amdkfd_interrupt(adev,
>                                 (const void *) &adev->irq.ih.ring[ring_index]);
> diff --git a/drivers/gpu/drm/amd/amdgpu/cik_ih.c b/drivers/gpu/drm/amd/amdgpu/cik_ih.c
> index b891843..07d3d89 100644
> --- a/drivers/gpu/drm/amd/amdgpu/cik_ih.c
> +++ b/drivers/gpu/drm/amd/amdgpu/cik_ih.c
> @@ -228,6 +228,19 @@ static u32 cik_ih_get_wptr(struct amdgpu_device *adev)
>   * [127:96] - reserved
>   */
>
> +/**
> + * cik_ih_prescreen_iv - prescreen an interrupt vector
> + *
> + * @adev: amdgpu_device pointer
> + *
> + * Returns true if the interrupt vector should be further processed.
> + */
> +static bool cik_ih_prescreen_iv(struct amdgpu_device *adev)
> +{
> +       /* Process all interrupts */
> +       return true;
> +}
> +
>   /**
>   * cik_ih_decode_iv - decode an interrupt vector
>   *
> @@ -433,6 +446,7 @@ static const struct amd_ip_funcs cik_ih_ip_funcs = {
>
>  static const struct amdgpu_ih_funcs cik_ih_funcs = {
>         .get_wptr = cik_ih_get_wptr,
> +       .prescreen_iv = cik_ih_prescreen_iv,
>         .decode_iv = cik_ih_decode_iv,
>         .set_rptr = cik_ih_set_rptr
>  };
> diff --git a/drivers/gpu/drm/amd/amdgpu/cz_ih.c b/drivers/gpu/drm/amd/amdgpu/cz_ih.c
> index 0c1209c..b6cdf4a 100644
> --- a/drivers/gpu/drm/amd/amdgpu/cz_ih.c
> +++ b/drivers/gpu/drm/amd/amdgpu/cz_ih.c
> @@ -208,6 +208,19 @@ static u32 cz_ih_get_wptr(struct amdgpu_device *adev)
>  }
>
>  /**
> + * cz_ih_prescreen_iv - prescreen an interrupt vector
> + *
> + * @adev: amdgpu_device pointer
> + *
> + * Returns true if the interrupt vector should be further processed.
> + */
> +static bool cz_ih_prescreen_iv(struct amdgpu_device *adev)
> +{
> +       /* Process all interrupts */
> +       return true;
> +}
> +
> +/**
>   * cz_ih_decode_iv - decode an interrupt vector
>   *
>   * @adev: amdgpu_device pointer
> @@ -414,6 +427,7 @@ static const struct amd_ip_funcs cz_ih_ip_funcs = {
>
>  static const struct amdgpu_ih_funcs cz_ih_funcs = {
>         .get_wptr = cz_ih_get_wptr,
> +       .prescreen_iv = cz_ih_prescreen_iv,
>         .decode_iv = cz_ih_decode_iv,
>         .set_rptr = cz_ih_set_rptr
>  };
> diff --git a/drivers/gpu/drm/amd/amdgpu/iceland_ih.c b/drivers/gpu/drm/amd/amdgpu/iceland_ih.c
> index 7a0ea27..65ed6d3 100644
> --- a/drivers/gpu/drm/amd/amdgpu/iceland_ih.c
> +++ b/drivers/gpu/drm/amd/amdgpu/iceland_ih.c
> @@ -208,6 +208,19 @@ static u32 iceland_ih_get_wptr(struct amdgpu_device *adev)
>  }
>
>  /**
> + * iceland_ih_prescreen_iv - prescreen an interrupt vector
> + *
> + * @adev: amdgpu_device pointer
> + *
> + * Returns true if the interrupt vector should be further processed.
> + */
> +static bool iceland_ih_prescreen_iv(struct amdgpu_device *adev)
> +{
> +       /* Process all interrupts */
> +       return true;
> +}
> +
> +/**
>   * iceland_ih_decode_iv - decode an interrupt vector
>   *
>   * @adev: amdgpu_device pointer
> @@ -412,6 +425,7 @@ static const struct amd_ip_funcs iceland_ih_ip_funcs = {
>
>  static const struct amdgpu_ih_funcs iceland_ih_funcs = {
>         .get_wptr = iceland_ih_get_wptr,
> +       .prescreen_iv = iceland_ih_prescreen_iv,
>         .decode_iv = iceland_ih_decode_iv,
>         .set_rptr = iceland_ih_set_rptr
>  };
> diff --git a/drivers/gpu/drm/amd/amdgpu/si_ih.c b/drivers/gpu/drm/amd/amdgpu/si_ih.c
> index ce25e03..588fa4a 100644
> --- a/drivers/gpu/drm/amd/amdgpu/si_ih.c
> +++ b/drivers/gpu/drm/amd/amdgpu/si_ih.c
> @@ -118,6 +118,19 @@ static u32 si_ih_get_wptr(struct amdgpu_device *adev)
>         return (wptr & adev->irq.ih.ptr_mask);
>  }
>
> +/**
> + * si_ih_prescreen_iv - prescreen an interrupt vector
> + *
> + * @adev: amdgpu_device pointer
> + *
> + * Returns true if the interrupt vector should be further processed.
> + */
> +static bool si_ih_prescreen_iv(struct amdgpu_device *adev)
> +{
> +       /* Process all interrupts */
> +       return true;
> +}
> +
>  static void si_ih_decode_iv(struct amdgpu_device *adev,
>                              struct amdgpu_iv_entry *entry)
>  {
> @@ -288,6 +301,7 @@ static const struct amd_ip_funcs si_ih_ip_funcs = {
>
>  static const struct amdgpu_ih_funcs si_ih_funcs = {
>         .get_wptr = si_ih_get_wptr,
> +       .prescreeen_iv = si_ih_prescreen_iv,
>         .decode_iv = si_ih_decode_iv,
>         .set_rptr = si_ih_set_rptr
>  };
> diff --git a/drivers/gpu/drm/amd/amdgpu/tonga_ih.c b/drivers/gpu/drm/amd/amdgpu/tonga_ih.c
> index 923df2c..5ed0069 100644
> --- a/drivers/gpu/drm/amd/amdgpu/tonga_ih.c
> +++ b/drivers/gpu/drm/amd/amdgpu/tonga_ih.c
> @@ -219,6 +219,19 @@ static u32 tonga_ih_get_wptr(struct amdgpu_device *adev)
>  }
>
>  /**
> + * tonga_ih_prescreen_iv - prescreen an interrupt vector
> + *
> + * @adev: amdgpu_device pointer
> + *
> + * Returns true if the interrupt vector should be further processed.
> + */
> +static bool tonga_ih_prescreen_iv(struct amdgpu_device *adev)
> +{
> +       /* Process all interrupts */
> +       return true;
> +}
> +
> +/**
>   * tonga_ih_decode_iv - decode an interrupt vector
>   *
>   * @adev: amdgpu_device pointer
> @@ -478,6 +491,7 @@ static const struct amd_ip_funcs tonga_ih_ip_funcs = {
>
>  static const struct amdgpu_ih_funcs tonga_ih_funcs = {
>         .get_wptr = tonga_ih_get_wptr,
> +       .prescreen_iv = tonga_ih_prescreen_iv,
>         .decode_iv = tonga_ih_decode_iv,
>         .set_rptr = tonga_ih_set_rptr
>  };
> diff --git a/drivers/gpu/drm/amd/amdgpu/vega10_ih.c b/drivers/gpu/drm/amd/amdgpu/vega10_ih.c
> index 56150e8..eda4771 100644
> --- a/drivers/gpu/drm/amd/amdgpu/vega10_ih.c
> +++ b/drivers/gpu/drm/amd/amdgpu/vega10_ih.c
> @@ -227,6 +227,19 @@ static u32 vega10_ih_get_wptr(struct amdgpu_device *adev)
>  }
>
>  /**
> + * vega10_ih_prescreen_iv - prescreen an interrupt vector
> + *
> + * @adev: amdgpu_device pointer
> + *
> + * Returns true if the interrupt vector should be further processed.
> + */
> +static bool vega10_ih_prescreen_iv(struct amdgpu_device *adev)
> +{
> +       /* TODO: Filter known pending page faults */
> +       return true;
> +}
> +
> +/**
>   * vega10_ih_decode_iv - decode an interrupt vector
>   *
>   * @adev: amdgpu_device pointer
> @@ -410,6 +423,7 @@ const struct amd_ip_funcs vega10_ih_ip_funcs = {
>
>  static const struct amdgpu_ih_funcs vega10_ih_funcs = {
>         .get_wptr = vega10_ih_get_wptr,
> +       .prescreen_iv = vega10_ih_prescreen_iv,
>         .decode_iv = vega10_ih_decode_iv,
>         .set_rptr = vega10_ih_set_rptr
>  };
> --
> 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