1*bb38d854SSrikanth Yalavarthi /* SPDX-License-Identifier: BSD-3-Clause 2*bb38d854SSrikanth Yalavarthi * Copyright (c) 2022 Marvell. 3*bb38d854SSrikanth Yalavarthi */ 4*bb38d854SSrikanth Yalavarthi 5*bb38d854SSrikanth Yalavarthi #include <errno.h> 6*bb38d854SSrikanth Yalavarthi 7*bb38d854SSrikanth Yalavarthi #include <rte_common.h> 8*bb38d854SSrikanth Yalavarthi #include <rte_malloc.h> 9*bb38d854SSrikanth Yalavarthi #include <rte_mldev.h> 10*bb38d854SSrikanth Yalavarthi 11*bb38d854SSrikanth Yalavarthi #include "test_device_ops.h" 12*bb38d854SSrikanth Yalavarthi 13*bb38d854SSrikanth Yalavarthi static bool 14*bb38d854SSrikanth Yalavarthi test_device_cap_check(struct ml_options *opt) 15*bb38d854SSrikanth Yalavarthi { 16*bb38d854SSrikanth Yalavarthi if (!ml_test_cap_check(opt)) 17*bb38d854SSrikanth Yalavarthi return false; 18*bb38d854SSrikanth Yalavarthi 19*bb38d854SSrikanth Yalavarthi return true; 20*bb38d854SSrikanth Yalavarthi } 21*bb38d854SSrikanth Yalavarthi 22*bb38d854SSrikanth Yalavarthi static int 23*bb38d854SSrikanth Yalavarthi test_device_opt_check(struct ml_options *opt) 24*bb38d854SSrikanth Yalavarthi { 25*bb38d854SSrikanth Yalavarthi int ret; 26*bb38d854SSrikanth Yalavarthi 27*bb38d854SSrikanth Yalavarthi /* check common opts */ 28*bb38d854SSrikanth Yalavarthi ret = ml_test_opt_check(opt); 29*bb38d854SSrikanth Yalavarthi if (ret != 0) 30*bb38d854SSrikanth Yalavarthi return ret; 31*bb38d854SSrikanth Yalavarthi 32*bb38d854SSrikanth Yalavarthi return 0; 33*bb38d854SSrikanth Yalavarthi } 34*bb38d854SSrikanth Yalavarthi 35*bb38d854SSrikanth Yalavarthi static void 36*bb38d854SSrikanth Yalavarthi test_device_opt_dump(struct ml_options *opt) 37*bb38d854SSrikanth Yalavarthi { 38*bb38d854SSrikanth Yalavarthi /* dump common opts */ 39*bb38d854SSrikanth Yalavarthi ml_test_opt_dump(opt); 40*bb38d854SSrikanth Yalavarthi } 41*bb38d854SSrikanth Yalavarthi 42*bb38d854SSrikanth Yalavarthi static int 43*bb38d854SSrikanth Yalavarthi test_device_setup(struct ml_test *test, struct ml_options *opt) 44*bb38d854SSrikanth Yalavarthi { 45*bb38d854SSrikanth Yalavarthi struct test_device *t; 46*bb38d854SSrikanth Yalavarthi void *test_device; 47*bb38d854SSrikanth Yalavarthi int ret = 0; 48*bb38d854SSrikanth Yalavarthi 49*bb38d854SSrikanth Yalavarthi /* allocate for test structure */ 50*bb38d854SSrikanth Yalavarthi test_device = rte_zmalloc_socket(test->name, sizeof(struct test_device), 51*bb38d854SSrikanth Yalavarthi RTE_CACHE_LINE_SIZE, opt->socket_id); 52*bb38d854SSrikanth Yalavarthi if (test_device == NULL) { 53*bb38d854SSrikanth Yalavarthi ml_err("failed to allocate memory for test_model"); 54*bb38d854SSrikanth Yalavarthi ret = -ENOMEM; 55*bb38d854SSrikanth Yalavarthi goto error; 56*bb38d854SSrikanth Yalavarthi } 57*bb38d854SSrikanth Yalavarthi test->test_priv = test_device; 58*bb38d854SSrikanth Yalavarthi t = ml_test_priv(test); 59*bb38d854SSrikanth Yalavarthi 60*bb38d854SSrikanth Yalavarthi t->cmn.result = ML_TEST_FAILED; 61*bb38d854SSrikanth Yalavarthi t->cmn.opt = opt; 62*bb38d854SSrikanth Yalavarthi 63*bb38d854SSrikanth Yalavarthi /* get device info */ 64*bb38d854SSrikanth Yalavarthi ret = rte_ml_dev_info_get(opt->dev_id, &t->cmn.dev_info); 65*bb38d854SSrikanth Yalavarthi if (ret < 0) { 66*bb38d854SSrikanth Yalavarthi ml_err("failed to get device info"); 67*bb38d854SSrikanth Yalavarthi goto error; 68*bb38d854SSrikanth Yalavarthi } 69*bb38d854SSrikanth Yalavarthi 70*bb38d854SSrikanth Yalavarthi return 0; 71*bb38d854SSrikanth Yalavarthi 72*bb38d854SSrikanth Yalavarthi error: 73*bb38d854SSrikanth Yalavarthi if (test_device != NULL) 74*bb38d854SSrikanth Yalavarthi rte_free(test_device); 75*bb38d854SSrikanth Yalavarthi 76*bb38d854SSrikanth Yalavarthi return ret; 77*bb38d854SSrikanth Yalavarthi } 78*bb38d854SSrikanth Yalavarthi 79*bb38d854SSrikanth Yalavarthi static void 80*bb38d854SSrikanth Yalavarthi test_device_destroy(struct ml_test *test, struct ml_options *opt) 81*bb38d854SSrikanth Yalavarthi { 82*bb38d854SSrikanth Yalavarthi struct test_device *t; 83*bb38d854SSrikanth Yalavarthi 84*bb38d854SSrikanth Yalavarthi RTE_SET_USED(opt); 85*bb38d854SSrikanth Yalavarthi 86*bb38d854SSrikanth Yalavarthi t = ml_test_priv(test); 87*bb38d854SSrikanth Yalavarthi if (t != NULL) 88*bb38d854SSrikanth Yalavarthi rte_free(t); 89*bb38d854SSrikanth Yalavarthi } 90*bb38d854SSrikanth Yalavarthi 91*bb38d854SSrikanth Yalavarthi static int 92*bb38d854SSrikanth Yalavarthi test_device_reconfigure(struct ml_test *test, struct ml_options *opt) 93*bb38d854SSrikanth Yalavarthi { 94*bb38d854SSrikanth Yalavarthi struct rte_ml_dev_config dev_config; 95*bb38d854SSrikanth Yalavarthi struct rte_ml_dev_qp_conf qp_conf; 96*bb38d854SSrikanth Yalavarthi struct test_device *t; 97*bb38d854SSrikanth Yalavarthi uint16_t qp_id = 0; 98*bb38d854SSrikanth Yalavarthi int ret = 0; 99*bb38d854SSrikanth Yalavarthi 100*bb38d854SSrikanth Yalavarthi t = ml_test_priv(test); 101*bb38d854SSrikanth Yalavarthi 102*bb38d854SSrikanth Yalavarthi /* configure with default options */ 103*bb38d854SSrikanth Yalavarthi ret = ml_test_device_configure(test, opt); 104*bb38d854SSrikanth Yalavarthi if (ret != 0) 105*bb38d854SSrikanth Yalavarthi return ret; 106*bb38d854SSrikanth Yalavarthi 107*bb38d854SSrikanth Yalavarthi /* setup one queue pair with nb_desc = 1 */ 108*bb38d854SSrikanth Yalavarthi qp_conf.nb_desc = 1; 109*bb38d854SSrikanth Yalavarthi qp_conf.cb = NULL; 110*bb38d854SSrikanth Yalavarthi 111*bb38d854SSrikanth Yalavarthi ret = rte_ml_dev_queue_pair_setup(opt->dev_id, qp_id, &qp_conf, opt->socket_id); 112*bb38d854SSrikanth Yalavarthi if (ret != 0) { 113*bb38d854SSrikanth Yalavarthi ml_err("Failed to setup ML device queue-pair, dev_id = %d, qp_id = %u\n", 114*bb38d854SSrikanth Yalavarthi opt->dev_id, qp_id); 115*bb38d854SSrikanth Yalavarthi goto error; 116*bb38d854SSrikanth Yalavarthi } 117*bb38d854SSrikanth Yalavarthi 118*bb38d854SSrikanth Yalavarthi /* start device */ 119*bb38d854SSrikanth Yalavarthi ret = ml_test_device_start(test, opt); 120*bb38d854SSrikanth Yalavarthi if (ret != 0) 121*bb38d854SSrikanth Yalavarthi goto error; 122*bb38d854SSrikanth Yalavarthi 123*bb38d854SSrikanth Yalavarthi /* stop device */ 124*bb38d854SSrikanth Yalavarthi ret = ml_test_device_stop(test, opt); 125*bb38d854SSrikanth Yalavarthi if (ret != 0) { 126*bb38d854SSrikanth Yalavarthi ml_err("Failed to stop device"); 127*bb38d854SSrikanth Yalavarthi goto error; 128*bb38d854SSrikanth Yalavarthi } 129*bb38d854SSrikanth Yalavarthi 130*bb38d854SSrikanth Yalavarthi /* reconfigure device based on dev_info */ 131*bb38d854SSrikanth Yalavarthi dev_config.socket_id = opt->socket_id; 132*bb38d854SSrikanth Yalavarthi dev_config.nb_models = t->cmn.dev_info.max_models; 133*bb38d854SSrikanth Yalavarthi dev_config.nb_queue_pairs = t->cmn.dev_info.max_queue_pairs; 134*bb38d854SSrikanth Yalavarthi ret = rte_ml_dev_configure(opt->dev_id, &dev_config); 135*bb38d854SSrikanth Yalavarthi if (ret != 0) { 136*bb38d854SSrikanth Yalavarthi ml_err("Failed to reconfigure ML device, dev_id = %d\n", opt->dev_id); 137*bb38d854SSrikanth Yalavarthi return ret; 138*bb38d854SSrikanth Yalavarthi } 139*bb38d854SSrikanth Yalavarthi 140*bb38d854SSrikanth Yalavarthi /* setup queue pairs */ 141*bb38d854SSrikanth Yalavarthi for (qp_id = 0; qp_id < t->cmn.dev_info.max_queue_pairs; qp_id++) { 142*bb38d854SSrikanth Yalavarthi qp_conf.nb_desc = t->cmn.dev_info.max_desc; 143*bb38d854SSrikanth Yalavarthi qp_conf.cb = NULL; 144*bb38d854SSrikanth Yalavarthi 145*bb38d854SSrikanth Yalavarthi ret = rte_ml_dev_queue_pair_setup(opt->dev_id, qp_id, &qp_conf, opt->socket_id); 146*bb38d854SSrikanth Yalavarthi if (ret != 0) { 147*bb38d854SSrikanth Yalavarthi ml_err("Failed to setup ML device queue-pair, dev_id = %d, qp_id = %u\n", 148*bb38d854SSrikanth Yalavarthi opt->dev_id, qp_id); 149*bb38d854SSrikanth Yalavarthi goto error; 150*bb38d854SSrikanth Yalavarthi } 151*bb38d854SSrikanth Yalavarthi } 152*bb38d854SSrikanth Yalavarthi 153*bb38d854SSrikanth Yalavarthi /* start device */ 154*bb38d854SSrikanth Yalavarthi ret = ml_test_device_start(test, opt); 155*bb38d854SSrikanth Yalavarthi if (ret != 0) 156*bb38d854SSrikanth Yalavarthi goto error; 157*bb38d854SSrikanth Yalavarthi 158*bb38d854SSrikanth Yalavarthi /* stop device */ 159*bb38d854SSrikanth Yalavarthi ret = ml_test_device_stop(test, opt); 160*bb38d854SSrikanth Yalavarthi if (ret != 0) 161*bb38d854SSrikanth Yalavarthi goto error; 162*bb38d854SSrikanth Yalavarthi 163*bb38d854SSrikanth Yalavarthi /* close device */ 164*bb38d854SSrikanth Yalavarthi ret = ml_test_device_close(test, opt); 165*bb38d854SSrikanth Yalavarthi if (ret != 0) 166*bb38d854SSrikanth Yalavarthi return ret; 167*bb38d854SSrikanth Yalavarthi 168*bb38d854SSrikanth Yalavarthi return 0; 169*bb38d854SSrikanth Yalavarthi 170*bb38d854SSrikanth Yalavarthi error: 171*bb38d854SSrikanth Yalavarthi ml_test_device_close(test, opt); 172*bb38d854SSrikanth Yalavarthi 173*bb38d854SSrikanth Yalavarthi return ret; 174*bb38d854SSrikanth Yalavarthi } 175*bb38d854SSrikanth Yalavarthi 176*bb38d854SSrikanth Yalavarthi static int 177*bb38d854SSrikanth Yalavarthi test_device_driver(struct ml_test *test, struct ml_options *opt) 178*bb38d854SSrikanth Yalavarthi { 179*bb38d854SSrikanth Yalavarthi struct test_device *t; 180*bb38d854SSrikanth Yalavarthi int ret = 0; 181*bb38d854SSrikanth Yalavarthi 182*bb38d854SSrikanth Yalavarthi t = ml_test_priv(test); 183*bb38d854SSrikanth Yalavarthi 184*bb38d854SSrikanth Yalavarthi /* sub-test: device reconfigure */ 185*bb38d854SSrikanth Yalavarthi ret = test_device_reconfigure(test, opt); 186*bb38d854SSrikanth Yalavarthi if (ret != 0) { 187*bb38d854SSrikanth Yalavarthi printf("\n"); 188*bb38d854SSrikanth Yalavarthi printf("Model Device Reconfigure Test: " CLRED "%s" CLNRM "\n", "Failed"); 189*bb38d854SSrikanth Yalavarthi goto error; 190*bb38d854SSrikanth Yalavarthi } else { 191*bb38d854SSrikanth Yalavarthi printf("\n"); 192*bb38d854SSrikanth Yalavarthi printf("Model Device Reconfigure Test: " CLYEL "%s" CLNRM "\n", "Passed"); 193*bb38d854SSrikanth Yalavarthi } 194*bb38d854SSrikanth Yalavarthi 195*bb38d854SSrikanth Yalavarthi printf("\n"); 196*bb38d854SSrikanth Yalavarthi 197*bb38d854SSrikanth Yalavarthi t->cmn.result = ML_TEST_SUCCESS; 198*bb38d854SSrikanth Yalavarthi 199*bb38d854SSrikanth Yalavarthi return 0; 200*bb38d854SSrikanth Yalavarthi 201*bb38d854SSrikanth Yalavarthi error: 202*bb38d854SSrikanth Yalavarthi t->cmn.result = ML_TEST_FAILED; 203*bb38d854SSrikanth Yalavarthi return -1; 204*bb38d854SSrikanth Yalavarthi } 205*bb38d854SSrikanth Yalavarthi 206*bb38d854SSrikanth Yalavarthi static int 207*bb38d854SSrikanth Yalavarthi test_device_result(struct ml_test *test, struct ml_options *opt) 208*bb38d854SSrikanth Yalavarthi { 209*bb38d854SSrikanth Yalavarthi struct test_device *t; 210*bb38d854SSrikanth Yalavarthi 211*bb38d854SSrikanth Yalavarthi RTE_SET_USED(opt); 212*bb38d854SSrikanth Yalavarthi 213*bb38d854SSrikanth Yalavarthi t = ml_test_priv(test); 214*bb38d854SSrikanth Yalavarthi 215*bb38d854SSrikanth Yalavarthi return t->cmn.result; 216*bb38d854SSrikanth Yalavarthi } 217*bb38d854SSrikanth Yalavarthi 218*bb38d854SSrikanth Yalavarthi static const struct ml_test_ops device_ops = { 219*bb38d854SSrikanth Yalavarthi .cap_check = test_device_cap_check, 220*bb38d854SSrikanth Yalavarthi .opt_check = test_device_opt_check, 221*bb38d854SSrikanth Yalavarthi .opt_dump = test_device_opt_dump, 222*bb38d854SSrikanth Yalavarthi .test_setup = test_device_setup, 223*bb38d854SSrikanth Yalavarthi .test_destroy = test_device_destroy, 224*bb38d854SSrikanth Yalavarthi .test_driver = test_device_driver, 225*bb38d854SSrikanth Yalavarthi .test_result = test_device_result, 226*bb38d854SSrikanth Yalavarthi }; 227*bb38d854SSrikanth Yalavarthi 228*bb38d854SSrikanth Yalavarthi ML_TEST_REGISTER(device_ops); 229