diff --git a/include/CPUSensor.hpp b/include/CPUSensor.hpp
index 5f48674..7a2819f 100644
--- a/include/CPUSensor.hpp
+++ b/include/CPUSensor.hpp
@@ -49,74 +49,57 @@
 
 // this is added to cpusensor.hpp to avoid having every sensor have to link
 // against libgpiod, if another sensor needs it we may move it to utils
-inline bool hostIsPresent(size_t gpioNum)
+inline bool cpuIsPresent(
+    const boost::container::flat_map<std::string, BasicVariantType>& gpioConfig)
 {
-    static boost::container::flat_map<size_t, bool> cpuPresence;
+    static boost::container::flat_map<std::string, bool> cpuPresence;
 
-    auto findIndex = cpuPresence.find(gpioNum);
+    auto findName = gpioConfig.find("Name");
+    if (findName == gpioConfig.end())
+    {
+        return false;
+    }
+    std::string gpioName =
+        std::visit(VariantToStringVisitor(), findName->second);
+
+    auto findIndex = cpuPresence.find(gpioName);
     if (findIndex != cpuPresence.end())
     {
         return findIndex->second;
     }
 
-    constexpr size_t sgpioBase = 232;
-
-    // check if sysfs has device
-    bool sysfs = std::filesystem::exists(gpioPath + std::string("gpio") +
-                                         std::to_string(gpioNum));
-
-    // todo: delete this when we remove all sysfs code
-    if (sysfs)
+    bool activeHigh = true;
+    auto findPolarity = gpioConfig.find("Polarity");
+    if (findPolarity != gpioConfig.end())
     {
-        // close it, we'll reopen it at the end
-        std::ofstream unexport(gpioPath + std::string("unexport"));
-        if (unexport.good())
+        if (std::string("Low") ==
+            std::visit(VariantToStringVisitor(), findPolarity->second))
         {
-            unexport << gpioNum;
-        }
-        else
-        {
-            std::cerr << "Error cleaning up sysfs device\n";
+            activeHigh = false;
         }
     }
 
-    size_t chipNum = (gpioNum - sgpioBase) / 8;
-    size_t index = (gpioNum - sgpioBase) % 8;
-    gpiod::chip chip("gpiochip" + std::to_string(chipNum));
-    auto line = chip.get_line(index);
-
+    auto line = gpiod::find_line(gpioName);
     if (!line)
     {
-        std::cerr << "Error requesting gpio\n";
-        return true;
+        std::cerr << "Error requesting gpio: " << gpioName << "\n";
+        return false;
     }
 
-    bool resp = true;
+    bool resp;
     try
     {
-        line.request({"adcsensor", gpiod::line_request::DIRECTION_INPUT, 0});
-        resp = !line.get_value();
+        line.request({"cpusensor", gpiod::line_request::DIRECTION_INPUT,
+                      activeHigh ? 0 : gpiod::line_request::FLAG_ACTIVE_LOW});
+        resp = line.get_value();
     }
     catch (std::system_error&)
     {
-        std::cerr << "Error reading gpio\n";
-        return true;
+        std::cerr << "Error reading gpio: " << gpioName << "\n";
+        return false;
     }
 
-    // todo: delete this when we remove all sysfs code
-    if (sysfs)
-    {
-        // reopen it
-        std::ofstream populate(gpioPath + std::string("export"));
-        if (populate.good())
-        {
-            populate << gpioNum;
-        }
-        else
-        {
-            std::cerr << "Error cleaning up sysfs device\n";
-        }
-    }
-    cpuPresence[gpioNum] = resp;
+    cpuPresence[gpioName] = resp;
+
     return resp;
 }
diff --git a/src/CPUSensorMain.cpp b/src/CPUSensorMain.cpp
index 2588221..2a3ff16 100644
--- a/src/CPUSensorMain.cpp
+++ b/src/CPUSensorMain.cpp
@@ -182,9 +182,7 @@
         std::string sensorType;
         const SensorData* sensorData = nullptr;
         const std::string* interfacePath = nullptr;
-        const std::pair<std::string, boost::container::flat_map<
-                                         std::string, BasicVariantType>>*
-            baseConfiguration = nullptr;
+        const SensorBaseConfiguration* baseConfiguration = nullptr;
 
         for (const std::pair<sdbusplus::message::object_path, SensorData>&
                  sensor : sensorConfigs)
@@ -554,17 +552,14 @@
         useCache = true;
     }
 
-    // check PECI client addresses and DT overlay names from CPU configuration
+    // check PECI client addresses and names from CPU configuration
     // before starting ping operation
     for (const char* type : sensorTypes)
     {
         for (const std::pair<sdbusplus::message::object_path, SensorData>&
                  sensor : sensorConfigs)
         {
-            for (const std::pair<
-                     std::string,
-                     boost::container::flat_map<std::string, BasicVariantType>>&
-                     config : sensor.second)
+            for (const SensorBaseConfiguration& config : sensor.second)
             {
                 if ((configPrefix + std::string(type)) != config.first)
                 {
@@ -581,26 +576,30 @@
                 std::string name =
                     std::regex_replace(nameRaw, illegalDbusRegex, "_");
 
-                auto findCpuGpio = config.second.find("PresenceGpio");
-                if (findCpuGpio != config.second.end())
+                bool present = true;
+                for (const SensorBaseConfiguration& suppConfig : sensor.second)
                 {
-                    size_t gpio = std::visit(VariantToUnsignedIntVisitor(),
-                                             findCpuGpio->second);
-                    bool present = hostIsPresent(gpio);
-                    if (inventoryIfaces.find(name) == inventoryIfaces.end())
+                    if (suppConfig.first.find("PresenceGpio") !=
+                        std::string::npos)
                     {
-                        auto iface = objectServer.add_interface(
-                            cpuInventoryPath + std::string("/") + name,
-                            "xyz.openbmc_project.Inventory.Item");
-                        iface->register_property("PrettyName", name);
-                        iface->register_property("Present", present);
-                        iface->initialize();
-                        inventoryIfaces[name] = std::move(iface);
+                        present = cpuIsPresent(suppConfig.second);
+                        break;
                     }
-                    if (!present)
-                    {
-                        continue; // no reason to look for non present cpu
-                    }
+                }
+
+                if (inventoryIfaces.find(name) == inventoryIfaces.end())
+                {
+                    auto iface = objectServer.add_interface(
+                        cpuInventoryPath + std::string("/") + name,
+                        "xyz.openbmc_project.Inventory.Item");
+                    iface->register_property("PrettyName", name);
+                    iface->register_property("Present", present);
+                    iface->initialize();
+                    inventoryIfaces[name] = std::move(iface);
+                }
+                if (!present)
+                {
+                    continue; // no reason to look for non present cpu
                 }
 
                 auto findBus = config.second.find("Bus");
