static void do_service(config_t *cpe, config_t *config, struct rs_config *rs_config) { struct rs_start *rs_start = &rs_config->rs_start; config_t *cp; /* At this point we expect one sublist that contains the varios * resource allocations */ if (!(cpe->flags & CFG_SUBLIST)) { fatal("do_service: expected list at %s:%d", cpe->file, cpe->line); } if (cpe->next != NULL) { cpe= cpe->next; fatal("do_service: expected end of list at %s:%d", cpe->file, cpe->line); } cpe= cpe->list; /* Process the list */ for (cp= cpe; cp; cp= cp->next) { if (!(cp->flags & CFG_SUBLIST)) { fatal("do_service: expected list at %s:%d", cp->file, cp->line); } cpe= cp->list; if ((cpe->flags & CFG_STRING) || (cpe->flags & CFG_SUBLIST)) { fatal("do_service: expected word at %s:%d", cpe->file, cpe->line); } if (strcmp(cpe->word, KW_CLASS) == 0) { do_class(cpe->next, config, rs_config); continue; } if (strcmp(cpe->word, KW_UID) == 0) { do_uid(cpe->next, rs_start); continue; } if (strcmp(cpe->word, KW_SIGMGR) == 0) { do_sigmgr(cpe->next, rs_start); continue; } if (strcmp(cpe->word, KW_TYPE) == 0) { do_type(cpe->next, rs_config); continue; } if (strcmp(cpe->word, KW_DESCR) == 0) { do_descr(cpe->next, rs_config); continue; } if (strcmp(cpe->word, KW_SCHEDULER) == 0) { do_scheduler(cpe->next, rs_start); continue; } if (strcmp(cpe->word, KW_PRIORITY) == 0) { do_priority(cpe->next, rs_start); continue; } if (strcmp(cpe->word, KW_QUANTUM) == 0) { do_quantum(cpe->next, rs_start); continue; } if (strcmp(cpe->word, KW_CPU) == 0) { do_cpu(cpe->next, rs_start); continue; } if (strcmp(cpe->word, KW_IRQ) == 0) { do_irq(cpe->next, rs_start); continue; } if (strcmp(cpe->word, KW_IO) == 0) { do_io(cpe->next, rs_start); continue; } if (strcmp(cpe->word, KW_PCI) == 0) { do_pci(cpe->next, rs_start); continue; } if (strcmp(cpe->word, KW_SYSTEM) == 0) { do_system(cpe->next, rs_start); continue; } if (strcmp(cpe->word, KW_IPC) == 0) { do_ipc(cpe->next, rs_start); continue; } if (strcmp(cpe->word, KW_VM) == 0) { do_vm(cpe->next, rs_start); continue; } if (strcmp(cpe->word, KW_CONTROL) == 0) { do_control(cpe->next, rs_start); continue; } } }
int do_diag(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) { char *orig_ethact, *orig_ipaddr, ca_ethact[20], ca_ipaddr[20]; int i; switch (argc) { case 2: if (strncmp(argv[1],"cpu-bist", 8) == 0) { octeon_bist(); return 0; } else if (strncmp(argv[1],"ddr", 3) == 0) { return do_mem_mtest(NULL, 0, 1, "mtest"); } else if (strncmp(argv[1],"pci", 3) == 0) { #define MAX_ADV_PCI_BUS 13 char *local_args[4], busno[4]; int pci_busno; local_args[0] = "pci"; local_args[1] = busno; local_args[2] = "short"; local_args[3] = NULL; for (pci_busno = 0; pci_busno < MAX_ADV_PCI_BUS; pci_busno++) { sprintf (busno, "%x", pci_busno); do_pci(NULL, 0, 3, local_args); } return 0; } else if (strncmp(argv[1],"mmc-sensor", 10) == 0) { #define MON_3VSB_ID "0x02" #define MON_12V_ID "0x03" #define VDD_3V3_ID "0x06" #define TMP421_CORE_ID "0x0B" #define TMP275_BOARD_ID "0x0C" #define MON_3VSB(x) (0.016*x) #define MON_12V(x) ((68*x-5)*0.001) #define VDD_3V3(x) (0.016*x) #define TMP421_CORE(x) (x) #define TMP275_BOARD(x) (1.01*x+0.14) #define COMMAND_SUCCESS_OFFSET 6 #define VALUE_OFFSET (COMMAND_SUCCESS_OFFSET + 1) #define VALID_READ_OFFSET (COMMAND_SUCCESS_OFFSET + 2) #define INVALID_READ_MASK 0x20 const uchar *ret_val; char *argv[]={"ipmi", "raw", "0x04", "0x2D", "0x00"}; char *ids[]={MON_3VSB_ID, MON_12V_ID, VDD_3V3_ID, TMP421_CORE_ID, TMP275_BOARD_ID}; char *ids_name[]={"3.3V standby", "12V", "3.3V", "Core temperature", "Board temperature"}; int total_ids, argc, i, tmp; float fRet; total_ids = sizeof(ids) / sizeof(ids[0]); argc = sizeof(argv) / sizeof(argv[0]); for (i = 0; i < total_ids; i++) { sprintf(argv[argc-1], ids[i]); // replace the sensor ID to read ret_val = mmc_raw_command_access(argc, argv); if (ret_val[COMMAND_SUCCESS_OFFSET]) // 0 = success { printf("!FAIL IPMI Get %s return code 0x%02x\n", ids_name[i], ret_val[6]); continue; } if (ret_val[VALID_READ_OFFSET] & INVALID_READ_MASK) // bit 5: when set, this read is invalid { printf("%s: %s\n", ids_name[i], "Read failed!"); } else { switch (i) { case 0: fRet = MON_3VSB(ret_val[VALUE_OFFSET]); break; case 1: fRet = MON_12V(ret_val[VALUE_OFFSET]); break; case 2: fRet = VDD_3V3(ret_val[VALUE_OFFSET]); break; case 3: fRet = TMP421_CORE(ret_val[VALUE_OFFSET]); break; case 4: fRet = TMP275_BOARD(ret_val[VALUE_OFFSET]); break; default: printf("unkown to calculate\n"); break; } /* float to string, only 3 digits after '.'; Note: printf does not support float */ { tmp = fRet; printf("%s: %d.", ids_name[i], tmp); fRet -= tmp; fRet *= 1000; tmp = fRet; printf("%d\n", tmp); } } } return 0; } else if (strncmp(argv[1],"reset-type", 10) == 0) { uint8_t cause; mmc_get_hw_reset_reason(&cause); printf("reset-type: "); switch (cause) { case 0x1: printf("hard reset"); break; case 0x2: printf("soft reset"); break; case 0x4: printf("watchdog reset"); break; default: printf("unknown 0x%02x",cause); break; } printf("\n"); return 0; } else if (strncmp(argv[1],"i2c", 3) == 0) { char cmd[255], *subcmd[]={"speed", "dev", "probe"}; for (i = 0; i < sizeof(subcmd)/sizeof(subcmd[0]); i++) { sprintf(cmd, "i2c %s", subcmd[i]); run_command(cmd, 0); } return 0; } else if (strncmp(argv[1],"xaui", 4) == 0) { #define XAUI_INTERFACES 2 #define TEST_IP "192.168.4.1" int default_port[] = {2624, 3136}; /* save original env vars */ orig_ethact = getenv("ethact"); sprintf(ca_ethact, orig_ethact); // save to safety place orig_ipaddr = getenv("ipaddr"); sprintf(ca_ipaddr, orig_ipaddr); /* start to test */ setenv("ipaddr", TEST_IP); NetPingIP = string_to_ip(TEST_IP); // ping our self for (i = 0; i < XAUI_INTERFACES; i++) { char *new_ethact = "octeth "; sprintf(new_ethact, "octeth%d", i); setenv("ethact", new_ethact); /* enabling internal loopback */ if (cvmx_helper_configure_loopback(default_port[i], 1, 0)) { printf("enable %s loopback failed!\n", new_ethact); continue; } if (NetLoop(PING) < 0) { printf("%s loopback transmission failed!\n", new_ethact); } else { printf("%s loopback transmission test pass.\n", new_ethact); } /* disable loopback */ if (cvmx_helper_configure_loopback(default_port[i], 0, 0)) printf("disable %s loopback failed!\n", new_ethact); } /* restore env vars */ setenv("ethact", ca_ethact); setenv("ipaddr", orig_ipaddr ? ca_ipaddr : orig_ipaddr); return 0; } else if (strncmp(argv[1],"mii", 3) == 0) { int rc = 0; /* save original env vars */ orig_ethact = getenv("ethact"); sprintf(ca_ethact, orig_ethact); orig_ipaddr = getenv("ipaddr"); sprintf(ca_ipaddr, orig_ipaddr); /* enabling internal loopback */ run_command("mii write 0 0 6100", 0); /* start to test */ setenv("ethact", "octmgmt0"); setenv("ipaddr", TEST_IP); NetPingIP = string_to_ip(TEST_IP); // ping our self if (NetLoop(PING) < 0) { if (NetLoop(PING) < 0) // give another chance, the octmgmt0 may failed on first try rc = -1; } if (rc < 0) { printf("octmgmt0 loopback transmission failed!\n"); } else { printf("octmgmt0 loopback transmission test pass.\n"); } /* disable loopback */ run_command("mii write 0 0 2100", 0); /* restore env vars */ setenv("ethact", ca_ethact); setenv("ipaddr", orig_ipaddr ? ca_ipaddr : orig_ipaddr); return 0; } break; } return cmd_usage(cmdtp); }