for (i = 0; i < num_actions; i++) {
                struct mlx5dr_action_dest_tbl *dest_tbl;
+               struct mlx5dr_icm_chunk *chunk;
                struct mlx5dr_action *action;
                int max_actions_type = 1;
                u32 action_type;
                                                   matcher->tbl->level,
                                                   dest_tbl->tbl->level);
                                }
-                               attr.final_icm_addr = rx_rule ?
-                                       dest_tbl->tbl->rx.s_anchor->chunk->icm_addr :
-                                       dest_tbl->tbl->tx.s_anchor->chunk->icm_addr;
+                               chunk = rx_rule ? dest_tbl->tbl->rx.s_anchor->chunk :
+                                       dest_tbl->tbl->tx.s_anchor->chunk;
+                               attr.final_icm_addr = mlx5dr_icm_pool_get_chunk_icm_addr(chunk);
                        } else {
                                struct mlx5dr_cmd_query_flow_table_details output;
                                int ret;
                }
 
                action->rewrite->data = (void *)hw_actions;
-               action->rewrite->index = (action->rewrite->chunk->icm_addr -
+               action->rewrite->index = (mlx5dr_icm_pool_get_chunk_icm_addr
+                                         (action->rewrite->chunk) -
                                         dmn->info.caps.hdr_modify_icm_addr) /
                                         ACTION_CACHE_LINE_SIZE;
 
        action->rewrite->modify_ttl = modify_ttl;
        action->rewrite->data = (u8 *)hw_actions;
        action->rewrite->num_of_actions = num_hw_actions;
-       action->rewrite->index = (chunk->icm_addr -
+       action->rewrite->index = (mlx5dr_icm_pool_get_chunk_icm_addr(chunk) -
                                  dmn->info.caps.hdr_modify_icm_addr) /
                                  ACTION_CACHE_LINE_SIZE;
 
 
                      const u64 matcher_id)
 {
        enum dr_dump_rec_type rec_type;
+       u64 s_icm_addr, e_icm_addr;
        int i, ret;
 
        rec_type = is_rx ? DR_DUMP_REC_TYPE_MATCHER_RX :
                           DR_DUMP_REC_TYPE_MATCHER_TX;
 
+       s_icm_addr = mlx5dr_icm_pool_get_chunk_icm_addr(matcher_rx_tx->s_htbl->chunk);
+       e_icm_addr = mlx5dr_icm_pool_get_chunk_icm_addr(matcher_rx_tx->e_anchor->chunk);
        seq_printf(file, "%d,0x%llx,0x%llx,%d,0x%llx,0x%llx\n",
                   rec_type, DR_DBG_PTR_TO_ID(matcher_rx_tx),
                   matcher_id, matcher_rx_tx->num_of_builders,
-                  dr_dump_icm_to_idx(matcher_rx_tx->s_htbl->chunk->icm_addr),
-                  dr_dump_icm_to_idx(matcher_rx_tx->e_anchor->chunk->icm_addr));
+                  dr_dump_icm_to_idx(s_icm_addr),
+                  dr_dump_icm_to_idx(e_icm_addr));
 
        for (i = 0; i < matcher_rx_tx->num_of_builders; i++) {
                ret = dr_dump_matcher_builder(file,
                    const u64 table_id)
 {
        enum dr_dump_rec_type rec_type;
+       u64 s_icm_addr;
 
        rec_type = is_rx ? DR_DUMP_REC_TYPE_TABLE_RX :
                           DR_DUMP_REC_TYPE_TABLE_TX;
 
+       s_icm_addr = mlx5dr_icm_pool_get_chunk_icm_addr(table_rx_tx->s_anchor->chunk);
        seq_printf(file, "%d,0x%llx,0x%llx\n", rec_type, table_id,
-                  dr_dump_icm_to_idx(table_rx_tx->s_anchor->chunk->icm_addr));
+                  dr_dump_icm_to_idx(s_icm_addr));
 
        return 0;
 }
 
        return chunk->buddy_mem->icm_mr->mkey;
 }
 
+u64 mlx5dr_icm_pool_get_chunk_icm_addr(struct mlx5dr_icm_chunk *chunk)
+{
+       u32 size = mlx5dr_icm_pool_dm_type_to_entry_size(chunk->buddy_mem->pool->icm_type);
+
+       return (u64)chunk->buddy_mem->icm_mr->icm_start_addr + size * chunk->seg;
+}
+
 static struct mlx5dr_icm_mr *
 dr_icm_pool_mr_create(struct mlx5dr_icm_pool *pool)
 {
 
        offset = mlx5dr_icm_pool_dm_type_to_entry_size(pool->icm_type) * seg;
 
-       chunk->icm_addr =
-               (uintptr_t)buddy_mem_pool->icm_mr->icm_start_addr + offset;
        chunk->num_of_entries =
                mlx5dr_icm_pool_chunk_size_to_entries(chunk_size);
        chunk->byte_size =
 
 
        /* Connect start hash table to end anchor */
        info.type = CONNECT_MISS;
-       info.miss_icm_addr = curr_nic_matcher->e_anchor->chunk->icm_addr;
+       info.miss_icm_addr = mlx5dr_icm_pool_get_chunk_icm_addr(curr_nic_matcher->e_anchor->chunk);
        ret = mlx5dr_ste_htbl_init_and_postsend(dmn, nic_dmn,
                                                curr_nic_matcher->s_htbl,
                                                &info, false);
 
        struct mlx5dr_ste_ctx *ste_ctx = dmn->ste_ctx;
        struct mlx5dr_ste_htbl *new_htbl;
        struct mlx5dr_ste *ste;
+       u64 icm_addr;
 
        /* Create new table for miss entry */
        new_htbl = mlx5dr_ste_htbl_alloc(dmn->ste_icm_pool,
 
        /* One and only entry, never grows */
        ste = new_htbl->ste_arr;
-       mlx5dr_ste_set_miss_addr(ste_ctx, hw_ste,
-                                nic_matcher->e_anchor->chunk->icm_addr);
+       icm_addr = mlx5dr_icm_pool_get_chunk_icm_addr(nic_matcher->e_anchor->chunk);
+       mlx5dr_ste_set_miss_addr(ste_ctx, hw_ste, icm_addr);
        mlx5dr_htbl_get(new_htbl);
 
        return ste;
        bool use_update_list = false;
        u8 hw_ste[DR_STE_SIZE] = {};
        struct mlx5dr_ste *new_ste;
+       u64 icm_addr;
        int new_idx;
        u8 sb_idx;
 
        mlx5dr_ste_set_bit_mask(hw_ste, nic_matcher->ste_builder[sb_idx].bit_mask);
 
        /* Copy STE control and tag */
+       icm_addr = mlx5dr_icm_pool_get_chunk_icm_addr(nic_matcher->e_anchor->chunk);
        memcpy(hw_ste, cur_ste->hw_ste, DR_STE_SIZE_REDUCED);
-       mlx5dr_ste_set_miss_addr(dmn->ste_ctx, hw_ste,
-                                nic_matcher->e_anchor->chunk->icm_addr);
+       mlx5dr_ste_set_miss_addr(dmn->ste_ctx, hw_ste, icm_addr);
 
        new_idx = mlx5dr_ste_calc_hash_index(hw_ste, new_htbl);
        new_ste = &new_htbl->ste_arr[new_idx];
 
        /* Write new table to HW */
        info.type = CONNECT_MISS;
-       info.miss_icm_addr = nic_matcher->e_anchor->chunk->icm_addr;
+       info.miss_icm_addr = mlx5dr_icm_pool_get_chunk_icm_addr(nic_matcher->e_anchor->chunk);
        mlx5dr_ste_set_formatted_ste(dmn->ste_ctx,
                                     dmn->info.caps.gvmi,
                                     nic_dmn->type,
                 */
                mlx5dr_ste_set_hit_addr(dmn->ste_ctx,
                                        prev_htbl->ste_arr[0].hw_ste,
-                                       new_htbl->chunk->icm_addr,
+                                       mlx5dr_icm_pool_get_chunk_icm_addr(new_htbl->chunk),
                                        new_htbl->chunk->num_of_entries);
 
                ste_to_update = &prev_htbl->ste_arr[0];
 {
        struct mlx5dr_domain *dmn = matcher->tbl->dmn;
        struct mlx5dr_ste_send_info *ste_info;
+       u64 icm_addr;
 
        /* Take ref on table, only on first time this ste is used */
        mlx5dr_htbl_get(cur_htbl);
        /* new entry -> new branch */
        list_add_tail(&ste->miss_list_node, miss_list);
 
-       mlx5dr_ste_set_miss_addr(dmn->ste_ctx, hw_ste,
-                                nic_matcher->e_anchor->chunk->icm_addr);
+       icm_addr = mlx5dr_icm_pool_get_chunk_icm_addr(nic_matcher->e_anchor->chunk);
+       mlx5dr_ste_set_miss_addr(dmn->ste_ctx, hw_ste, icm_addr);
 
        ste->ste_chain_location = ste_location;
 
 
 
 u64 mlx5dr_ste_get_icm_addr(struct mlx5dr_ste *ste)
 {
+       u64 base_icm_addr = mlx5dr_icm_pool_get_chunk_icm_addr(ste->htbl->chunk);
        u32 index = ste - ste->htbl->ste_arr;
 
-       return ste->htbl->chunk->icm_addr + DR_STE_SIZE * index;
+       return base_icm_addr + DR_STE_SIZE * index;
 }
 
 u64 mlx5dr_ste_get_mr_addr(struct mlx5dr_ste *ste)
 
        ste_ctx->set_byte_mask(hw_ste, next_htbl->byte_mask);
        ste_ctx->set_next_lu_type(hw_ste, next_htbl->lu_type);
-       ste_ctx->set_hit_addr(hw_ste, chunk->icm_addr, chunk->num_of_entries);
+       ste_ctx->set_hit_addr(hw_ste, mlx5dr_icm_pool_get_chunk_icm_addr(chunk),
+                             chunk->num_of_entries);
 
        dr_ste_set_always_hit((struct dr_hw_ste_format *)ste->hw_ste);
 }
         * touches bit_mask area which doesn't exist at ste->hw_ste.
         */
        memcpy(tmp_ste.hw_ste, ste->hw_ste, DR_STE_SIZE_REDUCED);
-       miss_addr = nic_matcher->e_anchor->chunk->icm_addr;
+       miss_addr = mlx5dr_icm_pool_get_chunk_icm_addr(nic_matcher->e_anchor->chunk);
        dr_ste_always_miss_addr(ste_ctx, &tmp_ste, miss_addr);
        memcpy(ste->hw_ste, tmp_ste.hw_ste, DR_STE_SIZE_REDUCED);
 
                                          u8 *hw_ste,
                                          struct mlx5dr_ste_htbl *next_htbl)
 {
+       u64 icm_addr = mlx5dr_icm_pool_get_chunk_icm_addr(next_htbl->chunk);
        struct mlx5dr_icm_chunk *chunk = next_htbl->chunk;
 
-       ste_ctx->set_hit_addr(hw_ste, chunk->icm_addr, chunk->num_of_entries);
+       ste_ctx->set_hit_addr(hw_ste, icm_addr, chunk->num_of_entries);
 }
 
 void mlx5dr_ste_prepare_for_postsend(struct mlx5dr_ste_ctx *ste_ctx,
 
                /* Write new table to HW */
                info.type = CONNECT_MISS;
-               info.miss_icm_addr = nic_matcher->e_anchor->chunk->icm_addr;
+               info.miss_icm_addr =
+                       mlx5dr_icm_pool_get_chunk_icm_addr(nic_matcher->e_anchor->chunk);
                if (mlx5dr_ste_htbl_init_and_postsend(dmn, nic_dmn, next_htbl,
                                                      &info, false)) {
                        mlx5dr_info(dmn, "Failed writing table to HW\n");
 
        struct mlx5dr_matcher_rx_tx *last_nic_matcher = NULL;
        struct mlx5dr_htbl_connect_info info;
        struct mlx5dr_ste_htbl *last_htbl;
+       struct mlx5dr_icm_chunk *chunk;
        int ret;
 
        if (!list_empty(&nic_tbl->nic_matcher_list))
        else
                last_htbl = nic_tbl->s_anchor;
 
-       if (action)
-               nic_tbl->default_icm_addr =
-                       nic_tbl->nic_dmn->type == DR_DOMAIN_NIC_TYPE_RX ?
-                               action->dest_tbl->tbl->rx.s_anchor->chunk->icm_addr :
-                               action->dest_tbl->tbl->tx.s_anchor->chunk->icm_addr;
-       else
+       if (action) {
+               chunk = nic_tbl->nic_dmn->type == DR_DOMAIN_NIC_TYPE_RX ?
+                       action->dest_tbl->tbl->rx.s_anchor->chunk :
+                       action->dest_tbl->tbl->tx.s_anchor->chunk;
+               nic_tbl->default_icm_addr = mlx5dr_icm_pool_get_chunk_icm_addr(chunk);
+       } else {
                nic_tbl->default_icm_addr = nic_tbl->nic_dmn->default_icm_addr;
+       }
 
        info.type = CONNECT_MISS;
        info.miss_icm_addr = nic_tbl->default_icm_addr;
        int ret;
 
        if (tbl->rx.s_anchor)
-               icm_addr_rx = tbl->rx.s_anchor->chunk->icm_addr;
+               icm_addr_rx = mlx5dr_icm_pool_get_chunk_icm_addr(tbl->rx.s_anchor->chunk);
 
        if (tbl->tx.s_anchor)
-               icm_addr_tx = tbl->tx.s_anchor->chunk->icm_addr;
+               icm_addr_tx = mlx5dr_icm_pool_get_chunk_icm_addr(tbl->tx.s_anchor->chunk);
 
        ft_attr.table_type = tbl->table_type;
        ft_attr.icm_addr_rx = icm_addr_rx;
 
        struct list_head chunk_list;
        u32 num_of_entries;
        u32 byte_size;
-       u64 icm_addr;
 
        /* indicates the index of this chunk in the whole memory,
         * used for deleting the chunk from the buddy
 
 u64 mlx5dr_icm_pool_get_chunk_mr_addr(struct mlx5dr_icm_chunk *chunk);
 u32 mlx5dr_icm_pool_get_chunk_rkey(struct mlx5dr_icm_chunk *chunk);
+u64 mlx5dr_icm_pool_get_chunk_icm_addr(struct mlx5dr_icm_chunk *chunk);
 
 static inline int
 mlx5dr_icm_pool_dm_type_to_entry_size(enum mlx5dr_icm_type icm_type)