Received: by 2002:a05:6a10:2726:0:0:0:0 with SMTP id ib38csp2177415pxb; Fri, 25 Mar 2022 12:28:27 -0700 (PDT) X-Google-Smtp-Source: ABdhPJwKRAlR81e59Bkv6K5dqfJgn4/bbGOugNbZr4SMb//GvIsu4jcNBo9BOPtxf9Xn/YB8zw+Z X-Received: by 2002:a05:6a00:c83:b0:4fa:de88:9fd3 with SMTP id a3-20020a056a000c8300b004fade889fd3mr11226132pfv.41.1648236507254; Fri, 25 Mar 2022 12:28:27 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1648236507; cv=none; d=google.com; s=arc-20160816; b=jxJGb5PThjwdbHL45SfOnhKasaagdUdXEVzske02qnCsDdx4eTmpZPHS4BuN31FlGJ 4dVgEJ9ZBMA3UJHgTQjsEC6tN/D4o0suSpS1mxJDxIdICGC/1SsiPUZMD2eL2twz+vor PpPKpR5VaQ5Ye9sw68axBCjna/Q0g2onYL60wZR+RSXRI5X0/CuKYlQlwNFnrvOMVS6v 80Ox93p6xCu0ZOtqy+zfpD4e7N4oGs3S64RntlapYpZspf/EuuWOJZxyQih6vAZLUnHT bkF2o0PV1AjgzA0l/uyry/gtzTsY1eQTuZl+tDCE6bDz3aSQmoa90Z2pRJlTcalUnAB3 sY4A== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:in-reply-to:content-disposition:mime-version :references:message-id:subject:cc:to:from:date:dkim-signature; bh=aF0RCBt5axYfOq59S44jkV5R/hChaL0ZNmE9T+8HaYE=; b=D2cbHAYXMl+CS1P7n1KyGXQ0mPbMrY7VBo+Mj4t5VL0D+uJU6kemAqFLxgkc8SkG2y IiBwWlXSmu6KVvMeEjvaC16wEhUp5lkLmon3mrPNC0M/ilIU3Q4j5FaHY9WIQv5KVibP AtcIoe/7q8UUpgBaIoG503ZB/BjCYY4KkByrnnXvKmjZCtLz8BSLEDRKAgNPIPG3LcXD 04cfAmRcwmSpFyZyaIppGebDz0yaSXoKYzvLo6HCjbo0b3TBeHKEBGw8Vv494ZqKJrAe BczHduXg6W5MRb0BBjMe58Rbsh1ITeThsbr1qifhhhgueksyaGmb7SmiP+hcaff2QxjO 8k1w== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass (test mode) header.i=@ideasonboard.com header.s=mail header.b=k8yrJ5DG; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from lindbergh.monkeyblade.net (lindbergh.monkeyblade.net. [2620:137:e000::1:18]) by mx.google.com with ESMTPS id z26-20020aa791da000000b004fa3a8e002esi3146087pfa.229.2022.03.25.12.28.26 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 25 Mar 2022 12:28:27 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:18 as permitted sender) client-ip=2620:137:e000::1:18; Authentication-Results: mx.google.com; dkim=pass (test mode) header.i=@ideasonboard.com header.s=mail header.b=k8yrJ5DG; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by lindbergh.monkeyblade.net (Postfix) with ESMTP id 0EAB02C5401; Fri, 25 Mar 2022 11:39:21 -0700 (PDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1353382AbiCXU0m (ORCPT + 99 others); Thu, 24 Mar 2022 16:26:42 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:50460 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1353387AbiCXU0i (ORCPT ); Thu, 24 Mar 2022 16:26:38 -0400 Received: from perceval.ideasonboard.com (perceval.ideasonboard.com [213.167.242.64]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 63DC4B8212; Thu, 24 Mar 2022 13:25:05 -0700 (PDT) Received: from pendragon.ideasonboard.com (62-78-145-57.bb.dnainternet.fi [62.78.145.57]) by perceval.ideasonboard.com (Postfix) with ESMTPSA id C1BC51852; Thu, 24 Mar 2022 21:25:03 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com; s=mail; t=1648153504; bh=ZZ2CK86gTTo7D1QQXMRiTg4e02nEdAmkkQoefa7UwzA=; h=Date:From:To:Cc:Subject:References:In-Reply-To:From; b=k8yrJ5DGX3+H0lQOXdNH7F4JLRswpatyhWBnZPfBLxvfMGhXCP3ewa/sC9dnwbPP9 ypXAfeZXfpy2R24eIU8vfp9yabT8qj2omFQbj+O5bZqT4DrmBzz11tRIYclSqxUN4h doq1h4BrQuKtIIFdcYnPcF/61HXOKg8xu9HY/LG8= Date: Thu, 24 Mar 2022 22:25:02 +0200 From: Laurent Pinchart To: Ricardo Ribalda Cc: Mauro Carvalho Chehab , linux-media@vger.kernel.org, linux-kernel@vger.kernel.org, Hans Verkuil Subject: Re: [PATCH v2] media: uvcvideo: Fix handling on Bitmask controls Message-ID: References: <20220215184228.2531386-1-ribalda@chromium.org> MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Disposition: inline In-Reply-To: <20220215184228.2531386-1-ribalda@chromium.org> X-Spam-Status: No, score=-2.0 required=5.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,HEADER_FROM_DIFFERENT_DOMAINS, MAILING_LIST_MULTI,RDNS_NONE,SPF_HELO_NONE,T_SCC_BODY_TEXT_LINE autolearn=no autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on lindbergh.monkeyblade.net Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Hi Ricardo, Thank you for the patch. On Tue, Feb 15, 2022 at 06:42:28PM +0000, Ricardo Ribalda wrote: > Minimum and step values for V4L2_CTRL_TYPE_BITMASK controls should be 0. > There is no need to query the camera firmware about this and maybe get > invalid results. > > Also value should be clamped to the min/max value advertised by the > hardware. > > Fixes v4l2-compliane: > Control ioctls (Input 0): > fail: v4l2-test-controls.cpp(97): minimum must be 0 for a bitmask control > test VIDIOC_QUERY_EXT_CTRL/QUERYMENU: FAIL What bitmask control do you have ? The driver has no standard control that use the V4L2_CTRL_TYPE_BITMASK type. UVC doesn't formally define bitmask control type (UVC_CTRL_DATA_TYPE_BITMASK). In UVC 1.1 only the UVC_CT_AE_MODE_CONTROL control has a bitmap type, and only one bit can be set at a type. It thus maps to a V4L2 menu control. In UVC 1.5 there are other controls documented as bitmap controls, which could map to the V4L2 bitmask control type. Those don't support GET_MIN and GET_MAX, but use GET_RES to report the list of bits that can be set. This should be mapped to the V4L2 control maximum value, which isn't handled by this patch. The last hunk is also incorrect, as it clamps the value to what is reported by GET_MIN and GET_MAX, instead of [0, GET_RES], but more than that, it should not just clamp the value, but check that all bits are valid. > Signed-off-by: Ricardo Ribalda > --- > drivers/media/usb/uvc/uvc_ctrl.c | 7 +++++-- > 1 file changed, 5 insertions(+), 2 deletions(-) > > diff --git a/drivers/media/usb/uvc/uvc_ctrl.c b/drivers/media/usb/uvc/uvc_ctrl.c > index b4f6edf968bc0..d8b9ab5b7fb85 100644 > --- a/drivers/media/usb/uvc/uvc_ctrl.c > +++ b/drivers/media/usb/uvc/uvc_ctrl.c > @@ -1156,7 +1156,8 @@ static int __uvc_query_v4l2_ctrl(struct uvc_video_chain *chain, > break; > } > > - if (ctrl->info.flags & UVC_CTRL_FLAG_GET_MIN) > + if (ctrl->info.flags & UVC_CTRL_FLAG_GET_MIN && > + mapping->v4l2_type != V4L2_CTRL_TYPE_BITMASK) > v4l2_ctrl->minimum = mapping->get(mapping, UVC_GET_MIN, > uvc_ctrl_data(ctrl, UVC_CTRL_DATA_MIN)); > > @@ -1164,7 +1165,8 @@ static int __uvc_query_v4l2_ctrl(struct uvc_video_chain *chain, > v4l2_ctrl->maximum = mapping->get(mapping, UVC_GET_MAX, > uvc_ctrl_data(ctrl, UVC_CTRL_DATA_MAX)); > > - if (ctrl->info.flags & UVC_CTRL_FLAG_GET_RES) > + if (ctrl->info.flags & UVC_CTRL_FLAG_GET_RES && > + mapping->v4l2_type != V4L2_CTRL_TYPE_BITMASK) > v4l2_ctrl->step = mapping->get(mapping, UVC_GET_RES, > uvc_ctrl_data(ctrl, UVC_CTRL_DATA_RES)); > > @@ -1721,6 +1723,7 @@ int uvc_ctrl_set(struct uvc_fh *handle, > /* Clamp out of range values. */ > switch (mapping->v4l2_type) { > case V4L2_CTRL_TYPE_INTEGER: > + case V4L2_CTRL_TYPE_BITMASK: > if (!ctrl->cached) { > ret = uvc_ctrl_populate_cache(chain, ctrl); > if (ret < 0) -- Regards, Laurent Pinchart