[PATCH 09/10] drm/amdgpu: add support for self irq on Vega10

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


Am 06.12.18 um 00:25 schrieb Kuehling, Felix:
> On 2018-12-05 4:15 a.m., Christian König wrote:
>> This finally enables processing of ring 1 & 2.
>>
>> Signed-off-by: Christian König <christian.koenig at amd.com>
>> ---
>>   drivers/gpu/drm/amd/amdgpu/vega10_ih.c | 68 ++++++++++++++++++++++++--
>>   1 file changed, 63 insertions(+), 5 deletions(-)
>>
>> diff --git a/drivers/gpu/drm/amd/amdgpu/vega10_ih.c b/drivers/gpu/drm/amd/amdgpu/vega10_ih.c
>> index 22638192d7dd..4a753e40a837 100644
>> --- a/drivers/gpu/drm/amd/amdgpu/vega10_ih.c
>> +++ b/drivers/gpu/drm/amd/amdgpu/vega10_ih.c
>> @@ -272,7 +272,7 @@ static void vega10_ih_irq_disable(struct amdgpu_device *adev)
>>   static u32 vega10_ih_get_wptr(struct amdgpu_device *adev,
>>   			      struct amdgpu_ih_ring *ih)
>>   {
>> -	u32 wptr, tmp;
>> +	u32 wptr, reg, tmp;
>>   
>>   	wptr = le32_to_cpu(*ih->wptr_cpu);
>>   
>> @@ -288,9 +288,18 @@ static u32 vega10_ih_get_wptr(struct amdgpu_device *adev,
>>   			 wptr, ih->rptr, tmp);
>>   		ih->rptr = tmp;
>>   
>> -		tmp = RREG32_NO_KIQ(SOC15_REG_OFFSET(OSSSYS, 0, mmIH_RB_CNTL));
>> +		if (ih == &adev->irq.ih)
>> +			reg = SOC15_REG_OFFSET(OSSSYS, 0, mmIH_RB_CNTL);
>> +		else if (ih == &adev->irq.ih1)
>> +			reg = SOC15_REG_OFFSET(OSSSYS, 0, mmIH_RB_CNTL);
>> +		else if (ih == &adev->irq.ih2)
>> +			reg = SOC15_REG_OFFSET(OSSSYS, 0, mmIH_RB_CNTL);
> All three look the same to me. Did you mean to use mmIH_RB_CNTL_RING1/2
> for ih1 and ih2 respectively?

Thanks and yes that looks like a copy&paste error to me.

Going to fix that,
Christian.

>
> Regards,
>    Felix
>
>
>> +		else
>> +			BUG();
>> +
>> +		tmp = RREG32_NO_KIQ(reg);
>>   		tmp = REG_SET_FIELD(tmp, IH_RB_CNTL, WPTR_OVERFLOW_CLEAR, 1);
>> -		WREG32_NO_KIQ(SOC15_REG_OFFSET(OSSSYS, 0, mmIH_RB_CNTL), tmp);
>> +		WREG32_NO_KIQ(reg, tmp);
>>   	}
>>   	return (wptr & ih->ptr_mask);
>>   }
>> @@ -352,9 +361,52 @@ static void vega10_ih_set_rptr(struct amdgpu_device *adev,
>>   		/* XXX check if swapping is necessary on BE */
>>   		*ih->rptr_cpu = ih->rptr;
>>   		WDOORBELL32(ih->doorbell_index, ih->rptr);
>> -	} else {
>> +	} else if (ih == &adev->irq.ih) {
>>   		WREG32_SOC15(OSSSYS, 0, mmIH_RB_RPTR, ih->rptr);
>> +	} else if (ih == &adev->irq.ih1) {
>> +		WREG32_SOC15(OSSSYS, 0, mmIH_RB_RPTR_RING1, ih->rptr);
>> +	} else if (ih == &adev->irq.ih2) {
>> +		WREG32_SOC15(OSSSYS, 0, mmIH_RB_RPTR_RING2, ih->rptr);
>> +	}
>> +}
>> +
>> +/**
>> + * vega10_ih_self_irq - dispatch work for ring 1 and 2
>> + *
>> + * @adev: amdgpu_device pointer
>> + * @source: irq source
>> + * @entry: IV with WPTR update
>> + *
>> + * Update the WPTR from the IV and schedule work to handle the entries.
>> + */
>> +static int vega10_ih_self_irq(struct amdgpu_device *adev,
>> +			      struct amdgpu_irq_src *source,
>> +			      struct amdgpu_iv_entry *entry)
>> +{
>> +	uint32_t wptr = cpu_to_le32(entry->src_data[0]);
>> +
>> +	switch (entry->ring_id) {
>> +	case 1:
>> +		*adev->irq.ih1.wptr_cpu = wptr;
>> +		schedule_work(&adev->irq.ih1_work);
>> +		break;
>> +	case 2:
>> +		*adev->irq.ih2.wptr_cpu = wptr;
>> +		schedule_work(&adev->irq.ih2_work);
>> +		break;
>> +	default: break;
>>   	}
>> +	return 0;
>> +}
>> +
>> +static const struct amdgpu_irq_src_funcs vega10_ih_self_irq_funcs = {
>> +	.process = vega10_ih_self_irq,
>> +};
>> +
>> +static void vega10_ih_set_self_irq_funcs(struct amdgpu_device *adev)
>> +{
>> +	adev->irq.self_irq.num_types = 0;
>> +	adev->irq.self_irq.funcs = &vega10_ih_self_irq_funcs;
>>   }
>>   
>>   static int vega10_ih_early_init(void *handle)
>> @@ -362,13 +414,19 @@ static int vega10_ih_early_init(void *handle)
>>   	struct amdgpu_device *adev = (struct amdgpu_device *)handle;
>>   
>>   	vega10_ih_set_interrupt_funcs(adev);
>> +	vega10_ih_set_self_irq_funcs(adev);
>>   	return 0;
>>   }
>>   
>>   static int vega10_ih_sw_init(void *handle)
>>   {
>> -	int r;
>>   	struct amdgpu_device *adev = (struct amdgpu_device *)handle;
>> +	int r;
>> +
>> +	r = amdgpu_irq_add_id(adev, SOC15_IH_CLIENTID_IH, 0,
>> +			      &adev->irq.self_irq);
>> +	if (r)
>> +		return r;
>>   
>>   	r = amdgpu_ih_ring_init(adev, &adev->irq.ih, 256 * 1024, true);
>>   	if (r)



More information about the amd-gfx mailing list