Lines Matching refs:hba
71 static inline bool ufshcd_is_hba_active(struct ufs_hba *hba);
72 static inline void ufshcd_hba_stop(struct ufs_hba *hba);
73 static int ufshcd_hba_enable(struct ufs_hba *hba);
78 static int ufshcd_wait_for_register(struct ufs_hba *hba, u32 reg, u32 mask, in ufshcd_wait_for_register() argument
87 while ((ufshcd_readl(hba, reg) & mask) != val) { in ufshcd_wait_for_register()
89 if ((ufshcd_readl(hba, reg) & mask) != val) in ufshcd_wait_for_register()
102 static void ufshcd_init_pwr_info(struct ufs_hba *hba) in ufshcd_init_pwr_info() argument
104 hba->pwr_info.gear_rx = UFS_PWM_G1; in ufshcd_init_pwr_info()
105 hba->pwr_info.gear_tx = UFS_PWM_G1; in ufshcd_init_pwr_info()
106 hba->pwr_info.lane_rx = 1; in ufshcd_init_pwr_info()
107 hba->pwr_info.lane_tx = 1; in ufshcd_init_pwr_info()
108 hba->pwr_info.pwr_rx = SLOWAUTO_MODE; in ufshcd_init_pwr_info()
109 hba->pwr_info.pwr_tx = SLOWAUTO_MODE; in ufshcd_init_pwr_info()
110 hba->pwr_info.hs_rate = 0; in ufshcd_init_pwr_info()
117 static void ufshcd_print_pwr_info(struct ufs_hba *hba) in ufshcd_print_pwr_info() argument
129 dev_err(hba->dev, "[RX, TX]: gear=[%d, %d], lane[%d, %d], pwr[%s, %s], rate = %d\n", in ufshcd_print_pwr_info()
130 hba->pwr_info.gear_rx, hba->pwr_info.gear_tx, in ufshcd_print_pwr_info()
131 hba->pwr_info.lane_rx, hba->pwr_info.lane_tx, in ufshcd_print_pwr_info()
132 names[hba->pwr_info.pwr_rx], in ufshcd_print_pwr_info()
133 names[hba->pwr_info.pwr_tx], in ufshcd_print_pwr_info()
134 hba->pwr_info.hs_rate); in ufshcd_print_pwr_info()
141 static inline bool ufshcd_ready_for_uic_cmd(struct ufs_hba *hba) in ufshcd_ready_for_uic_cmd() argument
143 if (ufshcd_readl(hba, REG_CONTROLLER_STATUS) & UIC_COMMAND_READY) in ufshcd_ready_for_uic_cmd()
152 static inline int ufshcd_get_uic_cmd_result(struct ufs_hba *hba) in ufshcd_get_uic_cmd_result() argument
154 return ufshcd_readl(hba, REG_UIC_COMMAND_ARG_2) & in ufshcd_get_uic_cmd_result()
161 static inline u32 ufshcd_get_dme_attr_val(struct ufs_hba *hba) in ufshcd_get_dme_attr_val() argument
163 return ufshcd_readl(hba, REG_UIC_COMMAND_ARG_3); in ufshcd_get_dme_attr_val()
170 static inline bool ufshcd_is_device_present(struct ufs_hba *hba) in ufshcd_is_device_present() argument
172 return (ufshcd_readl(hba, REG_CONTROLLER_STATUS) & in ufshcd_is_device_present()
180 static int ufshcd_send_uic_cmd(struct ufs_hba *hba, struct uic_command *uic_cmd) in ufshcd_send_uic_cmd() argument
187 if (!ufshcd_ready_for_uic_cmd(hba)) { in ufshcd_send_uic_cmd()
188 dev_err(hba->dev, in ufshcd_send_uic_cmd()
199 ufshcd_writel(hba, uic_cmd->argument1, REG_UIC_COMMAND_ARG_1); in ufshcd_send_uic_cmd()
200 ufshcd_writel(hba, uic_cmd->argument2, REG_UIC_COMMAND_ARG_2); in ufshcd_send_uic_cmd()
201 ufshcd_writel(hba, uic_cmd->argument3, REG_UIC_COMMAND_ARG_3); in ufshcd_send_uic_cmd()
204 ufshcd_writel(hba, uic_cmd->command & COMMAND_OPCODE_MASK, in ufshcd_send_uic_cmd()
209 intr_status = ufshcd_readl(hba, REG_INTERRUPT_STATUS); in ufshcd_send_uic_cmd()
210 enabled_intr_status = intr_status & hba->intr_mask; in ufshcd_send_uic_cmd()
211 ufshcd_writel(hba, intr_status, REG_INTERRUPT_STATUS); in ufshcd_send_uic_cmd()
214 dev_err(hba->dev, in ufshcd_send_uic_cmd()
221 dev_err(hba->dev, "Error in status:%08x\n", in ufshcd_send_uic_cmd()
228 uic_cmd->argument2 = ufshcd_get_uic_cmd_result(hba); in ufshcd_send_uic_cmd()
229 uic_cmd->argument3 = ufshcd_get_dme_attr_val(hba); in ufshcd_send_uic_cmd()
240 int ufshcd_dme_set_attr(struct ufs_hba *hba, u32 attr_sel, u8 attr_set, in ufshcd_dme_set_attr() argument
260 ret = ufshcd_send_uic_cmd(hba, &uic_cmd); in ufshcd_dme_set_attr()
262 dev_dbg(hba->dev, "%s: attr-id 0x%x val 0x%x error code %d\n", in ufshcd_dme_set_attr()
267 dev_err(hba->dev, "%s: attr-id 0x%x val 0x%x failed %d retries\n", in ufshcd_dme_set_attr()
278 int ufshcd_dme_get_attr(struct ufs_hba *hba, u32 attr_sel, in ufshcd_dme_get_attr() argument
296 ret = ufshcd_send_uic_cmd(hba, &uic_cmd); in ufshcd_dme_get_attr()
298 dev_dbg(hba->dev, "%s: attr-id 0x%x error code %d\n", in ufshcd_dme_get_attr()
303 dev_err(hba->dev, "%s: attr-id 0x%x failed %d retries\n", in ufshcd_dme_get_attr()
313 static int ufshcd_disable_tx_lcc(struct ufs_hba *hba, bool peer) in ufshcd_disable_tx_lcc() argument
318 ufshcd_dme_get(hba, UIC_ARG_MIB(PA_CONNECTEDTXDATALANES), in ufshcd_disable_tx_lcc()
321 ufshcd_dme_peer_get(hba, UIC_ARG_MIB(PA_CONNECTEDTXDATALANES), in ufshcd_disable_tx_lcc()
325 err = ufshcd_dme_set(hba, in ufshcd_disable_tx_lcc()
330 err = ufshcd_dme_peer_set(hba, in ufshcd_disable_tx_lcc()
335 dev_err(hba->dev, "%s: TX LCC Disable failed, peer = %d, lane = %d, err = %d\n", in ufshcd_disable_tx_lcc()
344 static inline int ufshcd_disable_device_tx_lcc(struct ufs_hba *hba) in ufshcd_disable_device_tx_lcc() argument
346 return ufshcd_disable_tx_lcc(hba, true); in ufshcd_disable_device_tx_lcc()
353 static int ufshcd_dme_link_startup(struct ufs_hba *hba) in ufshcd_dme_link_startup() argument
360 ret = ufshcd_send_uic_cmd(hba, &uic_cmd); in ufshcd_dme_link_startup()
362 dev_dbg(hba->dev, in ufshcd_dme_link_startup()
367 int ufshcd_dme_enable(struct ufs_hba *hba) in ufshcd_dme_enable() argument
374 ret = ufshcd_send_uic_cmd(hba, &uic_cmd); in ufshcd_dme_enable()
376 dev_err(hba->dev, in ufshcd_dme_enable()
381 int ufshcd_dme_reset(struct ufs_hba *hba) in ufshcd_dme_reset() argument
388 ret = ufshcd_send_uic_cmd(hba, &uic_cmd); in ufshcd_dme_reset()
390 dev_err(hba->dev, in ufshcd_dme_reset()
399 static inline void ufshcd_disable_intr_aggr(struct ufs_hba *hba) in ufshcd_disable_intr_aggr() argument
401 ufshcd_writel(hba, 0, REG_UTP_TRANSFER_REQ_INT_AGG_CONTROL); in ufshcd_disable_intr_aggr()
417 static void ufshcd_enable_run_stop_reg(struct ufs_hba *hba) in ufshcd_enable_run_stop_reg() argument
419 ufshcd_writel(hba, UTP_TASK_REQ_LIST_RUN_STOP_BIT, in ufshcd_enable_run_stop_reg()
421 ufshcd_writel(hba, UTP_TRANSFER_REQ_LIST_RUN_STOP_BIT, in ufshcd_enable_run_stop_reg()
428 static void ufshcd_enable_intr(struct ufs_hba *hba, u32 intrs) in ufshcd_enable_intr() argument
430 u32 set = ufshcd_readl(hba, REG_INTERRUPT_ENABLE); in ufshcd_enable_intr()
433 if (hba->version == UFSHCI_VERSION_10) { in ufshcd_enable_intr()
440 ufshcd_writel(hba, set, REG_INTERRUPT_ENABLE); in ufshcd_enable_intr()
442 hba->intr_mask = set; in ufshcd_enable_intr()
455 static int ufshcd_make_hba_operational(struct ufs_hba *hba) in ufshcd_make_hba_operational() argument
461 ufshcd_enable_intr(hba, UFSHCD_ENABLE_INTRS); in ufshcd_make_hba_operational()
464 ufshcd_disable_intr_aggr(hba); in ufshcd_make_hba_operational()
467 ufshcd_writel(hba, lower_32_bits((dma_addr_t)hba->utrdl), in ufshcd_make_hba_operational()
469 ufshcd_writel(hba, upper_32_bits((dma_addr_t)hba->utrdl), in ufshcd_make_hba_operational()
471 ufshcd_writel(hba, lower_32_bits((dma_addr_t)hba->utmrdl), in ufshcd_make_hba_operational()
473 ufshcd_writel(hba, upper_32_bits((dma_addr_t)hba->utmrdl), in ufshcd_make_hba_operational()
479 reg = ufshcd_readl(hba, REG_CONTROLLER_STATUS); in ufshcd_make_hba_operational()
481 ufshcd_enable_run_stop_reg(hba); in ufshcd_make_hba_operational()
483 dev_err(hba->dev, in ufshcd_make_hba_operational()
496 static int ufshcd_link_startup(struct ufs_hba *hba) in ufshcd_link_startup() argument
502 if (ufshcd_is_device_present(hba)) in ufshcd_link_startup()
507 ufshcd_ops_link_startup_notify(hba, PRE_CHANGE); in ufshcd_link_startup()
509 ret = ufshcd_dme_link_startup(hba); in ufshcd_link_startup()
512 if (!ret && !ufshcd_is_device_present(hba)) { in ufshcd_link_startup()
513 dev_err(hba->dev, "%s: Device not present\n", __func__); in ufshcd_link_startup()
523 if (ret && ufshcd_hba_enable(hba)) in ufshcd_link_startup()
539 ufshcd_init_pwr_info(hba); in ufshcd_link_startup()
541 if (hba->quirks & UFSHCD_QUIRK_BROKEN_LCC) { in ufshcd_link_startup()
542 ret = ufshcd_disable_device_tx_lcc(hba); in ufshcd_link_startup()
548 ret = ufshcd_ops_link_startup_notify(hba, POST_CHANGE); in ufshcd_link_startup()
552 ret = ufshcd_make_hba_operational(hba); in ufshcd_link_startup()
555 dev_err(hba->dev, "link startup failed %d\n", ret); in ufshcd_link_startup()
563 static inline void ufshcd_hba_stop(struct ufs_hba *hba) in ufshcd_hba_stop() argument
567 ufshcd_writel(hba, CONTROLLER_DISABLE, REG_CONTROLLER_ENABLE); in ufshcd_hba_stop()
568 err = ufshcd_wait_for_register(hba, REG_CONTROLLER_ENABLE, in ufshcd_hba_stop()
572 dev_err(hba->dev, "%s: Controller disable failed\n", __func__); in ufshcd_hba_stop()
578 static inline bool ufshcd_is_hba_active(struct ufs_hba *hba) in ufshcd_is_hba_active() argument
580 return (ufshcd_readl(hba, REG_CONTROLLER_ENABLE) & CONTROLLER_ENABLE) in ufshcd_is_hba_active()
587 static inline void ufshcd_hba_start(struct ufs_hba *hba) in ufshcd_hba_start() argument
589 ufshcd_writel(hba, CONTROLLER_ENABLE, REG_CONTROLLER_ENABLE); in ufshcd_hba_start()
595 static int ufshcd_hba_enable(struct ufs_hba *hba) in ufshcd_hba_enable() argument
599 if (!ufshcd_is_hba_active(hba)) in ufshcd_hba_enable()
601 ufshcd_hba_stop(hba); in ufshcd_hba_enable()
603 ufshcd_ops_hce_enable_notify(hba, PRE_CHANGE); in ufshcd_hba_enable()
606 ufshcd_hba_start(hba); in ufshcd_hba_enable()
622 while (ufshcd_is_hba_active(hba)) { in ufshcd_hba_enable()
626 dev_err(hba->dev, "Controller enable failed\n"); in ufshcd_hba_enable()
633 ufshcd_enable_intr(hba, UFSHCD_UIC_MASK); in ufshcd_hba_enable()
635 if (ufshcd_ops_hce_enable_notify(hba, POST_CHANGE)) in ufshcd_hba_enable()
645 static void ufshcd_host_memory_configure(struct ufs_hba *hba) in ufshcd_host_memory_configure() argument
652 utrdlp = hba->utrdl; in ufshcd_host_memory_configure()
653 cmd_desc_dma_addr = (dma_addr_t)hba->ucdl; in ufshcd_host_memory_configure()
667 hba->ucd_req_ptr = (struct utp_upiu_req *)hba->ucdl; in ufshcd_host_memory_configure()
668 hba->ucd_rsp_ptr = in ufshcd_host_memory_configure()
669 (struct utp_upiu_rsp *)&hba->ucdl->response_upiu; in ufshcd_host_memory_configure()
670 hba->ucd_prdt_ptr = in ufshcd_host_memory_configure()
671 (struct ufshcd_sg_entry *)&hba->ucdl->prd_table; in ufshcd_host_memory_configure()
677 static int ufshcd_memory_alloc(struct ufs_hba *hba) in ufshcd_memory_alloc() argument
682 hba->utrdl = memalign(1024, sizeof(struct utp_transfer_req_desc)); in ufshcd_memory_alloc()
683 if (!hba->utrdl) { in ufshcd_memory_alloc()
684 dev_err(hba->dev, "Transfer Descriptor memory allocation failed\n"); in ufshcd_memory_alloc()
691 hba->ucdl = memalign(1024, sizeof(struct utp_transfer_cmd_desc)); in ufshcd_memory_alloc()
692 if (!hba->ucdl) { in ufshcd_memory_alloc()
693 dev_err(hba->dev, "Command descriptor memory allocation failed\n"); in ufshcd_memory_alloc()
697 hba->dev_desc = memalign(ARCH_DMA_MINALIGN, sizeof(struct ufs_device_descriptor)); in ufshcd_memory_alloc()
698 if (!hba->dev_desc) { in ufshcd_memory_alloc()
699 dev_err(hba->dev, "memory allocation failed\n"); in ufshcd_memory_alloc()
704 hba->rc_desc = memalign(ARCH_DMA_MINALIGN, sizeof(struct ufs_configuration_descriptor)); in ufshcd_memory_alloc()
705 hba->wc_desc = memalign(ARCH_DMA_MINALIGN, sizeof(struct ufs_configuration_descriptor)); in ufshcd_memory_alloc()
706 hba->geo_desc = memalign(ARCH_DMA_MINALIGN, sizeof(struct ufs_geometry_descriptor)); in ufshcd_memory_alloc()
707 if (!hba->rc_desc || !hba->wc_desc || !hba->geo_desc) { in ufshcd_memory_alloc()
708 dev_err(hba->dev, "memory allocation failed\n"); in ufshcd_memory_alloc()
718 static inline u32 ufshcd_get_intr_mask(struct ufs_hba *hba) in ufshcd_get_intr_mask() argument
722 switch (hba->version) { in ufshcd_get_intr_mask()
742 static inline u32 ufshcd_get_ufs_version(struct ufs_hba *hba) in ufshcd_get_ufs_version() argument
744 return ufshcd_readl(hba, REG_UFS_VERSION); in ufshcd_get_ufs_version()
750 static inline u8 ufshcd_get_upmcrs(struct ufs_hba *hba) in ufshcd_get_upmcrs() argument
752 return (ufshcd_readl(hba, REG_CONTROLLER_STATUS) >> 8) & 0x7; in ufshcd_get_upmcrs()
816 static void ufshcd_prepare_utp_query_req_upiu(struct ufs_hba *hba, in ufshcd_prepare_utp_query_req_upiu() argument
819 struct utp_upiu_req *ucd_req_ptr = hba->ucd_req_ptr; in ufshcd_prepare_utp_query_req_upiu()
820 struct ufs_query *query = &hba->dev_cmd.query; in ufshcd_prepare_utp_query_req_upiu()
850 memset(hba->ucd_rsp_ptr, 0, sizeof(struct utp_upiu_rsp)); in ufshcd_prepare_utp_query_req_upiu()
851 ufshcd_cache_flush_and_invalidate(hba->ucd_rsp_ptr, sizeof(*hba->ucd_rsp_ptr)); in ufshcd_prepare_utp_query_req_upiu()
854 static inline void ufshcd_prepare_utp_nop_upiu(struct ufs_hba *hba) in ufshcd_prepare_utp_nop_upiu() argument
856 struct utp_upiu_req *ucd_req_ptr = hba->ucd_req_ptr; in ufshcd_prepare_utp_nop_upiu()
867 memset(hba->ucd_rsp_ptr, 0, sizeof(struct utp_upiu_rsp)); in ufshcd_prepare_utp_nop_upiu()
870 ufshcd_cache_flush_and_invalidate(hba->ucd_rsp_ptr, sizeof(*hba->ucd_rsp_ptr)); in ufshcd_prepare_utp_nop_upiu()
877 static int ufshcd_comp_devman_upiu(struct ufs_hba *hba, in ufshcd_comp_devman_upiu() argument
882 struct utp_transfer_req_desc *req_desc = hba->utrdl; in ufshcd_comp_devman_upiu()
884 hba->dev_cmd.type = cmd_type; in ufshcd_comp_devman_upiu()
889 ufshcd_prepare_utp_query_req_upiu(hba, upiu_flags); in ufshcd_comp_devman_upiu()
892 ufshcd_prepare_utp_nop_upiu(hba); in ufshcd_comp_devman_upiu()
901 static int ufshcd_send_command(struct ufs_hba *hba, unsigned int task_tag) in ufshcd_send_command() argument
907 ufshcd_writel(hba, 1 << task_tag, REG_UTP_TRANSFER_REQ_DOOR_BELL); in ufshcd_send_command()
911 intr_status = ufshcd_readl(hba, REG_INTERRUPT_STATUS); in ufshcd_send_command()
912 enabled_intr_status = intr_status & hba->intr_mask; in ufshcd_send_command()
913 ufshcd_writel(hba, intr_status, REG_INTERRUPT_STATUS); in ufshcd_send_command()
916 dev_err(hba->dev, in ufshcd_send_command()
923 dev_err(hba->dev, "Error in status:%08x\n", in ufshcd_send_command()
945 static inline int ufshcd_get_tr_ocs(struct ufs_hba *hba) in ufshcd_get_tr_ocs() argument
947 return le32_to_cpu(hba->utrdl->header.dword_2) & MASK_OCS; in ufshcd_get_tr_ocs()
955 static int ufshcd_check_query_response(struct ufs_hba *hba) in ufshcd_check_query_response() argument
957 struct ufs_query_res *query_res = &hba->dev_cmd.query.response; in ufshcd_check_query_response()
960 query_res->response = ufshcd_get_rsp_upiu_result(hba->ucd_rsp_ptr) >> in ufshcd_check_query_response()
969 static int ufshcd_copy_query_response(struct ufs_hba *hba) in ufshcd_copy_query_response() argument
971 struct ufs_query_res *query_res = &hba->dev_cmd.query.response; in ufshcd_copy_query_response()
973 memcpy(&query_res->upiu_res, &hba->ucd_rsp_ptr->qr, QUERY_OSF_SIZE); in ufshcd_copy_query_response()
976 if (hba->dev_cmd.query.descriptor && in ufshcd_copy_query_response()
977 hba->ucd_rsp_ptr->qr.opcode == UPIU_QUERY_OPCODE_READ_DESC) { in ufshcd_copy_query_response()
978 u8 *descp = (u8 *)hba->ucd_rsp_ptr + in ufshcd_copy_query_response()
984 resp_len = be32_to_cpu(hba->ucd_rsp_ptr->header.dword_2) & in ufshcd_copy_query_response()
987 be16_to_cpu(hba->dev_cmd.query.request.upiu_req.length); in ufshcd_copy_query_response()
991 invalidate_dcache_range((uintptr_t)hba->ucd_rsp_ptr, (uintptr_t)hba->ucd_rsp_ptr + size); in ufshcd_copy_query_response()
992 memcpy(hba->dev_cmd.query.descriptor, descp, resp_len); in ufshcd_copy_query_response()
994 dev_warn(hba->dev, in ufshcd_copy_query_response()
1007 int ufshcd_exec_dev_cmd(struct ufs_hba *hba, enum dev_cmd_type cmd_type, int timeout) in ufshcd_exec_dev_cmd() argument
1012 err = ufshcd_comp_devman_upiu(hba, cmd_type); in ufshcd_exec_dev_cmd()
1016 err = ufshcd_send_command(hba, TASK_TAG); in ufshcd_exec_dev_cmd()
1020 err = ufshcd_get_tr_ocs(hba); in ufshcd_exec_dev_cmd()
1022 dev_err(hba->dev, "Error in OCS:%d\n", err); in ufshcd_exec_dev_cmd()
1026 resp = ufshcd_get_req_rsp(hba->ucd_rsp_ptr); in ufshcd_exec_dev_cmd()
1031 err = ufshcd_check_query_response(hba); in ufshcd_exec_dev_cmd()
1033 err = ufshcd_copy_query_response(hba); in ufshcd_exec_dev_cmd()
1038 dev_err(hba->dev, "%s: Reject UPIU not fully implemented\n", in ufshcd_exec_dev_cmd()
1043 dev_err(hba->dev, "%s: Invalid device management cmd response: %x\n", in ufshcd_exec_dev_cmd()
1053 static inline void ufshcd_init_query(struct ufs_hba *hba, in ufshcd_init_query() argument
1059 *request = &hba->dev_cmd.query.request; in ufshcd_init_query()
1060 *response = &hba->dev_cmd.query.response; in ufshcd_init_query()
1072 int ufshcd_query_flag(struct ufs_hba *hba, enum query_opcode opcode, in ufshcd_query_flag() argument
1080 ufshcd_init_query(hba, &request, &response, opcode, idn, index, in ufshcd_query_flag()
1093 dev_err(hba->dev, "%s: Invalid argument for read request\n", in ufshcd_query_flag()
1100 dev_err(hba->dev, in ufshcd_query_flag()
1107 err = ufshcd_exec_dev_cmd(hba, DEV_CMD_TYPE_QUERY, timeout); in ufshcd_query_flag()
1110 dev_err(hba->dev, in ufshcd_query_flag()
1124 static int ufshcd_query_flag_retry(struct ufs_hba *hba, in ufshcd_query_flag_retry() argument
1132 ret = ufshcd_query_flag(hba, opcode, idn, flag_res); in ufshcd_query_flag_retry()
1134 dev_dbg(hba->dev, in ufshcd_query_flag_retry()
1142 dev_err(hba->dev, in ufshcd_query_flag_retry()
1148 static int __ufshcd_query_descriptor(struct ufs_hba *hba, in __ufshcd_query_descriptor() argument
1158 dev_err(hba->dev, "%s: descriptor buffer required for opcode 0x%x\n", in __ufshcd_query_descriptor()
1165 dev_err(hba->dev, "%s: descriptor buffer size (%d) is out of range\n", in __ufshcd_query_descriptor()
1171 ufshcd_init_query(hba, &request, &response, opcode, idn, index, selector); in __ufshcd_query_descriptor()
1172 hba->dev_cmd.query.descriptor = desc_buf; in __ufshcd_query_descriptor()
1183 dev_err(hba->dev, "%s: Expected query descriptor opcode but got = 0x%.2x\n", in __ufshcd_query_descriptor()
1189 err = ufshcd_exec_dev_cmd(hba, DEV_CMD_TYPE_QUERY, QUERY_REQ_TIMEOUT); in __ufshcd_query_descriptor()
1192 dev_err(hba->dev, "%s: opcode 0x%.2x for idn %d failed, index %d, err = %d\n", in __ufshcd_query_descriptor()
1197 hba->dev_cmd.query.descriptor = NULL; in __ufshcd_query_descriptor()
1207 int ufshcd_query_descriptor_retry(struct ufs_hba *hba, enum query_opcode opcode, in ufshcd_query_descriptor_retry() argument
1215 err = __ufshcd_query_descriptor(hba, opcode, idn, index, in ufshcd_query_descriptor_retry()
1227 int ufshcd_read_desc_length(struct ufs_hba *hba, enum desc_idn desc_id, in ufshcd_read_desc_length() argument
1237 ret = ufshcd_query_descriptor_retry(hba, UPIU_QUERY_OPCODE_READ_DESC, in ufshcd_read_desc_length()
1242 dev_err(hba->dev, "%s: Failed to get descriptor header id %d\n", in ufshcd_read_desc_length()
1246 dev_warn(hba->dev, "%s: descriptor header id %d and desc_id %d mismatch\n", in ufshcd_read_desc_length()
1257 static void ufshcd_init_desc_sizes(struct ufs_hba *hba) in ufshcd_init_desc_sizes() argument
1261 err = ufshcd_read_desc_length(hba, QUERY_DESC_IDN_DEVICE, 0, in ufshcd_init_desc_sizes()
1262 &hba->desc_size.dev_desc); in ufshcd_init_desc_sizes()
1264 hba->desc_size.dev_desc = QUERY_DESC_DEVICE_DEF_SIZE; in ufshcd_init_desc_sizes()
1266 err = ufshcd_read_desc_length(hba, QUERY_DESC_IDN_POWER, 0, in ufshcd_init_desc_sizes()
1267 &hba->desc_size.pwr_desc); in ufshcd_init_desc_sizes()
1269 hba->desc_size.pwr_desc = QUERY_DESC_POWER_DEF_SIZE; in ufshcd_init_desc_sizes()
1271 err = ufshcd_read_desc_length(hba, QUERY_DESC_IDN_INTERCONNECT, 0, in ufshcd_init_desc_sizes()
1272 &hba->desc_size.interc_desc); in ufshcd_init_desc_sizes()
1274 hba->desc_size.interc_desc = QUERY_DESC_INTERCONNECT_DEF_SIZE; in ufshcd_init_desc_sizes()
1276 err = ufshcd_read_desc_length(hba, QUERY_DESC_IDN_CONFIGURATION, 0, in ufshcd_init_desc_sizes()
1277 &hba->desc_size.conf_desc); in ufshcd_init_desc_sizes()
1279 hba->desc_size.conf_desc = QUERY_DESC_CONFIGURATION_DEF_SIZE; in ufshcd_init_desc_sizes()
1281 err = ufshcd_read_desc_length(hba, QUERY_DESC_IDN_UNIT, 0, in ufshcd_init_desc_sizes()
1282 &hba->desc_size.unit_desc); in ufshcd_init_desc_sizes()
1284 hba->desc_size.unit_desc = QUERY_DESC_UNIT_DEF_SIZE; in ufshcd_init_desc_sizes()
1286 err = ufshcd_read_desc_length(hba, QUERY_DESC_IDN_GEOMETRY, 0, in ufshcd_init_desc_sizes()
1287 &hba->desc_size.geom_desc); in ufshcd_init_desc_sizes()
1289 hba->desc_size.geom_desc = QUERY_DESC_GEOMETRY_DEF_SIZE; in ufshcd_init_desc_sizes()
1291 err = ufshcd_read_desc_length(hba, QUERY_DESC_IDN_HEALTH, 0, in ufshcd_init_desc_sizes()
1292 &hba->desc_size.hlth_desc); in ufshcd_init_desc_sizes()
1294 hba->desc_size.hlth_desc = QUERY_DESC_HEALTH_DEF_SIZE; in ufshcd_init_desc_sizes()
1301 int ufshcd_map_desc_id_to_length(struct ufs_hba *hba, enum desc_idn desc_id, in ufshcd_map_desc_id_to_length() argument
1306 *desc_len = hba->desc_size.dev_desc; in ufshcd_map_desc_id_to_length()
1309 *desc_len = hba->desc_size.pwr_desc; in ufshcd_map_desc_id_to_length()
1312 *desc_len = hba->desc_size.geom_desc; in ufshcd_map_desc_id_to_length()
1315 *desc_len = hba->desc_size.conf_desc; in ufshcd_map_desc_id_to_length()
1318 *desc_len = hba->desc_size.unit_desc; in ufshcd_map_desc_id_to_length()
1321 *desc_len = hba->desc_size.interc_desc; in ufshcd_map_desc_id_to_length()
1327 *desc_len = hba->desc_size.hlth_desc; in ufshcd_map_desc_id_to_length()
1345 int ufshcd_read_desc_param(struct ufs_hba *hba, enum desc_idn desc_id, in ufshcd_read_desc_param() argument
1361 ret = ufshcd_map_desc_id_to_length(hba, desc_id, &buff_len); in ufshcd_read_desc_param()
1365 dev_err(hba->dev, "%s: Failed to get full descriptor length\n", in ufshcd_read_desc_param()
1381 ret = ufshcd_query_descriptor_retry(hba, UPIU_QUERY_OPCODE_READ_DESC, in ufshcd_read_desc_param()
1386 …dev_err(hba->dev, "%s: Failed reading descriptor. desc_id %d, desc_index %d, param_offset %d, ret … in ufshcd_read_desc_param()
1393 dev_err(hba->dev, "%s: invalid desc_id %d in descriptor header\n", in ufshcd_read_desc_param()
1426 static int ufshcd_uic_pwr_ctrl(struct ufs_hba *hba, struct uic_command *cmd) in ufshcd_uic_pwr_ctrl() argument
1432 ret = ufshcd_send_uic_cmd(hba, cmd); in ufshcd_uic_pwr_ctrl()
1434 dev_err(hba->dev, in ufshcd_uic_pwr_ctrl()
1443 status = ufshcd_get_upmcrs(hba); in ufshcd_uic_pwr_ctrl()
1445 dev_err(hba->dev, in ufshcd_uic_pwr_ctrl()
1460 static int ufshcd_uic_change_pwr_mode(struct ufs_hba *hba, u8 mode) in ufshcd_uic_change_pwr_mode() argument
1468 ret = ufshcd_uic_pwr_ctrl(hba, &uic_cmd); in ufshcd_uic_change_pwr_mode()
1474 void ufshcd_prepare_utp_scsi_cmd_upiu(struct ufs_hba *hba, in ufshcd_prepare_utp_scsi_cmd_upiu() argument
1477 struct utp_upiu_req *ucd_req_ptr = hba->ucd_req_ptr; in ufshcd_prepare_utp_scsi_cmd_upiu()
1496 memset(hba->ucd_rsp_ptr, 0, sizeof(struct utp_upiu_rsp)); in ufshcd_prepare_utp_scsi_cmd_upiu()
1498 ufshcd_cache_flush_and_invalidate(hba->ucd_rsp_ptr, sizeof(*hba->ucd_rsp_ptr)); in ufshcd_prepare_utp_scsi_cmd_upiu()
1509 static void prepare_prdt_table(struct ufs_hba *hba, struct scsi_cmd *pccb) in prepare_prdt_table() argument
1511 struct utp_transfer_req_desc *req_desc = hba->utrdl; in prepare_prdt_table()
1512 struct ufshcd_sg_entry *prd_table = hba->ucd_prdt_ptr; in prepare_prdt_table()
1549 int ufs_send_scsi_cmd(struct ufs_hba *hba, struct scsi_cmd *pccb) in ufs_send_scsi_cmd() argument
1551 struct utp_transfer_req_desc *req_desc = hba->utrdl; in ufs_send_scsi_cmd()
1556 if (hba->quirks & UFSDEV_QUIRK_LUN_IN_SCSI_COMMANDS) in ufs_send_scsi_cmd()
1561 ufshcd_prepare_utp_scsi_cmd_upiu(hba, pccb, upiu_flags); in ufs_send_scsi_cmd()
1562 prepare_prdt_table(hba, pccb); in ufs_send_scsi_cmd()
1564 if (ufshcd_send_command(hba, TASK_TAG) == -ETIMEDOUT && retry_count) { in ufs_send_scsi_cmd()
1569 ocs = ufshcd_get_tr_ocs(hba); in ufs_send_scsi_cmd()
1572 result = ufshcd_get_req_rsp(hba->ucd_rsp_ptr); in ufs_send_scsi_cmd()
1575 result = ufshcd_get_rsp_upiu_result(hba->ucd_rsp_ptr); in ufs_send_scsi_cmd()
1592 dev_err(hba->dev, in ufs_send_scsi_cmd()
1596 dev_err(hba->dev, in ufs_send_scsi_cmd()
1603 dev_err(hba->dev, "OCS error from controller = %x\n", ocs); in ufs_send_scsi_cmd()
1612 struct ufs_hba *hba = dev_get_uclass_priv(scsi_dev->parent); in ufs_scsi_exec() local
1614 return ufs_send_scsi_cmd(hba, pccb); in ufs_scsi_exec()
1617 static inline int ufshcd_read_desc(struct ufs_hba *hba, enum desc_idn desc_id, in ufshcd_read_desc() argument
1620 return ufshcd_read_desc_param(hba, desc_id, desc_index, 0, buf, size); in ufshcd_read_desc()
1623 static int ufshcd_read_device_desc(struct ufs_hba *hba, u8 *buf, u32 size) in ufshcd_read_device_desc() argument
1625 return ufshcd_read_desc(hba, QUERY_DESC_IDN_DEVICE, 0, buf, size); in ufshcd_read_device_desc()
1632 int ufshcd_read_string_desc(struct ufs_hba *hba, int desc_index, in ufshcd_read_string_desc() argument
1637 err = ufshcd_read_desc(hba, QUERY_DESC_IDN_STRING, desc_index, buf, in ufshcd_read_string_desc()
1641 dev_err(hba->dev, "%s: reading String Desc failed after %d retries. err = %d\n", in ufshcd_read_string_desc()
1656 dev_err(hba->dev, "%s: buffer allocated size is too small\n", in ufshcd_read_string_desc()
1689 static int ufs_get_device_desc(struct ufs_hba *hba, struct ufs_device_descriptor *dev_desc) in ufs_get_device_desc() argument
1695 if (buff_len > hba->desc_size.dev_desc) in ufs_get_device_desc()
1696 buff_len = hba->desc_size.dev_desc; in ufs_get_device_desc()
1698 err = ufshcd_read_device_desc(hba, (u8 *)dev_desc, buff_len); in ufs_get_device_desc()
1700 dev_err(hba->dev, "%s: Failed reading Device Desc. err = %d\n", in ufs_get_device_desc()
1709 static int ufshcd_get_max_pwr_mode(struct ufs_hba *hba) in ufshcd_get_max_pwr_mode() argument
1711 struct ufs_pa_layer_attr *pwr_info = &hba->max_pwr_info.info; in ufshcd_get_max_pwr_mode()
1713 if (hba->max_pwr_info.is_valid) in ufshcd_get_max_pwr_mode()
1721 ufshcd_dme_get(hba, UIC_ARG_MIB(PA_CONNECTEDRXDATALANES), in ufshcd_get_max_pwr_mode()
1723 ufshcd_dme_get(hba, UIC_ARG_MIB(PA_CONNECTEDTXDATALANES), in ufshcd_get_max_pwr_mode()
1727 dev_err(hba->dev, "%s: invalid connected lanes value. rx=%d, tx=%d\n", in ufshcd_get_max_pwr_mode()
1737 ufshcd_dme_get(hba, UIC_ARG_MIB(PA_MAXRXHSGEAR), &pwr_info->gear_rx); in ufshcd_get_max_pwr_mode()
1739 ufshcd_dme_get(hba, UIC_ARG_MIB(PA_MAXRXPWMGEAR), in ufshcd_get_max_pwr_mode()
1742 dev_err(hba->dev, "%s: invalid max pwm rx gear read = %d\n", in ufshcd_get_max_pwr_mode()
1749 ufshcd_dme_peer_get(hba, UIC_ARG_MIB(PA_MAXRXHSGEAR), in ufshcd_get_max_pwr_mode()
1752 ufshcd_dme_peer_get(hba, UIC_ARG_MIB(PA_MAXRXPWMGEAR), in ufshcd_get_max_pwr_mode()
1755 dev_err(hba->dev, "%s: invalid max pwm tx gear read = %d\n", in ufshcd_get_max_pwr_mode()
1762 hba->max_pwr_info.is_valid = true; in ufshcd_get_max_pwr_mode()
1766 static int ufshcd_change_power_mode(struct ufs_hba *hba, in ufshcd_change_power_mode() argument
1772 if (pwr_mode->gear_rx == hba->pwr_info.gear_rx && in ufshcd_change_power_mode()
1773 pwr_mode->gear_tx == hba->pwr_info.gear_tx && in ufshcd_change_power_mode()
1774 pwr_mode->lane_rx == hba->pwr_info.lane_rx && in ufshcd_change_power_mode()
1775 pwr_mode->lane_tx == hba->pwr_info.lane_tx && in ufshcd_change_power_mode()
1776 pwr_mode->pwr_rx == hba->pwr_info.pwr_rx && in ufshcd_change_power_mode()
1777 pwr_mode->pwr_tx == hba->pwr_info.pwr_tx && in ufshcd_change_power_mode()
1778 pwr_mode->hs_rate == hba->pwr_info.hs_rate) { in ufshcd_change_power_mode()
1779 dev_dbg(hba->dev, "%s: power already configured\n", __func__); in ufshcd_change_power_mode()
1789 ufshcd_dme_set(hba, UIC_ARG_MIB(PA_RXGEAR), pwr_mode->gear_rx); in ufshcd_change_power_mode()
1790 ufshcd_dme_set(hba, UIC_ARG_MIB(PA_ACTIVERXDATALANES), in ufshcd_change_power_mode()
1793 ufshcd_dme_set(hba, UIC_ARG_MIB(PA_RXTERMINATION), TRUE); in ufshcd_change_power_mode()
1795 ufshcd_dme_set(hba, UIC_ARG_MIB(PA_RXTERMINATION), FALSE); in ufshcd_change_power_mode()
1797 ufshcd_dme_set(hba, UIC_ARG_MIB(PA_TXGEAR), pwr_mode->gear_tx); in ufshcd_change_power_mode()
1798 ufshcd_dme_set(hba, UIC_ARG_MIB(PA_ACTIVETXDATALANES), in ufshcd_change_power_mode()
1801 ufshcd_dme_set(hba, UIC_ARG_MIB(PA_TXTERMINATION), TRUE); in ufshcd_change_power_mode()
1803 ufshcd_dme_set(hba, UIC_ARG_MIB(PA_TXTERMINATION), FALSE); in ufshcd_change_power_mode()
1809 ufshcd_dme_set(hba, UIC_ARG_MIB(PA_HSSERIES), in ufshcd_change_power_mode()
1812 ret = ufshcd_uic_change_pwr_mode(hba, pwr_mode->pwr_rx << 4 | in ufshcd_change_power_mode()
1816 dev_err(hba->dev, in ufshcd_change_power_mode()
1823 memcpy(&hba->pwr_info, pwr_mode, sizeof(struct ufs_pa_layer_attr)); in ufshcd_change_power_mode()
1832 static int ufshcd_verify_dev_init(struct ufs_hba *hba) in ufshcd_verify_dev_init() argument
1838 err = ufshcd_exec_dev_cmd(hba, DEV_CMD_TYPE_NOP, in ufshcd_verify_dev_init()
1843 dev_dbg(hba->dev, "%s: error %d retrying\n", __func__, err); in ufshcd_verify_dev_init()
1847 dev_err(hba->dev, "%s: NOP OUT failed %d\n", __func__, err); in ufshcd_verify_dev_init()
1855 static int ufshcd_complete_dev_init(struct ufs_hba *hba) in ufshcd_complete_dev_init() argument
1862 err = ufshcd_query_flag_retry(hba, UPIU_QUERY_OPCODE_SET_FLAG, in ufshcd_complete_dev_init()
1865 dev_err(hba->dev, in ufshcd_complete_dev_init()
1874 err = ufshcd_query_flag_retry(hba, UPIU_QUERY_OPCODE_READ_FLAG, in ufshcd_complete_dev_init()
1883 dev_err(hba->dev, in ufshcd_complete_dev_init()
1887 dev_err(hba->dev, in ufshcd_complete_dev_init()
1895 static void ufshcd_def_desc_sizes(struct ufs_hba *hba) in ufshcd_def_desc_sizes() argument
1897 hba->desc_size.dev_desc = QUERY_DESC_DEVICE_DEF_SIZE; in ufshcd_def_desc_sizes()
1898 hba->desc_size.pwr_desc = QUERY_DESC_POWER_DEF_SIZE; in ufshcd_def_desc_sizes()
1899 hba->desc_size.interc_desc = QUERY_DESC_INTERCONNECT_DEF_SIZE; in ufshcd_def_desc_sizes()
1900 hba->desc_size.conf_desc = QUERY_DESC_CONFIGURATION_DEF_SIZE; in ufshcd_def_desc_sizes()
1901 hba->desc_size.unit_desc = QUERY_DESC_UNIT_DEF_SIZE; in ufshcd_def_desc_sizes()
1902 hba->desc_size.geom_desc = QUERY_DESC_GEOMETRY_DEF_SIZE; in ufshcd_def_desc_sizes()
1903 hba->desc_size.hlth_desc = QUERY_DESC_HEALTH_DEF_SIZE; in ufshcd_def_desc_sizes()
1906 int _ufs_start(struct ufs_hba *hba) in _ufs_start() argument
1911 ret = ufshcd_link_startup(hba); in _ufs_start()
1915 ret = ufshcd_verify_dev_init(hba); in _ufs_start()
1917 ufshcd_hba_enable(hba); in _ufs_start()
1923 ret = ufshcd_complete_dev_init(hba); in _ufs_start()
1928 ufshcd_init_desc_sizes(hba); in _ufs_start()
1930 ret = ufs_get_device_desc(hba, hba->dev_desc); in _ufs_start()
1932 dev_err(hba->dev, "%s: Failed getting device info. err = %d\n", in _ufs_start()
1938 if (hba->dev_desc->w_spec_version == 0x1002) in _ufs_start()
1939 hba->quirks |= UFSDEV_QUIRK_LUN_IN_SCSI_COMMANDS; in _ufs_start()
1941 if (hba->dev_desc->w_spec_version == 0x2002) in _ufs_start()
1942 if (hba->dev_desc->w_manufacturer_id == 0x250A || in _ufs_start()
1943 hba->dev_desc->w_manufacturer_id == 0x9802 || in _ufs_start()
1944 hba->dev_desc->w_manufacturer_id == 0xD60C || in _ufs_start()
1945 hba->dev_desc->w_manufacturer_id == 0x2C01) in _ufs_start()
1946 hba->quirks |= UFSDEV_QUIRK_LUN_IN_SCSI_COMMANDS; in _ufs_start()
1951 int ufs_start(struct ufs_hba *hba) in ufs_start() argument
1955 ret = _ufs_start(hba); in ufs_start()
1960 ret = ufs_create_partition_inventory(hba); in ufs_start()
1962 dev_err(hba->dev, "%s: Failed to creat partition. err = %d\n", __func__, ret); in ufs_start()
1966 if (ufshcd_get_max_pwr_mode(hba)) { in ufs_start()
1967 dev_err(hba->dev, in ufs_start()
1971 ret = ufshcd_change_power_mode(hba, &hba->max_pwr_info.info); in ufs_start()
1973 dev_err(hba->dev, "%s: Failed setting power mode, err = %d\n", in ufs_start()
1979 printf("Device at %s up at:", hba->dev->name); in ufs_start()
1980 ufshcd_print_pwr_info(hba); in ufs_start()
1984 ufs_rpmb_init(hba); in ufs_start()
1992 struct ufs_hba *hba = dev_get_uclass_priv(ufs_dev); in ufshcd_probe() local
2006 hba->dev = ufs_dev; in ufshcd_probe()
2007 hba->ops = hba_ops; in ufshcd_probe()
2008 hba->mmio_base = (void *)dev_read_addr(ufs_dev); in ufshcd_probe()
2011 ufshcd_def_desc_sizes(hba); in ufshcd_probe()
2013 ufshcd_ops_init(hba); in ufshcd_probe()
2016 hba->capabilities = ufshcd_readl(hba, REG_CONTROLLER_CAPABILITIES); in ufshcd_probe()
2019 hba->version = ufshcd_get_ufs_version(hba); in ufshcd_probe()
2020 if (hba->version != UFSHCI_VERSION_10 && in ufshcd_probe()
2021 hba->version != UFSHCI_VERSION_11 && in ufshcd_probe()
2022 hba->version != UFSHCI_VERSION_20 && in ufshcd_probe()
2023 hba->version != UFSHCI_VERSION_21) in ufshcd_probe()
2024 dev_err(hba->dev, "invalid UFS version 0x%x\n", in ufshcd_probe()
2025 hba->version); in ufshcd_probe()
2028 hba->intr_mask = ufshcd_get_intr_mask(hba); in ufshcd_probe()
2031 err = ufshcd_memory_alloc(hba); in ufshcd_probe()
2033 dev_err(hba->dev, "Memory allocation failed\n"); in ufshcd_probe()
2038 ufshcd_host_memory_configure(hba); in ufshcd_probe()
2045 ufshcd_writel(hba, ufshcd_readl(hba, REG_INTERRUPT_STATUS), in ufshcd_probe()
2047 ufshcd_writel(hba, 0, REG_INTERRUPT_ENABLE); in ufshcd_probe()
2049 err = ufshcd_hba_enable(hba); in ufshcd_probe()
2051 dev_err(hba->dev, "Host controller enable failed\n"); in ufshcd_probe()
2055 err = ufs_start(hba); in ufshcd_probe()