intelmp.hh revision 9554
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