Skip to content

Commit cdfed79

Browse files
authored
Adding further aie4 shim test support (#895)
Signed-off-by: Hayden Laccabue <hlaccabu@amd.com>
1 parent 246f447 commit cdfed79

File tree

10 files changed

+266
-381
lines changed

10 files changed

+266
-381
lines changed

src/shim/buffer.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,8 @@ uint8_t
2121
use_to_fw_debug_type(uint8_t use)
2222
{
2323
switch (use) {
24-
case XRT_BO_USE_DEBUG:
24+
case XRT_BO_USE_DEBUG: // USE_DEBUG and USE_UC_DEBUG should return same type, 2 different cases for different devices
25+
case XRT_BO_USE_UC_DEBUG:
2526
return AMDXDNA_FW_BUF_DEBUG;
2627
case XRT_BO_USE_DTRACE:
2728
return AMDXDNA_FW_BUF_TRACE;

src/shim/hwq.cpp

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -98,8 +98,23 @@ hwq::
9898
poll_command(xrt_core::buffer_handle *cmd) const
9999
{
100100
auto boh = static_cast<cmd_buffer*>(cmd);
101-
auto cmdpkt = reinterpret_cast<ert_packet *>(boh->vaddr());
102-
101+
auto& subcmds = boh->get_subcmd_list();
102+
// For chain commands in user mode
103+
if (subcmds.size()) {
104+
auto last_cmd_bo = subcmds.back();
105+
auto last_cmdpkt = reinterpret_cast<ert_packet *>(last_cmd_bo->vaddr());
106+
if (last_cmdpkt->state >= ERT_CMD_STATE_COMPLETED) {
107+
// Update chain BO state to match
108+
auto cmdpkt = reinterpret_cast<ert_packet *>(boh->vaddr());
109+
cmdpkt->state = last_cmdpkt->state;
110+
XRT_TRACE_POINT_LOG(poll_command_done);
111+
return 1;
112+
}
113+
return 0;
114+
}
115+
116+
// Single command
117+
auto cmdpkt = reinterpret_cast<volatile ert_packet *>(boh->vaddr());
103118
if (cmdpkt->state >= ERT_CMD_STATE_COMPLETED) {
104119
XRT_TRACE_POINT_LOG(poll_command_done);
105120
return 1;

test/shim_test/dev_info.cpp

Lines changed: 15 additions & 59 deletions
Original file line numberDiff line numberDiff line change
@@ -67,88 +67,44 @@ xclbin_info xclbin_infos[] = {
6767
.device = npu3_device_id,
6868
.revision_id = npu_any_revision_id,
6969
.ip_name2idx = {
70-
{ "DPU:vadd", {0xffffffff} },
70+
{ "DPU:dpu", {0xffffffff} },
7171
},
72-
.workspace = "npu3_workspace",
72+
.workspace = "local_shim_test_data/elf_vadd_npu3",
7373
.data = "",
74-
.type = KERNEL_TYPE_TXN_FULL_ELF_PREEMPT,
75-
},
76-
{
77-
.name = "vadd.elf",
78-
.device = npu3_device_id1,
79-
.revision_id = npu_any_revision_id,
80-
.ip_name2idx = {
81-
{ "DPU:vadd", {0xffffffff} },
82-
},
83-
.workspace = "npu3_workspace",
84-
.data = "",
85-
.type = KERNEL_TYPE_TXN_FULL_ELF_PREEMPT,
86-
},
87-
{
88-
.name = "move_memtiles.elf",
89-
.device = npu3_device_id,
90-
.revision_id = npu_any_revision_id,
91-
.ip_name2idx = {
92-
{ "DPU:move_memtiles", {0xffffffff} },
93-
},
94-
.workspace = "npu3_workspace",
95-
.data = "",
96-
.type = KERNEL_TYPE_TXN_FULL_ELF_PREEMPT,
97-
},
98-
{
99-
.name = "move_memtiles.elf",
100-
.device = npu3_device_id1,
101-
.revision_id = npu_any_revision_id,
102-
.ip_name2idx = {
103-
{ "DPU:move_memtiles", {0xffffffff} },
104-
},
105-
.workspace = "npu3_workspace",
106-
.data = "",
107-
.type = KERNEL_TYPE_TXN_FULL_ELF_PREEMPT,
74+
.type = KERNEL_TYPE_TXN_FULL_ELF,
10875
},
10976
{
110-
.name = "ddr_memtile.elf",
77+
.name = "nop.elf",
11178
.device = npu3_device_id,
11279
.revision_id = npu_any_revision_id,
11380
.ip_name2idx = {
114-
{ "DPU:move_ddr_memtile", {0xffffffff} },
81+
{ "DPU:dpu", {0xffffffff} },
11582
},
116-
.workspace = "npu3_workspace",
83+
.workspace = "local_shim_test_data/elf_no_op_npu3",
11784
.data = "",
118-
.type = KERNEL_TYPE_TXN_FULL_ELF_PREEMPT,
85+
.type = KERNEL_TYPE_TXN_FULL_ELF,
11986
},
12087
{
121-
.name = "ddr_memtile.elf",
88+
.name = "vadd.elf",
12289
.device = npu3_device_id1,
12390
.revision_id = npu_any_revision_id,
12491
.ip_name2idx = {
125-
{ "DPU:move_ddr_memtile", {0xffffffff} },
92+
{ "DPU:dpu", {0xffffffff} },
12693
},
127-
.workspace = "npu3_workspace",
94+
.workspace = "local_shim_test_data/elf_vadd_npu3",
12895
.data = "",
129-
.type = KERNEL_TYPE_TXN_FULL_ELF_PREEMPT,
96+
.type = KERNEL_TYPE_TXN_FULL_ELF,
13097
},
13198
{
132-
.name = "remote_barrier.elf",
133-
.device = npu3_device_id,
134-
.revision_id = npu_any_revision_id,
135-
.ip_name2idx = {
136-
{ "DPU:remote_barrier", {0xffffffff} },
137-
},
138-
.workspace = "npu3_workspace",
139-
.data = "",
140-
.type = KERNEL_TYPE_TXN_FULL_ELF_PREEMPT,
141-
},
142-
{
143-
.name = "remote_barrier.elf",
99+
.name = "nop.elf",
144100
.device = npu3_device_id1,
145101
.revision_id = npu_any_revision_id,
146102
.ip_name2idx = {
147-
{ "DPU:remote_barrier", {0xffffffff} },
103+
{ "DPU:dpu", {0xffffffff} },
148104
},
149-
.workspace = "npu3_workspace",
105+
.workspace = "local_shim_test_data/elf_no_op_npu3",
150106
.data = "",
151-
.type = KERNEL_TYPE_TXN_FULL_ELF_PREEMPT,
107+
.type = KERNEL_TYPE_TXN_FULL_ELF,
152108
},
153109
{
154110
.name = "1x4.xclbin",

test/shim_test/dev_info.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ enum kernel_type {
1313
KERNEL_TYPE_DPU_SEQ = 0,
1414
KERNEL_TYPE_TXN,
1515
KERNEL_TYPE_TXN_PREEMPT,
16+
KERNEL_TYPE_TXN_FULL_ELF,
1617
KERNEL_TYPE_TXN_FULL_ELF_PREEMPT,
1718
};
1819

test/shim_test/hwctx.h

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,9 @@ class hw_ctx {
3434
{
3535
xrt::xclbin xclbin;
3636
xrt::elf elf;
37-
auto is_full_elf = (get_kernel_type(dev, xclbin_name) == KERNEL_TYPE_TXN_FULL_ELF_PREEMPT);
37+
auto kernel_type = get_kernel_type(dev, xclbin_name);
38+
auto is_full_elf = (kernel_type == KERNEL_TYPE_TXN_FULL_ELF_PREEMPT ||
39+
kernel_type == KERNEL_TYPE_TXN_FULL_ELF);
3840
auto path = get_xclbin_path(dev, xclbin_name);
3941

4042
try {

test/shim_test/io.cpp

Lines changed: 85 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -224,6 +224,21 @@ elf_init_no_arg_cmd(xrt::elf& elf, cuidx_type idx, bool dump, bo& cmd, bo& inst)
224224

225225
} // namespace
226226

227+
void
228+
io_test_bo_set_base::
229+
cache_cmd_header(const buffer_handle *cmd_hdl, const ert_start_kernel_cmd *cmd)
230+
{
231+
m_cached_header = cmd->header;
232+
}
233+
234+
void
235+
io_test_bo_set_base::
236+
restore_cmd_header(const buffer_handle *cmd_hdl, ert_start_kernel_cmd *cmd)
237+
{
238+
if (m_cached_header != 0)
239+
cmd->header = m_cached_header;
240+
}
241+
227242
io_test_bo_set_base::
228243
io_test_bo_set_base(device* dev, const std::string& xclbin_name) :
229244
m_bo_array{}
@@ -384,6 +399,47 @@ elf_io_test_bo_set(device* dev, const std::string& xclbin_name) :
384399
}
385400
}
386401

402+
elf_full_io_test_bo_set::
403+
elf_full_io_test_bo_set(device* dev, const std::string& xclbin_name)
404+
: io_test_bo_set_base(dev, xclbin_name)
405+
{
406+
auto elf_path = get_xclbin_path(dev, xclbin_name.c_str());
407+
m_elf = xrt::elf(elf_path);
408+
auto mod = xrt::module{m_elf};
409+
auto kernel_name = get_kernel_name(dev, xclbin_name.c_str());
410+
411+
try {
412+
m_kernel_index = module_int::get_ctrlcode_id(mod, kernel_name);
413+
} catch (const std::exception& e) {
414+
m_kernel_index = module_int::no_ctrl_code_id;
415+
}
416+
417+
for (int i = 0; i < IO_TEST_BO_MAX_TYPES; i++) {
418+
auto& ibo = m_bo_array[i];
419+
auto type = static_cast<io_test_bo_type>(i);
420+
421+
switch(type) {
422+
case IO_TEST_BO_CMD:
423+
alloc_cmd_bo(ibo, m_dev);
424+
break;
425+
case IO_TEST_BO_INSTRUCTION:
426+
create_ctrl_bo_from_elf(ibo, patcher::buf_type::ctrltext);
427+
break;
428+
case IO_TEST_BO_INPUT:
429+
create_data_bo_from_file(ibo, "ifm.bin", m_FLAG_OPT);
430+
break;
431+
case IO_TEST_BO_PARAMETERS:
432+
create_data_bo_from_file(ibo, "wts.bin", m_FLAG_OPT);
433+
break;
434+
case IO_TEST_BO_OUTPUT:
435+
create_data_bo_from_file(ibo, "ofm.bin", m_FLAG_NO_FILL|m_FLAG_OPT);
436+
break;
437+
default:
438+
break;
439+
}
440+
}
441+
}
442+
387443
elf_preempt_io_test_bo_set::
388444
elf_preempt_io_test_bo_set(device* dev, const std::string& xclbin_name)
389445
: io_test_bo_set_base(dev, xclbin_name)
@@ -605,6 +661,30 @@ init_cmd(hw_ctx& hwctx, bool dump)
605661
patcher::buf_type::ctrltext, m_elf, module_int::no_ctrl_code_id);
606662
}
607663

664+
void
665+
elf_full_io_test_bo_set::
666+
init_cmd(hw_ctx& hwctx, bool dump)
667+
{
668+
exec_buf ebuf(*m_bo_array[IO_TEST_BO_CMD].tbo.get(), ERT_START_DPU);
669+
670+
xrt_core::cuidx_type cu_idx{0};
671+
ebuf.set_cu_idx(cu_idx);
672+
673+
if (m_bo_array[IO_TEST_BO_INPUT].tbo.get()) {
674+
ebuf.add_arg_64(3);
675+
ebuf.add_arg_bo(*m_bo_array[IO_TEST_BO_INPUT].tbo.get(), "0");
676+
ebuf.add_arg_bo(*m_bo_array[IO_TEST_BO_PARAMETERS].tbo.get(), "1");
677+
ebuf.add_arg_bo(*m_bo_array[IO_TEST_BO_OUTPUT].tbo.get(), "2");
678+
}
679+
680+
if (dump)
681+
ebuf.dump();
682+
683+
ebuf.add_ctrl_bo(*m_bo_array[IO_TEST_BO_INSTRUCTION].tbo.get());
684+
ebuf.patch_ctrl_code(*m_bo_array[IO_TEST_BO_INSTRUCTION].tbo.get(),
685+
patcher::buf_type::ctrltext, m_elf, m_kernel_index);
686+
}
687+
608688
void
609689
elf_preempt_io_test_bo_set::
610690
init_cmd(hw_ctx& hwctx, bool dump)
@@ -839,6 +919,11 @@ run(const std::vector<fence_handle*>& wait_fences,
839919

840920
auto cbo = m_bo_array[IO_TEST_BO_CMD].tbo.get();
841921
auto chdl = cbo->get();
922+
auto cpkt = reinterpret_cast<ert_start_kernel_cmd *>(cbo->map());
923+
924+
restore_cmd_header(chdl, cpkt);
925+
cache_cmd_header(chdl, cpkt);
926+
842927
for (const auto& fence : wait_fences)
843928
hwq->submit_wait(fence);
844929
hwq->submit_command(chdl);

test/shim_test/io.h

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,12 @@ class io_test_bo_set_base
7373
static const char *
7474
bo_type2name(int type);
7575

76+
void
77+
cache_cmd_header(const xrt_core::buffer_handle *cmd_hdl, const ert_start_kernel_cmd *cmd);
78+
79+
void
80+
restore_cmd_header(const xrt_core::buffer_handle *cmd_hdl, ert_start_kernel_cmd *cmd);
81+
7682
std::array<io_test_bo, IO_TEST_BO_MAX_TYPES>&
7783
get_bos();
7884

@@ -86,6 +92,7 @@ class io_test_bo_set_base
8692
device *m_dev;
8793
xrt::elf m_elf = {};
8894
uint32_t m_kernel_index;
95+
uint32_t m_cached_header = 0;
8996
const int m_FLAG_USR_BUF = 1 << 0;
9097
const int m_FLAG_OPT = 1 << 1;
9198
const int m_FLAG_NO_FILL = 1 << 2;
@@ -124,6 +131,15 @@ class elf_io_test_bo_set : public io_test_bo_set_base
124131
init_cmd(hw_ctx& hwctx, bool dump) override;
125132
};
126133

134+
class elf_full_io_test_bo_set : public io_test_bo_set_base
135+
{
136+
public:
137+
elf_full_io_test_bo_set(device *dev, const std::string& xclbin_name);
138+
139+
void
140+
init_cmd(hw_ctx& hwctx, bool dump) override;
141+
};
142+
127143
class elf_preempt_io_test_bo_set : public io_test_bo_set_base
128144
{
129145
public:
@@ -190,4 +206,4 @@ class elf_io_gemm_test_bo_set : public io_test_bo_set_base
190206
std::unique_ptr<xrt_core::buffer_handle> m_dbo;
191207
};
192208

193-
#endif // _SHIMTEST_IO_H_
209+
#endif // _SHIMTEST_IO_H_

0 commit comments

Comments
 (0)