[PATCH] drm/amdgpu: add automatic per asic settings for gart_size

Christian König deathsimple at vodafone.de
Tue Aug 22 08:48:54 UTC 2017


Am 21.08.2017 um 22:48 schrieb Felix Kuehling:
> On 2017-08-21 12:00 PM, Alex Deucher wrote:
>> We need a larger gart for asics that do not support GPUVM on all
>> engines (e.g., MM) to make sure we have enough space for all
>> gtt buffers in physical mode.  Change the default size based on
>> the asic type.
>>
>> Signed-off-by: Alex Deucher <alexander.deucher at amd.com>
>> ---
>>   drivers/gpu/drm/amd/amdgpu/amdgpu.h        |  2 +-
>>   drivers/gpu/drm/amd/amdgpu/amdgpu_device.c |  4 ++--
>>   drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c    |  4 ++--
>>   drivers/gpu/drm/amd/amdgpu/amdgpu_gart.c   | 16 +++++++++++++++-
>>   4 files changed, 20 insertions(+), 6 deletions(-)
>>
>> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu.h b/drivers/gpu/drm/amd/amdgpu/amdgpu.h
>> index ffb98bb..97d50cd 100644
>> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu.h
>> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu.h
>> @@ -77,7 +77,7 @@
>>   extern int amdgpu_modeset;
>>   extern int amdgpu_vram_limit;
>>   extern int amdgpu_vis_vram_limit;
>> -extern unsigned amdgpu_gart_size;
>> +extern int amdgpu_gart_size;
>>   extern int amdgpu_gtt_size;
>>   extern int amdgpu_moverate;
>>   extern int amdgpu_benchmarking;
>> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
>> index 1e66eda8..3c062a7 100644
>> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
>> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
>> @@ -1063,11 +1063,11 @@ static void amdgpu_check_arguments(struct amdgpu_device *adev)
>>   		amdgpu_sched_jobs = roundup_pow_of_two(amdgpu_sched_jobs);
>>   	}
>>   
>> -	if (amdgpu_gart_size < 32) {
>> +	if (amdgpu_gart_size != -1 && amdgpu_gart_size < 32) {
>>   		/* gart size must be greater or equal to 32M */
>>   		dev_warn(adev->dev, "gart size (%d) too small\n",
>>   			 amdgpu_gart_size);
>> -		amdgpu_gart_size = 32;
>> +		amdgpu_gart_size = -1;
>>   	}
>>   
>>   	if (amdgpu_gtt_size != -1 && amdgpu_gtt_size < 32) {
>> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c
>> index 3eafe39..3f2143d 100644
>> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c
>> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c
>> @@ -76,7 +76,7 @@
>>   
>>   int amdgpu_vram_limit = 0;
>>   int amdgpu_vis_vram_limit = 0;
>> -unsigned amdgpu_gart_size = 256;
>> +int amdgpu_gart_size = -1; /* auto */
>>   int amdgpu_gtt_size = -1; /* auto */
>>   int amdgpu_moverate = -1; /* auto */
>>   int amdgpu_benchmarking = 0;
>> @@ -129,7 +129,7 @@ module_param_named(vramlimit, amdgpu_vram_limit, int, 0600);
>>   MODULE_PARM_DESC(vis_vramlimit, "Restrict visible VRAM for testing, in megabytes");
>>   module_param_named(vis_vramlimit, amdgpu_vis_vram_limit, int, 0444);
>>   
>> -MODULE_PARM_DESC(gartsize, "Size of PCIE/IGP gart to setup in megabytes (32, 64, etc.)");
>> +MODULE_PARM_DESC(gartsize, "Size of gart to setup in megabytes (32, 64, etc., -1=auto)");
> I would spell GART in capitals here.
>
>>   module_param_named(gartsize, amdgpu_gart_size, uint, 0600);
>>   
>>   MODULE_PARM_DESC(gttsize, "Size of the GTT domain in megabytes (-1 = auto)");
>> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_gart.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_gart.c
>> index 94c1e2e..b9b9f68 100644
>> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_gart.c
>> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_gart.c
>> @@ -65,7 +65,21 @@
>>    */
>>   void amdgpu_gart_set_defaults(struct amdgpu_device *adev)
>>   {
>> -	adev->mc.gart_size = (uint64_t)amdgpu_gart_size << 20;
>> +	u64 gart_size;
>> +
>> +	if (amdgpu_gart_size == -1) {
>> +		/* make the GART larger for chips that
>> +		 * dont' support VM for all rings
>> +		 */
>> +		if (adev->asic_type <= CHIP_STONEY)
> I guess that means Polaris10 and later support VM for multimedia? I
> needed to go look at amd_shared.h to find that out. It would be more
> obvious like this:
>
>      if (adev->asic_type < CHIP_POLARIS10) ...
>
> Other than that, this patch is Reviewed-by: Felix Kuehling
> <Felix.Kuehling at amd.com>

Yeah, the code in uvd_v6_0.c to decide what to do is:
> static void uvd_v6_0_set_ring_funcs(struct amdgpu_device *adev)
> {
>         if (adev->asic_type >= CHIP_POLARIS10) {
>                 adev->uvd.ring.funcs = &uvd_v6_0_ring_vm_funcs;
>                 DRM_INFO("UVD is enabled in VM mode\n");
>         } else {
>                 adev->uvd.ring.funcs = &uvd_v6_0_ring_phys_funcs;
>                 DRM_INFO("UVD is enabled in physical mode\n");
>         }
> }

Not 100% sure about VCE, but Monk also pointed out internally that we 
should put that in a single place.

A check in amdgpu_uvd.h and one in amdgpu_vce.h sound reasonable to me.

Christian.

>
> Regards,
>    Felix
>
>> +			gart_size = 1024;
>> +		else
>> +			gart_size = 256;
>> +	} else {
>> +		gart_size = amdgpu_gart_size;
>> +	}
>> +
>> +	adev->mc.gart_size = gart_size << 20;
>>   }
>>   
>>   /**
> _______________________________________________
> 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