summaryrefslogtreecommitdiff
path: root/util/oem_supermicro.c
diff options
context:
space:
mode:
Diffstat (limited to 'util/oem_supermicro.c')
-rw-r--r--util/oem_supermicro.c127
1 files changed, 125 insertions, 2 deletions
diff --git a/util/oem_supermicro.c b/util/oem_supermicro.c
index 5d7dee9..35df1bd 100644
--- a/util/oem_supermicro.c
+++ b/util/oem_supermicro.c
@@ -66,7 +66,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
void set_loglevel(int level); /*prototype */
extern char fsm_debug; /*mem_if.c*/
-static char * progver = "2.96";
+static char * progver = "2.97";
static char * progname = "ismcoem";
static int verbose = 0;
static char fdebug = 0;
@@ -106,6 +106,18 @@ int oem_supermicro_get_bmc_status(uchar *sts)
return(rv);
}
+/*
+ * oem_supermicro_get_bmc_services_status
+ *
+ * Request
+ * 0x30 - OEM network function
+ * 0x70 - OEM cmd
+ * 0xF0 - subcommand
+ * 0x?? - action 00=disable, 01=enable, 02=status
+ *
+ * Response
+ * 0x?? - if action=status: 00=disabled, 01=enabled
+ */
int oem_supermicro_set_bmc_status(uchar sts)
{
int rv;
@@ -132,6 +144,83 @@ int oem_supermicro_set_bmc_status(uchar sts)
return(rv);
}
+/*
+ oem_supermicro_psstatus1(uchar psnum, uchar *val)
+*/
+int oem_supermicro_psstatus1(uchar psnum, uchar *val)
+{
+ int rv;
+ int rlen;
+ uchar idata[16];
+ uchar rdata[16];
+ uchar cc;
+
+ idata[0] = 0x07; /*busid*/
+ if (psnum <= 1) idata[1] = 0x70; /* PS 1 */
+ else if (psnum == 2) idata[1] = 0x72; /* PS 2 */
+ else /*if (psnum == 3)*/ idata[1] = 0x74; /* PS 3 */
+ idata[2] = 0x01; /* return one byte of PS status data */
+ idata[3] = 0x0C;
+ rlen = sizeof(rdata);
+ rv = ipmi_cmd(MASTER_WRITE_READ, idata, 4, rdata, &rlen, &cc, fdebug);
+ if ((rv == 0) && (cc != 0)) rv = cc;
+ if (rv == 0) { *val = rdata[0]; }
+ return(rv);
+}
+
+/*
+ oem_supermicro_psstatus2(uchar psnum, uchar *val)
+ Get PMBus Power Supply Status, for X10 motherboards
+*/
+int oem_supermicro_psstatus2(uchar psnum, uchar *val)
+{
+ int rv;
+ int rlen;
+ uchar idata[16];
+ uchar rdata[16];
+ uchar cc;
+
+ idata[0] = 0x07; /*busid*/
+ if (psnum <= 1) idata[1] = 0x78; /* PS 1 */
+ else if (psnum == 2) idata[1] = 0x7A; /* PS 2 */
+ else /*if (psnum == 3)*/ idata[1] = 0x7C; /* PS 3 */
+ idata[2] = 0x01; /* return one byte of PS status data */
+ idata[3] = 0x78;
+ rlen = sizeof(rdata);
+ rv = ipmi_cmd(MASTER_WRITE_READ, idata, 4, rdata, &rlen, &cc, fdebug);
+ if ((rv == 0) && (cc != 0)) rv = cc;
+ if (rv == 0) { *val = rdata[0]; }
+ return(rv);
+}
+
+/*
+ oem_supermicro_psstatus3(uchar psnum, uchar *val)
+ Get PMBus Power Supply Status, for X10 motherboards
+
+ raw 0x06 0x52 0x07 0xb0 0x01 0x0c for power supply 1
+ raw 0x06 0x52 0x07 0xb2 0x01 0x0c for power supply 2
+*/
+int oem_supermicro_psstatus3(uchar psnum, uchar *val)
+{
+ int rv;
+ int rlen;
+ uchar idata[16];
+ uchar rdata[16];
+ uchar cc;
+
+ idata[0] = 0x07; /*busid*/
+ if (psnum <= 1) idata[1] = 0xB0; /* PS 1 */
+ else if (psnum == 2) idata[1] = 0xB2; /* PS 2 */
+ else /*if (psnum == 3)*/ idata[1] = 0xB4; /* PS 3 */
+ idata[2] = 0x01; /* return one byte of PS status data */
+ idata[3] = 0x0C;
+ rlen = sizeof(rdata);
+ rv = ipmi_cmd(MASTER_WRITE_READ, idata, 4, rdata, &rlen, &cc, fdebug);
+ if ((rv == 0) && (cc != 0)) rv = cc;
+ if (rv == 0) { *val = rdata[0]; }
+ return(rv);
+}
+
int oem_supermicro_get_lan_port(uchar *val)
{
int rv;
@@ -448,12 +537,13 @@ static void usage(void)
printf(" bmcstatus [enable| disable] = get/set BMC status\n");
printf(" firmware = get extra firmware info\n");
printf(" lanport [dedicated| lan1| failover] = get/set IPMI LAN port\n");
+ printf(" powersupply <num> = get PMBus PowerSupply status\n");
printf("These commands may not work on all SuperMicro systems\n");
}
static int ipmi_smcoem_main(int argc, char **argv)
{
- int rv = 0;
+ int n,rv = 0;
char msg[80];
uchar val;
@@ -506,6 +596,39 @@ static int ipmi_smcoem_main(int argc, char **argv)
if (rv == 0) oem_supermicro_show_lan_port(val);
}
}
+ } else if (strncmp(argv[0],"powersupply",11) == 0) {
+ if (argv[1] == NULL) {
+ usage();
+ rv = ERR_USAGE;
+ } else {
+ char DevRec[16];
+ int xver = 9;
+ n = atoi(argv[1]); /* power supply number */
+ rv = ipmi_getdeviceid( DevRec, sizeof(DevRec),fdebug);
+ if (rv == 0) {
+ int vend_id, prod_id;
+ /* 1562 (0x061A) = X8SIU */
+ /* 1572 (0x0624) = X9SCM */
+ /* 1797 (0x0705) = X9DR7 */
+ /* 2137 (0x0859) = X10DRH */
+ vend_id = DevRec[6] + (DevRec[7] << 8) + (DevRec[8] << 16);
+ prod_id = DevRec[9] + (DevRec[10] << 8);
+ if (prod_id > 0x0800) xver = 10;
+ else if (prod_id > 1570) xver = 9;
+ else xver = 8;
+ }
+ if (xver == 10) rv = oem_supermicro_psstatus3(n, &val);
+ else if (xver == 9) rv = oem_supermicro_psstatus2(n, &val);
+ else /*xver==8*/ rv = oem_supermicro_psstatus1(n, &val);
+ if (rv == 0) {
+ if (val == 0x00) strcpy(msg,"good");
+ else if (val == 0x02) strcpy(msg,"ok");
+ else sprintf(msg,"bad 0x%02x",val);
+ printf("X%d Power Supply %d status = %d (%s)\n",xver,n,val,msg);
+ } else {
+ printf("X%d Power Supply %d error = %d\n",xver,n,rv);
+ }
+ }
} else {
usage();
rv = ERR_USAGE;