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