[PATCH 2/2] drm/amdgpu: disable vm fault irq during prt accessed
zhoucm1
zhoucm1 at amd.com
Thu Jan 3 09:02:02 UTC 2019
need dummy page for that?
-David
On 2019年01月03日 17:01, Christian König wrote:
> NAK, the problem is not the interrupt.
>
> E.g. causing faults by accessing unmapped pages with the SDMA can
> still crash the MC.
>
> The key point is that SDMA can't work with PRT tiles on pre-gmc9 and
> we need to forbid access on the application side.
>
> Regards,
> Christian.
>
> Am 03.01.19 um 09:54 schrieb Chunming Zhou:
>> For pre-gmc9, UMD can only access unmapped PRT tile from CB/TC without
>> firing VM fault. Kernel would still receive the VM fault interrupt
>> and output the error message if SDMA is the mc_client.
>> GMC9 don't need the same since it handle the PRT in different way.
>> We cannot just skip message for SDMA, as Christian pointed, VM fault
>> could crash mc block, so we disable vm fault irq during prt range is
>> accesed.
>> The nagative is normal vm fault could be ignored during that peroid
>> without enabling vm_debug kernel parameter.
>>
>> Change-Id: Ic3c62393768eca90e3e45eaf81e7f26f2e91de84
>> Signed-off-by: Chunming Zhou <david1.zhou at amd.com>
>> ---
>> drivers/gpu/drm/amd/amdgpu/gmc_v6_0.c | 6 ++++++
>> drivers/gpu/drm/amd/amdgpu/gmc_v7_0.c | 6 ++++++
>> drivers/gpu/drm/amd/amdgpu/gmc_v8_0.c | 6 ++++++
>> 3 files changed, 18 insertions(+)
>>
>> diff --git a/drivers/gpu/drm/amd/amdgpu/gmc_v6_0.c
>> b/drivers/gpu/drm/amd/amdgpu/gmc_v6_0.c
>> index dae73f6768c2..175c4b319559 100644
>> --- a/drivers/gpu/drm/amd/amdgpu/gmc_v6_0.c
>> +++ b/drivers/gpu/drm/amd/amdgpu/gmc_v6_0.c
>> @@ -486,6 +486,10 @@ static void gmc_v6_0_set_prt(struct
>> amdgpu_device *adev, bool enable)
>> WREG32(mmVM_PRT_APERTURE1_HIGH_ADDR, high);
>> WREG32(mmVM_PRT_APERTURE2_HIGH_ADDR, high);
>> WREG32(mmVM_PRT_APERTURE3_HIGH_ADDR, high);
>> + /* Note: when vm_debug enabled, vm fault from SDMAx accessing
>> + * PRT range is normal. */
>> + if (!amdgpu_vm_debug)
>> + amdgpu_irq_put(adev, &adev->gmc.vm_fault, 0);
>> } else {
>> WREG32(mmVM_PRT_APERTURE0_LOW_ADDR, 0xfffffff);
>> WREG32(mmVM_PRT_APERTURE1_LOW_ADDR, 0xfffffff);
>> @@ -495,6 +499,8 @@ static void gmc_v6_0_set_prt(struct amdgpu_device
>> *adev, bool enable)
>> WREG32(mmVM_PRT_APERTURE1_HIGH_ADDR, 0x0);
>> WREG32(mmVM_PRT_APERTURE2_HIGH_ADDR, 0x0);
>> WREG32(mmVM_PRT_APERTURE3_HIGH_ADDR, 0x0);
>> + if (!amdgpu_vm_debug)
>> + amdgpu_irq_get(adev, &adev->gmc.vm_fault, 0);
>> }
>> }
>> diff --git a/drivers/gpu/drm/amd/amdgpu/gmc_v7_0.c
>> b/drivers/gpu/drm/amd/amdgpu/gmc_v7_0.c
>> index 5bdeb358bfb5..a4d6d219f4e8 100644
>> --- a/drivers/gpu/drm/amd/amdgpu/gmc_v7_0.c
>> +++ b/drivers/gpu/drm/amd/amdgpu/gmc_v7_0.c
>> @@ -582,6 +582,10 @@ static void gmc_v7_0_set_prt(struct
>> amdgpu_device *adev, bool enable)
>> WREG32(mmVM_PRT_APERTURE1_HIGH_ADDR, high);
>> WREG32(mmVM_PRT_APERTURE2_HIGH_ADDR, high);
>> WREG32(mmVM_PRT_APERTURE3_HIGH_ADDR, high);
>> + /* Note: when vm_debug enabled, vm fault from SDMAx accessing
>> + * PRT range is normal. */
>> + if (!amdgpu_vm_debug)
>> + amdgpu_irq_put(adev, &adev->gmc.vm_fault, 0);
>> } else {
>> WREG32(mmVM_PRT_APERTURE0_LOW_ADDR, 0xfffffff);
>> WREG32(mmVM_PRT_APERTURE1_LOW_ADDR, 0xfffffff);
>> @@ -591,6 +595,8 @@ static void gmc_v7_0_set_prt(struct amdgpu_device
>> *adev, bool enable)
>> WREG32(mmVM_PRT_APERTURE1_HIGH_ADDR, 0x0);
>> WREG32(mmVM_PRT_APERTURE2_HIGH_ADDR, 0x0);
>> WREG32(mmVM_PRT_APERTURE3_HIGH_ADDR, 0x0);
>> + if (!amdgpu_vm_debug)
>> + amdgpu_irq_get(adev, &adev->gmc.vm_fault, 0);
>> }
>> }
>> diff --git a/drivers/gpu/drm/amd/amdgpu/gmc_v8_0.c
>> b/drivers/gpu/drm/amd/amdgpu/gmc_v8_0.c
>> index 5150ab614eaa..eea2eb7fc2f5 100644
>> --- a/drivers/gpu/drm/amd/amdgpu/gmc_v8_0.c
>> +++ b/drivers/gpu/drm/amd/amdgpu/gmc_v8_0.c
>> @@ -808,6 +808,10 @@ static void gmc_v8_0_set_prt(struct
>> amdgpu_device *adev, bool enable)
>> WREG32(mmVM_PRT_APERTURE1_HIGH_ADDR, high);
>> WREG32(mmVM_PRT_APERTURE2_HIGH_ADDR, high);
>> WREG32(mmVM_PRT_APERTURE3_HIGH_ADDR, high);
>> + /* Note: when vm_debug enabled, vm fault from SDMAx accessing
>> + * PRT range is normal. */
>> + if (!amdgpu_vm_debug)
>> + amdgpu_irq_put(adev, &adev->gmc.vm_fault, 0);
>> } else {
>> WREG32(mmVM_PRT_APERTURE0_LOW_ADDR, 0xfffffff);
>> WREG32(mmVM_PRT_APERTURE1_LOW_ADDR, 0xfffffff);
>> @@ -817,6 +821,8 @@ static void gmc_v8_0_set_prt(struct amdgpu_device
>> *adev, bool enable)
>> WREG32(mmVM_PRT_APERTURE1_HIGH_ADDR, 0x0);
>> WREG32(mmVM_PRT_APERTURE2_HIGH_ADDR, 0x0);
>> WREG32(mmVM_PRT_APERTURE3_HIGH_ADDR, 0x0);
>> + if (!amdgpu_vm_debug)
>> + amdgpu_irq_get(adev, &adev->gmc.vm_fault, 0);
>> }
>> }
>
More information about the amd-gfx
mailing list