Skip to content

Commit a0b9cb3

Browse files
authored
Use env variable to determine the ddr offset for emulation device (#9523)
* use env variable to determine the ddr offset for emulation device Signed-off-by: Sri Latha Ayyannagari <SriLatha.Ayyannagari@amd.com> * Fix comments Signed-off-by: Sri Latha Ayyannagari <SriLatha.Ayyannagari@amd.com> * Fix comments Signed-off-by: Sri Latha Ayyannagari <SriLatha.Ayyannagari@amd.com> * fix windows build failure Signed-off-by: Sri Latha Ayyannagari <SriLatha.Ayyannagari@amd.com> --------- Signed-off-by: Sri Latha Ayyannagari <SriLatha.Ayyannagari@amd.com>
1 parent 92d731b commit a0b9cb3

File tree

1 file changed

+17
-12
lines changed

1 file changed

+17
-12
lines changed

src/runtime_src/core/common/api/xrt_module.cpp

Lines changed: 17 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -194,6 +194,19 @@ struct patcher
194194
return section_name_array[static_cast<int>(bt)];
195195
}
196196

197+
inline static uint64_t get_ddr_aie_addr_offset()
198+
{
199+
// on npu3 emulation platform, there is no ddr offset needed for AIE shim tile
200+
constexpr uint64_t ddr_aie_addr_offset = 0x80000000;
201+
#ifndef _WIN32
202+
static const char* xemtarget = std::getenv("XCL_EMULATION_DEVICE_TARGET"); // NOLINT
203+
static const bool is_npu3_snl = xemtarget && (std::strcmp(xemtarget, "npu3_snl") == 0);
204+
if (is_npu3_snl)
205+
return 0;
206+
#endif
207+
return ddr_aie_addr_offset;
208+
}
209+
197210
patcher(symbol_type type, std::vector<patch_info> ctrlcode_offset, xrt_core::patcher::buf_type t)
198211
: m_buf_type(t)
199212
, m_symbol_type(type)
@@ -239,13 +252,11 @@ struct patcher
239252
void
240253
patch57_aie4(uint32_t* bd_data_ptr, uint64_t patch) const
241254
{
242-
constexpr uint64_t ddr_aie_addr_offset = 0x80000000;
243-
244255
uint64_t base_address =
245256
((static_cast<uint64_t>(bd_data_ptr[0]) & 0x1FFFFFF) << 32) | // NOLINT
246257
bd_data_ptr[1];
247258

248-
base_address += patch + ddr_aie_addr_offset; //2G offset
259+
base_address += patch + get_ddr_aie_addr_offset(); // 2G offset (or 0 offset for emulation device)
249260
bd_data_ptr[1] = (uint32_t)(base_address & 0xFFFFFFFF); // NOLINT
250261
bd_data_ptr[0] = (bd_data_ptr[0] & 0xFE000000) | ((base_address >> 32) & 0x1FFFFFF);// NOLINT
251262
}
@@ -266,43 +277,37 @@ struct patcher
266277
void
267278
patch_ctrl48(uint32_t* bd_data_ptr, uint64_t patch) const
268279
{
269-
// This patching scheme is originated from NPU firmware
270-
constexpr uint64_t ddr_aie_addr_offset = 0x80000000;
271280

272281
uint64_t base_address =
273282
((static_cast<uint64_t>(bd_data_ptr[3]) & 0xFFF) << 32) | // NOLINT
274283
((static_cast<uint64_t>(bd_data_ptr[2])));
275284

276-
base_address = base_address + patch + ddr_aie_addr_offset;
285+
base_address = base_address + patch + get_ddr_aie_addr_offset();
277286
bd_data_ptr[2] = (uint32_t)(base_address & 0xFFFFFFFC); // NOLINT
278287
bd_data_ptr[3] = (bd_data_ptr[3] & 0xFFFF0000) | (base_address >> 32); // NOLINT
279288
}
280289

281290
void
282291
patch_shim48(uint32_t* bd_data_ptr, uint64_t patch) const
283292
{
284-
// This patching scheme is originated from NPU firmware
285-
constexpr uint64_t ddr_aie_addr_offset = 0x80000000;
286293

287294
uint64_t base_address =
288295
((static_cast<uint64_t>(bd_data_ptr[2]) & 0xFFFF) << 32) | // NOLINT
289296
((static_cast<uint64_t>(bd_data_ptr[1])));
290297

291-
base_address = base_address + patch + ddr_aie_addr_offset;
298+
base_address = base_address + patch + get_ddr_aie_addr_offset();
292299
bd_data_ptr[1] = (uint32_t)(base_address & 0xFFFFFFFC); // NOLINT
293300
bd_data_ptr[2] = (bd_data_ptr[2] & 0xFFFF0000) | (base_address >> 32); // NOLINT
294301
}
295302

296303
void
297304
patch_ctrl57_aie4(uint32_t* bd_data_ptr, uint64_t patch) const
298305
{
299-
// This patching scheme is originated from NPU firmware
300-
constexpr uint64_t ddr_aie_addr_offset = 0x80000000;
301306

302307
// bd_data_ptr is a pointer to the header of the control code
303308
uint64_t base_address = (((uint64_t)bd_data_ptr[1] & 0x1FFFFFF) << 32) | bd_data_ptr[2]; // NOLINT
304309

305-
base_address += patch + ddr_aie_addr_offset;
310+
base_address += patch + get_ddr_aie_addr_offset();
306311
bd_data_ptr[2] = (uint32_t)(base_address & 0xFFFFFFFF); // NOLINT
307312
bd_data_ptr[1] = (bd_data_ptr[1] & 0xFE000000) | ((base_address >> 32) & 0x1FFFFFF); // NOLINT
308313
}

0 commit comments

Comments
 (0)