Lines Matching +full:auto +full:- +full:i2c

1 // SPDX-License-Identifier: Apache-2.0
2 // SPDX-FileCopyrightText: Copyright 2018 Intel Corporation
14 #include <phosphor-logging/lg2.hpp>
44 #include <i2c/smbus.h>
45 #include <linux/i2c-dev.h>
63 // NOLINTBEGIN(cppcoreguidelines-avoid-non-const-global-variables)
75 // NOLINTEND(cppcoreguidelines-avoid-non-const-global-variables)
91 output << "/sys/bus/i2c/devices/" << bus << "-" << std::right in getEepromPath()
99 auto path = getEepromPath(bus, address); in hasEepromFile()
112 auto result = lseek(fd, offset, SEEK_SET); in readFromEeprom()
116 return -1; in readFromEeprom()
124 auto findBus = busName.rfind('-'); in busStrToInt()
127 return -1; in busStrToInt()
138 auto ec = std::error_code(); in getRootBus()
139 auto path = std::filesystem::read_symlink( in getRootBus()
141 "/sys/bus/i2c/devices/i2c-" + std::to_string(bus) + "/mux_device"), in getRootBus()
145 return -1; in getRootBus()
149 auto findBus = filename.find('-'); in getRootBus()
152 return -1; in getRootBus()
159 auto ec = std::error_code(); in isMuxBus()
160 auto isSymlink = in isMuxBus()
161 is_symlink(std::filesystem::path("/sys/bus/i2c/devices/i2c-" + in isMuxBus()
174 auto [it, success] = foundDevices.emplace( in makeProbeInterface()
184 it->second->register_property("Bus", bus); in makeProbeInterface()
185 it->second->register_property("Address", address); in makeProbeInterface()
186 it->second->initialize(); in makeProbeInterface()
189 // Issue an I2C transaction to first write to_target_buf_len bytes,then read
198 return -1; in i2cSmbusWriteThenRead()
219 return (ret == static_cast<int>(msgs.size())) ? msgs[1].len : -1; in i2cSmbusWriteThenRead()
249 // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast) in readData()
255 // --------
260 // Set the higher data word address bits to 0. It's safe on 8-bit in isDevice16BitMode1()
293 // --------
302 // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast) in isDevice16BitMode2()
345 // TODO: This code is very similar to the non-eeprom version and can be merged
349 auto path = getEepromPath(bus, address); in processEeprom()
360 auto readFunc = [file](off_t offset, size_t length, uint8_t* outbuf) { in processEeprom()
376 std::string path = "/sys/bus/i2c/devices/i2c-" + std::to_string(i2cBus); in findI2CEeproms()
378 // For each file listed under the i2c device in findI2CEeproms()
381 auto ec = std::error_code(); in findI2CEeproms()
382 for (const auto& p : fs::directory_iterator(path, ec)) in findI2CEeproms()
392 std::regex_match(node, m, std::regex(".+\\d+-([0-9abcdef]+$)")); in findI2CEeproms()
433 devices->emplace(address, device); in findI2CEeproms()
452 // if this issue was resolved if the i2c bus device was closed, but in getBusFRUs()
455 // Scan for i2c eeproms loaded on this bus. in getBusFRUs()
463 auto busFind = busBlocklist.find(bus); in getBusFRUs()
466 if (busFind->second != std::nullopt) in getBusFRUs()
468 for (const auto& address : *(busFind->second)) in getBusFRUs()
480 auto rootBusFind = busBlocklist.find(rootBus); in getBusFRUs()
483 if (rootBusFind->second != std::nullopt) in getBusFRUs()
485 for (const auto& rootAddress : *(rootBusFind->second)) in getBusFRUs()
539 if (rootFailures->contains(ii)) in getBusFRUs()
559 auto readFunc = [is16BitBool, file, in getBusFRUs()
574 // otherwise garbage is read. e.g. SuperMicro PWS 920P-SQ in getBusFRUs()
576 auto readFunc = in getBusFRUs()
591 devices->emplace(ii, pair.first); in getBusFRUs()
606 return -1; in getBusFRUs()
621 auto addrIt = data.find("addresses"); in loadAddressBlocklist()
627 const auto* const addr = in loadAddressBlocklist()
638 for (const auto& address : *addr) in loadAddressBlocklist()
640 const auto* addrS = address.get_ptr<const std::string*>(); in loadAddressBlocklist()
647 if (!(addrS->starts_with("0x") || addrS->starts_with("0X"))) in loadAddressBlocklist()
656 // NOLINTBEGIN(cppcoreguidelines-pro-bounds-pointer-arithmetic) in loadAddressBlocklist()
658 auto [ptr, ec] = std::from_chars( in loadAddressBlocklist()
659 addrS->data() + 2, addrS->data() + addrS->length(), addressInt, 16); in loadAddressBlocklist()
661 const auto erc = std::make_error_condition(ec); in loadAddressBlocklist()
662 if (ptr != (addrS->data() + addrS->length()) || erc) in loadAddressBlocklist()
668 // NOLINTEND(cppcoreguidelines-pro-bounds-pointer-arithmetic) in loadAddressBlocklist()
715 auto buses = data.at("buses"); in loadBlocklist()
723 // Catch exception here for type mis-match. in loadBlocklist()
726 for (const auto& busIterator : buses) in loadBlocklist()
732 auto busData = busIterator.at("bus"); in loadBlocklist()
733 auto bus = busData.get<size_t>(); in loadBlocklist()
735 auto addressData = busIterator.at("addresses"); in loadBlocklist()
736 auto addresses = in loadBlocklist()
739 auto& block = busBlocklist[bus].emplace(); in loadBlocklist()
740 for (const auto& address : addresses) in loadBlocklist()
757 // Type mis-match is a critical error. in loadBlocklist()
763 const auto [rc, addressBlocklist] = loadAddressBlocklist(data); in loadBlocklist() local
777 for (const auto& i2cBus : i2cBuses) in findI2CDevices()
786 auto busFind = busBlocklist.find(bus); in findI2CDevices()
789 if (busFind->second == std::nullopt) in findI2CDevices()
795 auto rootBusFind = busBlocklist.find(rootBus); in findI2CDevices()
798 if (rootBusFind->second == std::nullopt) in findI2CDevices()
804 auto file = open(i2cBus.c_str(), O_RDWR); in findI2CDevices()
807 lg2::error("unable to open i2c device {PATH}", "PATH", in findI2CDevices()
829 auto& device = busmap[bus]; in findI2CDevices()
845 // this class allows an async response after all i2c devices are discovered
911 iface->register_method( in addFruObjectToDbus()
931 for (auto property : formattedFRU) in addFruObjectToDbus()
946 iface->register_property( in addFruObjectToDbus()
970 else if (!iface->register_property(key, property.second + '\0')) in addFruObjectToDbus()
979 iface->register_property("BUS", bus); in addFruObjectToDbus()
980 iface->register_property("ADDRESS", address); in addFruObjectToDbus()
982 iface->initialize(); in addFruObjectToDbus()
995 // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast) in readBaseboardFRU()
1031 // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast) in writeFRU()
1039 auto path = getEepromPath(bus, address); in writeFRU()
1045 lg2::error("unable to open i2c device {PATH}", "PATH", path); in writeFRU()
1052 auto readFunc = [eeprom](off_t offset, size_t length, uint8_t* outbuf) { in writeFRU()
1057 auto sections = findFRUHeader(reader, errorMessage, 0); in writeFRU()
1064 offset = sections->IpmiFruOffset; in writeFRU()
1078 lg2::error("unable to write to i2c device {PATH}", "PATH", path); in writeFRU()
1088 std::string i2cBus = "/dev/i2c-" + std::to_string(bus); in writeFRU()
1093 lg2::error("unable to open i2c device {PATH}", "PATH", i2cBus); in writeFRU()
1127 if ((retries--) == 0U) in writeFRU()
1140 // most eeproms require 5-10ms between writes in writeFRU()
1156 for (auto device = foundDevices.begin(); device != foundDevices.end();) in rescanOneBus()
1158 if (device->first.first == static_cast<size_t>(busNum)) in rescanOneBus()
1160 objServer.remove_interface(device->second); in rescanOneBus()
1169 fs::path busPath = fs::path("/dev/i2c-" + std::to_string(busNum)); in rescanOneBus()
1174 lg2::error("Unable to access i2c bus {BUS}", "BUS", in rescanOneBus()
1184 auto scan = std::make_shared<FindDevicesWithCallback>( in rescanOneBus()
1188 for (auto busIface = dbusInterfaceMap.begin(); in rescanOneBus()
1191 if (busIface->first.first == static_cast<size_t>(busNum)) in rescanOneBus()
1193 objServer.remove_interface(busIface->second); in rescanOneBus()
1201 auto found = busmap.find(busNum); in rescanOneBus()
1202 if (found == busmap.end() || found->second == nullptr) in rescanOneBus()
1206 for (auto device : *(found->second)) in rescanOneBus()
1214 scan->run(); in rescanOneBus()
1242 auto devDir = fs::path("/dev/"); in rescanBusses()
1248 lg2::error("unable to find i2c devices"); in rescanBusses()
1252 for (const auto& busPath : busPaths) in rescanBusses()
1258 for (auto [pair, interface] : foundDevices) in rescanBusses()
1264 auto scan = std::make_shared<FindDevicesWithCallback>( in rescanBusses()
1266 for (auto busIface : dbusInterfaceMap) in rescanBusses()
1278 // If no device on i2c bus 0, the insertion will happen. in rescanBusses()
1279 auto bus0 = in rescanBusses()
1281 bus0.first->second->emplace(0, baseboardFRU); in rescanBusses()
1283 for (auto devicemap : busmap) in rescanBusses()
1285 for (auto device : *devicemap.second) in rescanBusses()
1294 scan->run(); in rescanBusses()
1343 auto systemBus = std::make_shared<sdbusplus::asio::connection>(io); in main()
1348 auto devDir = fs::path("/dev/"); in main()
1349 auto matchString = std::string(R"(i2c-\d+$)"); in main()
1354 lg2::error("unable to find i2c devices"); in main()
1361 auto addressBlocklist = loadBlocklist(blocklistPath); in main()
1363 systemBus->request_name("xyz.openbmc_project.FruDevice"); in main()
1375 iface->register_method("ReScan", [&]() { in main()
1380 iface->register_method("ReScanBus", [&](uint16_t bus) { in main()
1385 iface->register_method("GetRawFru", getFRUInfo); in main()
1387 iface->register_method( in main()
1399 iface->initialize(); in main()
1408 auto findState = values.find("CurrentHostState"); in main()
1411 if (std::get<std::string>(findState->second) == in main()
1435 // monitor for new i2c devices in main()
1449 // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast) in main()
1450 const auto* iEvent = reinterpret_cast<const inotify_event*>(p); in main()
1451 switch (iEvent->mask) in main()
1457 std::string_view name(&iEvent->name[0], iEvent->len); in main()
1458 if (name.starts_with("i2c")) in main()
1486 index += sizeof(inotify_event) + iEvent->len; in main()