[PATCH v4 1/2] drm/amdgpu/gmc: steal the appropriate amount of vram for fw hand-over

Andrey Grodzovsky Andrey.Grodzovsky at amd.com
Thu Apr 12 04:25:08 UTC 2018



On 04/12/2018 12:16 AM, Alex Deucher wrote:
> On Thu, Apr 12, 2018 at 12:08 AM, Andrey Grodzovsky
> <andrey.grodzovsky at amd.com> wrote:
>> From: Alex Deucher <alexdeucher at gmail.com>
>>
>> Steal 9 MB for vga emulation and fb if vga is enabled, otherwise,
>> steal enough to cover the current display size as set by the vbios.
>>
>> If no memory is used (e.g., secondary or headless card), skip
>> stolen memory reserve.
>>
>> Signed-off-by: Alex Deucher <alexander.deucher at amd.com>
> Looks like you used v1 rather than v2 of this patch:
> https://patchwork.freedesktop.org/patch/215566/
>
> Alex

To much patches circling around, NP, will respin tomorrow.

Thanks,
Andrey

>
>> ---
>>   drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c | 17 +++++++------
>>   drivers/gpu/drm/amd/amdgpu/gmc_v6_0.c   | 17 ++++++++++++-
>>   drivers/gpu/drm/amd/amdgpu/gmc_v7_0.c   | 17 ++++++++++++-
>>   drivers/gpu/drm/amd/amdgpu/gmc_v8_0.c   | 17 ++++++++++++-
>>   drivers/gpu/drm/amd/amdgpu/gmc_v9_0.c   | 42 ++++++++++++++++++++++++++++++++-
>>   5 files changed, 99 insertions(+), 11 deletions(-)
>>
>> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c
>> index ab73300e..0555821 100644
>> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c
>> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c
>> @@ -1441,12 +1441,14 @@ int amdgpu_ttm_init(struct amdgpu_device *adev)
>>                  return r;
>>          }
>>
>> -       r = amdgpu_bo_create_kernel(adev, adev->gmc.stolen_size, PAGE_SIZE,
>> -                                   AMDGPU_GEM_DOMAIN_VRAM,
>> -                                   &adev->stolen_vga_memory,
>> -                                   NULL, NULL);
>> -       if (r)
>> -               return r;
>> +       if (adev->gmc.stolen_size) {
>> +               r = amdgpu_bo_create_kernel(adev, adev->gmc.stolen_size, PAGE_SIZE,
>> +                                           AMDGPU_GEM_DOMAIN_VRAM,
>> +                                           &adev->stolen_vga_memory,
>> +                                           NULL, NULL);
>> +               if (r)
>> +                       return r;
>> +       }
>>          DRM_INFO("amdgpu: %uM of VRAM memory ready\n",
>>                   (unsigned) (adev->gmc.real_vram_size / (1024 * 1024)));
>>
>> @@ -1521,7 +1523,8 @@ void amdgpu_ttm_fini(struct amdgpu_device *adev)
>>                  return;
>>
>>          amdgpu_ttm_debugfs_fini(adev);
>> -       amdgpu_bo_free_kernel(&adev->stolen_vga_memory, NULL, NULL);
>> +       if (adev->gmc.stolen_size)
>> +               amdgpu_bo_free_kernel(&adev->stolen_vga_memory, NULL, NULL);
>>          amdgpu_ttm_fw_reserve_vram_fini(adev);
>>          if (adev->mman.aper_base_kaddr)
>>                  iounmap(adev->mman.aper_base_kaddr);
>> diff --git a/drivers/gpu/drm/amd/amdgpu/gmc_v6_0.c b/drivers/gpu/drm/amd/amdgpu/gmc_v6_0.c
>> index 5617cf6..63f0b65 100644
>> --- a/drivers/gpu/drm/amd/amdgpu/gmc_v6_0.c
>> +++ b/drivers/gpu/drm/amd/amdgpu/gmc_v6_0.c
>> @@ -825,6 +825,21 @@ static int gmc_v6_0_late_init(void *handle)
>>                  return 0;
>>   }
>>
>> +static unsigned gmc_v6_0_get_vbios_fb_size(struct amdgpu_device *adev)
>> +{
>> +       u32 d1vga_control = RREG32(mmD1VGA_CONTROL);
>> +
>> +       if (REG_GET_FIELD(d1vga_control, D1VGA_CONTROL, D1VGA_MODE_ENABLE)) {
>> +               return 9 * 1024 * 1024; /* reserve 8MB for vga emulator and 1 MB for FB */
>> +       } else {
>> +               u32 viewport = RREG32(mmVIEWPORT_SIZE);
>> +               unsigned size = (REG_GET_FIELD(viewport, VIEWPORT_SIZE, VIEWPORT_HEIGHT) *
>> +                                REG_GET_FIELD(viewport, VIEWPORT_SIZE, VIEWPORT_WIDTH) *
>> +                                4);
>> +               return size;
>> +       }
>> +}
>> +
>>   static int gmc_v6_0_sw_init(void *handle)
>>   {
>>          int r;
>> @@ -851,7 +866,7 @@ static int gmc_v6_0_sw_init(void *handle)
>>
>>          adev->gmc.mc_mask = 0xffffffffffULL;
>>
>> -       adev->gmc.stolen_size = 256 * 1024;
>> +       adev->gmc.stolen_size = gmc_v6_0_get_vbios_fb_size(adev);
>>
>>          adev->need_dma32 = false;
>>          dma_bits = adev->need_dma32 ? 32 : 40;
>> diff --git a/drivers/gpu/drm/amd/amdgpu/gmc_v7_0.c b/drivers/gpu/drm/amd/amdgpu/gmc_v7_0.c
>> index 80054f3..2deb5c9 100644
>> --- a/drivers/gpu/drm/amd/amdgpu/gmc_v7_0.c
>> +++ b/drivers/gpu/drm/amd/amdgpu/gmc_v7_0.c
>> @@ -964,6 +964,21 @@ static int gmc_v7_0_late_init(void *handle)
>>                  return 0;
>>   }
>>
>> +static unsigned gmc_v7_0_get_vbios_fb_size(struct amdgpu_device *adev)
>> +{
>> +       u32 d1vga_control = RREG32(mmD1VGA_CONTROL);
>> +
>> +       if (REG_GET_FIELD(d1vga_control, D1VGA_CONTROL, D1VGA_MODE_ENABLE)) {
>> +               return 9 * 1024 * 1024; /* reserve 8MB for vga emulator and 1 MB for FB */
>> +       } else {
>> +               u32 viewport = RREG32(mmVIEWPORT_SIZE);
>> +               unsigned size = (REG_GET_FIELD(viewport, VIEWPORT_SIZE, VIEWPORT_HEIGHT) *
>> +                                REG_GET_FIELD(viewport, VIEWPORT_SIZE, VIEWPORT_WIDTH) *
>> +                                4);
>> +               return size;
>> +       }
>> +}
>> +
>>   static int gmc_v7_0_sw_init(void *handle)
>>   {
>>          int r;
>> @@ -998,7 +1013,7 @@ static int gmc_v7_0_sw_init(void *handle)
>>           */
>>          adev->gmc.mc_mask = 0xffffffffffULL; /* 40 bit MC */
>>
>> -       adev->gmc.stolen_size = 256 * 1024;
>> +       adev->gmc.stolen_size = gmc_v7_0_get_vbios_fb_size(adev);
>>
>>          /* set DMA mask + need_dma32 flags.
>>           * PCIE - can handle 40-bits.
>> diff --git a/drivers/gpu/drm/amd/amdgpu/gmc_v8_0.c b/drivers/gpu/drm/amd/amdgpu/gmc_v8_0.c
>> index d71d4cb..04b00df 100644
>> --- a/drivers/gpu/drm/amd/amdgpu/gmc_v8_0.c
>> +++ b/drivers/gpu/drm/amd/amdgpu/gmc_v8_0.c
>> @@ -1055,6 +1055,21 @@ static int gmc_v8_0_late_init(void *handle)
>>                  return 0;
>>   }
>>
>> +static unsigned gmc_v8_0_get_vbios_fb_size(struct amdgpu_device *adev)
>> +{
>> +       u32 d1vga_control = RREG32(mmD1VGA_CONTROL);
>> +
>> +       if (REG_GET_FIELD(d1vga_control, D1VGA_CONTROL, D1VGA_MODE_ENABLE)) {
>> +               return 9 * 1024 * 1024; /* reserve 8MB for vga emulator and 1 MB for FB */
>> +       } else {
>> +               u32 viewport = RREG32(mmVIEWPORT_SIZE);
>> +               unsigned size = (REG_GET_FIELD(viewport, VIEWPORT_SIZE, VIEWPORT_HEIGHT) *
>> +                                REG_GET_FIELD(viewport, VIEWPORT_SIZE, VIEWPORT_WIDTH) *
>> +                                4);
>> +               return size;
>> +       }
>> +}
>> +
>>   #define mmMC_SEQ_MISC0_FIJI 0xA71
>>
>>   static int gmc_v8_0_sw_init(void *handle)
>> @@ -1096,7 +1111,7 @@ static int gmc_v8_0_sw_init(void *handle)
>>           */
>>          adev->gmc.mc_mask = 0xffffffffffULL; /* 40 bit MC */
>>
>> -       adev->gmc.stolen_size = 256 * 1024;
>> +       adev->gmc.stolen_size = gmc_v8_0_get_vbios_fb_size(adev);
>>
>>          /* set DMA mask + need_dma32 flags.
>>           * PCIE - can handle 40-bits.
>> diff --git a/drivers/gpu/drm/amd/amdgpu/gmc_v9_0.c b/drivers/gpu/drm/amd/amdgpu/gmc_v9_0.c
>> index 070946e..252a6c69 100644
>> --- a/drivers/gpu/drm/amd/amdgpu/gmc_v9_0.c
>> +++ b/drivers/gpu/drm/amd/amdgpu/gmc_v9_0.c
>> @@ -793,6 +793,46 @@ static int gmc_v9_0_gart_init(struct amdgpu_device *adev)
>>          return amdgpu_gart_table_vram_alloc(adev);
>>   }
>>
>> +#define mmHUBP0_DCSURF_PRI_VIEWPORT_DIMENSION                                                          0x055d
>> +#define mmHUBP0_DCSURF_PRI_VIEWPORT_DIMENSION_BASE_IDX                                                 2
>> +#define HUBP0_DCSURF_PRI_VIEWPORT_DIMENSION__PRI_VIEWPORT_WIDTH__SHIFT                                        0x0
>> +#define HUBP0_DCSURF_PRI_VIEWPORT_DIMENSION__PRI_VIEWPORT_HEIGHT__SHIFT                                       0x10
>> +#define HUBP0_DCSURF_PRI_VIEWPORT_DIMENSION__PRI_VIEWPORT_WIDTH_MASK                                          0x00003FFFL
>> +#define HUBP0_DCSURF_PRI_VIEWPORT_DIMENSION__PRI_VIEWPORT_HEIGHT_MASK                                         0x3FFF0000L
>> +
>> +static unsigned gmc_v9_0_get_vbios_fb_size(struct amdgpu_device *adev)
>> +{
>> +       u32 d1vga_control = RREG32_SOC15(DCE, 0, mmD1VGA_CONTROL);
>> +
>> +       if (REG_GET_FIELD(d1vga_control, D1VGA_CONTROL, D1VGA_MODE_ENABLE)) {
>> +               return 9 * 1024 * 1024; /* reserve 8MB for vga emulator and 1 MB for FB */
>> +       } else {
>> +               u32 viewport;
>> +               unsigned size;
>> +
>> +               switch (adev->asic_type) {
>> +               case CHIP_RAVEN:
>> +                       viewport = RREG32_SOC15(DCE, 0, mmHUBP0_DCSURF_PRI_VIEWPORT_DIMENSION);
>> +                       size = (REG_GET_FIELD(viewport,
>> +                                             HUBP0_DCSURF_PRI_VIEWPORT_DIMENSION, PRI_VIEWPORT_HEIGHT) *
>> +                               REG_GET_FIELD(viewport,
>> +                                             HUBP0_DCSURF_PRI_VIEWPORT_DIMENSION, PRI_VIEWPORT_WIDTH) *
>> +                               4);
>> +                       break;
>> +               case CHIP_VEGA10:
>> +               case CHIP_VEGA12:
>> +               default:
>> +                       viewport = RREG32_SOC15(DCE, 0, mmSCL0_VIEWPORT_SIZE);
>> +                       size = (REG_GET_FIELD(viewport, SCL0_VIEWPORT_SIZE, VIEWPORT_HEIGHT) *
>> +                               REG_GET_FIELD(viewport, SCL0_VIEWPORT_SIZE, VIEWPORT_WIDTH) *
>> +                               4);
>> +                       break;
>> +               }
>> +
>> +               return size;
>> +       }
>> +}
>> +
>>   static int gmc_v9_0_sw_init(void *handle)
>>   {
>>          int r;
>> @@ -848,7 +888,7 @@ static int gmc_v9_0_sw_init(void *handle)
>>           * It needs to reserve 8M stolen memory for vega10
>>           * TODO: Figure out how to avoid that...
>>           */
>> -       adev->gmc.stolen_size = 8 * 1024 * 1024;
>> +       adev->gmc.stolen_size = gmc_v9_0_get_vbios_fb_size(adev);
>>
>>          /* set DMA mask + need_dma32 flags.
>>           * PCIE - can handle 44-bits.
>> --
>> 2.7.4
>>
> _______________________________________________
> 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