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