From nobody Tue Oct 7 18:22:21 2025 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 E5D352652BD for ; Mon, 7 Jul 2025 18:34:04 +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=1751913247; cv=none; b=oeHulQgg/LU2Fz4oXIJxt7W2Wv845JCJWJdOu/ZP9WgN5uTYpjgo0I+kypt7fJbNosZa84VcmHM+R6LmYkR/DAd66YtSbifvfij21T2T5+xCin1O/FoCxzEErnIE0MyPDvq6f0ql1irbsEy6IuQxqTkXo3SnDHeV/hmuEKwxGWs= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1751913247; c=relaxed/simple; bh=RVxAqarkuhEy/QD/KmC40z7AIVmkZCTNthOhmweLPWE=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=SG6FxGYaER4K2eWgbrKeKypt32flfixHdWborcmJGm4KbVFm2tG7icKozPTjMTLrx1k4mtdhbBf+fW+Fs+dNjRROmlHKIalx/qVWRtboA/g0mcO7gVyrLLkMNSoLoGq1b303tnygECFrFfxjGB1YKw2IYCVPXC/IweBipMUQSTw= 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=ReLbL6Ef; 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="ReLbL6Ef" Received: by mail-lf1-f51.google.com with SMTP id 2adb3069b0e04-553b584ac96so3376833e87.1 for ; Mon, 07 Jul 2025 11:34:04 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=chromium.org; s=google; t=1751913243; x=1752518043; 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=NEhoouKujX/9FWBm8EBjOLs/wPi+sCT2bfLGhUx3n5Y=; b=ReLbL6EfWBuUhA6aT/giSyaRRxVPOU+NwkQNz2WXqa+b0ldRYnDjtEz2ntC6s5O315 fDt2+rmZR/OqpyNW3K4IA3JbgBnJOJXek4WEzrFwewdtJ9OUFT+ZvJeGVpRWzeAos1Jb oX5JhiKOlIv2I222P4u94m2/5ErN5h57U0skU= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1751913243; x=1752518043; 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=NEhoouKujX/9FWBm8EBjOLs/wPi+sCT2bfLGhUx3n5Y=; b=sLSIDYVEfTvAZbaRnzX+4oRnt8OuJbVFEZu/wZohqMY3W4bI5WkkAud15wMC/Rpik9 C89gZTPu0A5jy1XJvQUH481IYyKTqFFF8NawGdDhqrjaQlK8L9SSoeGrg/LuPO+KDPHu WUPVBrwtwSegJtSQDCuNINzNI/66HxIQd+kIof+I2j7kgsef14TPO5RRIHpGzk/e5QaX 89O2MWoorndua/JRjVZoW8FOzfPfXC5wB2ZXfxo4mUeIMdlQsZxdQVcGlhmEY/0QRaGl fSmPGwwwkgOovAYeL/BC8zzlnesHqp826u9WbSl2hbgiTZLTfOgF2QXf/Gs6HvRL4/St guTg== X-Forwarded-Encrypted: i=1; AJvYcCUBrbb+RkYB5TDFgtiR+/Cq7vsYCjTut5keoXTreDIOsg2r1J7Uiq7iri0wTdtPndvXK3KowcmU3vRo0GI=@vger.kernel.org X-Gm-Message-State: AOJu0Yw39qkbwQUv69trXzb2RZqqqNaSyCz3GG+4qGJ4LyTsMKS4rief jjwz6nFF7d5c1D7dNMy+rit3RY2repyKLg0rNbGlWunJmWyh2MMJTZ6HqYLQWk2IJQ== X-Gm-Gg: ASbGncuf5HleQmeKaEDWl1hZHjhh1SNROFh3wCHWw0ACgutxiKgDegpoXZRuNlRPj+e 5qoOv0Y4CZl2IWoPTjZbDvn1XjkzzNYM4S0yPs5dCXXjN0zO82dXGK70F7ybIkCYyYTKpQkYR0K d9/AUHogCTTX6n93QQGR+va3VAH1B6jDxuoi/ws8KBXhPgkeMWrtzCC94yzUeXTBHEwcPzOQd9K h40Qz5/dq3NCD0n/p4YFmVq41MlIfZYGpX84a+6ocE+BwDMQaNrVEeO3wn64xTxJOzZJ8oFiu60 sIlXW6Q2g0iOb+hn+jLRz9Qes7aEK5PEV9jWzK95zJQQlsvYBxoLPzXriVDP6eo63mdkMucBISz qwvXTs7fXLgTNoAIRZDg5MspIFvSNLQRfzyx62193Cw== X-Google-Smtp-Source: AGHT+IGKJuOX4Bg7R899m2AwcOsJNjoMYlKG41sbEd23b05icnKCcd071bRXekr5xYL9YnWZKX+jcw== X-Received: by 2002:a05:6512:3c94:b0:553:aa32:4106 with SMTP id 2adb3069b0e04-557e5556e89mr2272305e87.23.1751913242985; Mon, 07 Jul 2025 11:34:02 -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-556383d31a6sm1417630e87.61.2025.07.07.11.34.02 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 07 Jul 2025 11:34:02 -0700 (PDT) From: Ricardo Ribalda Date: Mon, 07 Jul 2025 18:34:01 +0000 Subject: [PATCH v8 1/5] 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: <20250707-uvc-meta-v8-1-ed17f8b1218b@chromium.org> References: <20250707-uvc-meta-v8-0-ed17f8b1218b@chromium.org> In-Reply-To: <20250707-uvc-meta-v8-0-ed17f8b1218b@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..2e377e7b9e81599aca19b800a17= 1cc16a09c1e8a 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_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 @@ -1468,6 +1462,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.727.gbf7dc18ff4-goog From nobody Tue Oct 7 18:22:21 2025 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 68627270ED9 for ; Mon, 7 Jul 2025 18:34:05 +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=1751913248; cv=none; b=kOeo+zQHE9h53xhj5h7Z3o+VsbESWGd276B9S8E6jy070TPwkl6gCJNmqyxQ4Xb8Wr+4Qr+Yqwzl3oEERpCqkE0ugOhQ5bOn19GQnighV/o3Ay6eTvV29+kNsR8KUoos2Q0LaiGi0rkQVtzDTyktcbZEMRr5NlauBbj4R3P69qE= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1751913248; c=relaxed/simple; bh=YNGFFPC9zzW74qiewwqmxjg3sbDXhOxc1nuxGLMg4Jo=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=cLzD/hLN84NaYe8QrOyQYlCv+KnvF+sJzHvoERcE40cdI0/R/HEPNeg90iNRWXYuYFExCpQSIavQD92SYM3BUpU7GHuTC1ZnNaNUhUWpGUI/F+KcPrVIpTS3D0l9C3ne4t/Nt1jrCKMHYxSMF+FVW1rPrwK2qggVPqEs1+yAlD4= 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=UOAvDuOH; 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="UOAvDuOH" Received: by mail-lf1-f51.google.com with SMTP id 2adb3069b0e04-55516abe02cso3551903e87.0 for ; Mon, 07 Jul 2025 11:34:05 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=chromium.org; s=google; t=1751913243; x=1752518043; 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=9os3lS8fH6kHGyK9R2m8uRATRzh2C1OPAQHL6vUS+6g=; b=UOAvDuOHTlTW3SP79K6ikfG58LdJjxXuhl/24IwvFx2i2XnQfL+7UU+PGEkw2T/bQ/ uG9FWQswii2lSS3EiFXHzwzQRQkMKCiSSqhne63L5FbRxfyAkKyMoxBXjo8fvx9i7Ws0 +ecvur4HaQGhoyfe2lNgGzozpZ2C5DkrY7ko4= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1751913243; x=1752518043; 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=9os3lS8fH6kHGyK9R2m8uRATRzh2C1OPAQHL6vUS+6g=; b=FNthPbT/VGrQdWsPBEhRP+SLhIYEldMXrpezX00Rf/prhWz+7pW4v3tsFtJ5uYWw/p asYtAWauMdjqMQjdWWnKd87ly4GTv4m3MgvvdN89vDHlCTRvQbXdAPmdvOvmMhvq7S7r lZ16x8/mQnL4o6+ISsxttSsXoNraoaO7GZdu2bbmF5PGCG09EHpqtqZFpUK7t35+yay0 7sm08CGAlt9QAjn5sDvh5/5psQkdMDTQ2JTQHSEm5Ol1dFp+rY4hO3TrmobxAJ7EwWEE qjMABbKfwcqLBYzDN0dy0aaSEd40IGUAc0PQCpvDWavElmjTNWYKG9VkicxaDrL0k1fY d5KQ== X-Forwarded-Encrypted: i=1; AJvYcCUbuicW9+OkQFDGI7rz6LhlO71I7gsF1ToqnJAxgbxSyXA/9fy01FWJpKsetQDgRynzzS9SRgNbStGDvPI=@vger.kernel.org X-Gm-Message-State: AOJu0Yz7YF1RlqUU0Z+6Neq4dNqKx/pkwB4fEtd37pnsn/V6DNRtrdec Rb/aoXvBlMpHaNM4CHWav/CcAC95PsGrhgCbnuf10PdGALeNT/XqfZRGl8ScG4Ud0xYi/d3PICk SC20= X-Gm-Gg: ASbGncs/heIqmdWMGzqeMeErsEf3MMXA68ufIilf8SZfYjr+l1YU8/qcvE8NpWgFje0 sNwNIODzn3gdMDAQqn/Efel0ilNPQpu8bnczba0PQsfqqB+narOeoyRx7yqCrPIeiuqyRVC9NxZ YY8rPrM2N8ZrJh3HwA9qOv+4OugEtvG7rQzVRxqmmyuzOC4vTIPPcNxe1DPCtgfPPPFtkCCZBiy YxayHSPW1dRCrE9OhKMq5+R3IKbjquMrbPHCUHmSwiALA1SNHp1jQOXbJ5gXHGzIHEddZHv8SsS xTH0BwoWZM15joWYgVDSDedS0D/AlwKaUIdAKcKyCHzmzEla14bBCjhJeHWtQHdYsOceVHInf2i 61pRyuy/hCnFJX0NcAftYW6f6AdGontCa5BfETkxA4A== X-Google-Smtp-Source: AGHT+IEo+zOt/AEi0FnK1sr6WXC8fbhAVvwDgLrxJE5f71HHIze0CaiIMj7O14ZqNlyCSg74rdmpIg== X-Received: by 2002:a05:6512:3d06:b0:553:2884:5fb3 with SMTP id 2adb3069b0e04-557f75de7f0mr181222e87.12.1751913243387; Mon, 07 Jul 2025 11:34:03 -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-556383d31a6sm1417630e87.61.2025.07.07.11.34.03 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 07 Jul 2025 11:34:03 -0700 (PDT) From: Ricardo Ribalda Date: Mon, 07 Jul 2025 18:34:02 +0000 Subject: [PATCH v8 2/5] 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: <20250707-uvc-meta-v8-2-ed17f8b1218b@chromium.org> References: <20250707-uvc-meta-v8-0-ed17f8b1218b@chromium.org> In-Reply-To: <20250707-uvc-meta-v8-0-ed17f8b1218b@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 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.727.gbf7dc18ff4-goog From nobody Tue Oct 7 18:22:21 2025 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 0C2B9265609 for ; Mon, 7 Jul 2025 18:34:05 +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=1751913248; cv=none; b=llg2M9EqnwHWiMq2eE5Zr9WP7xby3jBulp2DdcUKwlX74PAStjyzI7j033/quzlnsmBWQp/vxyb83lML2R/tT4C3vqIX/t7T5515fsnO/XNd9NhYy/2hcspq6vb3hiCzUrZjiUa0rPU/qDz9PGceQ7E3SRdxfPd+S2Nyb2FxFZA= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1751913248; c=relaxed/simple; bh=XTTO2GlL2rwzrs5D9X0KqylT3melKL3EVpcGuIGiKrk=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=usspkSKpXnBs8Y6rJEoKjitpfN+nTZpbjkiOvUFXwYwuJcdJGqn2L/VWTMAKthLZ8d11tJCOZpNfuvu3F6RIVaLtTtpk8fgmA0p3wTjFCJ4O1MGADJAkaetukhsV/eopo+fMzjI+sO7RnMpEQorFNwLfa5QDvKcFV5kpcuPw4og= 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=IeB6u0k7; 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="IeB6u0k7" Received: by mail-lf1-f42.google.com with SMTP id 2adb3069b0e04-553b544e7b4so3417336e87.3 for ; Mon, 07 Jul 2025 11:34:05 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=chromium.org; s=google; t=1751913244; x=1752518044; 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=Yz8301aMK4jTXSvQ1f1sAIMmy3TqXQCCdC9cQDPE4Kk=; b=IeB6u0k75k35RiwALC9LWWkINXmi4IoU2zYGjIzljxwz2c5Nr3unq968YLkS7cRQ80 XKJvINPXZAo+ks/DFk+rLEb/7nzuPFUP+Z5uCU5Fb6FmEIiWicNoMau4OS9sx1TENUhz THj21WgzYznrMH4FDjumEYlwyfNI2n1FGs8o4= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1751913244; x=1752518044; 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=Yz8301aMK4jTXSvQ1f1sAIMmy3TqXQCCdC9cQDPE4Kk=; b=ZRoA1jcC/Qn1p1Y6CMejKHiGK9Fd4JxIZCaXX9C6s63o6W1ZQa7wISx9GRIG2OCLK1 eXJuDg2yC9P3ASB/7m9PYMvSuJfWP7LWeDQ95PgTc84OPXw+RMavlZxhgJ0TvK1PMiF9 SDh9nJ6rp3JbtSNyIGKffVgfYdyXhy+P7tnOffojT4yQzk6J3S7zjWL0evYXt+D29+Pj AqqcJy/P1z6j05VICzm98b6og4aySw333GRrJhHnirQiS76e1TiywLZC+paHQ/cGnLLW 9I9vwPzgNTQAZSLfpU/z+3wV7IQ1b6h1qnkM9ScJoITLfGpr3fVDKMQl2p7GciBpkRF2 lLEQ== X-Forwarded-Encrypted: i=1; AJvYcCVYIc6PuOSep+1Xq45pJwOLOSyKMwCuhOMyZOk+Ur7AJrKY3lSbR2g/2yoYycb7vxD6/tMebfcRqKjep4c=@vger.kernel.org X-Gm-Message-State: AOJu0YxLXhC7K/NDQ/QmuA9anY1F0aCWW3fPOSya81Im2atM2yXey1pn d9sMxiFlRbDxY0zlqy890WOX9GTy3bLTLinG0Dd/nM4XYGlGLpn1vu4A4RGD7wLw7w== X-Gm-Gg: ASbGncs4ey5KKcXfXoa5yMHlJ/CsqfD7HnG/ZkCu2kBupxO6l4Z+il163yhM+V8mJFw Ba/JguESCS0/P+k7mWRWvzWPSI1XAWA5AGZCBM/w3Tnq5QT3gqonSb83msJjEB0UeQzglWP1Ybt wkKhfobIUN0/IfUcEncjzG7Gnoccq3Pu0+8F6fIERdNJ9d3ARenKOhSQY3dLN6Of8S8kPvw0O+R LAbdToBn6jutGWpx4m4i+C7o7KT0tTYFXhkFd+BahlMR+xCuGrgS9Wd6Cl0YVBY4ZFCgMuPYTJV TH3i9hqqNd7TsclLevVbjnUh/bTaxhOCdvRoeoL4itP7Mq9bIWgy4nyUef1A0CYktg2Oah6JZOC V3mwhaCEDs0LGIJktzdj12ORK+K30wpFKmM5UtHvRQA== X-Google-Smtp-Source: AGHT+IGfWfOKT1mPFOAlQpBieTmRp9vWA29ON5ogRlHpx2VgDwJFdP5LHFEKMr/R8mVBYkECy0syNg== X-Received: by 2002:a05:6512:3081:b0:556:2764:d20b with SMTP id 2adb3069b0e04-557a19df4ebmr4253285e87.19.1751913243937; Mon, 07 Jul 2025 11:34:03 -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-556383d31a6sm1417630e87.61.2025.07.07.11.34.03 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 07 Jul 2025 11:34:03 -0700 (PDT) From: Ricardo Ribalda Date: Mon, 07 Jul 2025 18:34:03 +0000 Subject: [PATCH v8 3/5] media: uvcvideo: Introduce dev->meta_formats 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: <20250707-uvc-meta-v8-3-ed17f8b1218b@chromium.org> References: <20250707-uvc-meta-v8-0-ed17f8b1218b@chromium.org> In-Reply-To: <20250707-uvc-meta-v8-0-ed17f8b1218b@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. Suggested-by: Hans de Goede Signed-off-by: Ricardo Ribalda Reviewed-by: Hans de Goede --- drivers/media/usb/uvc/uvc_driver.c | 2 ++ drivers/media/usb/uvc/uvc_metadata.c | 38 +++++++++++++++++++++++++++++---= ---- drivers/media/usb/uvc/uvcvideo.h | 6 ++++++ 3 files changed, 39 insertions(+), 7 deletions(-) diff --git a/drivers/media/usb/uvc/uvc_driver.c b/drivers/media/usb/uvc/uvc= _driver.c index 62eb45435d8bec5c955720ecb46fb8936871e6cc..56ea20eeb7b9d5d92f3d837c15b= df11d536e9f2d 100644 --- a/drivers/media/usb/uvc/uvc_driver.c +++ b/drivers/media/usb/uvc/uvc_driver.c @@ -2315,6 +2315,8 @@ static int uvc_probe(struct usb_interface *intf, goto error; } =20 + uvc_meta_init(dev); + if (dev->quirks & UVC_QUIRK_NO_RESET_RESUME) udev->quirks &=3D ~USB_QUIRK_RESET_RESUME; =20 diff --git a/drivers/media/usb/uvc/uvc_metadata.c b/drivers/media/usb/uvc/u= vc_metadata.c index 82de7781f5b6b70c5ba16bcba9e0741231231904..4bcbc22f47e67c52baf6e133f24= 0131ff3d32a03 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 =3D stream->dev; struct v4l2_meta_format *fmt =3D &format->fmt.meta; u32 fmeta =3D fmt->dataformat; + u32 i; =20 if (format->type !=3D vfh->vdev->queue->type) return -EINVAL; =20 + for (i =3D 0; (fmeta !=3D dev->meta_formats[i]) && dev->meta_formats[i]; + i++) + ; + if (!dev->meta_formats[i]) + fmeta =3D V4L2_META_FMT_UVC; + 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; @@ -112,17 +118,21 @@ static int uvc_meta_v4l2_enum_formats(struct file *fi= le, void *fh, struct v4l2_fh *vfh =3D file->private_data; struct uvc_streaming *stream =3D video_get_drvdata(vfh->vdev); struct uvc_device *dev =3D stream->dev; - u32 index =3D fdesc->index; + u32 i; + + 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)) + for (i =3D 0; (i < fdesc->index) && dev->meta_formats[i]; i++) + ; + if (!dev->meta_formats[i]) 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->index =3D i; + fdesc->pixelformat =3D dev->meta_formats[i]; =20 return 0; } @@ -174,3 +184,17 @@ int uvc_meta_register(struct uvc_streaming *stream) V4L2_BUF_TYPE_META_CAPTURE, &uvc_meta_fops, &uvc_meta_ioctl_ops); } + +void uvc_meta_init(struct uvc_device *dev) +{ + unsigned int i =3D 0; + + dev->meta_formats[i++] =3D V4L2_META_FMT_UVC; + + if (dev->info->meta_format && + !WARN_ON(dev->info->meta_format =3D=3D V4L2_META_FMT_UVC)) + dev->meta_formats[i++] =3D dev->info->meta_format; + + /* IMPORTANT: for new meta-formats update UVC_MAX_META_DATA_FORMATS. */ + dev->meta_formats[i++] =3D 0; +} diff --git a/drivers/media/usb/uvc/uvcvideo.h b/drivers/media/usb/uvc/uvcvi= deo.h index 11d6e3c2ebdfbabd7bbe5722f88ff85f406d9bb6..b3c094c6591e7a71fc00e1096bc= f493a83f330ad 100644 --- a/drivers/media/usb/uvc/uvcvideo.h +++ b/drivers/media/usb/uvc/uvcvideo.h @@ -572,6 +572,8 @@ struct uvc_status { }; } __packed; =20 +#define UVC_MAX_META_DATA_FORMATS 3 + struct uvc_device { struct usb_device *udev; struct usb_interface *intf; @@ -582,6 +584,9 @@ struct uvc_device { =20 const struct uvc_device_info *info; =20 + /* Zero-ended list of meta formats */ + u32 meta_formats[UVC_MAX_META_DATA_FORMATS + 1]; + atomic_t nmappings; =20 /* Video control interface */ @@ -751,6 +756,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); +void uvc_meta_init(struct uvc_device *dev); int uvc_meta_register(struct uvc_streaming *stream); =20 int uvc_register_video_device(struct uvc_device *dev, --=20 2.50.0.727.gbf7dc18ff4-goog From nobody Tue Oct 7 18:22:21 2025 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 7BC55271446 for ; Mon, 7 Jul 2025 18:34: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=1751913249; cv=none; b=RwLLXxrViNG7G8n+/O7cqQ07yK/PuCGDM4EzJgCcsg8VFwgYEtysN8UmA8y63RwC7m6BeW9cBLX5jG1YjdS1M6zUcm4mdx53n4Cny17YMtOK/nKsbCcP31GY6mHbt4RVZckPo+/W67O87lydSQsrxcO247GOQawxtcnZk3TLn3E= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1751913249; c=relaxed/simple; bh=cMCc/YVoj/o1iMMtqAwdWEEQxRV6brtdDuFTq1NJi20=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=r6ZdcFhSzV7/UuoMeYAvrbp6m2F75ek5DIPNW3woFmg/rMqqYxdjeZK0n/hQ51ztFj2UZo8IHyJdVMg1wcaGsprNbmWfcXkmoE9+34dxpeGuGid3k89zeznYqabih07MXonlbTr1lEQBtFWMKERXU7eDWV8dd7M8AqucY/NIgrA= 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=jj5yW9X2; 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="jj5yW9X2" Received: by mail-lf1-f44.google.com with SMTP id 2adb3069b0e04-55622414cf4so3345872e87.3 for ; Mon, 07 Jul 2025 11:34:06 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=chromium.org; s=google; t=1751913244; x=1752518044; 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=h6hGfoFapvas+Hz1L3ZuhmMpf2VFQ5l8hbCjstkgFL4=; b=jj5yW9X2Xmo4AKbKKzyfApVQngaZ2Q5Ksq2EA1HeYP2pXagqk2VPu52IRuiZWkis9E WNf5oTuWUh7sFjgK5egtd8RaF+kcDlGOiRH0yMv8ogHsGqahZz2yOeAcWoXKCnImPsDx pMmupqtdmQADK+dcfSDBTrnrS9j8WPCX5mHCQ= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1751913244; x=1752518044; 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=h6hGfoFapvas+Hz1L3ZuhmMpf2VFQ5l8hbCjstkgFL4=; b=pZ4rdw1YO3CuDoxLnUdmWxOIVoKpsPOtL025PjtMwBgmxWR7mrfQTdnIFvdoHrXUlF +Rhp3bzJJRLLYpUz9FYQfNBYXBJuBCsl5bPE9JvGx7vyhOTFgvJev/ux+rIZMgBc5Axh Ahe0/NGGvSENk7FSbTsl4fZzx5/MoVbedObll6BsNE5ZLUXkcpisS3JMsY9R1XYX8xpI DNN36EoJMV20XAJhDL3DDTrUY3bL7bSQPH4qURRIHSt7I2nN1gTtx/NTEvIpukSZBeJ4 aDa6mMDGWS2ORU+8EuAK4Gv4ar2ZXIISY6BKsIHVybCJ3B36HL4lGChQ9fStGz4EM0WB cdGQ== X-Forwarded-Encrypted: i=1; AJvYcCVKn7iszWioJMfoEH5lbCKOC4yhjN93pi96qgWXkxfLlF3bDq8WnWzUv0XkcRFayrr7+fJZeKWsd7hiT8U=@vger.kernel.org X-Gm-Message-State: AOJu0YwKbAtxhzMD/KLbPQvPBlQT8ptoodkX32LhHZCnZpgEfLeEfA3S gjMpNwtViPbUrddiJN/lhm4+64ht7EvI/VOs8jsKJnsNg2QyjQkY8y/wVD0hKwadig== X-Gm-Gg: ASbGncunWO2y7oecUaReGicCzjbK9eQxEDBoHSh6vym5oPshWCOjDGWYW5XjKqQ6zRC rp9xSkvHDp+ab/pn/Ranr6dtJQCunMWE+scbRr7AJhhcQf0A5PDU+aoRsSh2eXA0RN3smOKI0oQ 88nKZy0EoE5SgVW8Ud6GYPDrqgZF0vF+byRK67DbC+FGqegRXUQewuR6ADkShU4S54xjiY3xoKD mw10XTfUu7vK5e39OPULLD27X4Xww5CDWqF/vCjPn6oYLny8XjmaZCyRshafCC6QCi2aJRGLq0L oqQ5qIuekxcN5icszOFxxnC88i87yExi6pgne+g8nAuAPHYeeBwAFXxs8TwI+zsRVOtaD692S0i 17a7xIKXq5lPL2jA5Id45Z1CaOaVOnaRJBmOYFY8aQpzk/AdjxrQt X-Google-Smtp-Source: AGHT+IGXpDV/f3jM6ZfbvudPD8pxigPxC7oBSeMClnkzX//m6nh6RDqJosKm/5PF2RkWF3O2NZiKmw== X-Received: by 2002:a05:6512:10cb:b0:553:35ca:592a with SMTP id 2adb3069b0e04-557e55ce64cmr2739571e87.52.1751913244440; Mon, 07 Jul 2025 11:34:04 -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-556383d31a6sm1417630e87.61.2025.07.07.11.34.04 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 07 Jul 2025 11:34:04 -0700 (PDT) From: Ricardo Ribalda Date: Mon, 07 Jul 2025 18:34:04 +0000 Subject: [PATCH v8 4/5] 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: <20250707-uvc-meta-v8-4-ed17f8b1218b@chromium.org> References: <20250707-uvc-meta-v8-0-ed17f8b1218b@chromium.org> In-Reply-To: <20250707-uvc-meta-v8-0-ed17f8b1218b@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 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 | 4 ++++ drivers/media/usb/uvc/uvcvideo.h | 1 + drivers/media/v4l2-core/v4l2-ioctl.c | 1 + include/uapi/linux/videodev2.h | 1 + 7 files changed, 32 insertions(+) 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 658543062bba3b7e600699d7271ffc89250ba7e5..fdde1d37ed2ef9058e3ea3417be= c25afe454dfc0 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -25827,6 +25827,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 4bcbc22f47e67c52baf6e133f240131ff3d32a03..77e03273d3cf6b00cac6ebb9b29= b941f1cbfd9f7 100644 --- a/drivers/media/usb/uvc/uvc_metadata.c +++ b/drivers/media/usb/uvc/uvc_metadata.c @@ -195,6 +195,10 @@ void uvc_meta_init(struct uvc_device *dev) !WARN_ON(dev->info->meta_format =3D=3D V4L2_META_FMT_UVC)) dev->meta_formats[i++] =3D dev->info->meta_format; =20 + if (dev->quirks & UVC_QUIRK_MSXU_META && + !WARN_ON(dev->info->meta_format =3D=3D V4L2_META_FMT_UVC_MSXU_1_5)) + dev->meta_formats[i++] =3D V4L2_META_FMT_UVC_MSXU_1_5; + /* IMPORTANT: for new meta-formats update UVC_MAX_META_DATA_FORMATS. */ dev->meta_formats[i++] =3D 0; } diff --git a/drivers/media/usb/uvc/uvcvideo.h b/drivers/media/usb/uvc/uvcvi= deo.h index b3c094c6591e7a71fc00e1096bcf493a83f330ad..616adc417c62a58686beccbc440= a5dfac0a2d588 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 be94a79b976e3de4eb957f5d2584ec6d4230469e..993b36417b4655456ce545cb42a= 41b55b98e4d6c 100644 --- a/drivers/media/v4l2-core/v4l2-ioctl.c +++ b/drivers/media/v4l2-core/v4l2-ioctl.c @@ -1463,6 +1463,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 6f7bd38dd5aa4b1b2084685512512a380d76a5e4..863bc5b7dec32303e852d7e9c38= 91011ce5a3d71 100644 --- a/include/uapi/linux/videodev2.h +++ b/include/uapi/linux/videodev2.h @@ -867,6 +867,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.727.gbf7dc18ff4-goog From nobody Tue Oct 7 18:22:21 2025 Received: from mail-lf1-f46.google.com (mail-lf1-f46.google.com [209.85.167.46]) (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 420C6271A7B for ; Mon, 7 Jul 2025 18:34:07 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.167.46 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1751913249; cv=none; b=IP1zsjJrCnp9oEjaJw8KagXQoOTjIZRFCzveEr07+tFWsVUJqSHz/ARUK/EO69xoyOoKZvCkldxzZ9H0dNui16P4ake/8/42Mwh/TjZ8+JciWUDeKqROLJWYWId+t5Su1A5JeeZqnSdgD0oR/CE4VWuZFdCIh66u/p1NXBc7nvo= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1751913249; c=relaxed/simple; bh=sVG3jXB7G5g5VkbTuzz7YugXFtGc7x/LVOgePX3jelA=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=S3l3n6pRf16R0uRLkeZjwLkUM2hswOkoyi4cm3WzfTJtgN1qWwu222TCzF2uGkw84ouOcTbnZ9Jmp9u+UVnizYv0TO74tJpTVusKmkOGR3wsnULd7ymp28DddE2VvtjbF3xXam+Ld/HY1Jz3Gwx0LM7OOQp06Q/emo/FuPOHv4I= 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=ZBFLNEG3; arc=none smtp.client-ip=209.85.167.46 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="ZBFLNEG3" Received: by mail-lf1-f46.google.com with SMTP id 2adb3069b0e04-556fd896c99so2877558e87.3 for ; Mon, 07 Jul 2025 11:34:06 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=chromium.org; s=google; t=1751913245; x=1752518045; 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=KPIaOyTFadqUjMfdacN75cl1wBFQWTU+JWrkSX4D/W4=; b=ZBFLNEG35hnvby1Y3HSJ8IKqvtDwfp5sbN7xUI8nCARUgOZmGNXy+kBaMV0w6N6cXG gKeSxnBSvYh/n/we88HN4VUsh2ZLqo9tX1NVsFKjSEpyi9duCnb/Mn8pVzK1M1fSEFxP MSUKkEXvCosXWNJHVTY1Q+dWas6Ez7vMJO6ZM= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1751913245; x=1752518045; 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=KPIaOyTFadqUjMfdacN75cl1wBFQWTU+JWrkSX4D/W4=; b=Bh0uA++1+RBWtSYY7FNFWOw8/ckmzAAgLyl6gEcOnl8ACPEm9gynRYPTKhZ4Ziufwv 1PwDv/8kLwJxXiaresamTWsM/Ptb2KWO8DHBBuWJzZ4AoO6gIc/Rblg+TdJ1jAUBChG7 Jz864htTfY1xglxJbRx0yj8NeApg3MPp9sk/aJTPxNwfbXLFO/IDEYdUzNFdNJ1ji62S 1xOL/r7zaCGj3+sUJ9zx+1V7M7GPZ0gPmPUbjJSw9TZJwhnnzO9XF26a5IrtcXRl/8ww sDdzB9t/aImhGVA6/aoJAn9Kmb6WHL9wCsmD1PPoOUciGiFY1giScKRJcnPqlz9PzvGl kDPw== X-Forwarded-Encrypted: i=1; AJvYcCXVdWh7rfM+5gM+7wBKvNSBLgtd+KKh0ErQI+vOxMEbnOn6Ekumh7sqEKRym89IM6ntv0zUW+biqIGvaY0=@vger.kernel.org X-Gm-Message-State: AOJu0YwatSaH1POvRWvrTqbHZtCNE3cpL5HM8TVh8Eh7sex/7nF/PSEz 2s8dHFDUgKxperrPbWDDzE4DzYsko2O80+wpQs22o8gPli9DUEZ4PZJdw8mmHsTyaUg07XE7X3S 5q6Y= X-Gm-Gg: ASbGnctOn8olNUGX3b4z6bCwN2+VW2jXfYnMhI9S/Is78vz2rvdKb29YVZI2wFrWtXx R7GP3tUiJh14q6dOL15VVxb6qu4EcsoJGCJiBbAeIEj6SdZ/lHcCdwrdDLNC0S82DsyCEddR1nP TUHPsBHIjKI1HVieSr2rXHszLc2BVH3+kwNHNLK3lFHDrpBjvNWt3IebRvovJVKlgM6Pg+gRJXH uP/ICYwqsGmEnrR8oCS7BC4tPoeTfZ5GXqH+DV2NlWwGouS32K2yqbKWecBBmPixCB2W+3M6fBx DdIzAehV/7/uRh5wIYfurM8L1snR2pM4mJB2q7drkrwl775tFeWZDEwc+kbUbFMVYU6blERbU3C VVTMZHKeZwfT76KUl4JPcn8f7MYJEYsBVh6LUcNxLjw== X-Google-Smtp-Source: AGHT+IE4uyqyZpucH4y+ZvlBsX58kvvph8A860fajfAiOIZDRFqwIHkUsRPLwiIFiVEjP0cClON7YQ== X-Received: by 2002:a05:6512:3e25:b0:553:2698:99c5 with SMTP id 2adb3069b0e04-557aa86aae9mr3669267e87.39.1751913244975; Mon, 07 Jul 2025 11:34:04 -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-556383d31a6sm1417630e87.61.2025.07.07.11.34.04 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 07 Jul 2025 11:34:04 -0700 (PDT) From: Ricardo Ribalda Date: Mon, 07 Jul 2025 18:34:05 +0000 Subject: [PATCH v8 5/5] 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: <20250707-uvc-meta-v8-5-ed17f8b1218b@chromium.org> References: <20250707-uvc-meta-v8-0-ed17f8b1218b@chromium.org> In-Reply-To: <20250707-uvc-meta-v8-0-ed17f8b1218b@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_driver.c | 7 +++- drivers/media/usb/uvc/uvc_metadata.c | 75 ++++++++++++++++++++++++++++++++= +++- drivers/media/usb/uvc/uvcvideo.h | 2 +- include/linux/usb/uvc.h | 3 ++ 4 files changed, 84 insertions(+), 3 deletions(-) diff --git a/drivers/media/usb/uvc/uvc_driver.c b/drivers/media/usb/uvc/uvc= _driver.c index 56ea20eeb7b9d5d92f3d837c15bdf11d536e9f2d..9de5abb43e19d9e876cddc5d712= 4592953db89ac 100644 --- a/drivers/media/usb/uvc/uvc_driver.c +++ b/drivers/media/usb/uvc/uvc_driver.c @@ -2315,7 +2315,12 @@ static int uvc_probe(struct usb_interface *intf, goto error; } =20 - uvc_meta_init(dev); + ret =3D uvc_meta_init(dev); + if (ret < 0) { + dev_err(&dev->udev->dev, + "Error initializing the metadata formats (%d)\n", ret); + goto error; + } =20 if (dev->quirks & UVC_QUIRK_NO_RESET_RESUME) udev->quirks &=3D ~USB_QUIRK_RESET_RESUME; diff --git a/drivers/media/usb/uvc/uvc_metadata.c b/drivers/media/usb/uvc/u= vc_metadata.c index 77e03273d3cf6b00cac6ebb9b29b941f1cbfd9f7..59bb133baf9a73ef6a30fa8ead8= 5aa90653d60f4 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 @@ -166,6 +167,71 @@ static const struct v4l2_file_operations uvc_meta_fops= =3D { .mmap =3D vb2_fop_mmap, }; =20 +static struct uvc_entity *uvc_meta_find_msxu(struct uvc_device *dev) +{ + static const u8 uvc_msxu_guid[16] =3D 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) =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; @@ -185,9 +251,14 @@ int uvc_meta_register(struct uvc_streaming *stream) &uvc_meta_fops, &uvc_meta_ioctl_ops); } =20 -void uvc_meta_init(struct uvc_device *dev) +int uvc_meta_init(struct uvc_device *dev) { unsigned int i =3D 0; + int ret; + + ret =3D uvc_meta_detect_msxu(dev); + if (ret) + return ret; =20 dev->meta_formats[i++] =3D V4L2_META_FMT_UVC; =20 @@ -201,4 +272,6 @@ void uvc_meta_init(struct uvc_device *dev) =20 /* IMPORTANT: for new meta-formats update UVC_MAX_META_DATA_FORMATS. */ dev->meta_formats[i++] =3D 0; + + return 0; } diff --git a/drivers/media/usb/uvc/uvcvideo.h b/drivers/media/usb/uvc/uvcvi= deo.h index 616adc417c62a58686beccbc440a5dfac0a2d588..a4c064c5e046f2a4adba742c877= 7a10619569606 100644 --- a/drivers/media/usb/uvc/uvcvideo.h +++ b/drivers/media/usb/uvc/uvcvideo.h @@ -757,7 +757,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); -void uvc_meta_init(struct uvc_device *dev); +int uvc_meta_init(struct uvc_device *dev); int uvc_meta_register(struct uvc_streaming *stream); =20 int uvc_register_video_device(struct uvc_device *dev, 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.727.gbf7dc18ff4-goog