162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-or-later */ 262306a36Sopenharmony_ci 362306a36Sopenharmony_ci#ifndef _UFSHCD_PRIV_H_ 462306a36Sopenharmony_ci#define _UFSHCD_PRIV_H_ 562306a36Sopenharmony_ci 662306a36Sopenharmony_ci#include <linux/pm_runtime.h> 762306a36Sopenharmony_ci#include <ufs/ufshcd.h> 862306a36Sopenharmony_ci 962306a36Sopenharmony_cistatic inline bool ufshcd_is_user_access_allowed(struct ufs_hba *hba) 1062306a36Sopenharmony_ci{ 1162306a36Sopenharmony_ci return !hba->shutting_down; 1262306a36Sopenharmony_ci} 1362306a36Sopenharmony_ci 1462306a36Sopenharmony_civoid ufshcd_schedule_eh_work(struct ufs_hba *hba); 1562306a36Sopenharmony_ci 1662306a36Sopenharmony_cistatic inline bool ufshcd_keep_autobkops_enabled_except_suspend( 1762306a36Sopenharmony_ci struct ufs_hba *hba) 1862306a36Sopenharmony_ci{ 1962306a36Sopenharmony_ci return hba->caps & UFSHCD_CAP_KEEP_AUTO_BKOPS_ENABLED_EXCEPT_SUSPEND; 2062306a36Sopenharmony_ci} 2162306a36Sopenharmony_ci 2262306a36Sopenharmony_cistatic inline u8 ufshcd_wb_get_query_index(struct ufs_hba *hba) 2362306a36Sopenharmony_ci{ 2462306a36Sopenharmony_ci if (hba->dev_info.wb_buffer_type == WB_BUF_MODE_LU_DEDICATED) 2562306a36Sopenharmony_ci return hba->dev_info.wb_dedicated_lu; 2662306a36Sopenharmony_ci return 0; 2762306a36Sopenharmony_ci} 2862306a36Sopenharmony_ci 2962306a36Sopenharmony_cistatic inline bool ufshcd_is_wb_buf_flush_allowed(struct ufs_hba *hba) 3062306a36Sopenharmony_ci{ 3162306a36Sopenharmony_ci return ufshcd_is_wb_allowed(hba) && 3262306a36Sopenharmony_ci !(hba->quirks & UFSHCI_QUIRK_SKIP_MANUAL_WB_FLUSH_CTRL); 3362306a36Sopenharmony_ci} 3462306a36Sopenharmony_ci 3562306a36Sopenharmony_ci#ifdef CONFIG_SCSI_UFS_HWMON 3662306a36Sopenharmony_civoid ufs_hwmon_probe(struct ufs_hba *hba, u8 mask); 3762306a36Sopenharmony_civoid ufs_hwmon_remove(struct ufs_hba *hba); 3862306a36Sopenharmony_civoid ufs_hwmon_notify_event(struct ufs_hba *hba, u8 ee_mask); 3962306a36Sopenharmony_ci#else 4062306a36Sopenharmony_cistatic inline void ufs_hwmon_probe(struct ufs_hba *hba, u8 mask) {} 4162306a36Sopenharmony_cistatic inline void ufs_hwmon_remove(struct ufs_hba *hba) {} 4262306a36Sopenharmony_cistatic inline void ufs_hwmon_notify_event(struct ufs_hba *hba, u8 ee_mask) {} 4362306a36Sopenharmony_ci#endif 4462306a36Sopenharmony_ci 4562306a36Sopenharmony_ciint ufshcd_query_descriptor_retry(struct ufs_hba *hba, 4662306a36Sopenharmony_ci enum query_opcode opcode, 4762306a36Sopenharmony_ci enum desc_idn idn, u8 index, 4862306a36Sopenharmony_ci u8 selector, 4962306a36Sopenharmony_ci u8 *desc_buf, int *buf_len); 5062306a36Sopenharmony_ciint ufshcd_read_desc_param(struct ufs_hba *hba, 5162306a36Sopenharmony_ci enum desc_idn desc_id, 5262306a36Sopenharmony_ci int desc_index, 5362306a36Sopenharmony_ci u8 param_offset, 5462306a36Sopenharmony_ci u8 *param_read_buf, 5562306a36Sopenharmony_ci u8 param_size); 5662306a36Sopenharmony_ciint ufshcd_query_attr_retry(struct ufs_hba *hba, enum query_opcode opcode, 5762306a36Sopenharmony_ci enum attr_idn idn, u8 index, u8 selector, 5862306a36Sopenharmony_ci u32 *attr_val); 5962306a36Sopenharmony_ciint ufshcd_query_attr(struct ufs_hba *hba, enum query_opcode opcode, 6062306a36Sopenharmony_ci enum attr_idn idn, u8 index, u8 selector, u32 *attr_val); 6162306a36Sopenharmony_ciint ufshcd_query_flag(struct ufs_hba *hba, enum query_opcode opcode, 6262306a36Sopenharmony_ci enum flag_idn idn, u8 index, bool *flag_res); 6362306a36Sopenharmony_civoid ufshcd_auto_hibern8_update(struct ufs_hba *hba, u32 ahit); 6462306a36Sopenharmony_civoid ufshcd_compl_one_cqe(struct ufs_hba *hba, int task_tag, 6562306a36Sopenharmony_ci struct cq_entry *cqe); 6662306a36Sopenharmony_ciint ufshcd_mcq_init(struct ufs_hba *hba); 6762306a36Sopenharmony_ciint ufshcd_mcq_decide_queue_depth(struct ufs_hba *hba); 6862306a36Sopenharmony_ciint ufshcd_mcq_memory_alloc(struct ufs_hba *hba); 6962306a36Sopenharmony_civoid ufshcd_mcq_make_queues_operational(struct ufs_hba *hba); 7062306a36Sopenharmony_civoid ufshcd_mcq_config_mac(struct ufs_hba *hba, u32 max_active_cmds); 7162306a36Sopenharmony_ciu32 ufshcd_mcq_read_cqis(struct ufs_hba *hba, int i); 7262306a36Sopenharmony_civoid ufshcd_mcq_write_cqis(struct ufs_hba *hba, u32 val, int i); 7362306a36Sopenharmony_cistruct ufs_hw_queue *ufshcd_mcq_req_to_hwq(struct ufs_hba *hba, 7462306a36Sopenharmony_ci struct request *req); 7562306a36Sopenharmony_ciunsigned long ufshcd_mcq_poll_cqe_lock(struct ufs_hba *hba, 7662306a36Sopenharmony_ci struct ufs_hw_queue *hwq); 7762306a36Sopenharmony_civoid ufshcd_mcq_compl_all_cqes_lock(struct ufs_hba *hba, 7862306a36Sopenharmony_ci struct ufs_hw_queue *hwq); 7962306a36Sopenharmony_cibool ufshcd_cmd_inflight(struct scsi_cmnd *cmd); 8062306a36Sopenharmony_ciint ufshcd_mcq_sq_cleanup(struct ufs_hba *hba, int task_tag); 8162306a36Sopenharmony_ciint ufshcd_mcq_abort(struct scsi_cmnd *cmd); 8262306a36Sopenharmony_ciint ufshcd_try_to_abort_task(struct ufs_hba *hba, int tag); 8362306a36Sopenharmony_civoid ufshcd_release_scsi_cmd(struct ufs_hba *hba, 8462306a36Sopenharmony_ci struct ufshcd_lrb *lrbp); 8562306a36Sopenharmony_ci 8662306a36Sopenharmony_ci#define SD_ASCII_STD true 8762306a36Sopenharmony_ci#define SD_RAW false 8862306a36Sopenharmony_ciint ufshcd_read_string_desc(struct ufs_hba *hba, u8 desc_index, 8962306a36Sopenharmony_ci u8 **buf, bool ascii); 9062306a36Sopenharmony_ci 9162306a36Sopenharmony_ciint ufshcd_send_uic_cmd(struct ufs_hba *hba, struct uic_command *uic_cmd); 9262306a36Sopenharmony_ci 9362306a36Sopenharmony_ciint ufshcd_exec_raw_upiu_cmd(struct ufs_hba *hba, 9462306a36Sopenharmony_ci struct utp_upiu_req *req_upiu, 9562306a36Sopenharmony_ci struct utp_upiu_req *rsp_upiu, 9662306a36Sopenharmony_ci enum upiu_request_transaction msgcode, 9762306a36Sopenharmony_ci u8 *desc_buff, int *buff_len, 9862306a36Sopenharmony_ci enum query_opcode desc_op); 9962306a36Sopenharmony_ci 10062306a36Sopenharmony_ciint ufshcd_wb_toggle(struct ufs_hba *hba, bool enable); 10162306a36Sopenharmony_ci 10262306a36Sopenharmony_ci/* Wrapper functions for safely calling variant operations */ 10362306a36Sopenharmony_cistatic inline const char *ufshcd_get_var_name(struct ufs_hba *hba) 10462306a36Sopenharmony_ci{ 10562306a36Sopenharmony_ci if (hba->vops) 10662306a36Sopenharmony_ci return hba->vops->name; 10762306a36Sopenharmony_ci return ""; 10862306a36Sopenharmony_ci} 10962306a36Sopenharmony_ci 11062306a36Sopenharmony_cistatic inline void ufshcd_vops_exit(struct ufs_hba *hba) 11162306a36Sopenharmony_ci{ 11262306a36Sopenharmony_ci if (hba->vops && hba->vops->exit) 11362306a36Sopenharmony_ci return hba->vops->exit(hba); 11462306a36Sopenharmony_ci} 11562306a36Sopenharmony_ci 11662306a36Sopenharmony_cistatic inline u32 ufshcd_vops_get_ufs_hci_version(struct ufs_hba *hba) 11762306a36Sopenharmony_ci{ 11862306a36Sopenharmony_ci if (hba->vops && hba->vops->get_ufs_hci_version) 11962306a36Sopenharmony_ci return hba->vops->get_ufs_hci_version(hba); 12062306a36Sopenharmony_ci 12162306a36Sopenharmony_ci return ufshcd_readl(hba, REG_UFS_VERSION); 12262306a36Sopenharmony_ci} 12362306a36Sopenharmony_ci 12462306a36Sopenharmony_cistatic inline int ufshcd_vops_clk_scale_notify(struct ufs_hba *hba, 12562306a36Sopenharmony_ci bool up, enum ufs_notify_change_status status) 12662306a36Sopenharmony_ci{ 12762306a36Sopenharmony_ci if (hba->vops && hba->vops->clk_scale_notify) 12862306a36Sopenharmony_ci return hba->vops->clk_scale_notify(hba, up, status); 12962306a36Sopenharmony_ci return 0; 13062306a36Sopenharmony_ci} 13162306a36Sopenharmony_ci 13262306a36Sopenharmony_cistatic inline void ufshcd_vops_event_notify(struct ufs_hba *hba, 13362306a36Sopenharmony_ci enum ufs_event_type evt, 13462306a36Sopenharmony_ci void *data) 13562306a36Sopenharmony_ci{ 13662306a36Sopenharmony_ci if (hba->vops && hba->vops->event_notify) 13762306a36Sopenharmony_ci hba->vops->event_notify(hba, evt, data); 13862306a36Sopenharmony_ci} 13962306a36Sopenharmony_ci 14062306a36Sopenharmony_cistatic inline int ufshcd_vops_setup_clocks(struct ufs_hba *hba, bool on, 14162306a36Sopenharmony_ci enum ufs_notify_change_status status) 14262306a36Sopenharmony_ci{ 14362306a36Sopenharmony_ci if (hba->vops && hba->vops->setup_clocks) 14462306a36Sopenharmony_ci return hba->vops->setup_clocks(hba, on, status); 14562306a36Sopenharmony_ci return 0; 14662306a36Sopenharmony_ci} 14762306a36Sopenharmony_ci 14862306a36Sopenharmony_cistatic inline int ufshcd_vops_hce_enable_notify(struct ufs_hba *hba, 14962306a36Sopenharmony_ci bool status) 15062306a36Sopenharmony_ci{ 15162306a36Sopenharmony_ci if (hba->vops && hba->vops->hce_enable_notify) 15262306a36Sopenharmony_ci return hba->vops->hce_enable_notify(hba, status); 15362306a36Sopenharmony_ci 15462306a36Sopenharmony_ci return 0; 15562306a36Sopenharmony_ci} 15662306a36Sopenharmony_cistatic inline int ufshcd_vops_link_startup_notify(struct ufs_hba *hba, 15762306a36Sopenharmony_ci bool status) 15862306a36Sopenharmony_ci{ 15962306a36Sopenharmony_ci if (hba->vops && hba->vops->link_startup_notify) 16062306a36Sopenharmony_ci return hba->vops->link_startup_notify(hba, status); 16162306a36Sopenharmony_ci 16262306a36Sopenharmony_ci return 0; 16362306a36Sopenharmony_ci} 16462306a36Sopenharmony_ci 16562306a36Sopenharmony_cistatic inline int ufshcd_vops_pwr_change_notify(struct ufs_hba *hba, 16662306a36Sopenharmony_ci enum ufs_notify_change_status status, 16762306a36Sopenharmony_ci struct ufs_pa_layer_attr *dev_max_params, 16862306a36Sopenharmony_ci struct ufs_pa_layer_attr *dev_req_params) 16962306a36Sopenharmony_ci{ 17062306a36Sopenharmony_ci if (hba->vops && hba->vops->pwr_change_notify) 17162306a36Sopenharmony_ci return hba->vops->pwr_change_notify(hba, status, 17262306a36Sopenharmony_ci dev_max_params, dev_req_params); 17362306a36Sopenharmony_ci 17462306a36Sopenharmony_ci return -ENOTSUPP; 17562306a36Sopenharmony_ci} 17662306a36Sopenharmony_ci 17762306a36Sopenharmony_cistatic inline void ufshcd_vops_setup_task_mgmt(struct ufs_hba *hba, 17862306a36Sopenharmony_ci int tag, u8 tm_function) 17962306a36Sopenharmony_ci{ 18062306a36Sopenharmony_ci if (hba->vops && hba->vops->setup_task_mgmt) 18162306a36Sopenharmony_ci return hba->vops->setup_task_mgmt(hba, tag, tm_function); 18262306a36Sopenharmony_ci} 18362306a36Sopenharmony_ci 18462306a36Sopenharmony_cistatic inline void ufshcd_vops_hibern8_notify(struct ufs_hba *hba, 18562306a36Sopenharmony_ci enum uic_cmd_dme cmd, 18662306a36Sopenharmony_ci enum ufs_notify_change_status status) 18762306a36Sopenharmony_ci{ 18862306a36Sopenharmony_ci if (hba->vops && hba->vops->hibern8_notify) 18962306a36Sopenharmony_ci return hba->vops->hibern8_notify(hba, cmd, status); 19062306a36Sopenharmony_ci} 19162306a36Sopenharmony_ci 19262306a36Sopenharmony_cistatic inline int ufshcd_vops_apply_dev_quirks(struct ufs_hba *hba) 19362306a36Sopenharmony_ci{ 19462306a36Sopenharmony_ci if (hba->vops && hba->vops->apply_dev_quirks) 19562306a36Sopenharmony_ci return hba->vops->apply_dev_quirks(hba); 19662306a36Sopenharmony_ci return 0; 19762306a36Sopenharmony_ci} 19862306a36Sopenharmony_ci 19962306a36Sopenharmony_cistatic inline void ufshcd_vops_fixup_dev_quirks(struct ufs_hba *hba) 20062306a36Sopenharmony_ci{ 20162306a36Sopenharmony_ci if (hba->vops && hba->vops->fixup_dev_quirks) 20262306a36Sopenharmony_ci hba->vops->fixup_dev_quirks(hba); 20362306a36Sopenharmony_ci} 20462306a36Sopenharmony_ci 20562306a36Sopenharmony_cistatic inline int ufshcd_vops_suspend(struct ufs_hba *hba, enum ufs_pm_op op, 20662306a36Sopenharmony_ci enum ufs_notify_change_status status) 20762306a36Sopenharmony_ci{ 20862306a36Sopenharmony_ci if (hba->vops && hba->vops->suspend) 20962306a36Sopenharmony_ci return hba->vops->suspend(hba, op, status); 21062306a36Sopenharmony_ci 21162306a36Sopenharmony_ci return 0; 21262306a36Sopenharmony_ci} 21362306a36Sopenharmony_ci 21462306a36Sopenharmony_cistatic inline int ufshcd_vops_resume(struct ufs_hba *hba, enum ufs_pm_op op) 21562306a36Sopenharmony_ci{ 21662306a36Sopenharmony_ci if (hba->vops && hba->vops->resume) 21762306a36Sopenharmony_ci return hba->vops->resume(hba, op); 21862306a36Sopenharmony_ci 21962306a36Sopenharmony_ci return 0; 22062306a36Sopenharmony_ci} 22162306a36Sopenharmony_ci 22262306a36Sopenharmony_cistatic inline void ufshcd_vops_dbg_register_dump(struct ufs_hba *hba) 22362306a36Sopenharmony_ci{ 22462306a36Sopenharmony_ci if (hba->vops && hba->vops->dbg_register_dump) 22562306a36Sopenharmony_ci hba->vops->dbg_register_dump(hba); 22662306a36Sopenharmony_ci} 22762306a36Sopenharmony_ci 22862306a36Sopenharmony_cistatic inline int ufshcd_vops_device_reset(struct ufs_hba *hba) 22962306a36Sopenharmony_ci{ 23062306a36Sopenharmony_ci if (hba->vops && hba->vops->device_reset) 23162306a36Sopenharmony_ci return hba->vops->device_reset(hba); 23262306a36Sopenharmony_ci 23362306a36Sopenharmony_ci return -EOPNOTSUPP; 23462306a36Sopenharmony_ci} 23562306a36Sopenharmony_ci 23662306a36Sopenharmony_cistatic inline void ufshcd_vops_config_scaling_param(struct ufs_hba *hba, 23762306a36Sopenharmony_ci struct devfreq_dev_profile *p, 23862306a36Sopenharmony_ci struct devfreq_simple_ondemand_data *data) 23962306a36Sopenharmony_ci{ 24062306a36Sopenharmony_ci if (hba->vops && hba->vops->config_scaling_param) 24162306a36Sopenharmony_ci hba->vops->config_scaling_param(hba, p, data); 24262306a36Sopenharmony_ci} 24362306a36Sopenharmony_ci 24462306a36Sopenharmony_cistatic inline void ufshcd_vops_reinit_notify(struct ufs_hba *hba) 24562306a36Sopenharmony_ci{ 24662306a36Sopenharmony_ci if (hba->vops && hba->vops->reinit_notify) 24762306a36Sopenharmony_ci hba->vops->reinit_notify(hba); 24862306a36Sopenharmony_ci} 24962306a36Sopenharmony_ci 25062306a36Sopenharmony_cistatic inline int ufshcd_vops_mcq_config_resource(struct ufs_hba *hba) 25162306a36Sopenharmony_ci{ 25262306a36Sopenharmony_ci if (hba->vops && hba->vops->mcq_config_resource) 25362306a36Sopenharmony_ci return hba->vops->mcq_config_resource(hba); 25462306a36Sopenharmony_ci 25562306a36Sopenharmony_ci return -EOPNOTSUPP; 25662306a36Sopenharmony_ci} 25762306a36Sopenharmony_ci 25862306a36Sopenharmony_cistatic inline int ufshcd_mcq_vops_get_hba_mac(struct ufs_hba *hba) 25962306a36Sopenharmony_ci{ 26062306a36Sopenharmony_ci if (hba->vops && hba->vops->get_hba_mac) 26162306a36Sopenharmony_ci return hba->vops->get_hba_mac(hba); 26262306a36Sopenharmony_ci 26362306a36Sopenharmony_ci return -EOPNOTSUPP; 26462306a36Sopenharmony_ci} 26562306a36Sopenharmony_ci 26662306a36Sopenharmony_cistatic inline int ufshcd_mcq_vops_op_runtime_config(struct ufs_hba *hba) 26762306a36Sopenharmony_ci{ 26862306a36Sopenharmony_ci if (hba->vops && hba->vops->op_runtime_config) 26962306a36Sopenharmony_ci return hba->vops->op_runtime_config(hba); 27062306a36Sopenharmony_ci 27162306a36Sopenharmony_ci return -EOPNOTSUPP; 27262306a36Sopenharmony_ci} 27362306a36Sopenharmony_ci 27462306a36Sopenharmony_cistatic inline int ufshcd_vops_get_outstanding_cqs(struct ufs_hba *hba, 27562306a36Sopenharmony_ci unsigned long *ocqs) 27662306a36Sopenharmony_ci{ 27762306a36Sopenharmony_ci if (hba->vops && hba->vops->get_outstanding_cqs) 27862306a36Sopenharmony_ci return hba->vops->get_outstanding_cqs(hba, ocqs); 27962306a36Sopenharmony_ci 28062306a36Sopenharmony_ci return -EOPNOTSUPP; 28162306a36Sopenharmony_ci} 28262306a36Sopenharmony_ci 28362306a36Sopenharmony_cistatic inline int ufshcd_mcq_vops_config_esi(struct ufs_hba *hba) 28462306a36Sopenharmony_ci{ 28562306a36Sopenharmony_ci if (hba->vops && hba->vops->config_esi) 28662306a36Sopenharmony_ci return hba->vops->config_esi(hba); 28762306a36Sopenharmony_ci 28862306a36Sopenharmony_ci return -EOPNOTSUPP; 28962306a36Sopenharmony_ci} 29062306a36Sopenharmony_ci 29162306a36Sopenharmony_ciextern const struct ufs_pm_lvl_states ufs_pm_lvl_states[]; 29262306a36Sopenharmony_ci 29362306a36Sopenharmony_ci/** 29462306a36Sopenharmony_ci * ufshcd_scsi_to_upiu_lun - maps scsi LUN to UPIU LUN 29562306a36Sopenharmony_ci * @scsi_lun: scsi LUN id 29662306a36Sopenharmony_ci * 29762306a36Sopenharmony_ci * Return: UPIU LUN id 29862306a36Sopenharmony_ci */ 29962306a36Sopenharmony_cistatic inline u8 ufshcd_scsi_to_upiu_lun(unsigned int scsi_lun) 30062306a36Sopenharmony_ci{ 30162306a36Sopenharmony_ci if (scsi_is_wlun(scsi_lun)) 30262306a36Sopenharmony_ci return (scsi_lun & UFS_UPIU_MAX_UNIT_NUM_ID) 30362306a36Sopenharmony_ci | UFS_UPIU_WLUN_ID; 30462306a36Sopenharmony_ci else 30562306a36Sopenharmony_ci return scsi_lun & UFS_UPIU_MAX_UNIT_NUM_ID; 30662306a36Sopenharmony_ci} 30762306a36Sopenharmony_ci 30862306a36Sopenharmony_ciint __ufshcd_write_ee_control(struct ufs_hba *hba, u32 ee_ctrl_mask); 30962306a36Sopenharmony_ciint ufshcd_write_ee_control(struct ufs_hba *hba); 31062306a36Sopenharmony_ciint ufshcd_update_ee_control(struct ufs_hba *hba, u16 *mask, 31162306a36Sopenharmony_ci const u16 *other_mask, u16 set, u16 clr); 31262306a36Sopenharmony_ci 31362306a36Sopenharmony_cistatic inline int ufshcd_update_ee_drv_mask(struct ufs_hba *hba, 31462306a36Sopenharmony_ci u16 set, u16 clr) 31562306a36Sopenharmony_ci{ 31662306a36Sopenharmony_ci return ufshcd_update_ee_control(hba, &hba->ee_drv_mask, 31762306a36Sopenharmony_ci &hba->ee_usr_mask, set, clr); 31862306a36Sopenharmony_ci} 31962306a36Sopenharmony_ci 32062306a36Sopenharmony_cistatic inline int ufshcd_update_ee_usr_mask(struct ufs_hba *hba, 32162306a36Sopenharmony_ci u16 set, u16 clr) 32262306a36Sopenharmony_ci{ 32362306a36Sopenharmony_ci return ufshcd_update_ee_control(hba, &hba->ee_usr_mask, 32462306a36Sopenharmony_ci &hba->ee_drv_mask, set, clr); 32562306a36Sopenharmony_ci} 32662306a36Sopenharmony_ci 32762306a36Sopenharmony_cistatic inline int ufshcd_rpm_get_sync(struct ufs_hba *hba) 32862306a36Sopenharmony_ci{ 32962306a36Sopenharmony_ci return pm_runtime_get_sync(&hba->ufs_device_wlun->sdev_gendev); 33062306a36Sopenharmony_ci} 33162306a36Sopenharmony_ci 33262306a36Sopenharmony_cistatic inline int ufshcd_rpm_put_sync(struct ufs_hba *hba) 33362306a36Sopenharmony_ci{ 33462306a36Sopenharmony_ci return pm_runtime_put_sync(&hba->ufs_device_wlun->sdev_gendev); 33562306a36Sopenharmony_ci} 33662306a36Sopenharmony_ci 33762306a36Sopenharmony_cistatic inline void ufshcd_rpm_get_noresume(struct ufs_hba *hba) 33862306a36Sopenharmony_ci{ 33962306a36Sopenharmony_ci pm_runtime_get_noresume(&hba->ufs_device_wlun->sdev_gendev); 34062306a36Sopenharmony_ci} 34162306a36Sopenharmony_ci 34262306a36Sopenharmony_cistatic inline int ufshcd_rpm_resume(struct ufs_hba *hba) 34362306a36Sopenharmony_ci{ 34462306a36Sopenharmony_ci return pm_runtime_resume(&hba->ufs_device_wlun->sdev_gendev); 34562306a36Sopenharmony_ci} 34662306a36Sopenharmony_ci 34762306a36Sopenharmony_cistatic inline int ufshcd_rpm_put(struct ufs_hba *hba) 34862306a36Sopenharmony_ci{ 34962306a36Sopenharmony_ci return pm_runtime_put(&hba->ufs_device_wlun->sdev_gendev); 35062306a36Sopenharmony_ci} 35162306a36Sopenharmony_ci 35262306a36Sopenharmony_ci/** 35362306a36Sopenharmony_ci * ufs_is_valid_unit_desc_lun - checks if the given LUN has a unit descriptor 35462306a36Sopenharmony_ci * @dev_info: pointer of instance of struct ufs_dev_info 35562306a36Sopenharmony_ci * @lun: LU number to check 35662306a36Sopenharmony_ci * @return: true if the lun has a matching unit descriptor, false otherwise 35762306a36Sopenharmony_ci */ 35862306a36Sopenharmony_cistatic inline bool ufs_is_valid_unit_desc_lun(struct ufs_dev_info *dev_info, u8 lun) 35962306a36Sopenharmony_ci{ 36062306a36Sopenharmony_ci if (!dev_info || !dev_info->max_lu_supported) { 36162306a36Sopenharmony_ci pr_err("Max General LU supported by UFS isn't initialized\n"); 36262306a36Sopenharmony_ci return false; 36362306a36Sopenharmony_ci } 36462306a36Sopenharmony_ci return lun == UFS_UPIU_RPMB_WLUN || (lun < dev_info->max_lu_supported); 36562306a36Sopenharmony_ci} 36662306a36Sopenharmony_ci 36762306a36Sopenharmony_cistatic inline void ufshcd_inc_sq_tail(struct ufs_hw_queue *q) 36862306a36Sopenharmony_ci __must_hold(&q->sq_lock) 36962306a36Sopenharmony_ci{ 37062306a36Sopenharmony_ci u32 val; 37162306a36Sopenharmony_ci 37262306a36Sopenharmony_ci q->sq_tail_slot++; 37362306a36Sopenharmony_ci if (q->sq_tail_slot == q->max_entries) 37462306a36Sopenharmony_ci q->sq_tail_slot = 0; 37562306a36Sopenharmony_ci val = q->sq_tail_slot * sizeof(struct utp_transfer_req_desc); 37662306a36Sopenharmony_ci writel(val, q->mcq_sq_tail); 37762306a36Sopenharmony_ci} 37862306a36Sopenharmony_ci 37962306a36Sopenharmony_cistatic inline void ufshcd_mcq_update_cq_tail_slot(struct ufs_hw_queue *q) 38062306a36Sopenharmony_ci{ 38162306a36Sopenharmony_ci u32 val = readl(q->mcq_cq_tail); 38262306a36Sopenharmony_ci 38362306a36Sopenharmony_ci q->cq_tail_slot = val / sizeof(struct cq_entry); 38462306a36Sopenharmony_ci} 38562306a36Sopenharmony_ci 38662306a36Sopenharmony_cistatic inline bool ufshcd_mcq_is_cq_empty(struct ufs_hw_queue *q) 38762306a36Sopenharmony_ci{ 38862306a36Sopenharmony_ci return q->cq_head_slot == q->cq_tail_slot; 38962306a36Sopenharmony_ci} 39062306a36Sopenharmony_ci 39162306a36Sopenharmony_cistatic inline void ufshcd_mcq_inc_cq_head_slot(struct ufs_hw_queue *q) 39262306a36Sopenharmony_ci{ 39362306a36Sopenharmony_ci q->cq_head_slot++; 39462306a36Sopenharmony_ci if (q->cq_head_slot == q->max_entries) 39562306a36Sopenharmony_ci q->cq_head_slot = 0; 39662306a36Sopenharmony_ci} 39762306a36Sopenharmony_ci 39862306a36Sopenharmony_cistatic inline void ufshcd_mcq_update_cq_head(struct ufs_hw_queue *q) 39962306a36Sopenharmony_ci{ 40062306a36Sopenharmony_ci writel(q->cq_head_slot * sizeof(struct cq_entry), q->mcq_cq_head); 40162306a36Sopenharmony_ci} 40262306a36Sopenharmony_ci 40362306a36Sopenharmony_cistatic inline struct cq_entry *ufshcd_mcq_cur_cqe(struct ufs_hw_queue *q) 40462306a36Sopenharmony_ci{ 40562306a36Sopenharmony_ci struct cq_entry *cqe = q->cqe_base_addr; 40662306a36Sopenharmony_ci 40762306a36Sopenharmony_ci return cqe + q->cq_head_slot; 40862306a36Sopenharmony_ci} 40962306a36Sopenharmony_ci 41062306a36Sopenharmony_cistatic inline u32 ufshcd_mcq_get_sq_head_slot(struct ufs_hw_queue *q) 41162306a36Sopenharmony_ci{ 41262306a36Sopenharmony_ci u32 val = readl(q->mcq_sq_head); 41362306a36Sopenharmony_ci 41462306a36Sopenharmony_ci return val / sizeof(struct utp_transfer_req_desc); 41562306a36Sopenharmony_ci} 41662306a36Sopenharmony_ci 41762306a36Sopenharmony_ci#endif /* _UFSHCD_PRIV_H_ */ 418