15625Sgblack@eecs.umich.edu/*
25625Sgblack@eecs.umich.edu * Copyright (c) 2008 The Hewlett-Packard Development Company
35625Sgblack@eecs.umich.edu * All rights reserved.
45625Sgblack@eecs.umich.edu *
57087Snate@binkert.org * The license below extends only to copyright in the software and shall
67087Snate@binkert.org * not be construed as granting a license to any other intellectual
77087Snate@binkert.org * property including but not limited to intellectual property relating
87087Snate@binkert.org * to a hardware implementation of the functionality of the software
97087Snate@binkert.org * licensed hereunder.  You may use the software subject to the license
107087Snate@binkert.org * terms below provided that you ensure that this notice is replicated
117087Snate@binkert.org * unmodified and in its entirety in all distributions of the software,
127087Snate@binkert.org * modified or unmodified, in source code or in binary form.
135625Sgblack@eecs.umich.edu *
147087Snate@binkert.org * Redistribution and use in source and binary forms, with or without
157087Snate@binkert.org * modification, are permitted provided that the following conditions are
167087Snate@binkert.org * met: redistributions of source code must retain the above copyright
177087Snate@binkert.org * notice, this list of conditions and the following disclaimer;
187087Snate@binkert.org * redistributions in binary form must reproduce the above copyright
197087Snate@binkert.org * notice, this list of conditions and the following disclaimer in the
207087Snate@binkert.org * documentation and/or other materials provided with the distribution;
217087Snate@binkert.org * neither the name of the copyright holders nor the names of its
225625Sgblack@eecs.umich.edu * contributors may be used to endorse or promote products derived from
237087Snate@binkert.org * this software without specific prior written permission.
245625Sgblack@eecs.umich.edu *
255625Sgblack@eecs.umich.edu * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
265625Sgblack@eecs.umich.edu * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
275625Sgblack@eecs.umich.edu * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
285625Sgblack@eecs.umich.edu * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
295625Sgblack@eecs.umich.edu * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
305625Sgblack@eecs.umich.edu * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
315625Sgblack@eecs.umich.edu * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
325625Sgblack@eecs.umich.edu * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
335625Sgblack@eecs.umich.edu * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
345625Sgblack@eecs.umich.edu * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
355625Sgblack@eecs.umich.edu * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
365625Sgblack@eecs.umich.edu *
375625Sgblack@eecs.umich.edu * Authors: Gabe Black
385625Sgblack@eecs.umich.edu */
395625Sgblack@eecs.umich.edu
405625Sgblack@eecs.umich.edu#ifndef __ARCH_X86_BIOS_INTELMP_HH__
415625Sgblack@eecs.umich.edu#define __ARCH_X86_BIOS_INTELMP_HH__
425625Sgblack@eecs.umich.edu
435625Sgblack@eecs.umich.edu#include <string>
445625Sgblack@eecs.umich.edu#include <vector>
455625Sgblack@eecs.umich.edu
465625Sgblack@eecs.umich.edu#include "base/bitfield.hh"
475625Sgblack@eecs.umich.edu#include "enums/X86IntelMPAddressType.hh"
485625Sgblack@eecs.umich.edu#include "enums/X86IntelMPInterruptType.hh"
495625Sgblack@eecs.umich.edu#include "enums/X86IntelMPPolarity.hh"
505625Sgblack@eecs.umich.edu#include "enums/X86IntelMPRangeList.hh"
515625Sgblack@eecs.umich.edu#include "enums/X86IntelMPTriggerMode.hh"
528229Snate@binkert.org#include "sim/sim_object.hh"
535625Sgblack@eecs.umich.edu
548706Sandreas.hansson@arm.comclass PortProxy;
555625Sgblack@eecs.umich.edu
565625Sgblack@eecs.umich.edu// Config entry types
578737Skoansin.tan@gmail.comstruct X86IntelMPBaseConfigEntryParams;
588737Skoansin.tan@gmail.comstruct X86IntelMPExtConfigEntryParams;
595625Sgblack@eecs.umich.edu
605625Sgblack@eecs.umich.edu// General table structures
618737Skoansin.tan@gmail.comstruct X86IntelMPConfigTableParams;
628737Skoansin.tan@gmail.comstruct X86IntelMPFloatingPointerParams;
635625Sgblack@eecs.umich.edu
645625Sgblack@eecs.umich.edu// Base entry types
658737Skoansin.tan@gmail.comstruct X86IntelMPBusParams;
668737Skoansin.tan@gmail.comstruct X86IntelMPIOAPICParams;
678737Skoansin.tan@gmail.comstruct X86IntelMPIOIntAssignmentParams;
688737Skoansin.tan@gmail.comstruct X86IntelMPLocalIntAssignmentParams;
698737Skoansin.tan@gmail.comstruct X86IntelMPProcessorParams;
705625Sgblack@eecs.umich.edu
715625Sgblack@eecs.umich.edu// Extended entry types
728737Skoansin.tan@gmail.comstruct X86IntelMPAddrSpaceMappingParams;
738737Skoansin.tan@gmail.comstruct X86IntelMPBusHierarchyParams;
748737Skoansin.tan@gmail.comstruct X86IntelMPCompatAddrSpaceModParams;
755625Sgblack@eecs.umich.edu
769554Sandreas.hansson@arm.comtemplate<class T>
779554Sandreas.hansson@arm.comuint8_t writeOutField(PortProxy& proxy, Addr addr, T val);
789554Sandreas.hansson@arm.com
799554Sandreas.hansson@arm.comuint8_t writeOutString(PortProxy& proxy, Addr addr, std::string str,
809554Sandreas.hansson@arm.com                       int length);
819554Sandreas.hansson@arm.com
825625Sgblack@eecs.umich.edunamespace X86ISA
835625Sgblack@eecs.umich.edu{
845625Sgblack@eecs.umich.edu
855625Sgblack@eecs.umich.edunamespace IntelMP
865625Sgblack@eecs.umich.edu{
875625Sgblack@eecs.umich.edu
885625Sgblack@eecs.umich.educlass FloatingPointer : public SimObject
895625Sgblack@eecs.umich.edu{
905625Sgblack@eecs.umich.edu  protected:
915625Sgblack@eecs.umich.edu    typedef X86IntelMPFloatingPointerParams Params;
925625Sgblack@eecs.umich.edu
935625Sgblack@eecs.umich.edu    uint32_t tableAddr;
945625Sgblack@eecs.umich.edu    uint8_t specRev;
955625Sgblack@eecs.umich.edu    uint8_t defaultConfig;
965625Sgblack@eecs.umich.edu    bool imcrPresent;
975625Sgblack@eecs.umich.edu
985625Sgblack@eecs.umich.edu    static const char signature[];
995625Sgblack@eecs.umich.edu
1005625Sgblack@eecs.umich.edu  public:
1015625Sgblack@eecs.umich.edu
1028852Sandreas.hansson@arm.com    Addr writeOut(PortProxy& proxy, Addr addr);
1035625Sgblack@eecs.umich.edu
1045625Sgblack@eecs.umich.edu    Addr getTableAddr()
1055625Sgblack@eecs.umich.edu    {
1065625Sgblack@eecs.umich.edu        return tableAddr;
1075625Sgblack@eecs.umich.edu    }
1085625Sgblack@eecs.umich.edu
1095625Sgblack@eecs.umich.edu    void setTableAddr(Addr addr)
1105625Sgblack@eecs.umich.edu    {
1115625Sgblack@eecs.umich.edu        tableAddr = addr;
1125625Sgblack@eecs.umich.edu    }
1135625Sgblack@eecs.umich.edu
1145625Sgblack@eecs.umich.edu    FloatingPointer(Params * p);
1155625Sgblack@eecs.umich.edu};
1165625Sgblack@eecs.umich.edu
1175625Sgblack@eecs.umich.educlass BaseConfigEntry : public SimObject
1185625Sgblack@eecs.umich.edu{
1195625Sgblack@eecs.umich.edu  protected:
1205625Sgblack@eecs.umich.edu    typedef X86IntelMPBaseConfigEntryParams Params;
1215625Sgblack@eecs.umich.edu
1225625Sgblack@eecs.umich.edu    uint8_t type;
1235625Sgblack@eecs.umich.edu
1245625Sgblack@eecs.umich.edu  public:
1255625Sgblack@eecs.umich.edu
1268852Sandreas.hansson@arm.com    virtual Addr writeOut(PortProxy& proxy, Addr addr, uint8_t &checkSum);
1275625Sgblack@eecs.umich.edu
1285625Sgblack@eecs.umich.edu    BaseConfigEntry(Params * p, uint8_t _type);
1295625Sgblack@eecs.umich.edu};
1305625Sgblack@eecs.umich.edu
1315625Sgblack@eecs.umich.educlass ExtConfigEntry : public SimObject
1325625Sgblack@eecs.umich.edu{
1335625Sgblack@eecs.umich.edu  protected:
1345625Sgblack@eecs.umich.edu    typedef X86IntelMPExtConfigEntryParams Params;
1355625Sgblack@eecs.umich.edu
1365625Sgblack@eecs.umich.edu    uint8_t type;
1375625Sgblack@eecs.umich.edu    uint8_t length;
1385625Sgblack@eecs.umich.edu
1395625Sgblack@eecs.umich.edu  public:
1405625Sgblack@eecs.umich.edu
1418852Sandreas.hansson@arm.com    virtual Addr writeOut(PortProxy& proxy, Addr addr, uint8_t &checkSum);
1425625Sgblack@eecs.umich.edu
1435625Sgblack@eecs.umich.edu    ExtConfigEntry(Params * p, uint8_t _type, uint8_t _length);
1445625Sgblack@eecs.umich.edu};
1455625Sgblack@eecs.umich.edu
1465625Sgblack@eecs.umich.educlass ConfigTable : public SimObject
1475625Sgblack@eecs.umich.edu{
1485625Sgblack@eecs.umich.edu  protected:
1495625Sgblack@eecs.umich.edu    typedef X86IntelMPConfigTableParams Params;
1505625Sgblack@eecs.umich.edu
1515625Sgblack@eecs.umich.edu    static const char signature[];
1525625Sgblack@eecs.umich.edu
1535625Sgblack@eecs.umich.edu    uint8_t specRev;
1545625Sgblack@eecs.umich.edu    std::string oemID;
1555625Sgblack@eecs.umich.edu    std::string productID;
1565625Sgblack@eecs.umich.edu    uint32_t oemTableAddr;
1575625Sgblack@eecs.umich.edu    uint16_t oemTableSize;
1585625Sgblack@eecs.umich.edu    uint32_t localApic;
1595625Sgblack@eecs.umich.edu
1605625Sgblack@eecs.umich.edu    std::vector<BaseConfigEntry *> baseEntries;
1615625Sgblack@eecs.umich.edu    std::vector<ExtConfigEntry *> extEntries;
1625625Sgblack@eecs.umich.edu
1635625Sgblack@eecs.umich.edu  public:
1648852Sandreas.hansson@arm.com    Addr writeOut(PortProxy& proxy, Addr addr);
1655625Sgblack@eecs.umich.edu
1665625Sgblack@eecs.umich.edu    ConfigTable(Params * p);
1675625Sgblack@eecs.umich.edu};
1685625Sgblack@eecs.umich.edu
1695625Sgblack@eecs.umich.educlass Processor : public BaseConfigEntry
1705625Sgblack@eecs.umich.edu{
1715625Sgblack@eecs.umich.edu  protected:
1725625Sgblack@eecs.umich.edu    typedef X86IntelMPProcessorParams Params;
1735625Sgblack@eecs.umich.edu
1745625Sgblack@eecs.umich.edu    uint8_t localApicID;
1755625Sgblack@eecs.umich.edu    uint8_t localApicVersion;
1765625Sgblack@eecs.umich.edu    uint8_t cpuFlags;
1775625Sgblack@eecs.umich.edu    uint32_t cpuSignature;
1785625Sgblack@eecs.umich.edu    uint32_t featureFlags;
1795625Sgblack@eecs.umich.edu
1805625Sgblack@eecs.umich.edu  public:
1818852Sandreas.hansson@arm.com    Addr writeOut(PortProxy& proxy, Addr addr, uint8_t &checkSum);
1825625Sgblack@eecs.umich.edu
1835625Sgblack@eecs.umich.edu    Processor(Params * p);
1845625Sgblack@eecs.umich.edu};
1855625Sgblack@eecs.umich.edu
1865625Sgblack@eecs.umich.educlass Bus : public BaseConfigEntry
1875625Sgblack@eecs.umich.edu{
1885625Sgblack@eecs.umich.edu  protected:
1895625Sgblack@eecs.umich.edu    typedef X86IntelMPBusParams Params;
1905625Sgblack@eecs.umich.edu
1915625Sgblack@eecs.umich.edu    uint8_t busID;
1925625Sgblack@eecs.umich.edu    std::string busType;
1935625Sgblack@eecs.umich.edu
1945625Sgblack@eecs.umich.edu  public:
1958852Sandreas.hansson@arm.com    Addr writeOut(PortProxy& proxy, Addr addr, uint8_t &checkSum);
1965625Sgblack@eecs.umich.edu
1975625Sgblack@eecs.umich.edu    Bus(Params * p);
1985625Sgblack@eecs.umich.edu};
1995625Sgblack@eecs.umich.edu
2005625Sgblack@eecs.umich.educlass IOAPIC : public BaseConfigEntry
2015625Sgblack@eecs.umich.edu{
2025625Sgblack@eecs.umich.edu  protected:
2035625Sgblack@eecs.umich.edu    typedef X86IntelMPIOAPICParams Params;
2045625Sgblack@eecs.umich.edu
2055625Sgblack@eecs.umich.edu    uint8_t id;
2065625Sgblack@eecs.umich.edu    uint8_t version;
2075625Sgblack@eecs.umich.edu    uint8_t flags;
2085625Sgblack@eecs.umich.edu    uint32_t address;
2095625Sgblack@eecs.umich.edu
2105625Sgblack@eecs.umich.edu  public:
2118852Sandreas.hansson@arm.com    Addr writeOut(PortProxy& proxy, Addr addr, uint8_t &checkSum);
2125625Sgblack@eecs.umich.edu
2135625Sgblack@eecs.umich.edu    IOAPIC(Params * p);
2145625Sgblack@eecs.umich.edu};
2155625Sgblack@eecs.umich.edu
2165625Sgblack@eecs.umich.educlass IntAssignment : public BaseConfigEntry
2175625Sgblack@eecs.umich.edu{
2185625Sgblack@eecs.umich.edu  protected:
2195625Sgblack@eecs.umich.edu    uint8_t interruptType;
2205625Sgblack@eecs.umich.edu
2215625Sgblack@eecs.umich.edu    uint16_t flags;
2225625Sgblack@eecs.umich.edu
2235625Sgblack@eecs.umich.edu    uint8_t sourceBusID;
2245625Sgblack@eecs.umich.edu    uint8_t sourceBusIRQ;
2255625Sgblack@eecs.umich.edu
2265625Sgblack@eecs.umich.edu    uint8_t destApicID;
2275625Sgblack@eecs.umich.edu    uint8_t destApicIntIn;
2285625Sgblack@eecs.umich.edu
2295625Sgblack@eecs.umich.edu  public:
2308852Sandreas.hansson@arm.com    Addr writeOut(PortProxy& proxy, Addr addr, uint8_t &checkSum);
2315625Sgblack@eecs.umich.edu
2325625Sgblack@eecs.umich.edu    IntAssignment(X86IntelMPBaseConfigEntryParams * p,
2335625Sgblack@eecs.umich.edu            Enums::X86IntelMPInterruptType _interruptType,
2345625Sgblack@eecs.umich.edu            Enums::X86IntelMPPolarity polarity,
2355625Sgblack@eecs.umich.edu            Enums::X86IntelMPTriggerMode trigger,
2365625Sgblack@eecs.umich.edu            uint8_t _type,
2375625Sgblack@eecs.umich.edu            uint8_t _sourceBusID, uint8_t _sourceBusIRQ,
2385625Sgblack@eecs.umich.edu            uint8_t _destApicID, uint8_t _destApicIntIn) :
2395625Sgblack@eecs.umich.edu        BaseConfigEntry(p, _type),
2405625Sgblack@eecs.umich.edu        interruptType(_interruptType), flags(0),
2415625Sgblack@eecs.umich.edu        sourceBusID(_sourceBusID), sourceBusIRQ(_sourceBusIRQ),
2425625Sgblack@eecs.umich.edu        destApicID(_destApicID), destApicIntIn(_destApicIntIn)
2435625Sgblack@eecs.umich.edu    {
2445625Sgblack@eecs.umich.edu        replaceBits(flags, 0, 1, polarity);
2455625Sgblack@eecs.umich.edu        replaceBits(flags, 2, 3, trigger);
2465625Sgblack@eecs.umich.edu    }
2475625Sgblack@eecs.umich.edu};
2485625Sgblack@eecs.umich.edu
2495625Sgblack@eecs.umich.educlass IOIntAssignment : public IntAssignment
2505625Sgblack@eecs.umich.edu{
2515625Sgblack@eecs.umich.edu  protected:
2525625Sgblack@eecs.umich.edu    typedef X86IntelMPIOIntAssignmentParams Params;
2535625Sgblack@eecs.umich.edu
2545625Sgblack@eecs.umich.edu  public:
2555625Sgblack@eecs.umich.edu    IOIntAssignment(Params * p);
2565625Sgblack@eecs.umich.edu};
2575625Sgblack@eecs.umich.edu
2585625Sgblack@eecs.umich.educlass LocalIntAssignment : public IntAssignment
2595625Sgblack@eecs.umich.edu{
2605625Sgblack@eecs.umich.edu  protected:
2615625Sgblack@eecs.umich.edu    typedef X86IntelMPLocalIntAssignmentParams Params;
2625625Sgblack@eecs.umich.edu
2635625Sgblack@eecs.umich.edu  public:
2645625Sgblack@eecs.umich.edu    LocalIntAssignment(Params * p);
2655625Sgblack@eecs.umich.edu};
2665625Sgblack@eecs.umich.edu
2675625Sgblack@eecs.umich.educlass AddrSpaceMapping : public ExtConfigEntry
2685625Sgblack@eecs.umich.edu{
2695625Sgblack@eecs.umich.edu  protected:
2705625Sgblack@eecs.umich.edu    typedef X86IntelMPAddrSpaceMappingParams Params;
2715625Sgblack@eecs.umich.edu
2725625Sgblack@eecs.umich.edu    uint8_t busID;
2735625Sgblack@eecs.umich.edu    uint8_t addrType;
2745625Sgblack@eecs.umich.edu    uint64_t addr;
2755625Sgblack@eecs.umich.edu    uint64_t addrLength;
2765625Sgblack@eecs.umich.edu
2775625Sgblack@eecs.umich.edu  public:
2788852Sandreas.hansson@arm.com    Addr writeOut(PortProxy& proxy, Addr addr, uint8_t &checkSum);
2795625Sgblack@eecs.umich.edu
2805625Sgblack@eecs.umich.edu    AddrSpaceMapping(Params * p);
2815625Sgblack@eecs.umich.edu};
2825625Sgblack@eecs.umich.edu
2835625Sgblack@eecs.umich.educlass BusHierarchy : public ExtConfigEntry
2845625Sgblack@eecs.umich.edu{
2855625Sgblack@eecs.umich.edu  protected:
2865625Sgblack@eecs.umich.edu    typedef X86IntelMPBusHierarchyParams Params;
2875625Sgblack@eecs.umich.edu
2885625Sgblack@eecs.umich.edu    uint8_t busID;
2895625Sgblack@eecs.umich.edu    uint8_t info;
2905625Sgblack@eecs.umich.edu    uint8_t parentBus;
2915625Sgblack@eecs.umich.edu
2925625Sgblack@eecs.umich.edu  public:
2938852Sandreas.hansson@arm.com    Addr writeOut(PortProxy& proxy, Addr addr, uint8_t &checkSum);
2945625Sgblack@eecs.umich.edu
2955625Sgblack@eecs.umich.edu    BusHierarchy(Params * p);
2965625Sgblack@eecs.umich.edu};
2975625Sgblack@eecs.umich.edu
2985625Sgblack@eecs.umich.educlass CompatAddrSpaceMod : public ExtConfigEntry
2995625Sgblack@eecs.umich.edu{
3005625Sgblack@eecs.umich.edu  protected:
3015625Sgblack@eecs.umich.edu    typedef X86IntelMPCompatAddrSpaceModParams Params;
3025625Sgblack@eecs.umich.edu
3035625Sgblack@eecs.umich.edu    uint8_t busID;
3045625Sgblack@eecs.umich.edu    uint8_t mod;
3055625Sgblack@eecs.umich.edu    uint32_t rangeList;
3065625Sgblack@eecs.umich.edu
3075625Sgblack@eecs.umich.edu  public:
3088852Sandreas.hansson@arm.com    Addr writeOut(PortProxy& proxy, Addr addr, uint8_t &checkSum);
3095625Sgblack@eecs.umich.edu
3105625Sgblack@eecs.umich.edu    CompatAddrSpaceMod(Params * p);
3115625Sgblack@eecs.umich.edu};
3125625Sgblack@eecs.umich.edu
3135625Sgblack@eecs.umich.edu} //IntelMP
3145625Sgblack@eecs.umich.edu
3155625Sgblack@eecs.umich.edu} //X86ISA
3165625Sgblack@eecs.umich.edu
3175625Sgblack@eecs.umich.edu#endif
318