1711d51d8SMatt Spinler /**
2711d51d8SMatt Spinler  * Copyright © 2019 IBM Corporation
3711d51d8SMatt Spinler  *
4711d51d8SMatt Spinler  * Licensed under the Apache License, Version 2.0 (the "License");
5711d51d8SMatt Spinler  * you may not use this file except in compliance with the License.
6711d51d8SMatt Spinler  * You may obtain a copy of the License at
7711d51d8SMatt Spinler  *
8711d51d8SMatt Spinler  *     http://www.apache.org/licenses/LICENSE-2.0
9711d51d8SMatt Spinler  *
10711d51d8SMatt Spinler  * Unless required by applicable law or agreed to in writing, software
11711d51d8SMatt Spinler  * distributed under the License is distributed on an "AS IS" BASIS,
12711d51d8SMatt Spinler  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13711d51d8SMatt Spinler  * See the License for the specific language governing permissions and
14711d51d8SMatt Spinler  * limitations under the License.
15711d51d8SMatt Spinler  */
16a906c940SMatt Spinler #include "fru_identity.hpp"
17a906c940SMatt Spinler 
18a906c940SMatt Spinler namespace openpower
19a906c940SMatt Spinler {
20a906c940SMatt Spinler namespace pels
21a906c940SMatt Spinler {
22a906c940SMatt Spinler namespace src
23a906c940SMatt Spinler {
24a906c940SMatt Spinler 
25a906c940SMatt Spinler FRUIdentity::FRUIdentity(Stream& pel)
26a906c940SMatt Spinler {
27a906c940SMatt Spinler     pel >> _type >> _size >> _flags;
28a906c940SMatt Spinler 
29a906c940SMatt Spinler     if (_flags & (pnSupplied | maintProcSupplied))
30a906c940SMatt Spinler     {
31a906c940SMatt Spinler         pel.read(_pnOrProcedureID.data(), _pnOrProcedureID.size());
32a906c940SMatt Spinler     }
33a906c940SMatt Spinler 
34a906c940SMatt Spinler     if (_flags & ccinSupplied)
35a906c940SMatt Spinler     {
36a906c940SMatt Spinler         pel.read(_ccin.data(), _ccin.size());
37a906c940SMatt Spinler     }
38a906c940SMatt Spinler 
39a906c940SMatt Spinler     if (_flags & snSupplied)
40a906c940SMatt Spinler     {
41a906c940SMatt Spinler         pel.read(_sn.data(), _sn.size());
42a906c940SMatt Spinler     }
43a906c940SMatt Spinler }
44a906c940SMatt Spinler 
45a906c940SMatt Spinler std::optional<std::string> FRUIdentity::getPN() const
46a906c940SMatt Spinler {
47a906c940SMatt Spinler     if (hasPN())
48a906c940SMatt Spinler     {
49a906c940SMatt Spinler         // NULL terminated
50a906c940SMatt Spinler         std::string pn{_pnOrProcedureID.data()};
51a906c940SMatt Spinler         return pn;
52a906c940SMatt Spinler     }
53a906c940SMatt Spinler 
54a906c940SMatt Spinler     return std::nullopt;
55a906c940SMatt Spinler }
56a906c940SMatt Spinler 
57a906c940SMatt Spinler std::optional<std::string> FRUIdentity::getMaintProc() const
58a906c940SMatt Spinler {
59a906c940SMatt Spinler     if (hasMP())
60a906c940SMatt Spinler     {
61a906c940SMatt Spinler         // NULL terminated
62a906c940SMatt Spinler         std::string mp{_pnOrProcedureID.data()};
63a906c940SMatt Spinler         return mp;
64a906c940SMatt Spinler     }
65a906c940SMatt Spinler 
66a906c940SMatt Spinler     return std::nullopt;
67a906c940SMatt Spinler }
68a906c940SMatt Spinler 
69a906c940SMatt Spinler std::optional<std::string> FRUIdentity::getCCIN() const
70a906c940SMatt Spinler {
71a906c940SMatt Spinler     if (hasCCIN())
72a906c940SMatt Spinler     {
73a906c940SMatt Spinler         std::string ccin{_ccin.begin(), _ccin.begin() + _ccin.size()};
74a906c940SMatt Spinler         return ccin;
75a906c940SMatt Spinler     }
76a906c940SMatt Spinler 
77a906c940SMatt Spinler     return std::nullopt;
78a906c940SMatt Spinler }
79a906c940SMatt Spinler 
80a906c940SMatt Spinler std::optional<std::string> FRUIdentity::getSN() const
81a906c940SMatt Spinler {
82a906c940SMatt Spinler     if (hasSN())
83a906c940SMatt Spinler     {
84a906c940SMatt Spinler         std::string sn{_sn.begin(), _sn.begin() + _sn.size()};
85a906c940SMatt Spinler         return sn;
86a906c940SMatt Spinler     }
87a906c940SMatt Spinler 
88a906c940SMatt Spinler     return std::nullopt;
89a906c940SMatt Spinler }
90a906c940SMatt Spinler 
91*724d0d8cSMatt Spinler void FRUIdentity::flatten(Stream& pel) const
92a906c940SMatt Spinler {
93a906c940SMatt Spinler     pel << _type << _size << _flags;
94a906c940SMatt Spinler 
95a906c940SMatt Spinler     if (hasPN() || hasMP())
96a906c940SMatt Spinler     {
97a906c940SMatt Spinler         pel.write(_pnOrProcedureID.data(), _pnOrProcedureID.size());
98a906c940SMatt Spinler     }
99a906c940SMatt Spinler 
100a906c940SMatt Spinler     if (hasCCIN())
101a906c940SMatt Spinler     {
102a906c940SMatt Spinler         pel.write(_ccin.data(), _ccin.size());
103a906c940SMatt Spinler     }
104a906c940SMatt Spinler 
105a906c940SMatt Spinler     if (hasSN())
106a906c940SMatt Spinler     {
107a906c940SMatt Spinler         pel.write(_sn.data(), _sn.size());
108a906c940SMatt Spinler     }
109a906c940SMatt Spinler }
110a906c940SMatt Spinler 
111a906c940SMatt Spinler } // namespace src
112a906c940SMatt Spinler } // namespace pels
113a906c940SMatt Spinler } // namespace openpower
114