@@ -7307,6 +7307,7 @@ static int bnxt_hwrm_func_backing_store_qcaps(struct bnxt *bp)
73077307 ctx -> tqm_fp_rings_count = BNXT_MAX_TQM_FP_RINGS ;
73087308
73097309 ctxm = & ctx -> ctx_arr [BNXT_CTX_FTQM ];
7310+ memcpy (ctxm , & ctx -> ctx_arr [BNXT_CTX_STQM ], sizeof (* ctxm ));
73107311 ctxm -> instance_bmap = (1 << ctx -> tqm_fp_rings_count ) - 1 ;
73117312
73127313 rc = bnxt_alloc_all_ctx_pg_info (bp , BNXT_CTX_MAX );
@@ -7574,6 +7575,30 @@ static void bnxt_free_ctx_pg_tbls(struct bnxt *bp,
75747575 ctx_pg -> nr_pages = 0 ;
75757576}
75767577
7578+ static int bnxt_setup_ctxm_pg_tbls (struct bnxt * bp ,
7579+ struct bnxt_ctx_mem_type * ctxm , u32 entries ,
7580+ u8 pg_lvl )
7581+ {
7582+ struct bnxt_ctx_pg_info * ctx_pg = ctxm -> pg_info ;
7583+ int i , rc = 0 , n = 1 ;
7584+ u32 mem_size ;
7585+
7586+ if (!ctxm -> entry_size || !ctx_pg )
7587+ return - EINVAL ;
7588+ if (ctxm -> instance_bmap )
7589+ n = hweight32 (ctxm -> instance_bmap );
7590+ if (ctxm -> entry_multiple )
7591+ entries = roundup (entries , ctxm -> entry_multiple );
7592+ entries = clamp_t (u32 , entries , ctxm -> min_entries , ctxm -> max_entries );
7593+ mem_size = entries * ctxm -> entry_size ;
7594+ for (i = 0 ; i < n && !rc ; i ++ ) {
7595+ ctx_pg [i ].entries = entries ;
7596+ rc = bnxt_alloc_ctx_pg_tbls (bp , & ctx_pg [i ], mem_size , pg_lvl ,
7597+ ctxm -> init_value ? ctxm : NULL );
7598+ }
7599+ return rc ;
7600+ }
7601+
75777602void bnxt_free_ctx_mem (struct bnxt * bp )
75787603{
75797604 struct bnxt_ctx_mem_info * ctx = bp -> ctx ;
@@ -7605,13 +7630,11 @@ void bnxt_free_ctx_mem(struct bnxt *bp)
76057630
76067631static int bnxt_alloc_ctx_mem (struct bnxt * bp )
76077632{
7608- struct bnxt_ctx_pg_info * ctx_pg ;
76097633 struct bnxt_ctx_mem_type * ctxm ;
76107634 struct bnxt_ctx_mem_info * ctx ;
76117635 u32 l2_qps , qp1_qps , max_qps ;
7612- u32 mem_size , ena , entries ;
7613- u32 entries_sp , min ;
7614- u32 srqs , max_srqs ;
7636+ u32 ena , entries_sp , entries ;
7637+ u32 srqs , max_srqs , min ;
76157638 u32 num_mr , num_ah ;
76167639 u32 extra_srqs = 0 ;
76177640 u32 extra_qps = 0 ;
@@ -7642,61 +7665,37 @@ static int bnxt_alloc_ctx_mem(struct bnxt *bp)
76427665 }
76437666
76447667 ctxm = & ctx -> ctx_arr [BNXT_CTX_QP ];
7645- ctx_pg = ctxm -> pg_info ;
7646- ctx_pg -> entries = l2_qps + qp1_qps + extra_qps ;
7647- if (ctxm -> entry_size ) {
7648- mem_size = ctxm -> entry_size * ctx_pg -> entries ;
7649- rc = bnxt_alloc_ctx_pg_tbls (bp , ctx_pg , mem_size , pg_lvl , ctxm );
7650- if (rc )
7651- return rc ;
7652- }
7668+ rc = bnxt_setup_ctxm_pg_tbls (bp , ctxm , l2_qps + qp1_qps + extra_qps ,
7669+ pg_lvl );
7670+ if (rc )
7671+ return rc ;
76537672
76547673 ctxm = & ctx -> ctx_arr [BNXT_CTX_SRQ ];
7655- ctx_pg = ctxm -> pg_info ;
7656- ctx_pg -> entries = srqs + extra_srqs ;
7657- if (ctxm -> entry_size ) {
7658- mem_size = ctxm -> entry_size * ctx_pg -> entries ;
7659- rc = bnxt_alloc_ctx_pg_tbls (bp , ctx_pg , mem_size , pg_lvl , ctxm );
7660- if (rc )
7661- return rc ;
7662- }
7674+ rc = bnxt_setup_ctxm_pg_tbls (bp , ctxm , srqs + extra_srqs , pg_lvl );
7675+ if (rc )
7676+ return rc ;
76637677
76647678 ctxm = & ctx -> ctx_arr [BNXT_CTX_CQ ];
7665- ctx_pg = ctxm -> pg_info ;
7666- ctx_pg -> entries = ctxm -> cq_l2_entries + extra_qps * 2 ;
7667- if (ctxm -> entry_size ) {
7668- mem_size = ctxm -> entry_size * ctx_pg -> entries ;
7669- rc = bnxt_alloc_ctx_pg_tbls (bp , ctx_pg , mem_size , pg_lvl , ctxm );
7670- if (rc )
7671- return rc ;
7672- }
7679+ rc = bnxt_setup_ctxm_pg_tbls (bp , ctxm , ctxm -> cq_l2_entries +
7680+ extra_qps * 2 , pg_lvl );
7681+ if (rc )
7682+ return rc ;
76737683
76747684 ctxm = & ctx -> ctx_arr [BNXT_CTX_VNIC ];
7675- ctx_pg = ctxm -> pg_info ;
7676- ctx_pg -> entries = ctxm -> max_entries ;
7677- if (ctxm -> entry_size ) {
7678- mem_size = ctxm -> entry_size * ctx_pg -> entries ;
7679- rc = bnxt_alloc_ctx_pg_tbls (bp , ctx_pg , mem_size , 1 , ctxm );
7680- if (rc )
7681- return rc ;
7682- }
7685+ rc = bnxt_setup_ctxm_pg_tbls (bp , ctxm , ctxm -> max_entries , 1 );
7686+ if (rc )
7687+ return rc ;
76837688
76847689 ctxm = & ctx -> ctx_arr [BNXT_CTX_STAT ];
7685- ctx_pg = ctxm -> pg_info ;
7686- ctx_pg -> entries = ctxm -> max_entries ;
7687- if (ctxm -> entry_size ) {
7688- mem_size = ctxm -> entry_size * ctx_pg -> entries ;
7689- rc = bnxt_alloc_ctx_pg_tbls (bp , ctx_pg , mem_size , 1 , ctxm );
7690- if (rc )
7691- return rc ;
7692- }
7690+ rc = bnxt_setup_ctxm_pg_tbls (bp , ctxm , ctxm -> max_entries , 1 );
7691+ if (rc )
7692+ return rc ;
76937693
76947694 ena = 0 ;
76957695 if (!(bp -> flags & BNXT_FLAG_ROCE_CAP ))
76967696 goto skip_rdma ;
76977697
76987698 ctxm = & ctx -> ctx_arr [BNXT_CTX_MRAV ];
7699- ctx_pg = ctxm -> pg_info ;
77007699 /* 128K extra is needed to accommodate static AH context
77017700 * allocation by f/w.
77027701 */
@@ -7706,47 +7705,33 @@ static int bnxt_alloc_ctx_mem(struct bnxt *bp)
77067705 if (!ctxm -> mrav_av_entries || ctxm -> mrav_av_entries > num_ah )
77077706 ctxm -> mrav_av_entries = num_ah ;
77087707
7709- ctx_pg -> entries = num_mr + num_ah ;
7710- if (ctxm -> entry_size ) {
7711- mem_size = ctxm -> entry_size * ctx_pg -> entries ;
7712- rc = bnxt_alloc_ctx_pg_tbls (bp , ctx_pg , mem_size , 2 , ctxm );
7713- if (rc )
7714- return rc ;
7715- }
7708+ rc = bnxt_setup_ctxm_pg_tbls (bp , ctxm , num_mr + num_ah , 2 );
7709+ if (rc )
7710+ return rc ;
77167711 ena = FUNC_BACKING_STORE_CFG_REQ_ENABLES_MRAV ;
77177712
77187713 ctxm = & ctx -> ctx_arr [BNXT_CTX_TIM ];
7719- ctx_pg = ctxm -> pg_info ;
7720- ctx_pg -> entries = l2_qps + qp1_qps + extra_qps ;
7721- if (ctxm -> entry_size ) {
7722- mem_size = ctxm -> entry_size * ctx_pg -> entries ;
7723- rc = bnxt_alloc_ctx_pg_tbls (bp , ctx_pg , mem_size , 1 , NULL );
7724- if (rc )
7725- return rc ;
7726- }
7714+ rc = bnxt_setup_ctxm_pg_tbls (bp , ctxm , l2_qps + qp1_qps + extra_qps , 1 );
7715+ if (rc )
7716+ return rc ;
77277717 ena |= FUNC_BACKING_STORE_CFG_REQ_ENABLES_TIM ;
77287718
77297719skip_rdma :
77307720 ctxm = & ctx -> ctx_arr [BNXT_CTX_STQM ];
77317721 min = ctxm -> min_entries ;
77327722 entries_sp = ctx -> ctx_arr [BNXT_CTX_VNIC ].vnic_entries + l2_qps +
77337723 2 * (extra_qps + qp1_qps ) + min ;
7734- entries_sp = roundup (entries_sp , ctxm -> entry_multiple );
7724+ rc = bnxt_setup_ctxm_pg_tbls (bp , ctxm , entries_sp , 2 );
7725+ if (rc )
7726+ return rc ;
7727+
7728+ ctxm = & ctx -> ctx_arr [BNXT_CTX_FTQM ];
77357729 entries = l2_qps + 2 * (extra_qps + qp1_qps );
7736- entries = roundup (entries , ctxm -> entry_multiple );
7737- entries = clamp_t (u32 , entries , min , ctxm -> max_entries );
7738- for (i = 0 , ctx_pg = ctxm -> pg_info ; i < ctx -> tqm_fp_rings_count + 1 ;
7739- ctx_pg = & ctx -> ctx_arr [BNXT_CTX_FTQM ].pg_info [i ], i ++ ) {
7740- ctx_pg -> entries = i ? entries : entries_sp ;
7741- if (ctxm -> entry_size ) {
7742- mem_size = ctxm -> entry_size * ctx_pg -> entries ;
7743- rc = bnxt_alloc_ctx_pg_tbls (bp , ctx_pg , mem_size , 1 ,
7744- NULL );
7745- if (rc )
7746- return rc ;
7747- }
7730+ rc = bnxt_setup_ctxm_pg_tbls (bp , ctxm , entries , 2 );
7731+ if (rc )
7732+ return rc ;
7733+ for (i = 0 ; i < ctx -> tqm_fp_rings_count + 1 ; i ++ )
77487734 ena |= FUNC_BACKING_STORE_CFG_REQ_ENABLES_TQM_SP << i ;
7749- }
77507735 ena |= FUNC_BACKING_STORE_CFG_REQ_DFLT_ENABLES ;
77517736 rc = bnxt_hwrm_func_backing_store_cfg (bp , ena );
77527737 if (rc ) {
0 commit comments