1 /* SPDX-License-Identifier: BSD-3-Clause 2 * Copyright 2023 Solidigm All Rights Reserved 3 */ 4 5 #include "ftl_base_dev.h" 6 #include "ftl_core.h" 7 #include "ftl_layout.h" 8 #include "utils/ftl_layout_tracker_bdev.h" 9 10 static bool 11 is_bdev_compatible(struct spdk_ftl_dev *dev, struct spdk_bdev *bdev) 12 { 13 return spdk_bdev_get_block_size(bdev) == FTL_BLOCK_SIZE; 14 } 15 16 static struct ftl_layout_region * 17 md_region_create(struct spdk_ftl_dev *dev, enum ftl_layout_region_type reg_type, 18 uint32_t reg_version, size_t entry_size, size_t entry_count) 19 { 20 struct ftl_layout *layout = &dev->layout; 21 struct ftl_layout_region *region; 22 const char *md_region_name; 23 uint64_t data_base_alignment, reg_blks; 24 const struct ftl_layout_tracker_bdev_region_props *reg_props; 25 26 assert(reg_type < FTL_LAYOUT_REGION_TYPE_MAX); 27 md_region_name = ftl_md_region_name(reg_type); 28 29 /* Allocating a ftl_bitmap requires a 8B input buffer alignment, since we're reusing the global valid map md buffer 30 * this means that each band starting address needs to be aligned too - each device sector takes 1b in the valid map, 31 * so 64 sectors (8*8) is the needed alignment 32 */ 33 data_base_alignment = 8 * ftl_bitmap_buffer_alignment; 34 reg_blks = ftl_md_region_blocks(dev, entry_count * entry_size); 35 reg_props = ftl_layout_tracker_bdev_add_region(dev->base_layout_tracker, reg_type, reg_version, 36 reg_blks, data_base_alignment); 37 if (!reg_props) { 38 return NULL; 39 } 40 assert(reg_props->type == reg_type); 41 assert(reg_props->ver == reg_version); 42 assert(reg_props->blk_sz == reg_blks); 43 assert(reg_props->blk_offs + reg_blks <= dev->layout.base.total_blocks); 44 45 region = &layout->region[reg_type]; 46 region->type = reg_type; 47 region->mirror_type = FTL_LAYOUT_REGION_TYPE_INVALID; 48 region->name = md_region_name; 49 region->current.version = region->prev.version = reg_version; 50 region->current.offset = reg_props->blk_offs; 51 region->current.blocks = reg_blks; 52 region->entry_size = entry_size / FTL_BLOCK_SIZE; 53 region->num_entries = entry_count; 54 55 region->bdev_desc = dev->base_bdev_desc; 56 region->ioch = dev->base_ioch; 57 region->vss_blksz = 0; 58 59 return region; 60 } 61 62 struct ftl_base_device_type base_bdev = { 63 .name = "base_bdev", 64 .ops = { 65 .is_bdev_compatible = is_bdev_compatible, 66 .md_layout_ops = { 67 .region_create = md_region_create, 68 }, 69 } 70 }; 71 FTL_BASE_DEVICE_TYPE_REGISTER(base_bdev) 72