xref: /spdk/lib/ftl/nvc/ftl_nvc_bdev_non_vss.c (revision bdca6e74dcce9c08d58d915801df6c9a50ed362a)
1 /*   SPDX-License-Identifier: BSD-3-Clause
2  *   Copyright 2023 Solidigm All Rights Reserved
3  */
4 
5 #include "ftl_nvc_dev.h"
6 #include "ftl_core.h"
7 #include "ftl_layout.h"
8 #include "ftl_nv_cache.h"
9 #include "ftl_nvc_bdev_common.h"
10 
11 static int
12 init(struct spdk_ftl_dev *dev)
13 {
14 	int rc;
15 
16 	rc = ftl_p2l_log_init(dev);
17 	if (rc) {
18 		return 0;
19 	}
20 
21 	return 0;
22 }
23 
24 static void
25 deinit(struct spdk_ftl_dev *dev)
26 {
27 	ftl_p2l_log_deinit(dev);
28 }
29 
30 static bool
31 is_bdev_compatible(struct spdk_ftl_dev *dev, struct spdk_bdev *bdev)
32 {
33 	if (spdk_bdev_get_md_size(bdev) != 0) {
34 		/* Bdev's metadata is invalid size */
35 		return false;
36 	}
37 
38 	return true;
39 }
40 
41 static void
42 p2l_log_cb(struct ftl_io *io)
43 {
44 }
45 
46 static void
47 on_chunk_open(struct spdk_ftl_dev *dev, struct ftl_nv_cache_chunk *chunk)
48 {
49 	assert(NULL == chunk->p2l_log);
50 	chunk->p2l_log = ftl_p2l_log_acquire(dev, chunk->md->seq_id, p2l_log_cb);
51 	chunk->md->p2l_log_type = ftl_p2l_log_type(chunk->p2l_log);
52 }
53 
54 static void
55 on_chunk_closed(struct spdk_ftl_dev *dev, struct ftl_nv_cache_chunk *chunk)
56 {
57 	assert(chunk->p2l_log);
58 	ftl_p2l_log_release(dev, chunk->p2l_log);
59 	chunk->p2l_log = NULL;
60 }
61 
62 static int
63 setup_layout(struct spdk_ftl_dev *dev)
64 {
65 	const struct ftl_md_layout_ops *md_ops = &dev->nv_cache.nvc_type->ops.md_layout_ops;
66 	const uint64_t blocks = ftl_p2l_log_get_md_blocks_required(dev, 1, ftl_get_num_blocks_in_band(dev));
67 	enum ftl_layout_region_type region_type;
68 
69 	for (region_type = FTL_LAYOUT_REGION_TYPE_P2L_LOG_IO_MIN;
70 	     region_type <= FTL_LAYOUT_REGION_TYPE_P2L_LOG_IO_MAX;
71 	     region_type++) {
72 		if (md_ops->region_create(dev, region_type, FTL_P2L_LOG_VERSION_CURRENT, blocks)) {
73 			return -1;
74 		}
75 
76 		if (md_ops->region_open(dev, region_type, FTL_P2L_LOG_VERSION_CURRENT,
77 					FTL_BLOCK_SIZE, blocks,
78 					&dev->layout.region[region_type])) {
79 			return -1;
80 		}
81 	}
82 
83 	return 0;
84 }
85 
86 struct ftl_nv_cache_device_type nvc_bdev_non_vss = {
87 	.name = "bdev-non-vss",
88 	.features = {
89 	},
90 	.ops = {
91 		.init = init,
92 		.deinit = deinit,
93 		.on_chunk_open = on_chunk_open,
94 		.on_chunk_closed = on_chunk_closed,
95 		.is_bdev_compatible = is_bdev_compatible,
96 		.is_chunk_active = ftl_nvc_bdev_common_is_chunk_active,
97 		.setup_layout = setup_layout,
98 		.md_layout_ops = {
99 			.region_create = ftl_nvc_bdev_common_region_create,
100 			.region_open = ftl_nvc_bdev_common_region_open,
101 		}
102 	}
103 };
104