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