From nobody Sun Dec 14 13:49:28 2025 Received: from mail-vs1-f48.google.com (mail-vs1-f48.google.com [209.85.217.48]) (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 39BFA2040AD for ; Mon, 3 Feb 2025 11:55:45 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.217.48 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1738583748; cv=none; b=hIWFFk3sbVwyyPjRfng2g/VIP5UL6iip3juUAngYW/ZR7zop1EKUN3gCGLeAwu7Tu3Q/PnXzBkSRw31BfZvqPohluvlYUSdxeQM679T3mv9UHxd1wjH6fDvSxRo/5Io3teaCvazNsU9g9/Zm74KbqIrxBHq6gx4AsIZsM1Uv3pQ= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1738583748; c=relaxed/simple; bh=HMFu5YUjCzh+dfJLnCL0yvaXsO1GC5gImg50iw9aiFI=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=kQOb0pquLGFSdS8V7edNyXF6dm7jWHpU+HLk8qxeFYE7Gmp/4UKD0cvw1wpTlQ3ieIzmC7+EXQwHOCW3t6NTr+8XfsbSAussyakyh8gGogJllzZ9hmSVItuZlRuxABuiXDbrEKKakqNQA0Dz/7fih5Hzt1RQ8Uu+B/Aat+TPjDE= 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=KvyhCeUx; arc=none smtp.client-ip=209.85.217.48 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="KvyhCeUx" Received: by mail-vs1-f48.google.com with SMTP id ada2fe7eead31-4affd0fb6adso1344397137.1 for ; Mon, 03 Feb 2025 03:55:45 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=chromium.org; s=google; t=1738583745; x=1739188545; 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=YzX468yE+84ddkQd72Px4P8JN2INaFAkQMbrtGzcAY8=; b=KvyhCeUxHb0nxsdldskHbvIMm9UKOA+2FjQ01F9Bst3A4ouCPYqmrgvAHJRmRxRZqn v3sVOco1+l9xhxsUXHnLdHbsaXmDvvLePMjKVsbwikB0ud2MqHYAE6l/XIItskSionFk JVx15JFt1zegBpOcnjA3B89veyStGt+1kBWq8= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1738583745; x=1739188545; 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=YzX468yE+84ddkQd72Px4P8JN2INaFAkQMbrtGzcAY8=; b=PcZZUtWMG4wrHr/tFU16yPtWFaA+3f+NMlqCmAFeTNA8cH0Qe+eJ9UshQCqbaZTg3x jrqtVx+u8AYg8U8dZYnAPGAz14dLvWW869qymv3mWRnvRUMQTLKLevRFgjb/FPVG2wa/ 6g6RHNarh1zoCO4ZMSG11D8IcqGP+Hex05MdLxVqlLa5+Gu87Rff3jxkigmyy7THy1x+ 2DMVkn+ZknE38BMZNk6G4YmPOZDoffQhEno9RdAA5W6MPjwFwFWDoYrNISxwH/uREJnR zL2u5L82aTl6PYHhbYrSXItiaPrULFhTfL1nxQDn/eidavqyjcdW/gOv95qP6DtJIAyM /vPQ== X-Forwarded-Encrypted: i=1; AJvYcCWetXUpKzANBQ4uNrVkQiz8B1utdU7AKt9Wi2P4c2SCrMzhxaU1h5IeeucEglKmjQ97CuvTNH2JPiyD5QU=@vger.kernel.org X-Gm-Message-State: AOJu0Yze7yTib6tfc+uSknF+blQCWConKHb9jWhN76pQX4kpqHGWRFb8 17zju1fioYl2fQMEWGf7ABgalHFGfB9JlOarojhn6U4MRRVfKtFa/UU5cx5+0w== X-Gm-Gg: ASbGnctiYjym0aWh6VwWRNL9mye6CV9CBv0GE0OIN8UwTqTgpDf+1rvaD7BPmMXRYBq McBm1/7Sf7etbpLzT87RjrU9Wp2QzDQc7XhbmF4/u5k1jL2JuOEUaYhOm3gDaXBLgMYjHXj8B2E 79GwHiUmlvnYgJj2j9MR8f29YN8NDO1UGEyM3cvQkA7F948FXmdIeYlwDYemGbRT3QIq4GkkG+p Rv2HgSDVoiC8RJTqX9tmRcR2usvbk8mXg4DZsQkdsijJuSTf/JTG3sjeQc8apx4j68mmPuIqHW+ pYxKnq+PY1PBFMUkfmG04dMUSa0d24E2G22UGFSYKQA94lGhRL46je+Rvt7ikc+LeA== X-Google-Smtp-Source: AGHT+IHcoj9QHVjycMEiVN0thlw1pGaFylWGBWQLQblks8XzJtAgHPwQu9Yx3nWa+z6ZNShKZt9sRA== X-Received: by 2002:a05:6102:6c8:b0:4b6:1ce1:30a4 with SMTP id ada2fe7eead31-4b9a5265787mr14373221137.21.1738583743450; Mon, 03 Feb 2025 03:55:43 -0800 (PST) Received: from denia.c.googlers.com (5.236.236.35.bc.googleusercontent.com. [35.236.236.5]) by smtp.gmail.com with ESMTPSA id ada2fe7eead31-4b9baa9aefcsm1592770137.12.2025.02.03.03.55.41 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 03 Feb 2025 03:55:42 -0800 (PST) From: Ricardo Ribalda Date: Mon, 03 Feb 2025 11:55:37 +0000 Subject: [PATCH v17 01/17] media: v4l2_ctrl: Add V4L2_CTRL_TYPE_RECT 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: <20250203-uvc-roi-v17-1-5900a9fed613@chromium.org> References: <20250203-uvc-roi-v17-0-5900a9fed613@chromium.org> In-Reply-To: <20250203-uvc-roi-v17-0-5900a9fed613@chromium.org> To: Laurent Pinchart , Mauro Carvalho Chehab , Hans de Goede , Sakari Ailus , Hans Verkuil Cc: Yunke Cao , linux-media@vger.kernel.org, linux-kernel@vger.kernel.org, Ricardo Ribalda , Yunke Cao , Sergey Senozhatsky , Daniel Scally , Hans Verkuil X-Mailer: b4 0.13.0 From: Yunke Cao Add p_rect to struct v4l2_ext_control with basic support in v4l2-ctrls. Reviewed-by: Laurent Pinchart Reviewed-by: Ricardo Ribalda Reviewed-by: Sergey Senozhatsky Reviewed-by: Daniel Scally Signed-off-by: Yunke Cao Reviewed-by: Hans Verkuil Tested-by: Yunke Cao Signed-off-by: Ricardo Ribalda --- .../userspace-api/media/v4l/vidioc-g-ext-ctrls.rst | 4 ++++ .../userspace-api/media/v4l/vidioc-queryctrl.rst | 7 +++++++ .../userspace-api/media/videodev2.h.rst.exceptions | 1 + drivers/media/v4l2-core/v4l2-ctrls-core.c | 16 ++++++++++++= +++- include/media/v4l2-ctrls.h | 2 ++ include/uapi/linux/videodev2.h | 2 ++ 6 files changed, 31 insertions(+), 1 deletion(-) diff --git a/Documentation/userspace-api/media/v4l/vidioc-g-ext-ctrls.rst b= /Documentation/userspace-api/media/v4l/vidioc-g-ext-ctrls.rst index 4d56c0528ad7..b74a74ac06fc 100644 --- a/Documentation/userspace-api/media/v4l/vidioc-g-ext-ctrls.rst +++ b/Documentation/userspace-api/media/v4l/vidioc-g-ext-ctrls.rst @@ -199,6 +199,10 @@ still cause this situation. - ``p_area`` - A pointer to a struct :c:type:`v4l2_area`. Valid if this control is of type ``V4L2_CTRL_TYPE_AREA``. + * - struct :c:type:`v4l2_rect` * + - ``p_rect`` + - A pointer to a struct :c:type:`v4l2_rect`. Valid if this control is + of type ``V4L2_CTRL_TYPE_RECT``. * - struct :c:type:`v4l2_ctrl_h264_sps` * - ``p_h264_sps`` - A pointer to a struct :c:type:`v4l2_ctrl_h264_sps`. Valid if this = control is diff --git a/Documentation/userspace-api/media/v4l/vidioc-queryctrl.rst b/D= ocumentation/userspace-api/media/v4l/vidioc-queryctrl.rst index 4d38acafe8e1..56d5c8b0b88b 100644 --- a/Documentation/userspace-api/media/v4l/vidioc-queryctrl.rst +++ b/Documentation/userspace-api/media/v4l/vidioc-queryctrl.rst @@ -441,6 +441,13 @@ See also the examples in :ref:`control`. - n/a - A struct :c:type:`v4l2_area`, containing the width and the height of a rectangular area. Units depend on the use case. + * - ``V4L2_CTRL_TYPE_RECT`` + - n/a + - n/a + - n/a + - A struct :c:type:`v4l2_rect`, containing a rectangle described by + the position of its top-left corner, the width and the height. Units + depend on the use case. * - ``V4L2_CTRL_TYPE_H264_SPS`` - n/a - n/a diff --git a/Documentation/userspace-api/media/videodev2.h.rst.exceptions b= /Documentation/userspace-api/media/videodev2.h.rst.exceptions index 429b5cdf05c3..3cf1380b52b0 100644 --- a/Documentation/userspace-api/media/videodev2.h.rst.exceptions +++ b/Documentation/userspace-api/media/videodev2.h.rst.exceptions @@ -150,6 +150,7 @@ replace symbol V4L2_CTRL_TYPE_HEVC_SPS :c:type:`v4l2_ct= rl_type` replace symbol V4L2_CTRL_TYPE_HEVC_PPS :c:type:`v4l2_ctrl_type` replace symbol V4L2_CTRL_TYPE_HEVC_SLICE_PARAMS :c:type:`v4l2_ctrl_type` replace symbol V4L2_CTRL_TYPE_AREA :c:type:`v4l2_ctrl_type` +replace symbol V4L2_CTRL_TYPE_RECT :c:type:`v4l2_ctrl_type` replace symbol V4L2_CTRL_TYPE_FWHT_PARAMS :c:type:`v4l2_ctrl_type` replace symbol V4L2_CTRL_TYPE_VP8_FRAME :c:type:`v4l2_ctrl_type` replace symbol V4L2_CTRL_TYPE_VP9_COMPRESSED_HDR :c:type:`v4l2_ctrl_type` diff --git a/drivers/media/v4l2-core/v4l2-ctrls-core.c b/drivers/media/v4l2= -core/v4l2-ctrls-core.c index eeab6a5eb7ba..4c8744c8cd96 100644 --- a/drivers/media/v4l2-core/v4l2-ctrls-core.c +++ b/drivers/media/v4l2-core/v4l2-ctrls-core.c @@ -370,7 +370,11 @@ void v4l2_ctrl_type_op_log(const struct v4l2_ctrl *ctr= l) case V4L2_CTRL_TYPE_AV1_FILM_GRAIN: pr_cont("AV1_FILM_GRAIN"); break; - + case V4L2_CTRL_TYPE_RECT: + pr_cont("%ux%u@%dx%d", + ptr.p_rect->width, ptr.p_rect->height, + ptr.p_rect->left, ptr.p_rect->top); + break; default: pr_cont("unknown type %d", ctrl->type); break; @@ -815,6 +819,7 @@ static int std_validate_compound(const struct v4l2_ctrl= *ctrl, u32 idx, struct v4l2_ctrl_hdr10_mastering_display *p_hdr10_mastering; struct v4l2_ctrl_hevc_decode_params *p_hevc_decode_params; struct v4l2_area *area; + struct v4l2_rect *rect; void *p =3D ptr.p + idx * ctrl->elem_size; unsigned int i; =20 @@ -1172,6 +1177,12 @@ static int std_validate_compound(const struct v4l2_c= trl *ctrl, u32 idx, return -EINVAL; break; =20 + case V4L2_CTRL_TYPE_RECT: + rect =3D p; + if (!rect->width || !rect->height) + return -EINVAL; + break; + default: return -EINVAL; } @@ -1872,6 +1883,9 @@ static struct v4l2_ctrl *v4l2_ctrl_new(struct v4l2_ct= rl_handler *hdl, case V4L2_CTRL_TYPE_AREA: elem_size =3D sizeof(struct v4l2_area); break; + case V4L2_CTRL_TYPE_RECT: + elem_size =3D sizeof(struct v4l2_rect); + break; default: if (type < V4L2_CTRL_COMPOUND_TYPES) elem_size =3D sizeof(s32); diff --git a/include/media/v4l2-ctrls.h b/include/media/v4l2-ctrls.h index 59679a42b3e7..b0db167a3ac4 100644 --- a/include/media/v4l2-ctrls.h +++ b/include/media/v4l2-ctrls.h @@ -56,6 +56,7 @@ struct video_device; * @p_av1_tile_group_entry: Pointer to an AV1 tile group entry structure. * @p_av1_frame: Pointer to an AV1 frame structure. * @p_av1_film_grain: Pointer to an AV1 film grain structure. + * @p_rect: Pointer to a rectangle. * @p: Pointer to a compound value. * @p_const: Pointer to a constant compound value. */ @@ -89,6 +90,7 @@ union v4l2_ctrl_ptr { struct v4l2_ctrl_av1_tile_group_entry *p_av1_tile_group_entry; struct v4l2_ctrl_av1_frame *p_av1_frame; struct v4l2_ctrl_av1_film_grain *p_av1_film_grain; + struct v4l2_rect *p_rect; void *p; const void *p_const; }; diff --git a/include/uapi/linux/videodev2.h b/include/uapi/linux/videodev2.h index e7c4dce39007..c1c2ae150d30 100644 --- a/include/uapi/linux/videodev2.h +++ b/include/uapi/linux/videodev2.h @@ -1859,6 +1859,7 @@ struct v4l2_ext_control { __s32 __user *p_s32; __s64 __user *p_s64; struct v4l2_area __user *p_area; + struct v4l2_rect __user *p_rect; struct v4l2_ctrl_h264_sps __user *p_h264_sps; struct v4l2_ctrl_h264_pps __user *p_h264_pps; struct v4l2_ctrl_h264_scaling_matrix __user *p_h264_scaling_matrix; @@ -1929,6 +1930,7 @@ enum v4l2_ctrl_type { V4L2_CTRL_TYPE_U16 =3D 0x0101, V4L2_CTRL_TYPE_U32 =3D 0x0102, V4L2_CTRL_TYPE_AREA =3D 0x0106, + V4L2_CTRL_TYPE_RECT =3D 0x0107, =20 V4L2_CTRL_TYPE_HDR10_CLL_INFO =3D 0x0110, V4L2_CTRL_TYPE_HDR10_MASTERING_DISPLAY =3D 0x0111, --=20 2.48.1.362.g079036d154-goog From nobody Sun Dec 14 13:49:28 2025 Received: from mail-ua1-f49.google.com (mail-ua1-f49.google.com [209.85.222.49]) (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 2B75D2040BC for ; Mon, 3 Feb 2025 11:55:46 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.222.49 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1738583749; cv=none; b=nbDsdB0Z0oqoXqPSHa3CvR+WhivUX5z57czz4YepNmNxtV9et3ys8Jt8amA9nbXCQC77jvazQaTqhy1YxNzjaU00zC5yskYcqqgTWTr2ujGVBaBmgAHJ074Qwy7a6RN/cPwxEBXaMeQ398P5jMBJ4TkhlUWz8/MIaTuDxuLi2Ug= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1738583749; c=relaxed/simple; bh=XJwd3yIPthAegNyNmmg6VQztSwsRTjHKkRMJMH+B8b8=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=pJm/kMLiKusAkTsEUBc+QmuKN99EX9NIyJTBl6ffE/Z5WEhF64prtnddYPmwU9UGsWCEOzqpbnT2B/QYyZ0cTsNyF+oeFrAv4Ev/cxG+FJEt6FxxlHQqq9yO0uYc1RrVaFJgxLmhOT5zJEoMaV8ZR2kww/sqwhjYae8lOcggtCI= 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=YNie8tHh; arc=none smtp.client-ip=209.85.222.49 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="YNie8tHh" Received: by mail-ua1-f49.google.com with SMTP id a1e0cc1a2514c-86112ab1ad4so1108415241.1 for ; Mon, 03 Feb 2025 03:55:46 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=chromium.org; s=google; t=1738583746; x=1739188546; 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=JaU+8X0wrjguJ2rd1GAPHdQslYihbtzEeHR6xQ2rG7M=; b=YNie8tHhoInULW8S6ZpITbGS9hOmUbjuwWmEbgcVXbyQCCFrHWl+2ygINrGTYwjWAL AFaM5UIBtPTyf+WuIvXrvYFjC+YUUGRBCXq/7Ru3UcW4e/zId6LIyjkF4QF0Ng+om4+V 0PKuUtIVFADrF6yBbR9UZHgmAEjuEcPgmKm10= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1738583746; x=1739188546; 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=JaU+8X0wrjguJ2rd1GAPHdQslYihbtzEeHR6xQ2rG7M=; b=erObbZyL+N60/6zUUn7Hh+mLlRh3IL629C2QjHyZIhkRt1Z41W/P8kUHYCTB1CWkUl dwR3XPMtGIi4v4tv0DJ1lNMq8tLM6dijRD8yvjRsMYY9AyEzq0CNzS8KW9hkOKT+OgYq doYbK2aL1zyCMrvzmpn4eVl6ZeuZtQLBwM0Ism1bkjt9/4OmPxNt0syX/wc/QAJoygBp MzjVDXUubLBNEljLXZBfbgaPUbxX21pXmzstqPwUbB8F6bKggJK7NwBZbQnXUj8VrK/g MEuH06wxlIdKmkAue0HyP+s4i++RZtoOXJHY/pdplkBcCiPbpan+a3QFeC8ZQW74qlLv o14Q== X-Forwarded-Encrypted: i=1; AJvYcCWRm8aym7Uf1Q8w0aj+tNiojUFsbv35TA2jHjoVm1EKO6Dr+QEn4TDrm82Wim2ZPpH9tyZmeclMfhIqVcY=@vger.kernel.org X-Gm-Message-State: AOJu0Yxvp0Y+IgJWdQLONyWigX6r14JxWWmJ27X44zxos7ZL+tfugAR0 c2nYA5muEXKPR0vRIfJfv7Qj1UftsPAF3RptICpkQh83tiVPKCexDvmd94t9WQ== X-Gm-Gg: ASbGncu5NA34yJzbF77qIAvlFvVCBJ58otPtevasG7Z2/9GUftIa4DAGwG9VMCpT5P2 UL2ApR9HxcqnMGGKLy93AgUin/rvMYaO1q3hbhG+yoxnuWH4nOLAIaaOc7bPGmwfzLMM2FxjflD 5qIBXOpQoUg8TFcgLhI72c/oV42fPjeDj3iXIfGHau1PO3smhO2favuXTOEx12licJKop3POfYJ nXID/OhAneRiOH+GV8vCFCv/h7bN6GDZ79txvsPxu/uRI0a5XDvxBm7CaRwItzbsBsZRww/5/yw Pe5FDCA7gLWWltvcj77wXiyYCbZl7TXl2YV7Qq7vIpcYtD8KjArtd0MEidMaCbkjuw== X-Google-Smtp-Source: AGHT+IFML5mu1QPXvWbtzIlYsaC06JIwObD00art95oaKIk78+xIwYhWLGTIsb4v/CNCGUZTGUcM2Q== X-Received: by 2002:a05:6102:c01:b0:4b1:130f:9fd5 with SMTP id ada2fe7eead31-4b9a51f36cbmr15501197137.19.1738583745824; Mon, 03 Feb 2025 03:55:45 -0800 (PST) Received: from denia.c.googlers.com (5.236.236.35.bc.googleusercontent.com. [35.236.236.5]) by smtp.gmail.com with ESMTPSA id ada2fe7eead31-4b9baa9aefcsm1592770137.12.2025.02.03.03.55.43 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 03 Feb 2025 03:55:44 -0800 (PST) From: Ricardo Ribalda Date: Mon, 03 Feb 2025 11:55:38 +0000 Subject: [PATCH v17 02/17] media: v4l2-ctrls: add support for V4L2_CTRL_WHICH_MIN/MAX_VAL 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: <20250203-uvc-roi-v17-2-5900a9fed613@chromium.org> References: <20250203-uvc-roi-v17-0-5900a9fed613@chromium.org> In-Reply-To: <20250203-uvc-roi-v17-0-5900a9fed613@chromium.org> To: Laurent Pinchart , Mauro Carvalho Chehab , Hans de Goede , Sakari Ailus , Hans Verkuil Cc: Yunke Cao , linux-media@vger.kernel.org, linux-kernel@vger.kernel.org, Ricardo Ribalda , Yunke Cao X-Mailer: b4 0.13.0 From: Hans Verkuil Add the capability of retrieving the min and max values of a compound control. [Ricardo: Added static to v4l2_ctrl_type_op_(maximum|minimum) proto] [Ricardo: Fix documentation] Signed-off-by: Hans Verkuil Signed-off-by: Yunke Cao Tested-by: Yunke Cao Signed-off-by: Ricardo Ribalda --- .../userspace-api/media/v4l/vidioc-g-ext-ctrls.rst | 22 ++- .../userspace-api/media/v4l/vidioc-queryctrl.rst | 9 +- .../userspace-api/media/videodev2.h.rst.exceptions | 3 + drivers/media/i2c/imx214.c | 4 +- drivers/media/platform/qcom/venus/venc_ctrls.c | 9 +- drivers/media/v4l2-core/v4l2-ctrls-api.c | 54 ++++++-- drivers/media/v4l2-core/v4l2-ctrls-core.c | 151 +++++++++++++++++= ---- drivers/media/v4l2-core/v4l2-ioctl.c | 4 +- include/media/v4l2-ctrls.h | 36 ++++- include/uapi/linux/videodev2.h | 3 + 10 files changed, 247 insertions(+), 48 deletions(-) diff --git a/Documentation/userspace-api/media/v4l/vidioc-g-ext-ctrls.rst b= /Documentation/userspace-api/media/v4l/vidioc-g-ext-ctrls.rst index b74a74ac06fc..b8698b85bd80 100644 --- a/Documentation/userspace-api/media/v4l/vidioc-g-ext-ctrls.rst +++ b/Documentation/userspace-api/media/v4l/vidioc-g-ext-ctrls.rst @@ -338,14 +338,26 @@ still cause this situation. - Which value of the control to get/set/try. * - :cspan:`2` ``V4L2_CTRL_WHICH_CUR_VAL`` will return the current val= ue of the control, ``V4L2_CTRL_WHICH_DEF_VAL`` will return the default - value of the control and ``V4L2_CTRL_WHICH_REQUEST_VAL`` indicates that - these controls have to be retrieved from a request or tried/set for - a request. In the latter case the ``request_fd`` field contains the + value of the control, ``V4L2_CTRL_WHICH_MIN_VAL`` will return the minimum + value of the control, and ``V4L2_CTRL_WHICH_MAX_VAL`` will return the max= imum + value of the control. ``V4L2_CTRL_WHICH_REQUEST_VAL`` indicates that + the control value has to be retrieved from a request or tried/set for + a request. In that case the ``request_fd`` field contains the file descriptor of the request that should be used. If the device does not support requests, then ``EACCES`` will be returned. =20 - When using ``V4L2_CTRL_WHICH_DEF_VAL`` be aware that you can only - get the default value of the control, you cannot set or try it. + When using ``V4L2_CTRL_WHICH_DEF_VAL``, ``V4L2_CTRL_WHICH_MIN_VAL`` + or ``V4L2_CTRL_WHICH_MAX_VAL`` be aware that you can only get the + default/minimum/maximum value of the control, you cannot set or try it. + + Whether a control supports querying the minimum and maximum values using + ``V4L2_CTRL_WHICH_MIN_VAL`` and ``V4L2_CTRL_WHICH_MAX_VAL`` is indicated + by the ``V4L2_CTRL_FLAG_HAS_WHICH_MIN_MAX`` flag. Most non-compound + control types support this. For controls with compound types, the + definition of minimum/maximum values are provided by + the control documentation. If a compound control does not document the + meaning of minimum/maximum value, then querying the minimum or maximum + value will result in the error code -EINVAL. =20 For backwards compatibility you can also use a control class here (see :ref:`ctrl-class`). In that case all controls have to diff --git a/Documentation/userspace-api/media/v4l/vidioc-queryctrl.rst b/D= ocumentation/userspace-api/media/v4l/vidioc-queryctrl.rst index 56d5c8b0b88b..3549417c7feb 100644 --- a/Documentation/userspace-api/media/v4l/vidioc-queryctrl.rst +++ b/Documentation/userspace-api/media/v4l/vidioc-queryctrl.rst @@ -447,7 +447,10 @@ See also the examples in :ref:`control`. - n/a - A struct :c:type:`v4l2_rect`, containing a rectangle described by the position of its top-left corner, the width and the height. Units - depend on the use case. + depend on the use case. Support for ``V4L2_CTRL_WHICH_MIN_VAL`` and + ``V4L2_CTRL_WHICH_MAX_VAL`` is optional and depends on the + ``V4L2_CTRL_FLAG_HAS_WHICH_MIN_MAX`` flag. See the documentation of + the specific control on how to interpret the minimum and maximum values. * - ``V4L2_CTRL_TYPE_H264_SPS`` - n/a - n/a @@ -664,6 +667,10 @@ See also the examples in :ref:`control`. ``dims[0]``. So setting the control with a differently sized array will change the ``elems`` field when the control is queried afterwards. + * - ``V4L2_CTRL_FLAG_HAS_WHICH_MIN_MAX`` + - 0x1000 + - This control supports getting minimum and maximum values using + vidioc_g_ext_ctrls with V4L2_CTRL_WHICH_MIN/MAX_VAL. =20 Return Value =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D diff --git a/Documentation/userspace-api/media/videodev2.h.rst.exceptions b= /Documentation/userspace-api/media/videodev2.h.rst.exceptions index 3cf1380b52b0..35d3456cc812 100644 --- a/Documentation/userspace-api/media/videodev2.h.rst.exceptions +++ b/Documentation/userspace-api/media/videodev2.h.rst.exceptions @@ -396,6 +396,7 @@ replace define V4L2_CTRL_FLAG_HAS_PAYLOAD control-flags replace define V4L2_CTRL_FLAG_EXECUTE_ON_WRITE control-flags replace define V4L2_CTRL_FLAG_MODIFY_LAYOUT control-flags replace define V4L2_CTRL_FLAG_DYNAMIC_ARRAY control-flags +replace define V4L2_CTRL_FLAG_HAS_WHICH_MIN_MAX control-flags =20 replace define V4L2_CTRL_FLAG_NEXT_CTRL control replace define V4L2_CTRL_FLAG_NEXT_COMPOUND control @@ -570,6 +571,8 @@ ignore define V4L2_CTRL_DRIVER_PRIV ignore define V4L2_CTRL_MAX_DIMS ignore define V4L2_CTRL_WHICH_CUR_VAL ignore define V4L2_CTRL_WHICH_DEF_VAL +ignore define V4L2_CTRL_WHICH_MIN_VAL +ignore define V4L2_CTRL_WHICH_MAX_VAL ignore define V4L2_CTRL_WHICH_REQUEST_VAL ignore define V4L2_OUT_CAP_CUSTOM_TIMINGS ignore define V4L2_CID_MAX_CTRLS diff --git a/drivers/media/i2c/imx214.c b/drivers/media/i2c/imx214.c index 4962cfe7c83d..b0439005ec71 100644 --- a/drivers/media/i2c/imx214.c +++ b/drivers/media/i2c/imx214.c @@ -774,7 +774,9 @@ static int imx214_ctrls_init(struct imx214 *imx214) imx214->unit_size =3D v4l2_ctrl_new_std_compound(ctrl_hdlr, NULL, V4L2_CID_UNIT_CELL_SIZE, - v4l2_ctrl_ptr_create((void *)&unit_size)); + v4l2_ctrl_ptr_create((void *)&unit_size), + v4l2_ctrl_ptr_create(NULL), + v4l2_ctrl_ptr_create(NULL)); =20 v4l2_ctrl_new_fwnode_properties(ctrl_hdlr, &imx214_ctrl_ops, &props); =20 diff --git a/drivers/media/platform/qcom/venus/venc_ctrls.c b/drivers/media= /platform/qcom/venus/venc_ctrls.c index 51801a962ed2..4d36c44f9d44 100644 --- a/drivers/media/platform/qcom/venus/venc_ctrls.c +++ b/drivers/media/platform/qcom/venus/venc_ctrls.c @@ -662,11 +662,16 @@ int venc_ctrl_init(struct venus_inst *inst) =20 v4l2_ctrl_new_std_compound(&inst->ctrl_handler, &venc_ctrl_ops, V4L2_CID_COLORIMETRY_HDR10_CLL_INFO, - v4l2_ctrl_ptr_create(&p_hdr10_cll)); + v4l2_ctrl_ptr_create(&p_hdr10_cll), + v4l2_ctrl_ptr_create(NULL), + v4l2_ctrl_ptr_create(NULL)); =20 v4l2_ctrl_new_std_compound(&inst->ctrl_handler, &venc_ctrl_ops, V4L2_CID_COLORIMETRY_HDR10_MASTERING_DISPLAY, - v4l2_ctrl_ptr_create((void *)&p_hdr10_mastering)); + v4l2_ctrl_ptr_create((void *)&p_hdr10_mastering), + v4l2_ctrl_ptr_create(NULL), + v4l2_ctrl_ptr_create(NULL)); + =20 v4l2_ctrl_new_std_menu(&inst->ctrl_handler, &venc_ctrl_ops, V4L2_CID_MPEG_VIDEO_INTRA_REFRESH_PERIOD_TYPE, diff --git a/drivers/media/v4l2-core/v4l2-ctrls-api.c b/drivers/media/v4l2-= core/v4l2-ctrls-api.c index 95a2202879d8..c61f3ec09d24 100644 --- a/drivers/media/v4l2-core/v4l2-ctrls-api.c +++ b/drivers/media/v4l2-core/v4l2-ctrls-api.c @@ -94,6 +94,22 @@ static int def_to_user(struct v4l2_ext_control *c, struc= t v4l2_ctrl *ctrl) return ptr_to_user(c, ctrl, ctrl->p_new); } =20 +/* Helper function: copy the minimum control value back to the caller */ +static int min_to_user(struct v4l2_ext_control *c, struct v4l2_ctrl *ctrl) +{ + ctrl->type_ops->minimum(ctrl, 0, ctrl->p_new); + + return ptr_to_user(c, ctrl, ctrl->p_new); +} + +/* Helper function: copy the maximum control value back to the caller */ +static int max_to_user(struct v4l2_ext_control *c, struct v4l2_ctrl *ctrl) +{ + ctrl->type_ops->maximum(ctrl, 0, ctrl->p_new); + + return ptr_to_user(c, ctrl, ctrl->p_new); +} + /* Helper function: copy the caller-provider value as the new control valu= e */ static int user_to_new(struct v4l2_ext_control *c, struct v4l2_ctrl *ctrl) { @@ -229,8 +245,8 @@ static int prepare_ext_ctrls(struct v4l2_ctrl_handler *= hdl, cs->error_idx =3D i; =20 if (cs->which && - cs->which !=3D V4L2_CTRL_WHICH_DEF_VAL && - cs->which !=3D V4L2_CTRL_WHICH_REQUEST_VAL && + (cs->which < V4L2_CTRL_WHICH_DEF_VAL || + cs->which > V4L2_CTRL_WHICH_MAX_VAL) && V4L2_CTRL_ID2WHICH(id) !=3D cs->which) { dprintk(vdev, "invalid which 0x%x or control id 0x%x\n", @@ -259,6 +275,15 @@ static int prepare_ext_ctrls(struct v4l2_ctrl_handler = *hdl, return -EINVAL; } =20 + if (!(ctrl->flags & V4L2_CTRL_FLAG_HAS_WHICH_MIN_MAX) && + (cs->which =3D=3D V4L2_CTRL_WHICH_MIN_VAL || + cs->which =3D=3D V4L2_CTRL_WHICH_MAX_VAL)) { + dprintk(vdev, + "invalid which 0x%x or control id 0x%x\n", + cs->which, id); + return -EINVAL; + } + if (ctrl->cluster[0]->ncontrols > 1) have_clusters =3D true; if (ctrl->cluster[0] !=3D ctrl) @@ -368,8 +393,8 @@ static int prepare_ext_ctrls(struct v4l2_ctrl_handler *= hdl, */ static int class_check(struct v4l2_ctrl_handler *hdl, u32 which) { - if (which =3D=3D 0 || which =3D=3D V4L2_CTRL_WHICH_DEF_VAL || - which =3D=3D V4L2_CTRL_WHICH_REQUEST_VAL) + if (which =3D=3D 0 || (which >=3D V4L2_CTRL_WHICH_DEF_VAL && + which <=3D V4L2_CTRL_WHICH_MAX_VAL)) return 0; return find_ref_lock(hdl, which | 1) ? 0 : -EINVAL; } @@ -389,10 +414,12 @@ int v4l2_g_ext_ctrls_common(struct v4l2_ctrl_handler = *hdl, struct v4l2_ctrl_helper *helpers =3D helper; int ret; int i, j; - bool is_default, is_request; + bool is_default, is_request, is_min, is_max; =20 is_default =3D (cs->which =3D=3D V4L2_CTRL_WHICH_DEF_VAL); is_request =3D (cs->which =3D=3D V4L2_CTRL_WHICH_REQUEST_VAL); + is_min =3D (cs->which =3D=3D V4L2_CTRL_WHICH_MIN_VAL); + is_max =3D (cs->which =3D=3D V4L2_CTRL_WHICH_MAX_VAL); =20 cs->error_idx =3D cs->count; cs->which =3D V4L2_CTRL_ID2WHICH(cs->which); @@ -432,13 +459,14 @@ int v4l2_g_ext_ctrls_common(struct v4l2_ctrl_handler = *hdl, =20 /* * g_volatile_ctrl will update the new control values. - * This makes no sense for V4L2_CTRL_WHICH_DEF_VAL and + * This makes no sense for V4L2_CTRL_WHICH_DEF_VAL, + * V4L2_CTRL_WHICH_MIN_VAL, V4L2_CTRL_WHICH_MAX_VAL and * V4L2_CTRL_WHICH_REQUEST_VAL. In the case of requests * it is v4l2_ctrl_request_complete() that copies the * volatile controls at the time of request completion * to the request, so you don't want to do that again. */ - if (!is_default && !is_request && + if (!is_default && !is_request && !is_min && !is_max && ((master->flags & V4L2_CTRL_FLAG_VOLATILE) || (master->has_volatiles && !is_cur_manual(master)))) { for (j =3D 0; j < master->ncontrols; j++) @@ -467,6 +495,10 @@ int v4l2_g_ext_ctrls_common(struct v4l2_ctrl_handler *= hdl, ret =3D -ENOMEM; else if (is_request && ref->p_req_valid) ret =3D req_to_user(cs->controls + idx, ref); + else if (is_min) + ret =3D min_to_user(cs->controls + idx, ref->ctrl); + else if (is_max) + ret =3D max_to_user(cs->controls + idx, ref->ctrl); else if (is_volatile) ret =3D new_to_user(cs->controls + idx, ref->ctrl); else @@ -564,9 +596,11 @@ int try_set_ext_ctrls_common(struct v4l2_fh *fh, =20 cs->error_idx =3D cs->count; =20 - /* Default value cannot be changed */ - if (cs->which =3D=3D V4L2_CTRL_WHICH_DEF_VAL) { - dprintk(vdev, "%s: cannot change default value\n", + /* Default/minimum/maximum values cannot be changed */ + if (cs->which =3D=3D V4L2_CTRL_WHICH_DEF_VAL || + cs->which =3D=3D V4L2_CTRL_WHICH_MIN_VAL || + cs->which =3D=3D V4L2_CTRL_WHICH_MAX_VAL) { + dprintk(vdev, "%s: cannot change default/min/max value\n", video_device_node_name(vdev)); return -EINVAL; } diff --git a/drivers/media/v4l2-core/v4l2-ctrls-core.c b/drivers/media/v4l2= -core/v4l2-ctrls-core.c index 4c8744c8cd96..d510ca67e815 100644 --- a/drivers/media/v4l2-core/v4l2-ctrls-core.c +++ b/drivers/media/v4l2-core/v4l2-ctrls-core.c @@ -182,29 +182,66 @@ static void std_init_compound(const struct v4l2_ctrl = *ctrl, u32 idx, } } =20 -void v4l2_ctrl_type_op_init(const struct v4l2_ctrl *ctrl, u32 from_idx, +static void std_min_compound(const struct v4l2_ctrl *ctrl, u32 idx, + union v4l2_ctrl_ptr ptr) +{ + void *p =3D ptr.p + idx * ctrl->elem_size; + + if (ctrl->p_min.p_const) + memcpy(p, ctrl->p_min.p_const, ctrl->elem_size); + else + memset(p, 0, ctrl->elem_size); +} + +static void std_max_compound(const struct v4l2_ctrl *ctrl, u32 idx, union v4l2_ctrl_ptr ptr) +{ + void *p =3D ptr.p + idx * ctrl->elem_size; + + if (ctrl->p_max.p_const) + memcpy(p, ctrl->p_max.p_const, ctrl->elem_size); + else + memset(p, 0, ctrl->elem_size); +} + +static void __v4l2_ctrl_type_op_init(const struct v4l2_ctrl *ctrl, u32 fro= m_idx, + u32 which, union v4l2_ctrl_ptr ptr) { unsigned int i; u32 tot_elems =3D ctrl->elems; u32 elems =3D tot_elems - from_idx; + s64 value; =20 - if (from_idx >=3D tot_elems) + switch (which) { + case V4L2_CTRL_WHICH_DEF_VAL: + value =3D ctrl->default_value; + break; + case V4L2_CTRL_WHICH_MAX_VAL: + value =3D ctrl->maximum; + break; + case V4L2_CTRL_WHICH_MIN_VAL: + value =3D ctrl->minimum; + break; + default: return; + } =20 switch (ctrl->type) { case V4L2_CTRL_TYPE_STRING: + if (which =3D=3D V4L2_CTRL_WHICH_DEF_VAL) + value =3D ctrl->minimum; + for (i =3D from_idx; i < tot_elems; i++) { unsigned int offset =3D i * ctrl->elem_size; =20 - memset(ptr.p_char + offset, ' ', ctrl->minimum); - ptr.p_char[offset + ctrl->minimum] =3D '\0'; + memset(ptr.p_char + offset, ' ', value); + ptr.p_char[offset + value] =3D '\0'; } break; case V4L2_CTRL_TYPE_INTEGER64: - if (ctrl->default_value) { + if (value) { for (i =3D from_idx; i < tot_elems; i++) - ptr.p_s64[i] =3D ctrl->default_value; + ptr.p_s64[i] =3D value; } else { memset(ptr.p_s64 + from_idx, 0, elems * sizeof(s64)); } @@ -214,9 +251,9 @@ void v4l2_ctrl_type_op_init(const struct v4l2_ctrl *ctr= l, u32 from_idx, case V4L2_CTRL_TYPE_MENU: case V4L2_CTRL_TYPE_BITMASK: case V4L2_CTRL_TYPE_BOOLEAN: - if (ctrl->default_value) { + if (value) { for (i =3D from_idx; i < tot_elems; i++) - ptr.p_s32[i] =3D ctrl->default_value; + ptr.p_s32[i] =3D value; } else { memset(ptr.p_s32 + from_idx, 0, elems * sizeof(s32)); } @@ -226,32 +263,61 @@ void v4l2_ctrl_type_op_init(const struct v4l2_ctrl *c= trl, u32 from_idx, memset(ptr.p_s32 + from_idx, 0, elems * sizeof(s32)); break; case V4L2_CTRL_TYPE_U8: - memset(ptr.p_u8 + from_idx, ctrl->default_value, elems); + memset(ptr.p_u8 + from_idx, value, elems); break; case V4L2_CTRL_TYPE_U16: - if (ctrl->default_value) { + if (value) { for (i =3D from_idx; i < tot_elems; i++) - ptr.p_u16[i] =3D ctrl->default_value; + ptr.p_u16[i] =3D value; } else { memset(ptr.p_u16 + from_idx, 0, elems * sizeof(u16)); } break; case V4L2_CTRL_TYPE_U32: - if (ctrl->default_value) { + if (value) { for (i =3D from_idx; i < tot_elems; i++) - ptr.p_u32[i] =3D ctrl->default_value; + ptr.p_u32[i] =3D value; } else { memset(ptr.p_u32 + from_idx, 0, elems * sizeof(u32)); } break; default: - for (i =3D from_idx; i < tot_elems; i++) - std_init_compound(ctrl, i, ptr); + for (i =3D from_idx; i < tot_elems; i++) { + switch (which) { + case V4L2_CTRL_WHICH_DEF_VAL: + std_init_compound(ctrl, i, ptr); + break; + case V4L2_CTRL_WHICH_MAX_VAL: + std_max_compound(ctrl, i, ptr); + break; + case V4L2_CTRL_WHICH_MIN_VAL: + std_min_compound(ctrl, i, ptr); + break; + } + } break; } } + +void v4l2_ctrl_type_op_init(const struct v4l2_ctrl *ctrl, u32 from_idx, + union v4l2_ctrl_ptr ptr) +{ + __v4l2_ctrl_type_op_init(ctrl, from_idx, V4L2_CTRL_WHICH_DEF_VAL, ptr); +} EXPORT_SYMBOL(v4l2_ctrl_type_op_init); =20 +static void v4l2_ctrl_type_op_minimum(const struct v4l2_ctrl *ctrl, + u32 from_idx, union v4l2_ctrl_ptr ptr) +{ + __v4l2_ctrl_type_op_init(ctrl, from_idx, V4L2_CTRL_WHICH_MIN_VAL, ptr); +} + +static void v4l2_ctrl_type_op_maximum(const struct v4l2_ctrl *ctrl, + u32 from_idx, union v4l2_ctrl_ptr ptr) +{ + __v4l2_ctrl_type_op_init(ctrl, from_idx, V4L2_CTRL_WHICH_MAX_VAL, ptr); +} + void v4l2_ctrl_type_op_log(const struct v4l2_ctrl *ctrl) { union v4l2_ctrl_ptr ptr =3D ctrl->p_cur; @@ -1296,6 +1362,8 @@ EXPORT_SYMBOL(v4l2_ctrl_type_op_validate); static const struct v4l2_ctrl_type_ops std_type_ops =3D { .equal =3D v4l2_ctrl_type_op_equal, .init =3D v4l2_ctrl_type_op_init, + .minimum =3D v4l2_ctrl_type_op_minimum, + .maximum =3D v4l2_ctrl_type_op_maximum, .log =3D v4l2_ctrl_type_op_log, .validate =3D v4l2_ctrl_type_op_validate, }; @@ -1768,7 +1836,10 @@ static struct v4l2_ctrl *v4l2_ctrl_new(struct v4l2_c= trl_handler *hdl, s64 min, s64 max, u64 step, s64 def, const u32 dims[V4L2_CTRL_MAX_DIMS], u32 elem_size, u32 flags, const char * const *qmenu, - const s64 *qmenu_int, const union v4l2_ctrl_ptr p_def, + const s64 *qmenu_int, + const union v4l2_ctrl_ptr p_def, + const union v4l2_ctrl_ptr p_min, + const union v4l2_ctrl_ptr p_max, void *priv) { struct v4l2_ctrl *ctrl; @@ -1892,6 +1963,12 @@ static struct v4l2_ctrl *v4l2_ctrl_new(struct v4l2_c= trl_handler *hdl, break; } =20 + if (type < V4L2_CTRL_COMPOUND_TYPES && + type !=3D V4L2_CTRL_TYPE_BUTTON && + type !=3D V4L2_CTRL_TYPE_CTRL_CLASS && + type !=3D V4L2_CTRL_TYPE_STRING) + flags |=3D V4L2_CTRL_FLAG_HAS_WHICH_MIN_MAX; + /* Sanity checks */ if (id =3D=3D 0 || name =3D=3D NULL || !elem_size || id >=3D V4L2_CID_PRIVATE_BASE || @@ -1900,6 +1977,7 @@ static struct v4l2_ctrl *v4l2_ctrl_new(struct v4l2_ct= rl_handler *hdl, handler_set_err(hdl, -ERANGE); return NULL; } + err =3D check_range(type, min, max, step, def); if (err) { handler_set_err(hdl, err); @@ -1941,6 +2019,10 @@ static struct v4l2_ctrl *v4l2_ctrl_new(struct v4l2_c= trl_handler *hdl, =20 if (type >=3D V4L2_CTRL_COMPOUND_TYPES && p_def.p_const) sz_extra +=3D elem_size; + if (type >=3D V4L2_CTRL_COMPOUND_TYPES && p_min.p_const) + sz_extra +=3D elem_size; + if (type >=3D V4L2_CTRL_COMPOUND_TYPES && p_max.p_const) + sz_extra +=3D elem_size; =20 ctrl =3D kvzalloc(sizeof(*ctrl) + sz_extra, GFP_KERNEL); if (ctrl =3D=3D NULL) { @@ -2006,6 +2088,22 @@ static struct v4l2_ctrl *v4l2_ctrl_new(struct v4l2_c= trl_handler *hdl, memcpy(ctrl->p_def.p, p_def.p_const, elem_size); } =20 + if (flags & V4L2_CTRL_FLAG_HAS_WHICH_MIN_MAX) { + void *ptr =3D ctrl->p_def.p; + + if (p_min.p_const) { + ptr +=3D elem_size; + ctrl->p_min.p =3D ptr; + memcpy(ctrl->p_min.p, p_min.p_const, elem_size); + } + + if (p_max.p_const) { + ptr +=3D elem_size; + ctrl->p_max.p =3D ptr; + memcpy(ctrl->p_max.p, p_max.p_const, elem_size); + } + } + ctrl->type_ops->init(ctrl, 0, ctrl->p_cur); cur_to_new(ctrl); =20 @@ -2056,7 +2154,8 @@ struct v4l2_ctrl *v4l2_ctrl_new_custom(struct v4l2_ct= rl_handler *hdl, type, min, max, is_menu ? cfg->menu_skip_mask : step, def, cfg->dims, cfg->elem_size, - flags, qmenu, qmenu_int, cfg->p_def, priv); + flags, qmenu, qmenu_int, cfg->p_def, cfg->p_min, + cfg->p_max, priv); if (ctrl) ctrl->is_private =3D cfg->is_private; return ctrl; @@ -2081,7 +2180,8 @@ struct v4l2_ctrl *v4l2_ctrl_new_std(struct v4l2_ctrl_= handler *hdl, } return v4l2_ctrl_new(hdl, ops, NULL, id, name, type, min, max, step, def, NULL, 0, - flags, NULL, NULL, ptr_null, NULL); + flags, NULL, NULL, ptr_null, ptr_null, + ptr_null, NULL); } EXPORT_SYMBOL(v4l2_ctrl_new_std); =20 @@ -2114,7 +2214,8 @@ struct v4l2_ctrl *v4l2_ctrl_new_std_menu(struct v4l2_= ctrl_handler *hdl, } return v4l2_ctrl_new(hdl, ops, NULL, id, name, type, 0, max, mask, def, NULL, 0, - flags, qmenu, qmenu_int, ptr_null, NULL); + flags, qmenu, qmenu_int, ptr_null, ptr_null, + ptr_null, NULL); } EXPORT_SYMBOL(v4l2_ctrl_new_std_menu); =20 @@ -2146,7 +2247,8 @@ struct v4l2_ctrl *v4l2_ctrl_new_std_menu_items(struct= v4l2_ctrl_handler *hdl, } return v4l2_ctrl_new(hdl, ops, NULL, id, name, type, 0, max, mask, def, NULL, 0, - flags, qmenu, NULL, ptr_null, NULL); + flags, qmenu, NULL, ptr_null, ptr_null, + ptr_null, NULL); =20 } EXPORT_SYMBOL(v4l2_ctrl_new_std_menu_items); @@ -2154,7 +2256,9 @@ EXPORT_SYMBOL(v4l2_ctrl_new_std_menu_items); /* Helper function for standard compound controls */ struct v4l2_ctrl *v4l2_ctrl_new_std_compound(struct v4l2_ctrl_handler *hdl, const struct v4l2_ctrl_ops *ops, u32 id, - const union v4l2_ctrl_ptr p_def) + const union v4l2_ctrl_ptr p_def, + const union v4l2_ctrl_ptr p_min, + const union v4l2_ctrl_ptr p_max) { const char *name; enum v4l2_ctrl_type type; @@ -2168,7 +2272,7 @@ struct v4l2_ctrl *v4l2_ctrl_new_std_compound(struct v= 4l2_ctrl_handler *hdl, } return v4l2_ctrl_new(hdl, ops, NULL, id, name, type, min, max, step, def, NULL, 0, - flags, NULL, NULL, p_def, NULL); + flags, NULL, NULL, p_def, p_min, p_max, NULL); } EXPORT_SYMBOL(v4l2_ctrl_new_std_compound); =20 @@ -2192,7 +2296,8 @@ struct v4l2_ctrl *v4l2_ctrl_new_int_menu(struct v4l2_= ctrl_handler *hdl, } return v4l2_ctrl_new(hdl, ops, NULL, id, name, type, 0, max, 0, def, NULL, 0, - flags, NULL, qmenu_int, ptr_null, NULL); + flags, NULL, qmenu_int, ptr_null, ptr_null, + ptr_null, NULL); } EXPORT_SYMBOL(v4l2_ctrl_new_int_menu); =20 diff --git a/drivers/media/v4l2-core/v4l2-ioctl.c b/drivers/media/v4l2-core= /v4l2-ioctl.c index 0304daa8471d..bfdba96e938c 100644 --- a/drivers/media/v4l2-core/v4l2-ioctl.c +++ b/drivers/media/v4l2-core/v4l2-ioctl.c @@ -893,7 +893,9 @@ static bool check_ext_ctrls(struct v4l2_ext_controls *c= , unsigned long ioctl) return false; break; case V4L2_CTRL_WHICH_DEF_VAL: - /* Default value cannot be changed */ + case V4L2_CTRL_WHICH_MIN_VAL: + case V4L2_CTRL_WHICH_MAX_VAL: + /* Default, minimum or maximum value cannot be changed */ if (ioctl =3D=3D VIDIOC_S_EXT_CTRLS || ioctl =3D=3D VIDIOC_TRY_EXT_CTRLS) { c->error_idx =3D c->count; diff --git a/include/media/v4l2-ctrls.h b/include/media/v4l2-ctrls.h index b0db167a3ac4..9ed7be1e696f 100644 --- a/include/media/v4l2-ctrls.h +++ b/include/media/v4l2-ctrls.h @@ -133,6 +133,8 @@ struct v4l2_ctrl_ops { * * @equal: return true if all ctrl->elems array elements are equal. * @init: initialize the value for array elements from from_idx to ctrl->e= lems. + * @minimum: set the value to the minimum value of the control. + * @maximum: set the value to the maximum value of the control. * @log: log the value. * @validate: validate the value for ctrl->new_elems array elements. * Return 0 on success and a negative value otherwise. @@ -142,6 +144,10 @@ struct v4l2_ctrl_type_ops { union v4l2_ctrl_ptr ptr1, union v4l2_ctrl_ptr ptr2); void (*init)(const struct v4l2_ctrl *ctrl, u32 from_idx, union v4l2_ctrl_ptr ptr); + void (*minimum)(const struct v4l2_ctrl *ctrl, u32 idx, + union v4l2_ctrl_ptr ptr); + void (*maximum)(const struct v4l2_ctrl *ctrl, u32 idx, + union v4l2_ctrl_ptr ptr); void (*log)(const struct v4l2_ctrl *ctrl); int (*validate)(const struct v4l2_ctrl *ctrl, union v4l2_ctrl_ptr ptr); }; @@ -247,6 +253,12 @@ typedef void (*v4l2_ctrl_notify_fnc)(struct v4l2_ctrl = *ctrl, void *priv); * @p_def: The control's default value represented via a union which * provides a standard way of accessing control types * through a pointer (for compound controls only). + * @p_min: The control's minimum value represented via a union which + * provides a standard way of accessing control types + * through a pointer (for compound controls only). + * @p_max: The control's maximum value represented via a union which + * provides a standard way of accessing control types + * through a pointer (for compound controls only). * @p_cur: The control's current value represented via a union which * provides a standard way of accessing control types * through a pointer. @@ -306,6 +318,8 @@ struct v4l2_ctrl { } cur; =20 union v4l2_ctrl_ptr p_def; + union v4l2_ctrl_ptr p_min; + union v4l2_ctrl_ptr p_max; union v4l2_ctrl_ptr p_new; union v4l2_ctrl_ptr p_cur; }; @@ -425,6 +439,8 @@ struct v4l2_ctrl_handler { * @step: The control's step value for non-menu controls. * @def: The control's default value. * @p_def: The control's default value for compound controls. + * @p_min: The control's minimum value for compound controls. + * @p_max: The control's maximum value for compound controls. * @dims: The size of each dimension. * @elem_size: The size in bytes of the control. * @flags: The control's flags. @@ -454,6 +470,8 @@ struct v4l2_ctrl_config { u64 step; s64 def; union v4l2_ctrl_ptr p_def; + union v4l2_ctrl_ptr p_min; + union v4l2_ctrl_ptr p_max; u32 dims[V4L2_CTRL_MAX_DIMS]; u32 elem_size; u32 flags; @@ -723,17 +741,25 @@ struct v4l2_ctrl *v4l2_ctrl_new_std_menu_items(struct= v4l2_ctrl_handler *hdl, * @ops: The control ops. * @id: The control ID. * @p_def: The control's default value. + * @p_min: The control's minimum value. + * @p_max: The control's maximum value. * - * Sames as v4l2_ctrl_new_std(), but with support to compound controls, th= anks - * to the @p_def field. Use v4l2_ctrl_ptr_create() to create @p_def from a - * pointer. Use v4l2_ctrl_ptr_create(NULL) if the default value of the - * compound control should be all zeroes. + * Same as v4l2_ctrl_new_std(), but with support for compound controls. + * To fill in the @p_def, @p_min and @p_max fields, use v4l2_ctrl_ptr_crea= te() + * to convert a pointer to a const union v4l2_ctrl_ptr. + * Use v4l2_ctrl_ptr_create(NULL) if you want the default, minimum or maxi= mum + * value of the compound control to be all zeroes. + * If the compound control does not set the ``V4L2_CTRL_FLAG_HAS_WHICH_MIN= _MAX`` + * flag, then it does not has minimum and maximum values. In that case jus= t use + * v4l2_ctrl_ptr_create(NULL) for the @p_min and @p_max arguments. * */ struct v4l2_ctrl *v4l2_ctrl_new_std_compound(struct v4l2_ctrl_handler *hdl, const struct v4l2_ctrl_ops *ops, u32 id, - const union v4l2_ctrl_ptr p_def); + const union v4l2_ctrl_ptr p_def, + const union v4l2_ctrl_ptr p_min, + const union v4l2_ctrl_ptr p_max); =20 /** * v4l2_ctrl_new_int_menu() - Create a new standard V4L2 integer menu cont= rol. diff --git a/include/uapi/linux/videodev2.h b/include/uapi/linux/videodev2.h index c1c2ae150d30..c8cb2796130f 100644 --- a/include/uapi/linux/videodev2.h +++ b/include/uapi/linux/videodev2.h @@ -1912,6 +1912,8 @@ struct v4l2_ext_controls { #define V4L2_CTRL_WHICH_CUR_VAL 0 #define V4L2_CTRL_WHICH_DEF_VAL 0x0f000000 #define V4L2_CTRL_WHICH_REQUEST_VAL 0x0f010000 +#define V4L2_CTRL_WHICH_MIN_VAL 0x0f020000 +#define V4L2_CTRL_WHICH_MAX_VAL 0x0f030000 =20 enum v4l2_ctrl_type { V4L2_CTRL_TYPE_INTEGER =3D 1, @@ -2019,6 +2021,7 @@ struct v4l2_querymenu { #define V4L2_CTRL_FLAG_EXECUTE_ON_WRITE 0x0200 #define V4L2_CTRL_FLAG_MODIFY_LAYOUT 0x0400 #define V4L2_CTRL_FLAG_DYNAMIC_ARRAY 0x0800 +#define V4L2_CTRL_FLAG_HAS_WHICH_MIN_MAX 0x1000 =20 /* Query flags, to be ORed with the control ID */ #define V4L2_CTRL_FLAG_NEXT_CTRL 0x80000000 --=20 2.48.1.362.g079036d154-goog From nobody Sun Dec 14 13:49:28 2025 Received: from mail-ua1-f50.google.com (mail-ua1-f50.google.com [209.85.222.50]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 10EAD2040A8 for ; Mon, 3 Feb 2025 11:55:48 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.222.50 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1738583750; cv=none; b=g2WSY+zOmnHV7kZDwGU0pY4N+PUNuTy1rhFk99AhNhBKB6HtY4ioxL1EdF4M1p865OPWEOH1Ycrql4M7a95Dvt8P42g79i2nBcgghUSxoKmKRt7sYhR/RZKr9u1UAQaaQy1pj1tt+WPfC+hSLO2Sj+sKWL4BlW0WO74v1Jmt5i0= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1738583750; c=relaxed/simple; bh=52pAZ6jK2x7Q0D1wUZ//wBDW0oHRaJoKihhdh/P6naY=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=gc03yOUAQrH2Ang9h7b2SmuziJ44xMVTuwnkgPu1cAz8udUweu9wefiNxjX8vpWoDHEJ2R2pEl1n9fmU/6eAfQ458slU+em2dL83YjrHI1pQgWV5qVW0Xb0l3XS4/I2JRZYqHrp/BHjLtgndHdAttt0GIAnMEbJhu/vpVDyEMV4= 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=JNNtWTMq; arc=none smtp.client-ip=209.85.222.50 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=chromium.org Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=chromium.org Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=chromium.org header.i=@chromium.org header.b="JNNtWTMq" Received: by mail-ua1-f50.google.com with SMTP id a1e0cc1a2514c-85c5eb83a7fso2187055241.2 for ; Mon, 03 Feb 2025 03:55:48 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=chromium.org; s=google; t=1738583748; x=1739188548; 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=dGF1p9h/lUEbgH8GNkApjRtx1wLKFzqXbBITVRxG3W4=; b=JNNtWTMqDPKN4ayKfM/UqUEXFZJ0JcI7lkX+zkPwob9MD/CJ5vIgoqSuLXHfBlA2FH hQW/FuoL8M2quHpdAeUNk33Y37oJZhvD01V4Hl5elV2pVlQPn/sRr36a+IiEkFretCvY EnAqkeD+tyTsaPYcv5IaDOKMMu9dYYbzFnTtE= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1738583748; x=1739188548; 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=dGF1p9h/lUEbgH8GNkApjRtx1wLKFzqXbBITVRxG3W4=; b=kqIDFqOJETgp0ZpTGWs08Ihgg5EPsJgh+2jFCyV79DsZzLm/VaJ/bih7QoENxVnPQI heSmI7NasROg6PhfWPJvYlv6XuxXi9FM6WKHGeXJtJeIC6Qu+JSWcLeH/v+RtmUuwxn+ 2MG39sEtqCtzsqcD42TfEhWBVU3qZ6c+pC+z5KBAhwzzHVkdAAMXh6kiIcyK+qAkjLMr hgzPUbM8KZvQcxCsHKw5UNAnlRNLs/K1h1vbGvgn6+ucc4Eq7mGdy84prdV19JxDkQ14 EC5Kx82zCR9s6A7Zy58/0DZPyq3hm3ZmEbmXBqvIeexwJRgLJXJMhxO3z/j7/4MJQGBC JVUw== X-Forwarded-Encrypted: i=1; AJvYcCWu5rrYUYDOmKvZmSRoLmiM3weY1DrypV0vJnLBiW41S4NoTQXfoYKVD4YPCA0RmGGUg4XWgtssKD7TUMw=@vger.kernel.org X-Gm-Message-State: AOJu0YwVTq7OkeECyGtkgYMZkN9DzCjs1TmwWT4Vv6mo28aa2/EI8ndS GUxZZgkMv+mBsWfLAwlY9zSiJyCJley0eDNH3nJXdJCBFRvNzNyEoml/07NOIA== X-Gm-Gg: ASbGnctJkvH4qZYSL1Nn/L7q1O5M5p5wIS8u+NNslklXvHX3C4yyzBbAMyG+xRBqD3g AxZPpaxGdz3tto+cMP5zzmUditUJLkoBZzpvQertgnlAX/Od41dSlXfmwJRQJkVZot//kueyErI pWlcqzeq8BS0BLQcf8fYg/LZAkeyBB0DBG5Gwr6cDHGsPJQyE/essdVV9QLO9TXu2QW4n6fiD9c SSkTVS5j2CjI4HQs1qqFjzSjE3wQidO9pOj8dtTqD1wRz9ckQn6vafMql7J4dpZAa4KDYMNmt1n S/E5t1BdvLRlg3CYkfaTZL0EnguGGqmGI8C+oOGb4oKkLK7k+EPmZbxqhk5VgEXoag== X-Google-Smtp-Source: AGHT+IGnHlpYhWPf2xuJvuKNgHsRB2A6Y8fI7OQq+908vpzT+JKkZbPfDi7QBsgqZbmFX9K/QZT/6w== X-Received: by 2002:a05:6102:5045:b0:4b2:5ca3:f82a with SMTP id ada2fe7eead31-4b9a4f5dc62mr14553199137.7.1738583748017; Mon, 03 Feb 2025 03:55:48 -0800 (PST) Received: from denia.c.googlers.com (5.236.236.35.bc.googleusercontent.com. [35.236.236.5]) by smtp.gmail.com with ESMTPSA id ada2fe7eead31-4b9baa9aefcsm1592770137.12.2025.02.03.03.55.45 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 03 Feb 2025 03:55:46 -0800 (PST) From: Ricardo Ribalda Date: Mon, 03 Feb 2025 11:55:39 +0000 Subject: [PATCH v17 03/17] media: vivid: Add a rectangle control 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: <20250203-uvc-roi-v17-3-5900a9fed613@chromium.org> References: <20250203-uvc-roi-v17-0-5900a9fed613@chromium.org> In-Reply-To: <20250203-uvc-roi-v17-0-5900a9fed613@chromium.org> To: Laurent Pinchart , Mauro Carvalho Chehab , Hans de Goede , Sakari Ailus , Hans Verkuil Cc: Yunke Cao , linux-media@vger.kernel.org, linux-kernel@vger.kernel.org, Ricardo Ribalda , Yunke Cao , Hans Verkuil X-Mailer: b4 0.13.0 From: Yunke Cao This control represents a generic read/write rectangle. It supports V4L2_CTRL_WHICH_MIN/MAX_VAL. Signed-off-by: Yunke Cao Reviewed-by: Hans Verkuil Tested-by: Yunke Cao Signed-off-by: Ricardo Ribalda --- drivers/media/test-drivers/vivid/vivid-ctrls.c | 34 ++++++++++++++++++++++= ++++ 1 file changed, 34 insertions(+) diff --git a/drivers/media/test-drivers/vivid/vivid-ctrls.c b/drivers/media= /test-drivers/vivid/vivid-ctrls.c index 2b5c8fbcd0a2..57346b714534 100644 --- a/drivers/media/test-drivers/vivid/vivid-ctrls.c +++ b/drivers/media/test-drivers/vivid/vivid-ctrls.c @@ -37,6 +37,7 @@ #define VIVID_CID_U8_PIXEL_ARRAY (VIVID_CID_CUSTOM_BASE + 14) #define VIVID_CID_S32_ARRAY (VIVID_CID_CUSTOM_BASE + 15) #define VIVID_CID_S64_ARRAY (VIVID_CID_CUSTOM_BASE + 16) +#define VIVID_CID_RECT (VIVID_CID_CUSTOM_BASE + 17) =20 #define VIVID_CID_VIVID_BASE (0x00f00000 | 0xf000) #define VIVID_CID_VIVID_CLASS (0x00f00000 | 1) @@ -360,6 +361,38 @@ static const struct v4l2_ctrl_config vivid_ctrl_ro_int= 32 =3D { .step =3D 1, }; =20 +static const struct v4l2_rect rect_def =3D { + .top =3D 100, + .left =3D 200, + .width =3D 300, + .height =3D 400, +}; + +static const struct v4l2_rect rect_min =3D { + .top =3D 0, + .left =3D 0, + .width =3D 1, + .height =3D 1, +}; + +static const struct v4l2_rect rect_max =3D { + .top =3D 0, + .left =3D 0, + .width =3D 1000, + .height =3D 2000, +}; + +static const struct v4l2_ctrl_config vivid_ctrl_rect =3D { + .ops =3D &vivid_user_gen_ctrl_ops, + .id =3D VIVID_CID_RECT, + .name =3D "Rect", + .type =3D V4L2_CTRL_TYPE_RECT, + .flags =3D V4L2_CTRL_FLAG_HAS_WHICH_MIN_MAX, + .p_def.p_const =3D &rect_def, + .p_min.p_const =3D &rect_min, + .p_max.p_const =3D &rect_max, +}; + /* Framebuffer Controls */ =20 static int vivid_fb_s_ctrl(struct v4l2_ctrl *ctrl) @@ -1685,6 +1718,7 @@ int vivid_create_controls(struct vivid_dev *dev, bool= show_ccs_cap, dev->int_menu =3D v4l2_ctrl_new_custom(hdl_user_gen, &vivid_ctrl_int_menu= , NULL); dev->ro_int32 =3D v4l2_ctrl_new_custom(hdl_user_gen, &vivid_ctrl_ro_int32= , NULL); v4l2_ctrl_new_custom(hdl_user_gen, &vivid_ctrl_area, NULL); + v4l2_ctrl_new_custom(hdl_user_gen, &vivid_ctrl_rect, NULL); v4l2_ctrl_new_custom(hdl_user_gen, &vivid_ctrl_u32_array, NULL); v4l2_ctrl_new_custom(hdl_user_gen, &vivid_ctrl_u32_dyn_array, NULL); v4l2_ctrl_new_custom(hdl_user_gen, &vivid_ctrl_u16_matrix, NULL); --=20 2.48.1.362.g079036d154-goog From nobody Sun Dec 14 13:49:28 2025 Received: from mail-vs1-f53.google.com (mail-vs1-f53.google.com [209.85.217.53]) (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 33D692045BC for ; Mon, 3 Feb 2025 11:55:51 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.217.53 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1738583753; cv=none; b=adrDv4CQyBpBKoEQde9s02jvyxoxtQYVTbu/oxQoYtIwPBravWtxSkrOihiAIizS0MeRvSGFdkKT16tCh8cfF4poaqrQaeiagiODIRytJc/Wk3CAy24+hnzdk3osKKQdDpAFfQOZB5O0GN34uF9FKu7XWOwh2Rbabna5KYQ2TJg= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1738583753; c=relaxed/simple; bh=Ildx3KkSONLWLTB6UMs2mXOT6GNaL5EUqHnIiYn9Ecc=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=WQGYj7khi8FtbmKuyZOQ7Fx6jWtaS0JykqYjAdqxuqnvE4ta/3c8ayMHxidCliTddEVqVqxGhaQcs/K7zeNInUPO6iiMw7K+ivaRj2XVmCJH/IYpZOPvYdhf4jDutY9VrUq0vWrFodzqjkp+cZHGALigqrb9oAzfc6iw09Mu/ow= 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=hGgf67z1; arc=none smtp.client-ip=209.85.217.53 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="hGgf67z1" Received: by mail-vs1-f53.google.com with SMTP id ada2fe7eead31-4aff31b77e8so1694399137.1 for ; Mon, 03 Feb 2025 03:55:50 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=chromium.org; s=google; t=1738583750; x=1739188550; 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=Ptj+WXBBaeCFw/qOAiMyPpprCB8Gn1wdtebwngGkHqk=; b=hGgf67z1tcImMkj6CNvJqm2i34EAJR/icrFPaowSZW9B4W+Y+NtH/xKlit4P4G4IQI 2PBpDoZOzhKgCxxEVGkLzmKDSp68pNPsFTv6zt4AMq30lGAbLI7AEAiv1iZriq2E16R+ NJ1fDfylhG5csweIAp+t/ixlcU6wgTgVpRSMM= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1738583750; x=1739188550; 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=Ptj+WXBBaeCFw/qOAiMyPpprCB8Gn1wdtebwngGkHqk=; b=hq403r16MtW6s1pZb+jvtKlrY30K7iJnefKpfhJWeMlz+LYgo5aUjqiAvgNy/6wY61 1wUgExB2uYt6ZBuqkx8ofizuqApRNAc81tiX7kI2DaQqAkC1v+38U9xuT/CEtp248Wzo ZYSU1mgqeEm/VmU16FHkpCTlJtxSfeO1FZyse9jOeHQ2YzWk4TEFFK5SbjJsltEVuTw9 Cfh3b2I3z5oDFcqI1TUwCgBLy64+GZ7Y162IG+sQZj9TLOs6xCm7awS8etabiLqDbm9l 1Xt6symyBbGVzzpWpkObQE/4kYEZzcqqbeRziKgY6loZyFVLnny2QmCIkqA5emuUFJ/B 9QSg== X-Forwarded-Encrypted: i=1; AJvYcCWPWz20C9/G5nJ9bZsx9kabFJa9TY3LwGsQe7bHhKgHiu7JH92sRh5EweGRexP1wHStCFwhCEeDhzJGEko=@vger.kernel.org X-Gm-Message-State: AOJu0Yww05o9FCeHZs4sB2ezqlcDLAHxQgoEoHvsYTrevzErPtVa40Cw LCUWnZ9whqBIGRyVyGRfjSFFyOh6kvj8++xrhCl+p0zjcDatcD/gic8mMlGivQ== X-Gm-Gg: ASbGncuwiH7yxCvMURqkRuj8H9Q6QKJGK7aGBrlxWhmgxzZgH6/Cr3yqVV2KAXDH9dp ZfN7bQw+xyfZ0jaNQtE2dYtqiQdDzDz5Lb85GtgJiHHNRXsXLqGLVGJ0qBFnnA8FUgO7spi4kz6 Zz9Sn0HTup49w0AroxXQr5jIsEZE5H20lGFOmGvQ2jSvTf/ZShndNma/U1qZ9KORufypRVjjy3S QcVTn3MzYHz3dhfzwYLh1vCdHj85f6hLmCbw8Du/7OfoazGlY9xxnv+Yz6mya0CP37TVTqR/2tF 0FT7hvBVXb5Vxu93uIZ55plNwXRqZipKRHI+WUMkUsEtsH2h8tRNU+7NvLC9KdlPSg== X-Google-Smtp-Source: AGHT+IE0oR19UI2fh0jS+KCqQj/7FevOYUabIUBz5ZuDo6iKNX0yQhxcUpph4fxitp3pua3X6v/6wg== X-Received: by 2002:a05:6102:5e8b:b0:4af:f740:c1b8 with SMTP id ada2fe7eead31-4b9a5270cf3mr17240868137.24.1738583750154; Mon, 03 Feb 2025 03:55:50 -0800 (PST) Received: from denia.c.googlers.com (5.236.236.35.bc.googleusercontent.com. [35.236.236.5]) by smtp.gmail.com with ESMTPSA id ada2fe7eead31-4b9baa9aefcsm1592770137.12.2025.02.03.03.55.48 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 03 Feb 2025 03:55:49 -0800 (PST) From: Ricardo Ribalda Date: Mon, 03 Feb 2025 11:55:40 +0000 Subject: [PATCH v17 04/17] media: uvcvideo: Handle uvc menu translation inside uvc_get_le_value 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: <20250203-uvc-roi-v17-4-5900a9fed613@chromium.org> References: <20250203-uvc-roi-v17-0-5900a9fed613@chromium.org> In-Reply-To: <20250203-uvc-roi-v17-0-5900a9fed613@chromium.org> To: Laurent Pinchart , Mauro Carvalho Chehab , Hans de Goede , Sakari Ailus , Hans Verkuil Cc: Yunke Cao , linux-media@vger.kernel.org, linux-kernel@vger.kernel.org, Ricardo Ribalda , Yunke Cao X-Mailer: b4 0.13.0 map->get() gets a value from an uvc_control in "UVC format" and converts it to a value that can be consumed by v4l2. Instead of using a special get function for V4L2_CTRL_TYPE_MENU, we were converting from uvc_get_le_value in two different places. Move the conversion to uvc_get_le_value(). Reviewed-by: Hans de Goede Tested-by: Yunke Cao Signed-off-by: Ricardo Ribalda --- drivers/media/usb/uvc/uvc_ctrl.c | 77 +++++++++++++++++-------------------= ---- 1 file changed, 32 insertions(+), 45 deletions(-) diff --git a/drivers/media/usb/uvc/uvc_ctrl.c b/drivers/media/usb/uvc/uvc_c= trl.c index 4e58476d305e..4a55cf78ec52 100644 --- a/drivers/media/usb/uvc/uvc_ctrl.c +++ b/drivers/media/usb/uvc/uvc_ctrl.c @@ -862,6 +862,25 @@ static inline void uvc_clear_bit(u8 *data, int bit) data[bit >> 3] &=3D ~(1 << (bit & 7)); } =20 +static s32 uvc_menu_to_v4l2_menu(struct uvc_control_mapping *mapping, s32 = val) +{ + unsigned int i; + + for (i =3D 0; BIT(i) <=3D mapping->menu_mask; ++i) { + u32 menu_value; + + if (!test_bit(i, &mapping->menu_mask)) + continue; + + menu_value =3D uvc_mapping_get_menu_value(mapping, i); + + if (menu_value =3D=3D val) + return i; + } + + return val; +} + /* * Extract the bit string specified by mapping->offset and mapping->size * from the little-endian data stored at 'data' and return the result as @@ -896,6 +915,16 @@ static s32 uvc_get_le_value(struct uvc_control_mapping= *mapping, if (mapping->data_type =3D=3D UVC_CTRL_DATA_TYPE_SIGNED) value |=3D -(value & (1 << (mapping->size - 1))); =20 + /* If it is a menu, convert from uvc to v4l2. */ + if (mapping->v4l2_type !=3D V4L2_CTRL_TYPE_MENU) + return value; + + switch (query) { + case UVC_GET_CUR: + case UVC_GET_DEF: + return uvc_menu_to_v4l2_menu(mapping, value); + } + return value; } =20 @@ -1060,32 +1089,6 @@ static int uvc_ctrl_populate_cache(struct uvc_video_= chain *chain, return 0; } =20 -static s32 __uvc_ctrl_get_value(struct uvc_control_mapping *mapping, - const u8 *data) -{ - s32 value =3D mapping->get(mapping, UVC_GET_CUR, data); - - if (mapping->v4l2_type =3D=3D V4L2_CTRL_TYPE_MENU) { - unsigned int i; - - for (i =3D 0; BIT(i) <=3D mapping->menu_mask; ++i) { - u32 menu_value; - - if (!test_bit(i, &mapping->menu_mask)) - continue; - - menu_value =3D uvc_mapping_get_menu_value(mapping, i); - - if (menu_value =3D=3D value) { - value =3D i; - break; - } - } - } - - return value; -} - static int __uvc_ctrl_load_cur(struct uvc_video_chain *chain, struct uvc_control *ctrl) { @@ -1136,8 +1139,8 @@ static int __uvc_ctrl_get(struct uvc_video_chain *cha= in, if (ret < 0) return ret; =20 - *value =3D __uvc_ctrl_get_value(mapping, - uvc_ctrl_data(ctrl, UVC_CTRL_DATA_CURRENT)); + *value =3D mapping->get(mapping, UVC_GET_CUR, + uvc_ctrl_data(ctrl, UVC_CTRL_DATA_CURRENT)); =20 return 0; } @@ -1287,7 +1290,6 @@ static int __uvc_query_v4l2_ctrl(struct uvc_video_cha= in *chain, { struct uvc_control_mapping *master_map =3D NULL; struct uvc_control *master_ctrl =3D NULL; - unsigned int i; =20 memset(v4l2_ctrl, 0, sizeof(*v4l2_ctrl)); v4l2_ctrl->id =3D mapping->id; @@ -1330,21 +1332,6 @@ static int __uvc_query_v4l2_ctrl(struct uvc_video_ch= ain *chain, v4l2_ctrl->minimum =3D ffs(mapping->menu_mask) - 1; v4l2_ctrl->maximum =3D fls(mapping->menu_mask) - 1; v4l2_ctrl->step =3D 1; - - for (i =3D 0; BIT(i) <=3D mapping->menu_mask; ++i) { - u32 menu_value; - - if (!test_bit(i, &mapping->menu_mask)) - continue; - - menu_value =3D uvc_mapping_get_menu_value(mapping, i); - - if (menu_value =3D=3D v4l2_ctrl->default_value) { - v4l2_ctrl->default_value =3D i; - break; - } - } - return 0; =20 case V4L2_CTRL_TYPE_BOOLEAN: @@ -1630,7 +1617,7 @@ void uvc_ctrl_status_event(struct uvc_video_chain *ch= ain, uvc_ctrl_set_handle(handle, ctrl, NULL); =20 list_for_each_entry(mapping, &ctrl->info.mappings, list) { - s32 value =3D __uvc_ctrl_get_value(mapping, data); + s32 value =3D mapping->get(mapping, UVC_GET_CUR, data); =20 /* * handle may be NULL here if the device sends auto-update --=20 2.48.1.362.g079036d154-goog From nobody Sun Dec 14 13:49:28 2025 Received: from mail-vs1-f49.google.com (mail-vs1-f49.google.com [209.85.217.49]) (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 939AC2046B7 for ; Mon, 3 Feb 2025 11:55:53 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.217.49 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1738583755; cv=none; b=sAgA1sT6IPhN5echtNUgmDJn6fWMeJ03yljoXyns1k7u6A02jYi9+3UviLpt11Og8TjpTab5oymtW3eJFgQ8qvTcS/6NRqxEiD/5/Y+PoHm10smzNZMLSa5C5PsMnlsWFp1LX5yMiUjhRQ7zqUoGLBQIIsqzp6XsCLsjVkzs2Wo= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1738583755; c=relaxed/simple; bh=3T3cQOz17m5Ds9rW6s0LrBZRHiluSRGdx/Rbl2rtwCI=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=bsRn9cPQxjxlfUH+ykc28NZJ8laVmGL6n62msU8fiJpLlRXAskWFVWoMk5avSYa3mYXx+NUd+WRtgxFAj9P4UNqPqggP3BCmqg+qCuI+BBfsK5nBGtqisYAoxL/MnXRDV8R4tYtsBycfE2Fh2PjpNrYDWjuiY2Yt5ddQMUC3QzI= 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=FZfYmpHz; arc=none smtp.client-ip=209.85.217.49 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="FZfYmpHz" Received: by mail-vs1-f49.google.com with SMTP id ada2fe7eead31-4affbc4dc74so2764361137.0 for ; Mon, 03 Feb 2025 03:55:53 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=chromium.org; s=google; t=1738583752; x=1739188552; 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=4T/jeZDyuPmkQiIqMcypfqD3cEs/NVatrloEFxJn+oE=; b=FZfYmpHz606/DFx24V3jShiJH3OIOppIeD6HaoBJQrY7qBTIdRTsp5tYvgpXBEOh2w fZ7uvZ2vNMqnhTNn1Bc8e+o3jFT/HEcY4KehurB6v6wEbrXZk+Osg5wuYHCckdgwtNNB 3+eE+EOV+wVYnvgyKbjzjms+/ux12PsyMZqgw= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1738583752; x=1739188552; 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=4T/jeZDyuPmkQiIqMcypfqD3cEs/NVatrloEFxJn+oE=; b=mdvqKZcjDboWtk/gxxojRDAoezci1Y3ERwDDxY1qLebKm2nvyKBNMTHYUp4mcTqOwU m7hX5k6lsRrdIhelpvY1Y19/jRgU45mIICcHLzqXikfi9ooRhvPesVJiT3tpi9p7KsFV KUmvaHtBYoQ5wqE9/MN522s0pxWogT6pjoz5f8TYj/diZkKWghMgJosLphIL1teY9KCM G54EuUXTzPfksr0hWY88XR6uLKHSbRu6sDFaVy3xRUGC7J74KOXkRsilYQ3TnlgvfgN3 PIvHw9J2x00gMcbobcy5htwqsPUi1477p1nn4SwsR7FUetePUGYa1dxhWOOVRzUmKBTc bZAw== X-Forwarded-Encrypted: i=1; AJvYcCVfYNLrxVu3o0Sd8knZbQ1+7r+isJYtOYj2+toMuOkd860WSAioPfzCKq8eI0eBstpr18Ep9rEkCoUqFhc=@vger.kernel.org X-Gm-Message-State: AOJu0Yy0QXPwtE0yZnQN/yNfPfC/O/xA2bZt/AWhpnQKriq3CVOoyeSQ jv7xK0nZVo9Q9D3JieNo041ppLlGtatQPgdhspWFAzO7Y85KyW0pCBExtcx3xA== X-Gm-Gg: ASbGncs3g73neGcRDbR6e2rgrg+7jxQe2l3uYs9fwnK494IsBsrVG+AL8mVs+X+1OpV TokpyQkfwwaj699b62yZabHYq+e8N8xVRUZtc6vRSCP3JJo1yUhuOoAhiRsk/NrI9qOn7Kmn6TQ tB4iqYKgOR5ZxCohGkcCv9aTzUaAGSHKMsFTpzQn1oLXnQC5hIbgTJY1REmUTfM+yqU//T3QUsL svVEhLYTm76OQyXHqJrW2bgGS3K9RNsnolRXZ+cs+Bl+ZyuJLkOigYmbCXocG6GTvuPN12veVS3 fFARM0D85WL21ZzyI3O4oSRQft8MTcqmt5kLcoGMTs+3M0B0ritIDz63u60cTUCgoQ== X-Google-Smtp-Source: AGHT+IHg7iII8wVGrHg4rxybjTvs73uue2/7WP9h+5WXhBhYPZ4vx0SJVudZFvGpnVRiTDgaJp6Png== X-Received: by 2002:a05:6102:508a:b0:4b6:d833:63b2 with SMTP id ada2fe7eead31-4b9a4f9acabmr14188569137.10.1738583752239; Mon, 03 Feb 2025 03:55:52 -0800 (PST) Received: from denia.c.googlers.com (5.236.236.35.bc.googleusercontent.com. [35.236.236.5]) by smtp.gmail.com with ESMTPSA id ada2fe7eead31-4b9baa9aefcsm1592770137.12.2025.02.03.03.55.50 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 03 Feb 2025 03:55:51 -0800 (PST) From: Ricardo Ribalda Date: Mon, 03 Feb 2025 11:55:41 +0000 Subject: [PATCH v17 05/17] media: uvcvideo: Handle uvc menu translation inside uvc_set_le_value 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: <20250203-uvc-roi-v17-5-5900a9fed613@chromium.org> References: <20250203-uvc-roi-v17-0-5900a9fed613@chromium.org> In-Reply-To: <20250203-uvc-roi-v17-0-5900a9fed613@chromium.org> To: Laurent Pinchart , Mauro Carvalho Chehab , Hans de Goede , Sakari Ailus , Hans Verkuil Cc: Yunke Cao , linux-media@vger.kernel.org, linux-kernel@vger.kernel.org, Ricardo Ribalda , Yunke Cao X-Mailer: b4 0.13.0 Be consistent with uvc_get_le_value() and do the menu translation there. Note that in this case, the refactor does not provide much... but consistency is a nice feature. Reviewed-by: Hans de Goede Tested-by: Yunke Cao Signed-off-by: Ricardo Ribalda --- drivers/media/usb/uvc/uvc_ctrl.c | 30 +++++++++++++++++++----------- 1 file changed, 19 insertions(+), 11 deletions(-) diff --git a/drivers/media/usb/uvc/uvc_ctrl.c b/drivers/media/usb/uvc/uvc_c= trl.c index 4a55cf78ec52..3108d2fa1ff9 100644 --- a/drivers/media/usb/uvc/uvc_ctrl.c +++ b/drivers/media/usb/uvc/uvc_ctrl.c @@ -939,14 +939,22 @@ static void uvc_set_le_value(struct uvc_control_mappi= ng *mapping, int offset =3D mapping->offset; u8 mask; =20 - /* - * According to the v4l2 spec, writing any value to a button control - * should result in the action belonging to the button control being - * triggered. UVC devices however want to see a 1 written -> override - * value. - */ - if (mapping->v4l2_type =3D=3D V4L2_CTRL_TYPE_BUTTON) + switch (mapping->v4l2_type) { + case V4L2_CTRL_TYPE_MENU: + value =3D uvc_mapping_get_menu_value(mapping, value); + break; + case V4L2_CTRL_TYPE_BUTTON: + /* + * According to the v4l2 spec, writing any value to a button + * control should result in the action belonging to the button + * control being triggered. UVC devices however want to see a 1 + * written -> override value. + */ value =3D -1; + break; + default: + break; + } =20 data +=3D offset / 8; offset &=3D 7; @@ -2033,23 +2041,23 @@ int uvc_ctrl_set(struct uvc_fh *handle, if (!test_bit(xctrl->value, &mapping->menu_mask)) return -EINVAL; =20 - value =3D uvc_mapping_get_menu_value(mapping, xctrl->value); - /* * Valid menu indices are reported by the GET_RES request for * UVC controls that support it. */ if (mapping->data_type =3D=3D UVC_CTRL_DATA_TYPE_BITMASK) { + int val =3D uvc_mapping_get_menu_value(mapping, + xctrl->value); if (!ctrl->cached) { ret =3D uvc_ctrl_populate_cache(chain, ctrl); if (ret < 0) return ret; } =20 - if (!(uvc_get_ctrl_bitmap(ctrl, mapping) & value)) + if (!(uvc_get_ctrl_bitmap(ctrl, mapping) & val)) return -EINVAL; } - + value =3D xctrl->value; break; =20 default: --=20 2.48.1.362.g079036d154-goog From nobody Sun Dec 14 13:49:28 2025 Received: from mail-ua1-f46.google.com (mail-ua1-f46.google.com [209.85.222.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 C7B43204C1C for ; Mon, 3 Feb 2025 11:55:55 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.222.46 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1738583757; cv=none; b=tCPOcu5gy3wzEi4D5Ix5TgE+BQTdb4bF6tnRXM6J2BPKreM29xzbzWra3RcnThTxnHyB6jgGWbrgIepsppgTxgwbVJn2zkiDQTkzXD1BLqQy3yYxpVwDo0vdo0MATuIoRG0W4XKvluGS6spMg9yonhTJ02TETyCU/Bg5yn/tqYo= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1738583757; c=relaxed/simple; bh=Zg6xg2bjGKHfug5JTUUnCYes/lbTc768bBgzHu0UN68=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=oa7qzvxFlAFZSahlMnf7GOgeHaqBTKpbFI/ZT2jwYXQyXf26DCIgisxS+7v916tRAe5ZRoTo15aZdLlXeGuoM+5gV2FXXn8IIwSbpdDpikpVuvUfPDB0LzukdHagl2WPLXwP8f2Zn8HdqrEVM+Dj8C75/ltAWgbmdufV87S2ZHU= 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=bcvGPA+X; arc=none smtp.client-ip=209.85.222.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="bcvGPA+X" Received: by mail-ua1-f46.google.com with SMTP id a1e0cc1a2514c-85c5a91374cso2104376241.3 for ; Mon, 03 Feb 2025 03:55:55 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=chromium.org; s=google; t=1738583754; x=1739188554; 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=zHejU0nDb/GLEs+vRJP6CGozmb1EDd02Hmy/lAClMSU=; b=bcvGPA+Xp4+EWfNyxbPJbJA6w2Z2r7L9pN5ahvdS0Jd2wGUKuZbFjrtKrweros6A3l C4wpUfycc9BFMYirXRzX5JLpS2mxGOhuWCm/tf5HKt/TjJDksuQmzMpvqL/m6eOkvJdJ 1BcGhPBRvAPz63Bue9PDkFCauRd+AZ93OFefo= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1738583754; x=1739188554; 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=zHejU0nDb/GLEs+vRJP6CGozmb1EDd02Hmy/lAClMSU=; b=dzF8a9/eA7hVmNvZ6G7EKVcDgg+bm8tOMMGOpxooQ06fay3gfC12GkJ8OufJ2uQwOG 5ePkFtQQnkoTdB3hL079FJJFRwJi6f/2yqYqk5CKsgSVp68Cp+8vCc828gfW66rVtgPe o0WhNkoq/23L4xHmCTd6As9ZudJt1+IEK0/HwAMB2iqhHJJKZMDis45KscnHrI28tkEj 0dmQmWN2gPPrdv1k668FjIpFhfO5HuxtszujqGgzpM7JO5KYvWRKFx8z3mMCx1WPXzl1 6N4v8hY5CqvP0JfPkmZIbbQcxnVuLwPICcvo5Y5Hly46E2orQC1raQX4y09y3ihaB3v/ yQWQ== X-Forwarded-Encrypted: i=1; AJvYcCVeQiuxJpnmd/0Gc2VZo+H7hfQgZebkircYHcDDLo5YJkf71L1I7yZOLIqHrd/quzLL8DgvFK0UGP1LnmA=@vger.kernel.org X-Gm-Message-State: AOJu0YzGdpIvwqJ1Yu8naveQxX55qcDLchBmLOabFUKuSLY+EkjwBo2A awDpNujfK7NXKRtNBl6tCgvfemKHrb1Mx82CTWZzKI+3R8PbgxHCHBiW2Aw/kw== X-Gm-Gg: ASbGncu2H7Q+gP0pHoalx7ZBYxpxYA4B5wXfvdE+XSM59Q4gq+JlZ6cuuGzONN8u7KT k3hdasDFFcNP2lvmqLDZDvz8YNvXHQzgvgquv5kyIB4UZBrCVCHBMmXO7alR4xyXway9Vj2MQ4o bNlyDYXsIaqaHBnE7nggsuU5JVIDph4igD1wxg5XSSm1gV0xT3GPharpAqetj5QekKiyOYyQrqz uldichCXuKhYHZA57UjKtQaWoaXcTYxQQlTEVmh+KmPa3VycRhXHMr1v5XezTkBgxpySOK5DalP VbfEW8xx5igONHEaDRjJwbGZLXn2xLw35HYpVBd2KpNNeYUSENpfgl6wMax0EWvbmQ== X-Google-Smtp-Source: AGHT+IG+24DLU3b+8tkuvBtbAP1+MMssTqSH/odUoY59YmfIxTIjogQMq0/8sDPBm59TgOJsYIQkTQ== X-Received: by 2002:a05:6102:6d5:b0:4b4:27dc:ffe3 with SMTP id ada2fe7eead31-4b9a4d23a59mr14862086137.0.1738583754406; Mon, 03 Feb 2025 03:55:54 -0800 (PST) Received: from denia.c.googlers.com (5.236.236.35.bc.googleusercontent.com. [35.236.236.5]) by smtp.gmail.com with ESMTPSA id ada2fe7eead31-4b9baa9aefcsm1592770137.12.2025.02.03.03.55.52 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 03 Feb 2025 03:55:53 -0800 (PST) From: Ricardo Ribalda Date: Mon, 03 Feb 2025 11:55:42 +0000 Subject: [PATCH v17 06/17] media: uvcvideo: refactor uvc_ioctl_g_ext_ctrls 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: <20250203-uvc-roi-v17-6-5900a9fed613@chromium.org> References: <20250203-uvc-roi-v17-0-5900a9fed613@chromium.org> In-Reply-To: <20250203-uvc-roi-v17-0-5900a9fed613@chromium.org> To: Laurent Pinchart , Mauro Carvalho Chehab , Hans de Goede , Sakari Ailus , Hans Verkuil Cc: Yunke Cao , linux-media@vger.kernel.org, linux-kernel@vger.kernel.org, Ricardo Ribalda , Yunke Cao X-Mailer: b4 0.13.0 We want to support fetching the min and max values with g_ext_ctrls, this patch is a preparation for that. Instead of abusing uvc_query_v4l2_ctrl(), add an extra parameter to uvc_ctrl_get, so it can support fetching the default value. Reviewed-by: Hans de Goede Tested-by: Yunke Cao Signed-off-by: Ricardo Ribalda --- drivers/media/usb/uvc/uvc_ctrl.c | 21 ++++++++++++++++++--- drivers/media/usb/uvc/uvc_v4l2.c | 28 +++++++++++----------------- drivers/media/usb/uvc/uvcvideo.h | 3 ++- 3 files changed, 31 insertions(+), 21 deletions(-) diff --git a/drivers/media/usb/uvc/uvc_ctrl.c b/drivers/media/usb/uvc/uvc_c= trl.c index 3108d2fa1ff9..201af66a874d 100644 --- a/drivers/media/usb/uvc/uvc_ctrl.c +++ b/drivers/media/usb/uvc/uvc_ctrl.c @@ -1951,8 +1951,8 @@ int __uvc_ctrl_commit(struct uvc_fh *handle, int roll= back, return ret; } =20 -int uvc_ctrl_get(struct uvc_video_chain *chain, - struct v4l2_ext_control *xctrl) +int uvc_ctrl_get(struct uvc_video_chain *chain, u32 which, + struct v4l2_ext_control *xctrl) { struct uvc_control *ctrl; struct uvc_control_mapping *mapping; @@ -1964,7 +1964,22 @@ int uvc_ctrl_get(struct uvc_video_chain *chain, if (ctrl =3D=3D NULL) return -EINVAL; =20 - return __uvc_ctrl_get(chain, ctrl, mapping, &xctrl->value); + switch (which) { + case V4L2_CTRL_WHICH_CUR_VAL: + return __uvc_ctrl_get(chain, ctrl, mapping, &xctrl->value); + case V4L2_CTRL_WHICH_DEF_VAL: + if (!ctrl->cached) { + int ret =3D uvc_ctrl_populate_cache(chain, ctrl); + + if (ret < 0) + return ret; + } + xctrl->value =3D mapping->get(mapping, UVC_GET_DEF, + uvc_ctrl_data(ctrl, UVC_CTRL_DATA_DEF)); + return 0; + } + + return -EINVAL; } =20 int uvc_ctrl_set(struct uvc_fh *handle, diff --git a/drivers/media/usb/uvc/uvc_v4l2.c b/drivers/media/usb/uvc/uvc_v= 4l2.c index 93c6cdb23881..9493ab375f07 100644 --- a/drivers/media/usb/uvc/uvc_v4l2.c +++ b/drivers/media/usb/uvc/uvc_v4l2.c @@ -1027,34 +1027,28 @@ static int uvc_ioctl_g_ext_ctrls(struct file *file,= void *fh, struct uvc_video_chain *chain =3D handle->chain; struct v4l2_ext_control *ctrl =3D ctrls->controls; unsigned int i; + u32 which; int ret; =20 + switch (ctrls->which) { + case V4L2_CTRL_WHICH_DEF_VAL: + case V4L2_CTRL_WHICH_CUR_VAL: + which =3D ctrls->which; + break; + default: + which =3D V4L2_CTRL_WHICH_CUR_VAL; + } + ret =3D uvc_ctrl_check_access(chain, ctrls, VIDIOC_G_EXT_CTRLS); if (ret < 0) return ret; =20 - if (ctrls->which =3D=3D V4L2_CTRL_WHICH_DEF_VAL) { - for (i =3D 0; i < ctrls->count; ++ctrl, ++i) { - struct v4l2_queryctrl qc =3D { .id =3D ctrl->id }; - - ret =3D uvc_query_v4l2_ctrl(chain, &qc); - if (ret < 0) { - ctrls->error_idx =3D i; - return ret; - } - - ctrl->value =3D qc.default_value; - } - - return 0; - } - ret =3D uvc_ctrl_begin(chain); if (ret < 0) return ret; =20 for (i =3D 0; i < ctrls->count; ++ctrl, ++i) { - ret =3D uvc_ctrl_get(chain, ctrl); + ret =3D uvc_ctrl_get(chain, which, ctrl); if (ret < 0) { uvc_ctrl_rollback(handle); ctrls->error_idx =3D i; diff --git a/drivers/media/usb/uvc/uvcvideo.h b/drivers/media/usb/uvc/uvcvi= deo.h index 5e388f05f3fc..018613f98f48 100644 --- a/drivers/media/usb/uvc/uvcvideo.h +++ b/drivers/media/usb/uvc/uvcvideo.h @@ -793,7 +793,8 @@ static inline int uvc_ctrl_rollback(struct uvc_fh *hand= le) return __uvc_ctrl_commit(handle, 1, NULL); } =20 -int uvc_ctrl_get(struct uvc_video_chain *chain, struct v4l2_ext_control *x= ctrl); +int uvc_ctrl_get(struct uvc_video_chain *chain, u32 which, + struct v4l2_ext_control *xctrl); int uvc_ctrl_set(struct uvc_fh *handle, struct v4l2_ext_control *xctrl); int uvc_ctrl_is_accessible(struct uvc_video_chain *chain, u32 v4l2_id, const struct v4l2_ext_controls *ctrls, --=20 2.48.1.362.g079036d154-goog From nobody Sun Dec 14 13:49:28 2025 Received: from mail-vs1-f46.google.com (mail-vs1-f46.google.com [209.85.217.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 C5751204F84 for ; Mon, 3 Feb 2025 11:55:57 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.217.46 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1738583759; cv=none; b=ZFcxpivhQKjZyIhZyfjK7hL174G4NsWrwXU+OTVMWB6x1Rw9IFkBajUnWwtj/Q3IfztqJ9SBWeen85hYnjko0MOEeycoEFrsryZ/Nhfgd6gSVbJQZhgpZIM3InChgn6PDqkIk+YyaG6/NmNdDM1VidK+mtUm3JAqLga0R76V4jg= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1738583759; c=relaxed/simple; bh=MAIrdEevNn7N12nkJ1J1RhnEvLIu/5K6r/M3d+E6MoQ=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=uhmfbWoyVzb6MCenMHifE8wXeKcPCxnr5pYwY6KyrYzxvEif/dGGPffp3DwaUp48QVWRmCO5Wsh70MwDpiXXNpg2CDTkMR6JcIDBetod11mTifXHxpZ8fYRIj9yO68RBGtx5GKs8EQUyLeA1IX99PMTM1EsiC0bhN65HEEqbDxE= 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=CsEJXWYg; arc=none smtp.client-ip=209.85.217.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="CsEJXWYg" Received: by mail-vs1-f46.google.com with SMTP id ada2fe7eead31-4afefc876c6so1212925137.2 for ; Mon, 03 Feb 2025 03:55:57 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=chromium.org; s=google; t=1738583756; x=1739188556; 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=hxX88IJj+cJJK7Q7MEUbEa8fVnW5ArFeBowg00h7XKs=; b=CsEJXWYgldD2LqG72HuJmn8hlXYa+GsEfoU4bcfGOYHIknaTvOPvr0e+ye3N9WtitD ORI38yqoKz8YPikCRgxvE74Y2as/mEtnDyVWMqtZhVP1Hk1N+3bElHjodbRUCEr7YJ5q O9PSEqikjveK3UpikZE5DgyH1ymnD2oblG7GQ= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1738583756; x=1739188556; 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=hxX88IJj+cJJK7Q7MEUbEa8fVnW5ArFeBowg00h7XKs=; b=plsnTjZJKzmCqXfWdiPX6ElWuo63bRydocQfrO3E6mbdRtaA9+1MNAlUaMl+7Z7gpm u99NFSnty10WwzzSoGNgrlD7Vs+VNB29H7vOYhdkAssqBIvmvsfUHGun+zeQKAvfqll6 7LMzU43pnL9b9PtmR4+Y9M3pdppUz9jkZkJUrC8adnid8bvdFmpxufkBnVJjXUIVpTW4 AyCVFFW2IZNmusWElAd9CO2yzeFaR+TNPYCHJhhNEGEo6/sGCQIa68f6MxDS2Uwtj+Zl Dtw6QwYS2vscfoBhwPxjBXQYx3AvP9quBD+m+qGDn3LJW2RAbryqvkonhnQTARiHGnai 0sGw== X-Forwarded-Encrypted: i=1; AJvYcCUpVWT1jqngt96CcGiB+guX+Aw76XN5mb3wa0SJAsBe2OjKps4If2gZmeTS2WJpSOtW9b9xIevdlx6p/Q8=@vger.kernel.org X-Gm-Message-State: AOJu0Yx7gFaygKbagElFMtHTfi0K6z0aycNF1BXzN9ZOEwXpdIaTUWRx kM9e3CO3CaW/d19mbWjWIxNMcf4WG6qmvAQ9L/fgLYIHNlT31sGFJu5LHa6VQw== X-Gm-Gg: ASbGncvtk5VMPZKno04iGaNg+cX0atX9dsSHRwFU2lJDoyliyIDqsTkasjMznLrszng 7eFJ+cQY50n+/wSR7/42fnAhFUYhATKGYjnFbeHeDEfyW6tiVbea/Tl5S44QK7vsLwO4ZOU9LUL 1o/KaJlZV14sboMs9CR0T+/62PE7Enl98FnPnQcYmCS8zsS4GodefQbDxDA6fOfEMkkATHhOzB3 FTqrRAVvOoprosjChOgPH8dAyADWFF81i7bgD5AP6wZr+H5lV4lImu/uoG71b8mGIqMTlTEWbh+ PYPxmXqrGVSyOSJHAbmdXBamPFtr9RMnN+u+EhkRR/0Ve7sl9VlHfKokCRJH8FOZGw== X-Google-Smtp-Source: AGHT+IEK9q1tPQQgkuLEv6EU9rWEmJulUzWiAbWq4EJZ+pG8GCm2x+nnTJsHB8Vnf7iHLALMqu2m9A== X-Received: by 2002:a05:6102:2c0f:b0:4b2:bc6b:c845 with SMTP id ada2fe7eead31-4b9a4f0da6emr14805180137.6.1738583756605; Mon, 03 Feb 2025 03:55:56 -0800 (PST) Received: from denia.c.googlers.com (5.236.236.35.bc.googleusercontent.com. [35.236.236.5]) by smtp.gmail.com with ESMTPSA id ada2fe7eead31-4b9baa9aefcsm1592770137.12.2025.02.03.03.55.54 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 03 Feb 2025 03:55:55 -0800 (PST) From: Ricardo Ribalda Date: Mon, 03 Feb 2025 11:55:43 +0000 Subject: [PATCH v17 07/17] media: uvcvideo: uvc_ioctl_(g|s)_ext_ctrls: handle NoP case 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: <20250203-uvc-roi-v17-7-5900a9fed613@chromium.org> References: <20250203-uvc-roi-v17-0-5900a9fed613@chromium.org> In-Reply-To: <20250203-uvc-roi-v17-0-5900a9fed613@chromium.org> To: Laurent Pinchart , Mauro Carvalho Chehab , Hans de Goede , Sakari Ailus , Hans Verkuil Cc: Yunke Cao , linux-media@vger.kernel.org, linux-kernel@vger.kernel.org, Ricardo Ribalda , Yunke Cao X-Mailer: b4 0.13.0 If nothing needs to be done. Exit early. Reviewed-by: Hans de Goede Tested-by: Yunke Cao Signed-off-by: Ricardo Ribalda --- drivers/media/usb/uvc/uvc_v4l2.c | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/drivers/media/usb/uvc/uvc_v4l2.c b/drivers/media/usb/uvc/uvc_v= 4l2.c index 9493ab375f07..4025811fb9e7 100644 --- a/drivers/media/usb/uvc/uvc_v4l2.c +++ b/drivers/media/usb/uvc/uvc_v4l2.c @@ -1030,6 +1030,9 @@ static int uvc_ioctl_g_ext_ctrls(struct file *file, v= oid *fh, u32 which; int ret; =20 + if (!ctrls->count) + return 0; + switch (ctrls->which) { case V4L2_CTRL_WHICH_DEF_VAL: case V4L2_CTRL_WHICH_CUR_VAL: @@ -1070,6 +1073,9 @@ static int uvc_ioctl_s_try_ext_ctrls(struct uvc_fh *h= andle, unsigned int i; int ret; =20 + if (!ctrls->count) + return 0; + ret =3D uvc_ctrl_check_access(chain, ctrls, ioctl); if (ret < 0) return ret; --=20 2.48.1.362.g079036d154-goog From nobody Sun Dec 14 13:49:28 2025 Received: from mail-vs1-f49.google.com (mail-vs1-f49.google.com [209.85.217.49]) (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 DCE692054F9 for ; Mon, 3 Feb 2025 11:55:59 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.217.49 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1738583761; cv=none; b=uKbixxN6s0Me59w+4KC/LShF+UU5DSPPPevg+xsNt9/St69NOmkJRN+rJUg4q55odkh1zLpO39uj56pv3UuJWR9+qzvGI5AHzL6HieBh33W5JU86XM6XRENzREpW7VXp2Nyb5bw2SUwqiTkwSkiodP0hHXUctL3XB0AG+DYKTBM= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1738583761; c=relaxed/simple; bh=IfDfnmI9WexGaCozjlG56eHWRNpkJwSGj+oicfx0AIA=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=krpzMOONZQ9+lfq0Bcgb7EIVUb+FZcA/CwGVs2uw1yivmMmglUCY03RnNefmldrPsXs+NIX9VNlNiAIMbu89GkrxoVImjasKLu0WO5i28ebLNW8b47puk5aPoP2Iw0Sn+dOl1A4iU07CWrGAhXFSh0FIeMcGH00l/4xTocMeJs4= 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=khe9klhu; arc=none smtp.client-ip=209.85.217.49 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="khe9klhu" Received: by mail-vs1-f49.google.com with SMTP id ada2fe7eead31-4b68cb2abacso1008162137.3 for ; Mon, 03 Feb 2025 03:55:59 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=chromium.org; s=google; t=1738583759; x=1739188559; 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=Y1eOFJCjuwi+7HI+8fuv+RZbg2mJZX4fHHxSxUTTx/0=; b=khe9klhu53bpcCexLIKhtRQLM9HLkJLgz9R/ymeFkg1DbH6/lb0WxPrfl+Yjt4Cqf6 G0XT+i/1U7GSr/sL2OGn0+4igQnnqJGSR4zNabwpy2ST1Fdaym0GvWICoAFaa2/Gwk/z oI23EV/sSmTAN3zMfzuyBtIn6k1dULiLmo+CY= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1738583759; x=1739188559; 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=Y1eOFJCjuwi+7HI+8fuv+RZbg2mJZX4fHHxSxUTTx/0=; b=sASAb4FxrhPyRqN/rHK15L2U39fYSKaN8dy1paceBeO6ZBp7aAYRKtjD5nB/XWKnqX Oy6H6EoYrV2ZbE1bDrP/WF62wkXinxvgn2r+ZIM2Nz2OplWUnWaol+dMSaSbCkrj8WYw vliZCD+4ACCwyZQmBXJTa+5F0Uzspy1ux7Y5rtCgouutsY7DUbHFymTdU1+OQpNcpNCV HRtt1/Fs24XtYrPsrcAwZY9n9Jb+Io2mzfwdMnyky7YUQaGtANQj8p5SmamyVm4uWk/v 9/NB1sjtLIzFHP1NAJ98q72FRD/sqDPLc1HOyMs5LPzUCo4k6dEoLb0nlbzdpZtMR6im hHGQ== X-Forwarded-Encrypted: i=1; AJvYcCUW1DVf6AJZdKJ2X9ytFqdIlVPnp5Z0pGahuyNieRKeIqyqcocjS2J/aRe4YNvskTlI6cEFMAFsIXvQ21o=@vger.kernel.org X-Gm-Message-State: AOJu0YyCjal4jPqdYSXhPwCY8Aq/I0c+fJJboPBmDepjcQG60jWL5sPl C9FfMrHMsB2f6us41Rwhv33+bx72st2TDhH+boZPGbGb/lJdZvRkHyMw+Edizg== X-Gm-Gg: ASbGncuAH9tUv401EbXrXWKWhi3twivMiWd/XeRe+2zEBA3S8yaLtqZ+/QrdrBR+m/3 Z3v0FJU81PL7Zg/ss7+YmpM0jRwLy9cr1inBJsRVv+dE3KZBjPTdn6Zu12N1LhHNqTjMjAku64w Zgl0/G1nUZyD1+8iG0KzNw+4oL8K0daXVKLu6JvOoeAH+ZhPfQHKVnXv2gZyjlnFW6CGdbtQV1u yqB68DQhtodl2q29hNU9gX1P0ZFRbnFw3CpMDHsAZekB8AHjETaUESu4uqktef/9GQLt8cPUYyY kCZU9ad7c4UmtiOmUERXG8+4afj25+BaKfxDiUoPVkz3rBeOhOQFHeaJ3cCHhGbvHA== X-Google-Smtp-Source: AGHT+IHE/glGASrHlXx81gQujZaYMBk1kjOiTOdazBG8eg6EqYAu3Io5LOiy1wwKRjVdc8juoLGChQ== X-Received: by 2002:a05:6102:4687:b0:4b9:bd00:454b with SMTP id ada2fe7eead31-4b9bd004832mr5990018137.13.1738583758746; Mon, 03 Feb 2025 03:55:58 -0800 (PST) Received: from denia.c.googlers.com (5.236.236.35.bc.googleusercontent.com. [35.236.236.5]) by smtp.gmail.com with ESMTPSA id ada2fe7eead31-4b9baa9aefcsm1592770137.12.2025.02.03.03.55.56 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 03 Feb 2025 03:55:57 -0800 (PST) From: Ricardo Ribalda Date: Mon, 03 Feb 2025 11:55:44 +0000 Subject: [PATCH v17 08/17] media: uvcvideo: Support any size for mapping get/set 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: <20250203-uvc-roi-v17-8-5900a9fed613@chromium.org> References: <20250203-uvc-roi-v17-0-5900a9fed613@chromium.org> In-Reply-To: <20250203-uvc-roi-v17-0-5900a9fed613@chromium.org> To: Laurent Pinchart , Mauro Carvalho Chehab , Hans de Goede , Sakari Ailus , Hans Verkuil Cc: Yunke Cao , linux-media@vger.kernel.org, linux-kernel@vger.kernel.org, Ricardo Ribalda , Yunke Cao X-Mailer: b4 0.13.0 Right now, we only support mappings for v4l2 controls with a max size of s32. This patch modifies the prototype of get/set so it can support any size. This is done to prepare for compound controls. Suggested-by: Laurent Pinchart Reviewed-by: Yunke Cao Reviewed-by: Hans de Goede Tested-by: Yunke Cao Signed-off-by: Ricardo Ribalda --- drivers/media/usb/uvc/uvc_ctrl.c | 181 +++++++++++++++++++++++++++--------= ---- drivers/media/usb/uvc/uvcvideo.h | 8 +- 2 files changed, 130 insertions(+), 59 deletions(-) diff --git a/drivers/media/usb/uvc/uvc_ctrl.c b/drivers/media/usb/uvc/uvc_c= trl.c index 201af66a874d..a0156b79ab48 100644 --- a/drivers/media/usb/uvc/uvc_ctrl.c +++ b/drivers/media/usb/uvc/uvc_ctrl.c @@ -367,6 +367,22 @@ static const u32 uvc_control_classes[] =3D { =20 static const int exposure_auto_mapping[] =3D { 2, 1, 4, 8 }; =20 +static s32 uvc_mapping_get_s32(struct uvc_control_mapping *mapping, + u8 query, const void *data_in) +{ + s32 data_out =3D 0; + + mapping->get(mapping, query, data_in, sizeof(data_out), &data_out); + + return data_out; +} + +static void uvc_mapping_set_s32(struct uvc_control_mapping *mapping, + s32 data_in, void *data_out) +{ + mapping->set(mapping, sizeof(data_in), &data_in, data_out); +} + /* * This function translates the V4L2 menu index @idx, as exposed to usersp= ace as * the V4L2 control value, to the corresponding UVC control value used by = the @@ -405,58 +421,93 @@ uvc_mapping_get_menu_name(const struct uvc_control_ma= pping *mapping, u32 idx) return v4l2_ctrl_get_menu(mapping->id)[idx]; } =20 -static s32 uvc_ctrl_get_zoom(struct uvc_control_mapping *mapping, - u8 query, const u8 *data) +static int uvc_ctrl_get_zoom(struct uvc_control_mapping *mapping, u8 query, + const void *uvc_in, size_t v4l2_size, + void *v4l2_out) { - s8 zoom =3D (s8)data[0]; + u8 value =3D ((u8 *)uvc_in)[2]; + s8 sign =3D ((s8 *)uvc_in)[0]; + s32 *out =3D v4l2_out; + + if (WARN_ON(v4l2_size !=3D sizeof(s32))) + return -EINVAL; =20 switch (query) { case UVC_GET_CUR: - return (zoom =3D=3D 0) ? 0 : (zoom > 0 ? data[2] : -data[2]); + *out =3D (sign =3D=3D 0) ? 0 : (sign > 0 ? value : -value); + return 0; =20 case UVC_GET_MIN: case UVC_GET_MAX: case UVC_GET_RES: case UVC_GET_DEF: default: - return data[2]; + *out =3D value; + return 0; } } =20 -static void uvc_ctrl_set_zoom(struct uvc_control_mapping *mapping, - s32 value, u8 *data) +static int uvc_ctrl_set_zoom(struct uvc_control_mapping *mapping, + size_t v4l2_size, const void *v4l2_in, + void *uvc_out) { - data[0] =3D value =3D=3D 0 ? 0 : (value > 0) ? 1 : 0xff; - data[2] =3D min((int)abs(value), 0xff); + u8 *out =3D uvc_out; + s32 value; + + if (WARN_ON(v4l2_size !=3D sizeof(s32))) + return -EINVAL; + + value =3D *(u32 *)v4l2_in; + out[0] =3D value =3D=3D 0 ? 0 : (value > 0) ? 1 : 0xff; + out[2] =3D min_t(int, abs(value), 0xff); + + return 0; } =20 -static s32 uvc_ctrl_get_rel_speed(struct uvc_control_mapping *mapping, - u8 query, const u8 *data) +static int uvc_ctrl_get_rel_speed(struct uvc_control_mapping *mapping, + u8 query, const void *uvc_in, + size_t v4l2_size, void *v4l2_out) { unsigned int first =3D mapping->offset / 8; - s8 rel =3D (s8)data[first]; + u8 value =3D ((u8 *)uvc_in)[first + 1]; + s8 sign =3D ((s8 *)uvc_in)[first]; + s32 *out =3D v4l2_out; + + if (WARN_ON(v4l2_size !=3D sizeof(s32))) + return -EINVAL; =20 switch (query) { case UVC_GET_CUR: - return (rel =3D=3D 0) ? 0 : (rel > 0 ? data[first+1] - : -data[first+1]); + *out =3D (sign =3D=3D 0) ? 0 : (sign > 0 ? value : -value); + return 0; case UVC_GET_MIN: - return -data[first+1]; + *out =3D -value; + return 0; case UVC_GET_MAX: case UVC_GET_RES: case UVC_GET_DEF: default: - return data[first+1]; + *out =3D value; + return 0; } } =20 -static void uvc_ctrl_set_rel_speed(struct uvc_control_mapping *mapping, - s32 value, u8 *data) +static int uvc_ctrl_set_rel_speed(struct uvc_control_mapping *mapping, + size_t v4l2_size, const void *v4l2_in, + void *uvc_out) { unsigned int first =3D mapping->offset / 8; + u8 *out =3D uvc_out; + s32 value; + + if (WARN_ON(v4l2_size !=3D sizeof(s32))) + return -EINVAL; + + value =3D *(u32 *)v4l2_in; + out[first] =3D value =3D=3D 0 ? 0 : (value > 0) ? 1 : 0xff; + out[first + 1] =3D min_t(int, abs(value), 0xff); =20 - data[first] =3D value =3D=3D 0 ? 0 : (value > 0) ? 1 : 0xff; - data[first+1] =3D min_t(int, abs(value), 0xff); + return 0; } =20 static const struct uvc_control_mapping uvc_ctrl_power_line_mapping_limite= d =3D { @@ -887,14 +938,20 @@ static s32 uvc_menu_to_v4l2_menu(struct uvc_control_m= apping *mapping, s32 val) * a signed 32bit integer. Sign extension will be performed if the mapping * references a signed data type. */ -static s32 uvc_get_le_value(struct uvc_control_mapping *mapping, - u8 query, const u8 *data) +static int uvc_get_le_value(struct uvc_control_mapping *mapping, + u8 query, const void *uvc_in, size_t v4l2_size, + void *v4l2_out) { - int bits =3D mapping->size; int offset =3D mapping->offset; + int bits =3D mapping->size; + const u8 *data =3D uvc_in; + s32 *out =3D v4l2_out; s32 value =3D 0; u8 mask; =20 + if (WARN_ON(v4l2_size !=3D sizeof(s32))) + return -EINVAL; + data +=3D offset / 8; offset &=3D 7; mask =3D ((1LL << bits) - 1) << offset; @@ -916,29 +973,41 @@ static s32 uvc_get_le_value(struct uvc_control_mappin= g *mapping, value |=3D -(value & (1 << (mapping->size - 1))); =20 /* If it is a menu, convert from uvc to v4l2. */ - if (mapping->v4l2_type !=3D V4L2_CTRL_TYPE_MENU) - return value; + if (mapping->v4l2_type !=3D V4L2_CTRL_TYPE_MENU) { + *out =3D value; + return 0; + } =20 switch (query) { case UVC_GET_CUR: case UVC_GET_DEF: - return uvc_menu_to_v4l2_menu(mapping, value); + *out =3D uvc_menu_to_v4l2_menu(mapping, value); + return 0; } =20 - return value; + *out =3D value; + return 0; } =20 /* * Set the bit string specified by mapping->offset and mapping->size * in the little-endian data stored at 'data' to the value 'value'. */ -static void uvc_set_le_value(struct uvc_control_mapping *mapping, - s32 value, u8 *data) +static int uvc_set_le_value(struct uvc_control_mapping *mapping, + size_t v4l2_size, const void *v4l2_in, + void *uvc_out) { - int bits =3D mapping->size; int offset =3D mapping->offset; + int bits =3D mapping->size; + u8 *data =3D uvc_out; + s32 value; u8 mask; =20 + if (WARN_ON(v4l2_size !=3D sizeof(s32))) + return -EINVAL; + + value =3D *(s32 *)v4l2_in; + switch (mapping->v4l2_type) { case V4L2_CTRL_TYPE_MENU: value =3D uvc_mapping_get_menu_value(mapping, value); @@ -966,6 +1035,8 @@ static void uvc_set_le_value(struct uvc_control_mappin= g *mapping, bits -=3D 8 - offset; offset =3D 0; } + + return 0; } =20 /* ------------------------------------------------------------------------ @@ -1147,8 +1218,8 @@ static int __uvc_ctrl_get(struct uvc_video_chain *cha= in, if (ret < 0) return ret; =20 - *value =3D mapping->get(mapping, UVC_GET_CUR, - uvc_ctrl_data(ctrl, UVC_CTRL_DATA_CURRENT)); + *value =3D uvc_mapping_get_s32(mapping, UVC_GET_CUR, + uvc_ctrl_data(ctrl, UVC_CTRL_DATA_CURRENT)); =20 return 0; } @@ -1281,12 +1352,12 @@ static u32 uvc_get_ctrl_bitmap(struct uvc_control *= ctrl, * as supported. */ if (ctrl->info.flags & UVC_CTRL_FLAG_GET_RES) - return mapping->get(mapping, UVC_GET_RES, - uvc_ctrl_data(ctrl, UVC_CTRL_DATA_RES)); + return uvc_mapping_get_s32(mapping, UVC_GET_RES, + uvc_ctrl_data(ctrl, UVC_CTRL_DATA_RES)); =20 if (ctrl->info.flags & UVC_CTRL_FLAG_GET_MAX) - return mapping->get(mapping, UVC_GET_MAX, - uvc_ctrl_data(ctrl, UVC_CTRL_DATA_MAX)); + return uvc_mapping_get_s32(mapping, UVC_GET_MAX, + uvc_ctrl_data(ctrl, UVC_CTRL_DATA_MAX)); =20 return ~0; } @@ -1331,8 +1402,8 @@ static int __uvc_query_v4l2_ctrl(struct uvc_video_cha= in *chain, } =20 if (ctrl->info.flags & UVC_CTRL_FLAG_GET_DEF) { - v4l2_ctrl->default_value =3D mapping->get(mapping, UVC_GET_DEF, - uvc_ctrl_data(ctrl, UVC_CTRL_DATA_DEF)); + v4l2_ctrl->default_value =3D uvc_mapping_get_s32(mapping, + UVC_GET_DEF, uvc_ctrl_data(ctrl, UVC_CTRL_DATA_DEF)); } =20 switch (mapping->v4l2_type) { @@ -1365,16 +1436,16 @@ static int __uvc_query_v4l2_ctrl(struct uvc_video_c= hain *chain, } =20 if (ctrl->info.flags & UVC_CTRL_FLAG_GET_MIN) - v4l2_ctrl->minimum =3D mapping->get(mapping, UVC_GET_MIN, - uvc_ctrl_data(ctrl, UVC_CTRL_DATA_MIN)); + v4l2_ctrl->minimum =3D uvc_mapping_get_s32(mapping, UVC_GET_MIN, + uvc_ctrl_data(ctrl, UVC_CTRL_DATA_MIN)); =20 if (ctrl->info.flags & UVC_CTRL_FLAG_GET_MAX) - v4l2_ctrl->maximum =3D mapping->get(mapping, UVC_GET_MAX, - uvc_ctrl_data(ctrl, UVC_CTRL_DATA_MAX)); + v4l2_ctrl->maximum =3D uvc_mapping_get_s32(mapping, UVC_GET_MAX, + uvc_ctrl_data(ctrl, UVC_CTRL_DATA_MAX)); =20 if (ctrl->info.flags & UVC_CTRL_FLAG_GET_RES) - v4l2_ctrl->step =3D mapping->get(mapping, UVC_GET_RES, - uvc_ctrl_data(ctrl, UVC_CTRL_DATA_RES)); + v4l2_ctrl->step =3D uvc_mapping_get_s32(mapping, UVC_GET_RES, + uvc_ctrl_data(ctrl, UVC_CTRL_DATA_RES)); =20 return 0; } @@ -1625,7 +1696,7 @@ void uvc_ctrl_status_event(struct uvc_video_chain *ch= ain, uvc_ctrl_set_handle(handle, ctrl, NULL); =20 list_for_each_entry(mapping, &ctrl->info.mappings, list) { - s32 value =3D mapping->get(mapping, UVC_GET_CUR, data); + s32 value =3D uvc_mapping_get_s32(mapping, UVC_GET_CUR, data); =20 /* * handle may be NULL here if the device sends auto-update @@ -1974,8 +2045,8 @@ int uvc_ctrl_get(struct uvc_video_chain *chain, u32 w= hich, if (ret < 0) return ret; } - xctrl->value =3D mapping->get(mapping, UVC_GET_DEF, - uvc_ctrl_data(ctrl, UVC_CTRL_DATA_DEF)); + xctrl->value =3D uvc_mapping_get_s32(mapping, UVC_GET_DEF, + uvc_ctrl_data(ctrl, UVC_CTRL_DATA_DEF)); return 0; } =20 @@ -2014,12 +2085,12 @@ int uvc_ctrl_set(struct uvc_fh *handle, return ret; } =20 - min =3D mapping->get(mapping, UVC_GET_MIN, - uvc_ctrl_data(ctrl, UVC_CTRL_DATA_MIN)); - max =3D mapping->get(mapping, UVC_GET_MAX, - uvc_ctrl_data(ctrl, UVC_CTRL_DATA_MAX)); - step =3D mapping->get(mapping, UVC_GET_RES, - uvc_ctrl_data(ctrl, UVC_CTRL_DATA_RES)); + min =3D uvc_mapping_get_s32(mapping, UVC_GET_MIN, + uvc_ctrl_data(ctrl, UVC_CTRL_DATA_MIN)); + max =3D uvc_mapping_get_s32(mapping, UVC_GET_MAX, + uvc_ctrl_data(ctrl, UVC_CTRL_DATA_MAX)); + step =3D uvc_mapping_get_s32(mapping, UVC_GET_RES, + uvc_ctrl_data(ctrl, UVC_CTRL_DATA_RES)); if (step =3D=3D 0) step =3D 1; =20 @@ -2098,8 +2169,8 @@ int uvc_ctrl_set(struct uvc_fh *handle, ctrl->info.size); } =20 - mapping->set(mapping, value, - uvc_ctrl_data(ctrl, UVC_CTRL_DATA_CURRENT)); + uvc_mapping_set_s32(mapping, value, + uvc_ctrl_data(ctrl, UVC_CTRL_DATA_CURRENT)); =20 ctrl->dirty =3D 1; ctrl->modified =3D 1; diff --git a/drivers/media/usb/uvc/uvcvideo.h b/drivers/media/usb/uvc/uvcvi= deo.h index 018613f98f48..b55d5c23dfca 100644 --- a/drivers/media/usb/uvc/uvcvideo.h +++ b/drivers/media/usb/uvc/uvcvideo.h @@ -132,10 +132,10 @@ struct uvc_control_mapping { const struct uvc_control_mapping *(*filter_mapping) (struct uvc_video_chain *chain, struct uvc_control *ctrl); - s32 (*get)(struct uvc_control_mapping *mapping, u8 query, - const u8 *data); - void (*set)(struct uvc_control_mapping *mapping, s32 value, - u8 *data); + int (*get)(struct uvc_control_mapping *mapping, u8 query, + const void *uvc_in, size_t v4l2_size, void *v4l2_out); + int (*set)(struct uvc_control_mapping *mapping, size_t v4l2_size, + const void *v4l2_in, void *uvc_out); }; =20 struct uvc_control { --=20 2.48.1.362.g079036d154-goog From nobody Sun Dec 14 13:49:28 2025 Received: from mail-ua1-f50.google.com (mail-ua1-f50.google.com [209.85.222.50]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id D98F9205AB5 for ; Mon, 3 Feb 2025 11:56:01 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.222.50 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1738583763; cv=none; b=PmDSo95+JKo3zquoQUetqcHVzXmuTjyBSf6dAfPC84+gX9IjJ4pm5B2gmqWvZ6rI5tiUjDrlmjucnzTGe/CvaE+VFfmPZeUjwXaJYrg1OaxDXQlb5BmBnaVrBgGSTbVlJlkvDJxU23WB1f5cNto6qxujrAgglJ1qmVW9204H+BI= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1738583763; c=relaxed/simple; bh=3aebO2Y6pQInuoUCgyshgsDh6HxXVCLmgcGLzFZAZA0=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=DhQwi5RIUPJRR1WLWKYHseNmWIPlPSxBRBP4MJCcDtf6O9Goka2loQVXZi6dh/FskCoD849eu9Veu542FTi+l1G69nPzYJESaxR5QeX90aeYu7DxqSmdLXaCrVSndJsvNykXcP2GptOoF62BSv0G/AMNskbQ5fNMlE9tK4k4ZO4= 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=RkoG/Rci; arc=none smtp.client-ip=209.85.222.50 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=chromium.org Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=chromium.org Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=chromium.org header.i=@chromium.org header.b="RkoG/Rci" Received: by mail-ua1-f50.google.com with SMTP id a1e0cc1a2514c-85c662ebbc3so887302241.0 for ; Mon, 03 Feb 2025 03:56:01 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=chromium.org; s=google; t=1738583761; x=1739188561; 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=WCmmBQ4JBjHuyjlM+6/xjTKGJo8TUzW14yyn8KiIGJg=; b=RkoG/RcidKSF1u1wxZem9BTg0RHR5W4cLTtUqHVPU2AmraxFq8jgchOjxWXmJeOHiH xnMYKrWNBI8hkCIro9+/cyMewVirdaFdkN4rDg9n+Rx6Z6OWxPLq8CfC3PhGab9mjtGe 5yTZ+aBisdN9wtDKWekDStJRpBth/9nTIxKXw= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1738583761; x=1739188561; 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=WCmmBQ4JBjHuyjlM+6/xjTKGJo8TUzW14yyn8KiIGJg=; b=YxP275LsD/y1aUcjFzKbTwOhTz972X1VpLjYv9dAmLbcn63QbWHrGlC8+fM0NXQZiV 10eK0i1P6j5449SAXHnu+nz0q2gHlC3CbFGjVqajdmSctCpJDafb5Loa7VmMa2P0Ol7T eBTh8R5/MYVHLPxv4I2L4R0tB6GP9B8vuMsXClt+OEuqF4X39k8gfGp/umBkBYJRhYQU XSw0+kiT8RGDYHnl70IngN5xADaxwRnkDyqhUnLWG3Quidafhnj+39PQtilwVbcjsNcc u7pR90fQ5BC/1f68uPeh1QW2gmoaJSz3WR0QEaXnsJ1HJ80PcGrxGeCxTG2bSYkhHisF dXhQ== X-Forwarded-Encrypted: i=1; AJvYcCUuORHNEW1gjGjVgKAm/L8P3xXP+Vc1JesfvBaWiMaCxqLYdxY4DstQU/duOGFfvfJRdXi/m9+kFa1X2xA=@vger.kernel.org X-Gm-Message-State: AOJu0Ywm1/shIexkcp0tz6S4jtPKDYkwxMLXbOJxbsnEA0mOi4zcRJpU Ha1hD010Fb1RHUVKRILp4+BpGC1bvhBdopLcpdDaNhK67lUYgKBBRHTz1Ih8VaS0GK7NyA0obOa bTg== X-Gm-Gg: ASbGncupntJ7VFGpIwEn4Znxq0vIHJVVHNEx1FjNmgY3I92H1tW57HScai8C3+dZhCD Vk90h7E9GvTSU9JURD48DYuemLCQGljjOPmvFPlQ07wibWX7P6vpT9Gl/2LwWvjsm0dFjdCyC1N 6C2exXMveRCiuZECwgtOvDDYJY3ZGCtc1jQ+gM2JaOSeUIAYoI4DOsQh+/sNSvatJo7V2pSkH8B AzvpdsQDwEtIrE77h5wd4Rlf1m8ReBvutO4QdvarUPFPskWPKvSmwdl8tE8WI/DIMg2tQsWXIv6 XN4/Hn0msnCT0dbyXN8L6ug/xQxdd+EUOnmmenFCDwQ+bHafOo/QwfRHmC5kMfKjnQ== X-Google-Smtp-Source: AGHT+IFYM7tol6Vv9OAXobztpdGoP/V/bsu+SLitBGak8MLulw5+yWYEEZB5P8IiJmqPtrF+3elORw== X-Received: by 2002:a67:e711:0:b0:4b2:5d3e:7554 with SMTP id ada2fe7eead31-4b9a526901dmr17457397137.23.1738583760862; Mon, 03 Feb 2025 03:56:00 -0800 (PST) Received: from denia.c.googlers.com (5.236.236.35.bc.googleusercontent.com. [35.236.236.5]) by smtp.gmail.com with ESMTPSA id ada2fe7eead31-4b9baa9aefcsm1592770137.12.2025.02.03.03.55.58 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 03 Feb 2025 03:55:59 -0800 (PST) From: Ricardo Ribalda Date: Mon, 03 Feb 2025 11:55:45 +0000 Subject: [PATCH v17 09/17] media: uvcvideo: Factor out clamping from uvc_ctrl_set 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: <20250203-uvc-roi-v17-9-5900a9fed613@chromium.org> References: <20250203-uvc-roi-v17-0-5900a9fed613@chromium.org> In-Reply-To: <20250203-uvc-roi-v17-0-5900a9fed613@chromium.org> To: Laurent Pinchart , Mauro Carvalho Chehab , Hans de Goede , Sakari Ailus , Hans Verkuil Cc: Yunke Cao , linux-media@vger.kernel.org, linux-kernel@vger.kernel.org, Ricardo Ribalda , Yunke Cao X-Mailer: b4 0.13.0 Move the logic to a separated function. Do not expect any change. This is a preparation for supporting compound controls. Reviewed-by: Yunke Cao Reviewed-by: Hans de Goede Tested-by: Yunke Cao Signed-off-by: Ricardo Ribalda --- drivers/media/usb/uvc/uvc_ctrl.c | 86 +++++++++++++++++++++---------------= ---- 1 file changed, 46 insertions(+), 40 deletions(-) diff --git a/drivers/media/usb/uvc/uvc_ctrl.c b/drivers/media/usb/uvc/uvc_c= trl.c index a0156b79ab48..b6fd06bd1006 100644 --- a/drivers/media/usb/uvc/uvc_ctrl.c +++ b/drivers/media/usb/uvc/uvc_ctrl.c @@ -2053,30 +2053,17 @@ int uvc_ctrl_get(struct uvc_video_chain *chain, u32= which, return -EINVAL; } =20 -int uvc_ctrl_set(struct uvc_fh *handle, - struct v4l2_ext_control *xctrl) +static int uvc_ctrl_clamp(struct uvc_video_chain *chain, + struct uvc_control *ctrl, + struct uvc_control_mapping *mapping, + s32 *value_in_out) { - struct uvc_video_chain *chain =3D handle->chain; - struct uvc_control *ctrl; - struct uvc_control_mapping *mapping; - s32 value; + s32 value =3D *value_in_out; u32 step; s32 min; s32 max; int ret; =20 - lockdep_assert_held(&chain->ctrl_mutex); - - if (__uvc_query_v4l2_class(chain, xctrl->id, 0) >=3D 0) - return -EACCES; - - ctrl =3D uvc_find_control(chain, xctrl->id, &mapping); - if (ctrl =3D=3D NULL) - return -EINVAL; - if (!(ctrl->info.flags & UVC_CTRL_FLAG_SET_CUR)) - return -EACCES; - - /* Clamp out of range values. */ switch (mapping->v4l2_type) { case V4L2_CTRL_TYPE_INTEGER: if (!ctrl->cached) { @@ -2094,14 +2081,13 @@ int uvc_ctrl_set(struct uvc_fh *handle, if (step =3D=3D 0) step =3D 1; =20 - xctrl->value =3D min + DIV_ROUND_CLOSEST((u32)(xctrl->value - min), - step) * step; + value =3D min + DIV_ROUND_CLOSEST((u32)(value - min), step) * step; if (mapping->data_type =3D=3D UVC_CTRL_DATA_TYPE_SIGNED) - xctrl->value =3D clamp(xctrl->value, min, max); + value =3D clamp(value, min, max); else - xctrl->value =3D clamp_t(u32, xctrl->value, min, max); - value =3D xctrl->value; - break; + value =3D clamp_t(u32, value, min, max); + *value_in_out =3D value; + return 0; =20 case V4L2_CTRL_TYPE_BITMASK: if (!ctrl->cached) { @@ -2110,21 +2096,20 @@ int uvc_ctrl_set(struct uvc_fh *handle, return ret; } =20 - xctrl->value &=3D uvc_get_ctrl_bitmap(ctrl, mapping); - value =3D xctrl->value; - break; + value &=3D uvc_get_ctrl_bitmap(ctrl, mapping); + *value_in_out =3D value; + return 0; =20 case V4L2_CTRL_TYPE_BOOLEAN: - xctrl->value =3D clamp(xctrl->value, 0, 1); - value =3D xctrl->value; - break; + *value_in_out =3D clamp(value, 0, 1); + return 0; =20 case V4L2_CTRL_TYPE_MENU: - if (xctrl->value < (ffs(mapping->menu_mask) - 1) || - xctrl->value > (fls(mapping->menu_mask) - 1)) + if (value < (ffs(mapping->menu_mask) - 1) || + value > (fls(mapping->menu_mask) - 1)) return -ERANGE; =20 - if (!test_bit(xctrl->value, &mapping->menu_mask)) + if (!test_bit(value, &mapping->menu_mask)) return -EINVAL; =20 /* @@ -2132,8 +2117,7 @@ int uvc_ctrl_set(struct uvc_fh *handle, * UVC controls that support it. */ if (mapping->data_type =3D=3D UVC_CTRL_DATA_TYPE_BITMASK) { - int val =3D uvc_mapping_get_menu_value(mapping, - xctrl->value); + int val =3D uvc_mapping_get_menu_value(mapping, value); if (!ctrl->cached) { ret =3D uvc_ctrl_populate_cache(chain, ctrl); if (ret < 0) @@ -2143,14 +2127,36 @@ int uvc_ctrl_set(struct uvc_fh *handle, if (!(uvc_get_ctrl_bitmap(ctrl, mapping) & val)) return -EINVAL; } - value =3D xctrl->value; - break; + return 0; =20 default: - value =3D xctrl->value; - break; + return 0; } =20 + return 0; +} + +int uvc_ctrl_set(struct uvc_fh *handle, struct v4l2_ext_control *xctrl) +{ + struct uvc_video_chain *chain =3D handle->chain; + struct uvc_control_mapping *mapping; + struct uvc_control *ctrl; + int ret; + + lockdep_assert_held(&chain->ctrl_mutex); + + if (__uvc_query_v4l2_class(chain, xctrl->id, 0) >=3D 0) + return -EACCES; + + ctrl =3D uvc_find_control(chain, xctrl->id, &mapping); + if (!ctrl) + return -EINVAL; + if (!(ctrl->info.flags & UVC_CTRL_FLAG_SET_CUR)) + return -EACCES; + + ret =3D uvc_ctrl_clamp(chain, ctrl, mapping, &xctrl->value); + if (ret) + return ret; /* * If the mapping doesn't span the whole UVC control, the current value * needs to be loaded from the device to perform the read-modify-write @@ -2169,7 +2175,7 @@ int uvc_ctrl_set(struct uvc_fh *handle, ctrl->info.size); } =20 - uvc_mapping_set_s32(mapping, value, + uvc_mapping_set_s32(mapping, xctrl->value, uvc_ctrl_data(ctrl, UVC_CTRL_DATA_CURRENT)); =20 ctrl->dirty =3D 1; --=20 2.48.1.362.g079036d154-goog From nobody Sun Dec 14 13:49:28 2025 Received: from mail-vs1-f43.google.com (mail-vs1-f43.google.com [209.85.217.43]) (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 50B98205E02 for ; Mon, 3 Feb 2025 11:56:04 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.217.43 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1738583766; cv=none; b=ehb7kxiV2ri6f+B6ZpFbTdJxKggrv5f1TsunNp7JSiu1j4oPLncG65ekIFnoRJbkLHZC7Mfp1+7lgpZlSjtBHBmM+5xGdqLjNWHmUlupfNlsslKYh1qiisJ/HRqedfWioxyjiMEZ/6nHB3719Qm3Rw8EiAiRs9yPOyBftXLsVkk= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1738583766; c=relaxed/simple; bh=l/fcdHhsZc1G8kfqRIGNDU+WYdRMCOvEOwkUO1BblOM=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=f5panWLlenggnQFxK4URo/aDl5zbKs6APcF16ho6P1DAWxZpq4wvwLZ9RhgyKkxb0Io8IkCPvsRqo8gvfnQJai9N4/NNwCFRTMhDZH5f6db2cIiGPW0cq/yIh2kyeFO4IQojD3RW0LU5AYXa0bILaJ5Y2BT4vzPRzIFY2IYnNCI= 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=SZ1rHYc6; arc=none smtp.client-ip=209.85.217.43 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="SZ1rHYc6" Received: by mail-vs1-f43.google.com with SMTP id ada2fe7eead31-4afe70b41a8so1239997137.3 for ; Mon, 03 Feb 2025 03:56:03 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=chromium.org; s=google; t=1738583763; x=1739188563; 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=9sF4HNI5vFPmPVaNfnuD6G4Y5GTStktdnYr0fU81onE=; b=SZ1rHYc69r4uzuFSlmQg5iJ73fhTiQh8hbal+fImnQ1u2kS/VUtjDHeQFXyifsVRZd 01JiocyNvoAHiM98+EfOEkFpCvQRwctQt12d5YZtNWBbU1X1DMwLsSqSKdgKpCdFzkIT AKJZJ49P5j9vMKo6ZCRRQ4kySTgjYYGpK/dNQ= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1738583763; x=1739188563; 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=9sF4HNI5vFPmPVaNfnuD6G4Y5GTStktdnYr0fU81onE=; b=bhHfB75zsnrTJhPWdgY/2vTB1MEwvyMJdj0bLcCEcRXEJkgHl6IBgdVcmbYYN4J40E 2N7+aJad314EQiz+Sj0xoWtwtOlMIfv/4apOVd3J2ii31DVc5R3+APr+F7OepWgett10 WY+wwNQk7P9dboPZma2N2IST8ESBavIpORRro04hpK5XOBLhV+rhqDcdZaSNBD5KmfYa 4l5SD51CriuonR3hCLPACZBN4AtP8PE7U2KrolMKx02IUdwHFNSmMhBokrRIbskOlOcW VI6WYu6Y7TxOS9Vi8YPXIEQhqYay9O30RYJHT4F+uIQqm7RQGJQTNKt6hzE1NZ3aX/QO HRmg== X-Forwarded-Encrypted: i=1; AJvYcCUJGbgux6Jrph2nKxCKvwmUqxywQYxn8Loc/nC2eqzVLgj8MBjYBiM5VkNKJH0fCBnAUpzACbywMmmzMUY=@vger.kernel.org X-Gm-Message-State: AOJu0Yy3odf+9Z412CVG3jUNAhF1n4qHV5TPAMv5HE9zy/UAIwoiPGcB y/j7uJMyc1kYqJkrHdOPUXJQWEaoHAYxdU61Uh0YJM1aVCW30AnTdddlbV7U7g== X-Gm-Gg: ASbGncuz8MnuWJj5Eooktj5rt8+OpBFdE/i7OtH5+uVn9b7A593yWBOGrufz72tuWj6 eZ+TXDkRuqfHDla7r6fL6WM3uhurOA0YAeFatLTWmSdWwmQKShrz1JYA2DewEKJQ0qu5KG8kZgN dFfIwb1T3tDLvmtcPLTvzVaIqBBguRq7jXMso/kJfiuG8QiG2aCnE1gREqRDYtAsLw83Cju5WxS T1meTAlP2PY9iP9aQYD7iETRy8tVizbko2726Ncvmrt1grRIHRfUVrUn3rFr3JqW0Ah5xF4Du+p SZNfeTVAZWKHSgoHHnU5W7xlyf0QHTn8VExWQUHASTrqPzyNnAq/P1noc0YR9/XN1A== X-Google-Smtp-Source: AGHT+IH3DiLPTkUdxBLBfUiIGXa7NKTm3tt7X5VWElLM4TJp33bz1gCXlPjF+Ehy/3tK93p9qyUu1Q== X-Received: by 2002:a05:6102:2ad3:b0:4af:bb06:62d with SMTP id ada2fe7eead31-4b9a4f499c9mr13926394137.11.1738583763057; Mon, 03 Feb 2025 03:56:03 -0800 (PST) Received: from denia.c.googlers.com (5.236.236.35.bc.googleusercontent.com. [35.236.236.5]) by smtp.gmail.com with ESMTPSA id ada2fe7eead31-4b9baa9aefcsm1592770137.12.2025.02.03.03.56.00 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 03 Feb 2025 03:56:01 -0800 (PST) From: Ricardo Ribalda Date: Mon, 03 Feb 2025 11:55:46 +0000 Subject: [PATCH v17 10/17] media: uvcvideo: add support for compound controls 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: <20250203-uvc-roi-v17-10-5900a9fed613@chromium.org> References: <20250203-uvc-roi-v17-0-5900a9fed613@chromium.org> In-Reply-To: <20250203-uvc-roi-v17-0-5900a9fed613@chromium.org> To: Laurent Pinchart , Mauro Carvalho Chehab , Hans de Goede , Sakari Ailus , Hans Verkuil Cc: Yunke Cao , linux-media@vger.kernel.org, linux-kernel@vger.kernel.org, Ricardo Ribalda , Yunke Cao X-Mailer: b4 0.13.0 From: Yunke Cao This patch adds support for compound controls. This is required to support controls that cannot be represented with a s64 data, such as the Region of Interest. Signed-off-by: Yunke Cao Tested-by: Yunke Cao Reviewed-by: Hans de Goede Signed-off-by: Ricardo Ribalda --- drivers/media/usb/uvc/uvc_ctrl.c | 212 +++++++++++++++++++++++++++++++++--= ---- drivers/media/usb/uvc/uvcvideo.h | 5 + 2 files changed, 189 insertions(+), 28 deletions(-) diff --git a/drivers/media/usb/uvc/uvc_ctrl.c b/drivers/media/usb/uvc/uvc_c= trl.c index b6fd06bd1006..b8bf8ca95747 100644 --- a/drivers/media/usb/uvc/uvc_ctrl.c +++ b/drivers/media/usb/uvc/uvc_ctrl.c @@ -367,6 +367,11 @@ static const u32 uvc_control_classes[] =3D { =20 static const int exposure_auto_mapping[] =3D { 2, 1, 4, 8 }; =20 +static bool uvc_ctrl_mapping_is_compound(struct uvc_control_mapping *mappi= ng) +{ + return mapping->v4l2_type >=3D V4L2_CTRL_COMPOUND_TYPES; +} + static s32 uvc_mapping_get_s32(struct uvc_control_mapping *mapping, u8 query, const void *data_in) { @@ -1055,7 +1060,7 @@ static int uvc_entity_match_guid(const struct uvc_ent= ity *entity, =20 static void __uvc_find_control(struct uvc_entity *entity, u32 v4l2_id, struct uvc_control_mapping **mapping, struct uvc_control **control, - int next) + int next, int next_compound) { struct uvc_control *ctrl; struct uvc_control_mapping *map; @@ -1070,14 +1075,16 @@ static void __uvc_find_control(struct uvc_entity *e= ntity, u32 v4l2_id, continue; =20 list_for_each_entry(map, &ctrl->info.mappings, list) { - if ((map->id =3D=3D v4l2_id) && !next) { + if (map->id =3D=3D v4l2_id && !next && !next_compound) { *control =3D ctrl; *mapping =3D map; return; } =20 if ((*mapping =3D=3D NULL || (*mapping)->id > map->id) && - (map->id > v4l2_id) && next) { + (map->id > v4l2_id) && + (uvc_ctrl_mapping_is_compound(map) ? + next_compound : next)) { *control =3D ctrl; *mapping =3D map; } @@ -1091,6 +1098,7 @@ static struct uvc_control *uvc_find_control(struct uv= c_video_chain *chain, struct uvc_control *ctrl =3D NULL; struct uvc_entity *entity; int next =3D v4l2_id & V4L2_CTRL_FLAG_NEXT_CTRL; + int next_compound =3D v4l2_id & V4L2_CTRL_FLAG_NEXT_COMPOUND; =20 *mapping =3D NULL; =20 @@ -1099,12 +1107,13 @@ static struct uvc_control *uvc_find_control(struct = uvc_video_chain *chain, =20 /* Find the control. */ list_for_each_entry(entity, &chain->entities, chain) { - __uvc_find_control(entity, v4l2_id, mapping, &ctrl, next); - if (ctrl && !next) + __uvc_find_control(entity, v4l2_id, mapping, &ctrl, next, + next_compound); + if (ctrl && !next && !next_compound) return ctrl; } =20 - if (ctrl =3D=3D NULL && !next) + if (!ctrl && !next && !next_compound) uvc_dbg(chain->dev, CONTROL, "Control 0x%08x not found\n", v4l2_id); =20 @@ -1227,7 +1236,8 @@ static int __uvc_ctrl_get(struct uvc_video_chain *cha= in, static int __uvc_query_v4l2_class(struct uvc_video_chain *chain, u32 req_i= d, u32 found_id) { - bool find_next =3D req_id & V4L2_CTRL_FLAG_NEXT_CTRL; + bool find_next =3D req_id & + (V4L2_CTRL_FLAG_NEXT_CTRL | V4L2_CTRL_FLAG_NEXT_COMPOUND); unsigned int i; =20 req_id &=3D V4L2_CTRL_ID_MASK; @@ -1317,10 +1327,12 @@ int uvc_ctrl_is_accessible(struct uvc_video_chain *= chain, u32 v4l2_id, } =20 __uvc_find_control(ctrl->entity, mapping->master_id, &master_map, - &master_ctrl, 0); + &master_ctrl, 0, 0); =20 if (!master_ctrl || !(master_ctrl->info.flags & UVC_CTRL_FLAG_GET_CUR)) return 0; + if (WARN_ON(uvc_ctrl_mapping_is_compound(master_map))) + return -EIO; =20 ret =3D __uvc_ctrl_get(chain, master_ctrl, master_map, &val); if (ret >=3D 0 && val !=3D mapping->master_manual) @@ -1384,10 +1396,15 @@ static int __uvc_query_v4l2_ctrl(struct uvc_video_c= hain *chain, =20 if (mapping->master_id) __uvc_find_control(ctrl->entity, mapping->master_id, - &master_map, &master_ctrl, 0); + &master_map, &master_ctrl, 0, 0); if (master_ctrl && (master_ctrl->info.flags & UVC_CTRL_FLAG_GET_CUR)) { s32 val; - int ret =3D __uvc_ctrl_get(chain, master_ctrl, master_map, &val); + int ret; + + if (WARN_ON(uvc_ctrl_mapping_is_compound(master_map))) + return -EIO; + + ret =3D __uvc_ctrl_get(chain, master_ctrl, master_map, &val); if (ret < 0) return ret; =20 @@ -1395,6 +1412,15 @@ static int __uvc_query_v4l2_ctrl(struct uvc_video_ch= ain *chain, v4l2_ctrl->flags |=3D V4L2_CTRL_FLAG_INACTIVE; } =20 + if (v4l2_ctrl->type >=3D V4L2_CTRL_COMPOUND_TYPES) { + v4l2_ctrl->flags |=3D V4L2_CTRL_FLAG_HAS_PAYLOAD; + v4l2_ctrl->default_value =3D 0; + v4l2_ctrl->minimum =3D 0; + v4l2_ctrl->maximum =3D 0; + v4l2_ctrl->step =3D 0; + return 0; + } + if (!ctrl->cached) { int ret =3D uvc_ctrl_populate_cache(chain, ctrl); if (ret < 0) @@ -1635,11 +1661,12 @@ static void uvc_ctrl_send_slave_event(struct uvc_vi= deo_chain *chain, u32 changes =3D V4L2_EVENT_CTRL_CH_FLAGS; s32 val =3D 0; =20 - __uvc_find_control(master->entity, slave_id, &mapping, &ctrl, 0); + __uvc_find_control(master->entity, slave_id, &mapping, &ctrl, 0, 0); if (ctrl =3D=3D NULL) return; =20 - if (__uvc_ctrl_get(chain, ctrl, mapping, &val) =3D=3D 0) + if (uvc_ctrl_mapping_is_compound(mapping) || + __uvc_ctrl_get(chain, ctrl, mapping, &val) =3D=3D 0) changes |=3D V4L2_EVENT_CTRL_CH_VALUE; =20 uvc_ctrl_send_event(chain, handle, ctrl, mapping, val, changes); @@ -1696,7 +1723,12 @@ void uvc_ctrl_status_event(struct uvc_video_chain *c= hain, uvc_ctrl_set_handle(handle, ctrl, NULL); =20 list_for_each_entry(mapping, &ctrl->info.mappings, list) { - s32 value =3D uvc_mapping_get_s32(mapping, UVC_GET_CUR, data); + s32 value; + + if (uvc_ctrl_mapping_is_compound(mapping)) + value =3D 0; + else + value =3D uvc_mapping_get_s32(mapping, UVC_GET_CUR, data); =20 /* * handle may be NULL here if the device sends auto-update @@ -1780,6 +1812,7 @@ static void uvc_ctrl_send_events(struct uvc_fh *handl= e, =20 for (i =3D 0; i < xctrls_count; ++i) { u32 changes =3D V4L2_EVENT_CTRL_CH_VALUE; + s32 value; =20 ctrl =3D uvc_find_control(handle->chain, xctrls[i].id, &mapping); if (ctrl->info.flags & UVC_CTRL_FLAG_ASYNCHRONOUS) @@ -1804,6 +1837,10 @@ static void uvc_ctrl_send_events(struct uvc_fh *hand= le, slave_id); } =20 + if (uvc_ctrl_mapping_is_compound(mapping)) + value =3D 0; + else + value =3D xctrls[i].value; /* * If the master is being modified in the same transaction * flags may change too. @@ -1814,7 +1851,7 @@ static void uvc_ctrl_send_events(struct uvc_fh *handl= e, changes |=3D V4L2_EVENT_CTRL_CH_FLAGS; =20 uvc_ctrl_send_event(handle->chain, handle, ctrl, mapping, - xctrls[i].value, changes); + value, changes); } } =20 @@ -1846,7 +1883,8 @@ static int uvc_ctrl_add_event(struct v4l2_subscribed_= event *sev, unsigned elems) u32 changes =3D V4L2_EVENT_CTRL_CH_FLAGS; s32 val =3D 0; =20 - if (__uvc_ctrl_get(handle->chain, ctrl, mapping, &val) =3D=3D 0) + if (uvc_ctrl_mapping_is_compound(mapping) || + __uvc_ctrl_get(handle->chain, ctrl, mapping, &val) =3D=3D 0) changes |=3D V4L2_EVENT_CTRL_CH_VALUE; =20 uvc_ctrl_fill_event(handle->chain, &ev, ctrl, mapping, val, @@ -1986,7 +2024,7 @@ static int uvc_ctrl_find_ctrl_idx(struct uvc_entity *= entity, =20 for (i =3D 0; i < ctrls->count; i++) { __uvc_find_control(entity, ctrls->controls[i].id, &mapping, - &ctrl_found, 0); + &ctrl_found, 0, 0); if (uvc_control =3D=3D ctrl_found) return i; } @@ -2022,19 +2060,64 @@ int __uvc_ctrl_commit(struct uvc_fh *handle, int ro= llback, return ret; } =20 -int uvc_ctrl_get(struct uvc_video_chain *chain, u32 which, - struct v4l2_ext_control *xctrl) +static int uvc_mapping_get_xctrl_compound(struct uvc_video_chain *chain, + struct uvc_control *ctrl, + struct uvc_control_mapping *mapping, + u32 which, + struct v4l2_ext_control *xctrl) { - struct uvc_control *ctrl; - struct uvc_control_mapping *mapping; - - if (__uvc_query_v4l2_class(chain, xctrl->id, 0) >=3D 0) - return -EACCES; + u8 *data __free(kfree) =3D NULL; + size_t size; + u8 query; + int ret; + int id; =20 - ctrl =3D uvc_find_control(chain, xctrl->id, &mapping); - if (ctrl =3D=3D NULL) + switch (which) { + case V4L2_CTRL_WHICH_CUR_VAL: + ret =3D __uvc_ctrl_load_cur(chain, ctrl); + if (ret < 0) + return ret; + id =3D UVC_CTRL_DATA_CURRENT; + query =3D UVC_GET_CUR; + break; + case V4L2_CTRL_WHICH_DEF_VAL: + ret =3D uvc_ctrl_populate_cache(chain, ctrl); + if (ret < 0) + return ret; + id =3D UVC_CTRL_DATA_DEF; + query =3D UVC_GET_DEF; + break; + default: return -EINVAL; + } + + size =3D DIV_ROUND_UP(mapping->size, 8); + if (xctrl->size < size) { + xctrl->size =3D size; + return -ENOSPC; + } + + data =3D kmalloc(size, GFP_KERNEL); + if (!data) + return -ENOMEM; + + ret =3D mapping->get(mapping, query, uvc_ctrl_data(ctrl, id), size, data); + if (ret < 0) + return ret; + + /* + * v4l2_ext_control does not have enough room to fit a compound control. + * Instead, the value is in the user memory at xctrl->ptr. The v4l2 + * ioctl helper does not copy it for us. + */ + return copy_to_user(xctrl->ptr, data, size) ? -EFAULT : 0; +} =20 +static int uvc_mapping_get_xctrl_std(struct uvc_video_chain *chain, + struct uvc_control *ctrl, + struct uvc_control_mapping *mapping, + u32 which, struct v4l2_ext_control *xctrl) +{ switch (which) { case V4L2_CTRL_WHICH_CUR_VAL: return __uvc_ctrl_get(chain, ctrl, mapping, &xctrl->value); @@ -2053,6 +2136,33 @@ int uvc_ctrl_get(struct uvc_video_chain *chain, u32 = which, return -EINVAL; } =20 +static int uvc_mapping_get_xctrl(struct uvc_video_chain *chain, + struct uvc_control *ctrl, + struct uvc_control_mapping *mapping, + u32 which, struct v4l2_ext_control *xctrl) +{ + if (uvc_ctrl_mapping_is_compound(mapping)) + return uvc_mapping_get_xctrl_compound(chain, ctrl, mapping, + which, xctrl); + return uvc_mapping_get_xctrl_std(chain, ctrl, mapping, which, xctrl); +} + +int uvc_ctrl_get(struct uvc_video_chain *chain, u32 which, + struct v4l2_ext_control *xctrl) +{ + struct uvc_control *ctrl; + struct uvc_control_mapping *mapping; + + if (__uvc_query_v4l2_class(chain, xctrl->id, 0) >=3D 0) + return -EACCES; + + ctrl =3D uvc_find_control(chain, xctrl->id, &mapping); + if (!ctrl) + return -EINVAL; + + return uvc_mapping_get_xctrl(chain, ctrl, mapping, which, xctrl); +} + static int uvc_ctrl_clamp(struct uvc_video_chain *chain, struct uvc_control *ctrl, struct uvc_control_mapping *mapping, @@ -2136,6 +2246,42 @@ static int uvc_ctrl_clamp(struct uvc_video_chain *ch= ain, return 0; } =20 +static int uvc_mapping_set_xctrl_compound(struct uvc_control *ctrl, + struct uvc_control_mapping *mapping, + struct v4l2_ext_control *xctrl) +{ + u8 *data __free(kfree) =3D NULL; + size_t size; + + size =3D DIV_ROUND_UP(mapping->size, 8); + if (xctrl->size !=3D size) + return -EINVAL; + + /* + * v4l2_ext_control does not have enough room to fit a compound control. + * Instead, the value is in the user memory at xctrl->ptr. The v4l2 + * ioctl helper does not copy it for us. + */ + data =3D memdup_user(xctrl->ptr, size); + if (IS_ERR(data)) + return PTR_ERR(data); + + return mapping->set(mapping, size, data, + uvc_ctrl_data(ctrl, UVC_CTRL_DATA_CURRENT)); +} + +static int uvc_mapping_set_xctrl(struct uvc_control *ctrl, + struct uvc_control_mapping *mapping, + struct v4l2_ext_control *xctrl) +{ + if (uvc_ctrl_mapping_is_compound(mapping)) + return uvc_mapping_set_xctrl_compound(ctrl, mapping, xctrl); + + uvc_mapping_set_s32(mapping, xctrl->value, + uvc_ctrl_data(ctrl, UVC_CTRL_DATA_CURRENT)); + return 0; +} + int uvc_ctrl_set(struct uvc_fh *handle, struct v4l2_ext_control *xctrl) { struct uvc_video_chain *chain =3D handle->chain; @@ -2175,8 +2321,9 @@ int uvc_ctrl_set(struct uvc_fh *handle, struct v4l2_e= xt_control *xctrl) ctrl->info.size); } =20 - uvc_mapping_set_s32(mapping, xctrl->value, - uvc_ctrl_data(ctrl, UVC_CTRL_DATA_CURRENT)); + ret =3D uvc_mapping_set_xctrl(ctrl, mapping, xctrl); + if (ret) + return ret; =20 ctrl->dirty =3D 1; ctrl->modified =3D 1; @@ -2551,6 +2698,7 @@ static int __uvc_ctrl_add_mapping(struct uvc_video_ch= ain *chain, struct uvc_control_mapping *map; unsigned int size; unsigned int i; + int ret; =20 /* * Most mappings come from static kernel data, and need to be duplicated. @@ -2591,6 +2739,12 @@ static int __uvc_ctrl_add_mapping(struct uvc_video_c= hain *chain, goto err_nomem; } =20 + if (uvc_ctrl_mapping_is_compound(map)) + if (WARN_ON(!map->set || !map->get)) { + ret =3D -EIO; + goto free_mem; + } + if (map->get =3D=3D NULL) map->get =3D uvc_get_le_value; if (map->set =3D=3D NULL) @@ -2612,11 +2766,13 @@ static int __uvc_ctrl_add_mapping(struct uvc_video_= chain *chain, return 0; =20 err_nomem: + ret =3D -ENOMEM; +free_mem: kfree(map->menu_names); kfree(map->menu_mapping); kfree(map->name); kfree(map); - return -ENOMEM; + return ret; } =20 int uvc_ctrl_add_mapping(struct uvc_video_chain *chain, diff --git a/drivers/media/usb/uvc/uvcvideo.h b/drivers/media/usb/uvc/uvcvi= deo.h index b55d5c23dfca..2f9a1bf8b48a 100644 --- a/drivers/media/usb/uvc/uvcvideo.h +++ b/drivers/media/usb/uvc/uvcvideo.h @@ -116,7 +116,12 @@ struct uvc_control_mapping { u8 entity[16]; u8 selector; =20 + /* + * Size of the control data in the payload of the UVC control GET and + * SET requests, expressed in bits. + */ u8 size; + u8 offset; enum v4l2_ctrl_type v4l2_type; u32 data_type; --=20 2.48.1.362.g079036d154-goog From nobody Sun Dec 14 13:49:28 2025 Received: from mail-ua1-f49.google.com (mail-ua1-f49.google.com [209.85.222.49]) (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 3766E205E15 for ; Mon, 3 Feb 2025 11:56:06 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.222.49 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1738583767; cv=none; b=QTqi2nrmuQ9ClRMAX8lYHsDQNKsfW/vTPzWKjrvkK3FgH3MVaTLe73/1XrFLugQknVGcB57Z6zmu46eXW7l+W0kjIf1VsPfmT8umDrCFKAuabpOZaItQtoBjppajagcE3cvRKZzjTKENhlquxUNKvsnmmdZmxCmkAUyASCNZwz4= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1738583767; c=relaxed/simple; bh=jr+PsfqAe1DMqBhomm2T99WaHj0J+agxbYUDnZWYmVo=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=T0nLnvG+iaw53KOiJ30SGsMLZmuBa8KPDgUGfIaZJRrerrbZlazNMW/tZiqBRqEq0/y+F0YHVkLn8OInh+ci7rTrYxwvIPfwUltyoqmicop9Z5NMR5tXVe4pRR/5Faw/slADhT/8VDx+8sCLfvO6Vi6VEd3ohGTsreKNQNUxJPA= 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=i0Gmb3Pb; arc=none smtp.client-ip=209.85.222.49 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="i0Gmb3Pb" Received: by mail-ua1-f49.google.com with SMTP id a1e0cc1a2514c-85bc7d126b2so2203489241.1 for ; Mon, 03 Feb 2025 03:56:06 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=chromium.org; s=google; t=1738583765; x=1739188565; 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=vmRIEuGB9w+y+UYSlcNFeXKIfbL+PvnOnrm5AaSkwZM=; b=i0Gmb3PbE6//JW6+QrWIoPueO+VT/dSK/YH1XG6IvIVjYrMsXKNDjvpP0hhueydejj uNgX7YA4xAn28FOVb1KNtrJ5WkAgKT10epxFZEAYDcs4r4Xmf5pkizZc3X3sTwiVlLHV heDNYnYg2/GBT+TrAU+8NDxdH6uSWXyeuImJw= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1738583765; x=1739188565; 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=vmRIEuGB9w+y+UYSlcNFeXKIfbL+PvnOnrm5AaSkwZM=; b=sCQhgHGYw7CLwXCD7U8HnD+Qy2DIug3WEdlMLiolmoLZejUksILEmEH9qtmtkYv9+a Nlp4aVsxwrKmmdpUaass4ayZt098NhPCpBe4OtVcNrArAHfV8rSLQnprGlxtMz+gMKRU EKA9Ap9qTeODmDDIfiGzyrSKsIThZi+6hBU22WA4Gjzk1wqN47divGdTLNs3B3j1M7Er oRTf3SxZYTSk1VNFgzoSK1JNCEQgif0gagBWoazw7qqOJMpiCngP+hdEATo4i9rJB9HJ QDbNhH0oZ98YSCSxODsT5V+wUykHleOu8RFEbhEMV01GFXFRbEbkIJsuRJE7u8Vrt3zL a4Cw== X-Forwarded-Encrypted: i=1; AJvYcCWvTZjf+i7vyBcP59siJvsuFfY/lgYzOBRvNOAHD3P4zyv9Qpvb6s/kVOZxfg6jSvgkjF3Xx4Tfp1jtJWA=@vger.kernel.org X-Gm-Message-State: AOJu0YwmohaQDSkl+3MdvItj4bOCn43Yy3ROYVg1Nbdqk+IhW+Kp8ZHo p03jPESdkLHMDbKBcwqSSHreusSLOgkML0q3gX3xmgja/TZiBbMtHUf03jZmDw== X-Gm-Gg: ASbGncsrr1IZZA0Z5e/n1OFh5thQ3I0Fv7G/rER4Rd3IpMOH97EMLHAS71ifBNT4PyM DybKTj6NvU0NYPGVagW8LzHrXk6rY0nqS2L/nYx8B+qKoOw8TfO4G9buaQL6XFCSW745peAkGUW jeS3J/IoIlO9VG73MKJ1sHb9mwdpo0iJVBTPKIfeKSfqzwszOjSOexbLYX90kCq+TV01o1eWAUI 5648nV5OBSeaC506qhmswm3au32o3DNAZtdBI8bUgEt/dlJWtQX2OYqdrNJCZR6GQYILNHeaioa AH1wtQ1AfgLwjnGCr0W6RSVv4B8bf/p3SmLIojFf+Qgopunz5I8KLEAaLBuvTx/5TA== X-Google-Smtp-Source: AGHT+IEWbBLDqt8daDt8XTdjdKHl7zjnPV3tGAcQZ8yqpswx+3L0zw81Fua6kDJHw31NjGMFcULexg== X-Received: by 2002:a05:6102:e11:b0:4b2:7534:f26e with SMTP id ada2fe7eead31-4b9a525cda5mr13324873137.16.1738583765161; Mon, 03 Feb 2025 03:56:05 -0800 (PST) Received: from denia.c.googlers.com (5.236.236.35.bc.googleusercontent.com. [35.236.236.5]) by smtp.gmail.com with ESMTPSA id ada2fe7eead31-4b9baa9aefcsm1592770137.12.2025.02.03.03.56.03 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 03 Feb 2025 03:56:04 -0800 (PST) From: Ricardo Ribalda Date: Mon, 03 Feb 2025 11:55:47 +0000 Subject: [PATCH v17 11/17] media: uvcvideo: Factor out query_boundaries from query_ctrl 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: <20250203-uvc-roi-v17-11-5900a9fed613@chromium.org> References: <20250203-uvc-roi-v17-0-5900a9fed613@chromium.org> In-Reply-To: <20250203-uvc-roi-v17-0-5900a9fed613@chromium.org> To: Laurent Pinchart , Mauro Carvalho Chehab , Hans de Goede , Sakari Ailus , Hans Verkuil Cc: Yunke Cao , linux-media@vger.kernel.org, linux-kernel@vger.kernel.org, Ricardo Ribalda , Yunke Cao X-Mailer: b4 0.13.0 Split the function in two parts. queryctrl_boundaries will be used in future patches. No functional change expected from this patch. Reviewed-by: Yunke Cao Tested-by: Yunke Cao Reviewed-by: Hans de Goede Signed-off-by: Ricardo Ribalda --- drivers/media/usb/uvc/uvc_ctrl.c | 106 ++++++++++++++++++++++-------------= ---- 1 file changed, 60 insertions(+), 46 deletions(-) diff --git a/drivers/media/usb/uvc/uvc_ctrl.c b/drivers/media/usb/uvc/uvc_c= trl.c index b8bf8ca95747..6e27075939ac 100644 --- a/drivers/media/usb/uvc/uvc_ctrl.c +++ b/drivers/media/usb/uvc/uvc_ctrl.c @@ -1374,53 +1374,11 @@ static u32 uvc_get_ctrl_bitmap(struct uvc_control *= ctrl, return ~0; } =20 -static int __uvc_query_v4l2_ctrl(struct uvc_video_chain *chain, - struct uvc_control *ctrl, - struct uvc_control_mapping *mapping, - struct v4l2_queryctrl *v4l2_ctrl) +static int __uvc_queryctrl_boundaries(struct uvc_video_chain *chain, + struct uvc_control *ctrl, + struct uvc_control_mapping *mapping, + struct v4l2_queryctrl *v4l2_ctrl) { - struct uvc_control_mapping *master_map =3D NULL; - struct uvc_control *master_ctrl =3D NULL; - - memset(v4l2_ctrl, 0, sizeof(*v4l2_ctrl)); - v4l2_ctrl->id =3D mapping->id; - v4l2_ctrl->type =3D mapping->v4l2_type; - strscpy(v4l2_ctrl->name, uvc_map_get_name(mapping), - sizeof(v4l2_ctrl->name)); - v4l2_ctrl->flags =3D 0; - - if (!(ctrl->info.flags & UVC_CTRL_FLAG_GET_CUR)) - v4l2_ctrl->flags |=3D V4L2_CTRL_FLAG_WRITE_ONLY; - if (!(ctrl->info.flags & UVC_CTRL_FLAG_SET_CUR)) - v4l2_ctrl->flags |=3D V4L2_CTRL_FLAG_READ_ONLY; - - if (mapping->master_id) - __uvc_find_control(ctrl->entity, mapping->master_id, - &master_map, &master_ctrl, 0, 0); - if (master_ctrl && (master_ctrl->info.flags & UVC_CTRL_FLAG_GET_CUR)) { - s32 val; - int ret; - - if (WARN_ON(uvc_ctrl_mapping_is_compound(master_map))) - return -EIO; - - ret =3D __uvc_ctrl_get(chain, master_ctrl, master_map, &val); - if (ret < 0) - return ret; - - if (val !=3D mapping->master_manual) - v4l2_ctrl->flags |=3D V4L2_CTRL_FLAG_INACTIVE; - } - - if (v4l2_ctrl->type >=3D V4L2_CTRL_COMPOUND_TYPES) { - v4l2_ctrl->flags |=3D V4L2_CTRL_FLAG_HAS_PAYLOAD; - v4l2_ctrl->default_value =3D 0; - v4l2_ctrl->minimum =3D 0; - v4l2_ctrl->maximum =3D 0; - v4l2_ctrl->step =3D 0; - return 0; - } - if (!ctrl->cached) { int ret =3D uvc_ctrl_populate_cache(chain, ctrl); if (ret < 0) @@ -1464,18 +1422,74 @@ static int __uvc_query_v4l2_ctrl(struct uvc_video_c= hain *chain, if (ctrl->info.flags & UVC_CTRL_FLAG_GET_MIN) v4l2_ctrl->minimum =3D uvc_mapping_get_s32(mapping, UVC_GET_MIN, uvc_ctrl_data(ctrl, UVC_CTRL_DATA_MIN)); + else + v4l2_ctrl->minimum =3D 0; =20 if (ctrl->info.flags & UVC_CTRL_FLAG_GET_MAX) v4l2_ctrl->maximum =3D uvc_mapping_get_s32(mapping, UVC_GET_MAX, uvc_ctrl_data(ctrl, UVC_CTRL_DATA_MAX)); + else + v4l2_ctrl->maximum =3D 0; =20 if (ctrl->info.flags & UVC_CTRL_FLAG_GET_RES) v4l2_ctrl->step =3D uvc_mapping_get_s32(mapping, UVC_GET_RES, uvc_ctrl_data(ctrl, UVC_CTRL_DATA_RES)); + else + v4l2_ctrl->step =3D 0; =20 return 0; } =20 +static int __uvc_query_v4l2_ctrl(struct uvc_video_chain *chain, + struct uvc_control *ctrl, + struct uvc_control_mapping *mapping, + struct v4l2_queryctrl *v4l2_ctrl) +{ + struct uvc_control_mapping *master_map =3D NULL; + struct uvc_control *master_ctrl =3D NULL; + + memset(v4l2_ctrl, 0, sizeof(*v4l2_ctrl)); + v4l2_ctrl->id =3D mapping->id; + v4l2_ctrl->type =3D mapping->v4l2_type; + strscpy(v4l2_ctrl->name, uvc_map_get_name(mapping), + sizeof(v4l2_ctrl->name)); + v4l2_ctrl->flags =3D 0; + + if (!(ctrl->info.flags & UVC_CTRL_FLAG_GET_CUR)) + v4l2_ctrl->flags |=3D V4L2_CTRL_FLAG_WRITE_ONLY; + if (!(ctrl->info.flags & UVC_CTRL_FLAG_SET_CUR)) + v4l2_ctrl->flags |=3D V4L2_CTRL_FLAG_READ_ONLY; + + if (mapping->master_id) + __uvc_find_control(ctrl->entity, mapping->master_id, + &master_map, &master_ctrl, 0, 0); + if (master_ctrl && (master_ctrl->info.flags & UVC_CTRL_FLAG_GET_CUR)) { + s32 val; + int ret; + + if (WARN_ON(uvc_ctrl_mapping_is_compound(master_map))) + return -EIO; + + ret =3D __uvc_ctrl_get(chain, master_ctrl, master_map, &val); + if (ret < 0) + return ret; + + if (val !=3D mapping->master_manual) + v4l2_ctrl->flags |=3D V4L2_CTRL_FLAG_INACTIVE; + } + + if (v4l2_ctrl->type >=3D V4L2_CTRL_COMPOUND_TYPES) { + v4l2_ctrl->flags |=3D V4L2_CTRL_FLAG_HAS_PAYLOAD; + v4l2_ctrl->default_value =3D 0; + v4l2_ctrl->minimum =3D 0; + v4l2_ctrl->maximum =3D 0; + v4l2_ctrl->step =3D 0; + return 0; + } + + return __uvc_queryctrl_boundaries(chain, ctrl, mapping, v4l2_ctrl); +} + int uvc_query_v4l2_ctrl(struct uvc_video_chain *chain, struct v4l2_queryctrl *v4l2_ctrl) { --=20 2.48.1.362.g079036d154-goog From nobody Sun Dec 14 13:49:28 2025 Received: from mail-ua1-f54.google.com (mail-ua1-f54.google.com [209.85.222.54]) (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 3996B20459A for ; Mon, 3 Feb 2025 11:56:08 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.222.54 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1738583770; cv=none; b=HYebLgTJxeFRfTgDw4yn2Ul7kMx7oU0WF1BZFeicANqURXReHnkDqwHgB7ZotmIgmuOWALhLyZOhN1b8Xn9GIrABG3ImaDx9uxZpKqtkJ6LBvgTlO0iVSH2+siASLWtIgK6SCA29hpN7zNlulVat9ghafb8VhhcNvdpcmoi/zyY= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1738583770; c=relaxed/simple; bh=RffajfSqQ9GsgHbbHK+VrpyXrmjLYlz8COh1cGV6mTg=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=nKX22bnP/fnE/tcxOx0P6qvihIZvU3tI4XWQw93KBvQR0ByzdrVIMSql599sdSa4ghe3OW9/lR/Z89RFxL2p3VF7dzaMd2MArVe+Nmb476u875YIFmQHnTlpT3LuLlUDcaVxaOhmSjCAwi4gYwdJtT80wwwS1EIsDA2ElAQx10w= 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=oHZHC95p; arc=none smtp.client-ip=209.85.222.54 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="oHZHC95p" Received: by mail-ua1-f54.google.com with SMTP id a1e0cc1a2514c-85c5d4f3d58so778299241.3 for ; Mon, 03 Feb 2025 03:56:08 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=chromium.org; s=google; t=1738583767; x=1739188567; 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=60gSF4q4NotUR04D9MFkGmquICtPF/Hrtt0pbfyUnfg=; b=oHZHC95py8QyGNYAnULjT7fh0NXsnTcMTbQYHEnwKyKwYw8EQw3Bmv49V8aJF1EFGQ E84wJrcwOKfd7SrsLW7xuzICM+nwkrTisEIAqEjGJ22NUmx6MHBhibM4UZRg7p+334Et PVq+6lSQntT+t3gDVGoayXXo3f/nRlhx8T6tc= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1738583767; x=1739188567; 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=60gSF4q4NotUR04D9MFkGmquICtPF/Hrtt0pbfyUnfg=; b=R/XyToQvKXvSuxw4uS1Pt0sZlj694hU9y7lT+aE1iD9LUNW9JCw3X+UyELLbnmlwlC UAhfeFJMs/jdTdYndY7vOkhUySiI2041yItF1gSMzs0r9Tn/4gDUJd0719tohPs30gy/ 4Qc8rWg8qU5PzPXsY4cCegA3LMmeNeM9ZflXK8QCgaDoWEngabx3uSTSoPoPlQvgRlu/ YtKIcHKzmmciI5tNafYXjoP/FEL0abtDcdhnuNjHdQ8pygLZrzrnx/eCzREoXbZsP3mR KbE21Hmuzs5wtmc24CIZBuz4FHpRm104zkKh/1E9au1IRP/8mqOi5l9POP7hXvvf43q7 kwCA== X-Forwarded-Encrypted: i=1; AJvYcCUaLLqaZ1sblk453ONjn3jsSAXuXuqQD4s6ParWLrclkiJxIs/9oaGHa+TtHss55zwMjJZiCQq7/Sh8/DA=@vger.kernel.org X-Gm-Message-State: AOJu0YykxMvI6qjeUF+OdxZQcw4V/Ppm3qWtRt2PnRjAIrl3dyHgXBg6 LltI2gucT5hWlC/jUDDZ4tFEj6GWA/kqBM2iWeN8Qk739dJRxPDIpRHm4vSn+w== X-Gm-Gg: ASbGncvOlECIO2pZsuTfZUAi3wDzhlKIgxLVPog4GfVRBzz0uXCLFKeKO8qt82wIjm0 3Jp/CHrjoW0H47PZqca/x1NdPqTrWktQYEJDie5X07yYUfGTJMZgwwYmIR3QWL+CeTCdYbH8jOB a3mM7ipbgh/kFv36euYdAWkhbO/GLHexNavNW48aWlOY1uPFhjfMsZ/UdP1v9TsaZwfsjLgnDkw YbpYebY4QhmjXoZq5LUcv0eyPBCLX81j1BPuZ5yINYQzC3EqiUsZXe48oOvr1zy8HUpGiesYXpq vIDkCU+Hfw6t5WpESYo/hVeUsvwQW7HALSI5OV1I1ZYdP4kZ828bUjQYOE/srImp8A== X-Google-Smtp-Source: AGHT+IFdc+vvtfqPGIQ0dOYET8XeiwJkNlOo0hhwFNHh1eon8q9yA3l9hR0ZGEYs7quwOZb8R4dPaQ== X-Received: by 2002:a05:6102:3581:b0:4af:bf45:39a8 with SMTP id ada2fe7eead31-4b9a5237dbbmr13918082137.16.1738583767166; Mon, 03 Feb 2025 03:56:07 -0800 (PST) Received: from denia.c.googlers.com (5.236.236.35.bc.googleusercontent.com. [35.236.236.5]) by smtp.gmail.com with ESMTPSA id ada2fe7eead31-4b9baa9aefcsm1592770137.12.2025.02.03.03.56.05 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 03 Feb 2025 03:56:06 -0800 (PST) From: Ricardo Ribalda Date: Mon, 03 Feb 2025 11:55:48 +0000 Subject: [PATCH v17 12/17] media: uvcvideo: support V4L2_CTRL_WHICH_MIN/MAX_VAL 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: <20250203-uvc-roi-v17-12-5900a9fed613@chromium.org> References: <20250203-uvc-roi-v17-0-5900a9fed613@chromium.org> In-Reply-To: <20250203-uvc-roi-v17-0-5900a9fed613@chromium.org> To: Laurent Pinchart , Mauro Carvalho Chehab , Hans de Goede , Sakari Ailus , Hans Verkuil Cc: Yunke Cao , linux-media@vger.kernel.org, linux-kernel@vger.kernel.org, Ricardo Ribalda , Yunke Cao X-Mailer: b4 0.13.0 From: Yunke Cao Add support for V4L2_CTRL_WHICH_MIN/MAX_VAL in uvc driver. It is needed for the V4L2_CID_UVC_REGION_OF_INTEREST_RECT control. Signed-off-by: Yunke Cao Tested-by: Yunke Cao Reviewed-by: Hans de Goede Signed-off-by: Ricardo Ribalda --- drivers/media/usb/uvc/uvc_ctrl.c | 96 ++++++++++++++++++++++++++++++++----= ---- drivers/media/usb/uvc/uvc_v4l2.c | 2 + 2 files changed, 79 insertions(+), 19 deletions(-) diff --git a/drivers/media/usb/uvc/uvc_ctrl.c b/drivers/media/usb/uvc/uvc_c= trl.c index 6e27075939ac..4e29db334b2d 100644 --- a/drivers/media/usb/uvc/uvc_ctrl.c +++ b/drivers/media/usb/uvc/uvc_ctrl.c @@ -1277,6 +1277,37 @@ static int uvc_query_v4l2_class(struct uvc_video_cha= in *chain, u32 req_id, return 0; } =20 +static bool uvc_ctrl_is_readable(u32 which, struct uvc_control *ctrl, + struct uvc_control_mapping *mapping) +{ + if (which =3D=3D V4L2_CTRL_WHICH_CUR_VAL) + return !!(ctrl->info.flags & UVC_CTRL_FLAG_GET_CUR); + + if (which =3D=3D V4L2_CTRL_WHICH_DEF_VAL) + return !!(ctrl->info.flags & UVC_CTRL_FLAG_GET_DEF); + + /* Types with implicit boundaries. */ + switch (mapping->v4l2_type) { + case V4L2_CTRL_TYPE_MENU: + case V4L2_CTRL_TYPE_BOOLEAN: + case V4L2_CTRL_TYPE_BUTTON: + return true; + case V4L2_CTRL_TYPE_BITMASK: + return (ctrl->info.flags & UVC_CTRL_FLAG_GET_RES) || + (ctrl->info.flags & UVC_CTRL_FLAG_GET_MAX); + default: + break; + } + + if (which =3D=3D V4L2_CTRL_WHICH_MIN_VAL) + return !!(ctrl->info.flags & UVC_CTRL_FLAG_GET_MIN); + + if (which =3D=3D V4L2_CTRL_WHICH_MAX_VAL) + return !!(ctrl->info.flags & UVC_CTRL_FLAG_GET_MAX); + + return false; +} + /* * Check if control @v4l2_id can be accessed by the given control @ioctl * (VIDIOC_G_EXT_CTRLS, VIDIOC_TRY_EXT_CTRLS or VIDIOC_S_EXT_CTRLS). @@ -1295,7 +1326,6 @@ int uvc_ctrl_is_accessible(struct uvc_video_chain *ch= ain, u32 v4l2_id, struct uvc_control *master_ctrl =3D NULL; struct uvc_control_mapping *mapping; struct uvc_control *ctrl; - bool read =3D ioctl =3D=3D VIDIOC_G_EXT_CTRLS; s32 val; int ret; int i; @@ -1307,10 +1337,10 @@ int uvc_ctrl_is_accessible(struct uvc_video_chain *= chain, u32 v4l2_id, if (!ctrl) return -EINVAL; =20 - if (!(ctrl->info.flags & UVC_CTRL_FLAG_GET_CUR) && read) - return -EACCES; + if (ioctl =3D=3D VIDIOC_G_EXT_CTRLS) + return uvc_ctrl_is_readable(ctrls->which, ctrl, mapping); =20 - if (!(ctrl->info.flags & UVC_CTRL_FLAG_SET_CUR) && !read) + if (!(ctrl->info.flags & UVC_CTRL_FLAG_SET_CUR)) return -EACCES; =20 if (ioctl !=3D VIDIOC_S_EXT_CTRLS || !mapping->master_id) @@ -1459,6 +1489,9 @@ static int __uvc_query_v4l2_ctrl(struct uvc_video_cha= in *chain, v4l2_ctrl->flags |=3D V4L2_CTRL_FLAG_WRITE_ONLY; if (!(ctrl->info.flags & UVC_CTRL_FLAG_SET_CUR)) v4l2_ctrl->flags |=3D V4L2_CTRL_FLAG_READ_ONLY; + if ((ctrl->info.flags & UVC_CTRL_FLAG_GET_MAX) && + (ctrl->info.flags & UVC_CTRL_FLAG_GET_MIN)) + v4l2_ctrl->flags |=3D V4L2_CTRL_FLAG_HAS_WHICH_MIN_MAX; =20 if (mapping->master_id) __uvc_find_control(ctrl->entity, mapping->master_id, @@ -2088,16 +2121,18 @@ static int uvc_mapping_get_xctrl_compound(struct uv= c_video_chain *chain, =20 switch (which) { case V4L2_CTRL_WHICH_CUR_VAL: - ret =3D __uvc_ctrl_load_cur(chain, ctrl); - if (ret < 0) - return ret; id =3D UVC_CTRL_DATA_CURRENT; query =3D UVC_GET_CUR; break; + case V4L2_CTRL_WHICH_MIN_VAL: + id =3D UVC_CTRL_DATA_MIN; + query =3D UVC_GET_MIN; + break; + case V4L2_CTRL_WHICH_MAX_VAL: + id =3D UVC_CTRL_DATA_MAX; + query =3D UVC_GET_MAX; + break; case V4L2_CTRL_WHICH_DEF_VAL: - ret =3D uvc_ctrl_populate_cache(chain, ctrl); - if (ret < 0) - return ret; id =3D UVC_CTRL_DATA_DEF; query =3D UVC_GET_DEF; break; @@ -2115,6 +2150,14 @@ static int uvc_mapping_get_xctrl_compound(struct uvc= _video_chain *chain, if (!data) return -ENOMEM; =20 + if (which =3D=3D V4L2_CTRL_WHICH_CUR_VAL) + ret =3D __uvc_ctrl_load_cur(chain, ctrl); + else + ret =3D uvc_ctrl_populate_cache(chain, ctrl); + + if (ret < 0) + return ret; + ret =3D mapping->get(mapping, query, uvc_ctrl_data(ctrl, id), size, data); if (ret < 0) return ret; @@ -2132,22 +2175,37 @@ static int uvc_mapping_get_xctrl_std(struct uvc_vid= eo_chain *chain, struct uvc_control_mapping *mapping, u32 which, struct v4l2_ext_control *xctrl) { + struct v4l2_queryctrl qc; + int ret; + switch (which) { case V4L2_CTRL_WHICH_CUR_VAL: return __uvc_ctrl_get(chain, ctrl, mapping, &xctrl->value); case V4L2_CTRL_WHICH_DEF_VAL: - if (!ctrl->cached) { - int ret =3D uvc_ctrl_populate_cache(chain, ctrl); + case V4L2_CTRL_WHICH_MIN_VAL: + case V4L2_CTRL_WHICH_MAX_VAL: + break; + default: + return -EINVAL; + } =20 - if (ret < 0) - return ret; - } - xctrl->value =3D uvc_mapping_get_s32(mapping, UVC_GET_DEF, - uvc_ctrl_data(ctrl, UVC_CTRL_DATA_DEF)); - return 0; + ret =3D __uvc_queryctrl_boundaries(chain, ctrl, mapping, &qc); + if (ret < 0) + return ret; + + switch (which) { + case V4L2_CTRL_WHICH_DEF_VAL: + xctrl->value =3D qc.default_value; + break; + case V4L2_CTRL_WHICH_MIN_VAL: + xctrl->value =3D qc.minimum; + break; + case V4L2_CTRL_WHICH_MAX_VAL: + xctrl->value =3D qc.maximum; + break; } =20 - return -EINVAL; + return 0; } =20 static int uvc_mapping_get_xctrl(struct uvc_video_chain *chain, diff --git a/drivers/media/usb/uvc/uvc_v4l2.c b/drivers/media/usb/uvc/uvc_v= 4l2.c index 4025811fb9e7..ff7d0fd9e458 100644 --- a/drivers/media/usb/uvc/uvc_v4l2.c +++ b/drivers/media/usb/uvc/uvc_v4l2.c @@ -1036,6 +1036,8 @@ static int uvc_ioctl_g_ext_ctrls(struct file *file, v= oid *fh, switch (ctrls->which) { case V4L2_CTRL_WHICH_DEF_VAL: case V4L2_CTRL_WHICH_CUR_VAL: + case V4L2_CTRL_WHICH_MAX_VAL: + case V4L2_CTRL_WHICH_MIN_VAL: which =3D ctrls->which; break; default: --=20 2.48.1.362.g079036d154-goog From nobody Sun Dec 14 13:49:28 2025 Received: from mail-vk1-f171.google.com (mail-vk1-f171.google.com [209.85.221.171]) (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 9723F2063E1 for ; Mon, 3 Feb 2025 11:56:10 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.221.171 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1738583772; cv=none; b=TwBVVFZCHxnzi2x26xukpfj5Kaa1YX7I5H4UJBa3Y3lN0mm4ysCEnUhUQX62lqyI8fnAZGDmxM51o9Ty3ZoQWQOqljSd6/bi9XnRe+Co14zr8G+TYzhH770OnZkfgD/Nn7LK3nfr3ePH7I0FIBFRJ3kebzmz72p08zb8nku/t2M= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1738583772; c=relaxed/simple; bh=XDJx0T33scoarv55Ada/16pLsRQJjIA/CdDzzum4e2E=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=mDBhnXq1k38m4A50oW1j2KBP/lojWaIYC7ryKzsWxMjuU4IDWsF+qjGH23wUSkCmEwjDiCy+rPcOBVgGdbJHcCes3QPrC0IDJbL/Uj5ZtzJq9rZOIk0ejjt2qqmByEBy4hKwzN4U1T420F/ogw1a7ZRkiCfgZXvMgvsN8GYas5M= 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=EL7wCEHR; arc=none smtp.client-ip=209.85.221.171 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="EL7wCEHR" Received: by mail-vk1-f171.google.com with SMTP id 71dfb90a1353d-51eb181331bso1257899e0c.0 for ; Mon, 03 Feb 2025 03:56:10 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=chromium.org; s=google; t=1738583769; x=1739188569; 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=eCSuaKj/Nx5vcwnNqpNliqFOdiZqLoZIJ7Krw5nQYZo=; b=EL7wCEHRDdMtvAMMZN9/cRSoajjzY4EEht2dtVQPMKfmPfGCJ8j27/8nu4G4IMG5Yt K/Vuln37L++o7WnbTpihMzxvP+cGzIaYU5Bm6KK/Xt8HYwpdrGreIjrCUGEhqdK2P+rr +ZwTAI9B1mcfWL+kciN/u/JjQFHDCjtXRdysY= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1738583769; x=1739188569; 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=eCSuaKj/Nx5vcwnNqpNliqFOdiZqLoZIJ7Krw5nQYZo=; b=qPPchnJmfJUvt27uNcaPpA4AyW8reR4egdbfgAp6pVDu9z+24zmdniYYP6h4xM9ZDP C9JiQ6KK07AfsFiE7FlMB4cay11jeOKH6z98AwfSzyN61Kvj97pKa+iTTIfJmYGhF2JR m0aJy8zRrFtACSujukd8zHortpevmyg8hcJlNphxMZOq05rggSnYiI0rkB8oDRIH6uKq M+H7iC5edXuRLnWidivdGTyIgsoHlKv3uz3eaSs8uoDFg92v6uNsl1vKfKxws2qFXcl0 dz0pQQci6e/mvieId0k/1raYf68+pzPbS7EseVu1s4U68rzacuTi92p+/YPDSss+Vdit bdsA== X-Forwarded-Encrypted: i=1; AJvYcCV9DTbn941DHMiMZ8QtsuEXmvKQDXrj8ny61EiZQ0F4hipNfeIUcrnIAp/nNitg6aVDHTjdkpm0a0ij40o=@vger.kernel.org X-Gm-Message-State: AOJu0Yxq27oAe6XwdD9pM5cTofoIANodw5ZkcwCt5XHw2VMHsSlW827h iCbyiu5TnemQ5mPCizqYLmWO9V0OTLOFNQYdxF7Rfd5T85FTSsGg7s8XEN3JleDzPqDyxqQjZbn Dzg== X-Gm-Gg: ASbGncvsUpl43d8Fk2VtFPCIWy5eWDZQ77a8Ejx0N7QHDrPnSFZskQ4Mf/YwE7vmEvQ T6xxX4ogF3QI4Q9drEphByjuBQMVyGuajyHSrRQl9ZeI4loyNuZH9A4xpZTw4Ukge2lUmmAJDu9 uToYzuQ3o/8iMheykQ1m/jISCOSvp4Nq7TbWiDPmz1vlbfq1y4zkQ7533+rUti72SKw3igjVWRv Y+udhkg287h19MKSQPzvvRaRIO38KsZZNmKL0Sw6HpNKhbqxa7R2g15vgG7orfB7ajsnYkHvrWg ZVL9GW54X3mzCTMttUUPIYVVoNgLthletQIw44rpVqA+6W1aOSAqJ/UNrywYTMXR6A== X-Google-Smtp-Source: AGHT+IGiKPkKkCdl8AzBK7lyBxS49xfhaKnn9hD0wU8c+BzhADHjxPcS/3Jvh90K0/wtUXUuHzQKJQ== X-Received: by 2002:a05:6102:2926:b0:4b6:35c4:6fcd with SMTP id ada2fe7eead31-4b9a4f1d458mr15145086137.7.1738583769361; Mon, 03 Feb 2025 03:56:09 -0800 (PST) Received: from denia.c.googlers.com (5.236.236.35.bc.googleusercontent.com. [35.236.236.5]) by smtp.gmail.com with ESMTPSA id ada2fe7eead31-4b9baa9aefcsm1592770137.12.2025.02.03.03.56.07 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 03 Feb 2025 03:56:08 -0800 (PST) From: Ricardo Ribalda Date: Mon, 03 Feb 2025 11:55:49 +0000 Subject: [PATCH v17 13/17] media: uvcvideo: let v4l2_query_v4l2_ctrl() work with v4l2_query_ext_ctrl 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: <20250203-uvc-roi-v17-13-5900a9fed613@chromium.org> References: <20250203-uvc-roi-v17-0-5900a9fed613@chromium.org> In-Reply-To: <20250203-uvc-roi-v17-0-5900a9fed613@chromium.org> To: Laurent Pinchart , Mauro Carvalho Chehab , Hans de Goede , Sakari Ailus , Hans Verkuil Cc: Yunke Cao , linux-media@vger.kernel.org, linux-kernel@vger.kernel.org, Ricardo Ribalda , Yunke Cao X-Mailer: b4 0.13.0 v4l2_query_ext_ctrl contains information that is missing in v4l2_queryctrl, like elem_size and elems. With this change we can handle all the element_size information inside uvc_ctrl.c. Now that we are at it, remove the memset of the reserved fields, the v4l2 ioctl handler should do that for us. There is no functional change expected from this change. Reviewed-by: Yunke Cao Tested-by: Yunke Cao Reviewed-by: Hans de Goede Signed-off-by: Ricardo Ribalda --- drivers/media/usb/uvc/uvc_ctrl.c | 24 ++++++++++++++---------- drivers/media/usb/uvc/uvc_v4l2.c | 35 +++++++++++++++-------------------- drivers/media/usb/uvc/uvcvideo.h | 2 +- 3 files changed, 30 insertions(+), 31 deletions(-) diff --git a/drivers/media/usb/uvc/uvc_ctrl.c b/drivers/media/usb/uvc/uvc_c= trl.c index 4e29db334b2d..d50137d19561 100644 --- a/drivers/media/usb/uvc/uvc_ctrl.c +++ b/drivers/media/usb/uvc/uvc_ctrl.c @@ -1259,7 +1259,8 @@ static int __uvc_query_v4l2_class(struct uvc_video_ch= ain *chain, u32 req_id, } =20 static int uvc_query_v4l2_class(struct uvc_video_chain *chain, u32 req_id, - u32 found_id, struct v4l2_queryctrl *v4l2_ctrl) + u32 found_id, + struct v4l2_query_ext_ctrl *v4l2_ctrl) { int idx; =20 @@ -1407,7 +1408,7 @@ static u32 uvc_get_ctrl_bitmap(struct uvc_control *ct= rl, static int __uvc_queryctrl_boundaries(struct uvc_video_chain *chain, struct uvc_control *ctrl, struct uvc_control_mapping *mapping, - struct v4l2_queryctrl *v4l2_ctrl) + struct v4l2_query_ext_ctrl *v4l2_ctrl) { if (!ctrl->cached) { int ret =3D uvc_ctrl_populate_cache(chain, ctrl); @@ -1473,7 +1474,7 @@ static int __uvc_queryctrl_boundaries(struct uvc_vide= o_chain *chain, static int __uvc_query_v4l2_ctrl(struct uvc_video_chain *chain, struct uvc_control *ctrl, struct uvc_control_mapping *mapping, - struct v4l2_queryctrl *v4l2_ctrl) + struct v4l2_query_ext_ctrl *v4l2_ctrl) { struct uvc_control_mapping *master_map =3D NULL; struct uvc_control *master_ctrl =3D NULL; @@ -1511,6 +1512,9 @@ static int __uvc_query_v4l2_ctrl(struct uvc_video_cha= in *chain, v4l2_ctrl->flags |=3D V4L2_CTRL_FLAG_INACTIVE; } =20 + v4l2_ctrl->elem_size =3D sizeof(s32); + v4l2_ctrl->elems =3D 1; + if (v4l2_ctrl->type >=3D V4L2_CTRL_COMPOUND_TYPES) { v4l2_ctrl->flags |=3D V4L2_CTRL_FLAG_HAS_PAYLOAD; v4l2_ctrl->default_value =3D 0; @@ -1524,7 +1528,7 @@ static int __uvc_query_v4l2_ctrl(struct uvc_video_cha= in *chain, } =20 int uvc_query_v4l2_ctrl(struct uvc_video_chain *chain, - struct v4l2_queryctrl *v4l2_ctrl) + struct v4l2_query_ext_ctrl *v4l2_ctrl) { struct uvc_control *ctrl; struct uvc_control_mapping *mapping; @@ -1650,7 +1654,7 @@ static void uvc_ctrl_fill_event(struct uvc_video_chai= n *chain, struct uvc_control_mapping *mapping, s32 value, u32 changes) { - struct v4l2_queryctrl v4l2_ctrl; + struct v4l2_query_ext_ctrl v4l2_ctrl; =20 __uvc_query_v4l2_ctrl(chain, ctrl, mapping, &v4l2_ctrl); =20 @@ -2175,7 +2179,7 @@ static int uvc_mapping_get_xctrl_std(struct uvc_video= _chain *chain, struct uvc_control_mapping *mapping, u32 which, struct v4l2_ext_control *xctrl) { - struct v4l2_queryctrl qc; + struct v4l2_query_ext_ctrl qec; int ret; =20 switch (which) { @@ -2189,19 +2193,19 @@ static int uvc_mapping_get_xctrl_std(struct uvc_vid= eo_chain *chain, return -EINVAL; } =20 - ret =3D __uvc_queryctrl_boundaries(chain, ctrl, mapping, &qc); + ret =3D __uvc_queryctrl_boundaries(chain, ctrl, mapping, &qec); if (ret < 0) return ret; =20 switch (which) { case V4L2_CTRL_WHICH_DEF_VAL: - xctrl->value =3D qc.default_value; + xctrl->value =3D qec.default_value; break; case V4L2_CTRL_WHICH_MIN_VAL: - xctrl->value =3D qc.minimum; + xctrl->value =3D qec.minimum; break; case V4L2_CTRL_WHICH_MAX_VAL: - xctrl->value =3D qc.maximum; + xctrl->value =3D qec.maximum; break; } =20 diff --git a/drivers/media/usb/uvc/uvc_v4l2.c b/drivers/media/usb/uvc/uvc_v= 4l2.c index ff7d0fd9e458..41430720ed47 100644 --- a/drivers/media/usb/uvc/uvc_v4l2.c +++ b/drivers/media/usb/uvc/uvc_v4l2.c @@ -963,40 +963,35 @@ static int uvc_ioctl_s_input(struct file *file, void = *fh, unsigned int input) return ret; } =20 -static int uvc_ioctl_queryctrl(struct file *file, void *fh, - struct v4l2_queryctrl *qc) +static int uvc_ioctl_query_ext_ctrl(struct file *file, void *fh, + struct v4l2_query_ext_ctrl *qec) { struct uvc_fh *handle =3D fh; struct uvc_video_chain *chain =3D handle->chain; =20 - return uvc_query_v4l2_ctrl(chain, qc); + return uvc_query_v4l2_ctrl(chain, qec); } =20 -static int uvc_ioctl_query_ext_ctrl(struct file *file, void *fh, - struct v4l2_query_ext_ctrl *qec) +static int uvc_ioctl_queryctrl(struct file *file, void *fh, + struct v4l2_queryctrl *qc) { struct uvc_fh *handle =3D fh; struct uvc_video_chain *chain =3D handle->chain; - struct v4l2_queryctrl qc =3D { qec->id }; + struct v4l2_query_ext_ctrl qec =3D { qc->id }; int ret; =20 - ret =3D uvc_query_v4l2_ctrl(chain, &qc); + ret =3D uvc_query_v4l2_ctrl(chain, &qec); if (ret) return ret; =20 - qec->id =3D qc.id; - qec->type =3D qc.type; - strscpy(qec->name, qc.name, sizeof(qec->name)); - qec->minimum =3D qc.minimum; - qec->maximum =3D qc.maximum; - qec->step =3D qc.step; - qec->default_value =3D qc.default_value; - qec->flags =3D qc.flags; - qec->elem_size =3D 4; - qec->elems =3D 1; - qec->nr_of_dims =3D 0; - memset(qec->dims, 0, sizeof(qec->dims)); - memset(qec->reserved, 0, sizeof(qec->reserved)); + qc->id =3D qec.id; + qc->type =3D qec.type; + strscpy(qc->name, qec.name, sizeof(qc->name)); + qc->minimum =3D qec.minimum; + qc->maximum =3D qec.maximum; + qc->step =3D qec.step; + qc->default_value =3D qec.default_value; + qc->flags =3D qec.flags; =20 return 0; } diff --git a/drivers/media/usb/uvc/uvcvideo.h b/drivers/media/usb/uvc/uvcvi= deo.h index 2f9a1bf8b48a..6fc1cb9e99d1 100644 --- a/drivers/media/usb/uvc/uvcvideo.h +++ b/drivers/media/usb/uvc/uvcvideo.h @@ -771,7 +771,7 @@ void uvc_status_put(struct uvc_device *dev); extern const struct v4l2_subscribed_event_ops uvc_ctrl_sub_ev_ops; =20 int uvc_query_v4l2_ctrl(struct uvc_video_chain *chain, - struct v4l2_queryctrl *v4l2_ctrl); + struct v4l2_query_ext_ctrl *v4l2_ctrl); int uvc_query_v4l2_menu(struct uvc_video_chain *chain, struct v4l2_querymenu *query_menu); =20 --=20 2.48.1.362.g079036d154-goog From nobody Sun Dec 14 13:49:28 2025 Received: from mail-ua1-f49.google.com (mail-ua1-f49.google.com [209.85.222.49]) (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 C532B2066CB for ; Mon, 3 Feb 2025 11:56:12 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.222.49 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1738583774; cv=none; b=h929cUpBZNH6jwqk+AjnvWHX/DqN1MtZdqvhT7IVi0L4YnJ8pm+jtj3CwyCK47xZCY3r40AzppLU/g/kgFOaWxvWyKs1ACul+vH7YUqjkYQ60JMZ/I9D2k25ZBGFo/3eZ/3dGen0yRoMwQG1drPDi5HY5LsQJLG2HaOUJZ0mLss= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1738583774; c=relaxed/simple; bh=6OqJ4t4D9TpNI+/c8tdRJ8rTXZIpervnpprgIzahFh4=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=Zi6HORpJ1zy1BGrgV8N4aHNHxjZfiR00M0yXcPkOPRwwcnItRmUANw1ON0pqE2gXamzXPWMg1zrb82LkyNXQ+c6DhCZnNDmveQlO8NLb6/e3hBcVadxdq/7vkDLhXJIyOrwwxWX5K65DHzf1N3xygb8sRESep1nfABpGnshtQBE= 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=bUoD26cB; arc=none smtp.client-ip=209.85.222.49 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="bUoD26cB" Received: by mail-ua1-f49.google.com with SMTP id a1e0cc1a2514c-85c436db302so2302219241.0 for ; Mon, 03 Feb 2025 03:56:12 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=chromium.org; s=google; t=1738583772; x=1739188572; 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=fIX2uAxqRPBLuXs0GvusMBked4RKndtatnuu6L3lKtc=; b=bUoD26cBGAs0PdMdYSqs3E3s7TseZOvqBi57iK7klaZ63m6ZDOfgoog0EIM2oLmUmE +GKP7deWY3Yp6Gs+dmIaD/5jM8EsgpwPoyuPWX0yIgykMWxpaao1S7VaZiLgPUVcDszG tS+vhNV56/HG6aEOv0YrwSzfrauXXsLaHaP9Y= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1738583772; x=1739188572; 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=fIX2uAxqRPBLuXs0GvusMBked4RKndtatnuu6L3lKtc=; b=uzb6mYHCPxsG//NI5ez8N57KVF9YfLizqMZkWF1OlTbVK/VLjTW5aLj9hyv8ndHlnt JDQkgtxKRoSmeM+1YHbY25vc0kUO/5WCv4UQY6uHOa5BqKhjvcWCjAtk5ddWJv4eoRMl rnPm8jE8LX4SYANkLIOU1MZuRGfAUcT5bIYLMwxAXw34v5O9aJe0vYR5ApSRARkgeK1i vpokpIzNLkQcyRM63AbUEdwqVmVdO2s8hCXVMowRXhXjmjgl1Kkr4Mx7WgILN7O1GCEi ip6PkNHzRDdvDM4zb4i4iG2o0+z/NrvvCWLNSMYc5x+a/67wxc/5fzjECyNlrIRUbSsB 7TRQ== X-Forwarded-Encrypted: i=1; AJvYcCU60xn4sz0kbjs6qTFsaBvON1N0QYJn7Jyth8b/bzf2aMVOY/CqMurSF4SlaFoBVlqe2XOvJuSKoMQsHSo=@vger.kernel.org X-Gm-Message-State: AOJu0YwzLfiiGu6rydkY0qWqh1QcGA5k+4ENBhZweq7xFAkQ899kwRjp VMnLEbgqRR/N5yVbAjYQJalFHHHCYF/xdVtsCkA7NtqdxAZe8ulUJn7wI+8iag== X-Gm-Gg: ASbGncuM/dg85GdXks+KH2PXX3eVUuBu5ROGxWCRbXILAbW1vCzhulmwD2FNc2W4PJG h5D6itknNO7R4c92ZMbp0iX6VSyfbAKjmH6H45rWbaOw8v1upPCv+x+N7WqbXi4/k93a1elaBqQ 8AHn3aztjTyzSZ9kAfSpxoGher/6P0jJglOwNxLnJYoVzV7IRA4RMnmTeTQSgH11CwdE2sMJl8R mHkYYbDhmwX+iFfjXI4Rhnqm2OrqsuG44w47z2CegO6E6JxlUTHD/MbBCfLFShUkkd8/FaVG2gv yhSdnd0MNh87U/oqKsPnE2TQZBC8ia9+fzy48Gmy/K3JT1eOlemkMq6uPJpFzXfyEQ== X-Google-Smtp-Source: AGHT+IH2ZsZ+lbBQnlfcNNHd5u82CT5JuG2EshCnjTuVYj98ALBGeh6RaE9Vvonn6P/Yd42u1O28Fg== X-Received: by 2002:a05:6102:94f:b0:4af:f809:5162 with SMTP id ada2fe7eead31-4b9b7077f33mr9674340137.3.1738583771399; Mon, 03 Feb 2025 03:56:11 -0800 (PST) Received: from denia.c.googlers.com (5.236.236.35.bc.googleusercontent.com. [35.236.236.5]) by smtp.gmail.com with ESMTPSA id ada2fe7eead31-4b9baa9aefcsm1592770137.12.2025.02.03.03.56.09 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 03 Feb 2025 03:56:10 -0800 (PST) From: Ricardo Ribalda Date: Mon, 03 Feb 2025 11:55:50 +0000 Subject: [PATCH v17 14/17] media: uvcvideo: Introduce uvc_mapping_v4l2_size 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: <20250203-uvc-roi-v17-14-5900a9fed613@chromium.org> References: <20250203-uvc-roi-v17-0-5900a9fed613@chromium.org> In-Reply-To: <20250203-uvc-roi-v17-0-5900a9fed613@chromium.org> To: Laurent Pinchart , Mauro Carvalho Chehab , Hans de Goede , Sakari Ailus , Hans Verkuil Cc: Yunke Cao , linux-media@vger.kernel.org, linux-kernel@vger.kernel.org, Ricardo Ribalda , Yunke Cao X-Mailer: b4 0.13.0 Centralize the calculation for the v4l2_size of a mapping. Reviewed-by: Yunke Cao Tested-by: Yunke Cao Reviewed-by: Hans de Goede Signed-off-by: Ricardo Ribalda --- drivers/media/usb/uvc/uvc_ctrl.c | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/drivers/media/usb/uvc/uvc_ctrl.c b/drivers/media/usb/uvc/uvc_c= trl.c index d50137d19561..17a7ce525f71 100644 --- a/drivers/media/usb/uvc/uvc_ctrl.c +++ b/drivers/media/usb/uvc/uvc_ctrl.c @@ -1471,6 +1471,14 @@ static int __uvc_queryctrl_boundaries(struct uvc_vid= eo_chain *chain, return 0; } =20 +static size_t uvc_mapping_v4l2_size(struct uvc_control_mapping *mapping) +{ + if (uvc_ctrl_mapping_is_compound(mapping)) + return DIV_ROUND_UP(mapping->size, 8); + + return sizeof(s32); +} + static int __uvc_query_v4l2_ctrl(struct uvc_video_chain *chain, struct uvc_control *ctrl, struct uvc_control_mapping *mapping, @@ -1512,7 +1520,7 @@ static int __uvc_query_v4l2_ctrl(struct uvc_video_cha= in *chain, v4l2_ctrl->flags |=3D V4L2_CTRL_FLAG_INACTIVE; } =20 - v4l2_ctrl->elem_size =3D sizeof(s32); + v4l2_ctrl->elem_size =3D uvc_mapping_v4l2_size(mapping); v4l2_ctrl->elems =3D 1; =20 if (v4l2_ctrl->type >=3D V4L2_CTRL_COMPOUND_TYPES) { @@ -2144,7 +2152,7 @@ static int uvc_mapping_get_xctrl_compound(struct uvc_= video_chain *chain, return -EINVAL; } =20 - size =3D DIV_ROUND_UP(mapping->size, 8); + size =3D uvc_mapping_v4l2_size(mapping); if (xctrl->size < size) { xctrl->size =3D size; return -ENOSPC; @@ -2327,9 +2335,8 @@ static int uvc_mapping_set_xctrl_compound(struct uvc_= control *ctrl, struct v4l2_ext_control *xctrl) { u8 *data __free(kfree) =3D NULL; - size_t size; + size_t size =3D uvc_mapping_v4l2_size(mapping); =20 - size =3D DIV_ROUND_UP(mapping->size, 8); if (xctrl->size !=3D size) return -EINVAL; =20 --=20 2.48.1.362.g079036d154-goog From nobody Sun Dec 14 13:49:28 2025 Received: from mail-ua1-f47.google.com (mail-ua1-f47.google.com [209.85.222.47]) (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 3646D206F2A for ; Mon, 3 Feb 2025 11:56:15 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.222.47 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1738583776; cv=none; b=iHzQ1DfVOUGcWnTngzIQ+s/Ph/4dixHrnvzt3QxKrJ6eJ4SMITpQU0lq7oALFDB6JG4c7SG5rR/s6hZLPVLcJKQ87mC7Ngh9mwPQ4b2yTTi1lTefHv2qHRrTktHuyOOT7VKLnkXGQXfqqmLJ+NF8WB7tp5qvdOKCipIVU959s+Y= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1738583776; c=relaxed/simple; bh=KB4ZUGflb08SBeygnOriQPhddguTjGuBK5bS60Mly+s=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=ICPGj4zUZb4DnoB9NWWpC1I/yCZzoKAv0b9PEAlbkk2PnU1ocf7/6taAFREkiclPaUs5+nim8YL+kcVMF4KqhI6v/91g/qenT3llx817gotmQOpzlVCR0ZVvLDqb9uYM9f5T2n1leTeWzjdG14h0k9RRseQo1QuP5lvc+kIDBmM= 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=BuHiA6+t; arc=none smtp.client-ip=209.85.222.47 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="BuHiA6+t" Received: by mail-ua1-f47.google.com with SMTP id a1e0cc1a2514c-85bad9e0214so1929586241.3 for ; Mon, 03 Feb 2025 03:56:14 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=chromium.org; s=google; t=1738583774; x=1739188574; 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=mVo9C3QqUMMv3jC7pdvKHUdadHQxzjv5Xy2z0Ro/wJ8=; b=BuHiA6+tCAkTp5VWxnnrfZk6zYzFhBEdAAmmjlesZr+wjiGXlHybfttiHIol3jXSFx 43FL+n/fqZ8BgkzMdWB5ciKZtoec8MjcXpMY3EiR4KsHL/xnEh34MqPq19ZY083W4s3R GOcET6Bv5OCsqZNExw72bcO8VrCa0KnUGTSaQ= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1738583774; x=1739188574; 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=mVo9C3QqUMMv3jC7pdvKHUdadHQxzjv5Xy2z0Ro/wJ8=; b=b4N9KwUxQqvvs77xiYrH3hSEpWHfGOFCi9Xzy1s3DFVL8F53dUwkCG8ciUwOVDHIR6 yuLVoWKvbjKHV2ArfBSmZUOd5Ck5Ih64CR4k4A2PHxUcp2We94yEx5ZJIZGDSt22FOeV fLIi16SwszwKaHNr3DDRUYGdWYyLnDac18+1ca8G1JxBj+/He3XFlVq/lEoYUaWi74bn 5jGcaUOqXeMFf+zetZWMr7+NILFvqFMb1BChjFLsEa4wwV8CjIgqS3J5U1zwmVi1TAVP ztnoPRHHj7xAwMWYL2CQZKniORz6G+dqJihSU55XJx92Vx8QMGHIvHHFJuuqs68EYE5P 7G3g== X-Forwarded-Encrypted: i=1; AJvYcCVDWHFkgXpoNb+tsyMxlU7rGGAZboBPI+DUHZCVU79yuvMnK7Nvyd/0DlKXlYgBrDDlijvCbBdAxkeAIcw=@vger.kernel.org X-Gm-Message-State: AOJu0Yykq4g4YBm8X65jUEm7RWzezs2gd3TSWEA2qsnqbKZZq8xB+yw1 tATzXzK/DB2zMJZSlAS2pk3LNqp7Uvm1LFNg/fMUQlc33uxrIw6ApjUGnnCi+w== X-Gm-Gg: ASbGncuFZupjbI6KTX/h0ROwAxxsiadVfftX6HzBk42FbF+wFweccS5h5xaaY2yLLWO ZIr88/EdLlPrnAl4DSPirbO0AlHk2t6ZxPJ3Rx/u6xoNUjZl4L04NpeGM6t/qQ7E9Nv5ZiTdNsl H6CQkC8xnHE9sSiF21SPPlP91eClrCFJYYYNOQ1ZEotI2l5YxCbrkLy4Z7ap10fYtR/Qyn8YAGZ 9Lr6T43Gem9xX6+dL7dnd7YCBcbaorIqThHakbd2APKD3oRoj+bL4RcMqbXL9rFtN4WyvAfUvFH 5EDN7ZblcepkAU49QNtK1JjO+fe+9gPXyTA+n0+uBrKbuo/6NU/JECMcEwwaCfKavg== X-Google-Smtp-Source: AGHT+IHjiL4llIOfHY0i/Ml1ATfZuAes12e1J4qhFMEy3cP2BZEcsCtof6ekuCPTEJTO80oewTtWfw== X-Received: by 2002:a05:6102:1041:b0:4ba:b6:647c with SMTP id ada2fe7eead31-4ba00b68182mr209477137.10.1738583774051; Mon, 03 Feb 2025 03:56:14 -0800 (PST) Received: from denia.c.googlers.com (5.236.236.35.bc.googleusercontent.com. [35.236.236.5]) by smtp.gmail.com with ESMTPSA id ada2fe7eead31-4b9baa9aefcsm1592770137.12.2025.02.03.03.56.11 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 03 Feb 2025 03:56:12 -0800 (PST) From: Ricardo Ribalda Date: Mon, 03 Feb 2025 11:55:51 +0000 Subject: [PATCH v17 15/17] media: uvcvideo: Add sanity check to uvc_ioctl_xu_ctrl_map 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: <20250203-uvc-roi-v17-15-5900a9fed613@chromium.org> References: <20250203-uvc-roi-v17-0-5900a9fed613@chromium.org> In-Reply-To: <20250203-uvc-roi-v17-0-5900a9fed613@chromium.org> To: Laurent Pinchart , Mauro Carvalho Chehab , Hans de Goede , Sakari Ailus , Hans Verkuil Cc: Yunke Cao , linux-media@vger.kernel.org, linux-kernel@vger.kernel.org, Ricardo Ribalda , Yunke Cao X-Mailer: b4 0.13.0 Do not process unknown data types. Tested-by: Yunke Cao Reviewed-by: Hans de Goede Signed-off-by: Ricardo Ribalda --- drivers/media/usb/uvc/uvc_v4l2.c | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/drivers/media/usb/uvc/uvc_v4l2.c b/drivers/media/usb/uvc/uvc_v= 4l2.c index 41430720ed47..d56f482723d3 100644 --- a/drivers/media/usb/uvc/uvc_v4l2.c +++ b/drivers/media/usb/uvc/uvc_v4l2.c @@ -108,6 +108,12 @@ static int uvc_ioctl_xu_ctrl_map(struct uvc_video_chai= n *chain, struct uvc_control_mapping *map; int ret; =20 + if (xmap->data_type > UVC_CTRL_DATA_TYPE_BITMASK) { + uvc_dbg(chain->dev, CONTROL, + "Unsupported UVC data type %u\n", xmap->data_type); + return -EINVAL; + } + map =3D kzalloc(sizeof(*map), GFP_KERNEL); if (map =3D=3D NULL) return -ENOMEM; --=20 2.48.1.362.g079036d154-goog From nobody Sun Dec 14 13:49:28 2025 Received: from mail-vs1-f48.google.com (mail-vs1-f48.google.com [209.85.217.48]) (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 7DBA12063F4 for ; Mon, 3 Feb 2025 11:56:17 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.217.48 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1738583779; cv=none; b=M5Yc8U5eLp+zPXsa2usIJAkSEQMoKFtj7hu9CvfZKtm0ovbb2wotkOJRsDoRIVL+Ng99XQHRycBWL59sO74OVouxNv1W5G1akF0HrsIYzJzVFY4vuZ00U0CJ2cqEpmj13ZlLSZM9+Bqqlcry0Sx40pyvvfn4PrqOWAz6ul/Lfps= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1738583779; c=relaxed/simple; bh=uoDgA7Ask5lby9P/39d4vN4hW7FdsMBOxZqNa+PJc8U=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=lXD8CI5oOhasXbe7uAIeywa41Vgb9oNFE8/CW5RxKJE8ZDrPfzl96MMYmbyS6cGfApi2U/qDBedc4QY5UIwE+vOShP1lnGlTnRADXoDf1VykS+hlAyOSEvzXyZ9OF1zXXG//EFLSeEC2Sos5F+pMLAA59ynJ9qL/nYexQ6l2Vvs= 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=KA6Et9/O; arc=none smtp.client-ip=209.85.217.48 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="KA6Et9/O" Received: by mail-vs1-f48.google.com with SMTP id ada2fe7eead31-4aff78a39e1so1185203137.1 for ; Mon, 03 Feb 2025 03:56:17 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=chromium.org; s=google; t=1738583776; x=1739188576; 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=vFYRGeCzJOfJUKMdvCEhAtCULTSQXsTNlkRTO/9J5mE=; b=KA6Et9/Ocl1X+iX4QwtUvFgjMfZ0jbtdx2N7LjnbLV3kSyeGY/q/mcTmyMK7PMVd4i q/pP8+9ZFQzAf74PsspPSFMEhHbXgPI7+vBPNpUx6ySpn/swwVHgigqVjpTtifGrRx+/ drDERKJ4UiF76wbare4HzlQ261rOsgj9MuHBE= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1738583776; x=1739188576; 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=vFYRGeCzJOfJUKMdvCEhAtCULTSQXsTNlkRTO/9J5mE=; b=v5zuMRivqCEBPeK7GM2CJXug4m796zTeXTh0Xcn2Do+npARwz1czFn/Yc8vk0IUqgP YJPdBPPCDC1MeMtlS/ZA2iQ41gvvP8R8smKs9/kBd7Msw6poIVNNxMFyrETrqOOVA8mC aBDg9gd00+JqTKfeU1d6TyR6EI0EocVoW/vFZSTLJjbjxBM29zI8jEcRWeBhRXLa8DDR pNAB2kzYYgy5WgWSalWK2ChTcYw97EjQ3A/4bI4WWVaBGxtiNtduf6ExL6tRpMuyNoS3 yAG3fRsDOgv+s+6hPFeXgwJXaXQYbYQWT5RwXUsK4/I/EiJpIZXI06PLg3ym7ZMC5Dbe o15w== X-Forwarded-Encrypted: i=1; AJvYcCUwhFBUDuuK7AWtcn3sDTFyhFxRquqe7q0XbSimQBrmj9SW0Txl91+39lVzsGER/2yoOmdyQaGG8i3LUI4=@vger.kernel.org X-Gm-Message-State: AOJu0YxW0sbufk9fBHFfdWkpwwfct4RGmi3kIGhqptwFGC2WiS8X7fWh ABuZU/GqQ6bpDy9sMm3tWteOZUzBDxYUNWZNTucLBz3/gY+7jNAFDX4oK4UQyw== X-Gm-Gg: ASbGncvEbbU0JMdsxTjutzTuCHe/w8M4oHv668qkkkQpUcALv1Gzm1Wk1HnPnciRQj+ HCLs7AgnEcOhCoP109pdsl8d/xZxHs/tL7R1Smi3ltInLmwJx2C9ZY2O2NGcshs1w1NM1dJ8Zeh mhYZD7RMTWfq0LYeHzbqll/esRIipm5o1CUYzppdnofgHIWnAEKwD/LkVqCrIjUTWRvSRqeEBxA zvmSa7pFLksfifaoel6ZXKsrG2Cwhy+cUZ1svah5E65f7Y8kEt4zEJuaNASbLfVXEstMa7kFnJk uZz/URG1NgPIRHSVMeo21fODdvUMNyA/V79AXCbuMIIKfBCIBabv/DQLl+McuvJwXw== X-Google-Smtp-Source: AGHT+IHYtVnOP1UvTNuLIrRZJBooMq5HXe0ZnaNjRqi/l+lz2Cce4XN8mYqgW8JXX1ukyajHXr1Qew== X-Received: by 2002:a05:6102:3ed0:b0:4b4:6988:b12b with SMTP id ada2fe7eead31-4b9a523c972mr14865751137.23.1738583776355; Mon, 03 Feb 2025 03:56:16 -0800 (PST) Received: from denia.c.googlers.com (5.236.236.35.bc.googleusercontent.com. [35.236.236.5]) by smtp.gmail.com with ESMTPSA id ada2fe7eead31-4b9baa9aefcsm1592770137.12.2025.02.03.03.56.14 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 03 Feb 2025 03:56:15 -0800 (PST) From: Ricardo Ribalda Date: Mon, 03 Feb 2025 11:55:52 +0000 Subject: [PATCH v17 16/17] media: uvcvideo: implement UVC v1.5 ROI 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: <20250203-uvc-roi-v17-16-5900a9fed613@chromium.org> References: <20250203-uvc-roi-v17-0-5900a9fed613@chromium.org> In-Reply-To: <20250203-uvc-roi-v17-0-5900a9fed613@chromium.org> To: Laurent Pinchart , Mauro Carvalho Chehab , Hans de Goede , Sakari Ailus , Hans Verkuil Cc: Yunke Cao , linux-media@vger.kernel.org, linux-kernel@vger.kernel.org, Ricardo Ribalda , Yunke Cao X-Mailer: b4 0.13.0 From: Yunke Cao Implement support for ROI as described in UVC 1.5: 4.2.2.1.20 Digital Region of Interest (ROI) Control ROI control is implemented using V4L2 control API as two UVC-specific controls: V4L2_CID_UVC_REGION_OF_INTEREST_RECT and V4L2_CID_UVC_REGION_OF_INTEREST_AUTO. Reviewed-by: Ricardo Ribalda Signed-off-by: Yunke Cao Reviewed-by: Yunke Cao Tested-by: Yunke Cao Reviewed-by: Hans de Goede Signed-off-by: Ricardo Ribalda Signed-off-by: Ricardo Ribalda --- drivers/media/usb/uvc/uvc_ctrl.c | 81 ++++++++++++++++++++++++++++++++++= ++++ drivers/media/usb/uvc/uvcvideo.h | 7 ++++ include/uapi/linux/usb/video.h | 1 + include/uapi/linux/uvcvideo.h | 13 ++++++ include/uapi/linux/v4l2-controls.h | 7 ++++ 5 files changed, 109 insertions(+) diff --git a/drivers/media/usb/uvc/uvc_ctrl.c b/drivers/media/usb/uvc/uvc_c= trl.c index 17a7ce525f71..1906ce5b7d50 100644 --- a/drivers/media/usb/uvc/uvc_ctrl.c +++ b/drivers/media/usb/uvc/uvc_ctrl.c @@ -358,6 +358,24 @@ static const struct uvc_control_info uvc_ctrls[] =3D { .flags =3D UVC_CTRL_FLAG_GET_CUR | UVC_CTRL_FLAG_AUTO_UPDATE, }, + /* + * UVC_CTRL_FLAG_AUTO_UPDATE is needed because the RoI may get updated + * by sensors. + * "This RoI should be the same as specified in most recent SET_CUR + * except in the case where the =E2=80=98Auto Detect and Track=E2=80=99 a= nd/or + * =E2=80=98Image Stabilization=E2=80=99 bit have been set." + * 4.2.2.1.20 Digital Region of Interest (ROI) Control + */ + { + .entity =3D UVC_GUID_UVC_CAMERA, + .selector =3D UVC_CT_REGION_OF_INTEREST_CONTROL, + .index =3D 21, + .size =3D 10, + .flags =3D UVC_CTRL_FLAG_SET_CUR | UVC_CTRL_FLAG_GET_CUR + | UVC_CTRL_FLAG_GET_MIN | UVC_CTRL_FLAG_GET_MAX + | UVC_CTRL_FLAG_GET_DEF + | UVC_CTRL_FLAG_AUTO_UPDATE, + }, }; =20 static const u32 uvc_control_classes[] =3D { @@ -603,6 +621,44 @@ static const struct uvc_control_mapping *uvc_ctrl_filt= er_plf_mapping( return out_mapping; } =20 +static int uvc_get_rect(struct uvc_control_mapping *mapping, u8 query, + const void *uvc_in, size_t v4l2_size, void *v4l2_out) +{ + const struct uvc_rect *uvc_rect =3D uvc_in; + struct v4l2_rect *v4l2_rect =3D v4l2_out; + + if (WARN_ON(v4l2_size !=3D sizeof(struct v4l2_rect))) + return -EINVAL; + + if (uvc_rect->left > uvc_rect->right || + uvc_rect->top > uvc_rect->bottom) + return -EIO; + + v4l2_rect->top =3D uvc_rect->top; + v4l2_rect->left =3D uvc_rect->left; + v4l2_rect->height =3D uvc_rect->bottom - uvc_rect->top + 1; + v4l2_rect->width =3D uvc_rect->right - uvc_rect->left + 1; + + return 0; +} + +static int uvc_set_rect(struct uvc_control_mapping *mapping, size_t v4l2_s= ize, + const void *v4l2_in, void *uvc_out) +{ + struct uvc_rect *uvc_rect =3D uvc_out; + const struct v4l2_rect *v4l2_rect =3D v4l2_in; + + if (WARN_ON(v4l2_size !=3D sizeof(struct v4l2_rect))) + return -EINVAL; + + uvc_rect->top =3D min(0xffff, v4l2_rect->top); + uvc_rect->left =3D min(0xffff, v4l2_rect->left); + uvc_rect->bottom =3D min(0xffff, v4l2_rect->top + v4l2_rect->height - 1); + uvc_rect->right =3D min(0xffff, v4l2_rect->left + v4l2_rect->width - 1); + + return 0; +} + static const struct uvc_control_mapping uvc_ctrl_mappings[] =3D { { .id =3D V4L2_CID_BRIGHTNESS, @@ -897,6 +953,28 @@ static const struct uvc_control_mapping uvc_ctrl_mappi= ngs[] =3D { .selector =3D UVC_PU_POWER_LINE_FREQUENCY_CONTROL, .filter_mapping =3D uvc_ctrl_filter_plf_mapping, }, + { + .id =3D V4L2_CID_UVC_REGION_OF_INTEREST_RECT, + .entity =3D UVC_GUID_UVC_CAMERA, + .selector =3D UVC_CT_REGION_OF_INTEREST_CONTROL, + .size =3D sizeof(struct uvc_rect) * 8, + .offset =3D 0, + .v4l2_type =3D V4L2_CTRL_TYPE_RECT, + .data_type =3D UVC_CTRL_DATA_TYPE_RECT, + .get =3D uvc_get_rect, + .set =3D uvc_set_rect, + .name =3D "Region Of Interest Rectangle", + }, + { + .id =3D V4L2_CID_UVC_REGION_OF_INTEREST_AUTO, + .entity =3D UVC_GUID_UVC_CAMERA, + .selector =3D UVC_CT_REGION_OF_INTEREST_CONTROL, + .size =3D 16, + .offset =3D 64, + .v4l2_type =3D V4L2_CTRL_TYPE_BITMASK, + .data_type =3D UVC_CTRL_DATA_TYPE_BITMASK, + .name =3D "Region Of Interest Auto Controls", + }, }; =20 /* ------------------------------------------------------------------------ @@ -1473,6 +1551,9 @@ static int __uvc_queryctrl_boundaries(struct uvc_vide= o_chain *chain, =20 static size_t uvc_mapping_v4l2_size(struct uvc_control_mapping *mapping) { + if (mapping->v4l2_type =3D=3D V4L2_CTRL_TYPE_RECT) + return sizeof(struct v4l2_rect); + if (uvc_ctrl_mapping_is_compound(mapping)) return DIV_ROUND_UP(mapping->size, 8); =20 diff --git a/drivers/media/usb/uvc/uvcvideo.h b/drivers/media/usb/uvc/uvcvi= deo.h index 6fc1cb9e99d1..b63720e21075 100644 --- a/drivers/media/usb/uvc/uvcvideo.h +++ b/drivers/media/usb/uvc/uvcvideo.h @@ -543,6 +543,13 @@ struct uvc_device_info { u16 uvc_version; }; =20 +struct uvc_rect { + u16 top; + u16 left; + u16 bottom; + u16 right; +} __packed; + struct uvc_status_streaming { u8 button; } __packed; diff --git a/include/uapi/linux/usb/video.h b/include/uapi/linux/usb/video.h index 526b5155e23c..e1d9f5773187 100644 --- a/include/uapi/linux/usb/video.h +++ b/include/uapi/linux/usb/video.h @@ -104,6 +104,7 @@ #define UVC_CT_ROLL_ABSOLUTE_CONTROL 0x0f #define UVC_CT_ROLL_RELATIVE_CONTROL 0x10 #define UVC_CT_PRIVACY_CONTROL 0x11 +#define UVC_CT_REGION_OF_INTEREST_CONTROL 0x14 =20 /* A.9.5. Processing Unit Control Selectors */ #define UVC_PU_CONTROL_UNDEFINED 0x00 diff --git a/include/uapi/linux/uvcvideo.h b/include/uapi/linux/uvcvideo.h index f86185456dc5..cbe15bca9569 100644 --- a/include/uapi/linux/uvcvideo.h +++ b/include/uapi/linux/uvcvideo.h @@ -16,6 +16,7 @@ #define UVC_CTRL_DATA_TYPE_BOOLEAN 3 #define UVC_CTRL_DATA_TYPE_ENUM 4 #define UVC_CTRL_DATA_TYPE_BITMASK 5 +#define UVC_CTRL_DATA_TYPE_RECT 6 =20 /* Control flags */ #define UVC_CTRL_FLAG_SET_CUR (1 << 0) @@ -38,6 +39,18 @@ =20 #define UVC_MENU_NAME_LEN 32 =20 +/* V4L2 driver-specific controls */ +#define V4L2_CID_UVC_REGION_OF_INTEREST_RECT (V4L2_CID_USER_UVC_BASE + 1) +#define V4L2_CID_UVC_REGION_OF_INTEREST_AUTO (V4L2_CID_USER_UVC_BASE + 2) +#define V4L2_UVC_REGION_OF_INTEREST_AUTO_EXPOSURE (1 << 0) +#define V4L2_UVC_REGION_OF_INTEREST_AUTO_IRIS (1 << 1) +#define V4L2_UVC_REGION_OF_INTEREST_AUTO_WHITE_BALANCE (1 << 2) +#define V4L2_UVC_REGION_OF_INTEREST_AUTO_FOCUS (1 << 3) +#define V4L2_UVC_REGION_OF_INTEREST_AUTO_FACE_DETECT (1 << 4) +#define V4L2_UVC_REGION_OF_INTEREST_AUTO_DETECT_AND_TRACK (1 << 5) +#define V4L2_UVC_REGION_OF_INTEREST_AUTO_IMAGE_STABILIZATION (1 << 6) +#define V4L2_UVC_REGION_OF_INTEREST_AUTO_HIGHER_QUALITY (1 << 7) + struct uvc_menu_info { __u32 value; __u8 name[UVC_MENU_NAME_LEN]; diff --git a/include/uapi/linux/v4l2-controls.h b/include/uapi/linux/v4l2-c= ontrols.h index 974fd254e573..72e32814ea83 100644 --- a/include/uapi/linux/v4l2-controls.h +++ b/include/uapi/linux/v4l2-controls.h @@ -215,6 +215,13 @@ enum v4l2_colorfx { */ #define V4L2_CID_USER_THP7312_BASE (V4L2_CID_USER_BASE + 0x11c0) =20 +/* + * The base for the uvc driver controls. + * See linux/uvcvideo.h for the list of controls. + * We reserve 64 controls for this driver. + */ +#define V4L2_CID_USER_UVC_BASE (V4L2_CID_USER_BASE + 0x11e0) + /* MPEG-class control IDs */ /* The MPEG controls are applicable to all codec controls * and the 'MPEG' part of the define is historical */ --=20 2.48.1.362.g079036d154-goog From nobody Sun Dec 14 13:49:28 2025 Received: from mail-ua1-f41.google.com (mail-ua1-f41.google.com [209.85.222.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 966F3207A0F for ; Mon, 3 Feb 2025 11:56:19 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.222.41 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1738583781; cv=none; b=XaQkIHdnDoAycxWNzClbDJrA1MYEyzgJp2TZASqChXy5pxfudRx1L+OzkgQIiB4JUQIW2va50i7TZAhipUbJl2m335ERvj+PX0YqmADKtgD8zU2H1NtxoiiRknZnh9M5lsYYBBJfvwo1mkNBy/MkCbcM6T7s+TPCOP/FsWhjbrI= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1738583781; c=relaxed/simple; bh=OJubSk7TBSyNMMe1bnRy1n45CoTOzWlCunlZISOCiKg=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=gDTH6KOg2blMsAIC18MaCv0ilO1jcGxHCWhwn4Tab/N1ROsrUQAzq5uznUTHFTXOBQTjV4dRwR/S2kDQAtRGEO+dr/nGmTygAfl9tiQFzVXZZrC+Grha7wH+kOrA47KZ8m01NVH/Wz3EkE4T/ZDCG7Vnomvl4eNbVt/6RoUeK2g= 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=UNm8DJSv; arc=none smtp.client-ip=209.85.222.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="UNm8DJSv" Received: by mail-ua1-f41.google.com with SMTP id a1e0cc1a2514c-860f0e91121so2969707241.0 for ; Mon, 03 Feb 2025 03:56:19 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=chromium.org; s=google; t=1738583778; x=1739188578; 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=PuXYgfblqPgsOSSTy3xM8LEdA1bnZ/Knt94pd6Qxl2k=; b=UNm8DJSvAwV1YZLso4/BO616WQkSne5DMISts/AO24AhBMSwore6uPW16miXgBUEl1 uzOgqOHHbPE/u8qiIwbNJUBPzd+/eUOxrOGPUkdHJI0IekrL7GlZ5RIsq3GFAEN/S0DL ATWDJBDc378o/bPk6g0j/hhs9T69KVhgxGvm0= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1738583778; x=1739188578; 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=PuXYgfblqPgsOSSTy3xM8LEdA1bnZ/Knt94pd6Qxl2k=; b=OFz2vfMVgwkfAGa4BE5wUqdThbnFOUNQTWTFnnGxJmvAbCZQg28WZr1NAq44je3KWa RrYLTPzodhkS928XMONBFTaoJSjzb2W+KPrkMxz78195IF8Ei14wMObUZw8EaQIALUlZ 7+4XbjKiICzGQVHUo7k6/zH6HCAswFNrfy5gyezx7ugKuV/PmeRR6G5KI5R+o3KV+eX6 Giyat/lmu63j2W2KpDqqY0wGYwnSQKpTvXq1HolkPx0zJ+Phys3KExbuzHF4Oe39vkA8 pBeCxkYfIhZkyBN77f7JFFvue9ZfEzio4wjvANgzXQZFnMno3LgFFoiPFLL4Xa6pv1Za r7AQ== X-Forwarded-Encrypted: i=1; AJvYcCUcL1skabmm9ckioKLzlCNjb07QdyejWOlMQptBh/+PNeqmJnF6t64bRKNSdZLNlse14BKbvYSeQ1/RrpM=@vger.kernel.org X-Gm-Message-State: AOJu0YxpG0/NarT3qH3Tn5oFdIfci5qliQJhOwUjrMFFElF7eQM+aSlj e+p17ixFq5uCIV8XY97cC909QLwXsZcgsZ61x5N8USw+GrJjqR5HuhmaFz8ZmQ== X-Gm-Gg: ASbGnctpo0ZcA33q/NboYOwKOloCN3IoPZC2p54ypWmBOfYbYEfwJohjNY5T5BW87Sz WYLvMpWc7pjypkqHqYDOsY+1A2XKNU5Uqe9NwUbPkbCk396s/9EKjv/PSsXNQp6jcG30OkevbwJ CXQqsfneHmGVJYgqVFKtgrgQ0S2gYVfdyP2oqM91FjINiIaBcn0vhWl3omtoHj8iv2byJm2Ah0c JcCMw++I3P/CUA0QJiPxZ1Shbp+WKykZ2ju3saO2HKRWnif0oC2NEZ/310qI7dlAP3YLmNh3e0m OCTC6GssHOFnBkuhfC6hS1CUkeWVfaYo9UyaRA/eJuj+7C55UmrVGv2l5IVXpA9lmg== X-Google-Smtp-Source: AGHT+IGpzZPl81uNUrVjlXMRe1t+IJbzIPHk0rcvr85sHFnl0EOk+nPEyG6ptHV5XQsP7wfiiVAiUg== X-Received: by 2002:a05:6102:1609:b0:4b2:9e5d:baf with SMTP id ada2fe7eead31-4b9b7225816mr9583015137.11.1738583778456; Mon, 03 Feb 2025 03:56:18 -0800 (PST) Received: from denia.c.googlers.com (5.236.236.35.bc.googleusercontent.com. [35.236.236.5]) by smtp.gmail.com with ESMTPSA id ada2fe7eead31-4b9baa9aefcsm1592770137.12.2025.02.03.03.56.16 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 03 Feb 2025 03:56:17 -0800 (PST) From: Ricardo Ribalda Date: Mon, 03 Feb 2025 11:55:53 +0000 Subject: [PATCH v17 17/17] media: uvcvideo: document UVC v1.5 ROI 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: <20250203-uvc-roi-v17-17-5900a9fed613@chromium.org> References: <20250203-uvc-roi-v17-0-5900a9fed613@chromium.org> In-Reply-To: <20250203-uvc-roi-v17-0-5900a9fed613@chromium.org> To: Laurent Pinchart , Mauro Carvalho Chehab , Hans de Goede , Sakari Ailus , Hans Verkuil Cc: Yunke Cao , linux-media@vger.kernel.org, linux-kernel@vger.kernel.org, Ricardo Ribalda , Yunke Cao , Sergey Senozhatsky X-Mailer: b4 0.13.0 From: Yunke Cao Added documentation of V4L2_CID_UVC_REGION_OF_INTEREST_RECT and V4L2_CID_UVC_REGION_OF_INTEREST_AUTO. An example of a userspace implementing this feature can be found at: https://chromium.googlesource.com/chromiumos/platform2/+/refs/heads/release= -R121-15699.B/camera/hal/usb/ Reviewed-by: Ricardo Ribalda Reviewed-by: Sergey Senozhatsky Signed-off-by: Yunke Cao Tested-by: Yunke Cao Reviewed-by: Hans de Goede Signed-off-by: Ricardo Ribalda --- .../userspace-api/media/drivers/uvcvideo.rst | 64 ++++++++++++++++++= ++++ 1 file changed, 64 insertions(+) diff --git a/Documentation/userspace-api/media/drivers/uvcvideo.rst b/Docum= entation/userspace-api/media/drivers/uvcvideo.rst index a290f9fadae9..dbb30ad389ae 100644 --- a/Documentation/userspace-api/media/drivers/uvcvideo.rst +++ b/Documentation/userspace-api/media/drivers/uvcvideo.rst @@ -181,6 +181,7 @@ Argument: struct uvc_xu_control_mapping UVC_CTRL_DATA_TYPE_BOOLEAN Boolean UVC_CTRL_DATA_TYPE_ENUM Enumeration UVC_CTRL_DATA_TYPE_BITMASK Bitmask + UVC_CTRL_DATA_TYPE_RECT Rectangular area =20 =20 UVCIOC_CTRL_QUERY - Query a UVC XU control @@ -255,3 +256,66 @@ Argument: struct uvc_xu_control_query __u8 query Request code to send to the device __u16 size Control data size (in bytes) __u8 *data Control value + + +Driver-specific V4L2 controls +----------------------------- + +The uvcvideo driver implements the following UVC-specific controls: + +``V4L2_CID_UVC_REGION_OF_INTEREST_RECT (struct)`` + This control determines the region of interest (ROI). ROI is a + rectangular area represented by a struct :c:type:`v4l2_rect`. The + rectangle is in global sensor coordinates using pixel units. It is + independent of the field of view, not impacted by any cropping or + scaling. + + Use ``V4L2_CTRL_WHICH_MIN_VAL`` and ``V4L2_CTRL_WHICH_MAX_VAL`` to query + the range of rectangle sizes. + + Setting a ROI allows the camera to optimize the capture for the region. + The value of ``V4L2_CID_REGION_OF_INTEREST_AUTO`` control determines + the detailed behavior. + + An example of use of this control, can be found in the: + `Chrome OS USB camera HAL. + ` + + +``V4L2_CID_UVC_REGION_OF_INTEREST_AUTO (bitmask)`` + This determines which, if any, on-board features should track to the + Region of Interest specified by the current value of + ``V4L2_CID_UVD__REGION_OF_INTEREST_RECT``. + + Max value is a mask indicating all supported Auto Controls. + +.. flat-table:: + :header-rows: 0 + :stub-columns: 0 + + * - ``V4L2_UVC_REGION_OF_INTEREST_AUTO_EXPOSURE`` + - Setting this bit causes automatic exposure to track the region of + interest instead of the whole image. + * - ``V4L2_UVC_REGION_OF_INTEREST_AUTO_IRIS`` + - Setting this bit causes automatic iris to track the region of inte= rest + instead of the whole image. + * - ``V4L2_UVC_REGION_OF_INTEREST_AUTO_WHITE_BALANCE`` + - Setting this bit causes automatic white balance to track the region + of interest instead of the whole image. + * - ``V4L2_UVC_REGION_OF_INTEREST_AUTO_FOCUS`` + - Setting this bit causes automatic focus adjustment to track the re= gion + of interest instead of the whole image. + * - ``V4L2_UVC_REGION_OF_INTEREST_AUTO_FACE_DETECT`` + - Setting this bit causes automatic face detection to track the regi= on of + interest instead of the whole image. + * - ``V4L2_UVC_REGION_OF_INTEREST_AUTO_DETECT_AND_TRACK`` + - Setting this bit enables automatic face detection and tracking. The + current value of ``V4L2_CID_REGION_OF_INTEREST_RECT`` may be updated by + the driver. + * - ``V4L2_UVC_REGION_OF_INTEREST_AUTO_IMAGE_STABILIZATION`` + - Setting this bit enables automatic image stabilization. The + current value of ``V4L2_CID_REGION_OF_INTEREST_RECT`` may be updated by + the driver. + * - ``V4L2_UVC_REGION_OF_INTEREST_AUTO_HIGHER_QUALITY`` + - Setting this bit enables automatically capture the specified region + with higher quality if possible. --=20 2.48.1.362.g079036d154-goog