xref: /spdk/lib/ftl/base/ftl_base_bdev.c (revision 424a88a47d6aa78816c2f6bc5da854a4c7ef08ef)
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