diff options
author | Tuomas Taipale <tuomas.taipale@nokia.com> | 2023-04-26 11:23:47 +0000 |
---|---|---|
committer | Matias Elo <matias.elo@nokia.com> | 2023-05-08 16:40:19 +0300 |
commit | 1aaf5cf55a0ca0154cd4d7ff9fb7bc985eaa136a (patch) | |
tree | 23ef0bd51182165d624fdc807b25228e29a7d6ca /test | |
parent | 912bdf71483e9491d1d7f6b771a9ef6feaea709e (diff) |
validation: dma: add tests for maximum segment amount transfers
Verify that maximum capability amount of input segments can be
transferred to maximum capability amount of output segments with
both packet and address transfer types.
Signed-off-by: Tuomas Taipale <tuomas.taipale@nokia.com>
Reviewed-by: Matias Elo <matias.elo@nokia.com>
Diffstat (limited to 'test')
-rw-r--r-- | test/validation/api/dma/dma.c | 151 |
1 files changed, 150 insertions, 1 deletions
diff --git a/test/validation/api/dma/dma.c b/test/validation/api/dma/dma.c index ad42c9bb3..ee93e67c0 100644 --- a/test/validation/api/dma/dma.c +++ b/test/validation/api/dma/dma.c @@ -101,7 +101,7 @@ static int dma_suite_init(void) pkt_len = MIN(pkt_len, global.dma_capa.max_seg_len); odp_pool_param_init(&pool_param); pool_param.type = ODP_POOL_PACKET; - pool_param.pkt.num = 4; + pool_param.pkt.num = global.dma_capa.max_src_segs + global.dma_capa.max_dst_segs; pool_param.pkt.len = pkt_len; pool_param.pkt.max_len = pkt_len; @@ -1126,6 +1126,72 @@ static void test_dma_addr_to_addr_sync_res(void) test_dma_addr_to_addr(ODP_DMA_COMPL_SYNC, 1, 0, RESULT); } +static void get_seg_lens(uint32_t max_len, uint32_t *src, uint32_t *dst) +{ + uint32_t src_segs = *src, dst_segs = *dst; + + *src = max_len / src_segs; + *dst = *src * src_segs / dst_segs + *src * src_segs % dst_segs; +} + +static void test_dma_addr_to_addr_sync_max_seg(void) +{ + odp_dma_param_t dma_param; + odp_dma_transfer_param_t trs_param; + odp_dma_t dma; + odp_dma_seg_t src_seg[global.dma_capa.max_src_segs]; + odp_dma_seg_t dst_seg[global.dma_capa.max_dst_segs]; + uint32_t src_len = global.dma_capa.max_src_segs, dst_len = global.dma_capa.max_dst_segs, + len; + int ret; + + init_source(global.src_addr, global.data_size); + memset(global.dst_addr, 0, global.data_size); + odp_dma_param_init(&dma_param); + dma_param.compl_mode_mask = ODP_DMA_COMPL_SYNC; + dma = odp_dma_create("addr_to_addr_max_seg", &dma_param); + + CU_ASSERT_FATAL(dma != ODP_DMA_INVALID); + + get_seg_lens(global.len, &src_len, &dst_len); + + for (uint32_t i = 0; i < global.dma_capa.max_src_segs; i++) { + uint8_t *addr = global.src_addr + i * src_len; + + memset(&src_seg[i], 0, sizeof(odp_dma_seg_t)); + src_seg[i].addr = addr; + src_seg[i].len = src_len; + } + + len = src_len * global.dma_capa.max_src_segs; + + for (uint32_t i = 0; i < global.dma_capa.max_dst_segs; i++) { + uint8_t *addr = global.dst_addr + i * dst_len; + + memset(&dst_seg[i], 0, sizeof(odp_dma_seg_t)); + dst_seg[i].addr = addr; + dst_seg[i].len = MIN(len, dst_len); + len -= dst_len; + } + + odp_dma_transfer_param_init(&trs_param); + trs_param.src_format = ODP_DMA_FORMAT_ADDR; + trs_param.dst_format = ODP_DMA_FORMAT_ADDR; + trs_param.num_src = global.dma_capa.max_src_segs; + trs_param.num_dst = global.dma_capa.max_dst_segs; + trs_param.src_seg = src_seg; + trs_param.dst_seg = dst_seg; + ret = do_transfer(dma, &trs_param, 0, 0); + + if (ret > 0) { + len = src_len * global.dma_capa.max_src_segs; + + CU_ASSERT(check_equal(global.src_addr, global.dst_addr, len) == 0); + } + + CU_ASSERT(odp_dma_destroy(dma) == 0); +} + static void test_dma_addr_to_pkt_sync(void) { test_dma_addr_to_pkt(ODP_DMA_COMPL_SYNC, 0); @@ -1141,6 +1207,87 @@ static void test_dma_pkt_to_pkt_sync(void) test_dma_pkt_to_pkt(ODP_DMA_COMPL_SYNC, 0); } +static void test_dma_pkt_to_pkt_sync_max_seg(void) +{ + odp_dma_param_t dma_param; + odp_dma_transfer_param_t trs_param; + odp_dma_t dma; + odp_packet_t pkt; + odp_dma_seg_t src_seg[global.dma_capa.max_src_segs]; + odp_dma_seg_t dst_seg[global.dma_capa.max_dst_segs]; + uint32_t src_len = global.dma_capa.max_src_segs, dst_len = global.dma_capa.max_dst_segs, + len; + int ret; + + odp_dma_param_init(&dma_param); + dma_param.compl_mode_mask = ODP_DMA_COMPL_SYNC; + dma = odp_dma_create("pkt_to_pkt_max_seg", &dma_param); + + CU_ASSERT_FATAL(dma != ODP_DMA_INVALID); + + pkt = odp_packet_alloc(global.pkt_pool, global.pkt_len); + + CU_ASSERT_FATAL(pkt != ODP_PACKET_INVALID); + + get_seg_lens(odp_packet_seg_len(pkt), &src_len, &dst_len); + odp_packet_free(pkt); + + for (uint32_t i = 0; i < global.dma_capa.max_src_segs; i++) { + pkt = odp_packet_alloc(global.pkt_pool, src_len); + + CU_ASSERT_FATAL(pkt != ODP_PACKET_INVALID); + + init_source(odp_packet_data(pkt), src_len); + memset(&src_seg[i], 0, sizeof(odp_dma_seg_t)); + src_seg[i].packet = pkt; + src_seg[i].len = src_len; + } + + len = src_len * global.dma_capa.max_src_segs; + + for (uint32_t i = 0; i < global.dma_capa.max_dst_segs; i++) { + pkt = odp_packet_alloc(global.pkt_pool, dst_len); + + CU_ASSERT_FATAL(pkt != ODP_PACKET_INVALID); + + memset(odp_packet_data(pkt), 0, dst_len); + memset(&dst_seg[i], 0, sizeof(odp_dma_seg_t)); + dst_seg[i].packet = pkt; + dst_seg[i].len = MIN(len, dst_len); + len -= dst_len; + } + + odp_dma_transfer_param_init(&trs_param); + trs_param.src_format = ODP_DMA_FORMAT_PACKET; + trs_param.dst_format = ODP_DMA_FORMAT_PACKET; + trs_param.num_src = global.dma_capa.max_src_segs; + trs_param.num_dst = global.dma_capa.max_dst_segs; + trs_param.src_seg = src_seg; + trs_param.dst_seg = dst_seg; + ret = do_transfer(dma, &trs_param, 0, 0); + + if (ret > 0) { + len = src_len * global.dma_capa.max_src_segs; + uint8_t src[len], dst[len]; + + for (uint32_t i = 0; i < global.dma_capa.max_src_segs; i++) { + memcpy(src + i * src_len, odp_packet_data(src_seg[i].packet), + src_seg[i].len); + odp_packet_free(src_seg[i].packet); + } + + for (uint32_t i = 0; i < global.dma_capa.max_dst_segs; i++) { + memcpy(dst + i * dst_len, odp_packet_data(dst_seg[i].packet), + dst_seg[i].len); + odp_packet_free(dst_seg[i].packet); + } + + CU_ASSERT(check_equal(src, dst, len) == 0); + } + + CU_ASSERT(odp_dma_destroy(dma) == 0); +} + static void test_dma_addr_to_addr_poll(void) { test_dma_addr_to_addr(ODP_DMA_COMPL_POLL, 1, 0, 0); @@ -1305,9 +1452,11 @@ odp_testinfo_t dma_suite[] = { ODP_TEST_INFO_CONDITIONAL(test_dma_addr_to_addr_sync_mtrs, check_sync), ODP_TEST_INFO_CONDITIONAL(test_dma_addr_to_addr_sync_mseg, check_sync), ODP_TEST_INFO_CONDITIONAL(test_dma_addr_to_addr_sync_res, check_sync), + ODP_TEST_INFO_CONDITIONAL(test_dma_addr_to_addr_sync_max_seg, check_sync), ODP_TEST_INFO_CONDITIONAL(test_dma_addr_to_pkt_sync, check_sync), ODP_TEST_INFO_CONDITIONAL(test_dma_pkt_to_addr_sync, check_sync), ODP_TEST_INFO_CONDITIONAL(test_dma_pkt_to_pkt_sync, check_sync), + ODP_TEST_INFO_CONDITIONAL(test_dma_pkt_to_pkt_sync_max_seg, check_sync), ODP_TEST_INFO_CONDITIONAL(test_dma_addr_to_addr_poll, check_poll), ODP_TEST_INFO_CONDITIONAL(test_dma_addr_to_addr_poll_mtrs, check_poll), ODP_TEST_INFO_CONDITIONAL(test_dma_addr_to_addr_poll_mseg, check_poll), |