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

iproc.c (7938B)


      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  * File: iproc.c
      8  * Purpose: 	IPROC memory Access Support
      9  */
     10 
     11 #include <assert.h>
     12 #include <sal/core/libc.h>
     13 #include <shared/bsl.h>
     14 #include <bcm/error.h>
     15 #include <soc/types.h>
     16 #include <soc/dma.h>
     17 #include <appl/diag/shell.h>
     18 #include <appl/diag/system.h>
     19 
     20 #ifdef BCM_IPROC_SUPPORT
     21 
     22 #define DUMP_BUFFER_LEN 1024
     23 #define DUMP_BUFFER_SIZE (DUMP_BUFFER_LEN * 4)
     24 
     25 #define SWAP_ENDIAN(x) ( \
     26     (((x) << 24) & 0xff000000) | \
     27     (((x) <<  8) & 0x00ff0000) | \
     28     (((x) >>  8) & 0x0000ff00) | \
     29     (((x) >> 24) & 0x000000ff))
     30 
     31 STATIC cmd_result_t
     32 _iproc_write_from_args(int unit, int ce, uint32 addr, args_t *args) {
     33     char *c;
     34     uint32 data;
     35     int len, i;
     36 
     37     len = ARG_CNT(args);
     38 
     39     for (i = 0; i < len; i++) {
     40         c = ARG_GET(args);
     41         if (!isint(c)) {
     42             cli_out("%s: Error: Non Numeric Data %s\n", ARG_CMD(args), c);
     43             return CMD_FAIL;
     44         }
     45         data = parse_address(c);
     46         if (ce) {
     47             data = SWAP_ENDIAN(data);
     48         }
     49         soc_cm_iproc_write(unit, (addr + (i * 4)), data);
     50     }
     51 
     52     LOG_VERBOSE(BSL_LS_SOC_COMMON,
     53                 (BSL_META_U(unit,
     54                             "Wrote %d words to iProc 0x%08x\n"), len, addr));
     55     return CMD_OK;
     56 }
     57 
     58 #ifndef NO_FILEIO
     59 
     60 STATIC cmd_result_t
     61 _iproc_write_from_bin_file(int unit, int ce, uint32 addr, FILE *fp) {
     62     uint32 data;
     63     int len, i;
     64 
     65     len = 0;
     66     while ((i = sal_fread(&data,4,1,fp)) != 0) {
     67         if (ce) {
     68             data = SWAP_ENDIAN(data);
     69         }
     70         soc_cm_iproc_write(unit, (addr + (len * 4)), data);
     71         len += i;
     72     }
     73 
     74     LOG_VERBOSE(BSL_LS_SOC_COMMON,
     75                 (BSL_META_U(unit,
     76                             "Wrote %d words to iProc 0x%08x\n"), len, addr));
     77     return CMD_OK;
     78 }
     79 
     80 #endif /* NO_FILEIO */
     81 
     82 STATIC cmd_result_t
     83 _iproc_dump(int unit, int ce, void *fp, uint32 addr, int len) {
     84     uint32 rval;
     85     int i;
     86 #ifndef NO_FILEIO
     87     FILE * fileptr = fp;
     88 #endif
     89     cli_out("Addr 0x%x, len %d\n", addr, len);
     90 
     91     for (i = 0; i < len; i++) {
     92         rval = soc_cm_iproc_read(unit, (addr + (i * 4)));
     93         if (ce) {
     94             rval = SWAP_ENDIAN(rval);
     95         }
     96         cli_out("0x%08x ", rval);
     97         if ((i % 4) == 3) {
     98             cli_out("\n");
     99         }
    100 #ifndef NO_FILEIO
    101         if (fileptr != NULL) {
    102             fwrite(&rval, 4, 1, fileptr);
    103         }
    104 #endif
    105     }
    106     cli_out("\n");
    107 
    108     return CMD_OK;
    109 }
    110 
    111 char iprocwrite_usage[] =
    112     "Parameters: [ChangeEndian=0|1] <address> {<data>|<file.hex>}\n\t"
    113     "Writes to the IPROC Memory space.\n\t"
    114     "Either provide word data separated by space, or filename.\n\t"
    115     "Example: iprocwrite 0x48000000 0x123 0x45678 (Write 2 words)\n\t"
    116     "         iprocwrite 0x48000000 file.bin\n";
    117 
    118 cmd_result_t
    119 iprocwrite_cmd(int unit, args_t *args)
    120 {
    121     cmd_result_t rv = CMD_OK;
    122     parse_table_t  pt;
    123     char *c, *filename = NULL;
    124     int ce = 0;
    125     uint32 addr = 0;
    126 #ifndef NO_FILEIO
    127   #ifndef NO_CTRL_C
    128     jmp_buf ctrl_c;
    129   #endif
    130     FILE * volatile fp = NULL;
    131 #endif
    132 
    133     if (ARG_CNT(args) < 1) {
    134         return(CMD_USAGE);
    135     }
    136 
    137     parse_table_init(unit, &pt);
    138     parse_table_add(&pt, "ChangeEndian", PQ_DFL|PQ_BOOL,
    139                     0, &ce,  NULL);
    140     if (parse_arg_eq(args, &pt) < 0) {
    141         cli_out("%s: Error: Unknown option: %s\n", ARG_CMD(args), ARG_CUR(args));
    142         parse_arg_eq_done(&pt);
    143         return(CMD_USAGE);
    144     }
    145 
    146     c = ARG_GET(args);
    147     if (!isint(c)) {
    148         cli_out("%s: Error: Address not specified\n", ARG_CMD(args));
    149         parse_arg_eq_done(&pt);
    150         return(CMD_USAGE);
    151     }
    152     addr = parse_address(c);
    153 
    154     if (ARG_CNT(args) <= 0) {
    155         cli_out("%s: Error: Data / Filename not specified\n", ARG_CMD(args));
    156         parse_arg_eq_done(&pt);
    157         return(CMD_USAGE);
    158     }
    159 
    160     c = ARG_GET(args);
    161 
    162     if (!isint(c)) {
    163         filename = c;
    164     }
    165 
    166     if (filename == NULL) {
    167         ARG_PREV(args);
    168         rv = _iproc_write_from_args(unit, ce, addr, args);
    169     } else {
    170 #ifdef NO_FILEIO
    171         cli_out("no filesystem\n");
    172 #else
    173         /* Read from file */        
    174   #ifndef NO_CTRL_C
    175           if (!setjmp(ctrl_c)) {
    176               sh_push_ctrl_c(&ctrl_c);
    177   #endif
    178     
    179               fp = sal_fopen(filename, "r");
    180               if (!fp) {
    181                   cli_out("%s: Error: Unable to open file: %s\n",
    182                           ARG_CMD(args), filename);
    183                   rv = CMD_FAIL;
    184   #ifndef NO_CTRL_C
    185                   sh_pop_ctrl_c();
    186   #endif
    187                   parse_arg_eq_done(&pt);
    188                   return(rv);
    189               } else {
    190                   rv = _iproc_write_from_bin_file(unit, ce, addr, fp);
    191                   sal_fclose((FILE *)fp);
    192                   fp = NULL;
    193               }
    194 
    195   #ifndef NO_CTRL_C
    196           } else if (fp) {
    197               sal_fclose((FILE *)fp);
    198               fp = NULL;
    199               rv = CMD_INTR;
    200           }
    201     
    202           sh_pop_ctrl_c();
    203   #endif
    204 #endif
    205     }
    206 
    207     parse_arg_eq_done(&pt);
    208     return(rv);
    209 }
    210 
    211 char iprocread_usage[] =
    212     "Parameters: [ChangeEndian=0|1] <address> [<length>] [<file.bin>]\n\t"
    213     "Prints <length> words from the IPROC Memory space.\n\t"
    214     "And optionally saves to a file in binary format.\n\t"
    215     "  <length> defaults to 1 if not specified.\n\t"
    216     "  <file.bin> = dumpfile to write.\n";
    217 
    218 cmd_result_t
    219 iprocread_cmd(int unit, args_t *args)
    220 {
    221     cmd_result_t rv = CMD_OK;
    222     parse_table_t  pt;
    223     char *c, *filename = NULL;
    224     uint32 addr = 0;
    225     int ce = 0;
    226     int len=1;
    227 #ifndef NO_FILEIO
    228 #ifndef NO_CTRL_C
    229     jmp_buf ctrl_c;
    230 #endif
    231     FILE * volatile fp = NULL;
    232 #endif
    233 
    234     if (ARG_CNT(args) < 1) {
    235         return(CMD_USAGE);
    236     }
    237 
    238     parse_table_init(unit, &pt);
    239     parse_table_add(&pt, "ChangeEndian", PQ_DFL|PQ_BOOL,
    240                     0, &ce,  NULL);
    241     if (parse_arg_eq(args, &pt) < 0) {
    242         cli_out("%s: Error: Unknown option: %s\n",
    243                 ARG_CMD(args), ARG_CUR(args));
    244         parse_arg_eq_done(&pt);
    245         return(CMD_USAGE);
    246     }
    247 
    248     c = ARG_GET(args);
    249     if (!isint(c)) {
    250         cli_out("%s: Error: Address not specified\n", ARG_CMD(args));
    251         parse_arg_eq_done(&pt);
    252         return(CMD_USAGE);
    253     }
    254     addr = parse_address(c);
    255 
    256     if (ARG_CNT(args) > 0) {
    257         c = ARG_GET(args);
    258         if (isint(c)) {
    259             len = parse_address(c);
    260             if (ARG_CNT(args) > 0) {
    261                 filename = ARG_GET(args);
    262             }
    263         } else {
    264             filename = c;
    265         }
    266     }
    267 
    268     if (filename == NULL) {
    269         /* Just dump to screen */
    270         rv = _iproc_dump(unit, ce, NULL, addr, len);
    271     } else {
    272 #ifdef NO_FILEIO
    273         cli_out("no filesystem\n");
    274 #else
    275         /* Dump to file */        
    276   #ifndef NO_CTRL_C
    277         if (!setjmp(ctrl_c)) {
    278             sh_push_ctrl_c(&ctrl_c);
    279   #endif
    280 
    281             fp = sal_fopen(filename, "w");
    282             if (!fp) {
    283                 cli_out("%s: Error: Unable to open file: %s\n",
    284                         ARG_CMD(args), filename);
    285                 rv = CMD_FAIL;
    286   #ifndef NO_CTRL_C
    287                 sh_pop_ctrl_c();
    288   #endif
    289                 parse_arg_eq_done(&pt);
    290                 return(rv);
    291             } else {
    292                 LOG_VERBOSE(BSL_LS_SOC_COMMON,
    293                             (BSL_META_U(unit,
    294                                         "Dump to file %s\n"), filename));
    295                 rv = _iproc_dump(unit, ce, fp, addr, len);
    296                 sal_fclose((FILE *)fp);
    297                 fp = NULL;
    298             }
    299 
    300   #ifndef NO_CTRL_C
    301         } else if (fp) {
    302             sal_fclose((FILE *)fp);
    303             fp = NULL;
    304             rv = CMD_INTR;
    305         }
    306 
    307         sh_pop_ctrl_c();
    308   #endif
    309         sal_usleep(10000);
    310 #endif /* NO_FILEIO */
    311     }
    312 
    313     parse_arg_eq_done(&pt);
    314     return(rv);
    315 }
    316 
    317 #endif /* IPROC support */
    318