/** @file
  MADT Table

  This file contains a structure definition for the ACPI 1.0 Multiple APIC
  Description Table (MADT).

  Copyright (c) 2008 - 2012, 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.

**/

#include <IndustryStandard/Acpi.h>
#include <Platform.h>

//
// Local APIC address
//
#define EFI_ACPI_LOCAL_APIC_ADDRESS 0xFEE00000 // TBD

//
// Multiple APIC Flags are defined in AcpiX.0.h
//
#define EFI_ACPI_1_0_MULTIPLE_APIC_FLAGS (EFI_ACPI_1_0_PCAT_COMPAT)

//
// Define the number of each table type.
// This is where the table layout is modified.
//
#define EFI_ACPI_PROCESSOR_LOCAL_APIC_COUNT           1
#define EFI_ACPI_INTERRUPT_SOURCE_OVERRIDE_COUNT      2
#define EFI_ACPI_IO_APIC_COUNT                        1

//
// Ensure proper structure formats
//
#pragma pack (1)

//
// ACPI 1.0 MADT structure
//
typedef struct {
  EFI_ACPI_1_0_MULTIPLE_APIC_DESCRIPTION_TABLE_HEADER   Header;

#if EFI_ACPI_PROCESSOR_LOCAL_APIC_COUNT > 0
  EFI_ACPI_1_0_PROCESSOR_LOCAL_APIC_STRUCTURE           LocalApic[EFI_ACPI_PROCESSOR_LOCAL_APIC_COUNT];
#endif

#if EFI_ACPI_INTERRUPT_SOURCE_OVERRIDE_COUNT > 0
  EFI_ACPI_1_0_INTERRUPT_SOURCE_OVERRIDE_STRUCTURE      Iso[EFI_ACPI_INTERRUPT_SOURCE_OVERRIDE_COUNT];
#endif

#if EFI_ACPI_IO_APIC_COUNT > 0
  EFI_ACPI_1_0_IO_APIC_STRUCTURE                        IoApic[EFI_ACPI_IO_APIC_COUNT];
#endif

} EFI_ACPI_1_0_MULTIPLE_APIC_DESCRIPTION_TABLE;

#pragma pack ()

//
// Multiple APIC Description Table
//
EFI_ACPI_1_0_MULTIPLE_APIC_DESCRIPTION_TABLE Madt = {
  {
    {
      EFI_ACPI_1_0_APIC_SIGNATURE,
      sizeof (EFI_ACPI_1_0_MULTIPLE_APIC_DESCRIPTION_TABLE),
      EFI_ACPI_1_0_MULTIPLE_APIC_DESCRIPTION_TABLE_REVISION,
      0x00,                                                     // Checksum will be updated at runtime
      {EFI_ACPI_OEM_ID},
      EFI_ACPI_OEM_TABLE_ID,
      EFI_ACPI_OEM_REVISION,
      EFI_ACPI_CREATOR_ID,
      EFI_ACPI_CREATOR_REVISION
    },

    //
    // MADT specific fields
    //
    EFI_ACPI_LOCAL_APIC_ADDRESS,
    EFI_ACPI_1_0_MULTIPLE_APIC_FLAGS,
  },

  //
  // Processor Local APIC Structure
  //
  {
    {
      EFI_ACPI_1_0_PROCESSOR_LOCAL_APIC,                        // Type
      sizeof (EFI_ACPI_1_0_PROCESSOR_LOCAL_APIC_STRUCTURE),     // Length
      0x00,                                                     // Processor ID
      0x00,                                                     // Local APIC ID
      0x00000001                                                // Flags - Enabled by default
    }
  },

  //
  // Interrupt Source Override Structure
  //

  {
    {
      //
      // IRQ0=>IRQ2 Interrupt Source Override Structure
      //
      EFI_ACPI_1_0_INTERRUPT_SOURCE_OVERRIDE,                   // Type
      sizeof (EFI_ACPI_1_0_INTERRUPT_SOURCE_OVERRIDE_STRUCTURE),// Length
      0x00,                                                     // Bus - ISA
      0x00,                                                     // Source - IRQ0
      0x00000002,                                               // Global System Interrupt - IRQ2
      0x0000                                                    // Flags - Conforms to specifications of the bus
    },

    {
      //
      // ISO (SCI Active High) Interrupt Source Override Structure
      //
      EFI_ACPI_1_0_INTERRUPT_SOURCE_OVERRIDE,                   // Type
      sizeof (EFI_ACPI_1_0_INTERRUPT_SOURCE_OVERRIDE_STRUCTURE),// Length
      0x00,                                                     // Bus - ISA
      0x09,                                                     // Source - IRQ0
      0x00000009,                                               // Global System Interrupt - IRQ2
      0x000D                                                    // Flags - Level-tiggered, Active High
    }
  },

  //
  // IO APIC Structure
  //
  {
    {
      EFI_ACPI_1_0_IO_APIC,                                     // Type
      sizeof (EFI_ACPI_1_0_IO_APIC_STRUCTURE),                  // Length
      0x02,                                                     // IO APIC ID
      EFI_ACPI_RESERVED_BYTE,                                   // Reserved
      0xFEC00000,                                               // IO APIC Address (physical)
      0x00000000                                                // Global System Interrupt Base
    }
  },
};


VOID*
ReferenceAcpiTable (
  VOID
  )
{
  //
  // Reference the table being generated to prevent the optimizer from removing the
  // data structure from the exeutable
  //
  return (VOID*)&Madt;
}
