[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