@@ -47,7 +47,9 @@ DMADataMover::DMADataMover(const uint64_t addr,
4747 params->hw_params_ = hwparams;
4848
4949 /* Create the DMA accessor */
50- PYNQ_openDMA (¶ms->dma_ , addr);
50+ if (static_cast <uint64_t >(0ul ) != addr) {
51+ PYNQ_openDMA (¶ms->dma_ , addr);
52+ }
5153}
5254
5355std::shared_ptr<IMemory> DMADataMover::GetBuffer (const size_t size, const int ,
@@ -95,7 +97,9 @@ DMADataMover::~DMADataMover() {
9597 /* The assumption is that at this point, it is ok */
9698 auto params =
9799 dynamic_cast <DMADataMoverParameters *>(data_mover_params_.get ());
98- PYNQ_closeDMA (¶ms->dma_ );
100+ if (static_cast <uint64_t >(0ul ) != params->addr_ ) {
101+ PYNQ_closeDMA (¶ms->dma_ );
102+ }
99103}
100104
101105/* TODO: All implementations below can be implemented cleverly. However, it
@@ -126,23 +130,25 @@ Status DMADataMover::Upload(const std::shared_ptr<IMemory> mem,
126130 meta->bo_ ->sync (XCL_BO_SYNC_BO_TO_DEVICE, size, offset);
127131 }
128132
129- /* Get device pointer */
130- std::shared_ptr<uint8_t > ptr = mem->DeviceAddress <uint8_t >();
131- if (!ptr) {
132- return Status{Status::INVALID_PARAMETER, " Device pointer is null" };
133- }
134-
135133 /* Issue transaction */
136- PYNQ_SHARED_MEMORY pmem;
137- pmem.physical_address = (uint64_t )(ptr.get ()); // NOLINT
138- pmem.pointer = nullptr ;
134+ if (static_cast <uint64_t >(0ul ) != params->addr_ ) {
135+ /* Get device pointer */
136+ std::shared_ptr<uint8_t > ptr = mem->DeviceAddress <uint8_t >();
137+ if (!ptr) {
138+ return Status{Status::INVALID_PARAMETER, " Device pointer is null" };
139+ }
139140
140- ret =
141- PYNQ_issueDMATransfer (¶ms->dma_ , &pmem, offset, size, AXI_DMA_WRITE);
141+ PYNQ_SHARED_MEMORY pmem;
142+ pmem.physical_address = (uint64_t )(ptr.get ()); // NOLINT
143+ pmem.pointer = nullptr ;
142144
143- /* Check transaction */
144- if (PYNQ_SUCCESS != ret) {
145- return Status{Status::REGISTER_IO_ERROR, " Cannot issue the transfer" };
145+ ret = PYNQ_issueDMATransfer (¶ms->dma_ , &pmem, offset, size,
146+ AXI_DMA_WRITE);
147+
148+ /* Check transaction */
149+ if (PYNQ_SUCCESS != ret) {
150+ return Status{Status::REGISTER_IO_ERROR, " Cannot issue the transfer" };
151+ }
146152 }
147153
148154 /* Synchronise if needed */
@@ -177,21 +183,25 @@ Status DMADataMover::Download(const std::shared_ptr<IMemory> mem,
177183 meta->bo_ ->sync (XCL_BO_SYNC_BO_FROM_DEVICE, size, offset);
178184 }
179185
180- /* Get device pointer */
181- std::shared_ptr<uint8_t > ptr = mem->DeviceAddress <uint8_t >();
182- if (!ptr) {
183- return Status{Status::INVALID_PARAMETER, " Device pointer is null" };
184- }
185-
186186 /* Issue transaction */
187- PYNQ_SHARED_MEMORY pmem;
188- pmem.physical_address = (uint64_t )(ptr.get ()); // NOLINT
189- pmem.pointer = nullptr ;
190- ret = PYNQ_issueDMATransfer (¶ms->dma_ , &pmem, offset, size, AXI_DMA_READ);
187+ if (static_cast <uint64_t >(0ul ) != params->addr_ ) {
188+ std::shared_ptr<uint8_t > ptr = mem->DeviceAddress <uint8_t >();
191189
192- /* Check transaction */
193- if (PYNQ_SUCCESS != ret) {
194- return Status{Status::REGISTER_IO_ERROR, " Cannot issue the transfer" };
190+ /* Get device pointer */
191+ if (!ptr) {
192+ return Status{Status::INVALID_PARAMETER, " Device pointer is null" };
193+ }
194+
195+ PYNQ_SHARED_MEMORY pmem;
196+ pmem.physical_address = (uint64_t )(ptr.get ()); // NOLINT
197+ pmem.pointer = nullptr ;
198+ ret =
199+ PYNQ_issueDMATransfer (¶ms->dma_ , &pmem, offset, size, AXI_DMA_READ);
200+
201+ /* Check transaction */
202+ if (PYNQ_SUCCESS != ret) {
203+ return Status{Status::REGISTER_IO_ERROR, " Cannot issue the transfer" };
204+ }
195205 }
196206
197207 /* Synchronise if needed */
@@ -203,11 +213,15 @@ Status DMADataMover::Download(const std::shared_ptr<IMemory> mem,
203213}
204214
205215Status DMADataMover::Sync (const SyncType type) {
206- int ret = PYNQ_SUCCESS;
207-
208216 auto params =
209217 dynamic_cast <DMADataMoverParameters *>(data_mover_params_.get ());
210218
219+ if (static_cast <uint64_t >(0ul ) == params->addr_ ) {
220+ return Status{};
221+ }
222+
223+ int ret = PYNQ_SUCCESS;
224+
211225 if (SyncType::HostToDevice == type) {
212226 ret = PYNQ_waitForDMAComplete (¶ms->dma_ , AXI_DMA_WRITE);
213227 } else {
0 commit comments