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 test_common *t = ml_test_priv(test); 18f6661e6dSSrikanth Yalavarthi struct rte_ml_model_params model_params; 19f6661e6dSSrikanth Yalavarthi FILE *fp; 20f6661e6dSSrikanth Yalavarthi int ret; 21f6661e6dSSrikanth 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 */ 29f6661e6dSSrikanth Yalavarthi fp = fopen(opt->filelist[fid].model, "r"); 30f6661e6dSSrikanth Yalavarthi if (fp == NULL) { 31f6661e6dSSrikanth Yalavarthi ml_err("Failed to open model file : %s\n", opt->filelist[fid].model); 32f6661e6dSSrikanth Yalavarthi return -1; 33f6661e6dSSrikanth Yalavarthi } 34f6661e6dSSrikanth Yalavarthi 35f6661e6dSSrikanth Yalavarthi fseek(fp, 0, SEEK_END); 36f6661e6dSSrikanth Yalavarthi model_params.size = ftell(fp); 37f6661e6dSSrikanth Yalavarthi fseek(fp, 0, SEEK_SET); 38f6661e6dSSrikanth Yalavarthi 39f6661e6dSSrikanth Yalavarthi model_params.addr = rte_malloc_socket("ml_model", model_params.size, 40f6661e6dSSrikanth Yalavarthi t->dev_info.min_align_size, opt->socket_id); 41f6661e6dSSrikanth Yalavarthi if (model_params.addr == NULL) { 42f6661e6dSSrikanth Yalavarthi ml_err("Failed to allocate memory for model: %s\n", opt->filelist[fid].model); 43f6661e6dSSrikanth Yalavarthi fclose(fp); 44f6661e6dSSrikanth Yalavarthi return -ENOMEM; 45f6661e6dSSrikanth Yalavarthi } 46f6661e6dSSrikanth Yalavarthi 47f6661e6dSSrikanth Yalavarthi if (fread(model_params.addr, 1, model_params.size, fp) != model_params.size) { 48f6661e6dSSrikanth Yalavarthi ml_err("Failed to read model file : %s\n", opt->filelist[fid].model); 49f6661e6dSSrikanth Yalavarthi rte_free(model_params.addr); 50f6661e6dSSrikanth Yalavarthi fclose(fp); 51f6661e6dSSrikanth Yalavarthi return -1; 52f6661e6dSSrikanth Yalavarthi } 53f6661e6dSSrikanth Yalavarthi fclose(fp); 54f6661e6dSSrikanth Yalavarthi 55f6661e6dSSrikanth Yalavarthi /* load model to device */ 56f6661e6dSSrikanth Yalavarthi ret = rte_ml_model_load(opt->dev_id, &model_params, &model->id); 57f6661e6dSSrikanth Yalavarthi if (ret != 0) { 58f6661e6dSSrikanth Yalavarthi ml_err("Failed to load model : %s\n", opt->filelist[fid].model); 59f6661e6dSSrikanth Yalavarthi model->state = MODEL_ERROR; 60f6661e6dSSrikanth Yalavarthi rte_free(model_params.addr); 61f6661e6dSSrikanth Yalavarthi return ret; 62f6661e6dSSrikanth Yalavarthi } 63f6661e6dSSrikanth Yalavarthi 64f6661e6dSSrikanth Yalavarthi /* release mz */ 65f6661e6dSSrikanth Yalavarthi rte_free(model_params.addr); 66f6661e6dSSrikanth Yalavarthi 67f6661e6dSSrikanth Yalavarthi /* get model info */ 68f6661e6dSSrikanth Yalavarthi ret = rte_ml_model_info_get(opt->dev_id, model->id, &model->info); 69f6661e6dSSrikanth Yalavarthi if (ret != 0) { 70f6661e6dSSrikanth Yalavarthi ml_err("Failed to get model info : %s\n", opt->filelist[fid].model); 71f6661e6dSSrikanth Yalavarthi return ret; 72f6661e6dSSrikanth Yalavarthi } 73f6661e6dSSrikanth Yalavarthi 74*38e884b5SSrikanth Yalavarthi /* Update number of batches */ 75*38e884b5SSrikanth Yalavarthi if (opt->batches == 0) 76*38e884b5SSrikanth Yalavarthi model->nb_batches = model->info.batch_size; 77*38e884b5SSrikanth Yalavarthi else 78*38e884b5SSrikanth Yalavarthi model->nb_batches = opt->batches; 79*38e884b5SSrikanth Yalavarthi 80f6661e6dSSrikanth Yalavarthi model->state = MODEL_LOADED; 81f6661e6dSSrikanth Yalavarthi 82f6661e6dSSrikanth Yalavarthi return 0; 83f6661e6dSSrikanth Yalavarthi } 84f6661e6dSSrikanth Yalavarthi 85f6661e6dSSrikanth Yalavarthi int 86f6661e6dSSrikanth Yalavarthi ml_model_unload(struct ml_test *test, struct ml_options *opt, struct ml_model *model, uint16_t fid) 87f6661e6dSSrikanth Yalavarthi { 88f6661e6dSSrikanth Yalavarthi struct test_common *t = ml_test_priv(test); 89f6661e6dSSrikanth Yalavarthi int ret; 90f6661e6dSSrikanth Yalavarthi 91f6661e6dSSrikanth Yalavarthi RTE_SET_USED(t); 92f6661e6dSSrikanth Yalavarthi 93f6661e6dSSrikanth Yalavarthi if (model->state == MODEL_INITIAL) 94f6661e6dSSrikanth Yalavarthi return 0; 95f6661e6dSSrikanth Yalavarthi 96f6661e6dSSrikanth Yalavarthi if (model->state != MODEL_LOADED) 97f6661e6dSSrikanth Yalavarthi return -EINVAL; 98f6661e6dSSrikanth Yalavarthi 99f6661e6dSSrikanth Yalavarthi /* unload model */ 100f6661e6dSSrikanth Yalavarthi ret = rte_ml_model_unload(opt->dev_id, model->id); 101f6661e6dSSrikanth Yalavarthi if (ret != 0) { 102f6661e6dSSrikanth Yalavarthi ml_err("Failed to unload model: %s\n", opt->filelist[fid].model); 103f6661e6dSSrikanth Yalavarthi model->state = MODEL_ERROR; 104f6661e6dSSrikanth Yalavarthi return ret; 105f6661e6dSSrikanth Yalavarthi } 106f6661e6dSSrikanth Yalavarthi 107f6661e6dSSrikanth Yalavarthi model->state = MODEL_INITIAL; 108f6661e6dSSrikanth Yalavarthi 109f6661e6dSSrikanth Yalavarthi return 0; 110f6661e6dSSrikanth Yalavarthi } 111f6661e6dSSrikanth Yalavarthi 112f6661e6dSSrikanth Yalavarthi int 113f6661e6dSSrikanth Yalavarthi ml_model_start(struct ml_test *test, struct ml_options *opt, struct ml_model *model, uint16_t fid) 114f6661e6dSSrikanth Yalavarthi { 115f6661e6dSSrikanth Yalavarthi struct test_common *t = ml_test_priv(test); 116f6661e6dSSrikanth Yalavarthi int ret; 117f6661e6dSSrikanth Yalavarthi 118f6661e6dSSrikanth Yalavarthi RTE_SET_USED(t); 119f6661e6dSSrikanth Yalavarthi 120f6661e6dSSrikanth Yalavarthi if (model->state == MODEL_STARTED) 121f6661e6dSSrikanth Yalavarthi return 0; 122f6661e6dSSrikanth Yalavarthi 123f6661e6dSSrikanth Yalavarthi if (model->state != MODEL_LOADED) 124f6661e6dSSrikanth Yalavarthi return -EINVAL; 125f6661e6dSSrikanth Yalavarthi 126f6661e6dSSrikanth Yalavarthi /* start model */ 127f6661e6dSSrikanth Yalavarthi ret = rte_ml_model_start(opt->dev_id, model->id); 128f6661e6dSSrikanth Yalavarthi if (ret != 0) { 129f6661e6dSSrikanth Yalavarthi ml_err("Failed to start model : %s\n", opt->filelist[fid].model); 130f6661e6dSSrikanth Yalavarthi model->state = MODEL_ERROR; 131f6661e6dSSrikanth Yalavarthi return ret; 132f6661e6dSSrikanth Yalavarthi } 133f6661e6dSSrikanth Yalavarthi 134f6661e6dSSrikanth Yalavarthi model->state = MODEL_STARTED; 135f6661e6dSSrikanth Yalavarthi 136f6661e6dSSrikanth Yalavarthi return 0; 137f6661e6dSSrikanth Yalavarthi } 138f6661e6dSSrikanth Yalavarthi 139f6661e6dSSrikanth Yalavarthi int 140f6661e6dSSrikanth Yalavarthi ml_model_stop(struct ml_test *test, struct ml_options *opt, struct ml_model *model, uint16_t fid) 141f6661e6dSSrikanth Yalavarthi { 142f6661e6dSSrikanth Yalavarthi struct test_common *t = ml_test_priv(test); 143f6661e6dSSrikanth Yalavarthi int ret; 144f6661e6dSSrikanth Yalavarthi 145f6661e6dSSrikanth Yalavarthi RTE_SET_USED(t); 146f6661e6dSSrikanth Yalavarthi 147f6661e6dSSrikanth Yalavarthi if (model->state == MODEL_LOADED) 148f6661e6dSSrikanth Yalavarthi return 0; 149f6661e6dSSrikanth Yalavarthi 150f6661e6dSSrikanth Yalavarthi if (model->state != MODEL_STARTED) 151f6661e6dSSrikanth Yalavarthi return -EINVAL; 152f6661e6dSSrikanth Yalavarthi 153f6661e6dSSrikanth Yalavarthi /* stop model */ 154f6661e6dSSrikanth Yalavarthi ret = rte_ml_model_stop(opt->dev_id, model->id); 155f6661e6dSSrikanth Yalavarthi if (ret != 0) { 156f6661e6dSSrikanth Yalavarthi ml_err("Failed to stop model: %s\n", opt->filelist[fid].model); 157f6661e6dSSrikanth Yalavarthi model->state = MODEL_ERROR; 158f6661e6dSSrikanth Yalavarthi return ret; 159f6661e6dSSrikanth Yalavarthi } 160f6661e6dSSrikanth Yalavarthi 161f6661e6dSSrikanth Yalavarthi model->state = MODEL_LOADED; 162f6661e6dSSrikanth Yalavarthi 163f6661e6dSSrikanth Yalavarthi return 0; 164f6661e6dSSrikanth Yalavarthi } 165