From 7b4176a710e712c584a493cdf64e08bb965922b6 Mon Sep 17 00:00:00 2001 From: Niklas Eiling Date: Mon, 7 Nov 2022 10:33:00 -0500 Subject: [PATCH] ips/dma: use json_unpack --- fpga/lib/ips/dma.cpp | 137 ++++++++++++------------------------------- 1 file changed, 37 insertions(+), 100 deletions(-) diff --git a/fpga/lib/ips/dma.cpp b/fpga/lib/ips/dma.cpp index 37fc68df9..536fb6eb9 100644 --- a/fpga/lib/ips/dma.cpp +++ b/fpga/lib/ips/dma.cpp @@ -52,23 +52,6 @@ bool Dma::init() logger->info("Scatter-Gather support: {}", hasScatterGather()); xConfig.BaseAddr = getBaseAddr(registerMemory); - if (!configSet) { - xConfig.HasStsCntrlStrm = 0; - xConfig.HasMm2S = 1; - xConfig.HasMm2SDRE = 0; - xConfig.Mm2SDataWidth = 32; - xConfig.HasS2Mm = 1; - xConfig.HasS2MmDRE = 0; - xConfig.HasSg = hasScatterGather(); - xConfig.S2MmDataWidth = 32; - xConfig.Mm2sNumChannels = 1; - xConfig.S2MmNumChannels = 1; - xConfig.Mm2SBurstSize = 16; - xConfig.S2MmBurstSize = 16; - xConfig.MicroDmaMode = 0; - xConfig.AddrWidth = 32; - xConfig.SgLengthWidth = 14; - } if (XAxiDma_CfgInitialize(&xDma, &xConfig) != XST_SUCCESS) { @@ -612,92 +595,46 @@ bool DmaFactory::configureJson(Core& ip, json_t* json) { auto &dma = dynamic_cast(ip); - enum DmaParameters { - HasStsCntrlStrm, - HasMm2S, - HasMm2SDRE, - Mm2SDataWidth, - HasS2Mm, - HasS2MmDRE, - S2MmDataWidth, - HasSg, - Mm2sNumChannels, - S2MmNumChannels, - MicroDmaMode, - AddrWidth, - SgLengthWidth - }; - static const std::map ParaMap = { - {"c_sg_include_stscntrl_strm", HasStsCntrlStrm}, - {"c_include_mm2s", HasMm2S}, - {"c_include_mm2s_dre", HasMm2SDRE}, - {"c_m_axi_mm2s_data_width", Mm2SDataWidth}, - {"c_include_s2mm", HasS2Mm}, - {"c_include_s2mm_dre", HasS2MmDRE}, - {"c_m_axi_s2mm_data_width", S2MmDataWidth}, - {"c_include_sg", HasSg}, - {"c_num_mm2s_channels", Mm2sNumChannels}, - {"c_num_s2mm_channels", S2MmNumChannels}, - {"c_micro_dma", MicroDmaMode}, - {"c_addr_width", AddrWidth}, - {"c_sg_length_width", SgLengthWidth} - }; - json_t* json_params = json_object_get(json, "parameters"); if (!json_is_object(json_params)) - return true; + return false; - const char* paramName; - json_t* json_param; - json_object_foreach(json_params, paramName, json_param) { - auto it = ParaMap.find(paramName); - if (it == ParaMap.end()) - continue; - - switch (it->second) { - case HasStsCntrlStrm: - dma.xConfig.HasStsCntrlStrm = json_integer_value(json_param); - break; - case HasMm2S: - dma.xConfig.HasMm2S = json_integer_value(json_param); - break; - case HasMm2SDRE: - dma.xConfig.HasMm2SDRE = json_integer_value(json_param); - break; - case Mm2SDataWidth: - dma.xConfig.Mm2SDataWidth = json_integer_value(json_param); - break; - case HasS2Mm: - dma.xConfig.HasS2Mm = json_integer_value(json_param); - break; - case HasS2MmDRE: - dma.xConfig.HasS2MmDRE = json_integer_value(json_param); - break; - case S2MmDataWidth: - dma.xConfig.S2MmDataWidth = json_integer_value(json_param); - break; - case HasSg: - dma.xConfig.HasSg = json_integer_value(json_param); - break; - case Mm2sNumChannels: - dma.xConfig.Mm2sNumChannels = json_integer_value(json_param); - break; - case S2MmNumChannels: - dma.xConfig.S2MmNumChannels = json_integer_value(json_param); - break; - case MicroDmaMode: - dma.xConfig.MicroDmaMode = json_integer_value(json_param); - break; - case AddrWidth: - dma.xConfig.AddrWidth = json_integer_value(json_param); - break; - case SgLengthWidth: - dma.xConfig.SgLengthWidth = json_integer_value(json_param); - break; - default: - break; - } + // Sensible default configuration + dma.xConfig.HasStsCntrlStrm = 0; + dma.xConfig.HasMm2S = 1; + dma.xConfig.HasMm2SDRE = 0; + dma.xConfig.Mm2SDataWidth = 32; + dma.xConfig.HasS2Mm = 1; + dma.xConfig.HasS2MmDRE = 0; + dma.xConfig.HasSg = 1; + dma.xConfig.S2MmDataWidth = 32; + dma.xConfig.Mm2sNumChannels = 1; + dma.xConfig.S2MmNumChannels = 1; + dma.xConfig.Mm2SBurstSize = 16; + dma.xConfig.S2MmBurstSize = 16; + dma.xConfig.MicroDmaMode = 0; + dma.xConfig.AddrWidth = 32; + dma.xConfig.SgLengthWidth = 14; + + int ret = json_unpack(json_params, + "{ s?: i, s?: i, s?: i, s?: i, s?: i, s?: i, s?: i, s?: i, s?: i, s?: i, s?: i, s?: i, s?: i }", + "c_sg_include_stscntrl_strm", &dma.xConfig.HasStsCntrlStrm, + "c_include_mm2s", &dma.xConfig.HasMm2S, + "c_include_mm2s_dre", &dma.xConfig.HasMm2SDRE, + "c_m_axi_mm2s_data_width", &dma.xConfig.Mm2SDataWidth, + "c_include_s2mm", &dma.xConfig.HasS2Mm, + "c_include_s2mm_dre", &dma.xConfig.HasS2MmDRE, + "c_m_axi_s2mm_data_width", &dma.xConfig.S2MmDataWidth, + "c_include_sg", &dma.xConfig.HasSg, + "c_num_mm2s_channels", &dma.xConfig.Mm2sNumChannels, + "c_num_s2mm_channels", &dma.xConfig.S2MmNumChannels, + "c_micro_dma", &dma.xConfig.MicroDmaMode, + "c_addr_width", &dma.xConfig.AddrWidth, + "c_sg_length_width", &dma.xConfig.SgLengthWidth + ); + if (ret != 0) { + logger->error("Failed to parse DMA configuration"); + return false; } - dma.configSet = true; return true; } \ No newline at end of file