ufshcd-priv.h (8522B)
1/* SPDX-License-Identifier: GPL-2.0-or-later */ 2 3#ifndef _UFSHCD_PRIV_H_ 4#define _UFSHCD_PRIV_H_ 5 6#include <linux/pm_runtime.h> 7#include <ufs/ufshcd.h> 8 9static inline bool ufshcd_is_user_access_allowed(struct ufs_hba *hba) 10{ 11 return !hba->shutting_down; 12} 13 14void ufshcd_schedule_eh_work(struct ufs_hba *hba); 15 16static inline bool ufshcd_keep_autobkops_enabled_except_suspend( 17 struct ufs_hba *hba) 18{ 19 return hba->caps & UFSHCD_CAP_KEEP_AUTO_BKOPS_ENABLED_EXCEPT_SUSPEND; 20} 21 22static inline u8 ufshcd_wb_get_query_index(struct ufs_hba *hba) 23{ 24 if (hba->dev_info.wb_buffer_type == WB_BUF_MODE_LU_DEDICATED) 25 return hba->dev_info.wb_dedicated_lu; 26 return 0; 27} 28 29#ifdef CONFIG_SCSI_UFS_HWMON 30void ufs_hwmon_probe(struct ufs_hba *hba, u8 mask); 31void ufs_hwmon_remove(struct ufs_hba *hba); 32void ufs_hwmon_notify_event(struct ufs_hba *hba, u8 ee_mask); 33#else 34static inline void ufs_hwmon_probe(struct ufs_hba *hba, u8 mask) {} 35static inline void ufs_hwmon_remove(struct ufs_hba *hba) {} 36static inline void ufs_hwmon_notify_event(struct ufs_hba *hba, u8 ee_mask) {} 37#endif 38 39int ufshcd_read_desc_param(struct ufs_hba *hba, 40 enum desc_idn desc_id, 41 int desc_index, 42 u8 param_offset, 43 u8 *param_read_buf, 44 u8 param_size); 45int ufshcd_query_attr_retry(struct ufs_hba *hba, enum query_opcode opcode, 46 enum attr_idn idn, u8 index, u8 selector, 47 u32 *attr_val); 48int ufshcd_query_attr(struct ufs_hba *hba, enum query_opcode opcode, 49 enum attr_idn idn, u8 index, u8 selector, u32 *attr_val); 50int ufshcd_query_flag(struct ufs_hba *hba, enum query_opcode opcode, 51 enum flag_idn idn, u8 index, bool *flag_res); 52void ufshcd_auto_hibern8_update(struct ufs_hba *hba, u32 ahit); 53 54#define SD_ASCII_STD true 55#define SD_RAW false 56int ufshcd_read_string_desc(struct ufs_hba *hba, u8 desc_index, 57 u8 **buf, bool ascii); 58 59int ufshcd_hold(struct ufs_hba *hba, bool async); 60void ufshcd_release(struct ufs_hba *hba); 61 62void ufshcd_map_desc_id_to_length(struct ufs_hba *hba, enum desc_idn desc_id, 63 int *desc_length); 64 65int ufshcd_send_uic_cmd(struct ufs_hba *hba, struct uic_command *uic_cmd); 66 67int ufshcd_exec_raw_upiu_cmd(struct ufs_hba *hba, 68 struct utp_upiu_req *req_upiu, 69 struct utp_upiu_req *rsp_upiu, 70 int msgcode, 71 u8 *desc_buff, int *buff_len, 72 enum query_opcode desc_op); 73 74int ufshcd_wb_toggle(struct ufs_hba *hba, bool enable); 75 76/* Wrapper functions for safely calling variant operations */ 77static inline const char *ufshcd_get_var_name(struct ufs_hba *hba) 78{ 79 if (hba->vops) 80 return hba->vops->name; 81 return ""; 82} 83 84static inline void ufshcd_vops_exit(struct ufs_hba *hba) 85{ 86 if (hba->vops && hba->vops->exit) 87 return hba->vops->exit(hba); 88} 89 90static inline u32 ufshcd_vops_get_ufs_hci_version(struct ufs_hba *hba) 91{ 92 if (hba->vops && hba->vops->get_ufs_hci_version) 93 return hba->vops->get_ufs_hci_version(hba); 94 95 return ufshcd_readl(hba, REG_UFS_VERSION); 96} 97 98static inline int ufshcd_vops_clk_scale_notify(struct ufs_hba *hba, 99 bool up, enum ufs_notify_change_status status) 100{ 101 if (hba->vops && hba->vops->clk_scale_notify) 102 return hba->vops->clk_scale_notify(hba, up, status); 103 return 0; 104} 105 106static inline void ufshcd_vops_event_notify(struct ufs_hba *hba, 107 enum ufs_event_type evt, 108 void *data) 109{ 110 if (hba->vops && hba->vops->event_notify) 111 hba->vops->event_notify(hba, evt, data); 112} 113 114static inline int ufshcd_vops_setup_clocks(struct ufs_hba *hba, bool on, 115 enum ufs_notify_change_status status) 116{ 117 if (hba->vops && hba->vops->setup_clocks) 118 return hba->vops->setup_clocks(hba, on, status); 119 return 0; 120} 121 122static inline int ufshcd_vops_hce_enable_notify(struct ufs_hba *hba, 123 bool status) 124{ 125 if (hba->vops && hba->vops->hce_enable_notify) 126 return hba->vops->hce_enable_notify(hba, status); 127 128 return 0; 129} 130static inline int ufshcd_vops_link_startup_notify(struct ufs_hba *hba, 131 bool status) 132{ 133 if (hba->vops && hba->vops->link_startup_notify) 134 return hba->vops->link_startup_notify(hba, status); 135 136 return 0; 137} 138 139static inline int ufshcd_vops_pwr_change_notify(struct ufs_hba *hba, 140 enum ufs_notify_change_status status, 141 struct ufs_pa_layer_attr *dev_max_params, 142 struct ufs_pa_layer_attr *dev_req_params) 143{ 144 if (hba->vops && hba->vops->pwr_change_notify) 145 return hba->vops->pwr_change_notify(hba, status, 146 dev_max_params, dev_req_params); 147 148 return -ENOTSUPP; 149} 150 151static inline void ufshcd_vops_setup_task_mgmt(struct ufs_hba *hba, 152 int tag, u8 tm_function) 153{ 154 if (hba->vops && hba->vops->setup_task_mgmt) 155 return hba->vops->setup_task_mgmt(hba, tag, tm_function); 156} 157 158static inline void ufshcd_vops_hibern8_notify(struct ufs_hba *hba, 159 enum uic_cmd_dme cmd, 160 enum ufs_notify_change_status status) 161{ 162 if (hba->vops && hba->vops->hibern8_notify) 163 return hba->vops->hibern8_notify(hba, cmd, status); 164} 165 166static inline int ufshcd_vops_apply_dev_quirks(struct ufs_hba *hba) 167{ 168 if (hba->vops && hba->vops->apply_dev_quirks) 169 return hba->vops->apply_dev_quirks(hba); 170 return 0; 171} 172 173static inline void ufshcd_vops_fixup_dev_quirks(struct ufs_hba *hba) 174{ 175 if (hba->vops && hba->vops->fixup_dev_quirks) 176 hba->vops->fixup_dev_quirks(hba); 177} 178 179static inline int ufshcd_vops_suspend(struct ufs_hba *hba, enum ufs_pm_op op, 180 enum ufs_notify_change_status status) 181{ 182 if (hba->vops && hba->vops->suspend) 183 return hba->vops->suspend(hba, op, status); 184 185 return 0; 186} 187 188static inline int ufshcd_vops_resume(struct ufs_hba *hba, enum ufs_pm_op op) 189{ 190 if (hba->vops && hba->vops->resume) 191 return hba->vops->resume(hba, op); 192 193 return 0; 194} 195 196static inline void ufshcd_vops_dbg_register_dump(struct ufs_hba *hba) 197{ 198 if (hba->vops && hba->vops->dbg_register_dump) 199 hba->vops->dbg_register_dump(hba); 200} 201 202static inline int ufshcd_vops_device_reset(struct ufs_hba *hba) 203{ 204 if (hba->vops && hba->vops->device_reset) 205 return hba->vops->device_reset(hba); 206 207 return -EOPNOTSUPP; 208} 209 210static inline void ufshcd_vops_config_scaling_param(struct ufs_hba *hba, 211 struct devfreq_dev_profile *p, 212 struct devfreq_simple_ondemand_data *data) 213{ 214 if (hba->vops && hba->vops->config_scaling_param) 215 hba->vops->config_scaling_param(hba, p, data); 216} 217 218extern struct ufs_pm_lvl_states ufs_pm_lvl_states[]; 219 220/** 221 * ufshcd_scsi_to_upiu_lun - maps scsi LUN to UPIU LUN 222 * @scsi_lun: scsi LUN id 223 * 224 * Returns UPIU LUN id 225 */ 226static inline u8 ufshcd_scsi_to_upiu_lun(unsigned int scsi_lun) 227{ 228 if (scsi_is_wlun(scsi_lun)) 229 return (scsi_lun & UFS_UPIU_MAX_UNIT_NUM_ID) 230 | UFS_UPIU_WLUN_ID; 231 else 232 return scsi_lun & UFS_UPIU_MAX_UNIT_NUM_ID; 233} 234 235int __ufshcd_write_ee_control(struct ufs_hba *hba, u32 ee_ctrl_mask); 236int ufshcd_write_ee_control(struct ufs_hba *hba); 237int ufshcd_update_ee_control(struct ufs_hba *hba, u16 *mask, u16 *other_mask, 238 u16 set, u16 clr); 239 240static inline int ufshcd_update_ee_drv_mask(struct ufs_hba *hba, 241 u16 set, u16 clr) 242{ 243 return ufshcd_update_ee_control(hba, &hba->ee_drv_mask, 244 &hba->ee_usr_mask, set, clr); 245} 246 247static inline int ufshcd_update_ee_usr_mask(struct ufs_hba *hba, 248 u16 set, u16 clr) 249{ 250 return ufshcd_update_ee_control(hba, &hba->ee_usr_mask, 251 &hba->ee_drv_mask, set, clr); 252} 253 254static inline int ufshcd_rpm_get_sync(struct ufs_hba *hba) 255{ 256 return pm_runtime_get_sync(&hba->ufs_device_wlun->sdev_gendev); 257} 258 259static inline int ufshcd_rpm_put_sync(struct ufs_hba *hba) 260{ 261 return pm_runtime_put_sync(&hba->ufs_device_wlun->sdev_gendev); 262} 263 264static inline void ufshcd_rpm_get_noresume(struct ufs_hba *hba) 265{ 266 pm_runtime_get_noresume(&hba->ufs_device_wlun->sdev_gendev); 267} 268 269static inline int ufshcd_rpm_resume(struct ufs_hba *hba) 270{ 271 return pm_runtime_resume(&hba->ufs_device_wlun->sdev_gendev); 272} 273 274static inline int ufshcd_rpm_put(struct ufs_hba *hba) 275{ 276 return pm_runtime_put(&hba->ufs_device_wlun->sdev_gendev); 277} 278 279/** 280 * ufs_is_valid_unit_desc_lun - checks if the given LUN has a unit descriptor 281 * @dev_info: pointer of instance of struct ufs_dev_info 282 * @lun: LU number to check 283 * @return: true if the lun has a matching unit descriptor, false otherwise 284 */ 285static inline bool ufs_is_valid_unit_desc_lun(struct ufs_dev_info *dev_info, 286 u8 lun, u8 param_offset) 287{ 288 if (!dev_info || !dev_info->max_lu_supported) { 289 pr_err("Max General LU supported by UFS isn't initialized\n"); 290 return false; 291 } 292 /* WB is available only for the logical unit from 0 to 7 */ 293 if (param_offset == UNIT_DESC_PARAM_WB_BUF_ALLOC_UNITS) 294 return lun < UFS_UPIU_MAX_WB_LUN_ID; 295 return lun == UFS_UPIU_RPMB_WLUN || (lun < dev_info->max_lu_supported); 296} 297 298#endif /* _UFSHCD_PRIV_H_ */