int rvu_set_channels_base(struct rvu *rvu)
 {
+       u16 nr_lbk_chans, nr_sdp_chans, nr_cgx_chans, nr_cpt_chans;
+       u16 sdp_chan_base, cgx_chan_base, cpt_chan_base;
        struct rvu_hwinfo *hw = rvu->hw;
-       u16 cpt_chan_base;
-       u64 nix_const;
+       u64 nix_const, nix_const1;
        int blkaddr;
 
        blkaddr = rvu_get_blkaddr(rvu, BLKTYPE_NIX, 0);
                return blkaddr;
 
        nix_const = rvu_read64(rvu, blkaddr, NIX_AF_CONST);
+       nix_const1 = rvu_read64(rvu, blkaddr, NIX_AF_CONST1);
 
        hw->cgx = (nix_const >> 12) & 0xFULL;
        hw->lmac_per_cgx = (nix_const >> 8) & 0xFULL;
         * channels such that all channel numbers are contiguous
         * leaving no holes. This way the new CPT channels can be
         * accomodated. The order of channel numbers assigned is
-        * LBK, SDP, CGX and CPT.
+        * LBK, SDP, CGX and CPT. Also the base channel number
+        * of a block must be multiple of number of channels
+        * of the block.
         */
-       hw->sdp_chan_base = hw->lbk_chan_base + hw->lbk_links *
-                               ((nix_const >> 16) & 0xFFULL);
-       hw->cgx_chan_base = hw->sdp_chan_base + hw->sdp_links * SDP_CHANNELS;
+       nr_lbk_chans = (nix_const >> 16) & 0xFFULL;
+       nr_sdp_chans = nix_const1 & 0xFFFULL;
+       nr_cgx_chans = nix_const & 0xFFULL;
+       nr_cpt_chans = (nix_const >> 32) & 0xFFFULL;
 
-       cpt_chan_base = hw->cgx_chan_base + hw->cgx_links *
-                               (nix_const & 0xFFULL);
+       sdp_chan_base = hw->lbk_chan_base + hw->lbk_links * nr_lbk_chans;
+       /* Round up base channel to multiple of number of channels */
+       hw->sdp_chan_base = ALIGN(sdp_chan_base, nr_sdp_chans);
+
+       cgx_chan_base = hw->sdp_chan_base + hw->sdp_links * nr_sdp_chans;
+       hw->cgx_chan_base = ALIGN(cgx_chan_base, nr_cgx_chans);
+
+       cpt_chan_base = hw->cgx_chan_base + hw->cgx_links * nr_cgx_chans;
+       hw->cpt_chan_base = ALIGN(cpt_chan_base, nr_cpt_chans);
 
        /* Out of 4096 channels start CPT from 2048 so
         * that MSB for CPT channels is always set
 
 static void __rvu_nix_set_channels(struct rvu *rvu, int blkaddr)
 {
+       u64 nix_const1 = rvu_read64(rvu, blkaddr, NIX_AF_CONST1);
        u64 nix_const = rvu_read64(rvu, blkaddr, NIX_AF_CONST);
        u16 cgx_chans, lbk_chans, sdp_chans, cpt_chans;
        struct rvu_hwinfo *hw = rvu->hw;
 
        cgx_chans = nix_const & 0xFFULL;
        lbk_chans = (nix_const >> 16) & 0xFFULL;
-       sdp_chans = SDP_CHANNELS;
+       sdp_chans = nix_const1 & 0xFFFULL;
        cpt_chans = (nix_const >> 32) & 0xFFFULL;
 
        start = hw->cgx_chan_base;