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

Christian König ckoenig.leichtzumerken at gmail.com
Thu Dec 6 08:21:16 UTC 2018


Am 05.12.18 um 23:53 schrieb Kuehling, Felix:
> 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.

Yeah, I've been running into exactly that issue in the follow up work.

So far I used in_interrupt() to distinct the two cases, but it might be 
more appropriate to explicitly use the ring where an IV occurred instead.

Regards,
Christian.

>
> 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