xref: /spdk/lib/ftl/base/ftl_base_dev.h (revision 498c39be016e91ccc2617338a9106ceee03d3e27)
1*498c39beSLukasz Lasek /*   SPDX-License-Identifier: BSD-3-Clause
2*498c39beSLukasz Lasek  *   Copyright 2023 Solidigm All Rights Reserved
3*498c39beSLukasz Lasek   */
4*498c39beSLukasz Lasek 
5*498c39beSLukasz Lasek #ifndef FTL_BASE_DEVICE_H
6*498c39beSLukasz Lasek #define FTL_BASE_DEVICE_H
7*498c39beSLukasz Lasek 
8*498c39beSLukasz Lasek #include "spdk/stdinc.h"
9*498c39beSLukasz Lasek #include "spdk/bdev_module.h"
10*498c39beSLukasz Lasek #include "spdk/queue.h"
11*498c39beSLukasz Lasek #include "ftl_layout.h"
12*498c39beSLukasz Lasek 
13*498c39beSLukasz Lasek struct spdk_ftl_dev;
14*498c39beSLukasz Lasek struct ftl_mngt_process;
15*498c39beSLukasz Lasek 
16*498c39beSLukasz Lasek /**
17*498c39beSLukasz Lasek  * @brief Base device operations interface
18*498c39beSLukasz Lasek  */
19*498c39beSLukasz Lasek struct ftl_base_device_ops {
20*498c39beSLukasz Lasek 	/**
21*498c39beSLukasz Lasek 	 * @brief Check if block device is valid for base device
22*498c39beSLukasz Lasek 	 *
23*498c39beSLukasz Lasek 	 * @param dev ftl device
24*498c39beSLukasz Lasek 	 * @param bdev bdev to be checked
25*498c39beSLukasz Lasek 	 *
26*498c39beSLukasz Lasek 	 * @retval true if bdev is valid for base device
27*498c39beSLukasz Lasek 	 * @retval false if bdev is not valid for base device
28*498c39beSLukasz Lasek 	 */
29*498c39beSLukasz Lasek 	bool (*is_bdev_compatible)(struct spdk_ftl_dev *dev, struct spdk_bdev *bdev);
30*498c39beSLukasz Lasek 
31*498c39beSLukasz Lasek 	struct ftl_md_layout_ops md_layout_ops;
32*498c39beSLukasz Lasek };
33*498c39beSLukasz Lasek 
34*498c39beSLukasz Lasek /**
35*498c39beSLukasz Lasek  * @brief Base device type
36*498c39beSLukasz Lasek  */
37*498c39beSLukasz Lasek struct ftl_base_device_type {
38*498c39beSLukasz Lasek 	/**
39*498c39beSLukasz Lasek 	 * The name of the base device type
40*498c39beSLukasz Lasek 	 */
41*498c39beSLukasz Lasek 	const char *name;
42*498c39beSLukasz Lasek 
43*498c39beSLukasz Lasek 	/**
44*498c39beSLukasz Lasek 	 * The base device operations
45*498c39beSLukasz Lasek 	 */
46*498c39beSLukasz Lasek 	const struct ftl_base_device_ops ops;
47*498c39beSLukasz Lasek 
48*498c39beSLukasz Lasek 	/**
49*498c39beSLukasz Lasek 	 * Queue entry for FTL base devices
50*498c39beSLukasz Lasek 	 */
51*498c39beSLukasz Lasek 	TAILQ_ENTRY(ftl_base_device_type) base_devs_entry;
52*498c39beSLukasz Lasek };
53*498c39beSLukasz Lasek 
54*498c39beSLukasz Lasek /**
55*498c39beSLukasz Lasek  * @brief Macro to register base device type when the module is loaded
56*498c39beSLukasz Lasek  *
57*498c39beSLukasz Lasek  * @param desc Base device type descriptor
58*498c39beSLukasz Lasek  */
59*498c39beSLukasz Lasek #define FTL_BASE_DEVICE_TYPE_REGISTER(desc) \
60*498c39beSLukasz Lasek static void __attribute__((constructor)) ftl_base_device_register_##desc(void) \
61*498c39beSLukasz Lasek { \
62*498c39beSLukasz Lasek 	ftl_base_device_register(&desc); \
63*498c39beSLukasz Lasek }
64*498c39beSLukasz Lasek 
65*498c39beSLukasz Lasek /**
66*498c39beSLukasz Lasek  * @brief Register base device type
67*498c39beSLukasz Lasek  *
68*498c39beSLukasz Lasek  * @param desc Base device type type
69*498c39beSLukasz Lasek  */
70*498c39beSLukasz Lasek void ftl_base_device_register(struct ftl_base_device_type *desc);
71*498c39beSLukasz Lasek 
72*498c39beSLukasz Lasek /**
73*498c39beSLukasz Lasek  * @brief Get base device type by bdev
74*498c39beSLukasz Lasek  *
75*498c39beSLukasz Lasek  * @param bdev bdev for which base device type is requested
76*498c39beSLukasz Lasek  *
77*498c39beSLukasz Lasek  * @return Base device type descriptor
78*498c39beSLukasz Lasek  */
79*498c39beSLukasz Lasek const struct ftl_base_device_type *ftl_base_device_get_type_by_bdev(
80*498c39beSLukasz Lasek 	struct spdk_ftl_dev *dev, struct spdk_bdev *bdev);
81*498c39beSLukasz Lasek 
82*498c39beSLukasz Lasek #endif /* FTL_BASE_DEVICE_H */
83