From 897d9168867e376d56cb988bf96c865553c88510 Mon Sep 17 00:00:00 2001 From: Niklas Eiling Date: Tue, 9 Jan 2024 17:08:18 +0100 Subject: [PATCH] Core/Card: enable IP init requiring other IPs add initialized IP to card->ips already during initialization so that later IPs can use early initiliazed IPs to do their initilization. E.g. Dino needs I2c for initialization. Signed-off-by: Niklas Eiling --- fpga/lib/core.cpp | 13 ++++++++----- fpga/lib/pcie_card.cpp | 2 +- 2 files changed, 9 insertions(+), 6 deletions(-) diff --git a/fpga/lib/core.cpp b/fpga/lib/core.cpp index 295a42b03..2af5a1752 100644 --- a/fpga/lib/core.cpp +++ b/fpga/lib/core.cpp @@ -33,6 +33,7 @@ static std::list vlnvInitializationOrder = { Vlnv("xilinx.com:ip:axi_pcie:"), Vlnv("xilinx.com:module_ref:axi_pcie_intc:"), Vlnv("xilinx.com:ip:axis_switch:"), + Vlnv("xilinx.com:ip:axi_iic:"), }; std::list> CoreFactory::make(Card *card, @@ -44,9 +45,11 @@ std::list> CoreFactory::make(Card *card, std::list orderedIps; // IPs ordered in initialization order std::list> configuredIps; // Successfully configured IPs - std::list> - initializedIps; // Initialized, i.e. ready-to-use IPs + if (!card->ips.empty()) { + loggerStatic->error("IP list of card {} already contains IPs.", card->name); + throw RuntimeError("IP list of card {} already contains IPs.", card->name); + } // Parse all IP instance names and their VLNV into list `allIps` const char *ipName; json_t *json_ip; @@ -269,15 +272,15 @@ std::list> CoreFactory::make(Card *card, } // Will only be reached if the IP successfully was initialized - initializedIps.push_back(std::move(ip)); + card->ips.push_back(std::move(ip)); } loggerStatic->debug("Initialized IPs:"); - for (auto &ip : initializedIps) { + for (auto &ip : card->ips) { loggerStatic->debug(" {}", *ip); } - return initializedIps; + return card->ips; } void Core::dump() { diff --git a/fpga/lib/pcie_card.cpp b/fpga/lib/pcie_card.cpp index fa24a1de0..cdad33c44 100644 --- a/fpga/lib/pcie_card.cpp +++ b/fpga/lib/pcie_card.cpp @@ -103,7 +103,7 @@ PCIeCardFactory::make(json_t *json_card, std::string card_name, throw ConfigError(json_ips, "node-config-fpga-ips", "FPGA IP core list must be an object!"); - card->ips = ip::CoreFactory::make(card.get(), json_ips); + ip::CoreFactory::make(card.get(), json_ips); if (card->ips.empty()) throw ConfigError(json_ips, "node-config-fpga-ips", "Cannot initialize IPs of FPGA card {}", card_name);