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