From nobody Thu Dec 18 17:50:00 2025 Received: from codeconstruct.com.au (pi.codeconstruct.com.au [203.29.241.158]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id B02E0A94F; Fri, 11 Apr 2025 01:09:10 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=203.29.241.158 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1744333752; cv=none; b=ON48YXORDSfRQ8Z6Got9cVqtECATtwos//fR1tAX9ZJprJKJQ1JpmfbJQc7Z+vkgdQXQtQFipvxvbWXA3nRG2w6dLRQKCmZpx0Pm6+bKoGl9rdLjgQQsqAGzMhz6uiWmAUnGMtkoRWSzz+5/HghoUMYbNyihDEploQ4wFXoPtH8= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1744333752; c=relaxed/simple; bh=22vA/YQbmT7BvV3qTGOurO5+bRhPG2XZ9z/54rSTIrs=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=YbmxQ/EWzQ8V4uPQmE5DgW9wCJWRTYXaFfknlSv2iyFYk03t2qG8rsPSptWH9ApTQ5/GIM2uB0qRINwTsyx6oMzghlYERDo0W7H8Qkp14GUqYxRi3jMFH8Dg6iEsHWoYP+lthEi59x07emRot/bkWK+KlqVFzT0aFWm7Cl+xmfc= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=codeconstruct.com.au; spf=pass smtp.mailfrom=codeconstruct.com.au; dkim=pass (2048-bit key) header.d=codeconstruct.com.au header.i=@codeconstruct.com.au header.b=BLcxJ+QL; arc=none smtp.client-ip=203.29.241.158 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=codeconstruct.com.au Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=codeconstruct.com.au Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=codeconstruct.com.au header.i=@codeconstruct.com.au header.b="BLcxJ+QL" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=codeconstruct.com.au; s=2022a; t=1744333748; bh=hnlplJMrlaC0dMDphlz7L6UrksHDLVz2lzXrxKirevo=; h=From:Date:Subject:References:In-Reply-To:To:Cc; b=BLcxJ+QLELrze4REYr90Q/cG0vzVyXSOZ3z4M8SFXbh9M+CsbEEgDjcznKmzeWLAS 1EBqwvzDyEehnzXHXtNScVMwfoYTrofIivVW/11368Do8nQo1qW72byMhpb24LIbYb EF1RcSl22u/vuelr9vkXViZv7Ir8QcnvhnP5a03oxtLj8yppk22MJqyeYNehkStU/c FDNWfxoEzJvCqe8SuLjuwkZZJmcosjxH1dH+sBWY0M1h+wsUMb4QPijgoUEpaUlFej /1FAEx5XuTRS/g8RBQ4GbzLbov9LbwWo9kIzM6ONztVJCDN5y/kbFn3jxHWMwCJf92 /UyqdHzefeObw== Received: from [127.0.1.1] (unknown [180.150.112.225]) by mail.codeconstruct.com.au (Postfix) with ESMTPSA id B97DA7D70E; Fri, 11 Apr 2025 09:09:07 +0800 (AWST) From: Andrew Jeffery Date: Fri, 11 Apr 2025 10:38:31 +0930 Subject: [PATCH 1/7] soc: aspeed: lpc-snoop: Cleanup resources in stack-order 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: <20250411-aspeed-lpc-snoop-fixes-v1-1-64f522e3ad6f@codeconstruct.com.au> References: <20250411-aspeed-lpc-snoop-fixes-v1-0-64f522e3ad6f@codeconstruct.com.au> In-Reply-To: <20250411-aspeed-lpc-snoop-fixes-v1-0-64f522e3ad6f@codeconstruct.com.au> To: linux-aspeed@lists.ozlabs.org Cc: Joel Stanley , Henry Martin , Jean Delvare , Patrick Rudolph , Andrew Geissler , Ninad Palsule , Patrick Venture , Robert Lippert , linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org, Andrew Jeffery , stable@vger.kernel.org X-Mailer: b4 0.14.2 Free the kfifo after unregistering the miscdev in aspeed_lpc_disable_snoop() as the kfifo is initialised before the miscdev in aspeed_lpc_enable_snoop(). Fixes: 3772e5da4454 ("drivers/misc: Aspeed LPC snoop output using misc char= dev") Cc: stable@vger.kernel.org Cc: Jean Delvare Signed-off-by: Andrew Jeffery Acked-by: Jean Delvare --- drivers/soc/aspeed/aspeed-lpc-snoop.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/soc/aspeed/aspeed-lpc-snoop.c b/drivers/soc/aspeed/asp= eed-lpc-snoop.c index 3e3f178b122615b33e10ff25a0b0fe7b40a0b667..bfa770ec51a889260d11c26e675= f3320bf710a54 100644 --- a/drivers/soc/aspeed/aspeed-lpc-snoop.c +++ b/drivers/soc/aspeed/aspeed-lpc-snoop.c @@ -263,8 +263,8 @@ static void aspeed_lpc_disable_snoop(struct aspeed_lpc_= snoop *lpc_snoop, return; } =20 - kfifo_free(&lpc_snoop->chan[channel].fifo); misc_deregister(&lpc_snoop->chan[channel].miscdev); + kfifo_free(&lpc_snoop->chan[channel].fifo); } =20 static int aspeed_lpc_snoop_probe(struct platform_device *pdev) --=20 2.39.5 From nobody Thu Dec 18 17:50:00 2025 Received: from codeconstruct.com.au (pi.codeconstruct.com.au [203.29.241.158]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 5985C26F44F; Fri, 11 Apr 2025 01:09:11 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=203.29.241.158 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1744333753; cv=none; b=XYzmO2hPmN0Tr9xH5hsSLrk3JLJPAVyblsma9JbGXG5H/ph42exUeC41Dh5LxWMsjCemKL0smnfUJ75QTkKXd9RatwElCSolPtqE2IaAvBrGxh5aT60jsesTm2BTMYxXgPdhZQplwZ4BzOthBUpsTOaZs5sgS1LQKCP0r49TmwU= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1744333753; c=relaxed/simple; bh=OW3oLOcMAxhMh9JMDrX5rwJWFPefvYJo768vryZpYmE=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=GnLd36hjUmbs+V2VTyme8LAdDpsTSt8XhSZREGr7jht14re6BgtlFvGR2G4Q5418uXVSfDJGBv5F2h/99uP2VbIJYBkJuKoZTSczx1M/W8/cZ9Xnw9XMtGv0GKufS5ZvfWHay0gXZBw4lEys2NozMuDOPinkcticlobmqD6wNsc= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=codeconstruct.com.au; spf=pass smtp.mailfrom=codeconstruct.com.au; dkim=pass (2048-bit key) header.d=codeconstruct.com.au header.i=@codeconstruct.com.au header.b=keDpANHK; arc=none smtp.client-ip=203.29.241.158 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=codeconstruct.com.au Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=codeconstruct.com.au Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=codeconstruct.com.au header.i=@codeconstruct.com.au header.b="keDpANHK" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=codeconstruct.com.au; s=2022a; t=1744333749; bh=BdcEfSnP4+tv/vsPgvq3tc45liclW2ZxqOGrHE4nuw8=; h=From:Date:Subject:References:In-Reply-To:To:Cc; b=keDpANHK5Ihkfq6mIdraefIFVCXBZmQaUdK5Fm8TUYv9xq9zgg3c81wcxXx4LOEIU 2OHOgEqsATY6Jve865aE91SfJAU2hNcGkXLPFyRh9+nsaUJ3IWdJlyXzfiC5efcIRJ beJRP6TqpVl3Jnx4Kja1zIVh4+D7t5Kbz20yWFhpPfPdaTI7MOtLu2ypM5EHh0HdPj lgUHUuKOhmHsvJ0lox9ylWR14nK7Ss8nWuFmEG1Xy0NywJcCfmrHdRlTW6Ku4TQdUb 0j8P521B/ZwEcX88/axCjxsw49SgFChKEVLLAI09l/M7JM789vmSZ6I/PuS0ftp6ov 4wIS31AIIXigQ== Received: from [127.0.1.1] (unknown [180.150.112.225]) by mail.codeconstruct.com.au (Postfix) with ESMTPSA id 77A017D710; Fri, 11 Apr 2025 09:09:08 +0800 (AWST) From: Andrew Jeffery Date: Fri, 11 Apr 2025 10:38:32 +0930 Subject: [PATCH 2/7] soc: aspeed: lpc-snoop: Don't disable channels that aren't enabled 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: <20250411-aspeed-lpc-snoop-fixes-v1-2-64f522e3ad6f@codeconstruct.com.au> References: <20250411-aspeed-lpc-snoop-fixes-v1-0-64f522e3ad6f@codeconstruct.com.au> In-Reply-To: <20250411-aspeed-lpc-snoop-fixes-v1-0-64f522e3ad6f@codeconstruct.com.au> To: linux-aspeed@lists.ozlabs.org Cc: Joel Stanley , Henry Martin , Jean Delvare , Patrick Rudolph , Andrew Geissler , Ninad Palsule , Patrick Venture , Robert Lippert , linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org, Andrew Jeffery , stable@vger.kernel.org X-Mailer: b4 0.14.2 Mitigate e.g. the following: # echo 1e789080.lpc-snoop > /sys/bus/platform/drivers/aspeed-lpc-snoop/= unbind ... [ 120.363594] Unable to handle kernel NULL pointer dereference at virt= ual address 00000004 when write [ 120.373866] [00000004] *pgd=3D00000000 [ 120.377910] Internal error: Oops: 805 [#1] SMP ARM [ 120.383306] CPU: 1 UID: 0 PID: 315 Comm: sh Not tainted 6.15.0-rc1-0= 0009-g926217bc7d7d-dirty #20 NONE ... [ 120.679543] Call trace: [ 120.679559] misc_deregister from aspeed_lpc_snoop_remove+0x84/0xac [ 120.692462] aspeed_lpc_snoop_remove from platform_remove+0x28/0x38 [ 120.700996] platform_remove from device_release_driver_internal+0x1= 88/0x200 ... Fixes: 9f4f9ae81d0a ("drivers/misc: add Aspeed LPC snoop driver") Cc: stable@vger.kernel.org Cc: Jean Delvare Signed-off-by: Andrew Jeffery Acked-by: Jean Delvare --- drivers/soc/aspeed/aspeed-lpc-snoop.c | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/drivers/soc/aspeed/aspeed-lpc-snoop.c b/drivers/soc/aspeed/asp= eed-lpc-snoop.c index bfa770ec51a889260d11c26e675f3320bf710a54..e9d9a8e60a6f062c0b53c9c02e5= d73768453998d 100644 --- a/drivers/soc/aspeed/aspeed-lpc-snoop.c +++ b/drivers/soc/aspeed/aspeed-lpc-snoop.c @@ -58,6 +58,7 @@ struct aspeed_lpc_snoop_model_data { }; =20 struct aspeed_lpc_snoop_channel { + bool enabled; struct kfifo fifo; wait_queue_head_t wq; struct miscdevice miscdev; @@ -190,6 +191,9 @@ static int aspeed_lpc_enable_snoop(struct aspeed_lpc_sn= oop *lpc_snoop, const struct aspeed_lpc_snoop_model_data *model_data =3D of_device_get_match_data(dev); =20 + if (lpc_snoop->chan[channel].enabled) + return -EBUSY; + init_waitqueue_head(&lpc_snoop->chan[channel].wq); /* Create FIFO datastructure */ rc =3D kfifo_alloc(&lpc_snoop->chan[channel].fifo, @@ -236,6 +240,8 @@ static int aspeed_lpc_enable_snoop(struct aspeed_lpc_sn= oop *lpc_snoop, regmap_update_bits(lpc_snoop->regmap, HICRB, hicrb_en, hicrb_en); =20 + lpc_snoop->chan[channel].enabled =3D true; + return 0; =20 err_misc_deregister: @@ -248,6 +254,9 @@ static int aspeed_lpc_enable_snoop(struct aspeed_lpc_sn= oop *lpc_snoop, static void aspeed_lpc_disable_snoop(struct aspeed_lpc_snoop *lpc_snoop, int channel) { + if (!lpc_snoop->chan[channel].enabled) + return; + switch (channel) { case 0: regmap_update_bits(lpc_snoop->regmap, HICR5, @@ -263,6 +272,8 @@ static void aspeed_lpc_disable_snoop(struct aspeed_lpc_= snoop *lpc_snoop, return; } =20 + lpc_snoop->chan[channel].enabled =3D false; + /* Consider improving safety wrt concurrent reader(s) */ misc_deregister(&lpc_snoop->chan[channel].miscdev); kfifo_free(&lpc_snoop->chan[channel].fifo); } --=20 2.39.5 From nobody Thu Dec 18 17:50:00 2025 Received: from codeconstruct.com.au (pi.codeconstruct.com.au [203.29.241.158]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id E5FFE26FA6B for ; Fri, 11 Apr 2025 01:09:11 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=203.29.241.158 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1744333753; cv=none; b=LqBjejSZ+geEPtV6MmR93aVGPNZ92YDd1ABzeUJ0dbdCwwaWbdIOFkwtwVZJ5f7bRZW3lyawOtivjTV3FOOwXu3WQtdBqeXZgR/z0/2hjEalKPZjlO54X6wucvoZnO6Foc4aNZEtgT9kI3DUsy7F4czWWuajLt9pVAWCTZ2F9gY= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1744333753; c=relaxed/simple; bh=dBx/Bplbl5f0nTzwDTbIYSziOVoFjQRy/oB8cwrUId4=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=qPCwsvQtG5AFV8qf8UpyiaGt4jT7xp5Q/dEHAOEUXCIQSUWsVW5r9TD/Jv5kDTv6zgv6YcaZtZWJ/xKpDOANRnF63yn5IWbMgwoYpsYjGFv4AkkiA5xrXp7z9oH7JDJ5PnACBt402z08OD5md7SpgGL2VrY1nP6J/z7shT6ItIE= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=codeconstruct.com.au; spf=pass smtp.mailfrom=codeconstruct.com.au; dkim=pass (2048-bit key) header.d=codeconstruct.com.au header.i=@codeconstruct.com.au header.b=KXybtiEp; arc=none smtp.client-ip=203.29.241.158 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=codeconstruct.com.au Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=codeconstruct.com.au Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=codeconstruct.com.au header.i=@codeconstruct.com.au header.b="KXybtiEp" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=codeconstruct.com.au; s=2022a; t=1744333749; bh=Kl9cNe70ebuqUBsGg3wclmdapJ/BbYZ4gItW6jHIc7A=; h=From:Date:Subject:References:In-Reply-To:To:Cc; b=KXybtiEpVaRs6sAGdOtnmP9rQxsNzrAWJmdNkLK8ew7d8QxZs4QbeawJkPJVvlGYE kqYN+QPIEr2LOIxkxWgr2NjAowCKjUwCHvNbLmMSyLR7qUkPolYIgpnpWyUpupKQsJ wxAzji6m4w24QEKZHRAbdORveQcLoi+OWJVPb4BDSrxBYVfHp2JrTWXny7XinCq+Tu Vcz/WVUl33+nQkgXC1Ji/Zpx2O+G9Fw1dMcujg6GCyxCOXGLc+cChI2/R6Zi+0025x 9OnfmrhQZ2TQTXGqaW6izUHRwuev4+qYKqQQe8ekXqSEjAY3YwmSfMBrtXgZwPtOjP wq48PWVT/MeMw== Received: from [127.0.1.1] (unknown [180.150.112.225]) by mail.codeconstruct.com.au (Postfix) with ESMTPSA id 4EECF7D712; Fri, 11 Apr 2025 09:09:09 +0800 (AWST) From: Andrew Jeffery Date: Fri, 11 Apr 2025 10:38:33 +0930 Subject: [PATCH 3/7] soc: aspeed: lpc-snoop: Ensure model_data is valid 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: <20250411-aspeed-lpc-snoop-fixes-v1-3-64f522e3ad6f@codeconstruct.com.au> References: <20250411-aspeed-lpc-snoop-fixes-v1-0-64f522e3ad6f@codeconstruct.com.au> In-Reply-To: <20250411-aspeed-lpc-snoop-fixes-v1-0-64f522e3ad6f@codeconstruct.com.au> To: linux-aspeed@lists.ozlabs.org Cc: Joel Stanley , Henry Martin , Jean Delvare , Patrick Rudolph , Andrew Geissler , Ninad Palsule , Patrick Venture , Robert Lippert , linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org, Andrew Jeffery X-Mailer: b4 0.14.2 of_device_get_match_data() can return NULL, though shouldn't in current circumstances. Regardless, initialise model_data closer to use so it's clear we need to test for validity prior to dereferencing. Fixes: 2dee584bc9e3 ("drivers/misc: (aspeed-lpc-snoop): Add ast2400 to comp= at") Signed-off-by: Andrew Jeffery Acked-by: Jean Delvare --- drivers/soc/aspeed/aspeed-lpc-snoop.c | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/drivers/soc/aspeed/aspeed-lpc-snoop.c b/drivers/soc/aspeed/asp= eed-lpc-snoop.c index e9d9a8e60a6f062c0b53c9c02e5d73768453998d..28f034b8a3b7226efe20cbe30a7= da0c2b49fbd96 100644 --- a/drivers/soc/aspeed/aspeed-lpc-snoop.c +++ b/drivers/soc/aspeed/aspeed-lpc-snoop.c @@ -186,10 +186,10 @@ static int aspeed_lpc_enable_snoop(struct aspeed_lpc_= snoop *lpc_snoop, struct device *dev, int channel, u16 lpc_port) { - int rc =3D 0; + const struct aspeed_lpc_snoop_model_data *model_data; u32 hicr5_en, snpwadr_mask, snpwadr_shift, hicrb_en; - const struct aspeed_lpc_snoop_model_data *model_data =3D - of_device_get_match_data(dev); + int rc =3D 0; + =20 if (lpc_snoop->chan[channel].enabled) return -EBUSY; @@ -236,9 +236,10 @@ static int aspeed_lpc_enable_snoop(struct aspeed_lpc_s= noop *lpc_snoop, regmap_update_bits(lpc_snoop->regmap, HICR5, hicr5_en, hicr5_en); regmap_update_bits(lpc_snoop->regmap, SNPWADR, snpwadr_mask, lpc_port << snpwadr_shift); - if (model_data->has_hicrb_ensnp) - regmap_update_bits(lpc_snoop->regmap, HICRB, - hicrb_en, hicrb_en); + + model_data =3D of_device_get_match_data(dev); + if (model_data && model_data->has_hicrb_ensnp) + regmap_update_bits(lpc_snoop->regmap, HICRB, hicrb_en, hicrb_en); =20 lpc_snoop->chan[channel].enabled =3D true; =20 --=20 2.39.5 From nobody Thu Dec 18 17:50:00 2025 Received: from codeconstruct.com.au (pi.codeconstruct.com.au [203.29.241.158]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id B9BEB26FA76 for ; Fri, 11 Apr 2025 01:09:12 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=203.29.241.158 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1744333754; cv=none; b=cqzun8m4LDIFbl5EFHG6uoUsxp960MF5Zr4gYWFRmH5UcnDnxLVQmPkhL1ERIOCx/WQp+dRj5osRstuLojETIup+ot0nfcJ7APVI5wvyel9HtQslw6MqOTaggAbeUyuB2oWozK3nV5l8Xkzbjkxhy5ciIZSJKLUuiCGE9Uv1Rt0= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1744333754; c=relaxed/simple; bh=iTHQc9ORJlCDjDDGtj17RbNP0g3Untm6AKISTQWSUyU=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=lEWvEk7iakVgrNrl/tjSBx9hGZdAj3Gqnvl5RuQj9l/Zru05yfHOhmOM1t/e+dSy+KARHA4pYkyJKbtbUf20jHO209uqEmbhoo319ue1j1mr4uCP/BIG8YhNIQ+zIZzaQzsmxch9E8zt5dRK7OKQ7FdBn+I1X8iC1HMyISaYGc8= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=codeconstruct.com.au; spf=pass smtp.mailfrom=codeconstruct.com.au; dkim=pass (2048-bit key) header.d=codeconstruct.com.au header.i=@codeconstruct.com.au header.b=So5fjgqt; arc=none smtp.client-ip=203.29.241.158 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=codeconstruct.com.au Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=codeconstruct.com.au Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=codeconstruct.com.au header.i=@codeconstruct.com.au header.b="So5fjgqt" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=codeconstruct.com.au; s=2022a; t=1744333750; bh=ABw4ARhNQAkd4rlXFYixFM0InLDEdXfdXSG/4HG1QLQ=; h=From:Date:Subject:References:In-Reply-To:To:Cc; b=So5fjgqt9a9pj2mC+YdxESJ/ZFNZh4U8IMB+HEFP0wC04D7yukXU067Ok9Fudgw5m I/eFeoUIFghXlhYObM+Q0OFIVkjRMLYNiu2/zlSSBu0rnT5+AkmvrCztE7AF2i7Zw5 do7euB8rxbndWNAiuvpLeL807qtoFuGMPdPKWfjbpQQIiH4VUR44T2fyDXmZ3g7Rdp pzlUl7giYfvNYNWQ9kxC1H7WVwzwln1zHX87DRf4BbF5qbLa4qEzyyvMxHJN06w9Lg YHZO5UtF2UHjq5jitMgrBk8vBnDhj+T9jKTp1rCFPr8YvrhJUP3ufKJtUftKgK3aep a9802cCCXkNWg== Received: from [127.0.1.1] (unknown [180.150.112.225]) by mail.codeconstruct.com.au (Postfix) with ESMTPSA id 01ECA7D714; Fri, 11 Apr 2025 09:09:09 +0800 (AWST) From: Andrew Jeffery Date: Fri, 11 Apr 2025 10:38:34 +0930 Subject: [PATCH 4/7] soc: aspeed: lpc-snoop: Constrain parameters in channel paths 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: <20250411-aspeed-lpc-snoop-fixes-v1-4-64f522e3ad6f@codeconstruct.com.au> References: <20250411-aspeed-lpc-snoop-fixes-v1-0-64f522e3ad6f@codeconstruct.com.au> In-Reply-To: <20250411-aspeed-lpc-snoop-fixes-v1-0-64f522e3ad6f@codeconstruct.com.au> To: linux-aspeed@lists.ozlabs.org Cc: Joel Stanley , Henry Martin , Jean Delvare , Patrick Rudolph , Andrew Geissler , Ninad Palsule , Patrick Venture , Robert Lippert , linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org, Andrew Jeffery X-Mailer: b4 0.14.2 Ensure pointers and the channel index are valid before use. Fixes: 9f4f9ae81d0a ("drivers/misc: add Aspeed LPC snoop driver") Signed-off-by: Andrew Jeffery Acked-by: Jean Delvare --- drivers/soc/aspeed/aspeed-lpc-snoop.c | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/drivers/soc/aspeed/aspeed-lpc-snoop.c b/drivers/soc/aspeed/asp= eed-lpc-snoop.c index 28f034b8a3b7226efe20cbe30a7da0c2b49fbd96..6ab362aeb180c8ad356422d8257= 717f41a232b3c 100644 --- a/drivers/soc/aspeed/aspeed-lpc-snoop.c +++ b/drivers/soc/aspeed/aspeed-lpc-snoop.c @@ -182,6 +182,7 @@ static int aspeed_lpc_snoop_config_irq(struct aspeed_lp= c_snoop *lpc_snoop, return 0; } =20 +__attribute__((nonnull)) static int aspeed_lpc_enable_snoop(struct aspeed_lpc_snoop *lpc_snoop, struct device *dev, int channel, u16 lpc_port) @@ -190,6 +191,8 @@ static int aspeed_lpc_enable_snoop(struct aspeed_lpc_sn= oop *lpc_snoop, u32 hicr5_en, snpwadr_mask, snpwadr_shift, hicrb_en; int rc =3D 0; =20 + if (channel < 0 || channel >=3D ARRAY_SIZE(lpc_snoop->chan)) + return -EINVAL; =20 if (lpc_snoop->chan[channel].enabled) return -EBUSY; @@ -252,9 +255,13 @@ static int aspeed_lpc_enable_snoop(struct aspeed_lpc_s= noop *lpc_snoop, return rc; } =20 +__attribute__((nonnull)) static void aspeed_lpc_disable_snoop(struct aspeed_lpc_snoop *lpc_snoop, int channel) { + if (channel < 0 || channel >=3D ARRAY_SIZE(lpc_snoop->chan)) + return; + if (!lpc_snoop->chan[channel].enabled) return; =20 --=20 2.39.5 From nobody Thu Dec 18 17:50:00 2025 Received: from codeconstruct.com.au (pi.codeconstruct.com.au [203.29.241.158]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id B56BE277020 for ; Fri, 11 Apr 2025 01:09:14 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=203.29.241.158 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1744333757; cv=none; b=RmpJWCL7Hh7B+hQyaWbB7530qtSEGLYC6XPRGaQJ6extTRPOeLpQmhLarZVOb6h+x2rQFsLAaeJBpiVke1CfEecnu0CynMdatoLHqNL32bwRJ4LLQvxZqA9B0fVT8KRMVCe0KywRBRe5mxf6s4xowFcAGwmzOHs57VpUVcCpH5I= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1744333757; c=relaxed/simple; bh=RbwiXpzOAtdjwl/ofS7lr/ti3pfItezHAD2VaMOkbZc=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=Ab/fz9P1LylGWiOxdMLgCDVSFAMjYn8bJyyymXmxjQi6HSVppzSZn3tkdYhb50lM9YAKkuZGk/BvMZHHu+hcVRuxwx/JXrHrxWpqSh6ejuODifpa662da81oDoqkV4xZRG8Z/DJFZrcm4pHlvLSZ4858NaPup3OpMhs5F9Eyko8= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=codeconstruct.com.au; spf=pass smtp.mailfrom=codeconstruct.com.au; dkim=pass (2048-bit key) header.d=codeconstruct.com.au header.i=@codeconstruct.com.au header.b=RxRK3urb; arc=none smtp.client-ip=203.29.241.158 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=codeconstruct.com.au Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=codeconstruct.com.au Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=codeconstruct.com.au header.i=@codeconstruct.com.au header.b="RxRK3urb" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=codeconstruct.com.au; s=2022a; t=1744333751; bh=5d2qecfXxLFsaK8953Ze2wHaQJoHjLdmHiRZ/zMT2W4=; h=From:Date:Subject:References:In-Reply-To:To:Cc; b=RxRK3urbtqHCux2yvKr3Gday1m7MxlHZfjP51M0pU7PtXXAT6nSXsvkkTYg3uMMzL /gkibMwHZ0RtmYUM63NDsXRhzokmXqknjY4/NNbs/0/6cA6SNZ+9icNt9jF1oNGGcj 3fACPSlg+D8I4YoBhHbIoSs0d+4bEEoSEiUdQXcfdxBdLLJsLJToHz7kpZAaO5rmYF WGbYEV5lG01NjsKuKcrqj9K/RjQcBwDTllRIi65WReUgZleU2ZY9p55O2U+bffwH/o /SGlyOXaBms/TwX/EibCD6hT3lMLAhPl0C4p2fU6Z5zZzaR+T3sWPtIxbiK5XEdI4g 0CvxqQkgLB8Rg== Received: from [127.0.1.1] (unknown [180.150.112.225]) by mail.codeconstruct.com.au (Postfix) with ESMTPSA id A59267D715; Fri, 11 Apr 2025 09:09:10 +0800 (AWST) From: Andrew Jeffery Date: Fri, 11 Apr 2025 10:38:35 +0930 Subject: [PATCH 5/7] soc: aspeed: lpc-snoop: Rename 'channel' to 'index' in channel paths 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: <20250411-aspeed-lpc-snoop-fixes-v1-5-64f522e3ad6f@codeconstruct.com.au> References: <20250411-aspeed-lpc-snoop-fixes-v1-0-64f522e3ad6f@codeconstruct.com.au> In-Reply-To: <20250411-aspeed-lpc-snoop-fixes-v1-0-64f522e3ad6f@codeconstruct.com.au> To: linux-aspeed@lists.ozlabs.org Cc: Joel Stanley , Henry Martin , Jean Delvare , Patrick Rudolph , Andrew Geissler , Ninad Palsule , Patrick Venture , Robert Lippert , linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org, Andrew Jeffery X-Mailer: b4 0.14.2 We'll introduce another 'channel' variable shortly Signed-off-by: Andrew Jeffery Acked-by: Jean Delvare --- drivers/soc/aspeed/aspeed-lpc-snoop.c | 47 ++++++++++++++++++-------------= ---- 1 file changed, 24 insertions(+), 23 deletions(-) diff --git a/drivers/soc/aspeed/aspeed-lpc-snoop.c b/drivers/soc/aspeed/asp= eed-lpc-snoop.c index 6ab362aeb180c8ad356422d8257717f41a232b3c..f6952f71eda52c95aea5ad1084e= dd218b88f1234 100644 --- a/drivers/soc/aspeed/aspeed-lpc-snoop.c +++ b/drivers/soc/aspeed/aspeed-lpc-snoop.c @@ -185,40 +185,40 @@ static int aspeed_lpc_snoop_config_irq(struct aspeed_= lpc_snoop *lpc_snoop, __attribute__((nonnull)) static int aspeed_lpc_enable_snoop(struct aspeed_lpc_snoop *lpc_snoop, struct device *dev, - int channel, u16 lpc_port) + int index, u16 lpc_port) { const struct aspeed_lpc_snoop_model_data *model_data; u32 hicr5_en, snpwadr_mask, snpwadr_shift, hicrb_en; int rc =3D 0; =20 - if (channel < 0 || channel >=3D ARRAY_SIZE(lpc_snoop->chan)) + if (index < 0 || index >=3D ARRAY_SIZE(lpc_snoop->chan)) return -EINVAL; =20 - if (lpc_snoop->chan[channel].enabled) + if (lpc_snoop->chan[index].enabled) return -EBUSY; =20 - init_waitqueue_head(&lpc_snoop->chan[channel].wq); + init_waitqueue_head(&lpc_snoop->chan[index].wq); /* Create FIFO datastructure */ - rc =3D kfifo_alloc(&lpc_snoop->chan[channel].fifo, + rc =3D kfifo_alloc(&lpc_snoop->chan[index].fifo, SNOOP_FIFO_SIZE, GFP_KERNEL); if (rc) return rc; =20 - lpc_snoop->chan[channel].miscdev.minor =3D MISC_DYNAMIC_MINOR; - lpc_snoop->chan[channel].miscdev.name =3D - devm_kasprintf(dev, GFP_KERNEL, "%s%d", DEVICE_NAME, channel); - if (!lpc_snoop->chan[channel].miscdev.name) { + lpc_snoop->chan[index].miscdev.minor =3D MISC_DYNAMIC_MINOR; + lpc_snoop->chan[index].miscdev.name =3D + devm_kasprintf(dev, GFP_KERNEL, "%s%d", DEVICE_NAME, index); + if (!lpc_snoop->chan[index].miscdev.name) { rc =3D -ENOMEM; goto err_free_fifo; } - lpc_snoop->chan[channel].miscdev.fops =3D &snoop_fops; - lpc_snoop->chan[channel].miscdev.parent =3D dev; - rc =3D misc_register(&lpc_snoop->chan[channel].miscdev); + lpc_snoop->chan[index].miscdev.fops =3D &snoop_fops; + lpc_snoop->chan[index].miscdev.parent =3D dev; + rc =3D misc_register(&lpc_snoop->chan[index].miscdev); if (rc) goto err_free_fifo; =20 /* Enable LPC snoop channel at requested port */ - switch (channel) { + switch (index) { case 0: hicr5_en =3D HICR5_EN_SNP0W | HICR5_ENINT_SNP0W; snpwadr_mask =3D SNPWADR_CH0_MASK; @@ -244,28 +244,29 @@ static int aspeed_lpc_enable_snoop(struct aspeed_lpc_= snoop *lpc_snoop, if (model_data && model_data->has_hicrb_ensnp) regmap_update_bits(lpc_snoop->regmap, HICRB, hicrb_en, hicrb_en); =20 - lpc_snoop->chan[channel].enabled =3D true; + lpc_snoop->chan[index].enabled =3D true; =20 return 0; =20 err_misc_deregister: - misc_deregister(&lpc_snoop->chan[channel].miscdev); + misc_deregister(&lpc_snoop->chan[index].miscdev); err_free_fifo: - kfifo_free(&lpc_snoop->chan[channel].fifo); + kfifo_free(&lpc_snoop->chan[index].fifo); return rc; } =20 __attribute__((nonnull)) static void aspeed_lpc_disable_snoop(struct aspeed_lpc_snoop *lpc_snoop, - int channel) + int index) { - if (channel < 0 || channel >=3D ARRAY_SIZE(lpc_snoop->chan)) + if (index < 0 || index >=3D ARRAY_SIZE(lpc_snoop->chan)) return; =20 - if (!lpc_snoop->chan[channel].enabled) + if (!lpc_snoop->chan[index].enabled) return; =20 - switch (channel) { + /* Disable interrupts along with the device */ + switch (index) { case 0: regmap_update_bits(lpc_snoop->regmap, HICR5, HICR5_EN_SNP0W | HICR5_ENINT_SNP0W, @@ -280,10 +281,10 @@ static void aspeed_lpc_disable_snoop(struct aspeed_lp= c_snoop *lpc_snoop, return; } =20 - lpc_snoop->chan[channel].enabled =3D false; + lpc_snoop->chan[index].enabled =3D false; /* Consider improving safety wrt concurrent reader(s) */ - misc_deregister(&lpc_snoop->chan[channel].miscdev); - kfifo_free(&lpc_snoop->chan[channel].fifo); + misc_deregister(&lpc_snoop->chan[index].miscdev); + kfifo_free(&lpc_snoop->chan[index].fifo); } =20 static int aspeed_lpc_snoop_probe(struct platform_device *pdev) --=20 2.39.5 From nobody Thu Dec 18 17:50:00 2025 Received: from codeconstruct.com.au (pi.codeconstruct.com.au [203.29.241.158]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id B5729277028 for ; Fri, 11 Apr 2025 01:09:14 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=203.29.241.158 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1744333756; cv=none; b=n1M3BGDquxrmHgjUQR8dx4PJF0EivTA6oq5P5t2dYij0Ur6dSrCn/GQb66zV2Uc6QFEbEh8FV9MU0L7GZAQ+RQrgCDEKVv+lBpM+5nZb9b/OWtBvTcTvy8gD6mYK3sUXJvvH8/REdabHLHtnbyGNMuOUtEmo8PLaWXw1lOlueiA= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1744333756; c=relaxed/simple; bh=gqOrP4wS+3zulmap6u+NFQIuSHAi9/1PflL5jKTKhQo=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=Q9HMC5F/MqPZsGF70fAQMBdsQjM32RqadmzasH4RHL7adYXL6IVSZVRL4z5w+tHa8yWFh2oe9gUj1AkxyZnnSxP3fPRazmIQmWvrFqTAiC3yMrFo653z0gkaKE8WfVckgctRgjm3GctlIbNPYriDWU2Zns2wYGLXvWnE0bGcMaE= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=codeconstruct.com.au; spf=pass smtp.mailfrom=codeconstruct.com.au; dkim=pass (2048-bit key) header.d=codeconstruct.com.au header.i=@codeconstruct.com.au header.b=dKMosy8m; arc=none smtp.client-ip=203.29.241.158 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=codeconstruct.com.au Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=codeconstruct.com.au Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=codeconstruct.com.au header.i=@codeconstruct.com.au header.b="dKMosy8m" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=codeconstruct.com.au; s=2022a; t=1744333751; bh=KFtQnngCykasdCrNVPG+SOfUzKEa2z4spwHYuIB44t0=; h=From:Date:Subject:References:In-Reply-To:To:Cc; b=dKMosy8m20GXWuALQvsB5mTGk5kl0tE3piF8e7cwOm5XQ8KseCkLjXYYUmwKiqbE6 1qa17aCynswRn9iV8qacBrl5Z5l88Qxjep/zHkFS1TojBwrEMC+DAD6v8sd1fOdXSQ RxGlKd0VIrrxUWtHhGHAFe22mlF5sFG+d93/t1+pF6b9/yTNL5KMHQd8ArbbaL4NO6 fp9T9z6tePrn5RSDye+wU44jh9HhwnevrBBUl7mM5HM90/0uuMpqyFNlk2j+7ZqHDc fgj2HJSo7KuuhoP+y7vD6zpzP62u116jrACB1q6D29o2robOLCK1ZLsquhetr4gC8h nwyISRwGGEOhQ== Received: from [127.0.1.1] (unknown [180.150.112.225]) by mail.codeconstruct.com.au (Postfix) with ESMTPSA id 562D97D716; Fri, 11 Apr 2025 09:09:11 +0800 (AWST) From: Andrew Jeffery Date: Fri, 11 Apr 2025 10:38:36 +0930 Subject: [PATCH 6/7] soc: aspeed: lpc-snoop: Rearrange channel paths 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: <20250411-aspeed-lpc-snoop-fixes-v1-6-64f522e3ad6f@codeconstruct.com.au> References: <20250411-aspeed-lpc-snoop-fixes-v1-0-64f522e3ad6f@codeconstruct.com.au> In-Reply-To: <20250411-aspeed-lpc-snoop-fixes-v1-0-64f522e3ad6f@codeconstruct.com.au> To: linux-aspeed@lists.ozlabs.org Cc: Joel Stanley , Henry Martin , Jean Delvare , Patrick Rudolph , Andrew Geissler , Ninad Palsule , Patrick Venture , Robert Lippert , linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org, Andrew Jeffery X-Mailer: b4 0.14.2 Order assignments such that tests for conditions not involving resource acquisition are ordered before those testing acquired resources, and order managed resource acquisition before unmanaged where possible. This way we minimise the amount of manual cleanup required. In the process, improve readability of the code by introducing a channel pointer that takes the place of the repeated object lookups. Signed-off-by: Andrew Jeffery Acked-by: Jean Delvare --- drivers/soc/aspeed/aspeed-lpc-snoop.c | 47 ++++++++++++++++++++-----------= ---- 1 file changed, 27 insertions(+), 20 deletions(-) diff --git a/drivers/soc/aspeed/aspeed-lpc-snoop.c b/drivers/soc/aspeed/asp= eed-lpc-snoop.c index f6952f71eda52c95aea5ad1084edd218b88f1234..0b2044fd79b1be08dfa33bfcaf2= 49b020c909bb9 100644 --- a/drivers/soc/aspeed/aspeed-lpc-snoop.c +++ b/drivers/soc/aspeed/aspeed-lpc-snoop.c @@ -189,31 +189,33 @@ static int aspeed_lpc_enable_snoop(struct aspeed_lpc_= snoop *lpc_snoop, { const struct aspeed_lpc_snoop_model_data *model_data; u32 hicr5_en, snpwadr_mask, snpwadr_shift, hicrb_en; + struct aspeed_lpc_snoop_channel *channel; int rc =3D 0; =20 if (index < 0 || index >=3D ARRAY_SIZE(lpc_snoop->chan)) return -EINVAL; =20 - if (lpc_snoop->chan[index].enabled) + channel =3D &lpc_snoop->chan[index]; + + if (channel->enabled) return -EBUSY; =20 - init_waitqueue_head(&lpc_snoop->chan[index].wq); - /* Create FIFO datastructure */ - rc =3D kfifo_alloc(&lpc_snoop->chan[index].fifo, - SNOOP_FIFO_SIZE, GFP_KERNEL); + init_waitqueue_head(&channel->wq); + + channel->miscdev.minor =3D MISC_DYNAMIC_MINOR; + channel->miscdev.fops =3D &snoop_fops; + channel->miscdev.parent =3D dev; + + channel->miscdev.name =3D + devm_kasprintf(dev, GFP_KERNEL, "%s%d", DEVICE_NAME, index); + if (!channel->miscdev.name) + return -ENOMEM; + + rc =3D kfifo_alloc(&channel->fifo, SNOOP_FIFO_SIZE, GFP_KERNEL); if (rc) return rc; =20 - lpc_snoop->chan[index].miscdev.minor =3D MISC_DYNAMIC_MINOR; - lpc_snoop->chan[index].miscdev.name =3D - devm_kasprintf(dev, GFP_KERNEL, "%s%d", DEVICE_NAME, index); - if (!lpc_snoop->chan[index].miscdev.name) { - rc =3D -ENOMEM; - goto err_free_fifo; - } - lpc_snoop->chan[index].miscdev.fops =3D &snoop_fops; - lpc_snoop->chan[index].miscdev.parent =3D dev; - rc =3D misc_register(&lpc_snoop->chan[index].miscdev); + rc =3D misc_register(&channel->miscdev); if (rc) goto err_free_fifo; =20 @@ -236,6 +238,7 @@ static int aspeed_lpc_enable_snoop(struct aspeed_lpc_sn= oop *lpc_snoop, goto err_misc_deregister; } =20 + /* Enable LPC snoop channel at requested port */ regmap_update_bits(lpc_snoop->regmap, HICR5, hicr5_en, hicr5_en); regmap_update_bits(lpc_snoop->regmap, SNPWADR, snpwadr_mask, lpc_port << snpwadr_shift); @@ -244,7 +247,7 @@ static int aspeed_lpc_enable_snoop(struct aspeed_lpc_sn= oop *lpc_snoop, if (model_data && model_data->has_hicrb_ensnp) regmap_update_bits(lpc_snoop->regmap, HICRB, hicrb_en, hicrb_en); =20 - lpc_snoop->chan[index].enabled =3D true; + channel->enabled =3D true; =20 return 0; =20 @@ -259,10 +262,14 @@ __attribute__((nonnull)) static void aspeed_lpc_disable_snoop(struct aspeed_lpc_snoop *lpc_snoop, int index) { + struct aspeed_lpc_snoop_channel *channel; + if (index < 0 || index >=3D ARRAY_SIZE(lpc_snoop->chan)) return; =20 - if (!lpc_snoop->chan[index].enabled) + channel =3D &lpc_snoop->chan[index]; + + if (!channel->enabled) return; =20 /* Disable interrupts along with the device */ @@ -281,10 +288,10 @@ static void aspeed_lpc_disable_snoop(struct aspeed_lp= c_snoop *lpc_snoop, return; } =20 - lpc_snoop->chan[index].enabled =3D false; + channel->enabled =3D false; /* Consider improving safety wrt concurrent reader(s) */ - misc_deregister(&lpc_snoop->chan[index].miscdev); - kfifo_free(&lpc_snoop->chan[index].fifo); + misc_deregister(&channel->miscdev); + kfifo_free(&channel->fifo); } =20 static int aspeed_lpc_snoop_probe(struct platform_device *pdev) --=20 2.39.5 From nobody Thu Dec 18 17:50:00 2025 Received: from codeconstruct.com.au (pi.codeconstruct.com.au [203.29.241.158]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 5F0CB277813 for ; Fri, 11 Apr 2025 01:09:15 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=203.29.241.158 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1744333757; cv=none; b=t13FVwC9rd+dkAZB2ac1OYVYnV6bD0JCWcHo1aRU4+5cYYGkf7CCpsGwA6gYXHqj587CBU3H1+Bv3AN1VnU7yY9F60YmLety7Cv55EQAs5lYchOgkJskZrr48jXvugHVXPHdWCzOtwIwjK8jFDKwGDBY1IY4dnG6iNuux2na0Ho= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1744333757; c=relaxed/simple; bh=LrP+ipWnCA5TPWfgCau0QTS5BKGUb5r5yRPdt3zcBsE=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=RSRkONgK4PHzifqSmr7MtgxOqcuq4rkyzCZZp+JrfoJSUkw+KyikgF/yfmQ4rdmFhsK5P93Rj1Ef6YU0f1w5EgRv+oynAhcS8wV9EFf8EhO9vylKYu5HHRjKsFjMckfNHlhAWA/XRdEzBbmIDwS/xXI+1LpXNA0oZy7F9nqTZig= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=codeconstruct.com.au; spf=pass smtp.mailfrom=codeconstruct.com.au; dkim=pass (2048-bit key) header.d=codeconstruct.com.au header.i=@codeconstruct.com.au header.b=Q8c6qqoe; arc=none smtp.client-ip=203.29.241.158 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=codeconstruct.com.au Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=codeconstruct.com.au Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=codeconstruct.com.au header.i=@codeconstruct.com.au header.b="Q8c6qqoe" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=codeconstruct.com.au; s=2022a; t=1744333752; bh=gIkAaCaSRxoDKHS10fE7AU9S0jyaF+J3B0+u4ydPtBo=; h=From:Date:Subject:References:In-Reply-To:To:Cc; b=Q8c6qqoe+aZNDwwnV4L7OyUawRWb9tkB2mDBA6g0V4v6FjJVBOgcuXKiF4TcHubPT J+WwIuvytl9UydDMC7o2yZC6P7/4m0F1zzHaUlNygBrGOlVe+UPeaKMdKmwJRHIdx2 RiKE5z3xdHKX+QOcCfG7/ZDSRlZf4AwFu1L8t4rKRI6YLeRrUAhU66eAQCFTn/LCrK JKvQDNQPBBpgAfBggNqRMaqgsPruKNGtDWZXl0B1qYxcnkyq0G2+pLPLi+8SZCdWUL ltXjZ+6fo62eSYxrPS39qZPcB+LfR5sDyCiEqOLe7J00pbIgkUo/tKhS4LvEo/60Nt 2M2m3Zo1T3IwQ== Received: from [127.0.1.1] (unknown [180.150.112.225]) by mail.codeconstruct.com.au (Postfix) with ESMTPSA id 09C097D717; Fri, 11 Apr 2025 09:09:11 +0800 (AWST) From: Andrew Jeffery Date: Fri, 11 Apr 2025 10:38:37 +0930 Subject: [PATCH 7/7] soc: aspeed: lpc-snoop: Lift channel config to const structs 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: <20250411-aspeed-lpc-snoop-fixes-v1-7-64f522e3ad6f@codeconstruct.com.au> References: <20250411-aspeed-lpc-snoop-fixes-v1-0-64f522e3ad6f@codeconstruct.com.au> In-Reply-To: <20250411-aspeed-lpc-snoop-fixes-v1-0-64f522e3ad6f@codeconstruct.com.au> To: linux-aspeed@lists.ozlabs.org Cc: Joel Stanley , Henry Martin , Jean Delvare , Patrick Rudolph , Andrew Geissler , Ninad Palsule , Patrick Venture , Robert Lippert , linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org, Andrew Jeffery X-Mailer: b4 0.14.2 The shifts and masks for each channel are defined by hardware and are not something that changes at runtime. Accordingly, describe the information in an array of const structs and associate elements with each channel instance, removing the need for the switch and handling of its default case. Signed-off-by: Andrew Jeffery --- drivers/soc/aspeed/aspeed-lpc-snoop.c | 82 +++++++++++++++++--------------= ---- 1 file changed, 41 insertions(+), 41 deletions(-) diff --git a/drivers/soc/aspeed/aspeed-lpc-snoop.c b/drivers/soc/aspeed/asp= eed-lpc-snoop.c index 0b2044fd79b1be08dfa33bfcaf249b020c909bb9..b54d8fbf7b83ebadd4fe1b16cbd= df07a0bfac868 100644 --- a/drivers/soc/aspeed/aspeed-lpc-snoop.c +++ b/drivers/soc/aspeed/aspeed-lpc-snoop.c @@ -10,6 +10,7 @@ * 0x80 writes made by the BIOS during the boot process. */ =20 +#include "linux/ratelimit.h" #include #include #include @@ -57,7 +58,15 @@ struct aspeed_lpc_snoop_model_data { unsigned int has_hicrb_ensnp; }; =20 +struct aspeed_lpc_snoop_channel_cfg { + u32 hicr5_en; + u32 snpwadr_mask; + u32 snpwadr_shift; + u32 hicrb_en; +}; + struct aspeed_lpc_snoop_channel { + const struct aspeed_lpc_snoop_channel_cfg *cfg; bool enabled; struct kfifo fifo; wait_queue_head_t wq; @@ -188,7 +197,6 @@ static int aspeed_lpc_enable_snoop(struct aspeed_lpc_sn= oop *lpc_snoop, int index, u16 lpc_port) { const struct aspeed_lpc_snoop_model_data *model_data; - u32 hicr5_en, snpwadr_mask, snpwadr_shift, hicrb_en; struct aspeed_lpc_snoop_channel *channel; int rc =3D 0; =20 @@ -200,6 +208,9 @@ static int aspeed_lpc_enable_snoop(struct aspeed_lpc_sn= oop *lpc_snoop, if (channel->enabled) return -EBUSY; =20 + if (WARN_ONCE(!channel->cfg, "snoop channel %d lacks required config", in= dex)) + return -EINVAL; + init_waitqueue_head(&channel->wq); =20 channel->miscdev.minor =3D MISC_DYNAMIC_MINOR; @@ -220,39 +231,20 @@ static int aspeed_lpc_enable_snoop(struct aspeed_lpc_= snoop *lpc_snoop, goto err_free_fifo; =20 /* Enable LPC snoop channel at requested port */ - switch (index) { - case 0: - hicr5_en =3D HICR5_EN_SNP0W | HICR5_ENINT_SNP0W; - snpwadr_mask =3D SNPWADR_CH0_MASK; - snpwadr_shift =3D SNPWADR_CH0_SHIFT; - hicrb_en =3D HICRB_ENSNP0D; - break; - case 1: - hicr5_en =3D HICR5_EN_SNP1W | HICR5_ENINT_SNP1W; - snpwadr_mask =3D SNPWADR_CH1_MASK; - snpwadr_shift =3D SNPWADR_CH1_SHIFT; - hicrb_en =3D HICRB_ENSNP1D; - break; - default: - rc =3D -EINVAL; - goto err_misc_deregister; - } - - /* Enable LPC snoop channel at requested port */ - regmap_update_bits(lpc_snoop->regmap, HICR5, hicr5_en, hicr5_en); - regmap_update_bits(lpc_snoop->regmap, SNPWADR, snpwadr_mask, - lpc_port << snpwadr_shift); + regmap_update_bits(lpc_snoop->regmap, HICR5, channel->cfg->hicr5_en, + channel->cfg->hicr5_en); + regmap_update_bits(lpc_snoop->regmap, SNPWADR, channel->cfg->snpwadr_mask, + lpc_port << channel->cfg->snpwadr_shift); =20 model_data =3D of_device_get_match_data(dev); if (model_data && model_data->has_hicrb_ensnp) - regmap_update_bits(lpc_snoop->regmap, HICRB, hicrb_en, hicrb_en); + regmap_update_bits(lpc_snoop->regmap, HICRB, channel->cfg->hicrb_en, + channel->cfg->hicrb_en); =20 channel->enabled =3D true; =20 return 0; =20 -err_misc_deregister: - misc_deregister(&lpc_snoop->chan[index].miscdev); err_free_fifo: kfifo_free(&lpc_snoop->chan[index].fifo); return rc; @@ -272,21 +264,7 @@ static void aspeed_lpc_disable_snoop(struct aspeed_lpc= _snoop *lpc_snoop, if (!channel->enabled) return; =20 - /* Disable interrupts along with the device */ - switch (index) { - case 0: - regmap_update_bits(lpc_snoop->regmap, HICR5, - HICR5_EN_SNP0W | HICR5_ENINT_SNP0W, - 0); - break; - case 1: - regmap_update_bits(lpc_snoop->regmap, HICR5, - HICR5_EN_SNP1W | HICR5_ENINT_SNP1W, - 0); - break; - default: - return; - } + regmap_update_bits(lpc_snoop->regmap, HICR5, channel->cfg->hicr5_en, 0); =20 channel->enabled =3D false; /* Consider improving safety wrt concurrent reader(s) */ @@ -294,6 +272,21 @@ static void aspeed_lpc_disable_snoop(struct aspeed_lpc= _snoop *lpc_snoop, kfifo_free(&channel->fifo); } =20 +static const struct aspeed_lpc_snoop_channel_cfg channel_cfgs[] =3D { + { + .hicr5_en =3D HICR5_EN_SNP0W | HICR5_ENINT_SNP0W, + .snpwadr_mask =3D SNPWADR_CH0_MASK, + .snpwadr_shift =3D SNPWADR_CH0_SHIFT, + .hicrb_en =3D HICRB_ENSNP0D, + }, + { + .hicr5_en =3D HICR5_EN_SNP1W | HICR5_ENINT_SNP1W, + .snpwadr_mask =3D SNPWADR_CH1_MASK, + .snpwadr_shift =3D SNPWADR_CH1_SHIFT, + .hicrb_en =3D HICRB_ENSNP1D, + }, +}; + static int aspeed_lpc_snoop_probe(struct platform_device *pdev) { struct aspeed_lpc_snoop *lpc_snoop; @@ -308,6 +301,13 @@ static int aspeed_lpc_snoop_probe(struct platform_devi= ce *pdev) if (!lpc_snoop) return -ENOMEM; =20 + static_assert(ARRAY_SIZE(channel_cfgs) =3D=3D ARRAY_SIZE(lpc_snoop->chan), + "Broken implementation assumption regarding cfg count"); + static_assert(ARRAY_SIZE(lpc_snoop->chan) =3D=3D 2, + "Broken implementation assumption regarding channel count"); + lpc_snoop->chan[0].cfg =3D &channel_cfgs[0]; + lpc_snoop->chan[1].cfg =3D &channel_cfgs[1]; + np =3D pdev->dev.parent->of_node; if (!of_device_is_compatible(np, "aspeed,ast2400-lpc-v2") && !of_device_is_compatible(np, "aspeed,ast2500-lpc-v2") && --=20 2.39.5