summaryrefslogtreecommitdiff
path: root/util/oem_hp.c
diff options
context:
space:
mode:
Diffstat (limited to 'util/oem_hp.c')
-rw-r--r--util/oem_hp.c149
1 files changed, 149 insertions, 0 deletions
diff --git a/util/oem_hp.c b/util/oem_hp.c
new file mode 100644
index 0000000..29a813f
--- /dev/null
+++ b/util/oem_hp.c
@@ -0,0 +1,149 @@
+/*
+ * oem_hp.c
+ * Handle HP OEM command functions
+ *
+ * Change history:
+ * 02/23/2012 ARCress - included in source tree
+ *
+ *---------------------------------------------------------------------
+ */
+/*M*
+Copyright (c) 2012 Kontron America, Inc.
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+ a.. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+ b.. Redistributions in binary form must reproduce the above copyright notice,
+ this list of conditions and the following disclaimer in the documentation
+ and/or other materials provided with the distribution.
+ c.. Neither the name of Kontron nor the names of its contributors
+ may be used to endorse or promote products derived from this software
+ without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
+ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *M*/
+#ifdef WIN32
+#include <windows.h>
+#endif
+#include <stdio.h>
+#include <string.h>
+#include <time.h>
+#include "ipmicmd.h"
+#include "ievents.h"
+#include "isensor.h"
+
+static char *redund_str(uchar b)
+{
+ char *pstr;
+ if (b == 0x00) pstr = "Disabled";
+ else if (b == 0x01) pstr = "Fully Redundant";
+ else if (b == 0x02) pstr = "Redundancy Lost";
+ else if (b == 0x0b) pstr = "AC Lost";
+ else pstr = "Redundancy Degraded";
+ return(pstr);
+}
+
+/*
+ * decode_sensor_hp
+ * inputs:
+ * sdr = the SDR buffer
+ * reading = the 3 or 4 bytes of data from GetSensorReading
+ * pstring = points to the output string buffer
+ * slen = size of the output buffer
+ * outputs:
+ * rv = 0 if this sensor was successfully interpreted here,
+ * non-zero otherwise, to use default interpretations.
+ * pstring = contains the sensor reading interpretation string (if rv==0)
+ */
+int decode_sensor_hp(uchar *sdr,uchar *reading,char *pstring, int slen)
+{
+ int rv = -1;
+ char *pstr = NULL;
+ uchar stype, evtype, b;
+ ushort v;
+
+ if (sdr == NULL || reading == NULL) return(rv);
+ if (pstring == NULL || slen == 0) return(rv);
+ /* sdr[3] is SDR type 1=full, 2=compact */
+ stype = sdr[12]; /*sensor type*/
+ evtype = sdr[13]; /*event type */
+ if (stype == 0xC0) { /* HP OEM Sensor, no sensor reading */
+ strncpy(pstring,"na",slen); /*oem*/
+ rv = 0;
+ } else {
+ if ((reading[2] & 0x40) == 0x40) { /*Init/Unavail state*/
+ strncpy(pstring,"Init",slen);
+ rv = 0;
+ } else if ((sdr[20] & 0xC0) == 0xC0) { /*unit1==discrete*/
+ b = reading[2] & 0x3f;
+ pstr = "DiscreteUnit";
+ if (evtype == 0x0b) pstr = redund_str(b);
+ snprintf(pstring,slen,"%02x%02x %s",reading[3],reading[2],pstr);
+ rv = 0;
+ } else if (evtype == 0x6f) { /*evtype==0x6f special*/
+ pstr = "DiscreteEvt";
+ if (stype == 0x08) { /*Power Supply presence*/
+ if (reading[2] & 0x01) pstr = "Present";
+ else pstr = "Absent";
+ }
+ snprintf(pstring,slen,"%02x%02x %s",reading[3],reading[2],pstr);
+ rv = 0;
+ } else if (evtype == 0x0B) { /*Redundancy*/
+ b = reading[2] & 0x3f;
+ pstr = "DiscretePS"; /*Power Supplies*/
+ if (evtype == 0x0b) pstr = redund_str(b);
+ snprintf(pstring,slen,"%02x%02x %s",reading[3],reading[2],pstr);
+ rv = 0;
+ } else if (evtype == 0x0A) { /*Discrete Fan*/
+ v = reading[2] + (reading[3] & 0x3f);
+ if (v & 0x001) pstr = "Transition to Running";
+ else if (v & 0x002) pstr = "Transition to In Test";
+ else if (v & 0x004) pstr = "Transition to Power Off";
+ else if (v & 0x008) pstr = "Transition to On Line";
+ else if (v & 0x010) pstr = "Transition to Off Line";
+ else if (v & 0x020) pstr = "Transition to Off Duty";
+ else if (v & 0x040) pstr = "Transition to Degraded";
+ else if (v & 0x080) pstr = "Transition to Power";
+ else if (v & 0x100) pstr = "Install Error";
+ else pstr = "Unknown";
+ snprintf(pstring,slen,"%02x%02x %s",reading[3],reading[2],pstr);
+ rv = 0;
+ } else if (evtype == 0x09) { /* stype==0x03 Power Meter */
+ b = reading[2] & 0x3f;
+ if (b & 0x01) pstr = "Disabled";
+ else if (b & 0x02) pstr = "Enabled";
+ else pstr = "Unknown";
+ snprintf(pstring,slen,"%02x%02x %s",reading[3],reading[2],pstr);
+ rv = 0;
+ }
+ }
+ return(rv);
+}
+
+void show_oemsdr_hp(uchar *sdr)
+{
+ int len, i;
+
+ len = sdr[4] + 5;
+ if (sdr[8] == 0x02) len = 18;
+ printf("HP: ");
+ for (i = 8; i < len; i++)
+ printf("%02x ",sdr[i]);
+ if (sdr[8] == 0x02) printf("%s",&sdr[18]);
+ printf("\n");
+ return;
+}
+
+/* end oem_hp.c */