143c6a1daSCheng C Yang /* 243c6a1daSCheng C Yang // Copyright (c) 2018 Intel Corporation 343c6a1daSCheng C Yang // 443c6a1daSCheng C Yang // Licensed under the Apache License, Version 2.0 (the "License"); 543c6a1daSCheng C Yang // you may not use this file except in compliance with the License. 643c6a1daSCheng C Yang // You may obtain a copy of the License at 743c6a1daSCheng C Yang // 843c6a1daSCheng C Yang // http://www.apache.org/licenses/LICENSE-2.0 943c6a1daSCheng C Yang // 1043c6a1daSCheng C Yang // Unless required by applicable law or agreed to in writing, software 1143c6a1daSCheng C Yang // distributed under the License is distributed on an "AS IS" BASIS, 1243c6a1daSCheng C Yang // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1343c6a1daSCheng C Yang // See the License for the specific language governing permissions and 1443c6a1daSCheng C Yang // limitations under the License. 1543c6a1daSCheng C Yang */ 1643c6a1daSCheng C Yang 1743c6a1daSCheng C Yang #include "cpu.hpp" 1843c6a1daSCheng C Yang 19*18a5ab91SZhikui Ren #include <bitset> 2043c6a1daSCheng C Yang #include <map> 2143c6a1daSCheng C Yang 2243c6a1daSCheng C Yang namespace phosphor 2343c6a1daSCheng C Yang { 2443c6a1daSCheng C Yang namespace smbios 2543c6a1daSCheng C Yang { 2643c6a1daSCheng C Yang 27*18a5ab91SZhikui Ren void Cpu::socket(const uint8_t positionNum, const uint8_t structLen, 2843c6a1daSCheng C Yang uint8_t* dataIn) 2943c6a1daSCheng C Yang { 3043c6a1daSCheng C Yang std::string result = positionToString(positionNum, structLen, dataIn); 3143c6a1daSCheng C Yang 32*18a5ab91SZhikui Ren processor::socket(result); 3343c6a1daSCheng C Yang } 3443c6a1daSCheng C Yang 35*18a5ab91SZhikui Ren void Cpu::family(const uint8_t value) 3643c6a1daSCheng C Yang { 372ca7a0f3SCheng C Yang std::map<uint8_t, const char*>::const_iterator it = familyTable.find(value); 3843c6a1daSCheng C Yang if (it == familyTable.end()) 3943c6a1daSCheng C Yang { 40*18a5ab91SZhikui Ren processor::family("Unknown Processor Family"); 4143c6a1daSCheng C Yang } 4243c6a1daSCheng C Yang else 4343c6a1daSCheng C Yang { 44*18a5ab91SZhikui Ren processor::family(it->second); 4543c6a1daSCheng C Yang } 4643c6a1daSCheng C Yang } 4743c6a1daSCheng C Yang 48*18a5ab91SZhikui Ren void Cpu::manufacturer(const uint8_t positionNum, const uint8_t structLen, 4943c6a1daSCheng C Yang uint8_t* dataIn) 5043c6a1daSCheng C Yang { 5143c6a1daSCheng C Yang std::string result = positionToString(positionNum, structLen, dataIn); 5243c6a1daSCheng C Yang 53*18a5ab91SZhikui Ren asset::manufacturer(result); 5443c6a1daSCheng C Yang } 5543c6a1daSCheng C Yang 56*18a5ab91SZhikui Ren void Cpu::version(const uint8_t positionNum, const uint8_t structLen, 5743c6a1daSCheng C Yang uint8_t* dataIn) 5843c6a1daSCheng C Yang { 5943c6a1daSCheng C Yang std::string result; 6043c6a1daSCheng C Yang 6143c6a1daSCheng C Yang result = positionToString(positionNum, structLen, dataIn); 6243c6a1daSCheng C Yang 63*18a5ab91SZhikui Ren rev::version(result); 6443c6a1daSCheng C Yang } 6543c6a1daSCheng C Yang 66*18a5ab91SZhikui Ren void Cpu::characteristics(uint16_t value) 6743c6a1daSCheng C Yang { 68*18a5ab91SZhikui Ren std::vector<processor::Capability> result; 69*18a5ab91SZhikui Ren std::optional<processor::Capability> cap; 7043c6a1daSCheng C Yang 71*18a5ab91SZhikui Ren std::bitset<16> charBits = value; 72*18a5ab91SZhikui Ren for (uint8_t index = 0; index < charBits.size(); index++) 7343c6a1daSCheng C Yang { 74*18a5ab91SZhikui Ren if (charBits.test(index)) 75*18a5ab91SZhikui Ren { 76*18a5ab91SZhikui Ren if (cap = characteristicsTable[index]) 77*18a5ab91SZhikui Ren { 78*18a5ab91SZhikui Ren result.emplace_back(*cap); 7943c6a1daSCheng C Yang } 8043c6a1daSCheng C Yang } 8143c6a1daSCheng C Yang } 8243c6a1daSCheng C Yang 83*18a5ab91SZhikui Ren processor::characteristics(result); 8443c6a1daSCheng C Yang } 8543c6a1daSCheng C Yang 8643c6a1daSCheng C Yang static constexpr uint8_t maxOldVersionCount = 0xff; 87*18a5ab91SZhikui Ren void Cpu::infoUpdate(void) 8843c6a1daSCheng C Yang { 8943c6a1daSCheng C Yang uint8_t* dataIn = storage; 9043c6a1daSCheng C Yang 9143c6a1daSCheng C Yang dataIn = getSMBIOSTypePtr(dataIn, processorsType); 9243c6a1daSCheng C Yang if (dataIn == nullptr) 9343c6a1daSCheng C Yang { 9443c6a1daSCheng C Yang return; 9543c6a1daSCheng C Yang } 9643c6a1daSCheng C Yang 9743c6a1daSCheng C Yang for (uint8_t index = 0; index < cpuNum; index++) 9843c6a1daSCheng C Yang { 9943c6a1daSCheng C Yang dataIn = smbiosNextPtr(dataIn); 10043c6a1daSCheng C Yang if (dataIn == nullptr) 10143c6a1daSCheng C Yang { 10243c6a1daSCheng C Yang return; 10343c6a1daSCheng C Yang } 10443c6a1daSCheng C Yang dataIn = getSMBIOSTypePtr(dataIn, processorsType); 10543c6a1daSCheng C Yang if (dataIn == nullptr) 10643c6a1daSCheng C Yang { 10743c6a1daSCheng C Yang return; 10843c6a1daSCheng C Yang } 10943c6a1daSCheng C Yang } 11043c6a1daSCheng C Yang 11143c6a1daSCheng C Yang auto cpuInfo = reinterpret_cast<struct ProcessorInfo*>(dataIn); 11243c6a1daSCheng C Yang 113*18a5ab91SZhikui Ren socket(cpuInfo->socketDesignation, cpuInfo->length, 11443c6a1daSCheng C Yang dataIn); // offset 4h 115*18a5ab91SZhikui Ren // this class is for type CPU //offset 5h 116*18a5ab91SZhikui Ren family(cpuInfo->family); // offset 6h 117*18a5ab91SZhikui Ren manufacturer(cpuInfo->manufacturer, cpuInfo->length, 11843c6a1daSCheng C Yang dataIn); // offset 7h 119*18a5ab91SZhikui Ren id(cpuInfo->id); // offset 8h 120*18a5ab91SZhikui Ren version(cpuInfo->version, cpuInfo->length, dataIn); // offset 10h 121*18a5ab91SZhikui Ren maxSpeedInMhz(cpuInfo->maxSpeed); // offset 14h 12243c6a1daSCheng C Yang if (cpuInfo->coreCount < maxOldVersionCount) // offset 23h or 2Ah 12343c6a1daSCheng C Yang { 124*18a5ab91SZhikui Ren coreCount(cpuInfo->coreCount); 12543c6a1daSCheng C Yang } 12643c6a1daSCheng C Yang else 12743c6a1daSCheng C Yang { 128*18a5ab91SZhikui Ren coreCount(cpuInfo->coreCount2); 12943c6a1daSCheng C Yang } 13043c6a1daSCheng C Yang 13143c6a1daSCheng C Yang if (cpuInfo->threadCount < maxOldVersionCount) // offset 25h or 2Eh) 13243c6a1daSCheng C Yang { 133*18a5ab91SZhikui Ren threadCount(cpuInfo->threadCount); 13443c6a1daSCheng C Yang } 13543c6a1daSCheng C Yang else 13643c6a1daSCheng C Yang { 137*18a5ab91SZhikui Ren threadCount(cpuInfo->threadCount2); 13843c6a1daSCheng C Yang } 13943c6a1daSCheng C Yang 140*18a5ab91SZhikui Ren characteristics(cpuInfo->characteristics); // offset 26h 14143c6a1daSCheng C Yang } 14243c6a1daSCheng C Yang 14343c6a1daSCheng C Yang } // namespace smbios 14443c6a1daSCheng C Yang } // namespace phosphor 145