xref: /spdk/lib/ftl/nvc/ftl_nvc_dev.c (revision 26f3b55124c109151b2846d4967be1e44dedb84c)
1851af375SMateusz Kozlowski /*   SPDX-License-Identifier: BSD-3-Clause
2851af375SMateusz Kozlowski  *   Copyright 2023 Solidigm All Rights Reserved
3851af375SMateusz Kozlowski  */
4851af375SMateusz Kozlowski 
5851af375SMateusz Kozlowski #include "spdk/stdinc.h"
6851af375SMateusz Kozlowski #include "spdk/queue.h"
7851af375SMateusz Kozlowski #include "spdk/log.h"
8851af375SMateusz Kozlowski 
9851af375SMateusz Kozlowski #include "ftl_nvc_dev.h"
10851af375SMateusz Kozlowski #include "utils/ftl_defs.h"
11851af375SMateusz Kozlowski 
12*26f3b551SMateusz Kozlowski static TAILQ_HEAD(, ftl_nv_cache_device_type) g_devs = TAILQ_HEAD_INITIALIZER(g_devs);
13851af375SMateusz Kozlowski static pthread_mutex_t g_devs_mutex = PTHREAD_MUTEX_INITIALIZER;
14851af375SMateusz Kozlowski 
15*26f3b551SMateusz Kozlowski static const struct ftl_nv_cache_device_type *
ftl_nv_cache_device_type_get_type(const char * name)16*26f3b551SMateusz Kozlowski ftl_nv_cache_device_type_get_type(const char *name)
17851af375SMateusz Kozlowski {
18*26f3b551SMateusz Kozlowski 	struct ftl_nv_cache_device_type *entry;
19851af375SMateusz Kozlowski 
20851af375SMateusz Kozlowski 	TAILQ_FOREACH(entry, &g_devs, internal.entry) {
21851af375SMateusz Kozlowski 		if (0 == strcmp(entry->name, name)) {
22851af375SMateusz Kozlowski 			return entry;
23851af375SMateusz Kozlowski 		}
24851af375SMateusz Kozlowski 	}
25851af375SMateusz Kozlowski 
26851af375SMateusz Kozlowski 	return NULL;
27851af375SMateusz Kozlowski }
28851af375SMateusz Kozlowski 
29851af375SMateusz Kozlowski static bool
ftl_nv_cache_device_valid(const struct ftl_nv_cache_device_type * type)30*26f3b551SMateusz Kozlowski ftl_nv_cache_device_valid(const struct ftl_nv_cache_device_type *type)
31851af375SMateusz Kozlowski {
32*26f3b551SMateusz Kozlowski 	return type && type->name && strlen(type->name) > 0;
33851af375SMateusz Kozlowski }
34851af375SMateusz Kozlowski 
35851af375SMateusz Kozlowski void
ftl_nv_cache_device_register(struct ftl_nv_cache_device_type * type)36*26f3b551SMateusz Kozlowski ftl_nv_cache_device_register(struct ftl_nv_cache_device_type *type)
37851af375SMateusz Kozlowski {
38*26f3b551SMateusz Kozlowski 	if (!ftl_nv_cache_device_valid(type)) {
39851af375SMateusz Kozlowski 		SPDK_ERRLOG("NV cache device descriptor is invalid\n");
40851af375SMateusz Kozlowski 		ftl_abort();
41851af375SMateusz Kozlowski 	}
42851af375SMateusz Kozlowski 
43851af375SMateusz Kozlowski 	pthread_mutex_lock(&g_devs_mutex);
44*26f3b551SMateusz Kozlowski 	if (!ftl_nv_cache_device_type_get_type(type->name)) {
45*26f3b551SMateusz Kozlowski 		TAILQ_INSERT_TAIL(&g_devs, type, internal.entry);
46*26f3b551SMateusz Kozlowski 		SPDK_NOTICELOG("Registered NV cache device, name: %s\n", type->name);
47851af375SMateusz Kozlowski 	} else {
48*26f3b551SMateusz Kozlowski 		SPDK_ERRLOG("Cannot register NV cache device, already exists, name: %s\n", type->name);
49851af375SMateusz Kozlowski 		ftl_abort();
50851af375SMateusz Kozlowski 	}
51851af375SMateusz Kozlowski 
52851af375SMateusz Kozlowski 	pthread_mutex_unlock(&g_devs_mutex);
53851af375SMateusz Kozlowski }
54851af375SMateusz Kozlowski 
55*26f3b551SMateusz Kozlowski const struct ftl_nv_cache_device_type *
ftl_nv_cache_device_get_type_by_bdev(struct spdk_ftl_dev * dev,struct spdk_bdev * bdev)56*26f3b551SMateusz Kozlowski ftl_nv_cache_device_get_type_by_bdev(struct spdk_ftl_dev *dev, struct spdk_bdev *bdev)
57851af375SMateusz Kozlowski {
58*26f3b551SMateusz Kozlowski 	struct ftl_nv_cache_device_type *entry;
59*26f3b551SMateusz Kozlowski 	const struct ftl_nv_cache_device_type *type = NULL;
60851af375SMateusz Kozlowski 
61851af375SMateusz Kozlowski 	pthread_mutex_lock(&g_devs_mutex);
62851af375SMateusz Kozlowski 	TAILQ_FOREACH(entry, &g_devs, internal.entry) {
63851af375SMateusz Kozlowski 		if (entry->ops.is_bdev_compatible) {
64851af375SMateusz Kozlowski 			if (entry->ops.is_bdev_compatible(dev, bdev)) {
65*26f3b551SMateusz Kozlowski 				type = entry;
66851af375SMateusz Kozlowski 				break;
67851af375SMateusz Kozlowski 			}
68851af375SMateusz Kozlowski 		}
69851af375SMateusz Kozlowski 	}
70851af375SMateusz Kozlowski 	pthread_mutex_unlock(&g_devs_mutex);
71851af375SMateusz Kozlowski 
72*26f3b551SMateusz Kozlowski 	return type;
73851af375SMateusz Kozlowski }
74