/** @file
  Service Processor Management Interface (SPMI) ACPI table definition from
  Intelligent Platform Management Interface Specification Second Generation.

  Copyright (c) 2018, Intel Corporation. All rights reserved.<BR>
  This program and the accompanying materials
  are licensed and made available under the terms and conditions of the BSD License
  which accompanies this distribution.  The full text of the license may be found at
  http://opensource.org/licenses/bsd-license.php

  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.

  @par Revision Reference:
    - Intelligent Platform Management Interface Specification Second Generation
      v2.0 Revision 1.1, Dated October 2013.
      https://www.intel.com/content/dam/www/public/us/en/documents/specification-updates/ipmi-intelligent-platform-mgt-interface-spec-2nd-gen-v2-0-spec-update.pdf
**/
#ifndef _SERVICE_PROCESSOR_MANAGEMENT_INTERFACE_TABLE_H_
#define _SERVICE_PROCESSOR_MANAGEMENT_INTERFACE_TABLE_H_

#include <IndustryStandard/Acpi.h>

#pragma pack(1)

///
/// Definition for the device identification information used by the Service
/// Processor Management Interface Description Table
///
typedef union {
  ///
  /// For PCI IPMI device
  ///
  struct {
    UINT8                                 SegmentGroup;
    UINT8                                 Bus;
    UINT8                                 Device;
    UINT8                                 Function;
  } Pci;
  ///
  /// For non-PCI IPMI device, the ACPI _UID value of the device
  ///
  UINT32                                  Uid;
} EFI_ACPI_SERVICE_PROCESSOR_MANAGEMENT_INTERFACE_TABLE_DEVICE_ID;


///
/// Definition for Service Processor Management Interface Description Table
///
typedef struct {
  EFI_ACPI_DESCRIPTION_HEADER               Header;
  ///
  /// Indicates the type of IPMI interface.
  ///
  UINT8                                     InterfaceType;
  ///
  /// This field must always be 01h to be compatible with any software that
  /// implements previous versions of this spec.
  ///
  UINT8                                     Reserved1;
  ///
  /// Identifies the IPMI specification revision, in BCD format.
  ///
  UINT16                                    SpecificationRevision;
  ///
  /// Interrupt type(s) used by the interface.
  ///
  UINT8                                     InterruptType;
  ///
  /// The bit assignment of the SCI interrupt within the GPEx_STS register of a
  /// GPE described if the FADT that the interface triggers.
  ///
  UINT8                                     Gpe;
  ///
  /// Reserved, must be 00h.
  ///
  UINT8                                     Reserved2;
  ///
  /// PCI Device Flag.
  ///
  UINT8                                     PciDeviceFlag;
  ///
  /// The I/O APIC or I/O SAPIC Global System Interrupt used by the interface.
  ///
  UINT32                                    GlobalSystemInterrupt;
  ///
  /// The base address of the interface register set described using the
  /// Generic Address Structure (GAS, See [ACPI 2.0] for the definition).
  ///
  EFI_ACPI_2_0_GENERIC_ADDRESS_STRUCTURE    BaseAddress;
  ///
  /// Device identification information.
  ///
  EFI_ACPI_SERVICE_PROCESSOR_MANAGEMENT_INTERFACE_TABLE_DEVICE_ID    DeviceId;
  ///
  /// This field must always be null (0x00) to be compatible with any software
  /// that implements previous versions of this spec.
  ///
  UINT8                                     Reserved3;
} EFI_ACPI_SERVICE_PROCESSOR_MANAGEMENT_INTERFACE_TABLE;

#pragma pack()

#endif
