| /* |
| // Copyright (c) 2018 Intel Corporation |
| // |
| // Licensed under the Apache License, Version 2.0 (the "License"); |
| // you may not use this file except in compliance with the License. |
| // You may obtain a copy of the License at |
| // |
| // http://www.apache.org/licenses/LICENSE-2.0 |
| // |
| // Unless required by applicable law or agreed to in writing, software |
| // distributed under the License is distributed on an "AS IS" BASIS, |
| // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| // See the License for the specific language governing permissions and |
| // limitations under the License. |
| */ |
| |
| #pragma once |
| #include "smbios_mdrv2.hpp" |
| |
| #include <xyz/openbmc_project/Association/Definitions/server.hpp> |
| #include <xyz/openbmc_project/Inventory/Connector/Slot/server.hpp> |
| #include <xyz/openbmc_project/Inventory/Decorator/Asset/server.hpp> |
| #include <xyz/openbmc_project/Inventory/Decorator/LocationCode/server.hpp> |
| #include <xyz/openbmc_project/Inventory/Decorator/Revision/server.hpp> |
| #include <xyz/openbmc_project/Inventory/Item/Cpu/server.hpp> |
| #include <xyz/openbmc_project/Inventory/Item/server.hpp> |
| #include <xyz/openbmc_project/State/Decorator/OperationalStatus/server.hpp> |
| |
| namespace phosphor |
| { |
| |
| namespace smbios |
| { |
| |
| using rev = |
| sdbusplus::server::xyz::openbmc_project::inventory::decorator::Revision; |
| using asset = |
| sdbusplus::server::xyz::openbmc_project::inventory::decorator::Asset; |
| using location = |
| sdbusplus::server::xyz::openbmc_project::inventory::decorator::LocationCode; |
| using connector = |
| sdbusplus::server::xyz::openbmc_project::inventory::connector::Slot; |
| using processor = sdbusplus::server::xyz::openbmc_project::inventory::item::Cpu; |
| using Item = sdbusplus::server::xyz::openbmc_project::inventory::Item; |
| using association = |
| sdbusplus::server::xyz::openbmc_project::association::Definitions; |
| using operationalStatus = sdbusplus::xyz::openbmc_project::State::Decorator:: |
| server::OperationalStatus; |
| |
| // This table is up to date as of SMBIOS spec DSP0134 3.7.0 |
| static const std::map<uint8_t, const char*> familyTable = { |
| {0x01, "Other"}, |
| {0x02, "Unknown"}, |
| {0x03, "8086"}, |
| {0x04, "80286"}, |
| {0x05, "Intel 386 processor"}, |
| {0x06, "Intel 486 processor"}, |
| {0x07, "8087"}, |
| {0x08, "80287"}, |
| {0x09, "80387"}, |
| {0x0a, "80487"}, |
| {0x0b, "Intel Pentium processor"}, |
| {0x0c, "Pentium Pro processor"}, |
| {0x0d, "Pentium II processor"}, |
| {0x0e, "Pentium processor with MMX technology"}, |
| {0x0f, "Intel Celeron processor"}, |
| {0x10, "Pentium II Xeon processor"}, |
| {0x11, "Pentium III processor"}, |
| {0x12, "M1 Family"}, |
| {0x13, "M2 Family"}, |
| {0x14, "Intel Celeron M processor"}, |
| {0x15, "Intel Pentium 4 HT processor"}, |
| {0x16, "Intel Processor"}, |
| {0x18, "AMD Duron Processor Family"}, |
| {0x19, "K5 Family"}, |
| {0x1a, "K6 Family"}, |
| {0x1b, "K6-2"}, |
| {0x1c, "K6-3"}, |
| {0x1d, "AMD Athlon Processor Family"}, |
| {0x1e, "AMD29000 Family"}, |
| {0x1f, "K6-2+"}, |
| {0x20, "Power PC Family"}, |
| {0x21, "Power PC 601"}, |
| {0x22, "Power PC 603"}, |
| {0x23, "Power PC 603+"}, |
| {0x24, "Power PC 604"}, |
| {0x25, "Power PC 620"}, |
| {0x26, "Power PC x704"}, |
| {0x27, "Power PC 750"}, |
| {0x28, "Intel Core Duo processor"}, |
| {0x29, "Intel Core Duo mobile processor"}, |
| {0x2a, "Intel Core Solo mobile processor"}, |
| {0x2b, "Intel Atom processor"}, |
| {0x2c, "Intel Core M processor"}, |
| {0x2d, "Intel Core m3 processor"}, |
| {0x2e, "Intel Core m5 processor"}, |
| {0x2f, "Intel Core m7 processor"}, |
| {0x30, "Alpha Family"}, |
| {0x31, "Alpha 21064"}, |
| {0x32, "Alpha 21066"}, |
| {0x33, "Alpha 21164"}, |
| {0x34, "Alpha 21164PC"}, |
| {0x35, "Alpha 21164a"}, |
| {0x36, "Alpha 21264"}, |
| {0x37, "Alpha 21364"}, |
| {0x38, "AMD Turion II Ultra Dual-Core Mobile M Processor Family"}, |
| {0x39, "AMD Turion II Dual-Core Mobile M Processor Family"}, |
| {0x3a, "AMD Athlon II Dual-Core M Processor Family"}, |
| {0x3b, "AMD Opteron 6100 Series Processor"}, |
| {0x3c, "AMD Opteron 4100 Series Processor"}, |
| {0x3d, "AMD Opteron 6200 Series Processor"}, |
| {0x3e, "AMD Opteron 4200 Series Processor"}, |
| {0x3f, "AMD FX Series Processor"}, |
| {0x40, "MIPS Family"}, |
| {0x41, "MIPS R4000"}, |
| {0x42, "MIPS R4200"}, |
| {0x43, "MIPS R4400"}, |
| {0x44, "MIPS R4600"}, |
| {0x45, "MIPS R10000"}, |
| {0x46, "AMD C-Series Processor"}, |
| {0x47, "AMD E-Series Processor"}, |
| {0x48, "AMD A-Series Processor"}, |
| {0x49, "AMD G-Series Processor"}, |
| {0x4a, "AMD Z-Series Processor"}, |
| {0x4b, "AMD R-Series Processor"}, |
| {0x4c, "AMD Opteron 4300 Series Processor"}, |
| {0x4d, "AMD Opteron 6300 Series Processor"}, |
| {0x4e, "AMD Opteron 3300 Series Processor"}, |
| {0x4f, "AMD FirePro Series Processor"}, |
| {0x50, "SPARC Family"}, |
| {0x51, "SuperSPARC"}, |
| {0x52, "microSPARC II"}, |
| {0x53, "microSPARC IIep"}, |
| {0x54, "UltraSPARC"}, |
| {0x55, "UltraSPARC II"}, |
| {0x56, "UltraSPARC Iii"}, |
| {0x57, "UltraSPARC III"}, |
| {0x58, "UltraSPARC IIIi"}, |
| {0x60, "68040 Family"}, |
| {0x61, "68xxx"}, |
| {0x62, "68000"}, |
| {0x63, "68010"}, |
| {0x64, "68020"}, |
| {0x65, "68030"}, |
| {0x66, "AMD Athlon X4 Quad-Core Processor Family"}, |
| {0x67, "AMD Opteron X1000 Series Processor"}, |
| {0x68, "AMD Opteron X2000 Series APU"}, |
| {0x69, "AMD Opteron A-Series Processor"}, |
| {0x6a, "AMD Opteron X3000 Series APU"}, |
| {0x6b, "AMD Zen Processor Family"}, |
| {0x70, "Hobbit Family"}, |
| {0x78, "Crusoe TM5000 Family"}, |
| {0x79, "Crusoe TM3000 Family"}, |
| {0x7a, "Efficeon TM8000 Family"}, |
| {0x80, "Weitek"}, |
| {0x82, "Itanium processor"}, |
| {0x83, "AMD Athlon 64 Processor Family"}, |
| {0x84, "AMD Opteron Processor Family"}, |
| {0x85, "AMD Sempron Processor Family"}, |
| {0x86, "AMD Turion 64 Mobile Technology"}, |
| {0x87, "Dual-Core AMD Opteron Processor Family"}, |
| {0x88, "AMD Athlon 64 X2 Dual-Core Processor Family"}, |
| {0x89, "AMD Turion 64 X2 Mobile Technology"}, |
| {0x8a, "Quad-Core AMD Opteron Processor Family"}, |
| {0x8b, "Third-Generation AMD Opteron Processor Family"}, |
| {0x8c, "AMD Phenom FX Quad-Core Processor Family"}, |
| {0x8d, "AMD Phenom X4 Quad-Core Processor Family"}, |
| {0x8e, "AMD Phenom X2 Dual-Core Processor Family"}, |
| {0x8f, "AMD Athlon X2 Dual-Core Processor Family"}, |
| {0x90, "PA-RISC Family"}, |
| {0x91, "PA-RISC 8500"}, |
| {0x92, "PA-RISC 8000"}, |
| {0x93, "PA-RISC 7300LC"}, |
| {0x94, "PA-RISC 7200"}, |
| {0x95, "PA-RISC 7100LC"}, |
| {0x96, "PA-RISC 7100"}, |
| {0xa0, "V30 Family"}, |
| {0xa1, "Quad-Core Intel Xeon processor 3200 Series"}, |
| {0xa2, "Dual-Core Intel Xeon processor 3000 Series"}, |
| {0xa3, "Quad-Core Intel Xeon processor 5300 Series"}, |
| {0xa4, "Dual-Core Intel Xeon processor 5100 Series"}, |
| {0xa5, "Dual-Core Intel Xeon processor 5000 Series"}, |
| {0xa6, "Dual-Core Intel Xeon processor LV"}, |
| {0xa7, "Dual-Core Intel Xeon processor ULV"}, |
| {0xa8, "Dual-Core Intel Xeon processor 7100 Series"}, |
| {0xa9, "Quad-Core Intel Xeon processor 5400 Series"}, |
| {0xaa, "Quad-Core Intel Xeon processor"}, |
| {0xab, "Dual-Core Intel Xeon processor 5200 Series"}, |
| {0xac, "Dual-Core Intel Xeon processor 7200 Series"}, |
| {0xad, "Quad-Core Intel Xeon processor 7300 Series"}, |
| {0xae, "Quad-Core Intel Xeon processor 7400 Series"}, |
| {0xaf, "Multi-Core Intel Xeon processor 7400 Series"}, |
| {0xb0, "Pentium III Xeon processor"}, |
| {0xb1, "Pentium III Processor with Intel SpeedStep Technology"}, |
| {0xb2, "Pentium 4 Processor"}, |
| {0xb3, "Intel Xeon processor"}, |
| {0xb4, "AS400 Family"}, |
| {0xb5, "Intel Xeon processor MP"}, |
| {0xb6, "AMD Athlon XP Processor Family"}, |
| {0xb7, "AMD Athlon MP Processor Family"}, |
| {0xb8, "Intel Itanium 2 processor"}, |
| {0xb9, "Intel Pentium M processor"}, |
| {0xba, "Intel Celeron D processor"}, |
| {0xbb, "Intel Pentium D processor"}, |
| {0xbc, "Intel Pentium Processor Extreme Edition"}, |
| {0xbd, "Intel Core Solo Processor"}, |
| {0xbf, "Intel Core 2 Duo Processor"}, |
| {0xc0, "Intel Core 2 Solo processor"}, |
| {0xc1, "Intel Core 2 Extreme processor"}, |
| {0xc2, "Intel Core 2 Quad processor"}, |
| {0xc3, "Intel Core 2 Extreme mobile processor"}, |
| {0xc4, "Intel Core 2 Duo mobile processor"}, |
| {0xc5, "Intel Core 2 Solo mobile processor"}, |
| {0xc6, "Intel Core i7 processor"}, |
| {0xc7, "Dual-Core Intel Celeron processor"}, |
| {0xc8, "IBM390 Family"}, |
| {0xc9, "G4"}, |
| {0xca, "G5"}, |
| {0xcb, "ESA/390 G6"}, |
| {0xcc, "z/Architecture base"}, |
| {0xcd, "Intel Core i5 processor"}, |
| {0xce, "Intel Core i3 processor"}, |
| {0xcf, "Intel Core i9 processor"}, |
| {0xd2, "VIA C7-M Processor Family"}, |
| {0xd3, "VIA C7-D Processor Family"}, |
| {0xd4, "VIA C7 Processor Family"}, |
| {0xd5, "VIA Eden Processor Family"}, |
| {0xd6, "Multi-Core Intel Xeon processor"}, |
| {0xd7, "Dual-Core Intel Xeon processor 3xxx Series"}, |
| {0xd8, "Quad-Core Intel Xeon processor 3xxx Series"}, |
| {0xd9, "VIA Nano Processor Family"}, |
| {0xda, "Dual-Core Intel Xeon processor 5xxx Series"}, |
| {0xdb, "Quad-Core Intel Xeon processor 5xxx Series"}, |
| {0xdd, "Dual-Core Intel Xeon processor 7xxx Series"}, |
| {0xde, "Quad-Core Intel Xeon processor 7xxx Series"}, |
| {0xdf, "Multi-Core Intel Xeon processor 7xxx Series"}, |
| {0xe0, "Multi-Core Intel Xeon processor 3400 Series"}, |
| {0xe4, "AMD Opteron 3000 Series Processor"}, |
| {0xe5, "AMD Sempron II Processor"}, |
| {0xe6, "Embedded AMD Opteron Quad-Core Processor Family"}, |
| {0xe7, "AMD Phenom Triple-Core Processor Family"}, |
| {0xe8, "AMD Turion Ultra Dual-Core Mobile Processor Family"}, |
| {0xe9, "AMD Turion Dual-Core Mobile Processor Family"}, |
| {0xea, "AMD Athlon Dual-Core Processor Family"}, |
| {0xeb, "AMD Sempron SI Processor Family"}, |
| {0xec, "AMD Phenom II Processor Family"}, |
| {0xed, "AMD Athlon II Processor Family"}, |
| {0xee, "Six-core AMD Opteron Processor Family"}, |
| {0xef, "AMD Sempron M Processor Family"}, |
| {0xfa, "i860"}, |
| {0xfb, "i960"}, |
| {0xfe, "Processor Family 2 Indicator"}}; |
| |
| // This table is up to date as of SMBIOS spec DSP0134 3.7.0 |
| static const std::map<uint16_t, const char*> family2Table = { |
| {0x100, "ARMv7"}, |
| {0x101, "ARMv8"}, |
| {0x102, "ARMv9"}, |
| {0x104, "SH-3"}, |
| {0x105, "SH-4"}, |
| {0x118, "ARM"}, |
| {0x119, "StrongARM"}, |
| {0x12c, "6x86"}, |
| {0x12d, "MediaGX"}, |
| {0x12e, "MII"}, |
| {0x140, "WinChip"}, |
| {0x15e, "DSP"}, |
| {0x1f4, "Video Processor"}, |
| {0x200, "RISC-V RV32"}, |
| {0x201, "RISC-V RV64"}, |
| {0x202, "RISC-V RV128"}, |
| {0x258, "LoongArch"}, |
| {0x259, "Loongson 1 Processor Family"}, |
| {0x25a, "Loongson 2 Processor Family"}, |
| {0x25b, "Loongson 3 Processor Family"}, |
| {0x25c, "Loongson 2K Processor Family"}, |
| {0x25d, "Loongson 3A Processor Family"}, |
| {0x25e, "Loongson 3B Processor Family"}, |
| {0x25f, "Loongson 3C Processor Family"}, |
| {0x260, "Loongson 3D Processor Family"}, |
| {0x261, "Loongson 3E Processor Family"}, |
| {0x262, "Dual-Core Loongson 2K Processor 2xxx Series"}, |
| {0x26c, "Quad-Core Loongson 3A Processor 5xxx Series"}, |
| {0x26d, "Multi-Core Loongson 3A Processor 5xxx Series"}, |
| {0x26e, "Quad-Core Loongson 3B Processor 5xxx Series"}, |
| {0x26f, "Multi-Core Loongson 3B Processor 5xxx Series"}, |
| {0x270, "Multi-Core Loongson 3C Processor 5xxx Series"}, |
| {0x271, "Multi-Core Loongson 3D Processor 5xxx Series"}}; |
| |
| // Definition follow smbios spec DSP0134 3.0.0 |
| static const std::array<std::optional<processor::Capability>, 16> |
| characteristicsTable{std::nullopt, |
| std::nullopt, |
| processor::Capability::Capable64bit, |
| processor::Capability::MultiCore, |
| processor::Capability::HardwareThread, |
| processor::Capability::ExecuteProtection, |
| processor::Capability::EnhancedVirtualization, |
| processor::Capability::PowerPerformanceControl, |
| std::nullopt, |
| std::nullopt, |
| std::nullopt, |
| std::nullopt, |
| std::nullopt, |
| std::nullopt, |
| std::nullopt, |
| std::nullopt}; |
| |
| class Cpu : |
| sdbusplus::server::object_t<processor, asset, location, connector, rev, |
| Item, association, operationalStatus> |
| { |
| public: |
| Cpu() = delete; |
| Cpu(const Cpu&) = delete; |
| Cpu& operator=(const Cpu&) = delete; |
| Cpu(Cpu&&) = delete; |
| Cpu& operator=(Cpu&&) = delete; |
| ~Cpu() = default; |
| |
| Cpu(sdbusplus::bus_t& bus, const std::string& objPath, const uint8_t& cpuId, |
| uint8_t* smbiosTableStorage, const std::string& motherboard) : |
| sdbusplus::server::object_t<processor, asset, location, connector, rev, |
| Item, association, operationalStatus>( |
| bus, objPath.c_str()), |
| cpuNum(cpuId), storage(smbiosTableStorage), motherboardPath(motherboard) |
| { |
| infoUpdate(smbiosTableStorage, motherboard); |
| } |
| |
| void infoUpdate(uint8_t* smbiosTableStorage, |
| const std::string& motherboard); |
| |
| private: |
| uint8_t cpuNum; |
| |
| uint8_t* storage; |
| |
| std::string motherboardPath; |
| |
| struct ProcessorInfo |
| { |
| uint8_t type; |
| uint8_t length; |
| uint16_t handle; |
| uint8_t socketDesignation; |
| uint8_t processorType; |
| uint8_t family; |
| uint8_t manufacturer; |
| uint64_t id; |
| uint8_t version; |
| uint8_t voltage; |
| uint16_t exClock; |
| uint16_t maxSpeed; |
| uint16_t currSpeed; |
| uint8_t status; |
| uint8_t upgrade; |
| uint16_t l1Handle; |
| uint16_t l2Handle; |
| uint16_t l3Handle; |
| uint8_t serialNum; |
| uint8_t assetTag; |
| uint8_t partNum; |
| uint8_t coreCount; |
| uint8_t coreEnable; |
| uint8_t threadCount; |
| uint16_t characteristics; |
| uint16_t family2; |
| uint16_t coreCount2; |
| uint16_t coreEnable2; |
| uint16_t threadCount2; |
| } __attribute__((packed)); |
| |
| void socket(const uint8_t positionNum, const uint8_t structLen, |
| uint8_t* dataIn); |
| void family(const uint8_t family, const uint16_t family2); |
| void manufacturer(const uint8_t positionNum, const uint8_t structLen, |
| uint8_t* dataIn); |
| void serialNumber(const uint8_t positionNum, const uint8_t structLen, |
| uint8_t* dataIn); |
| void partNumber(const uint8_t positionNum, const uint8_t structLen, |
| uint8_t* dataIn); |
| void version(const uint8_t positionNum, const uint8_t structLen, |
| uint8_t* dataIn); |
| void characteristics(const uint16_t value); |
| }; |
| |
| } // namespace smbios |
| |
| } // namespace phosphor |