xref: /openbmc/smbios-mdr/src/cpu.cpp (revision 18a5ab91)
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