/** @file
  IPMI SSIF Definitions

  Copyright (c) 2023, Ampere Computing LLC. All rights reserved.<BR>
  SPDX-License-Identifier: BSD-2-Clause-Patent

  @par Revision Reference:
    - IPMI Specification
      Version 2.0, Rev. 1.1

  https://www.intel.com/content/www/us/en/products/docs/servers/ipmi/ipmi-second-gen-interface-spec-v2-rev1-1.html
**/

#pragma once

///
/// Definitions for SMBUS Commands for SSIF
/// Table 12 - Summary of SMBUS Commands for SSIF
///

/// Write block
#define IPMI_SSIF_SMBUS_CMD_SINGLE_PART_WRITE        0x02
#define IPMI_SSIF_SMBUS_CMD_MULTI_PART_WRITE_START   0x06
#define IPMI_SSIF_SMBUS_CMD_MULTI_PART_WRITE_MIDDLE  0x07
#define IPMI_SSIF_SMBUS_CMD_MULTI_PART_WRITE_END     0x08

/// Read block
#define IPMI_SSIF_SMBUS_CMD_SINGLE_PART_READ        0x03
#define IPMI_SSIF_SMBUS_CMD_MULTI_PART_READ_START   0x03
#define IPMI_SSIF_SMBUS_CMD_MULTI_PART_READ_MIDDLE  0x09
#define IPMI_SSIF_SMBUS_CMD_MULTI_PART_READ_END     0x09
#define IPMI_SSIF_SMBUS_CMD_MULTI_PART_READ_RETRY   0x0A

///
/// Definitions for Multi-Part Read Transactions
/// Section 12.5
///
#define IPMI_SSIF_MULTI_PART_READ_START_SIZE      0x1E
#define IPMI_SSIF_MULTI_PART_READ_START_PATTERN1  0x00
#define IPMI_SSIF_MULTI_PART_READ_START_PATTERN2  0x01
#define IPMI_SSIF_MULTI_PART_READ_END_PATTERN     0xFF

///
/// IPMI SSIF maximum message size
///
#define IPMI_SSIF_INPUT_MESSAGE_SIZE_MAX   0xFF
#define IPMI_SSIF_OUTPUT_MESSAGE_SIZE_MAX  0xFF

///
/// IPMI SMBus system interface maximum packet size in byte
///
#define IPMI_SSIF_MAXIMUM_PACKET_SIZE_IN_BYTES  0x20

typedef enum {
  IpmiSsifPacketStart = 0,
  IpmiSsifPacketMiddle,
  IpmiSsifPacketEnd,
  IpmiSsifPacketSingle,
  IpmiSsifPacketMax
} IPMI_SSIF_PACKET_ATTRIBUTE;

#pragma pack (1)
///
/// IPMI SSIF Interface Request Format
/// Section 12.2 and 12.3
///
typedef struct {
  UINT8    NetFunc;
  UINT8    Command;
} IPMI_SSIF_REQUEST_HEADER;

///
/// IPMI SSIF Interface Response Format
/// Section 12.4 and 12.5
///
typedef struct {
  UINT8    StartPattern[2];
  UINT8    NetFunc;
  UINT8    Command;
} IPMI_SSIF_RESPONSE_PACKET_START;

typedef struct {
  UINT8    BlockNumber;
} IPMI_SSIF_RESPONSE_PACKET_MIDDLE;

typedef struct {
  UINT8    EndPattern;
} IPMI_SSIF_RESPONSE_PACKET_END;

typedef struct {
  UINT8    NetFunc;
  UINT8    Command;
} IPMI_SSIF_RESPONSE_SINGLE_PACKET;

#pragma pack ()
