[PATCH v7 09/10] drm/amd/display: remove dc_edid handler from dm_helpers_parse_edid_caps

Melissa Wen mwen at igalia.com
Thu Sep 26 10:48:37 UTC 2024




On 25/09/2024 14:55, Mario Limonciello wrote:
> Alex,
>
> Unfortunately I can't reproduce the regression on the APU I tried. 
> However I do have a suspicion on a fix.
>
> Can you see if this helps?  If it does, we can squash it in.
>
> 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 bf847ac55475..e75cd527d753 100644
> --- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
> +++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
> @@ -7008,6 +7008,7 @@ static void amdgpu_dm_connector_destroy(struct 
> drm_connector *connector)
>                 kfree(aconnector->i2c);
>         }
>         kfree(aconnector->dm_dp_aux.aux.name);
> +       drm_edid_free(aconnector->drm_edid);
>
>         kfree(connector);
>  }
>
> If that doesn't help, I did test dropping this patch and it doesn't 
> affect the last patch in the series, that one still works so I'm fine 
> with dropping it and we can follow up later.
yes, I agree with Mario's proposal.
>
> On 9/25/2024 12:06, Alex Hung wrote:
>> Mario and Melissa,
>>
>> This patch causes a regrerssion on 7900 XTX in an IGT test: 
>> amd_mem_leak's connector-suspend-resume.
>>
>> Is this patch necessary on this series or is it independent from 
>> other patches, i.e. can it be dropped from this series until fixed??
>>
>> Cheers,
>> Alex Hung
>>
>> On 9/18/24 15:38, Mario Limonciello wrote:
>>> From: Melissa Wen <mwen at igalia.com>
>>>
>>> We can parse edid caps from drm_edid and drm_eld and any calls of
>>> dm_helpers_parse_edid_caps is made in a state that we have drm_edid set
>>> to amdgpu connector.
>>>
>>> Signed-off-by: Melissa Wen <mwen at igalia.com>
>>> Co-developed-by: Mario Limonciello <mario.limonciello at amd.com>
>>> Signed-off-by: Mario Limonciello <mario.limonciello at amd.com>
>>> ---
>>>   .../gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c |  5 +---
>>>   .../amd/display/amdgpu_dm/amdgpu_dm_helpers.c | 30 
>>> ++++++++-----------
>>>   drivers/gpu/drm/amd/display/dc/dm_helpers.h   |  1 -
>>>   .../drm/amd/display/dc/link/link_detection.c  |  6 ++--
>>>   4 files changed, 16 insertions(+), 26 deletions(-)
>>>
>>> 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 bd8fb9968c7c..bf847ac55475 100644
>>> --- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
>>> +++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
>>> @@ -7123,10 +7123,7 @@ static void 
>>> amdgpu_dm_connector_funcs_force(struct drm_connector *connector)
>>>           memset(&dc_em_sink->edid_caps, 0, sizeof(struct 
>>> dc_edid_caps));
>>>           memmove(dc_em_sink->dc_edid.raw_edid, edid,
>>>               (edid->extensions + 1) * EDID_LENGTH);
>>> -        dm_helpers_parse_edid_caps(
>>> -            dc_link,
>>> -            &dc_em_sink->dc_edid,
>>> -            &dc_em_sink->edid_caps);
>>> +        dm_helpers_parse_edid_caps(dc_link, &dc_em_sink->edid_caps);
>>>       }
>>>   }
>>> diff --git 
>>> a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_helpers.c 
>>> b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_helpers.c
>>> index d43ed3ea000b..8f4be7a1ec45 100644
>>> --- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_helpers.c
>>> +++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_helpers.c
>>> @@ -83,32 +83,24 @@ static void apply_edid_quirks(struct 
>>> drm_edid_product_id *product_id,
>>>    * dm_helpers_parse_edid_caps() - Parse edid caps
>>>    *
>>>    * @link: current detected link
>>> - * @edid:    [in] pointer to edid
>>>    * @edid_caps:    [in] pointer to edid caps
>>>    *
>>>    * Return: void
>>>    */
>>> -enum dc_edid_status dm_helpers_parse_edid_caps(
>>> -        struct dc_link *link,
>>> -        const struct dc_edid *edid,
>>> -        struct dc_edid_caps *edid_caps)
>>> +enum dc_edid_status dm_helpers_parse_edid_caps(struct dc_link *link,
>>> +                           struct dc_edid_caps *edid_caps)
>>>   {
>>>       struct amdgpu_dm_connector *aconnector = link->priv;
>>>       struct drm_connector *connector = &aconnector->base;
>>>       const struct drm_edid *drm_edid = aconnector->drm_edid;
>>>       struct drm_edid_product_id product_id;
>>> -    struct edid *edid_buf = edid ? (struct edid *) edid->raw_edid : 
>>> NULL;
>>>       int sad_count;
>>>       int i = 0;
>>> -
>>>       enum dc_edid_status result = EDID_OK;
>>> -    if (!edid_caps || !edid)
>>> +    if (!edid_caps || !drm_edid)
>>>           return EDID_BAD_INPUT;
>>> -    if (!drm_edid_is_valid(edid_buf))
>>> -        result = EDID_BAD_CHECKSUM;
>>> -
>>>       drm_edid_get_product_id(drm_edid, &product_id);
>>>       edid_caps->manufacturer_id = 
>>> le16_to_cpu(product_id.manufacturer_name);
>>> @@ -920,19 +912,23 @@ enum dc_edid_status dm_helpers_read_local_edid(
>>>           if (!drm_edid)
>>>               return EDID_NO_RESPONSE;
>>> -        edid = drm_edid_raw(drm_edid); // FIXME: Get rid of 
>>> drm_edid_raw()
>>> +        /* FIXME: Get rid of drm_edid_raw()
>>> +         * Raw edid is still needed for dm_helpers_dp_write_dpcd()
>>> +         */
>>> +        edid = drm_edid_raw(drm_edid);
>>>           sink->dc_edid.length = EDID_LENGTH * (edid->extensions + 1);
>>>           memmove(sink->dc_edid.raw_edid, (uint8_t *)edid, sink- 
>>> >dc_edid.length);
>>>           edid_status = dm_helpers_parse_edid_caps(
>>>                           link,
>>> -                        &sink->dc_edid,
>>>                           &sink->edid_caps);
>>> -        /* We don't need the original edid anymore */
>>> -        drm_edid_free(drm_edid);
>>> -
>>> -    } while (edid_status == EDID_BAD_CHECKSUM && --retry > 0);
>>> +        if (edid_status != EDID_OK) {
>>> +            /* We can discard the drm_edid and retry */
>>> +            drm_edid_free(drm_edid);
>>> +            drm_edid_connector_update(connector, drm_edid);
>>> +        }
>>> +    } while (edid_status != EDID_OK && --retry > 0);
>>>       if (edid_status != EDID_OK)
>>>           DRM_ERROR("EDID err: %d, on connector: %s",
>>> diff --git a/drivers/gpu/drm/amd/display/dc/dm_helpers.h b/drivers/ 
>>> gpu/drm/amd/display/dc/dm_helpers.h
>>> index 2e4a46f1b499..4e1776b5f0d4 100644
>>> --- a/drivers/gpu/drm/amd/display/dc/dm_helpers.h
>>> +++ b/drivers/gpu/drm/amd/display/dc/dm_helpers.h
>>> @@ -61,7 +61,6 @@ void dm_helpers_free_gpu_mem(
>>>   enum dc_edid_status dm_helpers_parse_edid_caps(
>>>       struct dc_link *link,
>>> -    const struct dc_edid *edid,
>>>       struct dc_edid_caps *edid_caps);
>>> diff --git a/drivers/gpu/drm/amd/display/dc/link/link_detection.c b/ 
>>> drivers/gpu/drm/amd/display/dc/link/link_detection.c
>>> index d21ee9d12d26..94c911742dd3 100644
>>> --- a/drivers/gpu/drm/amd/display/dc/link/link_detection.c
>>> +++ b/drivers/gpu/drm/amd/display/dc/link/link_detection.c
>>> @@ -1413,10 +1413,8 @@ struct dc_sink *link_add_remote_sink(
>>>               dc_sink))
>>>           goto fail_add_sink;
>>> -    edid_status = dm_helpers_parse_edid_caps(
>>> -            link,
>>> -            &dc_sink->dc_edid,
>>> -            &dc_sink->edid_caps);
>>> +    edid_status = dm_helpers_parse_edid_caps(link,
>>> +                         &dc_sink->edid_caps);
>>>       /*
>>>        * Treat device as no EDID device if EDID
>>
>



More information about the amd-gfx mailing list