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