Skip to content

Commit

Permalink
Add hwctx specific Aie instances (#8397)
Browse files Browse the repository at this point in the history
Signed-off-by: Sravankumar allu <[email protected]>
Co-authored-by: Sravankumar allu <[email protected]>
  • Loading branch information
SravanKumarAllu-xilinx and Sravankumar allu authored Sep 6, 2024
1 parent 536a849 commit 216fcd7
Show file tree
Hide file tree
Showing 4 changed files with 84 additions and 6 deletions.
72 changes: 72 additions & 0 deletions src/runtime_src/core/edge/user/aie/aie.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -88,6 +88,65 @@ Aie::Aie(const std::shared_ptr<xrt_core::device>& device)
external_buffer_configs = xrt_core::edge::aie::get_external_buffers(device.get());
}

Aie::Aie(const std::shared_ptr<xrt_core::device>& device, const zynqaie::hwctx_object* hwctx_obj)
{
DevInst = {0};
devInst = nullptr;
adf::driver_config driver_config = xrt_core::edge::aie::get_driver_config(device.get());

XAie_SetupConfig(ConfigPtr,
driver_config.hw_gen,
driver_config.base_address,
driver_config.column_shift,
driver_config.row_shift,
driver_config.num_columns,
driver_config.num_rows,
driver_config.shim_row,
driver_config.mem_row_start,
driver_config.mem_num_rows,
driver_config.aie_tile_row_start,
driver_config.aie_tile_num_rows);

auto drv = ZYNQ::shim::handleCheck(device->get_device_handle());

/* TODO get partition id and uid from XCLBIN or PDI */
uint32_t partition_id = 1;
uint32_t uid = 0;
drm_zocl_aie_fd aiefd = { partition_id, uid, 0 };

//TODO: getparitionFd from driver instead of from shim
if (auto ret = drv->getPartitionFd(aiefd))
throw xrt_core::error(ret, "Create AIE failed. Can not get AIE fd");

fd = aiefd.fd;

ConfigPtr.PartProp.Handle = fd;

AieRC rc;
if ((rc = XAie_CfgInitialize(&DevInst, &ConfigPtr)) != XAIE_OK)
throw xrt_core::error(-EINVAL, "Failed to initialize AIE configuration: " + std::to_string(rc));

devInst = &DevInst;

adf::aiecompiler_options aiecompiler_options = xrt_core::edge::aie::get_aiecompiler_options(device.get());
adf::config_manager::initialize(devInst, driver_config.mem_num_rows, aiecompiler_options.broadcast_enable_core);

fal_util::initialize(devInst); //resource manager initialization

/* Initialize PLIO metadata */
plio_configs = xrt_core::edge::aie::get_plios(device.get());

/* Initialize gmio api instances */
gmio_configs = xrt_core::edge::aie::get_gmios(device.get());
for (auto config_itr = gmio_configs.begin(); config_itr != gmio_configs.end(); config_itr++)
{
auto p_gmio_api = std::make_shared<adf::gmio_api>(&config_itr->second);
p_gmio_api->configure();
gmio_apis[config_itr->first] = p_gmio_api;
}
external_buffer_configs = xrt_core::edge::aie::get_external_buffers(device.get());
}

Aie::~Aie()
{
if (devInst)
Expand Down Expand Up @@ -120,6 +179,19 @@ open_context(const xrt_core::device* device, xrt::aie::access_mode am)
access_mode = am;
}

void
Aie::
open_context(const xrt_core::device* device, const zynqaie::hwctx_object* hwctx_obj, xrt::aie::access_mode am)
{
auto drv = ZYNQ::shim::handleCheck(device->get_device_handle());

//TODO: replace openAIEContext with new function with parameters hwctx_obj, am
if (auto ret = drv->openAIEContext(am))
throw xrt_core::error(ret, "Fail to open AIE context");

access_mode = am;
}

bool
Aie::
is_context_set()
Expand Down
5 changes: 5 additions & 0 deletions src/runtime_src/core/edge/user/aie/aie.h
Original file line number Diff line number Diff line change
Expand Up @@ -82,6 +82,8 @@ class Aie {
~Aie();
Aie(const std::shared_ptr<xrt_core::device>& device);

Aie(const std::shared_ptr<xrt_core::device>& device, const zynqaie::hwctx_object* hwctx_obj);

std::vector<ShimDMA> shim_dma; // shim DMA // not used anymore, should be cleanedup

/* This is the collections of gmios that are used. */
Expand All @@ -97,6 +99,9 @@ class Aie {
void
open_context(const xrt_core::device* device, xrt::aie::access_mode am);

void
open_context(const xrt_core::device* device, const zynqaie::hwctx_object* hwctx_obj, xrt::aie::access_mode am);

bool
is_context_set();

Expand Down
2 changes: 1 addition & 1 deletion src/runtime_src/core/edge/user/hwctx_object.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ namespace zynqaie {
auto device{xrt_core::get_userpf_device(m_shim)};
auto data = device->get_axlf_section(AIE_METADATA, m_uuid);
if (data.first && data.second)
m_aie_array = std::make_unique<Aie>(device);
m_aie_array = std::make_unique<Aie>(device, this);
#endif
}

Expand Down
11 changes: 6 additions & 5 deletions src/runtime_src/core/edge/user/shim.h
Original file line number Diff line number Diff line change
Expand Up @@ -77,6 +77,7 @@ class shim {
{
shim* m_shim;
xclBufferHandle m_hdl;
zynqaie::hwctx_object* m_hwctx_obj{nullptr};

#ifdef XRT_ENABLE_AIE
zynqaie::Aie* m_aie_array{nullptr};
Expand All @@ -89,10 +90,10 @@ class shim {
{
#ifdef XRT_ENABLE_AIE
if (nullptr != hwctx_hdl) { // hwctx specific
auto hwctx_obj = dynamic_cast<zynqaie::hwctx_object*>(hwctx_hdl);
m_hwctx_obj = dynamic_cast<zynqaie::hwctx_object*>(hwctx_hdl);

if (nullptr != hwctx_obj) {
m_aie_array = hwctx_obj->get_aie_array_from_hwctx();
if (nullptr != m_hwctx_obj) {
m_aie_array = m_hwctx_obj->get_aie_array_from_hwctx();
}
}
else {
Expand Down Expand Up @@ -182,7 +183,7 @@ class shim {
#ifdef XRT_ENABLE_AIE
if (!m_aie_array->is_context_set()) {
auto device = xrt_core::get_userpf_device(m_shim);
m_aie_array->open_context(device.get(), xrt::aie::access_mode::primary);
m_aie_array->open_context(device.get(), m_hwctx_obj, xrt::aie::access_mode::primary);
}

auto bosize = bo.size();
Expand All @@ -200,7 +201,7 @@ class shim {
#ifdef XRT_ENABLE_AIE
if (!m_aie_array->is_context_set()) {
auto device = xrt_core::get_userpf_device(m_shim);
m_aie_array->open_context(device.get(), xrt::aie::access_mode::primary);
m_aie_array->open_context(device.get(), m_hwctx_obj, xrt::aie::access_mode::primary);
}

auto bosize = bo.size();
Expand Down

0 comments on commit 216fcd7

Please sign in to comment.