Skip to content

Commit 3a04b0a

Browse files
committed
Add io_uring changes to ads_runtime_api.cpp files
Signed-off-by: Takasi, Manoj <Manoj.Takasi@amd.com>
1 parent 0d3f24e commit 3a04b0a

4 files changed

Lines changed: 83 additions & 14 deletions

File tree

src/runtime_src/core/common/config_reader.h

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -658,6 +658,17 @@ get_qdma_aio_enable()
658658
return value;
659659
}
660660

661+
/**
662+
* When true, batched io_uring submits (DmaWriteBdAsync / PushBdToQueueAsync + one wait).
663+
* When false (default), synchronous AIE DMA APIs are used throughout.
664+
*/
665+
inline bool
666+
get_io_uring()
667+
{
668+
static bool value = detail::get_bool_value("Runtime.io_uring", false);
669+
return value;
670+
}
671+
661672
inline std::string
662673
get_hw_em_driver()
663674
{

src/runtime_src/core/edge/user/aie/aie.cpp

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
*/
1818

1919
#include "aie.h"
20+
#include "core/common/config_reader.h"
2021
#include "core/common/error.h"
2122
#include "common_layer/fal_util.h"
2223
#include "core/common/message.h"
@@ -70,7 +71,8 @@ aie_array(const std::shared_ptr<xrt_core::device>& device)
7071
dev_inst = &dev_inst_obj;
7172

7273
adf::aiecompiler_options aiecompiler_options = xrt_core::edge::aie::get_aiecompiler_options(device.get());
73-
m_config = std::make_shared<adf::config_manager>(dev_inst, driver_config.mem_num_rows, aiecompiler_options.broadcast_enable_core);
74+
m_config = std::make_shared<adf::config_manager>(dev_inst, driver_config.mem_num_rows, aiecompiler_options.broadcast_enable_core,
75+
xrt_core::config::get_io_uring());
7476

7577
fal_util::initialize(dev_inst); //resource manager initialization
7678

@@ -144,7 +146,8 @@ aie_array(const std::shared_ptr<xrt_core::device>& device, const zynqaie::hwctx_
144146
dev_inst = &dev_inst_obj;
145147

146148
adf::aiecompiler_options aiecompiler_options = xrt_core::edge::aie::get_aiecompiler_options(device.get(), hwctx_obj);
147-
m_config = std::make_shared<adf::config_manager>(dev_inst, driver_config.mem_num_rows, aiecompiler_options.broadcast_enable_core);
149+
m_config = std::make_shared<adf::config_manager>(dev_inst, driver_config.mem_num_rows, aiecompiler_options.broadcast_enable_core,
150+
xrt_core::config::get_io_uring());
148151

149152
fal_util::initialize(dev_inst); //resource manager initialization
150153

src/runtime_src/core/edge/user/aie/common_layer/adf_aie_control_api.h

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,8 @@ namespace adf
2626
class config_manager
2727
{
2828
public:
29-
config_manager(XAie_DevInst* dev_inst, size_t num_reserved_rows, bool broadcast_enable_core);
29+
config_manager(XAie_DevInst* dev_inst, size_t num_reserved_rows, bool broadcast_enable_core,
30+
bool io_uring = false);
3031
XAie_DevInst*
3132
get_dev()
3233
{
@@ -45,10 +46,17 @@ class config_manager
4546
return m_broadcast_enable_core;
4647
}
4748

49+
bool
50+
get_io_uring() const
51+
{
52+
return m_io_uring;
53+
}
54+
4855
private:
4956
XAie_DevInst* m_aie_dev;
5057
size_t m_num_reserved_rows;
5158
bool m_broadcast_enable_core;
59+
bool m_io_uring;
5260
};
5361

5462
class dma_api

src/runtime_src/core/edge/user/aie/common_layer/adf_runtime_api.cpp

Lines changed: 58 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -26,11 +26,24 @@
2626
extern "C"
2727
{
2828
#include "xaiengine.h"
29+
#include <xaiengine/xaie_helper.h>
2930
}
3031

3132
namespace 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

3649
static constexpr short INVALID_TILE_COORD = 0xFF;
@@ -48,10 +61,12 @@ static constexpr unsigned LOCK_TIMEOUT = 0x7FFFFFFF;
4861
/********************************* config_manager *************************************/
4962

5063
config_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

Comments
 (0)