1*bc712f1cSDenis Pryazhennikov /* SPDX-License-Identifier: BSD-3-Clause 2*bc712f1cSDenis Pryazhennikov * 3*bc712f1cSDenis Pryazhennikov * Copyright (c) 2023 Advanced Micro Devices, Inc. 4*bc712f1cSDenis Pryazhennikov */ 5*bc712f1cSDenis Pryazhennikov 6*bc712f1cSDenis Pryazhennikov #include "sfc.h" 7*bc712f1cSDenis Pryazhennikov #include "sfc_tbl_meta.h" 8*bc712f1cSDenis Pryazhennikov #include "sfc_tbl_meta_cache.h" 9*bc712f1cSDenis Pryazhennikov 10*bc712f1cSDenis Pryazhennikov const struct sfc_tbl_meta * sfc_tbl_meta_lookup(struct sfc_adapter * sa,efx_table_id_t table_id)11*bc712f1cSDenis Pryazhennikovsfc_tbl_meta_lookup(struct sfc_adapter *sa, efx_table_id_t table_id) 12*bc712f1cSDenis Pryazhennikov { 13*bc712f1cSDenis Pryazhennikov struct sfc_tbl_meta *meta; 14*bc712f1cSDenis Pryazhennikov struct sfc_tbls *tables = &sa->hw_tables; 15*bc712f1cSDenis Pryazhennikov int rc; 16*bc712f1cSDenis Pryazhennikov 17*bc712f1cSDenis Pryazhennikov SFC_ASSERT(sfc_adapter_is_locked(sa)); 18*bc712f1cSDenis Pryazhennikov 19*bc712f1cSDenis Pryazhennikov if (tables->status != SFC_TBLS_STATUS_SUPPORTED) 20*bc712f1cSDenis Pryazhennikov return NULL; 21*bc712f1cSDenis Pryazhennikov 22*bc712f1cSDenis Pryazhennikov rc = rte_hash_lookup_data(tables->meta.cache, (const void *)&table_id, 23*bc712f1cSDenis Pryazhennikov (void **)&meta); 24*bc712f1cSDenis Pryazhennikov if (rc < 0) 25*bc712f1cSDenis Pryazhennikov return NULL; 26*bc712f1cSDenis Pryazhennikov 27*bc712f1cSDenis Pryazhennikov SFC_ASSERT(meta != NULL); 28*bc712f1cSDenis Pryazhennikov SFC_ASSERT(meta->table_id == table_id); 29*bc712f1cSDenis Pryazhennikov 30*bc712f1cSDenis Pryazhennikov return meta; 31*bc712f1cSDenis Pryazhennikov } 32*bc712f1cSDenis Pryazhennikov 33*bc712f1cSDenis Pryazhennikov int sfc_tbl_meta_init(struct sfc_adapter * sa)34*bc712f1cSDenis Pryazhennikovsfc_tbl_meta_init(struct sfc_adapter *sa) 35*bc712f1cSDenis Pryazhennikov { 36*bc712f1cSDenis Pryazhennikov struct sfc_tbls *tables = &sa->hw_tables; 37*bc712f1cSDenis Pryazhennikov struct sfc_tbl_meta_cache *meta = &tables->meta; 38*bc712f1cSDenis Pryazhennikov int rc; 39*bc712f1cSDenis Pryazhennikov 40*bc712f1cSDenis Pryazhennikov SFC_ASSERT(sfc_adapter_is_locked(sa)); 41*bc712f1cSDenis Pryazhennikov 42*bc712f1cSDenis Pryazhennikov if (tables->status != SFC_TBLS_STATUS_SUPPORTED) 43*bc712f1cSDenis Pryazhennikov return 0; 44*bc712f1cSDenis Pryazhennikov 45*bc712f1cSDenis Pryazhennikov rc = sfc_tbl_meta_cache_ctor(&meta->cache); 46*bc712f1cSDenis Pryazhennikov if (rc != 0) 47*bc712f1cSDenis Pryazhennikov return rc; 48*bc712f1cSDenis Pryazhennikov 49*bc712f1cSDenis Pryazhennikov rc = sfc_tbl_meta_cache_update(meta->cache, sa->nic); 50*bc712f1cSDenis Pryazhennikov if (rc != 0) { 51*bc712f1cSDenis Pryazhennikov sfc_tbl_meta_cache_dtor(&meta->cache); 52*bc712f1cSDenis Pryazhennikov return rc; 53*bc712f1cSDenis Pryazhennikov } 54*bc712f1cSDenis Pryazhennikov 55*bc712f1cSDenis Pryazhennikov return 0; 56*bc712f1cSDenis Pryazhennikov } 57*bc712f1cSDenis Pryazhennikov 58*bc712f1cSDenis Pryazhennikov void sfc_tbl_meta_fini(struct sfc_adapter * sa)59*bc712f1cSDenis Pryazhennikovsfc_tbl_meta_fini(struct sfc_adapter *sa) 60*bc712f1cSDenis Pryazhennikov { 61*bc712f1cSDenis Pryazhennikov struct sfc_tbls *tables = &sa->hw_tables; 62*bc712f1cSDenis Pryazhennikov struct sfc_tbl_meta_cache *meta = &tables->meta; 63*bc712f1cSDenis Pryazhennikov 64*bc712f1cSDenis Pryazhennikov if (meta->cache == NULL) 65*bc712f1cSDenis Pryazhennikov return; 66*bc712f1cSDenis Pryazhennikov 67*bc712f1cSDenis Pryazhennikov SFC_ASSERT(sfc_adapter_is_locked(sa)); 68*bc712f1cSDenis Pryazhennikov SFC_ASSERT(tables->status == SFC_TBLS_STATUS_SUPPORTED); 69*bc712f1cSDenis Pryazhennikov 70*bc712f1cSDenis Pryazhennikov sfc_tbl_meta_cache_dtor(&meta->cache); 71*bc712f1cSDenis Pryazhennikov } 72