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