From nobody Tue Dec 2 03:03:19 2025 Received: from mail-lf1-f54.google.com (mail-lf1-f54.google.com [209.85.167.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 15FE233344D for ; Mon, 17 Nov 2025 20:14:22 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.167.54 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1763410465; cv=none; b=UCxInyVRcWW3ug/1D42jo1vRBrLnQqtwJOSUvv+2BbfOrXiYPL8/FvDtIndLy/vp6Vw762OWm5VlWmliWB6+QpY5rmJCaUR4ZHMXtKSfvgaFfRKc0Ztr57/kLOjL2HFR2kymtw4rdfcGfhdQWcjR8iJ6qAL4opOhDXCyB3arJCM= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1763410465; c=relaxed/simple; bh=lNuoYkLvd+eD46/OBdJpQ72e0YfFGIty3L9APEHHUsI=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=b3WK2ONKMtohD9SoCsDRSXK+JThiRsp/2BtnizQOwEfY83Ee7jOjJprmW1RxVRIU+u2b6e8p3SCDI1EKKMNz05qVK2BA7tX2IMlhcG2w8pPlBBWmvRitk4dW7019rutq94BqAVtAxfPXnuvEFQZdNaipbC1kUORLgqgCgYSGm+8= 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=HYZxAWEg; arc=none smtp.client-ip=209.85.167.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="HYZxAWEg" Received: by mail-lf1-f54.google.com with SMTP id 2adb3069b0e04-591c98ebe90so5118080e87.3 for ; Mon, 17 Nov 2025 12:14:22 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=chromium.org; s=google; t=1763410461; x=1764015261; 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=GJ11MTmtpMbfLC31x15oun+LOtxDWcheLgXdGkh/tGo=; b=HYZxAWEgZ7WMoRNSOU9MWgT6li+Pi7wvVdaXS4PGcAS+AYoFG/qqIyMePAUyTzLdi+ ZPQTch5BbsdjXMDLfqHQ9zWNzskw3+GFNWpx/otka1UwaLIdPT13fQ6R6PGk7cqp70SM 0rgApnqQl6/c3LEAnK2jDXCSNWdrC65bPBm4o= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1763410461; x=1764015261; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:x-gm-gg:x-gm-message-state:from:to :cc:subject:date:message-id:reply-to; bh=GJ11MTmtpMbfLC31x15oun+LOtxDWcheLgXdGkh/tGo=; b=IEap3uaZsdZERrvz4SKoV+M+d9f7sezBbmg5KUeO+j9zXY5g+9Tkwoi+erljjGmdiA VGFEZBb1JhVvI2FGvnu3exlJZoriPPPZ8SJp/gOOkHGdR7V4f8q34JboGg8gb5zc2yVT 046oSx3o05+gBaTAPoYL1XJQQyxaD/8hBm3L0NHTFvVtb4Jr6yedzgbzUmhDlQSmR7/G ftZxJbJ2BCmHAyQRpHSA/kzbGKsVKN/xyDq2q7aJuTPUFYEyzuvckElHBYNYYPehiysl kGDHs6od7d4a/rWhJk3EBzQOCHYlDezb09IrsUXF9FWVnATty0S3RVlvsfApzgjo3T6O n2TQ== X-Forwarded-Encrypted: i=1; AJvYcCXWLfxDEht1mq3Qa9WWxtqyITfvL8IQv4W9QTUca3nYoBpEjry7HegRwvUP/AHfgypCTKlt3oR+rgXX3m4=@vger.kernel.org X-Gm-Message-State: AOJu0Ywa5ghKLD2igt6kQ7RFgbzI3T/aOfYWcf4b9U8alT7EHdPcf59P tRMK/HUkgqqtbdff1ewg+x7g/v26AaFrooh31mbWGJZfVYFnONAqayT2DZ+ZxlulcQ== X-Gm-Gg: ASbGncualPZsZq5Sptc4pm6IaINPtsCfBquzF/bHCl8WxoV5fiftJmCkGrK6O1974wa wYZ6/09fJGyr6uRmMgsdrayN1B9efTif8DWRRhIRkffPKHeEPOMAmHSMhqdMtWhca2SapEHUxRl 9xGMS7Vx1VpRWIJI717/TZ7/hB4GhtXHCJ0PSaZ2BHkPGBk8RfdshalpHrz8HdRcrzrlIY2ED7D pV4HTzU9oYt8NIZ13vZqejEm7K9jScG/BfbIwyDxeQ84DzleQbeYEgELDlr66vjyeJKXkmuVpYg jszT/odh56X+gFQy/j7wAxEWOKQI+bU5jkDheeOd+2yVr/6fhHSmVuTGP0Rr6ZxxVa5xn9b+esC 3bWQG8U4/Tpght66wjZIXF4aqIVISrtyI/H9yz6+duGqNaw2oDs3VyqQORccbea8kg1WXD9NsgD olYwf4u0I9KKvbeVyx8hUdGwJtbNuQOjwSYZ7Qd9QKOpquEBZqCI0WGEst87Vu54RvXWjSBXRj X-Google-Smtp-Source: AGHT+IH/Si6c/IRfGlQZcmYGRMYCiNBeXJ2Mujhyi1F02SW3SKnVbJIOPFSmJ7DPN02kVq+M9GRlLA== X-Received: by 2002:a05:6512:131c:b0:594:5ec5:8fec with SMTP id 2adb3069b0e04-595841ff9f5mr3977626e87.28.1763410461174; Mon, 17 Nov 2025 12:14:21 -0800 (PST) Received: from ribalda.c.googlers.com (80.38.88.34.bc.googleusercontent.com. [34.88.38.80]) by smtp.gmail.com with ESMTPSA id 2adb3069b0e04-595804003a4sm3413302e87.59.2025.11.17.12.14.20 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 17 Nov 2025 12:14:20 -0800 (PST) From: Ricardo Ribalda Date: Mon, 17 Nov 2025 20:14:19 +0000 Subject: [PATCH 4/4] media: uvcvideo: Introduce allow_privacy_override 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: <20251117-uvcdynctrl-v1-4-aed70eadf3d8@chromium.org> References: <20251117-uvcdynctrl-v1-0-aed70eadf3d8@chromium.org> In-Reply-To: <20251117-uvcdynctrl-v1-0-aed70eadf3d8@chromium.org> To: Laurent Pinchart , Hans de Goede , Mauro Carvalho Chehab , Greg Kroah-Hartman Cc: linux-media@vger.kernel.org, linux-kernel@vger.kernel.org, linux-usb@vger.kernel.org, Ricardo Ribalda X-Mailer: b4 0.14.2 Some camera modules have XU controls that can configure the behaviour of the privacy LED. Block mapping of those controls, unless the module is configured with a new parameter: allow_privacy_override. Signed-off-by: Ricardo Ribalda --- drivers/media/usb/uvc/uvc_driver.c | 5 +++++ drivers/media/usb/uvc/uvc_v4l2.c | 32 ++++++++++++++++++++++++++++++++ drivers/media/usb/uvc/uvcvideo.h | 1 + include/linux/usb/uvc.h | 4 ++++ 4 files changed, 42 insertions(+) diff --git a/drivers/media/usb/uvc/uvc_driver.c b/drivers/media/usb/uvc/uvc= _driver.c index 71563d8f4bcf581694ccd4b665ff52b629caa0b6..d50c501121e6f774dfd6cfdb859= 279e0860d06a5 100644 --- a/drivers/media/usb/uvc/uvc_driver.c +++ b/drivers/media/usb/uvc/uvc_driver.c @@ -35,6 +35,7 @@ unsigned int uvc_hw_timestamps_param; static unsigned int uvc_quirks_param =3D -1; unsigned int uvc_dbg_param; unsigned int uvc_timeout_param =3D UVC_CTRL_STREAMING_TIMEOUT; +bool uvc_allow_privacy_override_param; =20 static struct usb_driver uvc_driver; =20 @@ -2473,6 +2474,10 @@ module_param_named(trace, uvc_dbg_param, uint, 0644); MODULE_PARM_DESC(trace, "Trace level bitmask"); module_param_named(timeout, uvc_timeout_param, uint, 0644); MODULE_PARM_DESC(timeout, "Streaming control requests timeout"); +module_param_named(allow_privacy_override, uvc_allow_privacy_override_para= m, + bool, 0644); +MODULE_PARM_DESC(allow_privacy_override, + "Allow UVCIOC_CTRL_MAP ioctl map privacy related control"); =20 /* ------------------------------------------------------------------------ * Driver initialization and cleanup diff --git a/drivers/media/usb/uvc/uvc_v4l2.c b/drivers/media/usb/uvc/uvc_v= 4l2.c index 03c64b5698bf4331fed8437fa6e9c726a07450bd..e067b8f38500299fe6acc7e3b97= 70f7374748823 100644 --- a/drivers/media/usb/uvc/uvc_v4l2.c +++ b/drivers/media/usb/uvc/uvc_v4l2.c @@ -18,6 +18,7 @@ #include #include #include +#include =20 #include #include @@ -121,6 +122,32 @@ static int uvc_control_add_xu_mapping(struct uvc_video= _chain *chain, /* ------------------------------------------------------------------------ * UVC ioctls */ + +static bool uvc_is_privacy_mapping(struct uvc_xu_control_mapping *xmap) +{ + struct mapping { + u8 entity[16]; + u8 selector; + } privacy_mappings[] =3D { + { + .entity =3D UVC_GUID_LOGITECH_USER_HW_CONTROL_V1, + .selector =3D 1, + }, + { + .entity =3D UVC_GUID_LOGITECH_PERIPHERAL, + .selector =3D 9, + }, + }; + int i; + + for (i =3D 0; i < ARRAY_SIZE(privacy_mappings); i++) + if (!memcmp(xmap->entity, privacy_mappings[i].entity, 16) && + xmap->selector =3D=3D privacy_mappings[i].selector) + return true; + + return false; +} + static int uvc_ioctl_xu_ctrl_map(struct uvc_video_chain *chain, struct uvc_xu_control_mapping *xmap) { @@ -133,6 +160,11 @@ static int uvc_ioctl_xu_ctrl_map(struct uvc_video_chai= n *chain, return -EINVAL; } =20 + if (uvc_is_privacy_mapping(xmap) && !uvc_allow_privacy_override_param) { + pr_warn_once("uvcvideo: Privacy related controls can only be mapped if p= aram allow_privacy_override is true\n"); + return -EINVAL; + } + map =3D kzalloc(sizeof(*map), GFP_KERNEL); if (map =3D=3D NULL) return -ENOMEM; diff --git a/drivers/media/usb/uvc/uvcvideo.h b/drivers/media/usb/uvc/uvcvi= deo.h index 9a86d7f1f6ea022dace87614030bf0fde0d260f0..1895e4fe45e9c0246b7f0613dd2= bc51f60b78759 100644 --- a/drivers/media/usb/uvc/uvcvideo.h +++ b/drivers/media/usb/uvc/uvcvideo.h @@ -662,6 +662,7 @@ extern unsigned int uvc_clock_param; extern unsigned int uvc_dbg_param; extern unsigned int uvc_timeout_param; extern unsigned int uvc_hw_timestamps_param; +extern bool uvc_allow_privacy_override_param; =20 #define uvc_dbg(_dev, flag, fmt, ...) \ do { \ diff --git a/include/linux/usb/uvc.h b/include/linux/usb/uvc.h index b939a01da11466747249c64c72a3ea40cd364a59..f2d6cf52427ce9c0a62a80ca362= 9c6e350fa02c8 100644 --- a/include/linux/usb/uvc.h +++ b/include/linux/usb/uvc.h @@ -41,6 +41,10 @@ #define UVC_GUID_LOGITECH_PERIPHERAL \ {0x21, 0x2d, 0xe5, 0xff, 0x30, 0x80, 0x2c, 0x4e, \ 0x82, 0xd9, 0xf5, 0x87, 0xd0, 0x05, 0x40, 0xbd } +#define UVC_GUID_LOGITECH_USER_HW_CONTROL_V1 \ + {0x82, 0x06, 0x61, 0x63, 0x70, 0x50, 0xab, 0x49, \ + 0xb8, 0xcc, 0xb3, 0x85, 0x5e, 0x8d, 0x22, 0x1f } + =20 /* https://learn.microsoft.com/en-us/windows-hardware/drivers/stream/uvc-e= xtensions-1-5#222-extension-unit-controls */ #define UVC_MSXU_CONTROL_FOCUS 0x01 --=20 2.52.0.rc1.455.g30608eb744-goog