From patchwork Mon Feb 3 12:15:15 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Cosmin Tanislav X-Patchwork-Id: 861959 Received: from mail-wm1-f41.google.com (mail-wm1-f41.google.com [209.85.128.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 458B0204687; Mon, 3 Feb 2025 12:16:35 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.128.41 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1738584998; cv=none; b=aUa1U1SEorLC8uWERDatXpAOI1R+6ynwygw4/McfjVhTYmg70Rax9zB5aIBsaGfTcRzAk6z+ak6ScFfWa4+FPkidy5iUDbIvO0dcO/8MrAnkYou7y1SwN+0lJq6sfmK6urdRXLdT3pvxgl0xLrvpkTOgiTVqHdXDW1q4PusePVM= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1738584998; c=relaxed/simple; bh=hXofbzxGr9UkSBfIseqjF5uUMSV17qsMHkbWDTU+lJw=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=j1q5EKNiyBh6HbQivPX5fVWF5vtDbE6/Um2gMlCncCnsJ07HGdv9tadSK8bdXPwnj3qCHASQtLlKtrDtF2LdCT8s3CgKOJHZzMLjcJw9PwiLPtEGVbMxTgSBjagFeGVfFpbMssWj2NrFwQq1ejARyOQipneinkULWR0jecs8lFU= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=YdY8SPdk; arc=none smtp.client-ip=209.85.128.41 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="YdY8SPdk" Received: by mail-wm1-f41.google.com with SMTP id 5b1f17b1804b1-438a3216fc2so43574595e9.1; Mon, 03 Feb 2025 04:16:35 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1738584994; x=1739189794; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=a5S1Jbaqqsuy54JXETXKSNuafE+6eBMfotLplIbgjFY=; b=YdY8SPdkPLgMW69FIQKyObb9XLKOp2nCxrUkAXchd7Lan9FbIlB8SIBmDvuNxo2ioo V5QJSXu1eP7Lq2xUk5khOKOZXpqgcUvE+3RICp/ZR+85Dtd1ivmZr3rWNg0iPXdOIP/K Nw8Nb6WdJTIkhh8uTOQ4YkRVoVUntSuYd39gLaDCpOlJCdOzkGvoba7EnafMNUcbhVcs st2PY/O7mUgou6uKmpeOTS7zGOJjG1wTkmh7ff5iGnumHDZvTYfxXASnmzQKjWywWjP1 RKnMPetwjXLidDbsTrwrMaQHjHd3J8EJSMFRCQ2E6uKM31boPZRexp8hZKnGyhdWjzZy dSuA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1738584994; x=1739189794; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=a5S1Jbaqqsuy54JXETXKSNuafE+6eBMfotLplIbgjFY=; b=wKc9n823sxVbOZLfraIBwr2nbYZtXgUWrCbX+BKw0G65v2yVZCbx80Q9e3hGKEQotO +zwZUBhpG7rFr3luflZC5W/Yg6LjfECbesmwaOAYuzPeOMDqSz7XauxAd5+iUFnjn1S3 H6ECGkC1qEuIhiVoYd0Bpte2PUaqCM8cwnqDdFTo4obukf8CFMvgCfLY/p7B59vlLmZM i5AQzA3RWgIzscYbalk/Fukj1GIC9FtVXkli/FusCBrdtOpiRnN3l/MI2HBBM01DNewi Jg6W/NKIoUXuU4LHTGDeKqmNFjJYBOIra+7+uQ0iRKuCiPd85THseg3wBnqfjAI3Pmdw kzSQ== X-Forwarded-Encrypted: i=1; AJvYcCVe5UvkCg72WdmJ6t4FlJmJ8fCj+4RjgTGWud6kJE2U4caFSMIV7r47F0G/i+OOR1lmdTlMh2/GfDZQuLnV@vger.kernel.org, AJvYcCWdMSQj5H1OzU47eO7eEPW1I5rJt8KSo1qGBCOsBfWuBziHUMBVGfxitngHGLxA+evpkL/BURfhN/Q=@vger.kernel.org X-Gm-Message-State: AOJu0Yyrtb7o2RaqYASzj/Jwc+LrTCc8OnR6Rdkq9b19obV/HK8hLO84 FT/ELGT2rYbhs0GE9WDgh2pIb2iR1PGBjfuKa8pwGh+qzr/GAhxlzPoS2A== X-Gm-Gg: ASbGnctvHvxcJq0Uavz5OM7nnCPV/rfD1Qe4uyjLroYnYF6O8bm882Gm0dF4TvISLbr 8fxL5hO+/fG0Ie4ZSB2ZkQPr83h5goI2+OjU2ylccFQSvaYXTGq+61mYMVqnsxCM53neUIaiVdI 2uS6E+t8BWnY+dbdE8OAQL7v6Eou+pBtG+/Y4x8vx8iPl6yX0dip7F/8pQ9AIeYerXMJCY4Ocvz +xGE8hJVMjcpV4z8g+bOYFMn/k6vUMgbHzLttCrROoZ3PhUDaS3FGUz/nRH+uTbltj/s7aTkNq3 mSmoA05QaDSOPM92El/tM5eg0T4= X-Google-Smtp-Source: AGHT+IHzzmvbcVxCPLp672vyXzP8nYo4AEWsr32WlCMB1c5YEVuASHO7fdyzgxthfLOMiCMuAcL/1w== X-Received: by 2002:a05:6000:1843:b0:38c:5d42:152b with SMTP id ffacd0b85a97d-38c5d421959mr13296202f8f.54.1738584994179; Mon, 03 Feb 2025 04:16:34 -0800 (PST) Received: from demon-pc.localdomain ([86.121.79.71]) by smtp.gmail.com with ESMTPSA id ffacd0b85a97d-38c5c1cfa3dsm12805326f8f.93.2025.02.03.04.16.33 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 03 Feb 2025 04:16:33 -0800 (PST) From: Cosmin Tanislav To: Cc: Tomi Valkeinen , Luca Ceresoli , Wolfram Sang , linux-i2c@vger.kernel.org, linux-kernel@vger.kernel.org, Tomi Valkeinen Subject: [PATCH 1/3] i2c: atr: Fix lockdep for nested ATRs Date: Mon, 3 Feb 2025 14:15:15 +0200 Message-ID: <20250203121629.2027871-2-demonsingur@gmail.com> X-Mailer: git-send-email 2.48.1 In-Reply-To: <20250203121629.2027871-1-demonsingur@gmail.com> References: <20250203121629.2027871-1-demonsingur@gmail.com> Precedence: bulk X-Mailing-List: linux-i2c@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 From: Tomi Valkeinen When we have an ATR, and another ATR as a subdevice of the first ATR, we get lockdep warnings for the i2c_atr.lock and i2c_atr_chan.orig_addrs_lock. This is because lockdep uses a static key for the locks, and doesn't see the locks of the separate ATR instances as separate. Fix this by generating a dynamic lock key per lock instance. Signed-off-by: Tomi Valkeinen --- drivers/i2c/i2c-atr.c | 21 ++++++++++++++++++--- 1 file changed, 18 insertions(+), 3 deletions(-) diff --git a/drivers/i2c/i2c-atr.c b/drivers/i2c/i2c-atr.c index 1a6ff47b42002..39b3b95c6842a 100644 --- a/drivers/i2c/i2c-atr.c +++ b/drivers/i2c/i2c-atr.c @@ -68,11 +68,13 @@ struct i2c_atr_alias_pool { * @atr: The parent I2C ATR * @chan_id: The ID of this channel * @alias_pairs_lock: Mutex protecting @alias_pairs + * @alias_pairs_lock_key: Lock key for @alias_pairs_lock * @alias_pairs: List of @struct i2c_atr_alias_pair containing the * assigned aliases * @alias_pool: Pool of available client aliases * * @orig_addrs_lock: Mutex protecting @orig_addrs + * @orig_addrs_lock_key: Lock key for @orig_addrs_lock * @orig_addrs: Buffer used to store the original addresses during transmit * @orig_addrs_size: Size of @orig_addrs */ @@ -83,11 +85,13 @@ struct i2c_atr_chan { /* Lock alias_pairs during attach/detach */ struct mutex alias_pairs_lock; + struct lock_class_key alias_pairs_lock_key; struct list_head alias_pairs; struct i2c_atr_alias_pool *alias_pool; /* Lock orig_addrs during xfer */ struct mutex orig_addrs_lock; + struct lock_class_key orig_addrs_lock_key; u16 *orig_addrs; unsigned int orig_addrs_size; }; @@ -100,6 +104,7 @@ struct i2c_atr_chan { * @priv: Private driver data, set with i2c_atr_set_driver_data() * @algo: The &struct i2c_algorithm for adapters * @lock: Lock for the I2C bus segment (see &struct i2c_lock_operations) + * @lock_key: Lock key for @lock * @max_adapters: Maximum number of adapters this I2C ATR can have * @alias_pool: Optional common pool of available client aliases * @i2c_nb: Notifier for remote client add & del events @@ -115,6 +120,7 @@ struct i2c_atr { struct i2c_algorithm algo; /* lock for the I2C bus segment (see struct i2c_lock_operations) */ struct mutex lock; + struct lock_class_key lock_key; int max_adapters; struct i2c_atr_alias_pool *alias_pool; @@ -679,7 +685,8 @@ struct i2c_atr *i2c_atr_new(struct i2c_adapter *parent, struct device *dev, if (!atr) return ERR_PTR(-ENOMEM); - mutex_init(&atr->lock); + lockdep_register_key(&atr->lock_key); + mutex_init_with_key(&atr->lock, &atr->lock_key); atr->parent = parent; atr->dev = dev; @@ -707,6 +714,7 @@ struct i2c_atr *i2c_atr_new(struct i2c_adapter *parent, struct device *dev, i2c_atr_free_alias_pool(atr->alias_pool); err_destroy_mutex: mutex_destroy(&atr->lock); + lockdep_unregister_key(&atr->lock_key); kfree(atr); return ERR_PTR(ret); @@ -723,6 +731,7 @@ void i2c_atr_delete(struct i2c_atr *atr) bus_unregister_notifier(&i2c_bus_type, &atr->i2c_nb); i2c_atr_free_alias_pool(atr->alias_pool); mutex_destroy(&atr->lock); + lockdep_unregister_key(&atr->lock_key); kfree(atr); } EXPORT_SYMBOL_NS_GPL(i2c_atr_delete, "I2C_ATR"); @@ -757,8 +766,10 @@ int i2c_atr_add_adapter(struct i2c_atr *atr, struct i2c_atr_adap_desc *desc) chan->atr = atr; chan->chan_id = chan_id; INIT_LIST_HEAD(&chan->alias_pairs); - mutex_init(&chan->alias_pairs_lock); - mutex_init(&chan->orig_addrs_lock); + lockdep_register_key(&chan->alias_pairs_lock_key); + lockdep_register_key(&chan->orig_addrs_lock_key); + mutex_init_with_key(&chan->alias_pairs_lock, &chan->alias_pairs_lock_key); + mutex_init_with_key(&chan->orig_addrs_lock, &chan->orig_addrs_lock_key); snprintf(chan->adap.name, sizeof(chan->adap.name), "i2c-%d-atr-%d", i2c_adapter_id(parent), chan_id); @@ -835,6 +846,8 @@ int i2c_atr_add_adapter(struct i2c_atr *atr, struct i2c_atr_adap_desc *desc) fwnode_handle_put(dev_fwnode(&chan->adap.dev)); mutex_destroy(&chan->orig_addrs_lock); mutex_destroy(&chan->alias_pairs_lock); + lockdep_unregister_key(&chan->orig_addrs_lock_key); + lockdep_unregister_key(&chan->alias_pairs_lock_key); kfree(chan); return ret; } @@ -872,6 +885,8 @@ void i2c_atr_del_adapter(struct i2c_atr *atr, u32 chan_id) fwnode_handle_put(fwnode); mutex_destroy(&chan->orig_addrs_lock); mutex_destroy(&chan->alias_pairs_lock); + lockdep_unregister_key(&chan->orig_addrs_lock_key); + lockdep_unregister_key(&chan->alias_pairs_lock_key); kfree(chan->orig_addrs); kfree(chan); } From patchwork Mon Feb 3 12:15:16 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Cosmin Tanislav X-Patchwork-Id: 861647 Received: from mail-wr1-f41.google.com (mail-wr1-f41.google.com [209.85.221.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 91BB5204696; Mon, 3 Feb 2025 12:16:37 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.221.41 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1738584999; cv=none; b=LzWFqK0TfertaWKSKmachGNUg+D3q7GJTN+jZ+wxDrcpayV3vEVnJeIlS4ntl97L3ovvh846zyVY89YcZ3oU+vLtH22hEC8CKpl0RoJiNlYmpSsJfIg8I4cwUyLeUUOjAfBMMjfP9hP3ml/RqNgg1yODN9a3/0gXES3qygdUJ8g= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1738584999; c=relaxed/simple; bh=jPZm8GNgti5PehUYmH/DBEYzWooi10IL4H1OU2vb6QU=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=mO30scg5oibMdgD7/dMj2ZOrHkGkX4vVDKKd+m/g8bui98ugtQesMNkm4S9iTR7a9PfD3dm56YE/IGbHhcFgdoP1iEmtOn13QJUwloKRSnzWcI9FUqcPp/kxSXIp4H8U2Yk6uw0JAcEvbRE1k79UYSRMzVUWSr2gbKb5jaVKLO8= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=jNR07H6U; arc=none smtp.client-ip=209.85.221.41 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="jNR07H6U" Received: by mail-wr1-f41.google.com with SMTP id ffacd0b85a97d-385f06d0c8eso2323409f8f.0; Mon, 03 Feb 2025 04:16:37 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1738584996; x=1739189796; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=UcYd0DDtGT0W8tBu7DjwocumUzGM2umiKoOO1mgVdB0=; b=jNR07H6UfzoCt5x+j9wIcEzzj2cCH400cXhphzW4diW7TDny+Gy6QYG8S7fD3KE7FW 1V/cyQP4iroIH4X2YAbNyJyZf8P23kjKsUOZESWrubtdPlLdPSrjKrBZa/IfCu7kw+po WnRF+w34vwa4UqcF9os08oSxEj8Xc2ImFD4SxysoIYpw3qJ84/WWl9mSngzKkb3qWCHJ JjqW/AVu/e4GthJUONtjy2QSAn14OF7oQqObozOG+eaHv6qpvmgOZ1/NF52Kjb7pBOc1 IvNO70YxjmeOO0E3hZWKJPggN7zxe/L1InvHUIagQ9aIitRnMF3NLStOHYhphSkffWZH ZoaQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1738584996; x=1739189796; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=UcYd0DDtGT0W8tBu7DjwocumUzGM2umiKoOO1mgVdB0=; b=PVOlM3jcQ8qzCkxn52wqFxTNAux0tHwqHcRXtq1eyJwugMj75W8RwrQ5PQ7GqSGfTj H2bGz9hkakn2++TDSxEEKjxWP/DJAcK3vPeI2TIau7fIFxBL3hnQFbjgI2/So0QUl8Vv kJzrrJaG6HF10ObU5anHYzQx8ZOgXUKnjyvGxAtOhIE4VjQo5lwirdVk79vvEHgQePqI rb/Ob97Ug2X9luyU9txLsmH49IDElfbLIuwTmA83GLASNpkt09gVXDg+ZYXlDIFGIdW7 GB4RWPnPK+5b5eraw7obYPjs+IDKaXEaLIJoqQzFhPC1/tINre2iu8qVRTlMS6sOcwcD EmXQ== X-Forwarded-Encrypted: i=1; AJvYcCW8OPXW5ImXTe/T8iNDyhIE5luAh3JvHwlhPOIK2wEenxXbi+7Lbg1tkUTmKS+359GFeVdtuy0aBOE=@vger.kernel.org, AJvYcCXzPLEJcDxTgT4cx6/lz/a8koCaGWrBgcysCuMowf2YdNypAj0iO80aHpqJQkPXeG+a0oL90j8ekotZQ/GW@vger.kernel.org X-Gm-Message-State: AOJu0Ywb7iyHq/+yzF+IuUsvSHSWUbuRImlfqNluGRqMGtTs5nNsQ+ii WKPMl+FTWmbHWcJn8TV4mI/Pg9Hkd6LXk13IxsrrOBCnVQcS7tre X-Gm-Gg: ASbGncvOTQ4h0w/WS/gAOdoRIH7x33mJslmYmvoCT21UHSYr1OB5zIltrOqDgmmfwr4 P9MuvaeSI+HcMThQCC2JmmToKSUhFfvjhNOq8wgb1dSoruga4wu9ESdGH36JfxLL92/GDT0E7Jz fabw/O22OCSYWbUbIMLAzBQA/4ErLzv7i3SV3sYV0uZkOqwG0kCHHPlgpHORBI+TO98kP+8QvX9 vCj0GhV/5cOWZulbOIET8EFFUK+20iQsYKGQ6NROdhBagBttWNeatcw0vE7WajSEy/nHwqn7geZ +folAwHV0lg+o3Da4d2jJ0V6Ql8= X-Google-Smtp-Source: AGHT+IFxH48P1t8DtTnljE2QrlAPAk8tRIERmlgs/Yt3gwlH8008dXaDyknlKWGr+EskI03a1pq+jA== X-Received: by 2002:a5d:6da7:0:b0:385:de67:2269 with SMTP id ffacd0b85a97d-38c520a3857mr17368156f8f.36.1738584995733; Mon, 03 Feb 2025 04:16:35 -0800 (PST) Received: from demon-pc.localdomain ([86.121.79.71]) by smtp.gmail.com with ESMTPSA id ffacd0b85a97d-38c5c1cfa3dsm12805326f8f.93.2025.02.03.04.16.34 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 03 Feb 2025 04:16:35 -0800 (PST) From: Cosmin Tanislav To: Cc: Tomi Valkeinen , Luca Ceresoli , Wolfram Sang , linux-i2c@vger.kernel.org, linux-kernel@vger.kernel.org, Cosmin Tanislav Subject: [PATCH 2/3] i2c: atr: deduplicate logic in attach_addr() Date: Mon, 3 Feb 2025 14:15:16 +0200 Message-ID: <20250203121629.2027871-3-demonsingur@gmail.com> X-Mailer: git-send-email 2.48.1 In-Reply-To: <20250203121629.2027871-1-demonsingur@gmail.com> References: <20250203121629.2027871-1-demonsingur@gmail.com> Precedence: bulk X-Mailing-List: linux-i2c@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 This is mainly the same logic as in i2c_atr_find_mapping_by_addr(), except for the missing dynamic detach / attach. There's actually no reason for that logic to not be run, since it is possible for a single channel to exceed alias pooling capabilities and to need to remove some aliases before even finishing adding the channels. Signed-off-by: Cosmin Tanislav --- drivers/i2c/i2c-atr.c | 33 +++++++-------------------------- 1 file changed, 7 insertions(+), 26 deletions(-) diff --git a/drivers/i2c/i2c-atr.c b/drivers/i2c/i2c-atr.c index 39b3b95c6842a..13f7e07fd8e87 100644 --- a/drivers/i2c/i2c-atr.c +++ b/drivers/i2c/i2c-atr.c @@ -488,41 +488,22 @@ static int i2c_atr_attach_addr(struct i2c_adapter *adapter, struct i2c_atr_chan *chan = adapter->algo_data; struct i2c_atr *atr = chan->atr; struct i2c_atr_alias_pair *c2a; - u16 alias; - int ret; - - ret = i2c_atr_reserve_alias(chan->alias_pool); - if (ret < 0) { - dev_err(atr->dev, "failed to find a free alias\n"); - return ret; - } - - alias = ret; mutex_lock(&chan->alias_pairs_lock); - c2a = i2c_atr_create_c2a(chan, alias, addr); + c2a = i2c_atr_find_mapping_by_addr(chan, addr); if (!c2a) { - ret = -ENOMEM; - goto err_release_alias; + dev_err(atr->dev, "failed to find a free alias\n"); + mutex_unlock(&chan->alias_pairs_lock); + return -EBUSY; } - ret = atr->ops->attach_addr(atr, chan->chan_id, addr, alias); - if (ret) - goto err_del_c2a; - dev_dbg(atr->dev, "chan%u: using alias 0x%02x for addr 0x%02x\n", - chan->chan_id, alias, addr); + chan->chan_id, c2a->alias, addr); - goto out_unlock; - -err_del_c2a: - i2c_atr_destroy_c2a(&c2a); -err_release_alias: - i2c_atr_release_alias(chan->alias_pool, alias); -out_unlock: mutex_unlock(&chan->alias_pairs_lock); - return ret; + + return 0; } static void i2c_atr_detach_addr(struct i2c_adapter *adapter, From patchwork Mon Feb 3 12:15:17 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Cosmin Tanislav X-Patchwork-Id: 861958 Received: from mail-wm1-f46.google.com (mail-wm1-f46.google.com [209.85.128.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 4D1AE2046B3; Mon, 3 Feb 2025 12:16:39 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.128.46 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1738585001; cv=none; b=BFITtVSDTsqIHPos0kXT17nIMS5sPL0aKZLVSaGa8Nq6s8ACICyH9GUaWMF3ND3wbXZwHlKJz93Kv34XmmiUOflbkvi7IIMEfNOBaB89zbUyBGuFXjIG2lzLfZfFemxEKrFyQTh+YDWB4NIRMsqQahenbfK6JJiejKxoXW+0p9s= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1738585001; c=relaxed/simple; bh=YuQbtxF/0uj/9v3z5S3Lkwr3pWSd+re9V4XEsn+KtY0=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=Hs/1vIZaM9KD6Aebyt2QSc5BUCgyaJ8GhwR4bh1WXHTCLaaogswMb6Z1z7aoKj7XclfpKINIqR5GhmLucgN7xVwS/3oJhar/zf9Uv26bp+1aRpRQMzrih6Q3gIPlxrosmeRdIJpXbeY4h8/4vtGgXMa0/L5iO/z7pVBY9nhuax0= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=LaWByffv; arc=none smtp.client-ip=209.85.128.46 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="LaWByffv" Received: by mail-wm1-f46.google.com with SMTP id 5b1f17b1804b1-4361f65ca01so44842305e9.1; Mon, 03 Feb 2025 04:16:38 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1738584997; x=1739189797; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=Dtc0ZCnm8/eC9KODTwvCTS4jrazLi7CE3FYwUcCkFj4=; b=LaWByffvVh+mntuMVu+Y027LPeGxNhS2HGoiSbYCGiZUY6yuioo5RIAB5mPsXsqvgp 35S3U8eOhHQ8BbQkpEmG6f8wozEl2k5dCgzatihO5ktVAFBXS9l069/BsoNRaNqicCW6 1tdkSicPMk3zv13weAcZDOPvkOkYjsZp94ED44VqJYsraxosoDD2iIfOsnZQ3H/stUnv zoYVLOo5RWDGcD3fNHw+uFS9O5QC3MyENpi55MG7vKZK7Av2JLKqKUYJnOdZbpfFv3bd OfXE4RtTOLWoeFvN7x6CjEiKG2ACSb/Ff088PcL0yy/z8O4s1IR796jmlegVCwIrkvoZ 6z6g== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1738584997; x=1739189797; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=Dtc0ZCnm8/eC9KODTwvCTS4jrazLi7CE3FYwUcCkFj4=; b=MWqUqOUYbOsy7lKCz7P6zUYp4EwXtRi1prrYfFuh0pdZ9biPrJbAOeqlYnv7nnYdIU u5q0NILDeumXe+8ijPiLjw8AoHth6kY5fI5oo62RDWhK9IJ89AezRDj9J9K9aSu5Xyhl Kv7CMxywFnVpHatb13MErw01sTZOVA0yfQcv8baqn03nAx68Ws30Wfg2IosB3/30leEZ utgmZAN5FGghkvrkdx28RJ4u4AN+mScuOOB+a9D1XcFtzioft9OmbvMdXD1yT0Z8miu1 LpBgcWVtvGF7HVWrDT5PIKuGsoppW41VVQaYZl86W33QMSMa5XCUzyGfCxMGjPXX9/A6 nVzA== X-Forwarded-Encrypted: i=1; AJvYcCUN8o+pqqbPP38Ke7IfTNDvM2d1ZMo3NNMzbddnEQuaZpreX3+SOfc1Ik6X3CKaLwVOq+Qq6NNWM/A=@vger.kernel.org, AJvYcCXX9Xphn15e/fvqh0jTGVZugduKch5Zy0U7O1mXHbB0GzmbmJOHcLJCCDb/G/t4eQZ2SXxkwxua5e3uLq6w@vger.kernel.org X-Gm-Message-State: AOJu0Yy4nDL0lkoNP3WYdVuajMyjKG6bsZOzCl9f//W/53jAGYyRNFXu httGLnl6SfesA2vczmCqfjO5GBOM86fN/lG+vlkr4VeCgAmSbwhM0tDf5w== X-Gm-Gg: ASbGncugxpcJgwyGzUPU/IrzohSSrZmQgEqjmAxjrUAf1fnZ9CFIgpmqpnJ1e8+ix0b WhzsLfp52lMGjfCNlMNU8n/xq66+Cf635ReVRoUv8RYjwRMOuD6J2pyi5n0TEUD+9djrIb7dEu0 jybzTdToqqLEEEDccuW/81qb/4lujEOdNKZSVgDN9BgSucZNtjfq0TGis7AGG8yYDzP9prQMtQ3 9n0PC664FqVljfzBT9b4BJKnkc+LDfx6zNnU7mfFvqTVhHvD81e1su2Uivfb5bbNrAt8UGV9f/B xX769tsuUx+aIQdFf7RDPT4Fk2o= X-Google-Smtp-Source: AGHT+IHhPpDkiEh0xogPX+coK9qZVwBFg88jC2rMPsY829UGLfoZBxcyKdx78bZYRaao/0sxhghMvA== X-Received: by 2002:a05:600c:3149:b0:438:c18c:5ad8 with SMTP id 5b1f17b1804b1-438dc434e10mr190503235e9.31.1738584997191; Mon, 03 Feb 2025 04:16:37 -0800 (PST) Received: from demon-pc.localdomain ([86.121.79.71]) by smtp.gmail.com with ESMTPSA id ffacd0b85a97d-38c5c1cfa3dsm12805326f8f.93.2025.02.03.04.16.36 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 03 Feb 2025 04:16:36 -0800 (PST) From: Cosmin Tanislav To: Cc: Tomi Valkeinen , Luca Ceresoli , Wolfram Sang , linux-i2c@vger.kernel.org, linux-kernel@vger.kernel.org, Cosmin Tanislav Subject: [PATCH 3/3] i2c: atr: add passthrough flag Date: Mon, 3 Feb 2025 14:15:17 +0200 Message-ID: <20250203121629.2027871-4-demonsingur@gmail.com> X-Mailer: git-send-email 2.48.1 In-Reply-To: <20250203121629.2027871-1-demonsingur@gmail.com> References: <20250203121629.2027871-1-demonsingur@gmail.com> Precedence: bulk X-Mailing-List: linux-i2c@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Some I2C ATRs can have other I2C ATRs as children. The I2C messages of the child ATRs need to be forwarded as-is since the parent I2C ATR can only do address remapping for the direct children. In the case of GMSL, the deserializer I2C ATR actually doesn't have I2C address remapping hardware capabilities, but it is able to select which GMSL link to talk to, allowing it to change the address of the serializer. The child ATRs need to have their alias pools defined in such a way to prevent overlapping addresses between them, but there's no way around this without orchestration between multiple ATR instances. To allow for this use-case, add a flag that allows unmapped addresses to be passed through, since they are already remapped by the child ATRs, and disables dynamic remapping, since devices that need passthrough messages to be forwarded as-is, can only handle remapping for their direct children. There's no case where a non-remapped address will hit the parent ATR. Signed-off-by: Cosmin Tanislav --- drivers/i2c/i2c-atr.c | 26 ++++++++++++++++++-------- include/linux/i2c-atr.h | 20 +++++++++++++++++--- 2 files changed, 35 insertions(+), 11 deletions(-) diff --git a/drivers/i2c/i2c-atr.c b/drivers/i2c/i2c-atr.c index 13f7e07fd8e87..5f0e8f1cf69f7 100644 --- a/drivers/i2c/i2c-atr.c +++ b/drivers/i2c/i2c-atr.c @@ -106,6 +106,7 @@ struct i2c_atr_chan { * @lock: Lock for the I2C bus segment (see &struct i2c_lock_operations) * @lock_key: Lock key for @lock * @max_adapters: Maximum number of adapters this I2C ATR can have + * @flags: Flags for ATR * @alias_pool: Optional common pool of available client aliases * @i2c_nb: Notifier for remote client add & del events * @adapter: Array of adapters @@ -122,6 +123,7 @@ struct i2c_atr { struct mutex lock; struct lock_class_key lock_key; int max_adapters; + u32 flags; struct i2c_atr_alias_pool *alias_pool; @@ -241,7 +243,7 @@ static void i2c_atr_release_alias(struct i2c_atr_alias_pool *alias_pool, u16 ali /* Must be called with alias_pairs_lock held */ static struct i2c_atr_alias_pair * -i2c_atr_find_mapping_by_addr(struct i2c_atr_chan *chan, u16 addr) +i2c_atr_find_mapping_by_addr(struct i2c_atr_chan *chan, u16 addr, bool new_addr) { struct i2c_atr *atr = chan->atr; struct i2c_atr_alias_pair *c2a; @@ -260,6 +262,9 @@ i2c_atr_find_mapping_by_addr(struct i2c_atr_chan *chan, u16 addr) ret = i2c_atr_reserve_alias(chan->alias_pool); if (ret < 0) { + if (!new_addr && (atr->flags & I2C_ATR_PASSTHROUGH)) + return NULL; + // If no free aliases are left, replace an existing one if (unlikely(list_empty(alias_pairs))) return NULL; @@ -335,9 +340,12 @@ static int i2c_atr_map_msgs(struct i2c_atr_chan *chan, struct i2c_msg *msgs, for (i = 0; i < num; i++) { chan->orig_addrs[i] = msgs[i].addr; - c2a = i2c_atr_find_mapping_by_addr(chan, msgs[i].addr); + c2a = i2c_atr_find_mapping_by_addr(chan, msgs[i].addr, false); if (!c2a) { + if (atr->flags & I2C_ATR_PASSTHROUGH) + continue; + dev_err(atr->dev, "client 0x%02x not mapped!\n", msgs[i].addr); @@ -428,7 +436,7 @@ static int i2c_atr_smbus_xfer(struct i2c_adapter *adap, u16 addr, mutex_lock(&chan->alias_pairs_lock); - c2a = i2c_atr_find_mapping_by_addr(chan, addr); + c2a = i2c_atr_find_mapping_by_addr(chan, addr, false); if (!c2a) { dev_err(atr->dev, "client 0x%02x not mapped!\n", addr); @@ -491,7 +499,7 @@ static int i2c_atr_attach_addr(struct i2c_adapter *adapter, mutex_lock(&chan->alias_pairs_lock); - c2a = i2c_atr_find_mapping_by_addr(chan, addr); + c2a = i2c_atr_find_mapping_by_addr(chan, addr, true); if (!c2a) { dev_err(atr->dev, "failed to find a free alias\n"); mutex_unlock(&chan->alias_pairs_lock); @@ -517,7 +525,7 @@ static void i2c_atr_detach_addr(struct i2c_adapter *adapter, mutex_lock(&chan->alias_pairs_lock); - c2a = i2c_atr_find_mapping_by_addr(chan, addr); + c2a = i2c_atr_find_mapping_by_addr(chan, addr, false); if (!c2a) { /* This should never happen */ dev_warn(atr->dev, "Unable to find address mapping\n"); @@ -650,8 +658,9 @@ static int i2c_atr_parse_alias_pool(struct i2c_atr *atr) return ret; } -struct i2c_atr *i2c_atr_new(struct i2c_adapter *parent, struct device *dev, - const struct i2c_atr_ops *ops, int max_adapters) +struct i2c_atr *i2c_atr_new_flags(struct i2c_adapter *parent, struct device *dev, + const struct i2c_atr_ops *ops, int max_adapters, + u32 flags) { struct i2c_atr *atr; int ret; @@ -673,6 +682,7 @@ struct i2c_atr *i2c_atr_new(struct i2c_adapter *parent, struct device *dev, atr->dev = dev; atr->ops = ops; atr->max_adapters = max_adapters; + atr->flags = flags; if (parent->algo->master_xfer) atr->algo.master_xfer = i2c_atr_master_xfer; @@ -700,7 +710,7 @@ struct i2c_atr *i2c_atr_new(struct i2c_adapter *parent, struct device *dev, return ERR_PTR(ret); } -EXPORT_SYMBOL_NS_GPL(i2c_atr_new, "I2C_ATR"); +EXPORT_SYMBOL_NS_GPL(i2c_atr_new_flags, "I2C_ATR"); void i2c_atr_delete(struct i2c_atr *atr) { diff --git a/include/linux/i2c-atr.h b/include/linux/i2c-atr.h index 1c3a5bcd939fc..116067b5b9ba6 100644 --- a/include/linux/i2c-atr.h +++ b/include/linux/i2c-atr.h @@ -18,6 +18,15 @@ struct device; struct fwnode_handle; struct i2c_atr; +/** + * enum i2c_atr_flags - Flags for an I2C ATR driver + * + * @I2C_ATR_PASSTHROUGH: Allow unmapped incoming addresses to pass through + */ +enum i2c_atr_flags { + I2C_ATR_PASSTHROUGH = BIT(0), +}; + /** * struct i2c_atr_ops - Callbacks from ATR to the device driver. * @attach_addr: Notify the driver of a new device connected on a child @@ -60,11 +69,12 @@ struct i2c_atr_adap_desc { }; /** - * i2c_atr_new() - Allocate and initialize an I2C ATR helper. + * i2c_atr_new_flags() - Allocate and initialize an I2C ATR helper. * @parent: The parent (upstream) adapter * @dev: The device acting as an ATR * @ops: Driver-specific callbacks * @max_adapters: Maximum number of child adapters + * @flags: Flags for ATR * * The new ATR helper is connected to the parent adapter but has no child * adapters. Call i2c_atr_add_adapter() to add some. @@ -73,8 +83,12 @@ struct i2c_atr_adap_desc { * * Return: pointer to the new ATR helper object, or ERR_PTR */ -struct i2c_atr *i2c_atr_new(struct i2c_adapter *parent, struct device *dev, - const struct i2c_atr_ops *ops, int max_adapters); +struct i2c_atr *i2c_atr_new_flags(struct i2c_adapter *parent, struct device *dev, + const struct i2c_atr_ops *ops, int max_adapters, + u32 flags); + +#define i2c_atr_new(parent, dev, ops, max_adapters) \ + i2c_atr_new_flags(parent, dev, ops, max_adapters, 0) /** * i2c_atr_delete - Delete an I2C ATR helper.