1 /* SPDX-License-Identifier: BSD-3-Clause 2 * Copyright(c) 2019-2020 Broadcom 3 * All rights reserved. 4 */ 5 6 #include <rte_common.h> 7 8 #include "tf_identifier.h" 9 #include "tf_common.h" 10 #include "tf_rm.h" 11 #include "tf_util.h" 12 #include "tfp.h" 13 14 struct tf; 15 16 /** 17 * Identifier DBs. 18 */ 19 static void *ident_db[TF_DIR_MAX]; 20 21 /** 22 * Init flag, set on bind and cleared on unbind 23 */ 24 static uint8_t init; 25 26 int 27 tf_ident_bind(struct tf *tfp, 28 struct tf_ident_cfg_parms *parms) 29 { 30 int rc; 31 int i; 32 struct tf_rm_create_db_parms db_cfg = { 0 }; 33 34 TF_CHECK_PARMS2(tfp, parms); 35 36 if (init) { 37 TFP_DRV_LOG(ERR, 38 "Identifier DB already initialized\n"); 39 return -EINVAL; 40 } 41 42 db_cfg.type = TF_DEVICE_MODULE_TYPE_IDENTIFIER; 43 db_cfg.num_elements = parms->num_elements; 44 db_cfg.cfg = parms->cfg; 45 46 for (i = 0; i < TF_DIR_MAX; i++) { 47 db_cfg.dir = i; 48 db_cfg.alloc_cnt = parms->resources->ident_cnt[i].cnt; 49 db_cfg.rm_db = &ident_db[i]; 50 rc = tf_rm_create_db(tfp, &db_cfg); 51 if (rc) { 52 TFP_DRV_LOG(ERR, 53 "%s: Identifier DB creation failed\n", 54 tf_dir_2_str(i)); 55 56 return rc; 57 } 58 } 59 60 init = 1; 61 62 TFP_DRV_LOG(INFO, 63 "Identifier - initialized\n"); 64 65 return 0; 66 } 67 68 int 69 tf_ident_unbind(struct tf *tfp) 70 { 71 int rc = 0; 72 int i; 73 struct tf_rm_free_db_parms fparms = { 0 }; 74 75 TF_CHECK_PARMS1(tfp); 76 77 /* Bail if nothing has been initialized */ 78 if (!init) { 79 TFP_DRV_LOG(INFO, 80 "No Identifier DBs created\n"); 81 return 0; 82 } 83 84 for (i = 0; i < TF_DIR_MAX; i++) { 85 fparms.dir = i; 86 fparms.rm_db = ident_db[i]; 87 rc = tf_rm_free_db(tfp, &fparms); 88 if (rc) { 89 TFP_DRV_LOG(ERR, 90 "rm free failed on unbind\n"); 91 } 92 ident_db[i] = NULL; 93 } 94 95 init = 0; 96 97 return 0; 98 } 99 100 int 101 tf_ident_alloc(struct tf *tfp __rte_unused, 102 struct tf_ident_alloc_parms *parms) 103 { 104 int rc; 105 uint32_t id; 106 struct tf_rm_allocate_parms aparms = { 0 }; 107 108 TF_CHECK_PARMS2(tfp, parms); 109 110 if (!init) { 111 TFP_DRV_LOG(ERR, 112 "%s: No Identifier DBs created\n", 113 tf_dir_2_str(parms->dir)); 114 return -EINVAL; 115 } 116 117 /* Allocate requested element */ 118 aparms.rm_db = ident_db[parms->dir]; 119 aparms.db_index = parms->type; 120 aparms.index = &id; 121 rc = tf_rm_allocate(&aparms); 122 if (rc) { 123 TFP_DRV_LOG(ERR, 124 "%s: Failed allocate, type:%d\n", 125 tf_dir_2_str(parms->dir), 126 parms->type); 127 return rc; 128 } 129 130 *parms->id = id; 131 132 return 0; 133 } 134 135 int 136 tf_ident_free(struct tf *tfp __rte_unused, 137 struct tf_ident_free_parms *parms) 138 { 139 int rc; 140 struct tf_rm_is_allocated_parms aparms = { 0 }; 141 struct tf_rm_free_parms fparms = { 0 }; 142 int allocated = 0; 143 144 TF_CHECK_PARMS2(tfp, parms); 145 146 if (!init) { 147 TFP_DRV_LOG(ERR, 148 "%s: No Identifier DBs created\n", 149 tf_dir_2_str(parms->dir)); 150 return -EINVAL; 151 } 152 153 /* Check if element is in use */ 154 aparms.rm_db = ident_db[parms->dir]; 155 aparms.db_index = parms->type; 156 aparms.index = parms->id; 157 aparms.allocated = &allocated; 158 rc = tf_rm_is_allocated(&aparms); 159 if (rc) 160 return rc; 161 162 if (allocated != TF_RM_ALLOCATED_ENTRY_IN_USE) { 163 TFP_DRV_LOG(ERR, 164 "%s: Entry already free, type:%d, index:%d\n", 165 tf_dir_2_str(parms->dir), 166 parms->type, 167 parms->id); 168 return -EINVAL; 169 } 170 171 /* Free requested element */ 172 fparms.rm_db = ident_db[parms->dir]; 173 fparms.db_index = parms->type; 174 fparms.index = parms->id; 175 rc = tf_rm_free(&fparms); 176 if (rc) { 177 TFP_DRV_LOG(ERR, 178 "%s: Free failed, type:%d, index:%d\n", 179 tf_dir_2_str(parms->dir), 180 parms->type, 181 parms->id); 182 return rc; 183 } 184 185 return 0; 186 } 187