Received: by 2002:ab2:6857:0:b0:1ef:ffd0:ce49 with SMTP id l23csp985601lqp; Fri, 22 Mar 2024 01:55:28 -0700 (PDT) X-Forwarded-Encrypted: i=3; AJvYcCXb9V0DFE2+kKGxyKoiARVBuL0ckM2btvv/RRfOgheAlGUfcL2j2HWGPtzZWrcknCKMKMdbTteBBv8T9ONbqOXZDsHBBY1QMpucO4jxTw== X-Google-Smtp-Source: AGHT+IFPFL4Gc8hCUmxFsBSv25V1071KevzBmPgybms2OZ/3DvuteGP785LhmS92HgfNK/4COlfk X-Received: by 2002:a05:6a20:2d14:b0:1a1:6c6c:97b with SMTP id g20-20020a056a202d1400b001a16c6c097bmr2189172pzl.11.1711097728473; Fri, 22 Mar 2024 01:55:28 -0700 (PDT) ARC-Seal: i=2; a=rsa-sha256; t=1711097728; cv=pass; d=google.com; s=arc-20160816; b=b2l56xkKpSQJbQl0VJUVKAH+MsSycFRruNd8pifXtH6XTDMa1xvSlupZ20YQ/R2mh5 LlnIc5+T1Q3ZZ+FW7cW6sjBW+SJQRnr5lMnmnSAhi3jLM0goh87/A5vgfQrZnaNl4QX9 HeruVqtS4ptQmyaBJSHUTXDssBtwxpoRlXiz6SbOjNMUNoSGlUESXGflADntqNOYqaYx /D0tgAVpFjhBg7v95LjTldWMZiLNiaDAyFt6cx+aqRr3VGfT6aI60MwIIPYWlr2JCX0m M46k790yOxmt5Yrf7e3keT0N+PdTOUFuWmNkvGs8jHIE0afrVPAefrnHLhHoH7OZv6S+ e2sA== ARC-Message-Signature: i=2; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=in-reply-to:content-disposition:mime-version:list-unsubscribe :list-subscribe:list-id:precedence:references:message-id:subject:cc :to:from:date:dkim-signature; bh=N6WT9L2uVRZ/MhEYhxjGDGYuTnSFDNX8oRT+n1AdIvA=; fh=WfpwFwVEj24zwR92bZPT8UkZcFPphawJtKLkW/jAW9s=; b=tj/ee36Q8bcAjEg81ItVM6uofVIzIaUupufTXZAgAHX7jhK/R/FkK1R/Ik5KGtBQdQ rvy75qJwsR9M5z+AUtvtYmTPtMe4ld2tyg5KBFk0AYjJ2v23HVNMEgvIHWJKA5yCNRgw WQf1qltx1xWt0AB+Gi/UeKPo8Of0ZoKWlKRGLfMIlW6BRh/QMuODxEhYTX7axCCW3ukW mz64i2nnbbXYWgbYfI1srYDCp84B5gjBAiofeHWY3uYZvRxE0wDQCu6EyBxN0gYYaXdV aogkjWOaPOXx6yapJYw6h+uNy5L14fHXdwyp0jL8a1Hdav0G1l2/aFvkYmRBfTJBfKv7 OYqg==; dara=google.com ARC-Authentication-Results: i=2; mx.google.com; dkim=pass (test mode) header.i=@ideasonboard.com header.s=mail header.b=WyYp+XLa; arc=pass (i=1 spf=pass spfdomain=ideasonboard.com dkim=pass dkdomain=ideasonboard.com); spf=pass (google.com: domain of linux-kernel+bounces-111163-linux.lists.archive=gmail.com@vger.kernel.org designates 147.75.48.161 as permitted sender) smtp.mailfrom="linux-kernel+bounces-111163-linux.lists.archive=gmail.com@vger.kernel.org" Return-Path: Received: from sy.mirrors.kernel.org (sy.mirrors.kernel.org. [147.75.48.161]) by mx.google.com with ESMTPS id y21-20020a17090a8b1500b0029b03b22b1bsi1588666pjn.125.2024.03.22.01.55.27 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 22 Mar 2024 01:55:28 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel+bounces-111163-linux.lists.archive=gmail.com@vger.kernel.org designates 147.75.48.161 as permitted sender) client-ip=147.75.48.161; Authentication-Results: mx.google.com; dkim=pass (test mode) header.i=@ideasonboard.com header.s=mail header.b=WyYp+XLa; arc=pass (i=1 spf=pass spfdomain=ideasonboard.com dkim=pass dkdomain=ideasonboard.com); spf=pass (google.com: domain of linux-kernel+bounces-111163-linux.lists.archive=gmail.com@vger.kernel.org designates 147.75.48.161 as permitted sender) smtp.mailfrom="linux-kernel+bounces-111163-linux.lists.archive=gmail.com@vger.kernel.org" Received: from smtp.subspace.kernel.org (wormhole.subspace.kernel.org [52.25.139.140]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by sy.mirrors.kernel.org (Postfix) with ESMTPS id 7ED2CB21099 for ; Fri, 22 Mar 2024 08:52:27 +0000 (UTC) Received: from localhost.localdomain (localhost.localdomain [127.0.0.1]) by smtp.subspace.kernel.org (Postfix) with ESMTP id AE95719475; Fri, 22 Mar 2024 08:52:18 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=ideasonboard.com header.i=@ideasonboard.com header.b="WyYp+XLa" Received: from perceval.ideasonboard.com (perceval.ideasonboard.com [213.167.242.64]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id A8F1C182CF; Fri, 22 Mar 2024 08:52:15 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=213.167.242.64 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1711097537; cv=none; b=sqR9jc/QDoE8IpeQ4YJAhq309SfC/5+9Pa9Cjd84V8US9B+1v+KhhOzIr/trRxAyhpFW7qVh6qdElEOmduTqR+UTptVkOKTUSO6hNZJL8dZ1C59oiCf+b/MLMCuWFGvbpOSVCZzEKUphLtMHYQZLa2hi6uhbtw0ofMjns6HVV0M= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1711097537; c=relaxed/simple; bh=lC++plH0G70GB4HvKQWiMMpiVIWxqVnS7uMSp5eqZD4=; h=Date:From:To:Cc:Subject:Message-ID:References:MIME-Version: Content-Type:Content-Disposition:In-Reply-To; b=lIpqSUfMWDnNOMw2G2oYMuP8Ep2kz2Jt0EwCVLz2zEAnjJBify0BvS6Q18hxNwoZjtHWWgOxC3exPPOuq07NSD5AB/ZRtAJo7ih7AKZr9UsJSlQuyzOjZ+ID6YVIe9EAru0wtMYtz0lxz+JhSValdMq35zMc9mNVUraKzFBRx/g= ARC-Authentication-Results:i=1; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=ideasonboard.com; spf=pass smtp.mailfrom=ideasonboard.com; dkim=pass (1024-bit key) header.d=ideasonboard.com header.i=@ideasonboard.com header.b=WyYp+XLa; arc=none smtp.client-ip=213.167.242.64 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=ideasonboard.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=ideasonboard.com Received: from pendragon.ideasonboard.com (81-175-209-231.bb.dnainternet.fi [81.175.209.231]) by perceval.ideasonboard.com (Postfix) with ESMTPSA id E3250BEB; Fri, 22 Mar 2024 09:51:44 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com; s=mail; t=1711097505; bh=lC++plH0G70GB4HvKQWiMMpiVIWxqVnS7uMSp5eqZD4=; h=Date:From:To:Cc:Subject:References:In-Reply-To:From; b=WyYp+XLagBpdHxyGXZ9CKPZa3Za1WRM3dOByUUdSlvNrpAE+oJo1BzxYA8ECuAM2j G0ypJ3lMPezb5m0gfCwNsQoKuiEERvl5rG0kg137z+RNIoB/Ajz1fkRUktwYVEN9AH czvFwBBrHWfrn8WcQJrpLQIh3NvROPYFoUT1K23U= Date: Fri, 22 Mar 2024 10:52:09 +0200 From: Laurent Pinchart To: Ricardo Ribalda Cc: Mauro Carvalho Chehab , Sergey Senozhatsky , linux-kernel@vger.kernel.org, "hn.chen" , linux-media@vger.kernel.org Subject: Re: [PATCH v9 3/6] media: uvcvideo: Quirk for invalid dev_sof in Logitech C922 Message-ID: <20240322085209.GL18799@pendragon.ideasonboard.com> References: <20220920-resend-hwtimestamp-v9-0-55a89f46f6be@chromium.org> <20220920-resend-hwtimestamp-v9-3-55a89f46f6be@chromium.org> <20240321234434.GC20938@pendragon.ideasonboard.com> 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-Disposition: inline In-Reply-To: On Fri, Mar 22, 2024 at 09:32:56AM +0100, Ricardo Ribalda wrote: > On Fri, 22 Mar 2024 at 00:44, Laurent Pinchart wrote: > > On Wed, Mar 15, 2023 at 02:30:14PM +0100, Ricardo Ribalda wrote: > > > Logitech C922 internal SOF does not increases at a stable rate of 1kHz. > > > > The next thing you know they will redefine to value of pi to be 3. > > > > > This causes that the device_sof and the host_sof run at different rates, > > > breaking the clock domain conversion algorithm. Eg: > > > > > > 30 (6) [-] none 30 614400 B 21.245557 21.395214 34.133 fps ts mono/SoE > > > 31 (7) [-] none 31 614400 B 21.275327 21.427246 33.591 fps ts mono/SoE > > > 32 (0) [-] none 32 614400 B 21.304739 21.459256 34.000 fps ts mono/SoE > > > 33 (1) [-] none 33 614400 B 21.334324 21.495274 33.801 fps ts mono/SoE > > > * 34 (2) [-] none 34 614400 B 21.529237 21.527297 5.130 fps ts mono/SoE > > > * 35 (3) [-] none 35 614400 B 21.649416 21.559306 8.321 fps ts mono/SoE > > > 36 (4) [-] none 36 614400 B 21.678789 21.595320 34.045 fps ts mono/SoE > > > ... > > > 99 (3) [-] none 99 614400 B 23.542226 23.696352 33.541 fps ts mono/SoE > > > 100 (4) [-] none 100 614400 B 23.571578 23.728404 34.069 fps ts mono/SoE > > > 101 (5) [-] none 101 614400 B 23.601425 23.760420 33.504 fps ts mono/SoE > > > * 102 (6) [-] none 102 614400 B 23.798324 23.796428 5.079 fps ts mono/SoE > > > * 103 (7) [-] none 103 614400 B 23.916271 23.828450 8.478 fps ts mono/SoE > > > 104 (0) [-] none 104 614400 B 23.945720 23.860479 33.957 fps ts mono/SoE > > > > > > Instead of disabling completely the hardware timestamping for such > > > hardware we take the assumption that the packet handling jitter is > > > under 2ms and use the host_sof as dev_sof. > > > > > > We can think of the UVC hardware clock as a system with a coarse clock > > > (the SOF) and a fine clock (the PTS). The coarse clock can be replaced > > > with a clock on the same frequency, if the jitter of such clock is > > > smaller than its sampling rate. That way we can save some of the > > > precision of the fine clock. > > > > > > To probe this point we have run three experiments on the Logitech C922. > > > On that experiment we run the camera at 33fps and we analyse the > > > difference in msec between a frame and its predecessor. If we display > > > the histogram of that value, a thinner histogram will mean a better > > > meassurement. The results for: > > > - original hw timestamp: https://ibb.co/D1HJJ4x > > > - pure software timestamp: https://ibb.co/QC9MgVK > > > - modified hw timestamp: https://ibb.co/8s9dBdk > > > > > > This bug in the camera firmware has been confirmed by the vendor. > > > > > > lsusb -v > > > > > > Bus 001 Device 044: ID 046d:085c Logitech, Inc. C922 Pro Stream Webcam > > > Device Descriptor: > > > bLength 18 > > > bDescriptorType 1 > > > bcdUSB 2.00 > > > bDeviceClass 239 Miscellaneous Device > > > bDeviceSubClass 2 > > > bDeviceProtocol 1 Interface Association > > > bMaxPacketSize0 64 > > > idVendor 0x046d Logitech, Inc. > > > idProduct 0x085c C922 Pro Stream Webcam > > > bcdDevice 0.16 > > > iManufacturer 0 > > > iProduct 2 C922 Pro Stream Webcam > > > iSerial 1 80B912DF > > > bNumConfigurations 1 > > > > > > Reviewed-by: Sergey Senozhatsky > > > Signed-off-by: Ricardo Ribalda > > > --- > > > drivers/media/usb/uvc/uvc_driver.c | 9 +++++++++ > > > drivers/media/usb/uvc/uvc_video.c | 8 ++++++++ > > > drivers/media/usb/uvc/uvcvideo.h | 1 + > > > 3 files changed, 18 insertions(+) > > > > > > diff --git a/drivers/media/usb/uvc/uvc_driver.c b/drivers/media/usb/uvc/uvc_driver.c > > > index 7aefa76a42b3..678a5736c9df 100644 > > > --- a/drivers/media/usb/uvc/uvc_driver.c > > > +++ b/drivers/media/usb/uvc/uvc_driver.c > > > @@ -2549,6 +2549,15 @@ static const struct usb_device_id uvc_ids[] = { > > > .bInterfaceSubClass = 1, > > > .bInterfaceProtocol = 0, > > > .driver_info = UVC_INFO_QUIRK(UVC_QUIRK_RESTORE_CTRLS_ON_INIT) }, > > > + /* Logitech HD Pro Webcam C922 */ > > > + { .match_flags = USB_DEVICE_ID_MATCH_DEVICE > > > + | USB_DEVICE_ID_MATCH_INT_INFO, > > > + .idVendor = 0x046d, > > > + .idProduct = 0x085c, > > > + .bInterfaceClass = USB_CLASS_VIDEO, > > > + .bInterfaceSubClass = 1, > > > + .bInterfaceProtocol = 0, > > > + .driver_info = UVC_INFO_QUIRK(UVC_QUIRK_INVALID_DEVICE_SOF) }, > > > /* Chicony CNF7129 (Asus EEE 100HE) */ > > > { .match_flags = USB_DEVICE_ID_MATCH_DEVICE > > > | USB_DEVICE_ID_MATCH_INT_INFO, > > > diff --git a/drivers/media/usb/uvc/uvc_video.c b/drivers/media/usb/uvc/uvc_video.c > > > index 1f416c494acc..4d566edb73e7 100644 > > > --- a/drivers/media/usb/uvc/uvc_video.c > > > +++ b/drivers/media/usb/uvc/uvc_video.c > > > @@ -547,6 +547,14 @@ uvc_video_clock_decode(struct uvc_streaming *stream, struct uvc_buffer *buf, > > > stream->clock.last_sof = dev_sof; > > > > > > host_sof = usb_get_current_frame_number(stream->dev->udev); > > > + > > > + /* > > > + * On some devices, like the Logitech C922, the device SOF does not run > > > + * at a stable rate of 1kHz. For those devices use the host SOF instead. > > > > I'm still not very convinced, as without a formal proof I think there's > > some luck involved, and it may break later. This being said, given that > > this is gated by a quirk, it won't impact other devices, and we can deal > > with regressions when they happen. Could we record it here: > > > > * On some devices, like the Logitech C922, the device SOF does not run > > * at a stable rate of 1kHz. For those devices use the host SOF instead. > > * This improves the timestamp precision in the tests performed so far, > > * even if the exact reason hasn't been fully determined. > > > > or something along those lines ? > > How does this sound: > > /* > * On some devices, like the Logitech C922, the device SOF does not run > * at a stable rate of 1kHz. For those devices use the host SOF instead. > + * In the tests performed so far, this improves the timestamp precision. > + * This is probably explained by a small packet handling jitter from the > + * host, but the exact reason hasn't been fully determined. > */ Sounds nicer than my text :-) > > Reviewed-by: Laurent Pinchart > > > > > + */ > > > + if (stream->dev->quirks & UVC_QUIRK_INVALID_DEVICE_SOF) > > > + dev_sof = host_sof; > > > + > > > time = uvc_video_get_time(); > > > > > > /* > > > diff --git a/drivers/media/usb/uvc/uvcvideo.h b/drivers/media/usb/uvc/uvcvideo.h > > > index 9a596c8d894a..07b2fdb80adf 100644 > > > --- a/drivers/media/usb/uvc/uvcvideo.h > > > +++ b/drivers/media/usb/uvc/uvcvideo.h > > > @@ -73,6 +73,7 @@ > > > #define UVC_QUIRK_FORCE_Y8 0x00000800 > > > #define UVC_QUIRK_FORCE_BPP 0x00001000 > > > #define UVC_QUIRK_WAKE_AUTOSUSPEND 0x00002000 > > > +#define UVC_QUIRK_INVALID_DEVICE_SOF 0x00004000 > > > > > > /* Format flags */ > > > #define UVC_FMT_FLAG_COMPRESSED 0x00000001 > > > -- Regards, Laurent Pinchart