xref: /dpdk/drivers/net/sfc/sfc_tbl_meta.c (revision bc712f1c86fc9c2bb5bb41a80e12f34e224f4c6d)
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 Pryazhennikov sfc_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 Pryazhennikov sfc_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 Pryazhennikov sfc_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