blob: 20ff0cf3ec1138872bf935a54b5a16caf5fee55a [file] [log] [blame]
/*
// 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