(cc Villa, Jani)
Hi
Am 17.03.26 um 13:19 schrieb Jammy Huang:
DisplayPort supports EDID up to 256 bytes (blocks 0 and 1). Update the
block check to allow these two blocks while returning 0 for any
additional extension blocks.
Furthermore, remove the manual EDID byte manipulation logic. The DRM
core (drm_edid) already handles error correction and checksum
validation.
Does that really work? AFAICT
- The allocations in _drm_do_get_edid() [1] do not guarantee that the
memory is cleared to zero.
- If the helper detects an error, it will conditionally print an error [2].
- As ast is polling the EDID, it'll fill the kernel log over time with
these warnings.
I think we'd still need some sort of 'valid error state' that signals an
EOF that is not an error, but still counts as an invalid header.
Best regards
Thomas
[1]
https://elixir.bootlin.com/linux/v6.19.8/source/drivers/gpu/drm/drm_edid.c#L2366
[2]
https://elixir.bootlin.com/linux/v6.19.8/source/drivers/gpu/drm/drm_edid.c#L1919
Signed-off-by: Jammy Huang <[email protected]>
---
ASPEED DisplayPort's EDID size can be 256 bytes at most. Thus, EDID
blocks fetched can be 0 and 1.
---
Changes in v2:
Becasue drm-edid will handle invalid EDID if happen, we have 2 changes
below.
- Return 0 for the number of block more than 1.
- Remove modification of EDID
- Link to v1:
https://lore.kernel.org/r/[email protected]
---
drivers/gpu/drm/ast/ast_dp.c | 18 ++----------------
1 file changed, 2 insertions(+), 16 deletions(-)
diff --git a/drivers/gpu/drm/ast/ast_dp.c b/drivers/gpu/drm/ast/ast_dp.c
index 9d07dad358c..282c694218c 100644
--- a/drivers/gpu/drm/ast/ast_dp.c
+++ b/drivers/gpu/drm/ast/ast_dp.c
@@ -88,8 +88,8 @@ static int ast_astdp_read_edid_block(void *data, u8 *buf,
unsigned int block, si
int ret = 0;
unsigned int i;
- if (block > 0)
- return -EIO; /* extension headers not supported */
+ if (block > 1)
+ return 0;
/*
* Protect access to I/O registers from concurrent modesetting
@@ -154,20 +154,6 @@ static int ast_astdp_read_edid_block(void *data, u8 *buf,
unsigned int block, si
ediddata[2] = ast_get_index_reg(ast, AST_IO_VGACRI, 0xda);
ediddata[3] = ast_get_index_reg(ast, AST_IO_VGACRI, 0xdb);
- if (i == 31) {
- /*
- * For 128-bytes EDID_1.3,
- * 1. Add the value of Bytes-126 to Bytes-127.
- * The Bytes-127 is Checksum. Sum of all
128bytes should
- * equal 0 (mod 256).
- * 2. Modify Bytes-126 to be 0.
- * The Bytes-126 indicates the Number of
extensions to
- * follow. 0 represents noextensions.
- */
- ediddata[3] = ediddata[3] + ediddata[2];
- ediddata[2] = 0;
- }
-
memcpy(buf, ediddata, min((len - i), 4));
buf += 4;
}
---
base-commit: 5ee8dbf54602dc340d6235b1d6aa17c0f283f48c
change-id: 20260313-upstream_ast_dp_edid-5fe6adf7ad36
Best regards,
--
--
Thomas Zimmermann
Graphics Driver Developer
SUSE Software Solutions Germany GmbH
Frankenstr. 146, 90461 Nürnberg, Germany, www.suse.com
GF: Jochen Jaser, Andrew McDonald, Werner Knoblich, (HRB 36809, AG Nürnberg)