| From 6f30c568f863455f5246959022a050716b94da38 Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Fri, 30 Jun 2023 11:58:44 +0530 |
| Subject: octeontx2-af: Add validation before accessing cgx and lmac |
| |
| From: Hariprasad Kelam <hkelam@marvell.com> |
| |
| [ Upstream commit 79ebb53772c95d3a6ae51b3c65f9985fdd430df6 ] |
| |
| with the addition of new MAC blocks like CN10K RPM and CN10KB |
| RPM_USX, LMACs are noncontiguous and CGX blocks are also |
| noncontiguous. But during RVU driver initialization, the driver |
| is assuming they are contiguous and trying to access |
| cgx or lmac with their id which is resulting in kernel panic. |
| |
| This patch fixes the issue by adding proper checks. |
| |
| [ 23.219150] pc : cgx_lmac_read+0x38/0x70 |
| [ 23.219154] lr : rvu_program_channels+0x3f0/0x498 |
| [ 23.223852] sp : ffff000100d6fc80 |
| [ 23.227158] x29: ffff000100d6fc80 x28: ffff00010009f880 x27: |
| 000000000000005a |
| [ 23.234288] x26: ffff000102586768 x25: 0000000000002500 x24: |
| fffffffffff0f000 |
| |
| Fixes: 91c6945ea1f9 ("octeontx2-af: cn10k: Add RPM MAC support") |
| Signed-off-by: Hariprasad Kelam <hkelam@marvell.com> |
| Signed-off-by: Sunil Goutham <sgoutham@marvell.com> |
| Reviewed-by: Simon Horman <simon.horman@corigine.com> |
| Signed-off-by: David S. Miller <davem@davemloft.net> |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| drivers/net/ethernet/marvell/octeontx2/af/cgx.c | 7 +++++++ |
| 1 file changed, 7 insertions(+) |
| |
| diff --git a/drivers/net/ethernet/marvell/octeontx2/af/cgx.c b/drivers/net/ethernet/marvell/octeontx2/af/cgx.c |
| index bd77152bb8d7c..f4bdca662d616 100644 |
| --- a/drivers/net/ethernet/marvell/octeontx2/af/cgx.c |
| +++ b/drivers/net/ethernet/marvell/octeontx2/af/cgx.c |
| @@ -169,6 +169,9 @@ void cgx_lmac_write(int cgx_id, int lmac_id, u64 offset, u64 val) |
| { |
| struct cgx *cgx_dev = cgx_get_pdata(cgx_id); |
| |
| + /* Software must not access disabled LMAC registers */ |
| + if (!is_lmac_valid(cgx_dev, lmac_id)) |
| + return; |
| cgx_write(cgx_dev, lmac_id, offset, val); |
| } |
| |
| @@ -176,6 +179,10 @@ u64 cgx_lmac_read(int cgx_id, int lmac_id, u64 offset) |
| { |
| struct cgx *cgx_dev = cgx_get_pdata(cgx_id); |
| |
| + /* Software must not access disabled LMAC registers */ |
| + if (!is_lmac_valid(cgx_dev, lmac_id)) |
| + return 0; |
| + |
| return cgx_read(cgx_dev, lmac_id, offset); |
| } |
| |
| -- |
| 2.39.2 |
| |