/** @file
  I/O APIC Register Definitions from 82093AA I/O Advanced Programmable Interrupt
  Controller (IOAPIC), 1996.

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

**/

#ifndef __IO_APIC_H__
#define __IO_APIC_H__

///
/// I/O APIC Register Offsets
///
#define IOAPIC_INDEX_OFFSET  0x00
#define IOAPIC_DATA_OFFSET   0x10

///
/// I/O APIC Indirect Register Indexes
///
#define IO_APIC_IDENTIFICATION_REGISTER_INDEX  0x00
#define IO_APIC_VERSION_REGISTER_INDEX         0x01
#define IO_APIC_REDIRECTION_TABLE_ENTRY_INDEX  0x10

///
/// I/O APIC Interrupt Deliver Modes
///
#define IO_APIC_DELIVERY_MODE_FIXED            0
#define IO_APIC_DELIVERY_MODE_LOWEST_PRIORITY  1
#define IO_APIC_DELIVERY_MODE_SMI              2
#define IO_APIC_DELIVERY_MODE_NMI              4
#define IO_APIC_DELIVERY_MODE_INIT             5
#define IO_APIC_DELIVERY_MODE_EXTINT           7

#pragma pack(1)

typedef union {
  struct {
    UINT32    Reserved0      : 24;
    UINT32    Identification : 4;
    UINT32    Reserved1      : 4;
  } Bits;
  UINT32    Uint32;
} IO_APIC_IDENTIFICATION_REGISTER;

typedef union {
  struct {
    UINT32    Version                 : 8;
    UINT32    Reserved0               : 8;
    UINT32    MaximumRedirectionEntry : 8;
    UINT32    Reserved1               : 8;
  } Bits;
  UINT32    Uint32;
} IO_APIC_VERSION_REGISTER;

typedef union {
  struct {
    UINT32    Vector          :          8;
    UINT32    DeliveryMode    :    3;
    UINT32    DestinationMode : 1;
    UINT32    DeliveryStatus  :  1;
    UINT32    Polarity        :        1;
    UINT32    RemoteIRR       :       1;
    UINT32    TriggerMode     :     1;
    UINT32    Mask            :            1;
    UINT32    Reserved0       :       15;
    UINT32    Reserved1       :       24;
    UINT32    DestinationID   :   8;
  } Bits;
  struct {
    UINT32    Low;
    UINT32    High;
  } Uint32;
  UINT64    Uint64;
} IO_APIC_REDIRECTION_TABLE_ENTRY;

#pragma pack()

#endif
