[PATCH] drm/amdgpu: set DRIVER_ATOMIC flag early

Harry Wentland harry.wentland at amd.com
Wed Jan 24 20:44:29 UTC 2018



On 2018-01-24 01:42 PM, Alex Deucher wrote:
> On Wed, Jan 24, 2018 at 1:40 PM, Alex Deucher <alexdeucher at gmail.com> wrote:
>> On Wed, Jan 24, 2018 at 9:53 AM, Harry Wentland <harry.wentland at amd.com> wrote:
>>> On 2018-01-23 05:10 PM, Alex Deucher wrote:
>>>> The atomic debugfs stuff gets created in drm_dev_alloc()
>>>> but this gets called before we've enumerated all of our
>>>> IPs, so move the DRIVER_ATOMIC flag setting to fix that.
>>>>
>>>> Since DRIVER_ATOMIC is a driver flag it's currently global
>>>> to the driver so setting it affects all GPUs driven by the
>>>> driver.  Unfortunately, not all GPUs support atomic.  Warn
>>>> the user if that is the case.
>>>>
>>>> This is the same as our current behavior, but at least the
>>>> atomic debugfs stuff gets created now.
>>>>
>>>> Signed-off-by: Alex Deucher <alexander.deucher at amd.com>
>>>> ---
>>>>  drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c           | 12 ++++++++++++
>>>>  drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c |  2 --
>>>>  2 files changed, 12 insertions(+), 2 deletions(-)
>>>>
>>>> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c
>>>> index d1a695864793..367f331b4a54 100644
>>>> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c
>>>> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c
>>>> @@ -578,6 +578,11 @@ static int amdgpu_pci_probe(struct pci_dev *pdev,
>>>>       struct drm_device *dev;
>>>>       unsigned long flags = ent->driver_data;
>>>>       int ret, retry = 0;
>>>> +     bool supports_atomic = false;
>>>> +
>>>> +     if (!amdgpu_virtual_display &&
>>>> +         amdgpu_device_asic_has_dc_support(flags & AMD_ASIC_MASK))
>>>> +             supports_atomic = true;
>>>>
>>>>       if ((flags & AMD_EXP_HW_SUPPORT) && !amdgpu_exp_hw_support) {
>>>>               DRM_INFO("This hardware requires experimental hardware support.\n"
>>>> @@ -598,6 +603,13 @@ static int amdgpu_pci_probe(struct pci_dev *pdev,
>>>>       if (ret)
>>>>               return ret;
>>>>
>>>> +     /* warn the user if they mix atomic and non-atomic capable GPUs */
>>>> +     if ((kms_driver.driver_features & DRIVER_ATOMIC) && !supports_atomic)
>>>> +             DRM_ERROR("Mixing atomic and non-atomic capable GPUs!\n");
>>>
>>> Would it make sense to make kms_driver non-static to deal with the DRIVER_ATOMIC flag correctly for multi-GPU?
>>
>> We'd need two driver structs with the only difference being the ATOMIC
>> bit.  Ideally this flag would be per device rather than per driver.
>>
>> There are two issues here.
>>
>> 1. We need to set the ATOMIC bit early enough that the atomic debugfs
>> stuff gets created.  We already set the flag when dc initializes
>> anyway so there is no change in behavior here other than that the
>> debugfs stuff gets created.  So it seems like a net benefit to at
>> least set the flag early if dc is enabled.
>>
>> 2. Change the flag to be per device.  This is a lot more involved
>> since we need to switch all the drivers.  That part is not too bad
>> since most are either atomic or not.  Where is gets tricky with amdgpu
>> (and possibly other drivers) is that we would need to fix up the
>> ordering of debugfs init and the drm load callbacks in
>> drm_dev_register() because the debugfs atomic files are added before
>> the driver load callback is called.  I'm not sure how much other
>> drivers depend on that current ordering.
> 
> and the driver load callback is where we determine the conditions to
> enable atomic or not.
> 

Make sense. I understand the problem now.

I agree this improves the situation on many systems, even though it's messy and might be unpredictable to the end-user, because of those things Michel mentioned.

Feel free to add a somewhat reluctant
Acked-by: Harry Wentland <harry.wentland at amd.com>

I guess without reworking drm_dev_register's debugfs init and drm load callback we'd only be able to properly fix this if all ASICs had DC support and we moved virtual_display support to DC. Not sure if that's even something we want to do. Either way it'd be a lot of work.

Harry

> Alex
> 
>>
>> Alex
>>
>>
>>>
>>> Harry
>>>
>>>> +     /* support atomic early so the atomic debugfs stuff gets created */
>>>> +     if (supports_atomic)
>>>> +             kms_driver.driver_features |= DRIVER_ATOMIC;
>>>> +
>>>>       dev = drm_dev_alloc(&kms_driver, &pdev->dev);
>>>>       if (IS_ERR(dev))
>>>>               return PTR_ERR(dev);
>>>> diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
>>>> index 63df977fc426..597302bb5f4d 100644
>>>> --- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
>>>> +++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
>>>> @@ -1625,8 +1625,6 @@ static int dm_early_init(void *handle)
>>>>  {
>>>>       struct amdgpu_device *adev = (struct amdgpu_device *)handle;
>>>>
>>>> -     adev->ddev->driver->driver_features |= DRIVER_ATOMIC;
>>>> -
>>>>       switch (adev->asic_type) {
>>>>       case CHIP_BONAIRE:
>>>>       case CHIP_HAWAII:
>>>>


More information about the amd-gfx mailing list