[PATCH] drm/amdgpu: export gpu always on cu bitmap

Christian König deathsimple at vodafone.de
Wed Jun 21 08:32:44 UTC 2017


Am 21.06.2017 um 09:42 schrieb Flora Cui:
> On Tue, Jun 20, 2017 at 10:47:39AM -0400, Alex Deucher wrote:
>> On Tue, Jun 20, 2017 at 4:15 AM, Flora Cui <Flora.Cui at amd.com> wrote:
>>> Change-Id: I056d8af23340d46e5140bd10cc38dfb887cc78ab
>>> Signed-off-by: Flora Cui <Flora.Cui at amd.com>
>>> ---
>>>   drivers/gpu/drm/amd/amdgpu/amdgpu.h     | 7 +++++--
>>>   drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c | 3 ++-
>>>   drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c | 3 ++-
>>>   drivers/gpu/drm/amd/amdgpu/gfx_v6_0.c   | 4 +++-
>>>   drivers/gpu/drm/amd/amdgpu/gfx_v7_0.c   | 4 +++-
>>>   drivers/gpu/drm/amd/amdgpu/gfx_v8_0.c   | 4 +++-
>>>   drivers/gpu/drm/amd/amdgpu/gfx_v9_0.c   | 4 +++-
>>>   include/uapi/drm/amdgpu_drm.h           | 2 +-
>>>   8 files changed, 22 insertions(+), 9 deletions(-)
>>>
>>> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu.h b/drivers/gpu/drm/amd/amdgpu/amdgpu.h
>>> index 6b7d2a1..6b9a91c 100644
>>> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu.h
>>> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu.h
>>> @@ -1029,12 +1029,15 @@ struct amdgpu_gfx_config {
>>>   };
>>>
>>>   struct amdgpu_cu_info {
>>> -       uint32_t number; /* total active CU number */
>>> -       uint32_t ao_cu_mask;
>>>          uint32_t max_waves_per_simd;
>>>          uint32_t wave_front_size;
>>>          uint32_t max_scratch_slots_per_cu;
>>>          uint32_t lds_size;
>>> +
>>> +       /* total active CU number */
>>> +       uint32_t number;
>>> +       uint32_t ao_cu_mask;
>>> +       uint32_t ao_cu_bitmap[4][4];
>>>          uint32_t bitmap[4][4];
>>>   };
>>>
>>> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c
>>> index 0424711..5a1d794 100644
>>> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c
>>> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c
>>> @@ -67,9 +67,10 @@
>>>    * - 3.15.0 - Export more gpu info for gfx9
>>>    * - 3.16.0 - Add reserved vmid support
>>>    * - 3.17.0 - Add AMDGPU_NUM_VRAM_CPU_PAGE_FAULTS.
>>> + * - 3.18.0 - Export gpu always on cu bitmap
>>>    */
>>>   #define KMS_DRIVER_MAJOR       3
>>> -#define KMS_DRIVER_MINOR       17
>>> +#define KMS_DRIVER_MINOR       18
>>>   #define KMS_DRIVER_PATCHLEVEL  0
>>>
>>>   int amdgpu_vram_limit = 0;
>>> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c
>>> index f68ced6..6ba8204 100644
>>> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c
>>> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c
>>> @@ -591,8 +591,9 @@ static int amdgpu_info_ioctl(struct drm_device *dev, void *data, struct drm_file
>>>                  dev_info.gart_page_size = AMDGPU_GPU_PAGE_SIZE;
>>>
>>>                  dev_info.cu_active_number = adev->gfx.cu_info.number;
>>> -               dev_info.cu_ao_mask = adev->gfx.cu_info.ao_cu_mask;
>>>                  dev_info.ce_ram_size = adev->gfx.ce_ram_size;
>>> +               memcpy(&dev_info.cu_ao_bitmap[0], &adev->gfx.cu_info.ao_cu_bitmap[0],
>>> +                      sizeof(adev->gfx.cu_info.ao_cu_bitmap));
>>>                  memcpy(&dev_info.cu_bitmap[0], &adev->gfx.cu_info.bitmap[0],
>>>                         sizeof(adev->gfx.cu_info.bitmap));
>>>                  dev_info.vram_type = adev->mc.vram_type;
>>> diff --git a/drivers/gpu/drm/amd/amdgpu/gfx_v6_0.c b/drivers/gpu/drm/amd/amdgpu/gfx_v6_0.c
>>> index 7b0b3cf..5173ca1 100644
>>> --- a/drivers/gpu/drm/amd/amdgpu/gfx_v6_0.c
>>> +++ b/drivers/gpu/drm/amd/amdgpu/gfx_v6_0.c
>>> @@ -3535,7 +3535,9 @@ static void gfx_v6_0_get_cu_info(struct amdgpu_device *adev)
>>>                                  mask <<= 1;
>>>                          }
>>>                          active_cu_number += counter;
>>> -                       ao_cu_mask |= (ao_bitmap << (i * 16 + j * 8));
>>> +                       if (i < 2 && j < 2)
>>> +                               ao_cu_mask |= (ao_bitmap << (i * 16 + j * 8));
>>> +                       cu_info->ao_cu_bitmap[i][j] = ao_bitmap;
>>>                  }
>>>          }
>>>
>>> diff --git a/drivers/gpu/drm/amd/amdgpu/gfx_v7_0.c b/drivers/gpu/drm/amd/amdgpu/gfx_v7_0.c
>>> index fb0a94c..8c4dd7b 100644
>>> --- a/drivers/gpu/drm/amd/amdgpu/gfx_v7_0.c
>>> +++ b/drivers/gpu/drm/amd/amdgpu/gfx_v7_0.c
>>> @@ -5427,7 +5427,9 @@ static void gfx_v7_0_get_cu_info(struct amdgpu_device *adev)
>>>                                  mask <<= 1;
>>>                          }
>>>                          active_cu_number += counter;
>>> -                       ao_cu_mask |= (ao_bitmap << (i * 16 + j * 8));
>>> +                       if (i < 2 && j < 2)
>>> +                               ao_cu_mask |= (ao_bitmap << (i * 16 + j * 8));
>>> +                       cu_info->ao_cu_bitmap[i][j] = ao_bitmap;
>>>                  }
>>>          }
>>>          gfx_v7_0_select_se_sh(adev, 0xffffffff, 0xffffffff, 0xffffffff);
>>> diff --git a/drivers/gpu/drm/amd/amdgpu/gfx_v8_0.c b/drivers/gpu/drm/amd/amdgpu/gfx_v8_0.c
>>> index 1a75ab1..9edb509 100644
>>> --- a/drivers/gpu/drm/amd/amdgpu/gfx_v8_0.c
>>> +++ b/drivers/gpu/drm/amd/amdgpu/gfx_v8_0.c
>>> @@ -7080,7 +7080,9 @@ static void gfx_v8_0_get_cu_info(struct amdgpu_device *adev)
>>>                                  mask <<= 1;
>>>                          }
>>>                          active_cu_number += counter;
>>> -                       ao_cu_mask |= (ao_bitmap << (i * 16 + j * 8));
>>> +                       if (i < 2 && j < 2)
>>> +                               ao_cu_mask |= (ao_bitmap << (i * 16 + j * 8));
>>> +                       cu_info->ao_cu_bitmap[i][j] = ao_bitmap;
>>>                  }
>>>          }
>>>          gfx_v8_0_select_se_sh(adev, 0xffffffff, 0xffffffff, 0xffffffff);
>>> diff --git a/drivers/gpu/drm/amd/amdgpu/gfx_v9_0.c b/drivers/gpu/drm/amd/amdgpu/gfx_v9_0.c
>>> index 5d56126..0d6a6d9 100644
>>> --- a/drivers/gpu/drm/amd/amdgpu/gfx_v9_0.c
>>> +++ b/drivers/gpu/drm/amd/amdgpu/gfx_v9_0.c
>>> @@ -4459,7 +4459,9 @@ static int gfx_v9_0_get_cu_info(struct amdgpu_device *adev,
>>>                                  mask <<= 1;
>>>                          }
>>>                          active_cu_number += counter;
>>> -                       ao_cu_mask |= (ao_bitmap << (i * 16 + j * 8));
>>> +                       if (i < 2 && j < 2)
>>> +                               ao_cu_mask |= (ao_bitmap << (i * 16 + j * 8));
>>> +                       cu_info->ao_cu_bitmap[i][j] = ao_bitmap;
>>>                  }
>>>          }
>>>          gfx_v9_0_select_se_sh(adev, 0xffffffff, 0xffffffff, 0xffffffff);
>>> diff --git a/include/uapi/drm/amdgpu_drm.h b/include/uapi/drm/amdgpu_drm.h
>>> index 4f34394..4304422 100644
>>> --- a/include/uapi/drm/amdgpu_drm.h
>>> +++ b/include/uapi/drm/amdgpu_drm.h
>>> @@ -760,7 +760,7 @@ struct drm_amdgpu_info_device {
>>>          __u64 max_memory_clock;
>>>          /* cu information */
>>>          __u32 cu_active_number;
>>> -       __u32 cu_ao_mask;
>>> +       __u32 cu_ao_bitmap[4][4];
>>>          __u32 cu_bitmap[4][4];
>>>          /** Render backend pipe mask. One render backend is CB+DB. */
>>>          __u32 enabled_rb_pipes_mask;
>> You need to add these to the end of the structure for backwards compatibility.
>>
> OK. How to handle cu_ao_mask? it's invalid, yet kmd has to keep it for backward compatibility.

I can't completely answer that question since I don't know the hardware 
background well enough.

But the main questions are how it is used today and what can we do to 
avoid breaking existing userspace?

If the value is completely ignored by user space then we can simply set 
it to zero and add some deprecated comment on the field.

If the the incorrect value is somehow used then we should still provide 
it even when it is completely wrong.

Regards,
Christian.


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