Lines Matching +full:ufs +full:- +full:disable +full:- +full:mcq
1 /* SPDX-License-Identifier: GPL-2.0-or-later */
4 * Copyright (C) 2011-2013 Samsung India Software Operations
5 * Copyright (c) 2013-2016, The Linux Foundation. All rights reserved.
16 #include <linux/blk-crypto-profile.h>
17 #include <linux/blk-mq.h>
19 #include <linux/fault-inject.h>
23 #include <linux/dma-direction.h>
26 #include <ufs/unipro.h>
27 #include <ufs/ufs.h>
28 #include <ufs/ufs_quirks.h>
29 #include <ufs/ufshci.h>
68 * struct uic_command - UIC command structure
92 /* Host <-> Device UniPro Link state */
100 #define ufshcd_is_link_off(hba) ((hba)->uic_link_state == UIC_LINK_OFF_STATE)
101 #define ufshcd_is_link_active(hba) ((hba)->uic_link_state == \
103 #define ufshcd_is_link_hibern8(hba) ((hba)->uic_link_state == \
105 #define ufshcd_is_link_broken(hba) ((hba)->uic_link_state == \
107 #define ufshcd_set_link_off(hba) ((hba)->uic_link_state = UIC_LINK_OFF_STATE)
108 #define ufshcd_set_link_active(hba) ((hba)->uic_link_state = \
110 #define ufshcd_set_link_hibern8(hba) ((hba)->uic_link_state = \
112 #define ufshcd_set_link_broken(hba) ((hba)->uic_link_state = \
116 ((h)->curr_dev_pwr_mode = UFS_ACTIVE_PWR_MODE)
118 ((h)->curr_dev_pwr_mode = UFS_SLEEP_PWR_MODE)
120 ((h)->curr_dev_pwr_mode = UFS_POWERDOWN_PWR_MODE)
122 ((h)->curr_dev_pwr_mode = UFS_DEEPSLEEP_PWR_MODE)
124 ((h)->curr_dev_pwr_mode == UFS_ACTIVE_PWR_MODE)
126 ((h)->curr_dev_pwr_mode == UFS_SLEEP_PWR_MODE)
128 ((h)->curr_dev_pwr_mode == UFS_POWERDOWN_PWR_MODE)
130 ((h)->curr_dev_pwr_mode == UFS_DEEPSLEEP_PWR_MODE)
133 * UFS Power management levels.
155 * struct ufshcd_lrb - local reference block
166 * @command_type: SCSI, UFS, Query.
175 * @crypto_key_slot: the key slot to use for inline crypto (-1 if none)
194 u8 lun; /* UPIU LUN id field is only 8-bit wide */
208 * struct ufs_query_req - parameters for building a query request
218 * struct ufs_query_resp - UPIU QUERY
227 * struct ufs_query - holds relevant data structures for query request
239 * struct ufs_dev_cmd - all assosiated fields with device management commands
240 * @type: device management command type - Query, NOP OUT
253 * struct ufs_clk_info - UFS clock related info
254 * @list: list headed by hba->clk_list_head
262 * @enabled: variable to check against multiple enable/disable
296 * struct ufs_hba_variant_ops - variant specific callbacks
303 * @get_ufs_hci_version: called to get UFS HCI version
307 * variant specific Uni-Pro initialization.
309 * to allow variant specific Uni-Pro initialization.
326 * @device_reset: called to issue a reset pulse on the UFS device
328 * @fill_crypto_prdt: initialize crypto-related fields in the PRDT
330 * @mcq_config_resource: called to configure MCQ platform resources
399 * struct ufs_clk_gating - UFS clock gating related info
412 * @enable_attr: sysfs attribute to enable/disable clock gating
436 * struct ufs_clk_scaling - UFS clock scaling related data
442 * devfreq ->target() function is called then schedule "suspend_work" to
447 * @enable_attr: sysfs attribute to enable/disable clock scaling
448 * @saved_pwr_info: UFS power mode may also be changed during scaling and this
453 * disable Write Booster
488 * struct ufs_event_hist - keeps history of errors
502 * struct ufs_stats - keeps usage/err statistics
504 * reset this after link-startup.
516 * enum ufshcd_state - UFS host controller state
547 * If UFS host controller is having issue in processing LCC (Line
549 * When this quirk is enabled, host controller driver should disable
550 * the LCC transmission on UFS device (by clearing TX_LCC_ENABLE
572 * is enabled, standard UFS host driver will call the vendor specific
608 * auto-hibernate capability but it doesn't work.
613 * This quirk needs to disable manual flush for write booster
618 * This quirk needs to disable unipro timeout values
637 * auto-hibernate capability but it's FASTAUTO only.
650 * Enable this quirk will disable CQES and use per queue interrupt.
714 * This capability allows host controller driver to use the UFS HCI's
716 * CAUTION: Enabling this might reduce overall UFS throughput.
721 * This capability allows the device auto-bkops to be always enabled
737 * This capability allows the host controller driver to turn-on
758 * if it is supported by the UFS device. The host controller driver must
759 * support device hardware reset via the hba->device_reset() callback,
766 * notification if it is supported by the UFS device.
771 * Enable WriteBooster when scaling up the clock and disable
804 * struct ufshcd_mcq_opr_info_t - Operation and Runtime registers
825 * struct ufs_hba - per adapter private structure
827 * @ucdl_base_addr: UFS Command Descriptor base address
830 * @ucdl_dma_addr: UFS Command Descriptor DMA address
835 * @ufs_device_wlun: WLUN that controls the entire UFS device.
837 * @curr_dev_pwr_mode: active UFS device power mode.
838 * @uic_link_state: active state of the link to the UFS device.
839 * @rpm_lvl: desired UFS power management level during runtime PM.
840 * @spm_lvl: desired UFS power management level during system PM.
842 * @ahit: value of Auto-Hibernate Idle Timer register.
847 * @capabilities: UFS Controller Capabilities
848 * @mcq_capabilities: UFS Multi Circular Queue capabilities
850 * @nortt - Max outstanding RTTs supported by controller
853 * @ufs_version: UFS Version to which controller complies
859 * @is_irq_enabled: whether or not the UFS controller interrupt is enabled.
862 * @dev_quirks: bitmask with information about deviations from the UFS standard.
881 * @eh_work: Worker to handle UFS errors that require s/w attention
884 * @uic_error: UFS interconnect layer error status
891 * @dev_cmd: ufs device management command information
894 * @dev_info: information about the UFS device
896 * @vreg_info: UFS device voltage regulator information
897 * @clk_list_head: UFS host controller clocks list node head
900 * @lanes_per_direction: number of lanes per data direction between the UFS
901 * controller and the UFS device.
905 * @caps: bitmask with information about UFS controller capabilities
907 * @clk_scaling: frequency scaling information owned by the UFS driver
910 * @is_sys_suspended: UFS device has been suspended because of system suspend
918 * @bsg_queue: BSG queue associated with the UFS controller
920 * management) after the UFS device has finished a WriteBooster buffer
922 * @monitor: statistics about UFS commands
927 * @debugfs_root: UFS controller debugfs root directory
931 * @luns_avail: number of regular and well known LUNs supported by the UFS
937 * @mcq_sup: is mcq supported by UFSHC
938 * @mcq_enabled: is mcq ready to accept requests
939 * @mcq_esi_enabled: is mcq ESI configured
940 * @res: array of resource info of MCQ registers
944 * @mcq_opr: MCQ operation and runtime registers
945 * @ufs_rtc_update_work: A work for UFS RTC periodic update
977 /* Desired UFS power management level during runtime PM */
979 /* Desired UFS power management level during system PM */
983 /* Auto-Hibernate Idle Timer register value */
1011 /* Device deviations from standard UFS device spec. */
1053 /* Keeps information of the UFS device connected to this host */
1069 /* Control to enable/disable host capabilities */
1130 * struct ufs_hw_queue - per hardware queue structure
1174 return hba->mcq_opr[opr].offset + hba->mcq_opr[opr].stride * idx; in ufshcd_mcq_opr_offset()
1185 return hba->sg_entry_size; in ufshcd_sg_entry_size()
1191 hba->sg_entry_size = sg_entry_size; in ufshcd_set_sg_entry_size()
1219 return hba->caps & UFSHCD_CAP_CLK_GATING; in ufshcd_is_clkgating_allowed()
1223 return hba->caps & UFSHCD_CAP_HIBERN8_WITH_CLK_GATING; in ufshcd_can_hibern8_during_gating()
1227 return hba->caps & UFSHCD_CAP_CLK_SCALING; in ufshcd_is_clkscaling_supported()
1231 return hba->caps & UFSHCD_CAP_AUTO_BKOPS_SUSPEND; in ufshcd_can_autobkops_during_suspend()
1235 return hba->caps & UFSHCD_CAP_RPM_AUTOSUSPEND; in ufshcd_is_rpm_autosuspend_allowed()
1240 return (hba->caps & UFSHCD_CAP_INTR_AGGR) && in ufshcd_is_intr_aggr_allowed()
1241 !(hba->quirks & UFSHCD_QUIRK_BROKEN_INTR_AGGR); in ufshcd_is_intr_aggr_allowed()
1247 (hba->caps & UFSHCD_CAP_AGGR_POWER_COLLAPSE)); in ufshcd_can_aggressive_pc()
1252 return (hba->capabilities & MASK_AUTO_HIBERN8_SUPPORT) && in ufshcd_is_auto_hibern8_supported()
1253 !(hba->quirks & UFSHCD_QUIRK_BROKEN_AUTO_HIBERN8); in ufshcd_is_auto_hibern8_supported()
1258 return FIELD_GET(UFSHCI_AHIBERN8_TIMER_MASK, hba->ahit); in ufshcd_is_auto_hibern8_enabled()
1263 return hba->caps & UFSHCD_CAP_WB_EN; in ufshcd_is_wb_allowed()
1268 return hba->caps & UFSHCD_CAP_WB_WITH_CLK_SCALING; in ufshcd_enable_wb_if_scaling_up()
1272 writel((val), (hba)->mcq_base + (reg))
1274 readl((hba)->mcq_base + (reg))
1277 writel_relaxed((val), (hba)->mcq_base + (reg))
1279 readl_relaxed((hba)->mcq_base + (reg))
1282 writel((val), (hba)->mmio_base + (reg))
1284 readl((hba)->mmio_base + (reg))
1287 * ufshcd_rmwl - perform read/modify/write for a controller register
1334 * ufshcd_set_variant - set variant specific data to the hba
1341 hba->priv = variant; in ufshcd_set_variant()
1345 * ufshcd_get_variant - get variant specific data from the hba
1351 return hba->priv; in ufshcd_get_variant()
1427 return (pwr_info->pwr_rx == FAST_MODE || in ufshcd_is_hs_mode()
1428 pwr_info->pwr_rx == FASTAUTO_MODE) && in ufshcd_is_hs_mode()
1429 (pwr_info->pwr_tx == FAST_MODE || in ufshcd_is_hs_mode()
1430 pwr_info->pwr_tx == FASTAUTO_MODE); in ufshcd_is_hs_mode()
1473 if (hba->vops && hba->vops->init) in ufshcd_vops_init()
1474 return hba->vops->init(hba); in ufshcd_vops_init()
1481 if (hba->vops && hba->vops->phy_initialization) in ufshcd_vops_phy_initialization()
1482 return hba->vops->phy_initialization(hba); in ufshcd_vops_phy_initialization()