[PATCH 08/10] drm/amdgpu: add support for processing IH ring 1 & 2

Kuehling, Felix Felix.Kuehling at amd.com
Wed Dec 5 22:53:24 UTC 2018


Depending on the interrupt ring, the IRQ dispatch and processing
functions will run in interrupt context or in a worker thread.

Is there a way for the processing functions to find out which context
it's running in? That may influence decisions whether to process
interrupts in the same thread or schedule another worker.

Regards,
  Felix

On 2018-12-05 4:15 a.m., Christian König wrote:
> Previously we only added the ring buffer memory, now add the handling as
> well.
>
> Signed-off-by: Christian König <christian.koenig at amd.com>
> ---
>  drivers/gpu/drm/amd/amdgpu/amdgpu_irq.c | 33 +++++++++++++++++++++++++
>  drivers/gpu/drm/amd/amdgpu/amdgpu_irq.h |  4 ++-
>  2 files changed, 36 insertions(+), 1 deletion(-)
>
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_irq.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_irq.c
> index b8e543e23166..8bfb3dab46f7 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_irq.c
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_irq.c
> @@ -176,6 +176,36 @@ irqreturn_t amdgpu_irq_handler(int irq, void *arg)
>  	return ret;
>  }
>  
> +/**
> + * amdgpu_irq_handle_ih1 - kick of processing for IH1
> + *
> + * @work: work structure in struct amdgpu_irq
> + *
> + * Kick of processing IH ring 1.
> + */
> +static void amdgpu_irq_handle_ih1(struct work_struct *work)
> +{
> +	struct amdgpu_device *adev = container_of(work, struct amdgpu_device,
> +						  irq.ih1_work);
> +
> +	amdgpu_ih_process(adev, &adev->irq.ih1, amdgpu_irq_callback);
> +}
> +
> +/**
> + * amdgpu_irq_handle_ih2 - kick of processing for IH2
> + *
> + * @work: work structure in struct amdgpu_irq
> + *
> + * Kick of processing IH ring 2.
> + */
> +static void amdgpu_irq_handle_ih2(struct work_struct *work)
> +{
> +	struct amdgpu_device *adev = container_of(work, struct amdgpu_device,
> +						  irq.ih2_work);
> +
> +	amdgpu_ih_process(adev, &adev->irq.ih2, amdgpu_irq_callback);
> +}
> +
>  /**
>   * amdgpu_msi_ok - check whether MSI functionality is enabled
>   *
> @@ -240,6 +270,9 @@ int amdgpu_irq_init(struct amdgpu_device *adev)
>  				amdgpu_hotplug_work_func);
>  	}
>  
> +	INIT_WORK(&adev->irq.ih1_work, amdgpu_irq_handle_ih1);
> +	INIT_WORK(&adev->irq.ih2_work, amdgpu_irq_handle_ih2);
> +
>  	adev->irq.installed = true;
>  	r = drm_irq_install(adev->ddev, adev->ddev->pdev->irq);
>  	if (r) {
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_irq.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_irq.h
> index 7e06fa64321a..c27decfda494 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_irq.h
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_irq.h
> @@ -89,7 +89,9 @@ struct amdgpu_irq {
>  
>  	/* interrupt rings */
>  	struct amdgpu_ih_ring		ih, ih1, ih2;
> -	const struct amdgpu_ih_funcs	*ih_funcs;
> +	const struct amdgpu_ih_funcs    *ih_funcs;
> +	struct work_struct		ih1_work, ih2_work;
> +	struct amdgpu_irq_src		self_irq;
>  
>  	/* gen irq stuff */
>  	struct irq_domain		*domain; /* GPU irq controller domain */


More information about the amd-gfx mailing list