add support for passing cmos clear bit to BIOS

This commit is contained in:
Duncan Laurie
2005-05-11 05:47:53 +00:00
parent d5d36e1941
commit 6cc2c67671
2 changed files with 27 additions and 23 deletions

View File

@ -51,7 +51,8 @@
#define IPMI_CHASSIS_POLICY_PREVIOUS 0x1 #define IPMI_CHASSIS_POLICY_PREVIOUS 0x1
#define IPMI_CHASSIS_POLICY_ALWAYS_OFF 0x0 #define IPMI_CHASSIS_POLICY_ALWAYS_OFF 0x0
int ipmi_chassis_main(struct ipmi_intf *, int, char **);
int ipmi_chassis_power_status(struct ipmi_intf * intf); int ipmi_chassis_power_status(struct ipmi_intf * intf);
int ipmi_chassis_power_control(struct ipmi_intf * intf, uint8_t ctl);
int ipmi_chassis_main(struct ipmi_intf * intf, int argc, char ** argv);
#endif /*IPMI_CHASSIS_H*/ #endif /*IPMI_CHASSIS_H*/

View File

@ -42,6 +42,7 @@
#include <ipmitool/ipmi.h> #include <ipmitool/ipmi.h>
#include <ipmitool/log.h> #include <ipmitool/log.h>
#include <ipmitool/ipmi_intf.h> #include <ipmitool/ipmi_intf.h>
#include <ipmitool/ipmi_strings.h>
#include <ipmitool/ipmi_chassis.h> #include <ipmitool/ipmi_chassis.h>
extern int verbose; extern int verbose;
@ -84,17 +85,7 @@ ipmi_chassis_print_power_status(struct ipmi_intf * intf)
return 0; return 0;
} }
static const struct valstr ipmi_chassis_power_control_vals[] = { int
{ 0x00, "Down/Off" },
{ 0x01, "Up/On" },
{ 0x02, "Cycle" },
{ 0x03, "Reset" },
{ 0x04, "Pulse" },
{ 0x05, "Soft" },
{ 0x00, NULL },
};
static int
ipmi_chassis_power_control(struct ipmi_intf * intf, uint8_t ctl) ipmi_chassis_power_control(struct ipmi_intf * intf, uint8_t ctl)
{ {
struct ipmi_rs * rsp; struct ipmi_rs * rsp;
@ -442,16 +433,11 @@ ipmi_chassis_get_bootparam(struct ipmi_intf * intf, char * arg)
} }
static int static int
ipmi_chassis_set_bootdev(struct ipmi_intf * intf, char * arg) ipmi_chassis_set_bootdev(struct ipmi_intf * intf, char * arg, int clearcmos)
{ {
uint8_t flags[5]; uint8_t flags[5];
int rc = 0; int rc = 0;
if (arg == NULL) {
lprintf(LOG_ERR, "No argument supplied");
return -1;
}
memset(flags, 0, 5); memset(flags, 0, 5);
flags[0] = 0x01; flags[0] = 0x01;
flags[1] = 0x01; flags[1] = 0x01;
@ -460,8 +446,12 @@ ipmi_chassis_set_bootdev(struct ipmi_intf * intf, char * arg)
return -1; return -1;
memset(flags, 0, 5); memset(flags, 0, 5);
if (strncmp(arg, "pxe", 3) == 0 || if (arg == NULL)
strncmp(arg, "force_pxe", 9) == 0) flags[1] = 0x00;
else if (strncmp(arg, "none", 4) == 0)
flags[1] = 0x00;
else if (strncmp(arg, "pxe", 3) == 0 ||
strncmp(arg, "force_pxe", 9) == 0)
flags[1] = 0x04; flags[1] = 0x04;
else if (strncmp(arg, "disk", 4) == 0 || else if (strncmp(arg, "disk", 4) == 0 ||
strncmp(arg, "force_disk", 10) == 0) strncmp(arg, "force_disk", 10) == 0)
@ -486,6 +476,9 @@ ipmi_chassis_set_bootdev(struct ipmi_intf * intf, char * arg)
return -1; return -1;
} }
if (clearcmos)
flags[1] |= 0x80;
/* set flag valid bit */ /* set flag valid bit */
flags[0] = 0x80; flags[0] = 0x80;
rc = ipmi_chassis_set_bootparam(intf, 5, flags, 5); rc = ipmi_chassis_set_bootparam(intf, 5, flags, 5);
@ -650,7 +643,7 @@ ipmi_chassis_main(struct ipmi_intf * intf, int argc, char ** argv)
lprintf(LOG_NOTICE, "bootparam set <option> [value ...]"); lprintf(LOG_NOTICE, "bootparam set <option> [value ...]");
} else { } else {
if (strncmp(argv[2], "bootflag", 8) == 0) if (strncmp(argv[2], "bootflag", 8) == 0)
rc = ipmi_chassis_set_bootdev(intf, argv[3]); rc = ipmi_chassis_set_bootdev(intf, argv[3], 0);
else else
lprintf(LOG_NOTICE, "bootparam set <option> [value ...]"); lprintf(LOG_NOTICE, "bootparam set <option> [value ...]");
} }
@ -661,7 +654,8 @@ ipmi_chassis_main(struct ipmi_intf * intf, int argc, char ** argv)
} }
else if (strncmp(argv[0], "bootdev", 7) == 0) { else if (strncmp(argv[0], "bootdev", 7) == 0) {
if ((argc < 2) || (strncmp(argv[1], "help", 4) == 0)) { if ((argc < 2) || (strncmp(argv[1], "help", 4) == 0)) {
lprintf(LOG_NOTICE, "bootdev <device>"); lprintf(LOG_NOTICE, "bootdev <device> [clear-cmos=yes|no]");
lprintf(LOG_NOTICE, " none : Do not change boot device order");
lprintf(LOG_NOTICE, " pxe : Force PXE boot"); lprintf(LOG_NOTICE, " pxe : Force PXE boot");
lprintf(LOG_NOTICE, " disk : Force boot from default Hard-drive"); lprintf(LOG_NOTICE, " disk : Force boot from default Hard-drive");
lprintf(LOG_NOTICE, " safe : Force boot from default Hard-drive, request Safe Mode"); lprintf(LOG_NOTICE, " safe : Force boot from default Hard-drive, request Safe Mode");
@ -669,7 +663,16 @@ ipmi_chassis_main(struct ipmi_intf * intf, int argc, char ** argv)
lprintf(LOG_NOTICE, " cdrom : Force boot from CD/DVD"); lprintf(LOG_NOTICE, " cdrom : Force boot from CD/DVD");
lprintf(LOG_NOTICE, " bios : Force boot into BIOS Setup"); lprintf(LOG_NOTICE, " bios : Force boot into BIOS Setup");
} else { } else {
rc = ipmi_chassis_set_bootdev(intf, argv[1]); if (argc < 3)
rc = ipmi_chassis_set_bootdev(intf, argv[1], 0);
else if (strncmp(argv[2], "clear-cmos=", 11) == 0) {
if (strncmp(argv[2]+11, "yes", 3) == 0)
rc = ipmi_chassis_set_bootdev(intf, argv[1], 1);
else
rc = ipmi_chassis_set_bootdev(intf, argv[1], 0);
}
else
rc = ipmi_chassis_set_bootdev(intf, argv[1], 0);
} }
} }
else { else {