2626extern " C"
2727{
2828#include " xaiengine.h"
29+ #include < xaiengine/xaie_helper.h>
2930}
3031
3132namespace adf
3233{
3334
35+ namespace {
36+ void
37+ aie_async_wait_nr_throw (XAie_DevInst* dev, int nr)
38+ {
39+ if (nr <= 0 )
40+ return ;
41+ AieRC w = XAie_AsyncWaitNr (dev, static_cast <u32 >(nr));
42+ if (w != XAIE_OK)
43+ throw xrt_core::error (-EIO, " XAie_AsyncWaitNr failed: " + std::to_string (w));
44+ }
45+ } // namespace
46+
3447/* ******************************** Statics & Constants *********************************/
3548
3649static constexpr short INVALID_TILE_COORD = 0xFF ;
@@ -48,10 +61,12 @@ static constexpr unsigned LOCK_TIMEOUT = 0x7FFFFFFF;
4861/* ******************************** config_manager *************************************/
4962
5063config_manager::
51- config_manager (XAie_DevInst* dev_inst, size_t num_reserved_rows, bool broadcast_enable_core)
64+ config_manager (XAie_DevInst* dev_inst, size_t num_reserved_rows, bool broadcast_enable_core,
65+ bool io_uring)
5266 : m_aie_dev(dev_inst)
5367 , m_num_reserved_rows(num_reserved_rows)
5468 , m_broadcast_enable_core(broadcast_enable_core)
69+ , m_io_uring(io_uring)
5570{}
5671
5772/* *********************************** graph_api ************************************/
@@ -784,21 +799,54 @@ std::pair<size_t, size_t> gmio_api::enqueueBD(XAie_MemInst *memInst, uint64_t of
784799 // get an available BD
785800 uint16_t bdNumber = frontAndPop (availableBDs);
786801
787- // set up BD
788- driverStatus |= XAie_DmaSetAddrOffsetLen (&shimDmaInst, memInst, offset, ( u32 ) size);
802+ if (config-> get_io_uring ()) {
803+ driverStatus |= XAie_DmaSetAddrOffsetLen (&shimDmaInst, memInst, offset, static_cast < u32 >( size) );
789804
790- if (config->get_dev ()->DevProp .DevGen == XAIE_DEV_GEN_AIEML || config->get_dev ()->DevProp .DevGen == XAIE_DEV_GEN_AIE2PS) // AIEML (note AIE1 XAIE_LOCK_WITH_NO_VALUE is -1, which does not work for AIEML)
805+ XAie_AsyncRes ares[2 ]{};
806+ int n = 0 ;
807+
808+ if (config->get_dev ()->DevProp .DevGen == XAIE_DEV_GEN_AIEML || config->get_dev ()->DevProp .DevGen == XAIE_DEV_GEN_AIE2PS)
791809 driverStatus |= XAie_DmaSetLock (&shimDmaInst, XAie_LockInit (bdNumber, 0 ), XAie_LockInit (bdNumber, 0 ));
792- else
810+ else
793811 driverStatus |= XAie_DmaSetLock (&shimDmaInst, XAie_LockInit (bdNumber, XAIE_LOCK_WITH_NO_VALUE), XAie_LockInit (bdNumber, XAIE_LOCK_WITH_NO_VALUE));
794812
795- driverStatus |= XAie_DmaEnableBd (&shimDmaInst);
813+ driverStatus |= XAie_DmaEnableBd (&shimDmaInst);
814+
815+ int r = XAie_DmaWriteBdAsync (config->get_dev (), &shimDmaInst, gmioTileLoc, bdNumber, &ares[0 ]);
816+ if (r == 0 ) {
817+ aie_async_wait_nr_throw (config->get_dev (), n);
818+ throw xrt_core::error (ares[0 ].res ? ares[0 ].res : -EIO, " XAie_DmaWriteBdAsync submit failed" );
819+ }
820+ n += r;
821+
822+ r = XAie_DmaChannelPushBdToQueueAsync (config->get_dev (), gmioTileLoc, pGMIOConfig->channelNum ,
823+ (pGMIOConfig->type == gmio_config::gm2aie ? DMA_MM2S : DMA_S2MM), bdNumber, &ares[1 ]);
824+ if (r == 0 ) {
825+ aie_async_wait_nr_throw (config->get_dev (), n);
826+ throw xrt_core::error (ares[1 ].res ? ares[1 ].res : -EIO, " XAie_DmaChannelPushBdToQueueAsync submit failed" );
827+ }
828+ n += r;
829+
830+ aie_async_wait_nr_throw (config->get_dev (), n);
831+ for (int i = 0 ; i < 2 ; ++i) {
832+ if (ares[i].res != 0 )
833+ throw xrt_core::error (ares[i].res , " GMIO enqueueBD async completion failed" );
834+ }
835+ }
836+ else {
837+ driverStatus |= XAie_DmaSetAddrOffsetLen (&shimDmaInst, memInst, offset, static_cast <u32 >(size));
796838
797- // write BD
798- driverStatus |= XAie_DmaWriteBd (config->get_dev (), &shimDmaInst, gmioTileLoc, bdNumber);
839+ if (config->get_dev ()->DevProp .DevGen == XAIE_DEV_GEN_AIEML || config->get_dev ()->DevProp .DevGen == XAIE_DEV_GEN_AIE2PS)
840+ driverStatus |= XAie_DmaSetLock (&shimDmaInst, XAie_LockInit (bdNumber, 0 ), XAie_LockInit (bdNumber, 0 ));
841+ else
842+ driverStatus |= XAie_DmaSetLock (&shimDmaInst, XAie_LockInit (bdNumber, XAIE_LOCK_WITH_NO_VALUE), XAie_LockInit (bdNumber, XAIE_LOCK_WITH_NO_VALUE));
843+
844+ driverStatus |= XAie_DmaEnableBd (&shimDmaInst);
845+ driverStatus |= XAie_DmaWriteBd (config->get_dev (), &shimDmaInst, gmioTileLoc, bdNumber);
846+ driverStatus |= XAie_DmaChannelPushBdToQueue (config->get_dev (), gmioTileLoc, pGMIOConfig->channelNum ,
847+ (pGMIOConfig->type == gmio_config::gm2aie ? DMA_MM2S : DMA_S2MM), bdNumber);
848+ }
799849
800- // enqueue BD
801- driverStatus |= XAie_DmaChannelPushBdToQueue (config->get_dev (), gmioTileLoc, pGMIOConfig->channelNum , (pGMIOConfig->type == gmio_config::gm2aie ? DMA_MM2S : DMA_S2MM), bdNumber);
802850 enqueuedBDs.push (bdNumber);
803851
804852 /* Commenting out as this is increasing overhead of the performance */
@@ -967,7 +1015,6 @@ err_code dma_api::configureBD(int tileType, uint8_t column, uint8_t row, uint16_
9671015 // valid bd
9681016 driverStatus |= XAie_DmaEnableBd (&dmaInst);
9691017
970- // write bd
9711018 driverStatus |= XAie_DmaWriteBd (config->get_dev (), &dmaInst, tileLoc, bdId);
9721019 debugMsg (static_cast <std::stringstream &&>(std::stringstream () << " XAie_DmaWriteBd " << (uint16_t )bdId << std::endl).str ());
9731020
0 commit comments