[PATCH 9/9] drm/udl: Support adapters without firmware descriptor
Patrik Jakobsson
patrik.r.jakobsson at gmail.com
Thu Apr 3 11:03:04 UTC 2025
On Tue, Apr 1, 2025 at 6:23 PM Thomas Zimmermann <tzimmermann at suse.de> wrote:
>
> 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.
>
> Signed-off-by: Thomas Zimmermann <tzimmermann at suse.de>
> ---
> drivers/gpu/drm/udl/udl_main.c | 37 +++++++++++++++++++---------------
> 1 file changed, 21 insertions(+), 16 deletions(-)
>
> diff --git a/drivers/gpu/drm/udl/udl_main.c b/drivers/gpu/drm/udl/udl_main.c
> index b5a6b254a2028..2685608af8cec 100644
> --- a/drivers/gpu/drm/udl/udl_main.c
> +++ b/drivers/gpu/drm/udl/udl_main.c
> @@ -76,6 +76,7 @@ static int udl_parse_vendor_descriptor(struct udl_device *udl)
> {
> struct drm_device *dev = &udl->drm;
> struct usb_device *udev = udl_to_usb_device(udl);
> + bool detected = false;
> void *buf;
> int ret;
> unsigned int len;
> @@ -84,16 +85,16 @@ static int udl_parse_vendor_descriptor(struct udl_device *udl)
>
> buf = kzalloc(MAX_VENDOR_DESCRIPTOR_SIZE, GFP_KERNEL);
> if (!buf)
> - return false;
> + return -ENOMEM;
>
> ret = usb_get_descriptor(udev, 0x5f, /* vendor specific */
> 0, buf, MAX_VENDOR_DESCRIPTOR_SIZE);
> if (ret < 0)
> - goto unrecognized;
> + goto out;
> len = ret;
>
> if (len < 5)
> - goto unrecognized;
> + goto out;
>
> desc = buf;
> desc_end = desc + len;
> @@ -103,21 +104,20 @@ static int udl_parse_vendor_descriptor(struct udl_device *udl)
> (desc[2] != 0x01) || /* version (2 bytes) */
> (desc[3] != 0x00) ||
> (desc[4] != len - 2)) /* length after type */
> - goto unrecognized;
> + goto out;
> desc += 5;
>
> + detected = true;
> +
> while (desc < desc_end)
> desc = udl_parse_key_value_pair(udl, desc, desc_end);
>
> - goto success;
> -
> -unrecognized:
> - /* allow udlfb to load for now even if firmware unrecognized */
> - drm_warn(dev, "Unrecognized vendor firmware descriptor\n");
> -
> -success:
> +out:
> + if (!detected)
> + drm_warn(dev, "Unrecognized vendor firmware descriptor\n");
> kfree(buf);
> - return true;
> +
> + return 0;
> }
>
> /*
> @@ -345,11 +345,16 @@ int udl_init(struct udl_device *udl)
> drm_warn(dev, "buffer sharing not supported"); /* not an error */
> }
>
> - if (!udl_parse_vendor_descriptor(udl)) {
> - ret = -ENODEV;
> - DRM_ERROR("firmware not recognized. Assume incompatible device\n");
> + /*
> + * Not all devices provide vendor descriptors with device
> + * information. Initialize to default values from real-world
> + * devices. It is just enough memory for FullHD.
> + */
> + udl->sku_pixel_limit = USL_SKU_PIXEL_LIMIT_DEFAULT;
Should be UDL_SKU_PIXEL_LIMIT_DEFAULT
> +
> + ret = udl_parse_vendor_descriptor(udl);
> + if (ret)
> goto err;
> - }
>
> if (udl_select_std_channel(udl))
> DRM_ERROR("Selecting channel failed\n");
> --
> 2.49.0
>
More information about the dri-devel
mailing list