1498c39beSLukasz Lasek /* SPDX-License-Identifier: BSD-3-Clause 2498c39beSLukasz Lasek * Copyright 2023 Solidigm All Rights Reserved 3498c39beSLukasz Lasek */ 4498c39beSLukasz Lasek 5498c39beSLukasz Lasek #include "ftl_base_dev.h" 6498c39beSLukasz Lasek #include "ftl_core.h" 7498c39beSLukasz Lasek #include "ftl_layout.h" 893036282SLukasz Lasek #include "utils/ftl_layout_tracker_bdev.h" 9498c39beSLukasz Lasek 10498c39beSLukasz Lasek static bool 11498c39beSLukasz Lasek is_bdev_compatible(struct spdk_ftl_dev *dev, struct spdk_bdev *bdev) 12498c39beSLukasz Lasek { 13498c39beSLukasz Lasek return spdk_bdev_get_block_size(bdev) == FTL_BLOCK_SIZE; 14498c39beSLukasz Lasek } 15498c39beSLukasz Lasek 16*424a88a4SMateusz Kozlowski static void 17*424a88a4SMateusz Kozlowski md_region_setup(struct spdk_ftl_dev *dev, enum ftl_layout_region_type reg_type, 18*424a88a4SMateusz Kozlowski struct ftl_layout_region *region) 19*424a88a4SMateusz Kozlowski { 20*424a88a4SMateusz Kozlowski assert(region); 21*424a88a4SMateusz Kozlowski region->type = reg_type; 22*424a88a4SMateusz Kozlowski region->mirror_type = FTL_LAYOUT_REGION_TYPE_INVALID; 23*424a88a4SMateusz Kozlowski region->name = ftl_md_region_name(reg_type); 24*424a88a4SMateusz Kozlowski 25*424a88a4SMateusz Kozlowski region->bdev_desc = dev->base_bdev_desc; 26*424a88a4SMateusz Kozlowski region->ioch = dev->base_ioch; 27*424a88a4SMateusz Kozlowski region->vss_blksz = 0; 28*424a88a4SMateusz Kozlowski } 29*424a88a4SMateusz Kozlowski 30498c39beSLukasz Lasek static struct ftl_layout_region * 31498c39beSLukasz Lasek md_region_create(struct spdk_ftl_dev *dev, enum ftl_layout_region_type reg_type, 32498c39beSLukasz Lasek uint32_t reg_version, size_t entry_size, size_t entry_count) 33498c39beSLukasz Lasek { 34498c39beSLukasz Lasek struct ftl_layout *layout = &dev->layout; 35498c39beSLukasz Lasek struct ftl_layout_region *region; 3693036282SLukasz Lasek uint64_t data_base_alignment, reg_blks; 3793036282SLukasz Lasek const struct ftl_layout_tracker_bdev_region_props *reg_props; 38498c39beSLukasz Lasek 39498c39beSLukasz Lasek assert(reg_type < FTL_LAYOUT_REGION_TYPE_MAX); 40498c39beSLukasz Lasek 41498c39beSLukasz Lasek /* Allocating a ftl_bitmap requires a 8B input buffer alignment, since we're reusing the global valid map md buffer 42498c39beSLukasz Lasek * this means that each band starting address needs to be aligned too - each device sector takes 1b in the valid map, 43498c39beSLukasz Lasek * so 64 sectors (8*8) is the needed alignment 44498c39beSLukasz Lasek */ 4593036282SLukasz Lasek data_base_alignment = 8 * ftl_bitmap_buffer_alignment; 4693036282SLukasz Lasek reg_blks = ftl_md_region_blocks(dev, entry_count * entry_size); 4793036282SLukasz Lasek reg_props = ftl_layout_tracker_bdev_add_region(dev->base_layout_tracker, reg_type, reg_version, 4893036282SLukasz Lasek reg_blks, data_base_alignment); 4993036282SLukasz Lasek if (!reg_props) { 5093036282SLukasz Lasek return NULL; 5193036282SLukasz Lasek } 5293036282SLukasz Lasek assert(reg_props->type == reg_type); 5393036282SLukasz Lasek assert(reg_props->ver == reg_version); 5493036282SLukasz Lasek assert(reg_props->blk_sz == reg_blks); 5593036282SLukasz Lasek assert(reg_props->blk_offs + reg_blks <= dev->layout.base.total_blocks); 56498c39beSLukasz Lasek 57498c39beSLukasz Lasek region = &layout->region[reg_type]; 58*424a88a4SMateusz Kozlowski md_region_setup(dev, reg_type, region); 59*424a88a4SMateusz Kozlowski 60498c39beSLukasz Lasek region->current.version = region->prev.version = reg_version; 6193036282SLukasz Lasek region->current.offset = reg_props->blk_offs; 6293036282SLukasz Lasek region->current.blocks = reg_blks; 63498c39beSLukasz Lasek region->entry_size = entry_size / FTL_BLOCK_SIZE; 64498c39beSLukasz Lasek region->num_entries = entry_count; 65498c39beSLukasz Lasek 66498c39beSLukasz Lasek return region; 67498c39beSLukasz Lasek } 68498c39beSLukasz Lasek 69498c39beSLukasz Lasek struct ftl_base_device_type base_bdev = { 70498c39beSLukasz Lasek .name = "base_bdev", 71498c39beSLukasz Lasek .ops = { 72498c39beSLukasz Lasek .is_bdev_compatible = is_bdev_compatible, 73498c39beSLukasz Lasek .md_layout_ops = { 74498c39beSLukasz Lasek .region_create = md_region_create, 75498c39beSLukasz Lasek }, 76498c39beSLukasz Lasek } 77498c39beSLukasz Lasek }; 78498c39beSLukasz Lasek FTL_BASE_DEVICE_TYPE_REGISTER(base_bdev) 79