[PATCH 02/13] drm/amd/display: use drm_edid_product_id for parsing EDID product info
Michel Dänzer
michel.daenzer at mailbox.org
Thu Apr 17 13:57:43 UTC 2025
On 2025-04-17 15:27, Melissa Wen wrote:
> On 15/04/2025 06:32, Michel Dänzer wrote:
>> On 2025-04-11 22:08, Melissa Wen wrote:
>>> Since [1], we can use drm_edid_product_id to get debug info from
>>> drm_edid instead of directly parsing EDID.
>>>
>>> Link: https://lore.kernel.org/dri-devel/cover.1712655867.git.jani.nikula@intel.com/ [1]
>>> Signed-off-by: Melissa Wen <mwen at igalia.com>
>>> ---
>>> .../amd/display/amdgpu_dm/amdgpu_dm_helpers.c | 16 +++++++++-------
>>> 1 file changed, 9 insertions(+), 7 deletions(-)
>>>
>>> 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 62954b351ebd..e93adb7e48a5 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
>>> [...]
>>> @@ -122,13 +124,13 @@ enum dc_edid_status dm_helpers_parse_edid_caps(
>>> if (!drm_edid_is_valid(edid_buf))
>>> result = EDID_BAD_CHECKSUM;
>>> - edid_caps->manufacturer_id = (uint16_t) edid_buf->mfg_id[0] |
>>> - ((uint16_t) edid_buf->mfg_id[1])<<8;
>>> - edid_caps->product_id = (uint16_t) edid_buf->prod_code[0] |
>>> - ((uint16_t) edid_buf->prod_code[1])<<8;
>>> - edid_caps->serial_number = edid_buf->serial;
>>> - edid_caps->manufacture_week = edid_buf->mfg_week;
>>> - edid_caps->manufacture_year = edid_buf->mfg_year;
>>> + drm_edid_get_product_id(drm_edid, &product_id);
>>> +
>>> + edid_caps->manufacturer_id = le16_to_cpu(product_id.manufacturer_name);
>> struct drm_edid_product_id has
>>
>> __be16 manufacturer_name;
>>
>> so shouldn't this use be16_to_cpu? (Though I see that would be a change in behaviour from the existing code...)
> Hi Michel, thanks for reviewing this patch.
>
> It changes the behaviour, yes. But as you pointed it out I realized I can just assign product_id.manufacturer_name directly.
That's a third option, with its own issues:
struct dc_edid_caps::manufacturer_id doesn't have any endianness annotation and is otherwise accessed directly, not via [bl]e16_to_cpu.
It's also assigned directly to struct audio_info::manufacture_id, which is programmed to the AZALIA_F0_CODEC_PIN_CONTROL_SINK_INFO0 register.
This means different behaviour (and specifically a different value being written to the register) on little vs big endian hosts. That can't be right.
P.S. Independently from the above, AFAIK sparse will complain if a field marked with __be16 isn't accessed via be16_to_cpu / cpu_to_be16.
--
Earthling Michel Dänzer \ GNOME / Xwayland / Mesa developer
https://redhat.com \ Libre software enthusiast
More information about the amd-gfx
mailing list