From b9a0c5a0913ad37d8fbe49bf5da3222db8dddf7c Mon Sep 17 00:00:00 2001 From: Zdenek Styblik Date: Mon, 28 Oct 2013 05:21:46 +0000 Subject: [PATCH] ID: 46 - ipmi_fwum needs some re-work Commit changes to 'include/ipmitool/ipmi_fwum.h'. --- ipmitool/include/ipmitool/ipmi_fwum.h | 203 +++++++++++++++++++++++++- 1 file changed, 202 insertions(+), 1 deletion(-) diff --git a/ipmitool/include/ipmitool/ipmi_fwum.h b/ipmitool/include/ipmitool/ipmi_fwum.h index 712428f..c19a582 100644 --- a/ipmitool/include/ipmitool/ipmi_fwum.h +++ b/ipmitool/include/ipmitool/ipmi_fwum.h @@ -31,12 +31,213 @@ */ #ifndef IPMI_KFWUM_H -#define IPMI_KFWUM_H +# define IPMI_KFWUM_H #include #include +/* KFWUM Version */ +# define VER_MAJOR 1 +# define VER_MINOR 3 +/* Minimum size (IPMB/IOL/old protocol) */ +# define KFWUM_SMALL_BUFFER 32 +/* Maximum size on KCS interface */ +# define KFWUM_BIG_BUFFER 32 +# define MAX_BUFFER_SIZE 1024*16 + +/* 3 address + 1 size + 1 checksum + 1 command */ +# define KFWUM_OLD_CMD_OVERHEAD 6 +/* 1 sequence + 1 size + 1 checksum + 1 command */ +# define KFWUM_NEW_CMD_OVERHEAD 4 +# define KFWUM_PAGE_SIZE 256 + +# define FWUM_SAVE_FIRMWARE_NO_RESPONSE_LIMIT 6 +# define FWUM_MAX_UPLOAD_RETRY 6 + +# define TRACE_LOG_CHUNK_COUNT 7 +# define TRACE_LOG_CHUNK_SIZE 7 +# define TRACE_LOG_ATT_COUNT 3 + +# define IN_FIRMWARE_INFO_OFFSET_LOCATION 0x5a0 +# define IN_FIRMWARE_INFO_SIZE 20 +# define IN_FIRMWARE_INFO_OFFSET_FILE_SIZE 0 +# define IN_FIRMWARE_INFO_OFFSET_CHECKSUM 4 +# define IN_FIRMWARE_INFO_OFFSET_BOARD_ID 6 +# define IN_FIRMWARE_INFO_OFFSET_DEVICE_ID 8 +# define IN_FIRMWARE_INFO_OFFSET_TABLE_VERSION 9 +# define IN_FIRMWARE_INFO_OFFSET_IMPLEMENT_REV 10 +# define IN_FIRMWARE_INFO_OFFSET_VER_MAJOROR 11 +# define IN_FIRMWARE_INFO_OFFSET_VER_MINORSUB 12 +# define IN_FIRMWARE_INFO_OFFSET_SDR_REV 13 +# define IN_FIRMWARE_INFO_OFFSET_IANA0 14 +# define IN_FIRMWARE_INFO_OFFSET_IANA1 15 +# define IN_FIRMWARE_INFO_OFFSET_IANA2 16 + +# define KWUM_GET_BYTE_AT_OFFSET(pBuffer,os) pBuffer[os] int ipmi_fwum_main(struct ipmi_intf *, int, char **); +typedef enum eKFWUM_BoardList +{ + KFWUM_BOARD_KONTRON_UNKNOWN = 0, + KFWUM_BOARD_KONTRON_5002 = 5002, +} tKFWUM_BoardList; + +typedef struct sKFWUM_BoardInfo +{ + tKFWUM_BoardList boardId; + IPMI_OEM iana; +} tKFWUM_BoardInfo; + +typedef enum eKFWUM_DownloadType +{ + KFWUM_DOWNLOAD_TYPE_ADDRESS = 0, + KFWUM_DOWNLOAD_TYPE_SEQUENCE, +} tKFWUM_DownloadType; + +typedef enum eKFWUM_DownloadBuffferType +{ + KFWUM_SMALL_BUFFER_TYPE = 0, + KFUMW_BIG_BUFFER_TYPE +} tKFWUM_DownloadBuffferType; + +typedef struct sKFWUM_InFirmwareInfo +{ + unsigned long fileSize; + unsigned short checksum; + unsigned short sumToRemoveFromChecksum; + /* Since the checksum is added in the bin + * after the checksum is calculated, we + * need to remove the each byte value. This + * byte will contain the addition of both bytes + */ + tKFWUM_BoardList boardId; + unsigned char deviceId; + unsigned char tableVers; + unsigned char implRev; + unsigned char versMajor; + unsigned char versMinor; + unsigned char versSubMinor; + unsigned char sdrRev; + IPMI_OEM iana; +} tKFWUM_InFirmwareInfo; + +typedef struct sKFWUM_SaveFirmwareInfo +{ + tKFWUM_DownloadType downloadType; + unsigned char bufferSize; + unsigned char overheadSize; +} tKFWUM_SaveFirmwareInfo; + +/* COMMANDS */ +# ifdef HAVE_PRAGMA_PACK +# pragma pack(1) +# endif +struct KfwumGetInfoResp { + unsigned char protocolRevision; + unsigned char controllerDeviceId; + struct { + unsigned char mode:1; + unsigned char seqAdd:1; + unsigned char res : 6; + } byte; + unsigned char firmRev1; + unsigned char firmRev2; + unsigned char numBank; +} ATTRIBUTE_PACKING; +# ifdef HAVE_PRAGMA_PACK +# pragma pack(0) +# endif + +# ifdef HAVE_PRAGMA_PACK +# pragma pack(1) +# endif +struct KfwumGetStatusResp { + unsigned char bankState; + unsigned char firmLengthLSB; + unsigned char firmLengthMid; + unsigned char firmLengthMSB; + unsigned char firmRev1; + unsigned char firmRev2; + unsigned char firmRev3; +} ATTRIBUTE_PACKING; +# ifdef HAVE_PRAGMA_PACK +# pragma pack(0) +# endif + +# ifdef HAVE_PRAGMA_PACK +# pragma pack(1) +# endif +struct KfwumManualRollbackReq { + unsigned char type; +} ATTRIBUTE_PACKING; +# ifdef HAVE_PRAGMA_PACK +# pragma pack(0) +# endif + +# ifdef HAVE_PRAGMA_PACK +# pragma pack(1) +# endif +struct KfwumStartFirmwareDownloadReq { + unsigned char lengthLSB; + unsigned char lengthMid; + unsigned char lengthMSB; + unsigned char paddingLSB; + unsigned char paddingMSB; + unsigned char useSequence; +} ATTRIBUTE_PACKING; +# ifdef HAVE_PRAGMA_PACK +# pragma pack(0) +# endif + +# ifdef HAVE_PRAGMA_PACK +# pragma pack(1) +# endif +struct KfwumStartFirmwareDownloadResp { + unsigned char bank; +} ATTRIBUTE_PACKING; +# ifdef HAVE_PRAGMA_PACK +# pragma pack(0) +# endif + +# ifdef HAVE_PRAGMA_PACK +# pragma pack(1) +# endif +struct KfwumSaveFirmwareAddressReq +{ + unsigned char addressLSB; + unsigned char addressMid; + unsigned char addressMSB; + unsigned char numBytes; + unsigned char txBuf[KFWUM_SMALL_BUFFER-KFWUM_OLD_CMD_OVERHEAD]; +} ATTRIBUTE_PACKING; +# ifdef HAVE_PRAGMA_PACK +# pragma pack(0) +# endif + +# ifdef HAVE_PRAGMA_PACK +# pragma pack(1) +# endif +struct KfwumSaveFirmwareSequenceReq +{ + unsigned char sequenceNumber; + unsigned char txBuf[KFWUM_BIG_BUFFER]; +} ATTRIBUTE_PACKING; +# ifdef HAVE_PRAGMA_PACK +# pragma pack(0) +# endif + +# ifdef HAVE_PRAGMA_PACK +# pragma pack(1) +# endif +struct KfwumFinishFirmwareDownloadReq { + unsigned char versionMaj; + unsigned char versionMinSub; + unsigned char versionSdr; + unsigned char reserved; +} ATTRIBUTE_PACKING; +# ifdef HAVE_PRAGMA_PACK +# pragma pack(0) +# endif + #endif /* IPMI_KFWUM_H */