xref: /openbmc/entity-manager/src/devices.hpp (revision b7077437d4a6b2cc935e1ba8d71f365ed324eb41)
1a5d25dccSAndrew Jeffery /*
2a5d25dccSAndrew Jeffery // Copyright (c) 2018 Intel Corporation
3a5d25dccSAndrew Jeffery //
4a5d25dccSAndrew Jeffery // Licensed under the Apache License, Version 2.0 (the "License");
5a5d25dccSAndrew Jeffery // you may not use this file except in compliance with the License.
6a5d25dccSAndrew Jeffery // You may obtain a copy of the License at
7a5d25dccSAndrew Jeffery //
8a5d25dccSAndrew Jeffery //      http://www.apache.org/licenses/LICENSE-2.0
9a5d25dccSAndrew Jeffery //
10a5d25dccSAndrew Jeffery // Unless required by applicable law or agreed to in writing, software
11a5d25dccSAndrew Jeffery // distributed under the License is distributed on an "AS IS" BASIS,
12a5d25dccSAndrew Jeffery // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13a5d25dccSAndrew Jeffery // See the License for the specific language governing permissions and
14a5d25dccSAndrew Jeffery // limitations under the License.
15a5d25dccSAndrew Jeffery */
16a5d25dccSAndrew Jeffery /// \file devices.hpp
17a5d25dccSAndrew Jeffery 
18a5d25dccSAndrew Jeffery #pragma once
19a5d25dccSAndrew Jeffery #include <boost/container/flat_map.hpp>
20a5d25dccSAndrew Jeffery 
21a5d25dccSAndrew Jeffery namespace devices
22a5d25dccSAndrew Jeffery {
23a5d25dccSAndrew Jeffery 
24a5d25dccSAndrew Jeffery struct CmpStr
25a5d25dccSAndrew Jeffery {
operator ()devices::CmpStr26a5d25dccSAndrew Jeffery     bool operator()(const char* a, const char* b) const
27a5d25dccSAndrew Jeffery     {
28a5d25dccSAndrew Jeffery         return std::strcmp(a, b) < 0;
29a5d25dccSAndrew Jeffery     }
30a5d25dccSAndrew Jeffery };
31a5d25dccSAndrew Jeffery 
32a5d25dccSAndrew Jeffery // I2C device drivers may create a /hwmon subdirectory. For example the tmp75
33a5d25dccSAndrew Jeffery // driver creates a /sys/bus/i2c/devices/<busnum>-<i2caddr>/hwmon
34a5d25dccSAndrew Jeffery // directory. The sensor code relies on the presence of the /hwmon
35a5d25dccSAndrew Jeffery // subdirectory to collect sensor readings. Initialization of this subdir is
36a5d25dccSAndrew Jeffery // not reliable. I2C devices flagged with hasHWMonDir are tested for correct
37a5d25dccSAndrew Jeffery // initialization, and when a failure is detected the device is deleted, and
38a5d25dccSAndrew Jeffery // then recreated. The default is to retry 5 times before moving to the next
39a5d25dccSAndrew Jeffery // device.
40a5d25dccSAndrew Jeffery 
41a5d25dccSAndrew Jeffery // Devices such as I2C EEPROMs do not generate this file structure. These
42a5d25dccSAndrew Jeffery // kinds of devices are flagged using the noHWMonDir enumeration. The
43a5d25dccSAndrew Jeffery // expectation is they are created correctly on the first attempt.
44a5d25dccSAndrew Jeffery 
45a5d25dccSAndrew Jeffery // This enumeration class exists to reduce copy/paste errors. It is easy to
46a5d25dccSAndrew Jeffery // overlook the trailing parameter in the ExportTemplate structure when it is
47a5d25dccSAndrew Jeffery // a simple boolean.
48a5d25dccSAndrew Jeffery enum class createsHWMon : bool
49a5d25dccSAndrew Jeffery {
50a5d25dccSAndrew Jeffery     noHWMonDir,
51a5d25dccSAndrew Jeffery     hasHWMonDir
52a5d25dccSAndrew Jeffery };
53a5d25dccSAndrew Jeffery 
54a5d25dccSAndrew Jeffery struct ExportTemplate
55a5d25dccSAndrew Jeffery {
ExportTemplatedevices::ExportTemplate56a5d25dccSAndrew Jeffery     ExportTemplate(const char* params, const char* bus, const char* constructor,
57a5d25dccSAndrew Jeffery                    const char* destructor, createsHWMon hasHWMonDir) :
58*b7077437SPatrick Williams         parameters(params), busPath(bus), add(constructor), remove(destructor),
59a5d25dccSAndrew Jeffery         hasHWMonDir(hasHWMonDir) {};
60a5d25dccSAndrew Jeffery     const char* parameters;
61a5d25dccSAndrew Jeffery     const char* busPath;
62a5d25dccSAndrew Jeffery     const char* add;
63a5d25dccSAndrew Jeffery     const char* remove;
64a5d25dccSAndrew Jeffery     createsHWMon hasHWMonDir;
65a5d25dccSAndrew Jeffery };
66a5d25dccSAndrew Jeffery 
67a5d25dccSAndrew Jeffery const boost::container::flat_map<const char*, ExportTemplate, CmpStr>
68a5d25dccSAndrew Jeffery     exportTemplates{
69a5d25dccSAndrew Jeffery         {{"EEPROM_24C01",
70a5d25dccSAndrew Jeffery           ExportTemplate("24c01 $Address", "/sys/bus/i2c/devices/i2c-$Bus",
71a5d25dccSAndrew Jeffery                          "new_device", "delete_device",
72a5d25dccSAndrew Jeffery                          createsHWMon::noHWMonDir)},
73a5d25dccSAndrew Jeffery          {"EEPROM_24C02",
74a5d25dccSAndrew Jeffery           ExportTemplate("24c02 $Address", "/sys/bus/i2c/devices/i2c-$Bus",
75a5d25dccSAndrew Jeffery                          "new_device", "delete_device",
76a5d25dccSAndrew Jeffery                          createsHWMon::noHWMonDir)},
77a5d25dccSAndrew Jeffery          {"EEPROM_24C04",
78a5d25dccSAndrew Jeffery           ExportTemplate("24c04 $Address", "/sys/bus/i2c/devices/i2c-$Bus",
79a5d25dccSAndrew Jeffery                          "new_device", "delete_device",
80a5d25dccSAndrew Jeffery                          createsHWMon::noHWMonDir)},
81a5d25dccSAndrew Jeffery          {"EEPROM_24C08",
82a5d25dccSAndrew Jeffery           ExportTemplate("24c08 $Address", "/sys/bus/i2c/devices/i2c-$Bus",
83a5d25dccSAndrew Jeffery                          "new_device", "delete_device",
84a5d25dccSAndrew Jeffery                          createsHWMon::noHWMonDir)},
85a5d25dccSAndrew Jeffery          {"EEPROM_24C16",
86a5d25dccSAndrew Jeffery           ExportTemplate("24c16 $Address", "/sys/bus/i2c/devices/i2c-$Bus",
87a5d25dccSAndrew Jeffery                          "new_device", "delete_device",
88a5d25dccSAndrew Jeffery                          createsHWMon::noHWMonDir)},
89a5d25dccSAndrew Jeffery          {"EEPROM_24C32",
90a5d25dccSAndrew Jeffery           ExportTemplate("24c32 $Address", "/sys/bus/i2c/devices/i2c-$Bus",
91a5d25dccSAndrew Jeffery                          "new_device", "delete_device",
92a5d25dccSAndrew Jeffery                          createsHWMon::noHWMonDir)},
93a5d25dccSAndrew Jeffery          {"EEPROM_24C64",
94a5d25dccSAndrew Jeffery           ExportTemplate("24c64 $Address", "/sys/bus/i2c/devices/i2c-$Bus",
95a5d25dccSAndrew Jeffery                          "new_device", "delete_device",
96a5d25dccSAndrew Jeffery                          createsHWMon::noHWMonDir)},
97a5d25dccSAndrew Jeffery          {"EEPROM_24C128",
98a5d25dccSAndrew Jeffery           ExportTemplate("24c128 $Address", "/sys/bus/i2c/devices/i2c-$Bus",
99a5d25dccSAndrew Jeffery                          "new_device", "delete_device",
100a5d25dccSAndrew Jeffery                          createsHWMon::noHWMonDir)},
101a5d25dccSAndrew Jeffery          {"EEPROM_24C256",
102a5d25dccSAndrew Jeffery           ExportTemplate("24c256 $Address", "/sys/bus/i2c/devices/i2c-$Bus",
103a5d25dccSAndrew Jeffery                          "new_device", "delete_device",
104a5d25dccSAndrew Jeffery                          createsHWMon::noHWMonDir)},
105a5d25dccSAndrew Jeffery          {"ADS1015",
106a5d25dccSAndrew Jeffery           ExportTemplate("ads1015 $Address", "/sys/bus/i2c/devices/i2c-$Bus",
107a5d25dccSAndrew Jeffery                          "new_device", "delete_device",
108a5d25dccSAndrew Jeffery                          createsHWMon::noHWMonDir)},
109a5d25dccSAndrew Jeffery          {"ADS7828",
110a5d25dccSAndrew Jeffery           ExportTemplate("ads7828 $Address", "/sys/bus/i2c/devices/i2c-$Bus",
111a5d25dccSAndrew Jeffery                          "new_device", "delete_device",
112a5d25dccSAndrew Jeffery                          createsHWMon::noHWMonDir)},
113a5d25dccSAndrew Jeffery          {"EEPROM",
114a5d25dccSAndrew Jeffery           ExportTemplate("eeprom $Address", "/sys/bus/i2c/devices/i2c-$Bus",
115a5d25dccSAndrew Jeffery                          "new_device", "delete_device",
116a5d25dccSAndrew Jeffery                          createsHWMon::noHWMonDir)},
117a5d25dccSAndrew Jeffery          {"Gpio", ExportTemplate("$Index", "/sys/class/gpio", "export",
118a5d25dccSAndrew Jeffery                                  "unexport", createsHWMon::noHWMonDir)},
119a591d6c0STingting Chen          {"IPSPS1",
120a591d6c0STingting Chen           ExportTemplate("ipsps1 $Address", "/sys/bus/i2c/devices/i2c-$Bus",
121a591d6c0STingting Chen                          "new_device", "delete_device",
122a591d6c0STingting Chen                          createsHWMon::hasHWMonDir)},
123a5d25dccSAndrew Jeffery          {"MAX34440",
124a5d25dccSAndrew Jeffery           ExportTemplate("max34440 $Address", "/sys/bus/i2c/devices/i2c-$Bus",
125a5d25dccSAndrew Jeffery                          "new_device", "delete_device",
126a5d25dccSAndrew Jeffery                          createsHWMon::hasHWMonDir)},
127a591d6c0STingting Chen          {"PCA9537",
128a591d6c0STingting Chen           ExportTemplate("pca9537 $Address", "/sys/bus/i2c/devices/i2c-$Bus",
129a591d6c0STingting Chen                          "new_device", "delete_device",
130a591d6c0STingting Chen                          createsHWMon::noHWMonDir)},
131a5d25dccSAndrew Jeffery          {"PCA9542Mux",
132a5d25dccSAndrew Jeffery           ExportTemplate("pca9542 $Address", "/sys/bus/i2c/devices/i2c-$Bus",
133a5d25dccSAndrew Jeffery                          "new_device", "delete_device",
134a5d25dccSAndrew Jeffery                          createsHWMon::noHWMonDir)},
135a5d25dccSAndrew Jeffery          {"PCA9543Mux",
136a5d25dccSAndrew Jeffery           ExportTemplate("pca9543 $Address", "/sys/bus/i2c/devices/i2c-$Bus",
137a5d25dccSAndrew Jeffery                          "new_device", "delete_device",
138a5d25dccSAndrew Jeffery                          createsHWMon::noHWMonDir)},
139a5d25dccSAndrew Jeffery          {"PCA9544Mux",
140a5d25dccSAndrew Jeffery           ExportTemplate("pca9544 $Address", "/sys/bus/i2c/devices/i2c-$Bus",
141a5d25dccSAndrew Jeffery                          "new_device", "delete_device",
142a5d25dccSAndrew Jeffery                          createsHWMon::noHWMonDir)},
143a5d25dccSAndrew Jeffery          {"PCA9545Mux",
144a5d25dccSAndrew Jeffery           ExportTemplate("pca9545 $Address", "/sys/bus/i2c/devices/i2c-$Bus",
145a5d25dccSAndrew Jeffery                          "new_device", "delete_device",
146a5d25dccSAndrew Jeffery                          createsHWMon::noHWMonDir)},
147a5d25dccSAndrew Jeffery          {"PCA9546Mux",
148a5d25dccSAndrew Jeffery           ExportTemplate("pca9546 $Address", "/sys/bus/i2c/devices/i2c-$Bus",
149a5d25dccSAndrew Jeffery                          "new_device", "delete_device",
150a5d25dccSAndrew Jeffery                          createsHWMon::noHWMonDir)},
151a5d25dccSAndrew Jeffery          {"PCA9547Mux",
152a5d25dccSAndrew Jeffery           ExportTemplate("pca9547 $Address", "/sys/bus/i2c/devices/i2c-$Bus",
153a5d25dccSAndrew Jeffery                          "new_device", "delete_device",
154a5d25dccSAndrew Jeffery                          createsHWMon::noHWMonDir)},
155a5d25dccSAndrew Jeffery          {"PCA9548Mux",
156a5d25dccSAndrew Jeffery           ExportTemplate("pca9548 $Address", "/sys/bus/i2c/devices/i2c-$Bus",
157a5d25dccSAndrew Jeffery                          "new_device", "delete_device",
158a5d25dccSAndrew Jeffery                          createsHWMon::noHWMonDir)},
159a5d25dccSAndrew Jeffery          {"PCA9846Mux",
160a5d25dccSAndrew Jeffery           ExportTemplate("pca9846 $Address", "/sys/bus/i2c/devices/i2c-$Bus",
161a5d25dccSAndrew Jeffery                          "new_device", "delete_device",
162a5d25dccSAndrew Jeffery                          createsHWMon::noHWMonDir)},
163a5d25dccSAndrew Jeffery          {"PCA9847Mux",
164a5d25dccSAndrew Jeffery           ExportTemplate("pca9847 $Address", "/sys/bus/i2c/devices/i2c-$Bus",
165a5d25dccSAndrew Jeffery                          "new_device", "delete_device",
166a5d25dccSAndrew Jeffery                          createsHWMon::noHWMonDir)},
167a5d25dccSAndrew Jeffery          {"PCA9848Mux",
168a5d25dccSAndrew Jeffery           ExportTemplate("pca9848 $Address", "/sys/bus/i2c/devices/i2c-$Bus",
169a5d25dccSAndrew Jeffery                          "new_device", "delete_device",
170a5d25dccSAndrew Jeffery                          createsHWMon::noHWMonDir)},
171a5d25dccSAndrew Jeffery          {"PCA9849Mux",
172a5d25dccSAndrew Jeffery           ExportTemplate("pca9849 $Address", "/sys/bus/i2c/devices/i2c-$Bus",
173a5d25dccSAndrew Jeffery                          "new_device", "delete_device",
174a5d25dccSAndrew Jeffery                          createsHWMon::noHWMonDir)},
175a5d25dccSAndrew Jeffery          {"SIC450",
176a5d25dccSAndrew Jeffery           ExportTemplate("sic450 $Address", "/sys/bus/i2c/devices/i2c-$Bus",
177a5d25dccSAndrew Jeffery                          "new_device", "delete_device",
178a5d25dccSAndrew Jeffery                          createsHWMon::hasHWMonDir)},
179a5d25dccSAndrew Jeffery          {"Q50SN12072",
180a5d25dccSAndrew Jeffery           ExportTemplate("q50sn12072 $Address", "/sys/bus/i2c/devices/i2c-$Bus",
181a5d25dccSAndrew Jeffery                          "new_device", "delete_device",
182a5d25dccSAndrew Jeffery                          createsHWMon::hasHWMonDir)},
183a5d25dccSAndrew Jeffery          {"MAX31790",
184a5d25dccSAndrew Jeffery           ExportTemplate("max31790 $Address", "/sys/bus/i2c/devices/i2c-$Bus",
185a5d25dccSAndrew Jeffery                          "new_device", "delete_device",
186a5d25dccSAndrew Jeffery                          createsHWMon::hasHWMonDir)},
1875e9a3055SSaitwal, Meghan          {"PIC32", ExportTemplate("pic32 $Address",
1885e9a3055SSaitwal, Meghan                                   "/sys/bus/i2c/devices/i2c-$Bus", "new_device",
1895e9a3055SSaitwal, Meghan                                   "delete_device", createsHWMon::hasHWMonDir)},
190a591d6c0STingting Chen          {"INA226",
191a591d6c0STingting Chen           ExportTemplate("ina226 $Address", "/sys/bus/i2c/devices/i2c-$Bus",
192a591d6c0STingting Chen                          "new_device", "delete_device",
193a591d6c0STingting Chen                          createsHWMon::hasHWMonDir)},
194a5d25dccSAndrew Jeffery          {"RAA229620",
195a5d25dccSAndrew Jeffery           ExportTemplate("raa229620 $Address", "/sys/bus/i2c/devices/i2c-$Bus",
196a5d25dccSAndrew Jeffery                          "new_device", "delete_device",
197a5d25dccSAndrew Jeffery                          createsHWMon::hasHWMonDir)},
198a5d25dccSAndrew Jeffery          {"RAA229621",
199a5d25dccSAndrew Jeffery           ExportTemplate("raa229621 $Address", "/sys/bus/i2c/devices/i2c-$Bus",
200a5d25dccSAndrew Jeffery                          "new_device", "delete_device",
201a5d25dccSAndrew Jeffery                          createsHWMon::hasHWMonDir)},
202e7fb111cSMatt Simmering          {"PIC32",
203e7fb111cSMatt Simmering           ExportTemplate("pic32 $Address", "/sys/bus/i2c/devices/i2c-$Bus",
204016f1219SKonstantin Aladyshev                          "new_device", "delete_device",
205a5d25dccSAndrew Jeffery                          createsHWMon::hasHWMonDir)}}};
206a5d25dccSAndrew Jeffery } // namespace devices
207