Skip to content

Commit a511430

Browse files
tutan-chromiumairlied
authored andcommitted
drm/udl: Refactor edid retrieving in UDL driver (v2)
Now drm/udl driver uses drm_do_get_edid() function to retrieve and validate all blocks of EDID data. Old approach had insufficient validation routine and had problems with retrieving of extra blocks Signed-off-by: Robert Tarasov <tutankhamen@chromium.org> Reviewed-by: Jani Nikula <jani.nikula@intel.com> Signed-off-by: Dave Airlie <airlied@redhat.com> [airlied: Fix spelling mistakes] Link: https://patchwork.freedesktop.org/patch/msgid/20190314225339.162386-1-tutankhamen@chromium.org
1 parent 3f04e0a commit a511430

File tree

1 file changed

+11
-61
lines changed

1 file changed

+11
-61
lines changed

drivers/gpu/drm/udl/udl_connector.c

Lines changed: 11 additions & 61 deletions
Original file line numberDiff line numberDiff line change
@@ -18,79 +18,33 @@
1818
#include "udl_connector.h"
1919
#include "udl_drv.h"
2020

21-
static bool udl_get_edid_block(struct udl_device *udl, int block_idx,
22-
u8 *buff)
21+
static int udl_get_edid_block(void *data, u8 *buf, unsigned int block,
22+
size_t len)
2323
{
2424
int ret, i;
2525
u8 *read_buff;
26+
struct udl_device *udl = data;
2627

2728
read_buff = kmalloc(2, GFP_KERNEL);
2829
if (!read_buff)
29-
return false;
30+
return -1;
3031

31-
for (i = 0; i < EDID_LENGTH; i++) {
32-
int bval = (i + block_idx * EDID_LENGTH) << 8;
32+
for (i = 0; i < len; i++) {
33+
int bval = (i + block * EDID_LENGTH) << 8;
3334
ret = usb_control_msg(udl->udev,
3435
usb_rcvctrlpipe(udl->udev, 0),
3536
(0x02), (0x80 | (0x02 << 5)), bval,
3637
0xA1, read_buff, 2, HZ);
3738
if (ret < 1) {
3839
DRM_ERROR("Read EDID byte %d failed err %x\n", i, ret);
3940
kfree(read_buff);
40-
return false;
41+
return -1;
4142
}
42-
buff[i] = read_buff[1];
43+
buf[i] = read_buff[1];
4344
}
4445

4546
kfree(read_buff);
46-
return true;
47-
}
48-
49-
static bool udl_get_edid(struct udl_device *udl, u8 **result_buff,
50-
int *result_buff_size)
51-
{
52-
int i, extensions;
53-
u8 *block_buff = NULL, *buff_ptr;
54-
55-
block_buff = kmalloc(EDID_LENGTH, GFP_KERNEL);
56-
if (block_buff == NULL)
57-
return false;
58-
59-
if (udl_get_edid_block(udl, 0, block_buff) &&
60-
memchr_inv(block_buff, 0, EDID_LENGTH)) {
61-
extensions = ((struct edid *)block_buff)->extensions;
62-
if (extensions > 0) {
63-
/* we have to read all extensions one by one */
64-
*result_buff_size = EDID_LENGTH * (extensions + 1);
65-
*result_buff = kmalloc(*result_buff_size, GFP_KERNEL);
66-
buff_ptr = *result_buff;
67-
if (buff_ptr == NULL) {
68-
kfree(block_buff);
69-
return false;
70-
}
71-
memcpy(buff_ptr, block_buff, EDID_LENGTH);
72-
kfree(block_buff);
73-
buff_ptr += EDID_LENGTH;
74-
for (i = 1; i < extensions; ++i) {
75-
if (udl_get_edid_block(udl, i, buff_ptr)) {
76-
buff_ptr += EDID_LENGTH;
77-
} else {
78-
kfree(*result_buff);
79-
*result_buff = NULL;
80-
return false;
81-
}
82-
}
83-
return true;
84-
}
85-
/* we have only base edid block */
86-
*result_buff = block_buff;
87-
*result_buff_size = EDID_LENGTH;
88-
return true;
89-
}
90-
91-
kfree(block_buff);
92-
93-
return false;
47+
return 0;
9448
}
9549

9650
static int udl_get_modes(struct drm_connector *connector)
@@ -122,8 +76,6 @@ static enum drm_mode_status udl_mode_valid(struct drm_connector *connector,
12276
static enum drm_connector_status
12377
udl_detect(struct drm_connector *connector, bool force)
12478
{
125-
u8 *edid_buff = NULL;
126-
int edid_buff_size = 0;
12779
struct udl_device *udl = connector->dev->dev_private;
12880
struct udl_drm_connector *udl_connector =
12981
container_of(connector,
@@ -136,12 +88,10 @@ udl_detect(struct drm_connector *connector, bool force)
13688
udl_connector->edid = NULL;
13789
}
13890

139-
140-
if (!udl_get_edid(udl, &edid_buff, &edid_buff_size))
91+
udl_connector->edid = drm_do_get_edid(connector, udl_get_edid_block, udl);
92+
if (!udl_connector->edid)
14193
return connector_status_disconnected;
14294

143-
udl_connector->edid = (struct edid *)edid_buff;
144-
14595
return connector_status_connected;
14696
}
14797

0 commit comments

Comments
 (0)