From 67a9a9e866d0ff3c40dc2a4a5df32c6e39e9747f Mon Sep 17 00:00:00 2001 From: Michael Gernoth Date: Tue, 24 Aug 2010 00:46:50 +0200 Subject: [PATCH] implement all remaining IPMB queries seen on the wire --- bmc/config.h | 4 ++++ bmc/i2c.c | 1 + bmc/i2c.h | 2 -- bmc/ipmb.c | 65 ++++++++++++++++++++++++++++++++++++---------------- bmc/ipmb.h | 6 +++-- bmc/usart.c | 1 + bmc/usart.h | 2 -- 7 files changed, 55 insertions(+), 26 deletions(-) diff --git a/bmc/config.h b/bmc/config.h index 83a346c..b1e4e12 100644 --- a/bmc/config.h +++ b/bmc/config.h @@ -1,4 +1,8 @@ +#define BMC_ADDR 0x24 + #define POWERUP_TIME_MS 200 #define POWERDOWN_TIME_MS 5000 #define RESET_TIME_MS 200 #define POWER_CYCLE_PAUSE_MS 500 + +#define BAUD 38400UL diff --git a/bmc/i2c.c b/bmc/i2c.c index bd4d69c..07d2e79 100644 --- a/bmc/i2c.c +++ b/bmc/i2c.c @@ -3,6 +3,7 @@ #include #include "i2c.h" #include "bmc.h" +#include "config.h" #include "ipmb.h" #define TWCR_ACK TWCR = (1<rsSA; buf[4] = ((resp->rqSEQ)<<2) | (resp->rsLUN & 0x3); buf[5] = resp->cmd; - memcpy(buf+6, resp->data, resp->datalen); - len = resp->datalen + 7; + memcpy(buf+6, data, datalen); + len = datalen + 7; buf[len-1] = ipmb_csum(buf+3, len - 4); #ifdef DEBUG @@ -71,12 +71,10 @@ void ipmb_dump_req(struct ipmb_req *req) void ipmb_invalid(struct ipmb_resp *resp) { -#if 0 - static unsigned char cmd_invalid[] = {0xc2}; +#if 1 + static unsigned char cmd_invalid[] = {IPMB_CC_INVALID}; - resp->data = cmd_invalid; - resp->datalen = sizeof(cmd_invalid); - ipmb_send(resp); + ipmb_send(resp, cmd_invalid, sizeof(cmd_invalid)); #endif } @@ -89,6 +87,20 @@ void ipmb_cmd(struct ipmb_req *req) {IPMB_CC_NORMALLY, 0x42, 0x00, 0x00, 0x04, 0xff, 0xff, 0xfe, 0xfe}; static unsigned char cc_normal[] = {IPMB_CC_NORMALLY}; + static unsigned char sel_info[] = + {IPMB_CC_NORMALLY, 0x51, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00}; + static unsigned char sel_alloc_info[] = + {IPMB_CC_NORMALLY, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; + static unsigned char sel_entry[] = + {IPMB_CC_ERROR}; + static unsigned char sel_timestamp[] = + {IPMB_CC_NORMALLY, 0x00, 0x00, 0x00, 0x00}; + static unsigned char chassis_status[] = + {IPMB_CC_NORMALLY, 0x60, 0x10, 0x00, 0x00}; + static unsigned char reserve_sdr[] = + {IPMB_CC_NORMALLY, 0x00, 0x00}; + static unsigned char get_sdr[] = + {IPMB_CC_NORMALLY, 0xff, 0xff}; resp.rqSA = req->rqSA; resp.netFn = req->netFn+1; @@ -101,11 +113,12 @@ void ipmb_cmd(struct ipmb_req *req) switch (req->netFn) { case IPMB_NETFN_CHASSIS: switch (req->cmd) { + case IPMB_CHASSIS_GET_STATUS: + ipmb_send(&resp, chassis_status, sizeof(chassis_status)); + break; case IPMB_CHASSIS_CONTROL: chassis_control(*(req->data)); - resp.data = cc_normal; - resp.datalen = sizeof(cc_normal); - ipmb_send(&resp); + ipmb_send(&resp, cc_normal, sizeof(cc_normal)); break; default: #ifdef DEBUG @@ -139,9 +152,7 @@ void ipmb_cmd(struct ipmb_req *req) * data[5] - Event Data: 0x8f * data[6] - Event Data: 0x03 */ - resp.data = cc_normal; - resp.datalen = sizeof(cc_normal); - ipmb_send(&resp); + ipmb_send(&resp, cc_normal, sizeof(cc_normal)); break; @@ -158,15 +169,11 @@ void ipmb_cmd(struct ipmb_req *req) case IPMB_NETFN_APP: switch (req->cmd) { case IPMB_APP_GET_DEVICE_ID: - resp.data = get_devid; - resp.datalen = sizeof(get_devid); - ipmb_send(&resp); + ipmb_send(&resp, get_devid, sizeof(get_devid)); break; case IPMB_APP_GET_WATCHDOG_TIMER: - resp.data = get_wd_timer; - resp.datalen = sizeof(get_wd_timer); - ipmb_send(&resp); + ipmb_send(&resp, get_wd_timer, sizeof(get_wd_timer)); break; default: @@ -181,6 +188,24 @@ void ipmb_cmd(struct ipmb_req *req) case IPMB_NETFN_STORAGE: switch (req->cmd) { + case IPMB_STORAGE_RESERVE_SDR: + ipmb_send(&resp, reserve_sdr, sizeof(reserve_sdr)); + break; + case IPMB_STORAGE_GET_SDR: + ipmb_send(&resp, get_sdr, sizeof(get_sdr)); + break; + case IPMB_STORAGE_GET_SEL_INFO: + ipmb_send(&resp, sel_info, sizeof(sel_info)); + break; + case IPMB_STORAGE_GET_SEL_ALLOCATION: + ipmb_send(&resp, sel_alloc_info, sizeof(sel_alloc_info)); + break; + case IPMB_STORAGE_GET_SEL_ENTRY: + ipmb_send(&resp, sel_entry, sizeof(sel_entry)); + break; + case IPMB_STORAGE_GET_SEL_TIME: + ipmb_send(&resp, sel_timestamp, sizeof(sel_timestamp)); + break; default: #ifdef DEBUG printf("Unknown storage cmd 0x%02x\n", req->cmd); diff --git a/bmc/ipmb.h b/bmc/ipmb.h index 1be0a48..c02b38f 100644 --- a/bmc/ipmb.h +++ b/bmc/ipmb.h @@ -6,7 +6,11 @@ #define IPMB_SE_PLATFORM_EVENT 0x02 +#define IPMB_STORAGE_RESERVE_SDR 0x22 +#define IPMB_STORAGE_GET_SDR 0x23 #define IPMB_STORAGE_GET_SEL_INFO 0x40 +#define IPMB_STORAGE_GET_SEL_ALLOCATION 0x41 +#define IPMB_STORAGE_GET_SEL_ENTRY 0x43 #define IPMB_STORAGE_GET_SEL_TIME 0x48 #define IPMB_NETFN_CHASSIS 0x00 @@ -42,8 +46,6 @@ struct ipmb_resp { uint8_t rqSEQ; uint8_t rsLUN; uint8_t cmd; - unsigned char *data; - uint8_t datalen; }; void decode_ipmb_pkt(unsigned char *buf, int len); diff --git a/bmc/usart.c b/bmc/usart.c index f92edbd..605c794 100644 --- a/bmc/usart.c +++ b/bmc/usart.c @@ -1,6 +1,7 @@ #include #include +#include "config.h" #include "usart.h" #ifdef DEBUG diff --git a/bmc/usart.h b/bmc/usart.h index d0ce4a5..95ae6b7 100644 --- a/bmc/usart.h +++ b/bmc/usart.h @@ -1,3 +1 @@ -#define BAUD 9600UL - void usart_init(); -- 2.39.5