tdm_th_proc.c (35200B)
1 /* 2 * 3 * This license is set out in https://raw.githubusercontent.com/Broadcom-Network-Switching-Software/OpenBCM/master/Legal/LICENSE file. 4 * 5 * Copyright 2007-2019 Broadcom Inc. All rights reserved. 6 * $All Rights Reserved.$ 7 * 8 * TDM chip operations 9 */ 10 #ifdef _TDM_STANDALONE 11 #include <tdm_top.h> 12 #include <tdm_th_vec.h> 13 #else 14 #include <soc/tdm/core/tdm_top.h> 15 #include <soc/tdm/tomahawk/tdm_th_vec.h> 16 #endif 17 18 19 /** 20 @name: tdm_th_proc_cal_tdm5 21 @param: 22 */ 23 int 24 tdm_th_proc_cal_tdm5( tdm_mod_t *_tdm ) 25 { 26 int j, v, w; 27 unsigned short lr1[TDM_AUX_SIZE], lr10[TDM_AUX_SIZE], lr20[TDM_AUX_SIZE], lr25[TDM_AUX_SIZE], lr40[TDM_AUX_SIZE], lr50[TDM_AUX_SIZE], lr100[TDM_AUX_SIZE]; 28 int param_freq, param_lr_limit, param_vmap_wid, param_vmap_len; 29 unsigned short **param_vmap; 30 31 param_freq = _tdm->_chip_data.soc_pkg.clk_freq; 32 param_lr_limit = _tdm->_chip_data.soc_pkg.lr_idx_limit; 33 param_vmap_wid = _tdm->_core_data.vmap_max_wid; 34 param_vmap_len = _tdm->_core_data.vmap_max_len; 35 param_vmap = _tdm->_core_data.vmap; 36 37 for (j=0; j<(TDM_AUX_SIZE); j++) { 38 lr1[j] = TH_NUM_EXT_PORTS; 39 lr10[j] = TH_NUM_EXT_PORTS; 40 lr20[j] = TH_NUM_EXT_PORTS; 41 lr25[j] = TH_NUM_EXT_PORTS; 42 lr40[j] = TH_NUM_EXT_PORTS; 43 lr50[j] = TH_NUM_EXT_PORTS; 44 lr100[j] = TH_NUM_EXT_PORTS; 45 _tdm->_core_data.vars_pkg.m_tdm_vmap_alloc.os1[j] = TH_NUM_EXT_PORTS; 46 _tdm->_core_data.vars_pkg.m_tdm_vmap_alloc.os10[j] = TH_NUM_EXT_PORTS; 47 _tdm->_core_data.vars_pkg.m_tdm_vmap_alloc.os20[j] = TH_NUM_EXT_PORTS; 48 _tdm->_core_data.vars_pkg.m_tdm_vmap_alloc.os25[j] = TH_NUM_EXT_PORTS; 49 _tdm->_core_data.vars_pkg.m_tdm_vmap_alloc.os40[j] = TH_NUM_EXT_PORTS; 50 _tdm->_core_data.vars_pkg.m_tdm_vmap_alloc.os50[j] = TH_NUM_EXT_PORTS; 51 _tdm->_core_data.vars_pkg.m_tdm_vmap_alloc.os100[j]= TH_NUM_EXT_PORTS; 52 } 53 54 for (j=0; j<TDM_AUX_SIZE; j++) { 55 if ((_tdm->_core_data.vars_pkg.lr_buffer[j] != TH_NUM_EXT_PORTS) && ( (_tdm->_chip_data.soc_pkg.state[_tdm->_core_data.vars_pkg.lr_buffer[j]-1] == PORT_STATE__LINERATE)||(_tdm->_chip_data.soc_pkg.state[_tdm->_core_data.vars_pkg.lr_buffer[j]-1] == PORT_STATE__LINERATE_HG) )) { 56 switch (_tdm->_chip_data.soc_pkg.speed[_tdm->_core_data.vars_pkg.lr_buffer[j]]) { 57 case SPEED_1G: 58 case SPEED_2p5G: 59 tdm_core_prealloc(lr1, _tdm->_core_data.vars_pkg.lr_buffer, &(_tdm->_core_data.vars_pkg.m_tdm_core_vbs_scheduler.y8), &(_tdm->_core_data.vars_pkg.lr_1), j); 60 break; 61 case SPEED_10G: 62 case SPEED_10G_DUAL: 63 case SPEED_10G_XAUI: 64 case SPEED_11G: 65 tdm_core_prealloc(lr10, _tdm->_core_data.vars_pkg.lr_buffer, &(_tdm->_core_data.vars_pkg.m_tdm_core_vbs_scheduler.y1), &(_tdm->_core_data.vars_pkg.lr_10), j); 66 break; 67 case SPEED_20G: 68 case SPEED_21G: 69 case SPEED_21G_DUAL: 70 tdm_core_prealloc(lr20, _tdm->_core_data.vars_pkg.lr_buffer, &(_tdm->_core_data.vars_pkg.m_tdm_core_vbs_scheduler.y2), &(_tdm->_core_data.vars_pkg.lr_20), j); 71 break; 72 case SPEED_25G: 73 case SPEED_27G: 74 tdm_core_prealloc(lr25, _tdm->_core_data.vars_pkg.lr_buffer, &(_tdm->_core_data.vars_pkg.m_tdm_core_vbs_scheduler.y6), &(_tdm->_core_data.vars_pkg.lr_25), j); 75 break; 76 case SPEED_40G: 77 case SPEED_42G: 78 case SPEED_42G_HG2: 79 tdm_core_prealloc(lr40, _tdm->_core_data.vars_pkg.lr_buffer, &(_tdm->_core_data.vars_pkg.m_tdm_core_vbs_scheduler.y3), &(_tdm->_core_data.vars_pkg.lr_40), j); 80 break; 81 case SPEED_50G: 82 case SPEED_53G: 83 tdm_core_prealloc(lr50, _tdm->_core_data.vars_pkg.lr_buffer, &(_tdm->_core_data.vars_pkg.m_tdm_core_vbs_scheduler.y5), &(_tdm->_core_data.vars_pkg.lr_50), j); 84 break; 85 case SPEED_100G: 86 case SPEED_106G: 87 tdm_core_prealloc(lr100, _tdm->_core_data.vars_pkg.lr_buffer, &(_tdm->_core_data.vars_pkg.m_tdm_core_vbs_scheduler.y4), &(_tdm->_core_data.vars_pkg.lr_100), j); 88 break; 89 default: 90 TDM_ERROR2("Speed %0d port %0d was skipped in linerate preallocation\n",_tdm->_chip_data.soc_pkg.speed[_tdm->_core_data.vars_pkg.lr_buffer[j]],_tdm->_core_data.vars_pkg.lr_buffer[j]); 91 } 92 } 93 else if (_tdm->_core_data.vars_pkg.lr_buffer[j] != TH_NUM_EXT_PORTS && _tdm->_core_data.vars_pkg.lr_buffer[j] != TH_OVSB_TOKEN) { 94 TDM_ERROR2("Failed to presort linerate port %0d with state mapping %0d\n", _tdm->_core_data.vars_pkg.lr_buffer[j], _tdm->_chip_data.soc_pkg.state[_tdm->_core_data.vars_pkg.lr_buffer[j]-1]); 95 } 96 if ((_tdm->_core_data.vars_pkg.os_buffer[j] != TH_NUM_EXT_PORTS) && ( (_tdm->_chip_data.soc_pkg.state[_tdm->_core_data.vars_pkg.os_buffer[j]-1] == PORT_STATE__OVERSUB)||(_tdm->_chip_data.soc_pkg.state[_tdm->_core_data.vars_pkg.os_buffer[j]-1] == PORT_STATE__OVERSUB_HG) )) { 97 switch (_tdm->_chip_data.soc_pkg.speed[_tdm->_core_data.vars_pkg.os_buffer[j]]) { 98 case SPEED_1G: 99 case SPEED_2p5G: 100 tdm_core_prealloc(_tdm->_core_data.vars_pkg.m_tdm_vmap_alloc.os1, _tdm->_core_data.vars_pkg.os_buffer, &(_tdm->_core_data.vars_pkg.m_tdm_core_vbs_scheduler.z8), &(_tdm->_core_data.vars_pkg.os_1), j); 101 break; 102 case SPEED_10G: 103 case SPEED_10G_DUAL: 104 case SPEED_10G_XAUI: 105 case SPEED_11G: 106 tdm_core_prealloc(_tdm->_core_data.vars_pkg.m_tdm_vmap_alloc.os10, _tdm->_core_data.vars_pkg.os_buffer, &(_tdm->_core_data.vars_pkg.m_tdm_core_vbs_scheduler.z1), &(_tdm->_core_data.vars_pkg.os_10), j); 107 break; 108 case SPEED_20G: 109 case SPEED_21G: 110 case SPEED_21G_DUAL: 111 tdm_core_prealloc(_tdm->_core_data.vars_pkg.m_tdm_vmap_alloc.os20, _tdm->_core_data.vars_pkg.os_buffer, &(_tdm->_core_data.vars_pkg.m_tdm_core_vbs_scheduler.z2), &(_tdm->_core_data.vars_pkg.os_20), j); 112 break; 113 case SPEED_25G: 114 case SPEED_27G: 115 tdm_core_prealloc(_tdm->_core_data.vars_pkg.m_tdm_vmap_alloc.os25, _tdm->_core_data.vars_pkg.os_buffer, &(_tdm->_core_data.vars_pkg.m_tdm_core_vbs_scheduler.z6), &(_tdm->_core_data.vars_pkg.os_25), j); 116 break; 117 case SPEED_40G: 118 case SPEED_42G: 119 case SPEED_42G_HG2: 120 tdm_core_prealloc(_tdm->_core_data.vars_pkg.m_tdm_vmap_alloc.os40, _tdm->_core_data.vars_pkg.os_buffer, &(_tdm->_core_data.vars_pkg.m_tdm_core_vbs_scheduler.z3), &(_tdm->_core_data.vars_pkg.os_40), j); 121 break; 122 case SPEED_50G: 123 case SPEED_53G: 124 tdm_core_prealloc(_tdm->_core_data.vars_pkg.m_tdm_vmap_alloc.os50, _tdm->_core_data.vars_pkg.os_buffer, &(_tdm->_core_data.vars_pkg.m_tdm_core_vbs_scheduler.z5), &(_tdm->_core_data.vars_pkg.os_50), j); 125 break; 126 case SPEED_100G: 127 case SPEED_106G: 128 tdm_core_prealloc(_tdm->_core_data.vars_pkg.m_tdm_vmap_alloc.os100, _tdm->_core_data.vars_pkg.os_buffer, &(_tdm->_core_data.vars_pkg.m_tdm_core_vbs_scheduler.z4), &(_tdm->_core_data.vars_pkg.os_100), j); 129 break; 130 default: 131 TDM_ERROR2("Speed %0d port %0d was skipped in oversub preallocation\n",_tdm->_chip_data.soc_pkg.speed[_tdm->_core_data.vars_pkg.os_buffer[j]],_tdm->_core_data.vars_pkg.os_buffer[j]); 132 } 133 } 134 else if (_tdm->_core_data.vars_pkg.os_buffer[j] != TH_NUM_EXT_PORTS) { 135 TDM_ERROR2("Failed to presort oversub port %0d with state mapping %0d\n", _tdm->_core_data.vars_pkg.os_buffer[j], _tdm->_chip_data.soc_pkg.state[_tdm->_core_data.vars_pkg.os_buffer[j]-1]); 136 } 137 } 138 _tdm->_core_data.vars_pkg.os_enable = (_tdm->_core_data.vars_pkg.os_1||_tdm->_core_data.vars_pkg.os_10||_tdm->_core_data.vars_pkg.os_20||_tdm->_core_data.vars_pkg.os_25||_tdm->_core_data.vars_pkg.os_40||_tdm->_core_data.vars_pkg.os_50||_tdm->_core_data.vars_pkg.os_100||_tdm->_core_data.vars_pkg.os_120); 139 _tdm->_core_data.vars_pkg.lr_enable = (_tdm->_core_data.vars_pkg.lr_1||_tdm->_core_data.vars_pkg.lr_10||_tdm->_core_data.vars_pkg.lr_20||_tdm->_core_data.vars_pkg.lr_25||_tdm->_core_data.vars_pkg.lr_40||_tdm->_core_data.vars_pkg.lr_50||_tdm->_core_data.vars_pkg.lr_100||_tdm->_core_data.vars_pkg.lr_120); 140 _tdm->_core_data.vars_pkg.m_tdm_vmap_alloc.num_lr = (_tdm->_core_data.vars_pkg.m_tdm_core_vbs_scheduler.y8+_tdm->_core_data.vars_pkg.m_tdm_core_vbs_scheduler.y1+_tdm->_core_data.vars_pkg.m_tdm_core_vbs_scheduler.y2+_tdm->_core_data.vars_pkg.m_tdm_core_vbs_scheduler.y3+_tdm->_core_data.vars_pkg.m_tdm_core_vbs_scheduler.y4+_tdm->_core_data.vars_pkg.m_tdm_core_vbs_scheduler.y5+_tdm->_core_data.vars_pkg.m_tdm_core_vbs_scheduler.y6+_tdm->_core_data.vars_pkg.m_tdm_core_vbs_scheduler.y7); 141 _tdm->_core_data.vars_pkg.m_tdm_vmap_alloc.num_os = (_tdm->_core_data.vars_pkg.m_tdm_core_vbs_scheduler.z8+_tdm->_core_data.vars_pkg.m_tdm_core_vbs_scheduler.z1+_tdm->_core_data.vars_pkg.m_tdm_core_vbs_scheduler.z2+_tdm->_core_data.vars_pkg.m_tdm_core_vbs_scheduler.z3+_tdm->_core_data.vars_pkg.m_tdm_core_vbs_scheduler.z4+_tdm->_core_data.vars_pkg.m_tdm_core_vbs_scheduler.z5+_tdm->_core_data.vars_pkg.m_tdm_core_vbs_scheduler.z6+_tdm->_core_data.vars_pkg.m_tdm_core_vbs_scheduler.z7); 142 _tdm->_core_data.vars_pkg.m_tdm_vmap_alloc.num_100g = _tdm->_core_data.vars_pkg.m_tdm_core_vbs_scheduler.y4; 143 _tdm->_core_data.vars_pkg.m_tdm_vmap_alloc.num_40g = _tdm->_core_data.vars_pkg.m_tdm_core_vbs_scheduler.y3; 144 /* 4x106HG+3x40G uses a unique TDM in Tomahawk */ 145 if (_tdm->_core_data.vars_pkg.m_tdm_vmap_alloc.num_40g==3 && _tdm->_core_data.vars_pkg.m_tdm_vmap_alloc.num_100g==4 && _tdm->_chip_data.soc_pkg.clk_freq==TH_CLK_850MHZ) { 146 _tdm->_chip_data.soc_pkg.tvec_size=9; 147 _tdm->_chip_data.soc_pkg.lr_idx_limit=201; 148 _tdm->_core_data.vars_pkg.HG4X106G_3X40G=BOOL_TRUE; 149 } 150 else { 151 _tdm->_core_data.vars_pkg.HG4X106G_3X40G=BOOL_FALSE; 152 } 153 /* To guarantee oversub smoothness in nonscaling 100G+40G case, algorithm must sort with a 120G port vector (bw will be reclaimed) */ 154 if ( ( (_tdm->_core_data.vars_pkg.m_tdm_vmap_alloc.num_100g==1) && (_tdm->_core_data.vars_pkg.lr_40) && (!_tdm->_core_data.vars_pkg.lr_120) && (_tdm->_core_data.vars_pkg.os_enable) ) ) { 155 _tdm->_core_data.vars_pkg.HG1X106G_xX40G_OVERSUB=BOOL_TRUE; 156 } 157 /* To sort 120G and 100G vectors together, load a special 100G vector */ 158 if ( (_tdm->_core_data.vars_pkg.lr_100 && _tdm->_core_data.vars_pkg.lr_120) ) { 159 _tdm->_core_data.vars_pkg.HGXx120G_Xx100G=BOOL_TRUE; 160 } 161 TDM_PRINT9("(1G - %0d) (10G - %0d) (20G - %0d) (25G - %0d) (40G - %0d) (50G - %0d) (100G - %0d) (120G - %0d) (Number of Line Rate Types - %0d)\n", _tdm->_core_data.vars_pkg.m_tdm_core_vbs_scheduler.y8, _tdm->_core_data.vars_pkg.m_tdm_core_vbs_scheduler.y1, _tdm->_core_data.vars_pkg.m_tdm_core_vbs_scheduler.y2, _tdm->_core_data.vars_pkg.m_tdm_core_vbs_scheduler.y6, _tdm->_core_data.vars_pkg.m_tdm_core_vbs_scheduler.y3, _tdm->_core_data.vars_pkg.m_tdm_core_vbs_scheduler.y5, _tdm->_core_data.vars_pkg.m_tdm_core_vbs_scheduler.y4, _tdm->_core_data.vars_pkg.m_tdm_core_vbs_scheduler.y7, (_tdm->_core_data.vars_pkg.lr_1+_tdm->_core_data.vars_pkg.lr_10+_tdm->_core_data.vars_pkg.lr_20+_tdm->_core_data.vars_pkg.lr_25+_tdm->_core_data.vars_pkg.lr_40+_tdm->_core_data.vars_pkg.lr_50+_tdm->_core_data.vars_pkg.lr_100+_tdm->_core_data.vars_pkg.lr_120)); 162 TDM_BIG_BAR 163 /* 100G */ 164 if(_tdm->_core_data.vars_pkg.m_tdm_core_vbs_scheduler.y4 > 0){ 165 if (_tdm->_core_data.vars_pkg.HG4X106G_3X40G) { 166 if (tdm_core_postalloc_vmap(param_vmap, param_freq, 107, &_tdm->_core_data.vars_pkg.m_tdm_core_vbs_scheduler.yy, &(_tdm->_core_data.vars_pkg.m_tdm_core_vbs_scheduler.y4), param_lr_limit, lr100, TOKEN_100G, "100", TH_NUM_EXT_PORTS, param_vmap_wid, param_vmap_len)!=PASS) { 167 TDM_ERROR0("Critical error in 100G time vector preallocation\n"); 168 return 0; 169 } 170 } 171 else if (_tdm->_core_data.vars_pkg.HG1X106G_xX40G_OVERSUB) { 172 if (tdm_core_postalloc_vmap(param_vmap, param_freq, 108, &_tdm->_core_data.vars_pkg.m_tdm_core_vbs_scheduler.yy, &(_tdm->_core_data.vars_pkg.m_tdm_core_vbs_scheduler.y4), param_lr_limit, lr100, TOKEN_100G, "100", TH_NUM_EXT_PORTS, param_vmap_wid, param_vmap_len)!=PASS) { 173 TDM_ERROR0("Critical error in 100G time vector preallocation\n"); 174 return 0; 175 } 176 } 177 else if (_tdm->_core_data.vars_pkg.HGXx120G_Xx100G) { 178 if (tdm_core_postalloc_vmap(param_vmap, param_freq, 109, &_tdm->_core_data.vars_pkg.m_tdm_core_vbs_scheduler.yy, &(_tdm->_core_data.vars_pkg.m_tdm_core_vbs_scheduler.y4), param_lr_limit, lr100, TOKEN_100G, "100", TH_NUM_EXT_PORTS, param_vmap_wid, param_vmap_len)!=PASS) { 179 TDM_ERROR0("Critical error in 100G time vector preallocation\n"); 180 return 0; 181 } 182 } 183 else{ 184 if (tdm_th_check_pipe_ethernet(lr100[_tdm->_core_data.vars_pkg.m_tdm_core_vbs_scheduler.y4],_tdm) && _tdm->_chip_data.soc_pkg.soc_vars.th.higig_mgmt==BOOL_FALSE && _tdm->_chip_data.soc_pkg.soc_vars.th.cal_hg_en==BOOL_FALSE) { 185 if (tdm_core_postalloc_vmap(param_vmap, param_freq, 100, &_tdm->_core_data.vars_pkg.m_tdm_core_vbs_scheduler.yy, &(_tdm->_core_data.vars_pkg.m_tdm_core_vbs_scheduler.y4), param_lr_limit, lr100, TOKEN_100G, "100", TH_NUM_EXT_PORTS, param_vmap_wid, param_vmap_len)!=PASS) { 186 TDM_ERROR0("Critical error in 100G time vector preallocation\n"); 187 return 0; 188 } 189 } 190 else { 191 if (tdm_core_postalloc_vmap(param_vmap, param_freq, 106, &_tdm->_core_data.vars_pkg.m_tdm_core_vbs_scheduler.yy, &(_tdm->_core_data.vars_pkg.m_tdm_core_vbs_scheduler.y4), param_lr_limit, lr100, TOKEN_100G, "100", TH_NUM_EXT_PORTS, param_vmap_wid, param_vmap_len)!=PASS) { 192 TDM_ERROR0("Critical error in 100G time vector preallocation\n"); 193 return 0; 194 } 195 } 196 } 197 } 198 /* 50G */ 199 if(_tdm->_core_data.vars_pkg.m_tdm_core_vbs_scheduler.y5 > 0){ 200 for (v=_tdm->_core_data.vars_pkg.m_tdm_core_vbs_scheduler.y5; v>0; v--) { 201 if (tdm_th_legacy_which_tsc(lr50[v+1],_tdm->_chip_data.soc_pkg.pmap)==tdm_th_legacy_which_tsc(lr50[v],_tdm->_chip_data.soc_pkg.pmap) || 202 tdm_th_legacy_which_tsc(lr50[v-1],_tdm->_chip_data.soc_pkg.pmap)==tdm_th_legacy_which_tsc(lr50[v],_tdm->_chip_data.soc_pkg.pmap)) { 203 _tdm->_core_data.vars_pkg.m_tdm_vmap_alloc.prox_swap=lr50[v]; 204 for (w=v; w>0; w--) { 205 lr50[w]=lr50[w-1]; 206 } 207 lr50[1]=_tdm->_core_data.vars_pkg.m_tdm_vmap_alloc.prox_swap; 208 } 209 } 210 for (v=_tdm->_core_data.vars_pkg.m_tdm_core_vbs_scheduler.y5; v>0; v--) { 211 _tdm->_core_data.vars_pkg.m_tdm_vmap_alloc.tri_chk = tdm_th_legacy_which_tsc(lr50[v],_tdm->_chip_data.soc_pkg.pmap); 212 if ((_tdm->_chip_data.soc_pkg.pmap[_tdm->_core_data.vars_pkg.m_tdm_vmap_alloc.tri_chk][0]!=_tdm->_chip_data.soc_pkg.pmap[_tdm->_core_data.vars_pkg.m_tdm_vmap_alloc.tri_chk][2] && _tdm->_chip_data.soc_pkg.pmap[_tdm->_core_data.vars_pkg.m_tdm_vmap_alloc.tri_chk][1]==_tdm->_chip_data.soc_pkg.pmap[_tdm->_core_data.vars_pkg.m_tdm_vmap_alloc.tri_chk][3]) || 213 (_tdm->_chip_data.soc_pkg.pmap[_tdm->_core_data.vars_pkg.m_tdm_vmap_alloc.tri_chk][0]==_tdm->_chip_data.soc_pkg.pmap[_tdm->_core_data.vars_pkg.m_tdm_vmap_alloc.tri_chk][2] && _tdm->_chip_data.soc_pkg.pmap[_tdm->_core_data.vars_pkg.m_tdm_vmap_alloc.tri_chk][1]!=_tdm->_chip_data.soc_pkg.pmap[_tdm->_core_data.vars_pkg.m_tdm_vmap_alloc.tri_chk][3]) ){ 214 _tdm->_core_data.vars_pkg.m_tdm_vmap_alloc.tri_en_50=BOOL_TRUE; 215 TDM_PRINT0("50G triport detected\n"); 216 break; 217 } 218 } 219 if (tdm_th_check_pipe_ethernet(lr50[_tdm->_core_data.vars_pkg.m_tdm_core_vbs_scheduler.y5],_tdm) && _tdm->_chip_data.soc_pkg.soc_vars.th.higig_mgmt==BOOL_FALSE && _tdm->_chip_data.soc_pkg.soc_vars.th.cal_hg_en==BOOL_FALSE) { 220 if (tdm_core_postalloc_vmap(param_vmap, param_freq, 50, &_tdm->_core_data.vars_pkg.m_tdm_core_vbs_scheduler.yy, &(_tdm->_core_data.vars_pkg.m_tdm_core_vbs_scheduler.y5), param_lr_limit, lr50, TOKEN_50G, "50", TH_NUM_EXT_PORTS, param_vmap_wid, param_vmap_len)!=PASS) { 221 TDM_ERROR0("Critical error in 50G time vector preallocation\n"); 222 return 0; 223 } 224 } 225 else { 226 if (tdm_core_postalloc_vmap(param_vmap, param_freq, 53, &_tdm->_core_data.vars_pkg.m_tdm_core_vbs_scheduler.yy, &(_tdm->_core_data.vars_pkg.m_tdm_core_vbs_scheduler.y5), param_lr_limit, lr50, TOKEN_50G, "50", TH_NUM_EXT_PORTS, param_vmap_wid, param_vmap_len)!=PASS) { 227 TDM_ERROR0("Critical error in 50G time vector preallocation\n"); 228 return 0; 229 } 230 } 231 } 232 /* 40G */ 233 if (_tdm->_core_data.vars_pkg.m_tdm_core_vbs_scheduler.y3 > 0) { 234 for (v=_tdm->_core_data.vars_pkg.m_tdm_core_vbs_scheduler.y3; v>0; v--) { 235 if (tdm_th_legacy_which_tsc(lr40[v+1],_tdm->_chip_data.soc_pkg.pmap)==tdm_th_legacy_which_tsc(lr40[v],_tdm->_chip_data.soc_pkg.pmap) || 236 tdm_th_legacy_which_tsc(lr40[v-1],_tdm->_chip_data.soc_pkg.pmap)==tdm_th_legacy_which_tsc(lr40[v],_tdm->_chip_data.soc_pkg.pmap)) { 237 _tdm->_core_data.vars_pkg.m_tdm_vmap_alloc.prox_swap=lr40[v]; 238 for (w=v; w>0; w--) { 239 lr40[w]=lr40[w-1]; 240 } 241 lr40[1]=_tdm->_core_data.vars_pkg.m_tdm_vmap_alloc.prox_swap; 242 } 243 } 244 for (v=_tdm->_core_data.vars_pkg.m_tdm_core_vbs_scheduler.y3; v>0; v--) { 245 _tdm->_core_data.vars_pkg.m_tdm_vmap_alloc.tri_chk = tdm_th_legacy_which_tsc(lr40[v],_tdm->_chip_data.soc_pkg.pmap); 246 if ((_tdm->_chip_data.soc_pkg.pmap[_tdm->_core_data.vars_pkg.m_tdm_vmap_alloc.tri_chk][0]!=_tdm->_chip_data.soc_pkg.pmap[_tdm->_core_data.vars_pkg.m_tdm_vmap_alloc.tri_chk][2] && _tdm->_chip_data.soc_pkg.pmap[_tdm->_core_data.vars_pkg.m_tdm_vmap_alloc.tri_chk][1]==_tdm->_chip_data.soc_pkg.pmap[_tdm->_core_data.vars_pkg.m_tdm_vmap_alloc.tri_chk][3]) || 247 (_tdm->_chip_data.soc_pkg.pmap[_tdm->_core_data.vars_pkg.m_tdm_vmap_alloc.tri_chk][0]==_tdm->_chip_data.soc_pkg.pmap[_tdm->_core_data.vars_pkg.m_tdm_vmap_alloc.tri_chk][2] && _tdm->_chip_data.soc_pkg.pmap[_tdm->_core_data.vars_pkg.m_tdm_vmap_alloc.tri_chk][1]!=_tdm->_chip_data.soc_pkg.pmap[_tdm->_core_data.vars_pkg.m_tdm_vmap_alloc.tri_chk][3]) ){ 248 _tdm->_core_data.vars_pkg.m_tdm_vmap_alloc.tri_en_40=BOOL_TRUE; 249 TDM_PRINT0("40G triport detected\n"); 250 break; 251 } 252 } 253 if (_tdm->_core_data.vars_pkg.HG4X106G_3X40G==BOOL_TRUE) { 254 if (_tdm->_core_data.vars_pkg.m_tdm_core_vbs_scheduler.y3==3) { 255 if (tdm_core_postalloc_vmap(param_vmap, param_freq, 43, &_tdm->_core_data.vars_pkg.m_tdm_core_vbs_scheduler.yy, &(_tdm->_core_data.vars_pkg.m_tdm_core_vbs_scheduler.y3), param_lr_limit, lr40, TOKEN_40G, "40", TH_NUM_EXT_PORTS, param_vmap_wid, param_vmap_len)!=PASS) { 256 TDM_ERROR0("Critical error in 40G time vector preallocation\n"); 257 return 0; 258 } 259 } 260 else if (_tdm->_core_data.vars_pkg.m_tdm_core_vbs_scheduler.y3==2) { 261 if (tdm_core_postalloc_vmap(param_vmap, param_freq, 44, &_tdm->_core_data.vars_pkg.m_tdm_core_vbs_scheduler.yy, &(_tdm->_core_data.vars_pkg.m_tdm_core_vbs_scheduler.y3), param_lr_limit, lr40, TOKEN_40G, "40", TH_NUM_EXT_PORTS, param_vmap_wid, param_vmap_len)!=PASS) { 262 TDM_ERROR0("Critical error in 40G time vector preallocation\n"); 263 return 0; 264 } 265 } 266 else if (_tdm->_core_data.vars_pkg.m_tdm_core_vbs_scheduler.y3==1) { 267 if (tdm_core_postalloc_vmap(param_vmap, param_freq, 45, &_tdm->_core_data.vars_pkg.m_tdm_core_vbs_scheduler.yy, &(_tdm->_core_data.vars_pkg.m_tdm_core_vbs_scheduler.y3), param_lr_limit, lr40, TOKEN_40G, "40", TH_NUM_EXT_PORTS, param_vmap_wid, param_vmap_len)!=PASS) { 268 TDM_ERROR0("Critical error in 40G time vector preallocation\n"); 269 return 0; 270 } 271 } 272 } 273 else { 274 if (tdm_th_check_pipe_ethernet(lr40[_tdm->_core_data.vars_pkg.m_tdm_core_vbs_scheduler.y3],_tdm) && _tdm->_chip_data.soc_pkg.soc_vars.th.higig_mgmt==BOOL_FALSE && _tdm->_chip_data.soc_pkg.soc_vars.th.cal_hg_en==BOOL_FALSE) { 275 if (tdm_core_postalloc_vmap(param_vmap, param_freq, 40, &_tdm->_core_data.vars_pkg.m_tdm_core_vbs_scheduler.yy, &(_tdm->_core_data.vars_pkg.m_tdm_core_vbs_scheduler.y3), param_lr_limit, lr40, TOKEN_40G, "40", TH_NUM_EXT_PORTS, param_vmap_wid, param_vmap_len)!=PASS) { 276 TDM_ERROR0("Critical error in 40G time vector preallocation\n"); 277 return 0; 278 } 279 } 280 else { 281 if (tdm_core_postalloc_vmap(param_vmap, param_freq, 42, &_tdm->_core_data.vars_pkg.m_tdm_core_vbs_scheduler.yy, &(_tdm->_core_data.vars_pkg.m_tdm_core_vbs_scheduler.y3), param_lr_limit, lr40, TOKEN_40G, "40", TH_NUM_EXT_PORTS, param_vmap_wid, param_vmap_len)!=PASS) { 282 TDM_ERROR0("Critical error in 40G time vector preallocation\n"); 283 return 0; 284 } 285 } 286 } 287 } 288 /* 25G */ 289 if (_tdm->_core_data.vars_pkg.m_tdm_core_vbs_scheduler.y6 > 0) { 290 if (tdm_th_check_pipe_ethernet(lr25[_tdm->_core_data.vars_pkg.m_tdm_core_vbs_scheduler.y6],_tdm) && _tdm->_chip_data.soc_pkg.soc_vars.th.higig_mgmt==BOOL_FALSE && _tdm->_chip_data.soc_pkg.soc_vars.th.cal_hg_en==BOOL_FALSE) { 291 if (tdm_core_postalloc_vmap(param_vmap, param_freq, 25, &_tdm->_core_data.vars_pkg.m_tdm_core_vbs_scheduler.yy, &(_tdm->_core_data.vars_pkg.m_tdm_core_vbs_scheduler.y6), param_lr_limit, lr25, TOKEN_25G, "25", TH_NUM_EXT_PORTS, param_vmap_wid, param_vmap_len)!=PASS) { 292 TDM_ERROR0("Critical error in 25G time vector preallocation\n"); 293 return 0; 294 } 295 } 296 else { 297 if (tdm_core_postalloc_vmap(param_vmap, param_freq, 27, &_tdm->_core_data.vars_pkg.m_tdm_core_vbs_scheduler.yy, &(_tdm->_core_data.vars_pkg.m_tdm_core_vbs_scheduler.y6), param_lr_limit, lr25, TOKEN_25G, "25", TH_NUM_EXT_PORTS, param_vmap_wid, param_vmap_len)!=PASS) { 298 TDM_ERROR0("Critical error in 25G time vector preallocation\n"); 299 return 0; 300 } 301 } 302 } 303 /* 20G */ 304 if (_tdm->_core_data.vars_pkg.m_tdm_core_vbs_scheduler.y2 > 0) { 305 for (v=_tdm->_core_data.vars_pkg.m_tdm_core_vbs_scheduler.y2; v>0; v--) { 306 _tdm->_core_data.vars_pkg.m_tdm_vmap_alloc.tri_chk = tdm_th_legacy_which_tsc(lr20[v],_tdm->_chip_data.soc_pkg.pmap); 307 if ((_tdm->_chip_data.soc_pkg.pmap[_tdm->_core_data.vars_pkg.m_tdm_vmap_alloc.tri_chk][0]!=_tdm->_chip_data.soc_pkg.pmap[_tdm->_core_data.vars_pkg.m_tdm_vmap_alloc.tri_chk][2] && _tdm->_chip_data.soc_pkg.pmap[_tdm->_core_data.vars_pkg.m_tdm_vmap_alloc.tri_chk][1]==_tdm->_chip_data.soc_pkg.pmap[_tdm->_core_data.vars_pkg.m_tdm_vmap_alloc.tri_chk][3]) || 308 (_tdm->_chip_data.soc_pkg.pmap[_tdm->_core_data.vars_pkg.m_tdm_vmap_alloc.tri_chk][0]==_tdm->_chip_data.soc_pkg.pmap[_tdm->_core_data.vars_pkg.m_tdm_vmap_alloc.tri_chk][2] && _tdm->_chip_data.soc_pkg.pmap[_tdm->_core_data.vars_pkg.m_tdm_vmap_alloc.tri_chk][1]!=_tdm->_chip_data.soc_pkg.pmap[_tdm->_core_data.vars_pkg.m_tdm_vmap_alloc.tri_chk][3]) ){ 309 _tdm->_core_data.vars_pkg.m_tdm_vmap_alloc.tri_en_20=BOOL_TRUE; 310 TDM_PRINT0("20G triport detected\n"); 311 break; 312 } 313 } 314 if (tdm_th_check_pipe_ethernet(lr20[_tdm->_core_data.vars_pkg.m_tdm_core_vbs_scheduler.y2],_tdm) && _tdm->_chip_data.soc_pkg.soc_vars.th.higig_mgmt==BOOL_FALSE && _tdm->_chip_data.soc_pkg.soc_vars.th.cal_hg_en==BOOL_FALSE) { 315 if (tdm_core_postalloc_vmap(param_vmap, param_freq, 20, &_tdm->_core_data.vars_pkg.m_tdm_core_vbs_scheduler.yy, &(_tdm->_core_data.vars_pkg.m_tdm_core_vbs_scheduler.y2), param_lr_limit, lr20, TOKEN_20G, "20", TH_NUM_EXT_PORTS, param_vmap_wid, param_vmap_len)!=PASS) { 316 TDM_ERROR0("Critical error in 20G time vector preallocation\n"); 317 return 0; 318 } 319 } 320 else { 321 if (tdm_core_postalloc_vmap(param_vmap, param_freq, 21, &_tdm->_core_data.vars_pkg.m_tdm_core_vbs_scheduler.yy, &(_tdm->_core_data.vars_pkg.m_tdm_core_vbs_scheduler.y2), param_lr_limit, lr20, TOKEN_20G, "20", TH_NUM_EXT_PORTS, param_vmap_wid, param_vmap_len)!=PASS) { 322 TDM_ERROR0("Critical error in 20G time vector preallocation\n"); 323 return 0; 324 } 325 } 326 } 327 /* 10G */ 328 if (_tdm->_core_data.vars_pkg.m_tdm_core_vbs_scheduler.y1 > 0) { 329 if (tdm_th_check_pipe_ethernet(lr10[_tdm->_core_data.vars_pkg.m_tdm_core_vbs_scheduler.y1],_tdm) && _tdm->_chip_data.soc_pkg.soc_vars.th.higig_mgmt==BOOL_FALSE && _tdm->_chip_data.soc_pkg.soc_vars.th.cal_hg_en==BOOL_FALSE) { 330 if (tdm_core_postalloc_vmap(param_vmap, param_freq, 10, &_tdm->_core_data.vars_pkg.m_tdm_core_vbs_scheduler.yy, &(_tdm->_core_data.vars_pkg.m_tdm_core_vbs_scheduler.y1), param_lr_limit, lr10, TOKEN_10G, "10", TH_NUM_EXT_PORTS, param_vmap_wid, param_vmap_len)!=PASS) { 331 TDM_ERROR0("Critical error in 10G time vector preallocation\n"); 332 return 0; 333 } 334 } 335 else { 336 if (tdm_core_postalloc_vmap(param_vmap, param_freq, 11, &_tdm->_core_data.vars_pkg.m_tdm_core_vbs_scheduler.yy, &(_tdm->_core_data.vars_pkg.m_tdm_core_vbs_scheduler.y1), param_lr_limit, lr10, TOKEN_10G, "10", TH_NUM_EXT_PORTS, param_vmap_wid, param_vmap_len)!=PASS) { 337 TDM_ERROR0("Critical error in 10G time vector preallocation\n"); 338 return 0; 339 } 340 } 341 } 342 /* 1G */ 343 if (_tdm->_core_data.vars_pkg.m_tdm_core_vbs_scheduler.y8 > 0) { 344 if (tdm_core_postalloc_vmap(param_vmap, param_freq, 1, &_tdm->_core_data.vars_pkg.m_tdm_core_vbs_scheduler.yy, &(_tdm->_core_data.vars_pkg.m_tdm_core_vbs_scheduler.y8), param_lr_limit, lr1, TOKEN_1G, "1", TH_NUM_EXT_PORTS, param_vmap_wid, param_vmap_len)!=PASS) { 345 TDM_ERROR0("Critical error in 1G time vector preallocation\n"); 346 return 0; 347 } 348 } 349 350 return ( _tdm->_core_exec[TDM_CORE_EXEC__SCHEDULER]( _tdm ) ); 351 } 352 353 354 /** 355 @name: tdm_th_proc_cal_ancl 356 @param: 357 358 Allocate ancillary slots with matched speed rates accordingly 359 */ 360 int 361 tdm_th_proc_cal_ancl(tdm_mod_t *_tdm) 362 { 363 int i, j, k, k_prev, k_idx, idx_up, idx_dn, result=PASS; 364 int param_lr_limit, param_ancl_num, param_cal_len, 365 param_token_empty, param_token_ancl, 366 param_lr_en; 367 int *param_cal_main; 368 369 param_lr_limit = _tdm->_chip_data.soc_pkg.lr_idx_limit; 370 param_ancl_num = _tdm->_chip_data.soc_pkg.tvec_size; 371 param_cal_len = param_lr_limit + param_ancl_num; 372 param_token_empty = _tdm->_chip_data.soc_pkg.num_ext_ports; 373 param_token_ancl = _tdm->_chip_data.soc_pkg.soc_vars.ancl_token; 374 param_lr_en = _tdm->_core_data.vars_pkg.lr_enable; 375 376 /* allocate ANCL slots */ 377 TDM_SEL_CAL(_tdm->_core_data.vars_pkg.cal_id,param_cal_main); 378 if (param_ancl_num>0){ 379 TDM_PRINT1("TDM: Allocate %d ANCL slots\n\n", param_ancl_num); 380 if (param_lr_en==BOOL_TRUE){ 381 k = 0; 382 for (j=0; j<param_ancl_num; j++){ 383 idx_up = 0; 384 idx_dn = 0; 385 k_idx = 0; 386 k_prev = k; 387 if (j==(param_ancl_num-1)){ 388 k = param_cal_len - 1; 389 } 390 else { 391 k = k_prev + ((param_cal_len-k_prev)/(param_ancl_num-j)) -1; 392 } 393 for (i=k; i>0 && i<param_cal_len; i--){ 394 if (param_cal_main[i]==param_token_empty){ 395 idx_up = i; 396 break; 397 } 398 } 399 for (i=k; i<param_cal_len; i++){ 400 if (param_cal_main[i]==param_token_empty){ 401 idx_dn = i; 402 break; 403 } 404 } 405 if (idx_up>0 || idx_dn>0){ 406 if (idx_up>0 && idx_dn>0){ 407 k_idx = ((k-idx_up)<(idx_dn-k))?(idx_up):(idx_dn); 408 } 409 else if (idx_up>0){ 410 k_idx = idx_up; 411 } 412 else if (idx_dn>0){ 413 k_idx = idx_dn; 414 } 415 } 416 if (k_idx==0){ 417 for (i=(param_cal_len-1); i>0; i--){ 418 if (param_cal_main[i]==param_token_empty){ 419 k_idx = i; 420 break; 421 } 422 } 423 } 424 if (k_idx>0 && k_idx<param_cal_len){ 425 param_cal_main[k_idx] = param_token_ancl; 426 TDM_PRINT2("TDM: Allocate %d-th ANCL slot at index #%03d\n", 427 j+1, k_idx); 428 } 429 else { 430 TDM_WARN1("TDM: Failed in %d-th ANCL slot allocation\n",j); 431 result = FAIL; 432 } 433 } 434 } 435 else { 436 k_prev = 0; 437 for (j=0; j<param_ancl_num; j++){ 438 k_idx = k_prev + ((param_cal_len-k_prev)/(param_ancl_num-j)) - 1; 439 param_cal_main[k_idx] = param_token_ancl; 440 k_prev= k_idx+1; 441 TDM_PRINT1("TDM: Allocate ANCL slot at index #%03d\n", 442 k_idx); 443 } 444 } 445 TDM_SML_BAR 446 } 447 448 return result; 449 } 450 451 452 /** 453 @name: tdm_th_proc_cal_acc 454 @param: 455 456 Allocate accessory slots with matched speed rates accordingly 457 */ 458 int 459 tdm_th_proc_cal_acc(tdm_mod_t *_tdm) 460 { 461 int i, j, v, k, k_prev, k_idx, clump_size, clump_size_max, result=PASS; 462 int param_lr_limit, param_ancl_num, param_cal_len, 463 param_token_empty, param_token_ancl, 464 param_lr_en; 465 int *param_cal_main; 466 467 param_lr_limit = _tdm->_chip_data.soc_pkg.lr_idx_limit; 468 param_ancl_num = _tdm->_chip_data.soc_pkg.tvec_size; 469 param_cal_len = param_lr_limit + param_ancl_num; 470 param_token_empty = _tdm->_chip_data.soc_pkg.num_ext_ports; 471 param_token_ancl = _tdm->_chip_data.soc_pkg.soc_vars.ancl_token; 472 param_lr_en = _tdm->_core_data.vars_pkg.lr_enable; 473 474 /* allocate ANCL slots */ 475 TDM_SEL_CAL(_tdm->_core_data.vars_pkg.cal_id,param_cal_main); 476 if (param_ancl_num>0 && param_ancl_num<=param_cal_len){ 477 TDM_PRINT1("TDM: Allocate %d ANCL slots\n\n", param_ancl_num); 478 if (param_lr_en==BOOL_TRUE){ 479 k = 0; 480 for (j=0; j<param_ancl_num; j++){ 481 k_prev = k; 482 if (j==(param_ancl_num-1)){ 483 k = param_cal_len - 1; 484 } 485 else { 486 k = k_prev + ((param_cal_len-k_prev)/(param_ancl_num-j)) -1; 487 } 488 k_idx= 0; 489 clump_size = 0; 490 clump_size_max = 0; 491 for (i=k; i>=k_prev && i<param_cal_len; i--){ 492 if (param_cal_main[i]==param_token_empty){ 493 clump_size++; 494 if (i==k){ 495 for (v=k+1; v<param_cal_len; v++){ 496 if (param_cal_main[v]==param_token_empty){ 497 clump_size++; 498 } 499 else{ 500 break; 501 } 502 } 503 } 504 } 505 else{ 506 if (clump_size>clump_size_max){ 507 clump_size_max = clump_size; 508 k_idx = i + (clump_size_max/2) + 1; 509 } 510 clump_size = 0; 511 } 512 } 513 if (k_idx==0){ 514 for (i=(param_cal_len-1); i>0; i--){ 515 if (param_cal_main[i]==param_token_empty){ 516 k_idx = i; 517 break; 518 } 519 } 520 } 521 if (k_idx>0 && k_idx<param_cal_len){ 522 param_cal_main[k_idx] = param_token_ancl; 523 TDM_PRINT1("TDM: Allocate ANCL slot at index #%03d\n", 524 k_idx); 525 } 526 else { 527 TDM_WARN1("TDM: Failed in %d-th ANCL slot allocation\n",j); 528 result = FAIL; 529 } 530 } 531 } 532 else { 533 k_prev = 0; 534 for (j=0; j<param_ancl_num; j++){ 535 k_idx = k_prev + ((param_cal_len-k_prev)/(param_ancl_num-j)) - 1; 536 param_cal_main[k_idx] = param_token_ancl; 537 k_prev= k_idx+1; 538 TDM_PRINT1("TDM: Allocate ANCL slot at index #%03d\n", 539 k_idx); 540 } 541 } 542 TDM_SML_BAR 543 } 544 545 return result; 546 } 547 548 549 /** 550 @name: tdm_th_proc_cal_idle 551 @param: 552 553 Allocate idle slots with matched speed rates accordingly 554 */ 555 int 556 tdm_th_proc_cal_idle( tdm_mod_t *_tdm ) 557 { 558 int i, result=PASS; 559 int param_lr_limit, param_ancl_num, param_cal_len, 560 param_token_empty, param_token_ovsb, 561 param_token_idl1, param_token_idl2, 562 param_os_en; 563 int *param_cal_main; 564 565 param_lr_limit = _tdm->_chip_data.soc_pkg.lr_idx_limit; 566 param_ancl_num = _tdm->_chip_data.soc_pkg.tvec_size; 567 param_cal_len = param_lr_limit + param_ancl_num; 568 param_token_empty = _tdm->_chip_data.soc_pkg.num_ext_ports; 569 param_token_ovsb = _tdm->_chip_data.soc_pkg.soc_vars.ovsb_token; 570 param_token_idl1 = _tdm->_chip_data.soc_pkg.soc_vars.idl1_token; 571 param_token_idl2 = _tdm->_chip_data.soc_pkg.soc_vars.idl2_token; 572 param_os_en = _tdm->_core_data.vars_pkg.os_enable; 573 574 TDM_SEL_CAL(_tdm->_core_data.vars_pkg.cal_id,param_cal_main); 575 576 if (param_os_en==BOOL_TRUE){ 577 for (i=0; i<param_cal_len; i++){ 578 if (param_cal_main[i]==param_token_empty){ 579 param_cal_main[i] = param_token_ovsb; 580 } 581 } 582 } 583 else { 584 for (i=0; i<param_cal_len; i++){ 585 if (param_cal_main[i]==param_token_empty){ 586 if ((i%2)==0){ 587 param_cal_main[i] = param_token_idl1; 588 } 589 else { 590 param_cal_main[i] = param_token_idl2; 591 } 592 } 593 } 594 } 595 596 return result; 597 } 598 599 600 /** 601 @name: tdm_th_proc_cal_lr 602 @param: 603 604 Allocate linerate slots with matched speed rates accordingly 605 */ 606 int 607 tdm_th_proc_cal_lr( tdm_mod_t *_tdm ) 608 { 609 int *param_lr_buff=NULL, result=PASS; 610 611 /* allocate Linerate slots (step-1): vmap pre-allocation */ 612 if(_tdm->_core_exec[TDM_CORE_EXEC__VMAP_PREALLOC](_tdm)!=PASS){ 613 result = FAIL; 614 } 615 /* allocate Linerate slots (step-2): vmap allocation */ 616 else{ 617 /* SPECIAL CASE: 4x106HG+3x40G uses a unique TDM in Tomahawk */ 618 param_lr_buff = _tdm->_core_data.vars_pkg.lr_buffer; 619 _tdm->_core_data.vars_pkg.HG4X106G_3X40G = BOOL_FALSE; 620 if (_tdm->_core_data.vars_pkg.m_tdm_vmap_alloc.num_40g==3 && 621 _tdm->_core_data.vars_pkg.m_tdm_vmap_alloc.num_100g==4 && 622 _tdm->_chip_data.soc_pkg.clk_freq==TH_CLK_850MHZ) { 623 if (tdm_th_check_pipe_ethernet(param_lr_buff[0],_tdm)!=BOOL_TRUE|| 624 _tdm->_chip_data.soc_pkg.soc_vars.th.higig_mgmt==BOOL_TRUE || 625 _tdm->_chip_data.soc_pkg.soc_vars.th.cal_hg_en==BOOL_TRUE ){ 626 _tdm->_chip_data.soc_pkg.tvec_size = 9; 627 _tdm->_chip_data.soc_pkg.lr_idx_limit= 201; 628 _tdm->_core_data.vars_pkg.HG4X106G_3X40G = BOOL_TRUE; 629 TDM_PRINT0("TDM: Special case 4x106HG_3x40HG\n"); 630 } 631 } 632 /* vmap allocation */ 633 if(_tdm->_core_exec[TDM_CORE_EXEC__VMAP_ALLOC](_tdm)!=PASS){ 634 result = FAIL; 635 } 636 } 637 638 return result; 639 } 640 641 642 /** 643 @name: tdm_th_proc_cal 644 @param: 645 646 Allocate slots for linerate/oversub/ancl ports with matched speed rates accordingly 647 */ 648 int 649 tdm_th_proc_cal( tdm_mod_t *_tdm ) 650 { 651 /* allocate LINERATE slots */ 652 if(tdm_th_proc_cal_lr(_tdm)!=PASS){ 653 return (TDM_EXEC_CORE_SIZE+1); 654 } 655 /* allocate ANCILLARY slots */ 656 if(tdm_th_proc_cal_ancl(_tdm)!=PASS){ 657 return (TDM_EXEC_CORE_SIZE+1); 658 } 659 /* allocate IDLE/OVSB slots */ 660 if(tdm_th_proc_cal_idle(_tdm)!=PASS){ 661 return (TDM_EXEC_CORE_SIZE+1); 662 } 663 664 return ( _tdm->_core_exec[TDM_CORE_EXEC__SCHEDULER](_tdm) ); 665 }