From patchwork Tue Jun 17 14:42:22 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Ricardo Ribalda X-Patchwork-Id: 897510 Received: from mail-lf1-f50.google.com (mail-lf1-f50.google.com [209.85.167.50]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 4402F293457 for ; Tue, 17 Jun 2025 14:42:34 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.167.50 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1750171357; cv=none; b=YSPbfql9BamEtdZezbf1YbgE86qIj8n5yw7aoyoFngC+4BwbSSOgVLNpR+0zq6So72RlFc7I8s0w30dshR0PK1dJidwvQwIqQb5/Vi49xVJVpkEKxIrc+H1zSl5p+h3c/0EC+pqsjTivurpBO72GTV9fc67L8fQ9IxAedMVlsQc= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1750171357; c=relaxed/simple; bh=aktg2opJq0+dY4a+/MNIzTnrkdP0Ocg7NaKfj2bHfhw=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=g5J9QFDhrDCF8ylbNASRyWYT1Vvo7xE10bqqOyslrMA2MdOARH/6PCMdJM38FKuxxTAx8/QUJ4/OAIIXCjRvhA9P/hAC1jNCbL4sbptnj2XSGz9X+to+4MEKjrkO181RWZb+swIwmJUZZtlKxBmeo+I5tNsHZDbEc/6GAqreWnA= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=chromium.org; spf=pass smtp.mailfrom=chromium.org; dkim=pass (1024-bit key) header.d=chromium.org header.i=@chromium.org header.b=lkqYUoYC; arc=none smtp.client-ip=209.85.167.50 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=chromium.org Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=chromium.org Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=chromium.org header.i=@chromium.org header.b="lkqYUoYC" Received: by mail-lf1-f50.google.com with SMTP id 2adb3069b0e04-553b6a349ccso3433584e87.0 for ; Tue, 17 Jun 2025 07:42:34 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=chromium.org; s=google; t=1750171353; x=1750776153; darn=vger.kernel.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:from:to:cc:subject:date:message-id :reply-to; bh=OzIXP1ycrxCwpqJ0rvCcPdawBbbWpEqHaCxqb+yy90M=; b=lkqYUoYCEgGbtLQssHjEDMlNVUOkMZSLMhZcW54QsjOKP37nb3j3DILDimDNfCDFun VUCplA7lZ30DdaR39W+RC5ZpHqTDa32JKP1ca1bT6ktwDAPh5fDfhtYgv5E/kMoPvdkJ XfwN36BoSQCuHpYI/bxxrFYo3HzcdSA3XZ6Sc= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1750171353; x=1750776153; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=OzIXP1ycrxCwpqJ0rvCcPdawBbbWpEqHaCxqb+yy90M=; b=LUch7JrlOc058T05e5TPSEFB24TdQ1eulWZ8oW1XQRI8vWAxfxFqdJNxtK3vdFUus3 gpJy/wqGmxzzOt+TO9Y/uUGaf0cJILqyMOgJkWQlQYLwGZlj8A7UOsb8BkMm2jGSbCYl l30qAChmAGicxRKUZMi6DLD+ciZpo/rQAUQ+KY9KY6yzwjjt3/d23X0UJBFX1jBRhyod CTqCz2BEnBqfxXJ5myhESxrsmaUrljAcUoaKw5M9SuLH/+PaIDtCHaePzX8+7LB+i0tM OhLtSWmPq43UE6+lLBvNf2S/nEQPdB8G7652SnvQ92L7ln4F2crAl6WS4nsJ3syqsgbe U6VA== X-Forwarded-Encrypted: i=1; AJvYcCWhHojqRXXgtxnq+jY3hUdfhsOIQG93/MgdXDWu7YIXLITMvKfHKM5LCuLDg0iiy551MBhHDAQMUrI=@vger.kernel.org X-Gm-Message-State: AOJu0YxMxZ7J+0FEsC5/Rzm5bC4m5q5o9XUNosnXtumbmCQFtuLlJbyk sdo1DqLj3SQeFnc6F6VeIhhLUSjVgRuGwmuy69ZN1x/YAHAhAo394q4Vpx9E7aOluQ== X-Gm-Gg: ASbGncvtjmDbxhFlZ1Zl/AJ1dGBmHfzlEoBV5qJg9u33Psb0XCmNtxAJKw1ppALIY1l ifXbIAov0X4qoZDDvT6IXJNgPsI/+AniobqyCt3tEWRS0a1g5IH3E7azlyhJw2/SQSm1hLew1AD qggbTEvE2tNND9q/wMFOe/p5uH/TLiUiIZUAvnuxnbFKiqi8cCSG5ochEcpPODxXzrRXuuyptZR htM3ihMX5hwoUXYCeNhClSp6TF853Vs5ZpI9NtGvKz3vyil787OEbZ9Y8DisZes6PI1bhUiurIa 6iqtmUiWqVLRBTSJpF/onjtuz3cwBP0xzHAqeTvSEmkE8NogSV/5/06cX8QjIAIG7eupp4yBC6w 1M1CG4h6IW3jyYt+hYG/Dito8tEmYs2YSSQYNk0q8Ew== X-Google-Smtp-Source: AGHT+IGDdZamuUtegaqRzq6f6YTXv/XwbBpEBszibH6S83g9q8LYSRxOGewlvA2AvUElv4QXpy7yqQ== X-Received: by 2002:a05:6512:159d:b0:553:3665:366d with SMTP id 2adb3069b0e04-553b6ee2b81mr3316711e87.21.1750171353230; Tue, 17 Jun 2025 07:42:33 -0700 (PDT) Received: from ribalda.c.googlers.com (166.141.88.34.bc.googleusercontent.com. [34.88.141.166]) by smtp.gmail.com with ESMTPSA id 2adb3069b0e04-553ae234437sm1814992e87.53.2025.06.17.07.42.32 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 17 Jun 2025 07:42:32 -0700 (PDT) From: Ricardo Ribalda Date: Tue, 17 Jun 2025 14:42:22 +0000 Subject: [PATCH v7 1/5] media: uvcvideo: Do not mark valid metadata as invalid Precedence: bulk X-Mailing-List: linux-usb@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Message-Id: <20250617-uvc-meta-v7-1-9c50623e2286@chromium.org> References: <20250617-uvc-meta-v7-0-9c50623e2286@chromium.org> In-Reply-To: <20250617-uvc-meta-v7-0-9c50623e2286@chromium.org> To: Laurent Pinchart , Mauro Carvalho Chehab , Guennadi Liakhovetski , Greg Kroah-Hartman , Hans de Goede , Hans de Goede Cc: linux-media@vger.kernel.org, linux-kernel@vger.kernel.org, linux-usb@vger.kernel.org, Ricardo Ribalda , stable@vger.kernel.org X-Mailer: b4 0.14.2 Currently, the driver performs a length check of the metadata buffer before the actual metadata size is known and before the metadata is decided to be copied. This results in valid metadata buffers being incorrectly marked as invalid. Move the length check to occur after the metadata size is determined and is decided to be copied. Cc: stable@vger.kernel.org Fixes: 088ead255245 ("media: uvcvideo: Add a metadata device node") Reviewed-by: Laurent Pinchart Reviewed-by: Hans de Goede Signed-off-by: Ricardo Ribalda --- drivers/media/usb/uvc/uvc_video.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/drivers/media/usb/uvc/uvc_video.c b/drivers/media/usb/uvc/uvc_video.c index 11769a1832d2ba9b3f9a50bcb10b0c4cdff71f09..2e377e7b9e81599aca19b800a171cc16a09c1e8a 100644 --- a/drivers/media/usb/uvc/uvc_video.c +++ b/drivers/media/usb/uvc/uvc_video.c @@ -1442,12 +1442,6 @@ static void uvc_video_decode_meta(struct uvc_streaming *stream, if (!meta_buf || length == 2) return; - if (meta_buf->length - meta_buf->bytesused < - length + sizeof(meta->ns) + sizeof(meta->sof)) { - meta_buf->error = 1; - return; - } - has_pts = mem[1] & UVC_STREAM_PTS; has_scr = mem[1] & UVC_STREAM_SCR; @@ -1468,6 +1462,12 @@ static void uvc_video_decode_meta(struct uvc_streaming *stream, !memcmp(scr, stream->clock.last_scr, 6))) return; + if (meta_buf->length - meta_buf->bytesused < + length + sizeof(meta->ns) + sizeof(meta->sof)) { + meta_buf->error = 1; + return; + } + meta = (struct uvc_meta_buf *)((u8 *)meta_buf->mem + meta_buf->bytesused); local_irq_save(flags); time = uvc_video_get_time(); From patchwork Tue Jun 17 14:42:24 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Ricardo Ribalda X-Patchwork-Id: 897509 Received: from mail-lf1-f41.google.com (mail-lf1-f41.google.com [209.85.167.41]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 73D4720C028 for ; Tue, 17 Jun 2025 14:42:36 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.167.41 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1750171359; cv=none; b=q+SMIFWciFAv9+3lVbg/fkER81VkZr4yUl91FPoHm6xDiSQmpIwIHvUHwOf9yH/eoc9j9N05VbLhxIdz1hhOCWulbr1h3QJRAaQa6EKY7OGNaeZIlUxJ5bwiXW/nprrc5OXFKHMobIxKNi8GyUlutHumFCNvJHOV0XsfvEZH+uw= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1750171359; c=relaxed/simple; bh=VUOlaRTP4eV8iVL8FnrRm8GJrgvq6sOIU/fSE8Vhe4Y=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=gfxq2kSqs9JvX+BwKOOoKTYZCu7j4h8sDV1Zv6/0R5SKYwBJRli5jKSGBT1dPW8JPPrHpFB8+ECnCCyhoxqtxFzA7BsmFEcf9Iwv4U7WMAd4upWx+2WhJtuEiPwvY9c8CrYvqHgn7LyUX8/eJqrPA9Jzqz5nZutr77vgzuRrWmM= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=chromium.org; spf=pass smtp.mailfrom=chromium.org; dkim=pass (1024-bit key) header.d=chromium.org header.i=@chromium.org header.b=nMkrDL9b; arc=none smtp.client-ip=209.85.167.41 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=chromium.org Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=chromium.org Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=chromium.org header.i=@chromium.org header.b="nMkrDL9b" Received: by mail-lf1-f41.google.com with SMTP id 2adb3069b0e04-553543ddfc7so6233881e87.0 for ; Tue, 17 Jun 2025 07:42:35 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=chromium.org; s=google; t=1750171354; x=1750776154; darn=vger.kernel.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:from:to:cc:subject:date:message-id :reply-to; bh=0XZ3dPW1w4QCfr6i2hU3GgbqSe/1fko3hczMWWZK2cI=; b=nMkrDL9b9Aj7W8cXp2+ZfjIEl5ySuRlEw4JPa/03Y/hMzsdGfFCB/w8B8LbzxOM950 7qs9YofkJX+euJXtcvSirPTjpQMa03Qd5cXJA9zP+XvJ4htR27F7lsSHiwxcxD6JGu0Y MDdQYZgjeIsINT/VlnShBn/WM6YfJbzYMtiaY= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1750171354; x=1750776154; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=0XZ3dPW1w4QCfr6i2hU3GgbqSe/1fko3hczMWWZK2cI=; b=Q+7WDZR2Tvbc4KCYy4NzZCu3q9ksFKJy4A15Qqurz3aB8oQyMCwJHn5+c2sW0hehGN HTHxLDdH/gbTtHgGeOZi7qR5Eh9HGttVP63OGbBSZWKrM9KMhuX6lEz2ZRV0bxbBeR2d tzVaMtG8M/G6CG3nMtqMtjxrXe75joe3bG0Ry9M6HPKi3msLr+F/h/tdFfmu2Ir5Aemd pBPtrQWOF+zQNAVYZP2vawMRNh2k3uPk3Jxvt0Xf5revqtgP08xc+k/2G9B6SMr2sWZp OlayZiqyB8YM82Jz+Qh4NrTROP5Mk6slX8NmvxAk4+8ra1nOs2YOweTKZMgzAqMJgXnm OG4g== X-Forwarded-Encrypted: i=1; AJvYcCXCiCLT9DiPSXnkTRtxOwkL5V3LHpGv3/9R4NNpo9/sRbOyD/OqeZ7WW+nw7uH9JUvjb5uRRdi4K8c=@vger.kernel.org X-Gm-Message-State: AOJu0YzpJwT1+w1c2MgNPy4We3TZfBSu+YUozgJAodoLTXeGWqcpY2Zv HcG/Dyx1tvxJR7TONGHjypV6fCg6FM4FMZtPtjA3zz/IhIFpDh79v7sCp28wY8Jk8w== X-Gm-Gg: ASbGnctg5EDkAnHUoZY+0z5lbAloy+BIujhinaYy7a8SLnj001q4eYANgLZjTe5PnhF 0Wncrw46XP4sgEFbiGRK/1Yc7rDzLFI0TrqMeMvS5zwogG6LHby7dFwGrQzosoq1M8OxxFTK8kH OG6NDcbrTzDIXuWVtph7YHraxngP8ftOQ8Azc1w9jpA9gA4Tks3e5AH1qeL5W9RYWxXhd8riJ+m NceSw4iq9KZC/Y74L4Ym8c6W4+hcLf66jwn42cLFZiHezi2WhY2CoPv8rj5+m6XrGBfSchxsNZ5 fu9VgYlwtmCLcleybVgdZUZTnzxTgXXpB6psBNMFfEtHD6j2xZg1qsTbALz/ClCBBJLtBYMl5o4 09RAvt72PAjtVBV0qgTImHdnAG39Ax+ullrldpOx7Og== X-Google-Smtp-Source: AGHT+IG1sZuE/Nfhe9B34FOf/eWJmAMXL0Jv1BzWgBFgKFKiF4bV662uimtyRZWQUXOB9gPR6hlDog== X-Received: by 2002:a05:6512:3b9d:b0:553:37e7:867a with SMTP id 2adb3069b0e04-553b6f4d01bmr3097555e87.49.1750171354119; Tue, 17 Jun 2025 07:42:34 -0700 (PDT) Received: from ribalda.c.googlers.com (166.141.88.34.bc.googleusercontent.com. [34.88.141.166]) by smtp.gmail.com with ESMTPSA id 2adb3069b0e04-553ae234437sm1814992e87.53.2025.06.17.07.42.33 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 17 Jun 2025 07:42:33 -0700 (PDT) From: Ricardo Ribalda Date: Tue, 17 Jun 2025 14:42:24 +0000 Subject: [PATCH v7 3/5] media: uvcvideo: Introduce dev->meta_formats Precedence: bulk X-Mailing-List: linux-usb@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Message-Id: <20250617-uvc-meta-v7-3-9c50623e2286@chromium.org> References: <20250617-uvc-meta-v7-0-9c50623e2286@chromium.org> In-Reply-To: <20250617-uvc-meta-v7-0-9c50623e2286@chromium.org> To: Laurent Pinchart , Mauro Carvalho Chehab , Guennadi Liakhovetski , Greg Kroah-Hartman , Hans de Goede , Hans de Goede Cc: linux-media@vger.kernel.org, linux-kernel@vger.kernel.org, linux-usb@vger.kernel.org, Ricardo Ribalda X-Mailer: b4 0.14.2 Right now, there driver supports devices with one or two metadata formats. Prepare it to support more than two metadata formats. This is achieved with the introduction of a new field `meta_formats`, that contains the array of metadata formats supported by the device, in the order expected by userspace. Signed-off-by: Ricardo Ribalda --- drivers/media/usb/uvc/uvc_driver.c | 7 ++++++ drivers/media/usb/uvc/uvc_metadata.c | 46 ++++++++++++++++++++++++++++++------ drivers/media/usb/uvc/uvcvideo.h | 2 ++ 3 files changed, 48 insertions(+), 7 deletions(-) diff --git a/drivers/media/usb/uvc/uvc_driver.c b/drivers/media/usb/uvc/uvc_driver.c index 62eb45435d8bec5c955720ecb46fb8936871e6cc..9de5abb43e19d9e876cddc5d7124592953db89ac 100644 --- a/drivers/media/usb/uvc/uvc_driver.c +++ b/drivers/media/usb/uvc/uvc_driver.c @@ -2315,6 +2315,13 @@ static int uvc_probe(struct usb_interface *intf, goto error; } + ret = uvc_meta_init(dev); + if (ret < 0) { + dev_err(&dev->udev->dev, + "Error initializing the metadata formats (%d)\n", ret); + goto error; + } + if (dev->quirks & UVC_QUIRK_NO_RESET_RESUME) udev->quirks &= ~USB_QUIRK_RESET_RESUME; diff --git a/drivers/media/usb/uvc/uvc_metadata.c b/drivers/media/usb/uvc/uvc_metadata.c index 82de7781f5b6b70c5ba16bcba9e0741231231904..bc84e849174397f41d1e20bf890a876eeb5a9c67 100644 --- a/drivers/media/usb/uvc/uvc_metadata.c +++ b/drivers/media/usb/uvc/uvc_metadata.c @@ -64,14 +64,20 @@ static int uvc_meta_v4l2_try_format(struct file *file, void *fh, struct uvc_device *dev = stream->dev; struct v4l2_meta_format *fmt = &format->fmt.meta; u32 fmeta = fmt->dataformat; + u32 i; if (format->type != vfh->vdev->queue->type) return -EINVAL; + for (i = 0; (fmeta != dev->meta_formats[i]) && dev->meta_formats[i]; + i++) + ; + if (!dev->meta_formats[i]) + fmeta = V4L2_META_FMT_UVC; + memset(fmt, 0, sizeof(*fmt)); - fmt->dataformat = fmeta == dev->info->meta_format - ? fmeta : V4L2_META_FMT_UVC; + fmt->dataformat = fmeta; fmt->buffersize = UVC_METADATA_BUF_SIZE; return 0; @@ -112,17 +118,21 @@ static int uvc_meta_v4l2_enum_formats(struct file *file, void *fh, struct v4l2_fh *vfh = file->private_data; struct uvc_streaming *stream = video_get_drvdata(vfh->vdev); struct uvc_device *dev = stream->dev; - u32 index = fdesc->index; + u32 i; + + if (fdesc->type != vfh->vdev->queue->type) + return -EINVAL; - if (fdesc->type != vfh->vdev->queue->type || - index > 1U || (index && !dev->info->meta_format)) + for (i = 0; (i < fdesc->index) && dev->meta_formats[i]; i++) + ; + if (!dev->meta_formats[i]) return -EINVAL; memset(fdesc, 0, sizeof(*fdesc)); fdesc->type = vfh->vdev->queue->type; - fdesc->index = index; - fdesc->pixelformat = index ? dev->info->meta_format : V4L2_META_FMT_UVC; + fdesc->index = i; + fdesc->pixelformat = dev->meta_formats[i]; return 0; } @@ -174,3 +184,25 @@ int uvc_meta_register(struct uvc_streaming *stream) V4L2_BUF_TYPE_META_CAPTURE, &uvc_meta_fops, &uvc_meta_ioctl_ops); } + +int uvc_meta_init(struct uvc_device *dev) +{ + static const u32 uvch_only[] = {V4L2_META_FMT_UVC, 0}; + static const u32 d4xx_format[] = {V4L2_META_FMT_UVC, V4L2_META_FMT_D4XX, + 0}; + + switch (dev->info->meta_format) { + case V4L2_META_FMT_D4XX: + dev->meta_formats = d4xx_format; + break; + case 0: + dev->meta_formats = uvch_only; + break; + default: + dev_err(&dev->udev->dev, "Unknown metadata format 0x%x\n", + dev->info->meta_format); + return -EINVAL; + } + + return 0; +} diff --git a/drivers/media/usb/uvc/uvcvideo.h b/drivers/media/usb/uvc/uvcvideo.h index 11d6e3c2ebdfbabd7bbe5722f88ff85f406d9bb6..502f1d5608637cd28ce6f01aee31c4f5df160081 100644 --- a/drivers/media/usb/uvc/uvcvideo.h +++ b/drivers/media/usb/uvc/uvcvideo.h @@ -581,6 +581,7 @@ struct uvc_device { char name[32]; const struct uvc_device_info *info; + const u32 *meta_formats; /* Zero-ended list of meta formats */ atomic_t nmappings; @@ -751,6 +752,7 @@ int uvc_query_ctrl(struct uvc_device *dev, u8 query, u8 unit, void uvc_video_clock_update(struct uvc_streaming *stream, struct vb2_v4l2_buffer *vbuf, struct uvc_buffer *buf); +int uvc_meta_init(struct uvc_device *dev); int uvc_meta_register(struct uvc_streaming *stream); int uvc_register_video_device(struct uvc_device *dev, From patchwork Tue Jun 17 14:42:26 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Ricardo Ribalda X-Patchwork-Id: 897508 Received: from mail-lf1-f50.google.com (mail-lf1-f50.google.com [209.85.167.50]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 86C0320CCC8 for ; Tue, 17 Jun 2025 14:42:37 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.167.50 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1750171361; cv=none; b=NapKuRf3tvhoIicS+Fh1k/6CfMdCEOkm5PaGCa+Kn+MhtPSlfUo+urEY/NO13Vw+XZkf30z5nYH6As6n5QeJr8QFB54hRe3rH9Oq6IH5yJoxTeX0SRQhPRXv3/hzj3/pAoZC/YHceLgEK/Juf2WCZDxhF1m48ig2BFr+pGOKrzQ= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1750171361; c=relaxed/simple; bh=J3RMIWij4olJIZvhHBis/MZpmxz342SGDI+rntvCR3E=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=T2HSuXUHLrMzf8Bm3mOs79rE/h8jeuAfI92leWFvv8tLQjB63Orgr7GGUYAODi41c8ukPoM4Sj8Y6kdF6tVj/4V5hKQ3WRm70o36//Nn7gr/fFOPuRVplMSFgtEIHGMKYdgR65vZspeFXVcFexRPm4Q1dIC9sj6KjJ2aREFIvGQ= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=chromium.org; spf=pass smtp.mailfrom=chromium.org; dkim=pass (1024-bit key) header.d=chromium.org header.i=@chromium.org header.b=a4jBjP9f; arc=none smtp.client-ip=209.85.167.50 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=chromium.org Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=chromium.org Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=chromium.org header.i=@chromium.org header.b="a4jBjP9f" Received: by mail-lf1-f50.google.com with SMTP id 2adb3069b0e04-553b51f5218so4126178e87.0 for ; Tue, 17 Jun 2025 07:42:36 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=chromium.org; s=google; t=1750171355; x=1750776155; darn=vger.kernel.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:from:to:cc:subject:date:message-id :reply-to; bh=mwBKWLCDONZ1Mqgm0XmcqesVTqC7UAS+k/XRYW3pzKs=; b=a4jBjP9fsRF6nntaJwVgxMNYnAEKt2tgnqf+Y9opzaYtMNqL3Fd73zMctIdkzoae05 GUfrm6hER7ybG3bH2RfaCkAyr4j48tMHpKXcwSDJxlCK2acH7NNXMxAK0Zg/QGYB9DK+ y5hwHAof0BMgHD3AV/LxcXfX5V9vGfbChLXxY= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1750171355; x=1750776155; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=mwBKWLCDONZ1Mqgm0XmcqesVTqC7UAS+k/XRYW3pzKs=; b=O5YU4SR9Jt7/K8qJt3xUENEsTAs+9h2nMF8xf7r7qgLiLjcuLct2L70EgTIoscJYsy 3dsy4+1K+wn6wmGgS/LshEFeMAn+FNcheKBQ1WybaddQUDgzJDIuMtt3kVAo8NjCcY12 dk1+rMUtMVtcAd9vy7kVSXsJ4fPuHMo+TY055uihxnD/74zzCQOAJMzdlN2dXVgPNcmq LtK4amX8MBhIegvewTViplZk/iRLsZI7+ZrDfvPx82LDFTSDPh35uBfu3S0ACMZAFnoJ C+ChXquXm/IxhkCbI+BbaHzeB+2RSJQm0yhSiwJiKjs2a2P47EITqY1mY6t5rW7pOOsW q9YQ== X-Forwarded-Encrypted: i=1; AJvYcCXy0M7QkEXs3IR0QctFSco50hXJfazXwl3BGaohTlvEk6vHJCvZqQ57DErP/anx/R7MPtePbWhL53Q=@vger.kernel.org X-Gm-Message-State: AOJu0YzAu4qqd6C3D7BM2WwxokQCN2mh78dnxnwrCvu3867y9W0JZ2u6 adq1UNr1nzgKyEWI7gVdlj3KuCzG6EQLfa8Mszt5Yqwe/Ri4ZLuLPOH0AbwRb6dd3g== X-Gm-Gg: ASbGncsmYy7a/pbPEp/VEfQRwLbcwNHVI21eH5qlh/VeqFkaeMgcvRXdkkWjgSbL/UG DnCWILffMls44q4JCL0JvRjxv1Iw182vIXuQdHWnPX2BVcrG5RbVIB/WrGIDQQ0VxW621Ra4831 zyQOlMgUw6+qDalM4aPjt2eVw7QCK7RB6dw+AmMfPvtshsFKuBSlBOoYotBoeJEWRIOIxTigkbd tJ6M54hKrQ9NbJYgH5dXf/bS3mwun5L+uBxSiEGkQUsFhQzHPZBvv1jemMZTQFGkO0VrTLn9F+M gaXNGzNjkEhsgQ8htl3HHNAR6pMyqk4032Pg5WxZ5ToQ6hdlgEia2Q5Y3Ul3OwBHKaGnsckl0EX 7gQmBuLfN6QbSYdBxjL7cd9iP5t3i3tCNAuNwUZfqBA== X-Google-Smtp-Source: AGHT+IHTAtFnky+kYSniVlDKGuaCPlXNADAnSZ6a7R69ZvRqK5HmhgT/JD2sTazuhQ0dI0Lbnlp1+w== X-Received: by 2002:a05:6512:39c3:b0:553:23f9:bb3b with SMTP id 2adb3069b0e04-553b6f43089mr3171505e87.49.1750171354955; Tue, 17 Jun 2025 07:42:34 -0700 (PDT) Received: from ribalda.c.googlers.com (166.141.88.34.bc.googleusercontent.com. [34.88.141.166]) by smtp.gmail.com with ESMTPSA id 2adb3069b0e04-553ae234437sm1814992e87.53.2025.06.17.07.42.34 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 17 Jun 2025 07:42:34 -0700 (PDT) From: Ricardo Ribalda Date: Tue, 17 Jun 2025 14:42:26 +0000 Subject: [PATCH v7 5/5] media: uvcvideo: Auto-set UVC_QUIRK_MSXU_META Precedence: bulk X-Mailing-List: linux-usb@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Message-Id: <20250617-uvc-meta-v7-5-9c50623e2286@chromium.org> References: <20250617-uvc-meta-v7-0-9c50623e2286@chromium.org> In-Reply-To: <20250617-uvc-meta-v7-0-9c50623e2286@chromium.org> To: Laurent Pinchart , Mauro Carvalho Chehab , Guennadi Liakhovetski , Greg Kroah-Hartman , Hans de Goede , Hans de Goede Cc: linux-media@vger.kernel.org, linux-kernel@vger.kernel.org, linux-usb@vger.kernel.org, Ricardo Ribalda X-Mailer: b4 0.14.2 If the camera supports the MSXU_CONTROL_METADATA control, auto set the MSXU_META quirk. Reviewed-by: Hans de Goede Signed-off-by: Ricardo Ribalda --- drivers/media/usb/uvc/uvc_metadata.c | 71 ++++++++++++++++++++++++++++++++++++ include/linux/usb/uvc.h | 3 ++ 2 files changed, 74 insertions(+) diff --git a/drivers/media/usb/uvc/uvc_metadata.c b/drivers/media/usb/uvc/uvc_metadata.c index b09f81d907d64f7d7a3b0dc52de319879b7e68be..5c3e0f8c5b720a2b962ae82470b836f870dc64b6 100644 --- a/drivers/media/usb/uvc/uvc_metadata.c +++ b/drivers/media/usb/uvc/uvc_metadata.c @@ -10,6 +10,7 @@ #include #include #include +#include #include #include @@ -166,6 +167,71 @@ static const struct v4l2_file_operations uvc_meta_fops = { .mmap = vb2_fop_mmap, }; +static struct uvc_entity *uvc_meta_find_msxu(struct uvc_device *dev) +{ + static const u8 uvc_msxu_guid[16] = UVC_GUID_MSXU_1_5; + struct uvc_entity *entity; + + list_for_each_entry(entity, &dev->entities, list) { + if (!memcmp(entity->guid, uvc_msxu_guid, sizeof(entity->guid))) + return entity; + } + + return NULL; +} + +#define MSXU_CONTROL_METADATA 0x9 +static int uvc_meta_detect_msxu(struct uvc_device *dev) +{ + u32 *data __free(kfree) = NULL; + struct uvc_entity *entity; + int ret; + + entity = uvc_meta_find_msxu(dev); + if (!entity) + return 0; + + /* + * USB requires buffers aligned in a special way, simplest way is to + * make sure that query_ctrl will work is to kmalloc() them. + */ + data = kmalloc(sizeof(*data), GFP_KERNEL); + if (!data) + return -ENOMEM; + + /* Check if the metadata is already enabled. */ + ret = uvc_query_ctrl(dev, UVC_GET_CUR, entity->id, dev->intfnum, + MSXU_CONTROL_METADATA, data, sizeof(*data)); + if (ret) + return 0; + + if (*data) { + dev->quirks |= UVC_QUIRK_MSXU_META; + return 0; + } + + /* + * We have seen devices that require 1 to enable the metadata, others + * requiring a value != 1 and others requiring a value >1. Luckily for + * us, the value from GET_MAX seems to work all the time. + */ + ret = uvc_query_ctrl(dev, UVC_GET_MAX, entity->id, dev->intfnum, + MSXU_CONTROL_METADATA, data, sizeof(*data)); + if (ret || !*data) + return 0; + + /* + * If we can set MSXU_CONTROL_METADATA, the device will report + * metadata. + */ + ret = uvc_query_ctrl(dev, UVC_SET_CUR, entity->id, dev->intfnum, + MSXU_CONTROL_METADATA, data, sizeof(*data)); + if (!ret) + dev->quirks |= UVC_QUIRK_MSXU_META; + + return 0; +} + int uvc_meta_register(struct uvc_streaming *stream) { struct uvc_device *dev = stream->dev; @@ -195,6 +261,11 @@ int uvc_meta_init(struct uvc_device *dev) static const u32 ms_format[] = {V4L2_META_FMT_UVC, V4L2_META_FMT_UVC_MSXU_1_5, 0}; bool support_msxu; + int ret; + + ret = uvc_meta_detect_msxu(dev); + if (ret) + return ret; support_msxu = dev->quirks & UVC_QUIRK_MSXU_META; diff --git a/include/linux/usb/uvc.h b/include/linux/usb/uvc.h index bce95153e5a65613a710d7316fc17cf5462b5bce..ee19e9f915b8370c333c426dc1ee4202c7b75c5b 100644 --- a/include/linux/usb/uvc.h +++ b/include/linux/usb/uvc.h @@ -29,6 +29,9 @@ #define UVC_GUID_EXT_GPIO_CONTROLLER \ {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x03} +#define UVC_GUID_MSXU_1_5 \ + {0xdc, 0x95, 0x3f, 0x0f, 0x32, 0x26, 0x4e, 0x4c, \ + 0x92, 0xc9, 0xa0, 0x47, 0x82, 0xf4, 0x3b, 0xc8} #define UVC_GUID_FORMAT_MJPEG \ { 'M', 'J', 'P', 'G', 0x00, 0x00, 0x10, 0x00, \