/** @file
  ACPI Alert Standard Format Description Table ASF! as described in the ASF2.0 Specification

  Copyright (c) 2006 - 2018, Intel Corporation. All rights reserved.<BR>
  SPDX-License-Identifier: BSD-2-Clause-Patent
**/

#ifndef _ALERT_STANDARD_FORMAT_TABLE_H_
#define _ALERT_STANDARD_FORMAT_TABLE_H_

#include <IndustryStandard/Acpi.h>

//
// Ensure proper structure formats
//
#pragma pack (1)

///
/// Information Record header that appears at the beginning of each record
///
typedef struct {
  UINT8     Type;
  UINT8     Reserved;
  UINT16    RecordLength;
} EFI_ACPI_ASF_RECORD_HEADER;

///
/// This structure contains information that identifies the system's type
/// and configuration
///
typedef struct {
  EFI_ACPI_ASF_RECORD_HEADER    RecordHeader;
  UINT8                         MinWatchDogResetValue;
  UINT8                         MinPollingInterval;
  UINT16                        SystemID;
  UINT32                        IANAManufactureID;
  UINT8                         FeatureFlags;
  UINT8                         Reserved[3];
} EFI_ACPI_ASF_INFO;

///
/// ASF Alert Data
///
typedef struct {
  UINT8    DeviceAddress;
  UINT8    Command;
  UINT8    DataMask;
  UINT8    CompareValue;
  UINT8    EventSenseType;
  UINT8    EventType;
  UINT8    EventOffset;
  UINT8    EventSourceType;
  UINT8    EventSeverity;
  UINT8    SensorNumber;
  UINT8    Entity;
  UINT8    EntityInstance;
} EFI_ACPI_ASF_ALERTDATA;

///
/// Alert sensors definition
///
typedef struct {
  EFI_ACPI_ASF_RECORD_HEADER    RecordHeader;
  UINT8                         AssertionEventBitMask;
  UINT8                         DeassertionEventBitMask;
  UINT8                         NumberOfAlerts;
  UINT8                         ArrayElementLength;        ///< For ASF version 1.0 and later, this filed is set to 0x0C
  ///
  /// EFI_ACPI_ASF_ALERTDATA           DeviceArray[ANYSIZE_ARRAY];
  ///
} EFI_ACPI_ASF_ALRT;

///
/// Alert Control Data
///
typedef struct {
  UINT8    Function;
  UINT8    DeviceAddress;
  UINT8    Command;
  UINT8    DataValue;
} EFI_ACPI_ASF_CONTROLDATA;

///
/// Alert Remote Control System Actions
///
typedef struct {
  EFI_ACPI_ASF_RECORD_HEADER    RecordHeader;
  UINT8                         NumberOfControls;
  UINT8                         ArrayElementLength;        ///< For ASF version 1.0 and later, this filed is set to 0x4
  UINT16                        RctlReserved;
  ///
  /// EFI_ACPI_ASF_CONTROLDATA;        DeviceArray[ANYSIZE_ARRAY];
  ///
} EFI_ACPI_ASF_RCTL;

///
/// Remote Control Capabilities
///
typedef struct {
  EFI_ACPI_ASF_RECORD_HEADER    RecordHeader;
  UINT8                         RemoteControlCapabilities[7];
  UINT8                         RMCPCompletionCode;
  UINT32                        RMCPIANA;
  UINT8                         RMCPSpecialCommand;
  UINT8                         RMCPSpecialCommandParameter[2];
  UINT8                         RMCPBootOptions[2];
  UINT8                         RMCPOEMParameters[2];
} EFI_ACPI_ASF_RMCP;

///
/// SMBus Devices with fixed addresses
///
typedef struct {
  EFI_ACPI_ASF_RECORD_HEADER    RecordHeader;
  UINT8                         SEEPROMAddress;
  UINT8                         NumberOfDevices;
  ///
  /// UINT8                            FixedSmbusAddresses[ANYSIZE_ARRAY];
  ///
} EFI_ACPI_ASF_ADDR;

///
/// ASF! Description Table Header
///
typedef EFI_ACPI_DESCRIPTION_HEADER EFI_ACPI_ASF_DESCRIPTION_HEADER;

///
/// The revision stored in ASF! DESCRIPTION TABLE as BCD value
///
#define EFI_ACPI_2_0_ASF_DESCRIPTION_TABLE_REVISION  0x20

///
/// "ASF!" ASF Description Table Signature
///
#define EFI_ACPI_ASF_DESCRIPTION_TABLE_SIGNATURE  SIGNATURE_32 ('A', 'S', 'F', '!')

#pragma pack ()

#endif // _ALERT_STANDARD_FORMAT_TABLE_H
