# Copyright (c) 2008 The Hewlett-Packard Development Company
# All rights reserved.
#
# The license below extends only to copyright in the software and shall
# not be construed as granting a license to any other intellectual
# property including but not limited to intellectual property relating
# to a hardware implementation of the functionality of the software
# licensed hereunder.  You may use the software subject to the license
# terms below provided that you ensure that this notice is replicated
# unmodified and in its entirety in all distributions of the software,
# modified or unmodified, in source code or in binary form.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions are
# met: redistributions of source code must retain the above copyright
# notice, this list of conditions and the following disclaimer;
# redistributions in binary form must reproduce the above copyright
# notice, this list of conditions and the following disclaimer in the
# documentation and/or other materials provided with the distribution;
# neither the name of the copyright holders nor the names of its
# contributors may be used to endorse or promote products derived from
# this software without specific prior written permission.
#
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

from m5.params import *
from m5.SimObject import SimObject

# ACPI description table header. Subclasses contain and handle the actual
# contents as appropriate for that type of table.
class X86ACPISysDescTable(SimObject):
    type = 'X86ACPISysDescTable'
    cxx_class = 'gem5::X86ISA::ACPI::SysDescTable'
    cxx_header = 'arch/x86/bios/acpi.hh'
    abstract = True

    oem_id = Param.String('', 'string identifying the oem')
    oem_table_id = Param.String('', 'oem table ID')
    oem_revision = Param.UInt32(0, 'oem revision number for the table')

    creator_id = Param.UInt32(0,
            'ID identifying the generator of the table')
    creator_revision = Param.UInt32(0,
            'revision number for the creator of the table')

class X86ACPIRSDT(X86ACPISysDescTable):
    type = 'X86ACPIRSDT'
    cxx_class = 'gem5::X86ISA::ACPI::RSDT'
    cxx_header = 'arch/x86/bios/acpi.hh'

    entries = VectorParam.X86ACPISysDescTable([], 'system description tables')

class X86ACPIXSDT(X86ACPISysDescTable):
    type = 'X86ACPIXSDT'
    cxx_class = 'gem5::X86ISA::ACPI::XSDT'
    cxx_header = 'arch/x86/bios/acpi.hh'

    entries = VectorParam.X86ACPISysDescTable([], 'system description tables')


class X86ACPIMadtRecord(SimObject):
    type = 'X86ACPIMadtRecord'
    cxx_class = 'gem5::X86ISA::ACPI::MADT::Record'
    cxx_header = 'arch/x86/bios/acpi.hh'
    abstract = True

class X86ACPIMadt(X86ACPISysDescTable):
    type = 'X86ACPIMadt'
    cxx_class = 'gem5::X86ISA::ACPI::MADT::MADT'
    cxx_header = 'arch/x86/bios/acpi.hh'

    local_apic_address = Param.UInt32(0, 'Address of the local apic')
    flags = Param.UInt32(0, 'Flags')
    records = VectorParam.X86ACPIMadtRecord([], 'Records in this MADT')

class X86ACPIMadtLAPIC(X86ACPIMadtRecord):
    type = 'X86ACPIMadtLAPIC'
    cxx_header = 'arch/x86/bios/acpi.hh'
    cxx_class = 'gem5::X86ISA::ACPI::MADT::LAPIC'

    acpi_processor_id = Param.UInt8(0, 'ACPI Processor ID')
    apic_id = Param.UInt8(0, 'APIC ID')
    flags = Param.UInt32(0, 'Flags')

class X86ACPIMadtIOAPIC(X86ACPIMadtRecord):
    type = 'X86ACPIMadtIOAPIC'
    cxx_header = 'arch/x86/bios/acpi.hh'
    cxx_class = 'gem5::X86ISA::ACPI::MADT::IOAPIC'

    id = Param.UInt8(0, 'I/O APIC ID')
    address = Param.Addr(0, 'I/O APIC Address')
    int_base = Param.UInt32(0, 'Global Interrupt Base')

class X86ACPIMadtIntSourceOverride(X86ACPIMadtRecord):
    type = 'X86ACPIMadtIntSourceOverride'
    cxx_header = 'arch/x86/bios/acpi.hh'
    cxx_class = 'gem5::X86ISA::ACPI::MADT::IntSourceOverride'

    bus_source = Param.UInt8(0, 'Bus Source')
    irq_source = Param.UInt8(0, 'IRQ Source')
    sys_int = Param.UInt32(0, 'Global System Interrupt')
    flags = Param.UInt16(0, 'Flags')

class X86ACPIMadtNMI(X86ACPIMadtRecord):
    type = 'X86ACPIMadtNMI'
    cxx_header = 'arch/x86/bios/acpi.hh'
    cxx_class = 'gem5::X86ISA::ACPI::MADT::NMI'

    acpi_processor_id = Param.UInt8(0, 'ACPI Processor ID')
    flags = Param.UInt16(0, 'Flags')
    lint_no = Param.UInt8(0, 'LINT# (0 or 1)')

class X86ACPIMadtLAPICOverride(X86ACPIMadtRecord):
    type = 'X86ACPIMadtLAPICOverride'
    cxx_header = 'arch/x86/bios/acpi.hh'
    cxx_class = 'gem5::X86ISA::ACPI::MADT::LAPICOverride'

    address = Param.Addr(0, '64-bit Physical Address of Local APIC')

# Root System Description Pointer Structure
class X86ACPIRSDP(SimObject):
    type = 'X86ACPIRSDP'
    cxx_class = 'gem5::X86ISA::ACPI::RSDP'
    cxx_header = 'arch/x86/bios/acpi.hh'

    oem_id = Param.String('', 'string identifying the oem')
    # Because 0 encodes ACPI 1.0, 2 encodes ACPI 3.0, the version implemented
    # here.
    revision = Param.UInt8(2, 'revision of ACPI being used, zero indexed')

    rsdt = Param.X86ACPIRSDT(X86ACPIRSDT(),
            'root system description table')
    xsdt = Param.X86ACPIXSDT(X86ACPIXSDT(),
            'extended system description table')
