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