@@ -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