openbcm

Git mirror of https://github.com/Broadcom-Network-Switching-Software/OpenBCM
git clone git://git.finwo.net/mirror/broadcom/openbcm
Log | Files | Refs | README

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 */