From nobody Tue Feb 10 04:20:43 2026 Received: from mail-lf1-f44.google.com (mail-lf1-f44.google.com [209.85.167.44]) (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 96FA428E575 for ; Wed, 4 Jun 2025 12:16:06 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.167.44 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1749039368; cv=none; b=tMCxTbwnSjMUcUWaj7O5t00u+5E0IaBWmnO/x2LsySqLD9MZyJnhrn+UXnx2dE0pPbiqso/YWzjyzqPKEx6xx00t0yVHsj6hQzbePBWS6HEAE0NHl2MY2pvLU88zUbQ8nhIFw6pW9PPk5liXo1zp6oDvYq7/v7qFXZSbncqKrPY= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1749039368; c=relaxed/simple; bh=jSBviQQTH7JAePMwo7QwRip56LEcJbJopD0NUjuBTkQ=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=OrMm6PfLKsLdMe9RfoSvOWxevH0rv4dD31QW9etr1EjmxhnvrLiDhq/5wCWMQ/NQiJfCaK8woNRRGjCE8lB7N241TOFUgdJlBNW2Hr2KO4RnLXDtuH5gOceu4bjdWknM8/a/xvKYKZ+fg4InPewywG0WMqkoFqA0+sL/W/wWyTw= 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=G8iyOkHg; arc=none smtp.client-ip=209.85.167.44 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="G8iyOkHg" Received: by mail-lf1-f44.google.com with SMTP id 2adb3069b0e04-54b10594812so8085647e87.1 for ; Wed, 04 Jun 2025 05:16:06 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=chromium.org; s=google; t=1749039364; x=1749644164; 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=9bRE2ys8mv+7tBhBfvYdhYX2EBs6/nnVBCJEn6Vbnr8=; b=G8iyOkHgPN+IXSQUq/50GbvfkUfYWE1dHn25TjVwlMnCI57vMa0ouZo0U5J7Om9WzN lSozfueM+T7UjGRuGi2SuzxlBQTWdcGNZ2gdVWffCUYLaM7Imp0a3rtLA1zD+6niy3e/ Ddr+9OhNKBcrntuRrnBk07c37Mg5rpDdIef70= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1749039364; x=1749644164; 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=9bRE2ys8mv+7tBhBfvYdhYX2EBs6/nnVBCJEn6Vbnr8=; b=bqitGkovxpUleqxagZ1AWY7uSWogLezVwN5yCXs6fzi0gtQTGgyJaVGqALZoVDeJTl 15EE+NCUbdyHKrqLWSB/YZ1c0Kyth1e4RN7INJmcYgjgzmdCnO4+mih9OuIvYQGLL6eH iWmVocqFUytoK9J1MgMUXfFic8oZwQIy88Clf7WCS8U4qpPF5w5qQztgSvjGzxT24pYP ItcbAjZNyWM9nRbGrh0X0o8rVGAt1dd6SBEHSunwsQkAr8DT4SV+Aqu03cnihXGbN/ZG m20hwz0oVnQdpv30To0EiSmiS0X2ei4ouhUJS0aEZ0JayHgqqcUK6w4nM8BpqCPe1Ywy tEiw== X-Forwarded-Encrypted: i=1; AJvYcCVSd1mU2DaBou+fCdHqV6CPLOnUz+0aKbhyCr6VBZLNc/+koE3y0fRCKwtYIA+T2O450DbkvUadxTmJEqg=@vger.kernel.org X-Gm-Message-State: AOJu0Ywrud0eN3hSbB279hCeels9cOttY2If4/y9cjsuikyMOTVbPOan JfMYJ/tF0W3QAtCguyUphor3HGRNIhJNdg6Klg6PJycjCq0fD1HNErxcN++sxjoObg== X-Gm-Gg: ASbGncvKjN1NC49ewwHMZE0OnCfHkSyz5aK7gCII0MDAwz7rTDqBT5aplzy3A4HD0xa SLc2taln+PNYi02SVy2I89Sd8QgLjueC8kXMpI13hwGy6981Qla2yHcAV3g98DHjlgleyo++T4A fpPZUoa54GMzlARyAc4ETzqbFRPPYlDWlPlgDjF/SgedemsPReoXbANiGJj/Gikd6jHtOUSL0gh sQj3jNpAeZWGQ2YwF2hmCDuNr8frXvAfe5PI9AzqS5S2v9EPBCrsIWOpJ78CGiUb78estGDcdhG dflXKKdOCJINhN85GamxlG+pwbjaQXmziJwbbwNijOAR0iKlh+H+GzTQDLqS+kNTI1+Nlgcal4F l/1bunvC77mXLQTEyN32E+qTrph883vzWodTh X-Google-Smtp-Source: AGHT+IH07nfEfCPRSuygtbpDMHx2EgaT3En+BmBFDnKq74uak7z24qXSWnIDRK5q++KIzPjVa2AeUA== X-Received: by 2002:a05:6512:3d28:b0:549:5866:6489 with SMTP id 2adb3069b0e04-55356defd46mr716577e87.47.1749039364509; Wed, 04 Jun 2025 05:16:04 -0700 (PDT) Received: from ribalda.c.googlers.com (90.52.88.34.bc.googleusercontent.com. [34.88.52.90]) by smtp.gmail.com with ESMTPSA id 2adb3069b0e04-553378a12ecsm2289134e87.90.2025.06.04.05.16.04 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 04 Jun 2025 05:16:04 -0700 (PDT) From: Ricardo Ribalda Date: Wed, 04 Jun 2025 12:16:02 +0000 Subject: [PATCH v6 1/4] media: uvcvideo: Do not mark valid metadata as invalid Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20250604-uvc-meta-v6-1-7141d48c322c@chromium.org> References: <20250604-uvc-meta-v6-0-7141d48c322c@chromium.org> In-Reply-To: <20250604-uvc-meta-v6-0-7141d48c322c@chromium.org> To: Laurent Pinchart , Hans de Goede , Mauro Carvalho Chehab , Guennadi Liakhovetski , Greg Kroah-Hartman Cc: linux-media@vger.kernel.org, linux-kernel@vger.kernel.org, linux-usb@vger.kernel.org, Ricardo Ribalda , stable@vger.kernel.org, Hans de Goede 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 e3567aeb0007c1f0a766f331e4e744359e95a863..b113297dac61f1b2eecd72c36ea= 61ef2c1e7d28a 100644 --- a/drivers/media/usb/uvc/uvc_video.c +++ b/drivers/media/usb/uvc/uvc_video.c @@ -1433,12 +1433,6 @@ static void uvc_video_decode_meta(struct uvc_streami= ng *stream, if (!meta_buf || length =3D=3D 2) return; =20 - if (meta_buf->length - meta_buf->bytesused < - length + sizeof(meta->ns) + sizeof(meta->sof)) { - meta_buf->error =3D 1; - return; - } - has_pts =3D mem[1] & UVC_STREAM_PTS; has_scr =3D mem[1] & UVC_STREAM_SCR; =20 @@ -1459,6 +1453,12 @@ static void uvc_video_decode_meta(struct uvc_streami= ng *stream, !memcmp(scr, stream->clock.last_scr, 6))) return; =20 + if (meta_buf->length - meta_buf->bytesused < + length + sizeof(meta->ns) + sizeof(meta->sof)) { + meta_buf->error =3D 1; + return; + } + meta =3D (struct uvc_meta_buf *)((u8 *)meta_buf->mem + meta_buf->bytesuse= d); local_irq_save(flags); time =3D uvc_video_get_time(); --=20 2.50.0.rc0.604.gd4ff7b7c86-goog From nobody Tue Feb 10 04:20:43 2026 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 5ABB028E609 for ; Wed, 4 Jun 2025 12:16:07 +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=1749039369; cv=none; b=OKmFHJADUXe/CMlCDUn5DntCK92P9ADg9jOC6BWO+U43b0qJVwIFR1uj0TozYrMeMGyqJ4sv5T7GC0jcMaKKfUCAIoWOMdo3NKyD2Pxm5UynBBnonOCaJI2xg2QTUy1FC47bG9GsG/B9nFOS9FubmO7k+TLK2SHA8cuFhBT4cQ4= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1749039369; c=relaxed/simple; bh=R9poar0IHwcvjb7X94DIxPbqfZnQbM35tbbAXoVZYLU=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=A6H4Dxix4xEiLxR+ZG2tdh8hvkRHz6+EgRzXR6axVg/ljZ4AfABCqc7+P6r7MNgiJfuCDEoywqxf0HoFIKEp5LayrUqCn5NIa9epaNAaccUi/AyqVXR2Cr7C1JoNc13PWGjUEVNVu4/coC63eaJSb+vwxkfbnWmxLQ9c3Kej95E= 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=Vwhzcscz; 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="Vwhzcscz" Received: by mail-lf1-f41.google.com with SMTP id 2adb3069b0e04-5533303070cso7514288e87.2 for ; Wed, 04 Jun 2025 05:16:06 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=chromium.org; s=google; t=1749039365; x=1749644165; 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=U65dM4LWKHoC7xW4BA72z8M8lPtxis+hazmUzV/TgxQ=; b=VwhzcscznEi8l5eb9HAbb9nZZHVFk4PLxSHZ9FRj2276NlAmZm2eh+1kin53N0wQWR ofixgFEZeSMUls7eB/6jRB8duaVLT5hQM3ZKM928w8WCmzuQdS6sePdC1FmULqA7c5km ZluFNFVRGJCc1wD4rx4vDV6a54n+6VY096nuE= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1749039365; x=1749644165; 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=U65dM4LWKHoC7xW4BA72z8M8lPtxis+hazmUzV/TgxQ=; b=Mv7EX059iqX2NQM1h9NuFOP6U1rczlOR0fVHZEf3gt/xfc8wAqvxN369bUCLqSs3F2 i9TpNPVcpl+fSA0mjL3cusrMshD/pyLpp7AvYxBu/ksnggXKyFfcGoqDeOc7/2df0BGK c1n4zfys2f+jq6Wfb8qKN0XgUcMHETVJlp6qLJQkRw1El0HKPq44DBZSuPn4oqEL0Dca yTiaXd11yfA2etFEFEF+3dzDJAfl7AMCnbSW4/MnONLal4/jbuh+j4shmZynvQ1S7Biu KqtaCZHLJJjcZcFKEQcKSEiFfKyI6jVwwmLKLdo/1tCc5xQuDg2+HDVerChSBKaKjKm+ QGrA== X-Forwarded-Encrypted: i=1; AJvYcCUZ6Yc8W9oxPnloBaEGqwkeAuuUH5hzZLkuXiPCS5PW3gEW+RZuAPlaTkCk/Mav2fvt8HDk2D5J2rUGRPM=@vger.kernel.org X-Gm-Message-State: AOJu0YzJ4P9pSkqD/baWMwxsd1UVXZYC+uq1C+fy0CdYpoZTaDV9PAbN KfIlawEGsEyfSJ5zCyy/7Dsd0JyEClmePaJD0jBrTTEzO7WZFxThmx6HO9y05582tA== X-Gm-Gg: ASbGnctME1sYDCkBh40G2tUEqVjmfn4Q6v33LfYgdeDpKpbVYiOcPbCSdMqEjFbMkMK 4eCQ+w/TOgu4biB/0/e+QBxZ9F1av5aV1kVb5nREUcY+ldeYm1FMBJnfDvjRn68Pgkuf3AjxAh4 6LfRz6tbbqQkQhLdmsRPaM9N/fgxxi2NoYAmTLq3kbKziKv/5Hskc2+F3p3HeWoycIxR60U1Eyx UhWwH++G/UrEn7wXIYRzqVGe80cM2XWjT0lm+QyLM048vjQCCvHlPYBtKp0LTZjmbdJeL7ndIRI EZiMafdFWRrkkVzkATEsKIx1934rrRT/D/7/3/u3JUsNiwIj7AK06NI5S5LAYqn/Tui9KhIyUOr GDKbCDltowm8pKHqJTRh3Qb3LrLF8nGx9Fq0i X-Google-Smtp-Source: AGHT+IGBrBRDYdNS9IdYcZYK7RO2DqQLHlV/qfBzNERuIj/o5XcOQ3QVU/1bYU8eKuGEsinUybydhQ== X-Received: by 2002:a05:6512:3d9e:b0:553:2e42:fffb with SMTP id 2adb3069b0e04-55356bfb72cmr664186e87.33.1749039365318; Wed, 04 Jun 2025 05:16:05 -0700 (PDT) Received: from ribalda.c.googlers.com (90.52.88.34.bc.googleusercontent.com. [34.88.52.90]) by smtp.gmail.com with ESMTPSA id 2adb3069b0e04-553378a12ecsm2289134e87.90.2025.06.04.05.16.04 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 04 Jun 2025 05:16:04 -0700 (PDT) From: Ricardo Ribalda Date: Wed, 04 Jun 2025 12:16:03 +0000 Subject: [PATCH v6 2/4] media: Documentation: Add note about UVCH length field Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20250604-uvc-meta-v6-2-7141d48c322c@chromium.org> References: <20250604-uvc-meta-v6-0-7141d48c322c@chromium.org> In-Reply-To: <20250604-uvc-meta-v6-0-7141d48c322c@chromium.org> To: Laurent Pinchart , Hans de Goede , Mauro Carvalho Chehab , Guennadi Liakhovetski , Greg Kroah-Hartman Cc: linux-media@vger.kernel.org, linux-kernel@vger.kernel.org, linux-usb@vger.kernel.org, Ricardo Ribalda , Hans de Goede X-Mailer: b4 0.14.2 The documentation currently describes the UVC length field as the "length of the rest of the block", which can be misleading. The driver limits the data copied to a maximum of 12 bytes. This change adds a clarifying sentence to the documentation to make this restriction explicit. Reviewed-by: Hans de Goede Signed-off-by: Ricardo Ribalda --- Documentation/userspace-api/media/v4l/metafmt-uvc.rst | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/Documentation/userspace-api/media/v4l/metafmt-uvc.rst b/Docume= ntation/userspace-api/media/v4l/metafmt-uvc.rst index 784346d14bbdbf28348262084d5b0646d30bd1da..4c05e9e54683a2bf844ddf26f99= d0d9713ef05de 100644 --- a/Documentation/userspace-api/media/v4l/metafmt-uvc.rst +++ b/Documentation/userspace-api/media/v4l/metafmt-uvc.rst @@ -44,7 +44,9 @@ Each individual block contains the following fields: them * - :cspan:`1` *The rest is an exact copy of the UVC payload header:* * - __u8 length; - - length of the rest of the block, including this field + - length of the rest of the block, including this field. Please note= that + regardless of this value, for V4L2_META_FMT_UVC the kernel will ne= ver + copy more than 2-12 bytes. * - __u8 flags; - Flags, indicating presence of other standard UVC fields * - __u8 buf[]; --=20 2.50.0.rc0.604.gd4ff7b7c86-goog From nobody Tue Feb 10 04:20:43 2026 Received: from mail-lf1-f42.google.com (mail-lf1-f42.google.com [209.85.167.42]) (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 CD35F28EA69 for ; Wed, 4 Jun 2025 12:16:07 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.167.42 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1749039370; cv=none; b=RgzFkj2BvEe7wbHFaqPxVzvIqE8epmLHZseqlAfXZVgJ8x0AGdB9Sr7jZ7+X3uK5aMAuovU/SPYI3yibnS49R9fVhXAuerQg2V9MFSWDm7bhI/sUcsZ6xJeCDF21EHlzecpzBijY8yz0zi6XakZWvOZEWLHbmcNVoWBcOgRXDPQ= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1749039370; c=relaxed/simple; bh=iQEqTG4/3UDjJ+E3KJa+z+GCpi2U4Apdf9LwAOxBmDc=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=Dcxtg1mlIwFBV8d1utyw0DFcgLTEi+QVV3rMdxxq1pAN3C5R02dx5LmG+5EAuz+oVLcXnHoLLceVRj2ibOM3EYy6+yinPuUPSxghNLcBGMc1jMcp1UowySUYubg4cjRpiPQz03N9Bqlv8uH2r/j/r31uM8Dq9AgpvmkJAwJIMjg= 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=msGOwrwJ; arc=none smtp.client-ip=209.85.167.42 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="msGOwrwJ" Received: by mail-lf1-f42.google.com with SMTP id 2adb3069b0e04-55220699ba8so8510683e87.2 for ; Wed, 04 Jun 2025 05:16:07 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=chromium.org; s=google; t=1749039366; x=1749644166; 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=Rpn5XLuZmuf4jyqtpvFJSJfn3q1HBa9vHQrTSB1V4GQ=; b=msGOwrwJIa2KdW9VLT26AhD8GiVYfFxY5JdW2sYHOmqJF0O/abqPhJKeaDkjpS7VD6 8a3OIXXKe0ruSRnI25E6mi5gb2MqRofs0I7mEdOYfJctoKN9odN3YIlIzFXJLHB3qEbH vHaK1eefl/UfZzfObW6i1AtniQQ7lzMIII5rY= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1749039366; x=1749644166; 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=Rpn5XLuZmuf4jyqtpvFJSJfn3q1HBa9vHQrTSB1V4GQ=; b=aPRq4FoZEU3yGXXu1nNI/PhcJ04XInIkkcc+VMLLUVacRxM6b+IXhVtJF6I6BDwb76 U6vPsqfNAgf46xIhXLaul8Y41EbxdcSv/yzhLgFoEPauqVPmfznG05eTb/6aKlGd9q7g ru+0iDK0VfzaTJ9A7Po1Uc/t2Guk5V0pSEMoO4KDyYXunEhk9hrd+zEVI/SMK5AdbfnT fb8OK+7YsBODMVyHTsBA6LsiDMv4J+4OsY5qhdN4nKvR3EDClhT1AW9Zt1USl5xPAoow 7OYE6tkxG4hRUkk4b1MbdvshcarAcJaE7b6Bpl1YV8C0CcWD9iO2+cDW5e4T4YcmWdnG JhUA== X-Forwarded-Encrypted: i=1; AJvYcCXENBG+sma5H7TM43jMua5/dn77HRkM/bROm8fm969d/KO4SN/KaAmte20pwUUFM/qRErzLIGAsYLXhBxc=@vger.kernel.org X-Gm-Message-State: AOJu0YyI963A/LiWHWkHLUc7TTjslwubxxPF+RZLUWEqIKUlSPGOgP/f MeLms61g63sCy6mmzVwsQV7WhOCDbXIS5faebj/r5DMmVJZfXRcewWsdVkOBhFQenw== X-Gm-Gg: ASbGncsENKnc29fO9miguVkvpQieqFzDRFVJUYvmSuqOU+2KWGTOkIEqT0JIaLknfyp vN1tfobRAh3RqegvsEXrapmJ1JtcNxnCcTRKvNHJ4L3PQFhsKUxWW6n5YOmIk07WipUWr0EfLmD qEkfTOvACG2W2AIfCvTmVVwO5m3yALrYsAWMnx8kQfbIZhlZbIs3YdaKXMrgakwkORbkb0ndtTd Wx9/1MsL78iZZK3NED65+leacHDGkhdlT/gL0M0elLtNPx7D79Te1Vw/8ZkM6+lH04xNqwAwomh bzWI94/4fDMOuoV0VNcx+pk0odB8CzSGecyPa5+L6oQHo4xn0uf44e0UWK0xEMNg/lA6to73UWP 2+MYS0MQPMU23ujBksyyQ8SUUiA== X-Google-Smtp-Source: AGHT+IF3RtTm2BDDHqCJioBd+yKx4Lso0a0nlgtuzqJjFvwDip15oCrnHIDxvdROipxY74nFayO7tw== X-Received: by 2002:a05:6512:2214:b0:550:d4f3:84a6 with SMTP id 2adb3069b0e04-55356c040femr799958e87.33.1749039365904; Wed, 04 Jun 2025 05:16:05 -0700 (PDT) Received: from ribalda.c.googlers.com (90.52.88.34.bc.googleusercontent.com. [34.88.52.90]) by smtp.gmail.com with ESMTPSA id 2adb3069b0e04-553378a12ecsm2289134e87.90.2025.06.04.05.16.05 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 04 Jun 2025 05:16:05 -0700 (PDT) From: Ricardo Ribalda Date: Wed, 04 Jun 2025 12:16:04 +0000 Subject: [PATCH v6 3/4] media: uvcvideo: Introduce V4L2_META_FMT_UVC_MSXU_1_5 Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20250604-uvc-meta-v6-3-7141d48c322c@chromium.org> References: <20250604-uvc-meta-v6-0-7141d48c322c@chromium.org> In-Reply-To: <20250604-uvc-meta-v6-0-7141d48c322c@chromium.org> To: Laurent Pinchart , Hans de Goede , Mauro Carvalho Chehab , Guennadi Liakhovetski , Greg Kroah-Hartman Cc: linux-media@vger.kernel.org, linux-kernel@vger.kernel.org, linux-usb@vger.kernel.org, Ricardo Ribalda , Hans de Goede X-Mailer: b4 0.14.2 The UVC driver provides two metadata types V4L2_META_FMT_UVC, and V4L2_META_FMT_D4XX. The only difference between the two of them is that V4L2_META_FMT_UVC only copies PTS, SCR, size and flags, and V4L2_META_FMT_D4XX copies the whole metadata section. Now we only enable V4L2_META_FMT_D4XX for the Intel D4xx family of devices, but it is useful to have the whole metadata payload for any device where vendors include other metadata, such as the one described by Microsoft: https://learn.microsoft.com/en-us/windows-hardware/drivers/stream/mf-captur= e-metadata This patch introduces a new format V4L2_META_FMT_UVC_MSXU_1_5, that is identical to V4L2_META_FMT_D4XX. Let the user enable this format with a quirk for now. This way they can test if their devices provide useful metadata without rebuilding the kernel. They can later contribute patches to auto-quirk their devices. We will also work in methods to auto-detect devices compatible with this new metadata format. Suggested-by: Hans de Goede Reviewed-by: Hans de Goede Signed-off-by: Ricardo Ribalda --- .../userspace-api/media/v4l/meta-formats.rst | 1 + .../media/v4l/metafmt-uvc-msxu-1-5.rst | 23 +++++++++++ MAINTAINERS | 1 + drivers/media/usb/uvc/uvc_metadata.c | 44 ++++++++++++++++++= +--- drivers/media/usb/uvc/uvcvideo.h | 1 + drivers/media/v4l2-core/v4l2-ioctl.c | 1 + include/uapi/linux/videodev2.h | 1 + 7 files changed, 66 insertions(+), 6 deletions(-) diff --git a/Documentation/userspace-api/media/v4l/meta-formats.rst b/Docum= entation/userspace-api/media/v4l/meta-formats.rst index bb6876cfc271e1a0543eee4209d6251e1a6a73cc..0de80328c36bf148051a19abe9e= 5241234ddfe5c 100644 --- a/Documentation/userspace-api/media/v4l/meta-formats.rst +++ b/Documentation/userspace-api/media/v4l/meta-formats.rst @@ -20,6 +20,7 @@ These formats are used for the :ref:`metadata` interface = only. metafmt-pisp-fe metafmt-rkisp1 metafmt-uvc + metafmt-uvc-msxu-1-5 metafmt-vivid metafmt-vsp1-hgo metafmt-vsp1-hgt diff --git a/Documentation/userspace-api/media/v4l/metafmt-uvc-msxu-1-5.rst= b/Documentation/userspace-api/media/v4l/metafmt-uvc-msxu-1-5.rst new file mode 100644 index 0000000000000000000000000000000000000000..dd1c3076df243d770a13e7f6d07= c3296a269e16a --- /dev/null +++ b/Documentation/userspace-api/media/v4l/metafmt-uvc-msxu-1-5.rst @@ -0,0 +1,23 @@ +.. SPDX-License-Identifier: GFDL-1.1-no-invariants-or-later + +.. _v4l2-meta-fmt-uvc-msxu-1-5: + +*********************************** +V4L2_META_FMT_UVC_MSXU_1_5 ('UVCM') +*********************************** + +Microsoft(R)'s UVC Payload Metadata. + + +Description +=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D + +V4L2_META_FMT_UVC_MSXU_1_5 buffers follow the metadata buffer layout of +V4L2_META_FMT_UVC with the only difference that it includes all the UVC +metadata in the `buffer[]` field, not just the first 2-12 bytes. + +The metadata format follows the specification from Microsoft(R) [1]. + +.. _1: + +[1] https://docs.microsoft.com/en-us/windows-hardware/drivers/stream/uvc-e= xtensions-1-5 diff --git a/MAINTAINERS b/MAINTAINERS index 137122d3dc4e46194eba1c4e035e24b203ed46c5..939def0992c259655c3ae1cc8a7= 57ce53e9c650e 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -25215,6 +25215,7 @@ S: Maintained W: http://www.ideasonboard.org/uvc/ T: git git://linuxtv.org/media.git F: Documentation/userspace-api/media/drivers/uvcvideo.rst +F: Documentation/userspace-api/media/v4l/metafmt-uvc-msxu-1-5.rst F: Documentation/userspace-api/media/v4l/metafmt-uvc.rst F: drivers/media/common/uvc.c F: drivers/media/usb/uvc/ diff --git a/drivers/media/usb/uvc/uvc_metadata.c b/drivers/media/usb/uvc/u= vc_metadata.c index 82de7781f5b6b70c5ba16bcba9e0741231231904..df3f259271c675feb590c4534da= d95b3b786f082 100644 --- a/drivers/media/usb/uvc/uvc_metadata.c +++ b/drivers/media/usb/uvc/uvc_metadata.c @@ -63,15 +63,22 @@ static int uvc_meta_v4l2_try_format(struct file *file, = void *fh, struct uvc_streaming *stream =3D video_get_drvdata(vfh->vdev); struct uvc_device *dev =3D stream->dev; struct v4l2_meta_format *fmt =3D &format->fmt.meta; - u32 fmeta =3D fmt->dataformat; + u32 fmeta; + + if (fmt->dataformat =3D=3D dev->info->meta_format) + fmeta =3D dev->info->meta_format; + else if (fmt->dataformat =3D=3D V4L2_META_FMT_UVC_MSXU_1_5 && + dev->quirks & UVC_QUIRK_MSXU_META) + fmeta =3D V4L2_META_FMT_UVC_MSXU_1_5; + else + fmeta =3D V4L2_META_FMT_UVC; =20 if (format->type !=3D vfh->vdev->queue->type) return -EINVAL; =20 memset(fmt, 0, sizeof(*fmt)); =20 - fmt->dataformat =3D fmeta =3D=3D dev->info->meta_format - ? fmeta : V4L2_META_FMT_UVC; + fmt->dataformat =3D fmeta; fmt->buffersize =3D UVC_METADATA_BUF_SIZE; =20 return 0; @@ -106,6 +113,27 @@ static int uvc_meta_v4l2_set_format(struct file *file,= void *fh, return ret; } =20 +static u32 uvc_meta_idx_to_fmeta(struct uvc_device *dev, u32 index) +{ + switch (index) { + case 0: + return V4L2_META_FMT_UVC; + case 1: + if (dev->info->meta_format) + return dev->info->meta_format; + if (dev->quirks & UVC_QUIRK_MSXU_META) + return V4L2_META_FMT_UVC_MSXU_1_5; + return 0; + case 2: + if (dev->info->meta_format && + dev->quirks & UVC_QUIRK_MSXU_META) + return V4L2_META_FMT_UVC_MSXU_1_5; + return 0; + } + + return 0; +} + static int uvc_meta_v4l2_enum_formats(struct file *file, void *fh, struct v4l2_fmtdesc *fdesc) { @@ -113,16 +141,20 @@ static int uvc_meta_v4l2_enum_formats(struct file *fi= le, void *fh, struct uvc_streaming *stream =3D video_get_drvdata(vfh->vdev); struct uvc_device *dev =3D stream->dev; u32 index =3D fdesc->index; + u32 fmeta; + + if (fdesc->type !=3D vfh->vdev->queue->type) + return -EINVAL; =20 - if (fdesc->type !=3D vfh->vdev->queue->type || - index > 1U || (index && !dev->info->meta_format)) + fmeta =3D uvc_meta_idx_to_fmeta(dev, fdesc->index); + if (!fmeta) return -EINVAL; =20 memset(fdesc, 0, sizeof(*fdesc)); =20 fdesc->type =3D vfh->vdev->queue->type; fdesc->index =3D index; - fdesc->pixelformat =3D index ? dev->info->meta_format : V4L2_META_FMT_UVC; + fdesc->pixelformat =3D fmeta; =20 return 0; } diff --git a/drivers/media/usb/uvc/uvcvideo.h b/drivers/media/usb/uvc/uvcvi= deo.h index b9f8eb62ba1d82ea7788cf6c10cc838a429dbc9e..2b6d9ddc18e751bef4d295439c4= 60b741d1a1a2f 100644 --- a/drivers/media/usb/uvc/uvcvideo.h +++ b/drivers/media/usb/uvc/uvcvideo.h @@ -77,6 +77,7 @@ #define UVC_QUIRK_DISABLE_AUTOSUSPEND 0x00008000 #define UVC_QUIRK_INVALID_DEVICE_SOF 0x00010000 #define UVC_QUIRK_MJPEG_NO_EOF 0x00020000 +#define UVC_QUIRK_MSXU_META 0x00040000 =20 /* Format flags */ #define UVC_FMT_FLAG_COMPRESSED 0x00000001 diff --git a/drivers/media/v4l2-core/v4l2-ioctl.c b/drivers/media/v4l2-core= /v4l2-ioctl.c index 650dc1956f73d2f1943b56c42140c7b8d757259f..ba508f7fb577021497009ab23a7= be5add23fd08c 100644 --- a/drivers/media/v4l2-core/v4l2-ioctl.c +++ b/drivers/media/v4l2-core/v4l2-ioctl.c @@ -1459,6 +1459,7 @@ static void v4l_fill_fmtdesc(struct v4l2_fmtdesc *fmt) case V4L2_META_FMT_VSP1_HGO: descr =3D "R-Car VSP1 1-D Histogram"; break; case V4L2_META_FMT_VSP1_HGT: descr =3D "R-Car VSP1 2-D Histogram"; break; case V4L2_META_FMT_UVC: descr =3D "UVC Payload Header Metadata"; break; + case V4L2_META_FMT_UVC_MSXU_1_5: descr =3D "UVC MSXU Metadata"; break; case V4L2_META_FMT_D4XX: descr =3D "Intel D4xx UVC Metadata"; break; case V4L2_META_FMT_VIVID: descr =3D "Vivid Metadata"; break; case V4L2_META_FMT_RK_ISP1_PARAMS: descr =3D "Rockchip ISP1 3A Parameters= "; break; diff --git a/include/uapi/linux/videodev2.h b/include/uapi/linux/videodev2.h index 9e3b366d5fc79d8a04c6f0752858fc23363db65c..75f2096b2d4fed5e0235ea4732d= 35044ff77a98b 100644 --- a/include/uapi/linux/videodev2.h +++ b/include/uapi/linux/videodev2.h @@ -861,6 +861,7 @@ struct v4l2_pix_format { #define V4L2_META_FMT_VSP1_HGT v4l2_fourcc('V', 'S', 'P', 'T') /* R-Car= VSP1 2-D Histogram */ #define V4L2_META_FMT_UVC v4l2_fourcc('U', 'V', 'C', 'H') /* UVC P= ayload Header metadata */ #define V4L2_META_FMT_D4XX v4l2_fourcc('D', '4', 'X', 'X') /* D4XX = Payload Header metadata */ +#define V4L2_META_FMT_UVC_MSXU_1_5 v4l2_fourcc('U', 'V', 'C', 'M') /* UVC= MSXU metadata */ #define V4L2_META_FMT_VIVID v4l2_fourcc('V', 'I', 'V', 'D') /* Vivid Met= adata */ =20 /* Vendor specific - used for RK_ISP1 camera sub-system */ --=20 2.50.0.rc0.604.gd4ff7b7c86-goog From nobody Tue Feb 10 04:20:43 2026 Received: from mail-lf1-f51.google.com (mail-lf1-f51.google.com [209.85.167.51]) (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 686FA252295 for ; Wed, 4 Jun 2025 12:16:08 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.167.51 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1749039371; cv=none; b=My5oXUjySOsMiX1WMiX4z+xd3Kj+R4unmsZreRPUKT3YNJie2OEs42CcMVbTleN4F/zLSf1IuqXEVUtBpUV+z/baPz7Cnyi9VuHoCRFZTcWCn0J3vPkHYlVwhsKGWRz46oWpE4kH7SrBq+ALTEhcaI0O/OriZw9GottoWEIIbcE= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1749039371; c=relaxed/simple; bh=qb2IsYSQmLLLKdcyr0dhshT0CIs3hy85Pfrju2/okvw=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=bgPAwLTm4PFWRR9gu9W5/n97FFZWaOjMxot0E1czq2pKCdLo2D5a9hjbdJXuAljl1sSWc/pzmEMcGXyHGw4gMQzOs1vTfuKCTIGQXH9l34Je39l6WQRFKkDPKHIqiIblVGi8UPzIWBGzqKERREreTzgzAaa7nQaNIAi5HJONFXc= 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=M0eFwaAZ; arc=none smtp.client-ip=209.85.167.51 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="M0eFwaAZ" Received: by mail-lf1-f51.google.com with SMTP id 2adb3069b0e04-54acc0cd458so8317418e87.0 for ; Wed, 04 Jun 2025 05:16:08 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=chromium.org; s=google; t=1749039366; x=1749644166; 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=WMJRjZ4qL/tvILSJe2gN3C50PVnnmdOg1JfvMI0lfRc=; b=M0eFwaAZLuM95X8w4hQhyn1gMgbzNw8Rf95rHy4MkRlc7sN1u3duvIuINzCBnx6u5a lL0J6pL6nl3ZbLdWitKgruGjhONp0cidWIV5v/tQqSOmfrWChgjH3KOrUYHCZzUrQfKH A0ZNcWHcgplpLYkvowgtDrirwpkNDpdpAqBMU= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1749039366; x=1749644166; 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=WMJRjZ4qL/tvILSJe2gN3C50PVnnmdOg1JfvMI0lfRc=; b=AGd4o+jNMT0f7A1PU4XVL61FeYduVJXUBVjsRZgE4lS8cnpWUy6UYVfUBvDMo63oHn hcraR4G/+VE5XQqJT5r2XmJKXBqEThpuSZC7uHmUN24Vw8pAqp9o3BnoW2VysBJ6QT8/ cINm2Xu+QsrCvrekmQbfHfN2uXaCCeP4vmOTpM/lGSXD+vVY/K+2M1qClrYIYGm/adc9 6m+xunVE20+8jw50YZoX/3vZ+MHMfBfLIBqsr3HVePxp+oyYVNn1vt3F5bBgSDjq84eM Y8PRHrIPXx5IVTMWfB3ldUYR9jKJBdWHhH8kVgqshqCtNzCrgB8C4qfQhm/MGhTUqHX7 st7Q== X-Forwarded-Encrypted: i=1; AJvYcCXw4pCb44UTrvkC9zsDvpFG4bSUqaMPK2RHR2wWwdSgOFNI7t3yRt0OzoMr851SO6a3kpIsPDlZNx5ewGQ=@vger.kernel.org X-Gm-Message-State: AOJu0YwXkUDOHJmE9HjjAUHVpwHI2dCy3I8HJg1FO3J4Cqm71ElGMNCZ 8ry5btGfCoK5icKNvbjPbWTjjHipYTMAU/5TGx3/oHNVVpUfA8mS/w77pAtQXNiK8au3vHu2kYI UWFw= X-Gm-Gg: ASbGncvHgvSUFdXkQSLpmje6wgP08HhFHR4T+OlRFUZzGaGCXYP+AXMTumsmEI3niaL d64o5QhXGvh6WxACBqGYXAYFPHHnhc6e+p2fDh3ohASq+a/NPRF3VkEC43gZ59O42vkNlWiMZnp Zfnp0a1slK9TJ+jZuIFIyDFSOImSED0rsOphlFDeyZsFtSv/un0kDKqJKNslhaoWoz/9biliG9L 6oWpGbB3kvH7IvcnY/pbtd+VLua6bG+WHV8rP8yJsxXybC0R+1ERI2Jlz/Ky2xqO/xZ5UgTDvx1 bRcP2jRkD3w5x2hgfsFN3wdxu2P/OnyL/bEZ1Fzk0w8nk6cNxkdjDYgWxsFZvA6Cy8KI+CfRKnT aRwXrjxIwFscnGnAPjmD/SbhAvCmtIx9PfT+p X-Google-Smtp-Source: AGHT+IE+7NzqkeD+ZSyHu/dQA5YK9mbS7I0/oekl8u6s5H7/C/PTVU979D4mgOjItWdWoshdoyZQ+g== X-Received: by 2002:a05:6512:39c4:b0:553:2480:230b with SMTP id 2adb3069b0e04-55356aea00cmr772720e87.22.1749039366427; Wed, 04 Jun 2025 05:16:06 -0700 (PDT) Received: from ribalda.c.googlers.com (90.52.88.34.bc.googleusercontent.com. [34.88.52.90]) by smtp.gmail.com with ESMTPSA id 2adb3069b0e04-553378a12ecsm2289134e87.90.2025.06.04.05.16.06 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 04 Jun 2025 05:16:06 -0700 (PDT) From: Ricardo Ribalda Date: Wed, 04 Jun 2025 12:16:05 +0000 Subject: [PATCH v6 4/4] media: uvcvideo: Auto-set UVC_QUIRK_MSXU_META Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20250604-uvc-meta-v6-4-7141d48c322c@chromium.org> References: <20250604-uvc-meta-v6-0-7141d48c322c@chromium.org> In-Reply-To: <20250604-uvc-meta-v6-0-7141d48c322c@chromium.org> To: Laurent Pinchart , Hans de Goede , Mauro Carvalho Chehab , Guennadi Liakhovetski , Greg Kroah-Hartman Cc: linux-media@vger.kernel.org, linux-kernel@vger.kernel.org, linux-usb@vger.kernel.org, Ricardo Ribalda , Hans de Goede 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 | 72 ++++++++++++++++++++++++++++++++= ++++ include/linux/usb/uvc.h | 3 ++ 2 files changed, 75 insertions(+) diff --git a/drivers/media/usb/uvc/uvc_metadata.c b/drivers/media/usb/uvc/u= vc_metadata.c index df3f259271c675feb590c4534dad95b3b786f082..cd58427578ff413591b60abe0a2= 10b90802dddc7 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 =20 #include @@ -188,11 +189,82 @@ static const struct v4l2_file_operations uvc_meta_fop= s =3D { .mmap =3D vb2_fop_mmap, }; =20 +static const u8 uvc_msxu_guid[16] =3D UVC_GUID_MSXU_1_5; + +static struct uvc_entity *uvc_meta_find_msxu(struct uvc_device *dev) +{ + 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) =3D NULL; + struct uvc_entity *entity; + int ret; + + entity =3D 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 =3D kmalloc(sizeof(*data), GFP_KERNEL); + if (!data) + return -ENOMEM; + + /* Check if the metadata is already enabled. */ + ret =3D 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 |=3D UVC_QUIRK_MSXU_META; + return 0; + } + + /* + * We have seen devices that require 1 to enable the metadata, others + * requiring a value !=3D 1 and others requiring a value >1. Luckily for + * us, the value from GET_MAX seems to work all the time. + */ + ret =3D 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 =3D uvc_query_ctrl(dev, UVC_SET_CUR, entity->id, dev->intfnum, + MSXU_CONTROL_METADATA, data, sizeof(*data)); + if (!ret) + dev->quirks |=3D UVC_QUIRK_MSXU_META; + + return 0; +} + int uvc_meta_register(struct uvc_streaming *stream) { struct uvc_device *dev =3D stream->dev; struct video_device *vdev =3D &stream->meta.vdev; struct uvc_video_queue *queue =3D &stream->meta.queue; + int ret; + + ret =3D uvc_meta_detect_msxu(dev); + if (ret) + return ret; =20 stream->meta.format =3D V4L2_META_FMT_UVC; =20 diff --git a/include/linux/usb/uvc.h b/include/linux/usb/uvc.h index bce95153e5a65613a710d7316fc17cf5462b5bce..ee19e9f915b8370c333c426dc1e= e4202c7b75c5b 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} =20 #define UVC_GUID_FORMAT_MJPEG \ { 'M', 'J', 'P', 'G', 0x00, 0x00, 0x10, 0x00, \ --=20 2.50.0.rc0.604.gd4ff7b7c86-goog