ntb: ntb_hw_switchtec: Fix shift-out-of-bounds for 0 mw lut
authorMaciej Grochowski <Maciej.Grochowski@sony.com>
Thu, 13 Feb 2025 22:53:17 +0000 (14:53 -0800)
committerJon Mason <jdmason@kudzu.us>
Fri, 20 Feb 2026 22:31:55 +0000 (17:31 -0500)
Number of MW LUTs depends on NTB configuration and can be set to zero,
in such scenario rounddown_pow_of_two will cause undefined behaviour and
should not be performed.
This patch ensures that rounddown_pow_of_two is called on valid value.

Signed-off-by: Maciej Grochowski <Maciej.Grochowski@sony.com>
Signed-off-by: Jon Mason <jdmason@kudzu.us>
drivers/ntb/hw/mscc/ntb_hw_switchtec.c

index f851397..75809a5 100644 (file)
@@ -1202,7 +1202,8 @@ static void switchtec_ntb_init_mw(struct switchtec_ntb *sndev)
                                       sndev->mmio_self_ctrl);
 
        sndev->nr_lut_mw = ioread16(&sndev->mmio_self_ctrl->lut_table_entries);
-       sndev->nr_lut_mw = rounddown_pow_of_two(sndev->nr_lut_mw);
+       if (sndev->nr_lut_mw)
+               sndev->nr_lut_mw = rounddown_pow_of_two(sndev->nr_lut_mw);
 
        dev_dbg(&sndev->stdev->dev, "MWs: %d direct, %d lut\n",
                sndev->nr_direct_mw, sndev->nr_lut_mw);
@@ -1212,7 +1213,8 @@ static void switchtec_ntb_init_mw(struct switchtec_ntb *sndev)
 
        sndev->peer_nr_lut_mw =
                ioread16(&sndev->mmio_peer_ctrl->lut_table_entries);
-       sndev->peer_nr_lut_mw = rounddown_pow_of_two(sndev->peer_nr_lut_mw);
+       if (sndev->peer_nr_lut_mw)
+               sndev->peer_nr_lut_mw = rounddown_pow_of_two(sndev->peer_nr_lut_mw);
 
        dev_dbg(&sndev->stdev->dev, "Peer MWs: %d direct, %d lut\n",
                sndev->peer_nr_direct_mw, sndev->peer_nr_lut_mw);