diff --git a/fpga/include/villas/fpga/card.hpp b/fpga/include/villas/fpga/card.hpp index 82196401f..09ed0ecde 100644 --- a/fpga/include/villas/fpga/card.hpp +++ b/fpga/include/villas/fpga/card.hpp @@ -10,6 +10,8 @@ #pragma once +#include + #include #include @@ -25,6 +27,8 @@ public: std::shared_ptr vfioContainer; std::shared_ptr vfioDevice; + std::list ignored_ip_names; + // Slave address space ID to access the PCIe address space from the // FPGA MemoryManager::AddressSpaceId addrSpaceIdDeviceToHost; diff --git a/fpga/include/villas/fpga/card_parser.hpp b/fpga/include/villas/fpga/card_parser.hpp index 92c9124a5..587639443 100644 --- a/fpga/include/villas/fpga/card_parser.hpp +++ b/fpga/include/villas/fpga/card_parser.hpp @@ -1,5 +1,8 @@ #pragma once +#include +#include + #include #include #include @@ -16,13 +19,25 @@ public: int do_reset = 0; int affinity = 0; int polling = 0; + std::list ignored_ip_names; CardParser(json_t *json_card) : logger(villas::Log::get("CardParser")) { json_error_t err; + json_t *ignored_ips_array = nullptr; + int ret = json_unpack_ex( - json_card, &err, 0, "{ s: o, s?: i, s?: b, s?: s, s?: s, s?: b, s?: o}", - "ips", &json_ips, "affinity", &affinity, "do_reset", &do_reset, "slot", - &pci_slot, "id", &pci_id, "polling", &polling, "paths", &json_paths); + json_card, &err, 0, + "{ s: o, s?: i, s?: b, s?: s, s?: s, s?: b, s?: o, s?: o}", "ips", + &json_ips, "affinity", &affinity, "do_reset", &do_reset, "slot", + &pci_slot, "id", &pci_id, "polling", &polling, "paths", &json_paths, + "ignore_ips", &ignored_ips_array); + + // Parse ignored ip names to list + size_t index; + json_t *value; + json_array_foreach(ignored_ips_array, index, value) { + ignored_ip_names.push_back(json_string_value(value)); + } if (ret != 0) throw villas::ConfigError(json_card, err, "", "Failed to parse card"); diff --git a/fpga/lib/core.cpp b/fpga/lib/core.cpp index 80abd99f7..5248c7d74 100644 --- a/fpga/lib/core.cpp +++ b/fpga/lib/core.cpp @@ -62,17 +62,18 @@ CoreFactory::filterIps(std::list allIps, std::list ignored_ip_names) { std::list filteredIps; - std::set ignored_ip_set(ignored_ip_names.begin(), - ignored_ip_names.end()); - for (const auto &ip : allIps) { - const auto &ipName = ip.getName(); - - if (ignored_ip_set.find(ipName) != ignored_ip_set.end()) { - CoreFactory::getStaticLogger()->info( - "Ignoring Ip {} (explicitly on ignorelist)", ipName); - } else { - filteredIps.push_back(ip); + for (auto ip : allIps) { + bool on_blocklist = false; + for (auto ignored_ip_name : ignored_ip_names) { + if (ip.getName() == ignored_ip_name) { + on_blocklist = true; + CoreFactory::getStaticLogger()->warn("Ignoring Ip {} (explicitly on ignorelist)", ignored_ip_name); + break; + } } + + if (!on_blocklist) + filteredIps.push_back(ip); } return filteredIps; diff --git a/fpga/lib/platform_card.cpp b/fpga/lib/platform_card.cpp index 11315c805..55a937513 100644 --- a/fpga/lib/platform_card.cpp +++ b/fpga/lib/platform_card.cpp @@ -198,6 +198,7 @@ PlatformCardFactory::make(json_t *json_card, std::string card_name, card->affinity = parser.affinity; card->doReset = parser.do_reset != 0; card->polling = (parser.polling != 0); + card->ignored_ip_names = parser.ignored_ip_names; json_t *json_ips = parser.json_ips; json_t *json_paths = parser.json_paths; diff --git a/miob.conf b/miob.conf index 918591095..2b3357dea 100644 --- a/miob.conf +++ b/miob.conf @@ -6,6 +6,7 @@ fpgas = { zcu106 = { interface = "platform", ips = "/root/codebase/node/etc/fpga/zcu106_aurora_dino/zcu106_aurora_dino_240808-2.json", # Absolute path for remote debugging + ignore_ips = ["dino_dinoif_dac_0", "dino_dinoif_fast_nologic_0", "dino_registerif_0", "axi_iic_0"], polling = true, } }