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