Skip to content

Commit fb10144

Browse files
committed
drm/udl: Support adapters without firmware descriptor
Set default limit on the number of pixels for adapters without vendor firmware descriptor. The devices work as expected, they just don't provide any description. If parsing the vendor firmware descriptor fails, the device falls back to the given default limits. Failing to allocate memory is still an error. v2: - fix typo in constant (Patrik) Signed-off-by: Thomas Zimmermann <tzimmermann@suse.de> Reviewed-by: Patrik Jakobsson <patrik.r.jakobsson@gmail.com> Link: https://lore.kernel.org/r/20250410105948.25463-10-tzimmermann@suse.de
1 parent df6dc12 commit fb10144

File tree

1 file changed

+21
-16
lines changed

1 file changed

+21
-16
lines changed

drivers/gpu/drm/udl/udl_main.c

Lines changed: 21 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,7 @@ static int udl_parse_vendor_descriptor(struct udl_device *udl)
7676
{
7777
struct drm_device *dev = &udl->drm;
7878
struct usb_device *udev = udl_to_usb_device(udl);
79+
bool detected = false;
7980
void *buf;
8081
int ret;
8182
unsigned int len;
@@ -84,16 +85,16 @@ static int udl_parse_vendor_descriptor(struct udl_device *udl)
8485

8586
buf = kzalloc(MAX_VENDOR_DESCRIPTOR_SIZE, GFP_KERNEL);
8687
if (!buf)
87-
return false;
88+
return -ENOMEM;
8889

8990
ret = usb_get_descriptor(udev, 0x5f, /* vendor specific */
9091
0, buf, MAX_VENDOR_DESCRIPTOR_SIZE);
9192
if (ret < 0)
92-
goto unrecognized;
93+
goto out;
9394
len = ret;
9495

9596
if (len < 5)
96-
goto unrecognized;
97+
goto out;
9798

9899
desc = buf;
99100
desc_end = desc + len;
@@ -103,21 +104,20 @@ static int udl_parse_vendor_descriptor(struct udl_device *udl)
103104
(desc[2] != 0x01) || /* version (2 bytes) */
104105
(desc[3] != 0x00) ||
105106
(desc[4] != len - 2)) /* length after type */
106-
goto unrecognized;
107+
goto out;
107108
desc += 5;
108109

110+
detected = true;
111+
109112
while (desc < desc_end)
110113
desc = udl_parse_key_value_pair(udl, desc, desc_end);
111114

112-
goto success;
113-
114-
unrecognized:
115-
/* allow udlfb to load for now even if firmware unrecognized */
116-
drm_warn(dev, "Unrecognized vendor firmware descriptor\n");
117-
118-
success:
115+
out:
116+
if (!detected)
117+
drm_warn(dev, "Unrecognized vendor firmware descriptor\n");
119118
kfree(buf);
120-
return true;
119+
120+
return 0;
121121
}
122122

123123
/*
@@ -345,11 +345,16 @@ int udl_init(struct udl_device *udl)
345345
drm_warn(dev, "buffer sharing not supported"); /* not an error */
346346
}
347347

348-
if (!udl_parse_vendor_descriptor(udl)) {
349-
ret = -ENODEV;
350-
DRM_ERROR("firmware not recognized. Assume incompatible device\n");
348+
/*
349+
* Not all devices provide vendor descriptors with device
350+
* information. Initialize to default values of real-world
351+
* devices. It is just enough memory for FullHD.
352+
*/
353+
udl->sku_pixel_limit = UDL_SKU_PIXEL_LIMIT_DEFAULT;
354+
355+
ret = udl_parse_vendor_descriptor(udl);
356+
if (ret)
351357
goto err;
352-
}
353358

354359
if (udl_select_std_channel(udl))
355360
DRM_ERROR("Selecting channel failed\n");

0 commit comments

Comments
 (0)