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