1f6661e6dSSrikanth Yalavarthi /* SPDX-License-Identifier: BSD-3-Clause 2f6661e6dSSrikanth Yalavarthi * Copyright (c) 2022 Marvell. 3f6661e6dSSrikanth Yalavarthi */ 4f6661e6dSSrikanth Yalavarthi 5f6661e6dSSrikanth Yalavarthi #include <errno.h> 6f6661e6dSSrikanth Yalavarthi 7f6661e6dSSrikanth Yalavarthi #include <rte_common.h> 8f6661e6dSSrikanth Yalavarthi #include <rte_malloc.h> 9f6661e6dSSrikanth Yalavarthi #include <rte_mldev.h> 10f6661e6dSSrikanth Yalavarthi 11f6661e6dSSrikanth Yalavarthi #include "ml_common.h" 12f6661e6dSSrikanth Yalavarthi #include "test_model_common.h" 13f6661e6dSSrikanth Yalavarthi 14f6661e6dSSrikanth Yalavarthi int 15f6661e6dSSrikanth Yalavarthi ml_model_load(struct ml_test *test, struct ml_options *opt, struct ml_model *model, uint16_t fid) 16f6661e6dSSrikanth Yalavarthi { 17f6661e6dSSrikanth Yalavarthi struct rte_ml_model_params model_params; 18f6661e6dSSrikanth Yalavarthi int ret; 19f6661e6dSSrikanth Yalavarthi 20*fccf444cSSrikanth Yalavarthi RTE_SET_USED(test); 21*fccf444cSSrikanth Yalavarthi 22f6661e6dSSrikanth Yalavarthi if (model->state == MODEL_LOADED) 23f6661e6dSSrikanth Yalavarthi return 0; 24f6661e6dSSrikanth Yalavarthi 25f6661e6dSSrikanth Yalavarthi if (model->state != MODEL_INITIAL) 26f6661e6dSSrikanth Yalavarthi return -EINVAL; 27f6661e6dSSrikanth Yalavarthi 28f6661e6dSSrikanth Yalavarthi /* read model binary */ 29*fccf444cSSrikanth Yalavarthi ret = ml_read_file(opt->filelist[fid].model, &model_params.size, 30*fccf444cSSrikanth Yalavarthi (char **)&model_params.addr); 31*fccf444cSSrikanth Yalavarthi if (ret != 0) 32*fccf444cSSrikanth Yalavarthi return ret; 33f6661e6dSSrikanth Yalavarthi 34f6661e6dSSrikanth Yalavarthi /* load model to device */ 35f6661e6dSSrikanth Yalavarthi ret = rte_ml_model_load(opt->dev_id, &model_params, &model->id); 36f6661e6dSSrikanth Yalavarthi if (ret != 0) { 37f6661e6dSSrikanth Yalavarthi ml_err("Failed to load model : %s\n", opt->filelist[fid].model); 38f6661e6dSSrikanth Yalavarthi model->state = MODEL_ERROR; 39*fccf444cSSrikanth Yalavarthi free(model_params.addr); 40f6661e6dSSrikanth Yalavarthi return ret; 41f6661e6dSSrikanth Yalavarthi } 42f6661e6dSSrikanth Yalavarthi 43*fccf444cSSrikanth Yalavarthi /* release buffer */ 44*fccf444cSSrikanth Yalavarthi free(model_params.addr); 45f6661e6dSSrikanth Yalavarthi 46f6661e6dSSrikanth Yalavarthi /* get model info */ 47f6661e6dSSrikanth Yalavarthi ret = rte_ml_model_info_get(opt->dev_id, model->id, &model->info); 48f6661e6dSSrikanth Yalavarthi if (ret != 0) { 49f6661e6dSSrikanth Yalavarthi ml_err("Failed to get model info : %s\n", opt->filelist[fid].model); 50f6661e6dSSrikanth Yalavarthi return ret; 51f6661e6dSSrikanth Yalavarthi } 52f6661e6dSSrikanth Yalavarthi 5338e884b5SSrikanth Yalavarthi /* Update number of batches */ 5438e884b5SSrikanth Yalavarthi if (opt->batches == 0) 5538e884b5SSrikanth Yalavarthi model->nb_batches = model->info.batch_size; 5638e884b5SSrikanth Yalavarthi else 5738e884b5SSrikanth Yalavarthi model->nb_batches = opt->batches; 5838e884b5SSrikanth Yalavarthi 59f6661e6dSSrikanth Yalavarthi model->state = MODEL_LOADED; 60f6661e6dSSrikanth Yalavarthi 61f6661e6dSSrikanth Yalavarthi return 0; 62f6661e6dSSrikanth Yalavarthi } 63f6661e6dSSrikanth Yalavarthi 64f6661e6dSSrikanth Yalavarthi int 65f6661e6dSSrikanth Yalavarthi ml_model_unload(struct ml_test *test, struct ml_options *opt, struct ml_model *model, uint16_t fid) 66f6661e6dSSrikanth Yalavarthi { 67f6661e6dSSrikanth Yalavarthi struct test_common *t = ml_test_priv(test); 68f6661e6dSSrikanth Yalavarthi int ret; 69f6661e6dSSrikanth Yalavarthi 70f6661e6dSSrikanth Yalavarthi RTE_SET_USED(t); 71f6661e6dSSrikanth Yalavarthi 72f6661e6dSSrikanth Yalavarthi if (model->state == MODEL_INITIAL) 73f6661e6dSSrikanth Yalavarthi return 0; 74f6661e6dSSrikanth Yalavarthi 75f6661e6dSSrikanth Yalavarthi if (model->state != MODEL_LOADED) 76f6661e6dSSrikanth Yalavarthi return -EINVAL; 77f6661e6dSSrikanth Yalavarthi 78f6661e6dSSrikanth Yalavarthi /* unload model */ 79f6661e6dSSrikanth Yalavarthi ret = rte_ml_model_unload(opt->dev_id, model->id); 80f6661e6dSSrikanth Yalavarthi if (ret != 0) { 81f6661e6dSSrikanth Yalavarthi ml_err("Failed to unload model: %s\n", opt->filelist[fid].model); 82f6661e6dSSrikanth Yalavarthi model->state = MODEL_ERROR; 83f6661e6dSSrikanth Yalavarthi return ret; 84f6661e6dSSrikanth Yalavarthi } 85f6661e6dSSrikanth Yalavarthi 86f6661e6dSSrikanth Yalavarthi model->state = MODEL_INITIAL; 87f6661e6dSSrikanth Yalavarthi 88f6661e6dSSrikanth Yalavarthi return 0; 89f6661e6dSSrikanth Yalavarthi } 90f6661e6dSSrikanth Yalavarthi 91f6661e6dSSrikanth Yalavarthi int 92f6661e6dSSrikanth Yalavarthi ml_model_start(struct ml_test *test, struct ml_options *opt, struct ml_model *model, uint16_t fid) 93f6661e6dSSrikanth Yalavarthi { 94f6661e6dSSrikanth Yalavarthi struct test_common *t = ml_test_priv(test); 95f6661e6dSSrikanth Yalavarthi int ret; 96f6661e6dSSrikanth Yalavarthi 97f6661e6dSSrikanth Yalavarthi RTE_SET_USED(t); 98f6661e6dSSrikanth Yalavarthi 99f6661e6dSSrikanth Yalavarthi if (model->state == MODEL_STARTED) 100f6661e6dSSrikanth Yalavarthi return 0; 101f6661e6dSSrikanth Yalavarthi 102f6661e6dSSrikanth Yalavarthi if (model->state != MODEL_LOADED) 103f6661e6dSSrikanth Yalavarthi return -EINVAL; 104f6661e6dSSrikanth Yalavarthi 105f6661e6dSSrikanth Yalavarthi /* start model */ 106f6661e6dSSrikanth Yalavarthi ret = rte_ml_model_start(opt->dev_id, model->id); 107f6661e6dSSrikanth Yalavarthi if (ret != 0) { 108f6661e6dSSrikanth Yalavarthi ml_err("Failed to start model : %s\n", opt->filelist[fid].model); 109f6661e6dSSrikanth Yalavarthi model->state = MODEL_ERROR; 110f6661e6dSSrikanth Yalavarthi return ret; 111f6661e6dSSrikanth Yalavarthi } 112f6661e6dSSrikanth Yalavarthi 113f6661e6dSSrikanth Yalavarthi model->state = MODEL_STARTED; 114f6661e6dSSrikanth Yalavarthi 115f6661e6dSSrikanth Yalavarthi return 0; 116f6661e6dSSrikanth Yalavarthi } 117f6661e6dSSrikanth Yalavarthi 118f6661e6dSSrikanth Yalavarthi int 119f6661e6dSSrikanth Yalavarthi ml_model_stop(struct ml_test *test, struct ml_options *opt, struct ml_model *model, uint16_t fid) 120f6661e6dSSrikanth Yalavarthi { 121f6661e6dSSrikanth Yalavarthi struct test_common *t = ml_test_priv(test); 122f6661e6dSSrikanth Yalavarthi int ret; 123f6661e6dSSrikanth Yalavarthi 124f6661e6dSSrikanth Yalavarthi RTE_SET_USED(t); 125f6661e6dSSrikanth Yalavarthi 126f6661e6dSSrikanth Yalavarthi if (model->state == MODEL_LOADED) 127f6661e6dSSrikanth Yalavarthi return 0; 128f6661e6dSSrikanth Yalavarthi 129f6661e6dSSrikanth Yalavarthi if (model->state != MODEL_STARTED) 130f6661e6dSSrikanth Yalavarthi return -EINVAL; 131f6661e6dSSrikanth Yalavarthi 132f6661e6dSSrikanth Yalavarthi /* stop model */ 133f6661e6dSSrikanth Yalavarthi ret = rte_ml_model_stop(opt->dev_id, model->id); 134f6661e6dSSrikanth Yalavarthi if (ret != 0) { 135f6661e6dSSrikanth Yalavarthi ml_err("Failed to stop model: %s\n", opt->filelist[fid].model); 136f6661e6dSSrikanth Yalavarthi model->state = MODEL_ERROR; 137f6661e6dSSrikanth Yalavarthi return ret; 138f6661e6dSSrikanth Yalavarthi } 139f6661e6dSSrikanth Yalavarthi 140f6661e6dSSrikanth Yalavarthi model->state = MODEL_LOADED; 141f6661e6dSSrikanth Yalavarthi 142f6661e6dSSrikanth Yalavarthi return 0; 143f6661e6dSSrikanth Yalavarthi } 144