1 /* SPDX-License-Identifier: BSD-3-Clause 2 * Copyright 2023 Solidigm All Rights Reserved 3 */ 4 5 #ifndef FTL_PROPERTY_H 6 #define FTL_PROPERTY_H 7 8 #include "spdk/stdinc.h" 9 10 struct spdk_ftl_dev; 11 struct ftl_property; 12 13 /** 14 * @brief Init the FTL properties system 15 * 16 * @retval 0 Success 17 * @retval Non-zero a Failure 18 */ 19 int ftl_properties_init(struct spdk_ftl_dev *dev); 20 21 /** 22 * @brief Deinit the FTL properties system 23 */ 24 void ftl_properties_deinit(struct spdk_ftl_dev *dev); 25 26 /** 27 * @brief A function to dump the FTL property which type is bool 28 */ 29 void ftl_property_dump_bool(struct spdk_ftl_dev *dev, const struct ftl_property *property, 30 struct spdk_json_write_ctx *w); 31 32 /** 33 * @brief A function to dump the FTL property which type is uint64 34 */ 35 void ftl_property_dump_uint64(struct spdk_ftl_dev *dev, const struct ftl_property *property, 36 struct spdk_json_write_ctx *w); 37 38 /** 39 * @brief A function to dump the FTL property which type is uint32 40 */ 41 void ftl_property_dump_uint32(struct spdk_ftl_dev *dev, const struct ftl_property *property, 42 struct spdk_json_write_ctx *w); 43 44 /** 45 * @brief Dump the value of property into the specified JSON RPC request 46 * 47 * @param dev FTL device 48 * @param property The property to dump to the JSON RPC request 49 * @param[out] w JSON RPC request 50 */ 51 typedef void (*ftl_property_dump_fn)(struct spdk_ftl_dev *dev, const struct ftl_property *property, 52 struct spdk_json_write_ctx *w); 53 54 /** 55 * @brief Decode property value and store it in output 56 * 57 * @param dev FTL device 58 * @param property The property 59 * @param value The new property value 60 * @param value_size The size of the value buffer 61 * @param output The output where to store new value 62 * @param output_size The decoded value output size 63 */ 64 typedef int (*ftl_property_decode_fn)(struct spdk_ftl_dev *dev, struct ftl_property *property, 65 const char *value, size_t value_size, void *output, size_t output_size); 66 67 /** 68 * @brief Set the FTL property 69 * 70 * @param dev FTL device 71 * @param mngt FTL management process handle 72 * @param property The property 73 * @param new_value The new property value to be set 74 * @param new_value_size The size of the new property value 75 */ 76 typedef void (*ftl_property_set_fn)(struct spdk_ftl_dev *dev, struct ftl_mngt_process *mngt, 77 const struct ftl_property *property, void *new_value, size_t new_value_size); 78 79 /** 80 * @brief Register a FTL property 81 * 82 * @param dev FTL device 83 * @param name the FTL property name 84 * @param value Pointer to the value of property 85 * @param size The value size of the property 86 * @param unit The unit of the property value 87 * @param desc The property description for user help 88 * @param dump The function to dump the property to the JSON RPC request 89 * @param decode The function to decode a new value of the property 90 * @param set The function to execute the property setting procedure 91 * @param verbose_mode The property is available in verbose mode only 92 */ 93 void ftl_property_register(struct spdk_ftl_dev *dev, 94 const char *name, void *value, size_t size, 95 const char *unit, const char *desc, 96 ftl_property_dump_fn dump, 97 ftl_property_decode_fn decode, 98 ftl_property_set_fn set, 99 bool verbose_mode); 100 101 /** 102 * @brief Dump FTL properties to the JSON request 103 * 104 * @param dev FTL device 105 * @param request The JSON request where to store the FTL properties 106 */ 107 void ftl_property_dump(struct spdk_ftl_dev *dev, struct spdk_jsonrpc_request *request); 108 109 /** 110 * @brief Decode property value and store it in output 111 * 112 * @param dev FTL device 113 * @param name The property name to be decoded 114 * @param value The new property value 115 * @param value_size The new property value buffer size 116 * @param output The output where to store new value 117 * @param output_size The decoded value output size 118 */ 119 int ftl_property_decode(struct spdk_ftl_dev *dev, const char *name, const char *value, 120 size_t value_size, void **output, size_t *output_size); 121 122 /** 123 * @brief The property bool decoder 124 */ 125 int ftl_property_decode_bool(struct spdk_ftl_dev *dev, struct ftl_property *property, 126 const char *value, size_t value_size, void *output, size_t output_size); 127 128 /** 129 * @brief Set FTL property 130 * 131 * @param dev FTL device 132 * @param mngt FTL management process handle 133 * @param name The property name to be set 134 * @param value The new property decoded value 135 * @param output The size of the new property decoded value 136 */ 137 int ftl_property_set(struct spdk_ftl_dev *dev, struct ftl_mngt_process *mngt, 138 const char *name, void *value, size_t value_size); 139 140 /** 141 * @brief Generic setter of the property 142 * 143 * @note This setter does binary copy and finishes always call the next management step 144 */ 145 void ftl_property_set_generic(struct spdk_ftl_dev *dev, struct ftl_mngt_process *mngt, 146 const struct ftl_property *property, 147 void *new_value, size_t new_value_size); 148 149 /** 150 * @brief The wrapper function to register mutable boolean property 151 * 152 * @param dev FTL device 153 * @param name The property name 154 * @param value The pointer to the boolean value of the property 155 * @param unit The property unit 156 * @param desc The property description 157 * @param verbose_mode The verbose mode flag 158 */ 159 static inline void 160 ftl_property_register_bool_rw(struct spdk_ftl_dev *dev, const char *name, bool *value, 161 const char *unit, const char *desc, bool verbose_mode) 162 { 163 ftl_property_register(dev, name, value, sizeof(*value), unit, desc, ftl_property_dump_bool, 164 ftl_property_decode_bool, ftl_property_set_generic, verbose_mode); 165 } 166 167 #endif 168