bist.c (6588B)
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 * 7 * Built-in Self Test for ARL, L3, and CBP memories 8 */ 9 10 11 #include <shared/bsl.h> 12 13 #include <sal/types.h> 14 #include <soc/mem.h> 15 16 #include <appl/diag/system.h> 17 #include <appl/diag/parse.h> 18 #include <appl/diag/shell.h> 19 #include "testlist.h" 20 #if defined (BCM_DNXF_SUPPORT) || defined (BCM_DNX_SUPPORT) 21 #include <soc/cm.h> 22 #ifdef BCM_DNXF_SUPPORT 23 #include <soc/dnxf/ramon/ramon_drv.h> 24 #endif 25 #if defined (BCM_DNX_SUPPORT) 26 #include <soc/dnx/drv.h> 27 #endif 28 #endif 29 #ifdef BCM_DFE_SUPPORT 30 #include <soc/dfe/cmn/dfe_drv.h> 31 #include <soc/cm.h> 32 #endif 33 #ifdef BCM_PETRA_SUPPORT 34 #include <soc/dpp/ARAD/arad_init.h> 35 #include <bcm/init.h> 36 #include <soc/dpp/drv.h> 37 #include <appl/diag/dcmn/init_deinit.h> 38 #endif 39 40 #if defined (BCM_ESW_SUPPORT) || defined (BCM_DFE_SUPPORT) || defined (BCM_PETRA_SUPPORT) || defined (BCM_DNX_SUPPORT) || defined (BCM_DNXF_SUPPORT) 41 typedef struct bist_testdata_s { 42 soc_mem_t mems[NUM_SOC_MEM]; 43 int num_mems; 44 } bist_testdata_t; 45 46 #ifdef BCM_PETRA_SUPPORT 47 STATIC appl_dcmn_init_param_t bist_init_deinit[SOC_MAX_NUM_DEVICES]; 48 #endif 49 50 51 int 52 bist_test_init(int u, args_t *a, void **p) 53 { 54 55 bist_testdata_t *bd = 0; 56 57 if (SOC_IS_DFE(u) || SOC_IS_DNXF(u) || SOC_IS_DNX(u)){ 58 char *arg0 = ARG_CUR(a); 59 if (arg0 != NULL && sal_strcasecmp(arg0, "all") == 0) { 60 ARG_NEXT(a); /* ignore the default argument for this TR */ 61 } 62 #ifdef BCM_DFE_SUPPORT 63 if(SOC_IS_DFE(u)) 64 { 65 return init_deinit_test_init(u, a, p); 66 } 67 #endif 68 #if defined(BCM_DNXF_SUPPORT) || defined(BCM_DNX_SUPPORT) 69 if(SOC_IS_DNXF(u) || SOC_IS_DNX(u)) 70 { 71 return test_dnxc_init_test_init(u, a, p); 72 } 73 #endif 74 } 75 #ifdef BCM_PETRA_SUPPORT 76 else if (SOC_IS_ARAD(u)){ 77 appl_dcmn_init_param_t *init_param; 78 char *arg0 = ARG_CUR(a); 79 80 if (arg0 != NULL && sal_strcasecmp(arg0, "all") == 0) { 81 ARG_NEXT(a); /* ignore the default argument for this TR */ 82 } 83 84 init_param = &bist_init_deinit[u]; 85 sal_memset(init_param, 0x0, sizeof(appl_dcmn_init_param_t)); 86 init_param->no_attach=1; 87 *p = init_param; 88 /* set default modid & base_modid with non-valid values, which denotes */ 89 /* that previous values should be taken if those params were not supplied */ 90 init_param->modid = -1; 91 init_param->base_modid = -1; 92 93 return appl_dcmn_init_usage_parse(u, a, init_param); 94 /*return init_deinit_test_init(u, a, init_param);*/ 95 } 96 #endif 97 98 if ((bd = sal_alloc(sizeof (*bd), "bist-testdata")) == 0) { 99 goto fail; 100 } 101 102 #if defined (BCM_ESW_SUPPORT) 103 if (bist_args_to_mems(u, a, bd->mems, &bd->num_mems) < 0) { 104 goto fail; 105 } 106 #endif 107 if ((soc_reset_init(u)) < 0) { 108 goto fail; 109 } 110 111 if (soc_mem_debug_set(u, 0) < 0) { 112 goto fail; 113 } 114 115 *p = (void *) bd; 116 117 return 0; 118 119 fail: 120 if (bd) { 121 sal_free(bd); 122 } 123 124 return -1; 125 } 126 127 int 128 bist_test(int u, args_t *a, void *p) 129 { 130 #if defined (BCM_ESW_SUPPORT) 131 bist_testdata_t *bd = p; 132 #endif 133 int rv = 0; 134 COMPILER_REFERENCE(a); 135 #ifdef BCM_DNX_SUPPORT 136 if (SOC_IS_DNX(u)) 137 { 138 char command[256]; 139 uint16 dev_id; 140 uint8 rev_id; 141 142 soc_cm_get_id (u, &dev_id, &rev_id); 143 sal_snprintf(command, 256,"config delete %s.BCM8%x",spn_BIST_ENABLE,dev_id); 144 sh_process_command(u,command); 145 sal_snprintf(command, 256,"config add %s.BCM8%x=%d",spn_BIST_ENABLE,dev_id,2); 146 sh_process_command(u,command); 147 } 148 #endif 149 #if defined (BCM_DNXF_SUPPORT) || defined (BCM_DNX_SUPPORT) 150 if(SOC_IS_DNXF(u) || SOC_IS_DNX(u)) 151 { 152 if ((rv = test_dnxc_init_test(u, a, p))) { /* perform deinit and init */ 153 test_error(u, "BIST or deinint/init failed: %s\n", soc_errmsg(rv)); 154 } 155 } else 156 #endif 157 #if defined (BCM_DFE_SUPPORT) 158 if (SOC_IS_DFE(u)) { 159 char command[256]; 160 uint16 dev_id; 161 uint8 rev_id; 162 163 soc_cm_get_id (u, &dev_id, &rev_id); 164 sal_sprintf(command,"config delete %s.BCM8%x",spn_BIST_ENABLE,dev_id); 165 sh_process_command(u,command); 166 sal_sprintf(command,"config add %s.BCM8%x=%d",spn_BIST_ENABLE,dev_id,2); 167 sh_process_command(u,command); 168 #if defined(BCM_PETRA_SUPPORT) || defined(BCM_DFE_SUPPORT) 169 if ((rv = init_deinit_test(u, a, p))) { /* perform deinit and init */ 170 test_error(u, "BIST or deinint/init failed: %s\n", soc_errmsg(rv)); 171 } 172 #endif 173 /* rv = soc_dfe_drv_mbist(u, 0); */ 174 } else 175 #endif 176 #ifdef BCM_PETRA_SUPPORT 177 if (SOC_IS_ARAD(u)) { 178 SOC_DPP_CONFIG(u)->tm.various_bm |= DPP_VARIOUS_BM_FORCE_MBIST_TEST; /* mark MBIST to be performed by the init */ 179 if ((rv = init_deinit_test(u, a, p))) { /* perform deinit and init */ 180 test_error(u, "BIST or deinint/init failed: %s\n", soc_errmsg(rv)); 181 } 182 SOC_DPP_CONFIG(u)->tm.various_bm &= ~(uint8)DPP_VARIOUS_BM_FORCE_MBIST_TEST; 183 return rv; 184 } else 185 #endif 186 #if defined (BCM_ESW_SUPPORT) 187 { 188 rv = soc_bist(u, 189 bd->mems, bd->num_mems, 190 SOC_CONTROL(u)->bistTimeout); 191 } 192 #else 193 { 194 cli_out("device not supported\n"); 195 } 196 #endif 197 if (rv < 0) { 198 test_error(u, "BIST failed: %s\n", soc_errmsg(rv)); 199 return -1; 200 } 201 return 0; 202 } 203 204 int 205 bist_test_done(int u, void *p) 206 { 207 int rv; 208 #ifdef BCM_PETRA_SUPPORT 209 if (SOC_IS_ARAD(u)) 210 { 211 return init_deinit_test_done(u, p); 212 } else 213 #endif 214 #ifdef BCM_DNX_SUPPORT 215 if (SOC_IS_DNX(u)) 216 { 217 char command[256]; 218 uint16 dev_id; 219 uint8 rev_id; 220 221 soc_cm_get_id (u, &dev_id, &rev_id); 222 sal_snprintf(command, 256,"config delete %s.BCM8%x",spn_BIST_ENABLE,dev_id); 223 sh_process_command(u,command); 224 } 225 #endif 226 #if defined(BCM_DNXF_SUPPORT) || defined(BCM_DNX_SUPPORT) 227 if(SOC_IS_DNXF(u) || SOC_IS_DNX(u)){ 228 return test_dnxc_init_test_done(u, p); 229 } else 230 #endif 231 #if defined(BCM_PETRA_SUPPORT) || defined(BCM_DFE_SUPPORT) 232 if(SOC_IS_DFE(u)){ 233 return init_deinit_test_done(u, p); 234 } else 235 #endif 236 { 237 rv = soc_reset_init(u) ; 238 } 239 sal_free(p); 240 241 if (rv < 0) { 242 test_error(u, "Post-BIST reset failed: %s\n", soc_errmsg(rv)); 243 return -1; 244 } 245 246 return 0; 247 } 248 #endif /* BCM_ESW_SUPPORT */