ufs_aio_hcd.h 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725
  1. /* Copyright Statement:
  2. *
  3. * This software/firmware and related documentation ("MediaTek Software") are
  4. * protected under relevant copyright laws. The information contained herein
  5. * is confidential and proprietary to MediaTek Inc. and/or its licensors.
  6. * Without the prior written permission of MediaTek inc. and/or its licensors,
  7. * any reproduction, modification, use or disclosure of MediaTek Software,
  8. * and information contained herein, in whole or in part, shall be strictly prohibited.
  9. */
  10. /* MediaTek Inc. (C) 2015. All rights reserved.
  11. *
  12. * BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
  13. * THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE")
  14. * RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER ON
  15. * AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES,
  16. * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF
  17. * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT.
  18. * NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE
  19. * SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR
  20. * SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES TO LOOK ONLY TO SUCH
  21. * THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. RECEIVER EXPRESSLY ACKNOWLEDGES
  22. * THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES
  23. * CONTAINED IN MEDIATEK SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK
  24. * SOFTWARE RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR
  25. * STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND
  26. * CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE,
  27. * AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE,
  28. * OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY RECEIVER TO
  29. * MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE.
  30. */
  31. #ifndef _UFS_AIO_HCD_H
  32. #define _UFS_AIO_HCD_H
  33. #include "ufs_aio_cfg.h"
  34. #include "ufs_aio_types.h"
  35. #include "ufs_aio_platform.h"
  36. #include "ufs_aio_hci.h"
  37. #include "ufs_aio.h"
  38. #if defined(MTK_UFS_DRV_LK)
  39. #include "reg.h" // for writel, readl
  40. #endif
  41. // SCSI commands
  42. #define INQUIRY 0x12
  43. #define READ_CAPACITY 0x25
  44. #define READ_10 0x28
  45. #define WRITE_10 0x2A
  46. #define WRITE_BUFFER 0x3B
  47. #define UNMAP 0x42
  48. #define SECURITY_PROTOCOL_OUT 0xB5
  49. #define SECURITY_PROTOCOL_IN 0xA2
  50. /*
  51. * SENSE KEYS
  52. */
  53. #define UNIT_ATTENTION 0x06
  54. // DMA related configurations
  55. #define UFS_AIO_MAX_SIZE_PER_SG_SEGMENT (256 * 1024) // UFSHCI 2.1 spec: 256 KB
  56. #define UFS_AIO_MAX_NUTRS (1) // number of UTP Transfer Requset Slot
  57. #define UFS_AIO_MAX_NUTMRS (1) // number of UTP Task Management Requset Slot
  58. // alignment requirement
  59. #define UFS_ALIGN_UCD UFS_CACHE_ALIGNED_SIZE(128) // UTP command descriptors
  60. #define UFS_ALIGN_UTRD UFS_CACHE_ALIGNED_SIZE(32) // UTP transfer request descriptors. 32 is enough for UFSHCI 2.1 spec after applying SW trick
  61. #define UFS_ALIGN_UTMRD UFS_CACHE_ALIGNED_SIZE(32) // UTP task management descriptors. 32 is enough for UFSHCI 2.1 spec after applying SW trick
  62. #define UFS_BLOCK_BITS (12)
  63. #define UFS_BLOCK_SIZE (1 << UFS_BLOCK_BITS) // 4 KB
  64. #define UFS_1KB (0x400)
  65. #define UFS_1KB_MASK (UFS_1KB - 1)
  66. /*
  67. * ufs_utrdl length need align cache line, else if any data below ufs_utrdl
  68. * in map file dirty, will casue all cache line dirty. SW invalid ufs_utrdl
  69. * may overwrite DMA HW updated data in OCS.
  70. */
  71. #define UTRD_SIZE (sizeof(struct utp_transfer_req_desc))
  72. #define UTRD_NUTRS ((UTRD_SIZE+UFS_PLATFORM_CACHE_LINE_SIZE-1) / UTRD_SIZE)
  73. // Original UFSHCD_ENABLE_INTRS (defined in kernel) does not have UIC_POWER_MODE!
  74. #define UFSHCD_ENABLE_INTRS (UTP_TRANSFER_REQ_COMPL |\
  75. UTP_TASK_REQ_COMPL |\
  76. UIC_POWER_MODE |\
  77. UIC_HIBERNATE_ENTER |\
  78. UIC_HIBERNATE_EXIT |\
  79. UFSHCD_ERROR_MASK)
  80. /* UIC command timeout, unit: ms */
  81. #define UIC_CMD_TIMEOUT 500
  82. /* NOP OUT retries waiting for NOP IN response */
  83. #define NOP_OUT_RETRIES 10
  84. /* Timeout after 30 msecs if NOP OUT hangs without response */
  85. #define NOP_OUT_TIMEOUT 100 /* msecs */
  86. /* Query request retries */
  87. #define QUERY_REQ_RETRIES 10
  88. /* Query request timeout */
  89. #define QUERY_REQ_TIMEOUT 55000 /* msec */ // original: 30
  90. /* Task management command timeout */
  91. #define TM_CMD_TIMEOUT 1300 /* msecs */
  92. /* maximum number of link-startup retries */
  93. #define DME_LINKSTARTUP_RETRIES 3
  94. /* maximum number of reset retries before giving up */
  95. #define MAX_HOST_RESET_RETRIES 5
  96. /* Hynix device need max 5 seconds to clear fDeviceInit, we set 5s here to provide some margin */
  97. #define UFS_FDEVICEINIT_TIMEOUT_US (5000000)
  98. /* maximum number of test unit ready before giving up */
  99. #define UFS_TEST_UNIT_READY_TIMEOUT_US (15000)
  100. /* Expose the flag value from utp_upiu_query.value */
  101. #define MASK_QUERY_UPIU_FLAG_LOC 0xFF
  102. /* Interrupt aggregation default timeout, unit: 40us */
  103. #define INT_AGGR_DEF_TO 0x02
  104. #define UTP_TRANSFER_REQ_TIMEOUT_MS (5000) // 5 seconds for a single UTP transfer request
  105. // TODO: need different timeout for different operations
  106. #define UTP_UNMAP_TIMEOUT_MS (60000)
  107. #define ufshcd_writel(hba, val, reg) \
  108. writel((val), (hba)->hci_base + (reg))
  109. #define ufshcd_readl(hba, reg) \
  110. readl((hba)->hci_base + (reg))
  111. #define ufsphy_writel(hba, val, reg) \
  112. writel((val), (hba)->mphy_base + (reg))
  113. #define ufsphy_readl(hba, reg) \
  114. readl((hba)->mphy_base + (reg))
  115. /*
  116. * This quirk needs to be enabled for MTK MPHY test chip.
  117. */
  118. #define UFSHCD_QUIRK_MTK_MPHY_TESTCHIP UFS_BIT(31)
  119. enum {
  120. CUSTOM_FORCE_PROVISION = 0x1,
  121. CUSTOM_TW_GB = 0x2,
  122. CUSTOM_TW_NO_RED = 0x4,
  123. CUSTOM_HPB_REGION_COUNT = 0x8,
  124. CUSTOM_LU3 = 0x10,
  125. CUSTOM_SET_DONE = 0x80000000
  126. };
  127. enum {
  128. SW_RST_TARGET_HCI = 0x1,
  129. SW_RST_TARGET_UNIPRO = 0x2,
  130. SW_RST_TARGET_CPT = 0x4, // crypto engine
  131. SW_RST_TARGET_MPHY = 0x8,
  132. SW_RST_TARGET_MAC_ALL = (SW_RST_TARGET_HCI | SW_RST_TARGET_UNIPRO | SW_RST_TARGET_CPT),
  133. };
  134. enum {
  135. ATTR_SIMPLE = 0,
  136. ATTR_ORDERED = 1,
  137. ATTR_HEAD_OF_QUEUE = 2,
  138. };
  139. enum dev_cmd_type {
  140. DEV_CMD_TYPE_NOP = 0x0,
  141. DEV_CMD_TYPE_QUERY = 0x1,
  142. };
  143. enum dma_data_direction {
  144. DMA_BIDIRECTIONAL = 0,
  145. DMA_TO_DEVICE = 1,
  146. DMA_FROM_DEVICE = 2,
  147. DMA_NONE = 3,
  148. };
  149. typedef enum {
  150. UFS_LU_0 = 0
  151. ,UFS_LU_1 = 1
  152. ,UFS_LU_2 = 2
  153. ,UFS_LU_3 = 3
  154. ,UFS_LU_INTERNAL_CNT = 3
  155. } ufs_logical_unit_internal;
  156. /*
  157. * UFS driver/device status
  158. */
  159. #define UFS_DRV_STS_DMA_WAIT_INTERRUPT (0x00000002)
  160. /**
  161. * struct uic_command - UIC command structure
  162. * @command: UIC command
  163. * @argument1: UIC command argument 1
  164. * @argument2: UIC command argument 2
  165. * @argument3: UIC command argument 3
  166. * @cmd_active: Indicate if UIC command is outstanding
  167. * @result: UIC command result
  168. * @done: UIC command completion
  169. */
  170. struct uic_command {
  171. u32 command;
  172. u32 argument1;
  173. u32 argument2;
  174. u32 argument3;
  175. int cmd_active;
  176. int result;
  177. };
  178. /**
  179. * struct ufshcd_sg_entry - UFSHCI PRD Entry
  180. * @base_addr: Lower 32bit physical address DW-0
  181. * @upper_addr: Upper 32bit physical address DW-1
  182. * @reserved: Reserved for future use DW-2
  183. * @size: size of physical segment DW-3
  184. */
  185. struct ufshcd_sg_entry {
  186. __le32 base_addr;
  187. __le32 upper_addr;
  188. __le32 reserved;
  189. __le32 size;
  190. };
  191. /**
  192. * struct ufs_query - holds relevent data structures for query request
  193. * @request: request upiu and function
  194. * @descriptor: buffer for sending/receiving descriptor
  195. * @response: response upiu and response
  196. */
  197. struct ufs_query {
  198. struct ufs_query_req request;
  199. u8 *descriptor;
  200. struct ufs_query_res response;
  201. };
  202. /**
  203. * struct ufshcd_lrb - local reference block
  204. * @utr_descriptor_ptr: UTRD address of the command
  205. * @ucd_req_ptr: UCD address of the command
  206. * @ucd_rsp_ptr: Response UPIU address for this command
  207. * @ucd_prdt_ptr: PRDT address of the command
  208. * @cmd: pointer to SCSI command
  209. * @sense_buffer: pointer to sense buffer address of the SCSI command
  210. * @sense_bufflen: Length of the sense buffer
  211. * @scsi_status: SCSI status of the command
  212. * @command_type: SCSI, UFS, Query.
  213. * @task_tag: Task tag of the command
  214. * @lun: LUN of the command
  215. * @intr_cmd: Interrupt command (doesn't participate in interrupt aggregation)
  216. */
  217. struct ufshcd_lrb {
  218. struct utp_transfer_req_desc *utr_descriptor_ptr;
  219. struct utp_upiu_req *ucd_req_ptr;
  220. struct utp_upiu_rsp *ucd_rsp_ptr;
  221. struct ufshcd_sg_entry *ucd_prdt_ptr;
  222. struct ufs_aio_scsi_cmd *cmd;
  223. u8 *sense_buffer;
  224. unsigned int sense_bufflen;
  225. int scsi_status;
  226. int command_type;
  227. int task_tag;
  228. u8 lun; /* UPIU LUN id field is only 8-bit wide */
  229. bool intr_cmd;
  230. #ifdef UFS_CFG_CRYPTO
  231. u32 crypto_en;
  232. u32 crypto_cfgid;
  233. u32 crypto_dunl;
  234. u32 crypto_dunu;
  235. #endif
  236. };
  237. struct ufs_pa_layer_attr {
  238. u32 gear_rx;
  239. u32 gear_tx;
  240. u32 lane_rx;
  241. u32 lane_tx;
  242. u32 pwr_rx;
  243. u32 pwr_tx;
  244. u32 hs_rate;
  245. };
  246. struct ufs_pwr_mode_info {
  247. bool is_valid;
  248. struct ufs_pa_layer_attr info;
  249. };
  250. struct ufs_aio_scsi_cmd {
  251. unsigned int lun;
  252. int tag;
  253. enum dma_data_direction dir;
  254. unsigned char attr;
  255. unsigned char cmd_data[MAX_CDB_SIZE];
  256. unsigned short cmd_len;
  257. unsigned int exp_len;
  258. void * data_buf;
  259. };
  260. struct ufs_aio_unmap_block_descriptor { // 16 bytes
  261. u8 unmap_logical_block_address[8];
  262. u8 num_logical_blocks[4];
  263. u8 reserved[4];
  264. };
  265. struct ufs_aio_unmap_param_list { // 24 bytes
  266. u8 unmap_data_length[2];
  267. u8 unmap_block_descriptor_data_length[2];
  268. u8 reserved[4];
  269. struct ufs_aio_unmap_block_descriptor unmap_block_descriptor;
  270. };
  271. #define UFS_MAX_CMD_DATA_SIZE (64)
  272. /**
  273. * struct ufs_dev_cmd - all assosiated fields with device management commands
  274. * @type: device management command type - Query, NOP OUT
  275. * @lock: lock to allow one command at a time
  276. * @complete: internal commands completion
  277. * @tag_wq: wait queue until free command slot is available
  278. */
  279. struct ufs_dev_cmd {
  280. enum dev_cmd_type type;
  281. struct ufs_query query;
  282. };
  283. #define MAX_PRODUCT_ID_LEN (16)
  284. #define MAX_PRODUCT_REVISION_LEVEL_LEN (4)
  285. #define MAX_SERAL_NUMBER_LEN (64) /* spec (126*2), 64 because code size */
  286. struct ufs_device_info {
  287. u16 wmanufacturerid; // from Device Descriptor
  288. u8 num_active_lu; // from Device Descriptor
  289. u16 ufs_ver; // from Device Descriptor
  290. u8 bootable;
  291. char product_id[MAX_PRODUCT_ID_LEN + 1];
  292. char product_revision_level[MAX_PRODUCT_REVISION_LEVEL_LEN + 1];
  293. char serial_number[MAX_SERAL_NUMBER_LEN * 2 + 1]; /* 1 byte need 2 char(ex.FF) + 1 end */
  294. u8 serial_number_len;
  295. u8 ud0_base_offset;
  296. u8 ud_config_len;
  297. u8 hpb_support;
  298. u16 hpb_ver;
  299. u8 tw_support;
  300. u8 tw_red;
  301. u8 tw_type;
  302. u16 tw_ver;
  303. u32 wb_buf_au;
  304. u8 pre_eol_info;
  305. u8 life_time_est_a;
  306. u8 life_time_est_b;
  307. };
  308. struct ufs_custom_info {
  309. u32 custom_flag;
  310. bool force_provision;
  311. u32 tw_size_gb;
  312. u32 tw_no_red;
  313. u32 hpb_size_gb;
  314. u64 lu3_size_mb;
  315. u32 lu3_type;
  316. };
  317. struct ufs_geometry_info {
  318. u8 b_allocation_units_size; // number of segment
  319. u16 w_adj_factor_system_code;
  320. u16 w_adj_factor_non_persist;
  321. u16 w_adj_factor_enahnced_1;
  322. u16 w_adj_factor_enahnced_2;
  323. u16 w_adj_factor_enahnced_3;
  324. u16 w_adj_factor_enahnced_4;
  325. u32 d_segment_size; // in 512 bytes
  326. u64 q_total_raw_device_capacity; // in 512 bytes
  327. u16 w_hpb_device_max_active_regions;
  328. u16 w_hpb_lu_max_active_regions;
  329. u64 q_hpb_region_size; // in 512 bytes
  330. u32 d_tw_buf_max_au;
  331. u32 d_tw_buf_au;
  332. u8 b_tw_buf_adj_fac;
  333. u8 b_tw_support_red_type;
  334. u8 b_tw_support_buf_type;
  335. };
  336. struct ufs_unit_desc_cfg_param {
  337. u8 b_lu_enable;
  338. u8 b_boot_lun_id;
  339. u8 b_lu_write_protect;
  340. u8 b_memory_type;
  341. u8 d_num_alloc_units[4];
  342. u8 b_data_reliability;
  343. u8 b_logical_block_size;
  344. u8 b_provisioning_type;
  345. u8 w_context_capabilities[2];
  346. u8 reserved[3];
  347. };
  348. struct ufs_platform_info {
  349. void *hci_base;
  350. void *pericfg_base;
  351. void *mphy_base;
  352. u32 reg_ufs_pericfg;
  353. u32 reg_ufs_pericfg_rst_n_bit;
  354. u32 reg_ufs_pericfg_ldo_n_bit;
  355. u32 reg_ufs_pericfg_lp_n_bit;
  356. u32 highspeed_gear;
  357. };
  358. struct ufs_unique_id {
  359. u16 vid;
  360. char pid[MAX_PRODUCT_ID_LEN + 1];
  361. char sn[MAX_SERAL_NUMBER_LEN * 2 + 1];
  362. };
  363. struct ufs_hba {
  364. void *hci_base;
  365. void *pericfg_base;
  366. void *mphy_base;
  367. int nutrs;
  368. //int nutmrs;
  369. /* Virtual memory reference */
  370. struct utp_transfer_cmd_desc *ucdl_base_addr;
  371. struct utp_transfer_req_desc *utrdl_base_addr;
  372. //struct utp_task_req_desc *utmrdl_base_addr;
  373. //void * sense_buf_base_addr[UFS_AIO_MAX_NUTRS];
  374. /* DMA memory reference */
  375. ufs_paddr_t ucdl_dma_addr;
  376. ufs_paddr_t utrdl_dma_addr;
  377. //ufs_paddr_t utmrdl_dma_addr;
  378. //ufs_paddr_t sense_buf_dma_addr[UFS_AIO_MAX_NUTRS];
  379. unsigned int hci_quirks;
  380. unsigned int dev_quirks;
  381. struct uic_command *active_uic_cmd;
  382. struct ufs_pa_layer_attr pwr_info;
  383. struct ufshcd_lrb *lrb;
  384. unsigned long lrb_in_use;
  385. struct ufs_device_info dev_info;
  386. struct ufs_custom_info custom_info;
  387. u8 active_tr_tag;
  388. u8 mode;
  389. #if defined(MTK_UFS_DRV_DA)
  390. u8 unit_desc_cfg_param_valid;
  391. #endif
  392. //u8 active_tm_tag;
  393. int active_lun;
  394. unsigned long outstanding_reqs;
  395. struct ufs_pwr_mode_info max_pwr_info;
  396. /* Device management request data */
  397. struct ufs_dev_cmd dev_cmd;
  398. int (* blk_read)(struct ufs_hba * hba, u32 lun, u32 blk_start, u32 blk_cnt, unsigned long * buf);
  399. int (* blk_write)(struct ufs_hba * hba, u32 lun, u32 blk_start, u32 blk_cnt, unsigned long * buf);
  400. int (* blk_erase)(struct ufs_hba * hba, u32 lun, u32 blk_start, u32 blk_cnt);
  401. int (* nopin_nopout)(struct ufs_hba * hba);
  402. int (* query_flag)(struct ufs_hba *hba, enum query_opcode opcode, enum flag_idn idn, bool *flag_res);
  403. int (* query_attr)(struct ufs_hba *hba, enum query_opcode opcode, enum attr_idn idn, u8 index, u8 selector, u32 *attr_val);
  404. int (* read_descriptor)(struct ufs_hba * hba, enum desc_idn desc_id, int desc_index, u8 selector, u8 *buf, u32 size);
  405. int (* write_descriptor)(struct ufs_hba * hba, enum desc_idn desc_id, int desc_index, u8 selector, u8 *buf, u32 size);
  406. int (* dme_get)(struct ufs_hba *hba, u32 attr_sel, u32 *mib_val);
  407. int (* dme_peer_get)(struct ufs_hba *hba, u32 attr_sel, u32 *mib_val);
  408. int (* dme_set)(struct ufs_hba *hba, u32 attr_sel, u32 mib_val);
  409. int (* dme_peer_set)(struct ufs_hba *hba, u32 attr_sel, u32 mib_val);
  410. int (* ffu_write)(struct ufs_hba * hba, unsigned long * buf, u32 buf_size);
  411. #if defined(MTK_UFS_DRV_DA)
  412. // unit descriptor configurable parameters (in Configuration Descriptor)
  413. struct ufs_unit_desc_cfg_param unit_desc_cfg_param[UFS_UPIU_MAX_GENERAL_LUN];
  414. #endif
  415. #if defined(MTK_UFS_DRV_LK)
  416. u32 blk_cnt[UFS_LU_INTERNAL_CNT];
  417. #endif
  418. u32 drv_status;
  419. u32 irq;
  420. };
  421. #if !defined(MTK_UFS_DRV_LK)
  422. #define writel(val, reg) (*((volatile u32 *)(reg)) = (val))
  423. #define readl(reg) (*((volatile u32 *)(reg)))
  424. #endif
  425. #define ufs_aio_writel(hba, val, reg) \
  426. writel((val), (hba)->hci_base + (reg))
  427. #define ufs_aio_readl(hba, reg) \
  428. readl((hba)->hci_base + (reg))
  429. /**
  430. * ufs_aio_hba_stop - Send controller to reset state
  431. * @hba: per adapter instance
  432. */
  433. static inline void ufs_aio_hba_stop(struct ufs_hba *hba)
  434. {
  435. ufs_aio_writel(hba, CONTROLLER_DISABLE, REG_CONTROLLER_ENABLE);
  436. }
  437. #ifdef CONFIG_MTK_UFS_TEST
  438. int ufs_aio_query_attr(struct ufs_hba *hba, enum query_opcode opcode,
  439. enum attr_idn idn, u8 index, u8 selector, u32 *attr_val);
  440. int ufs_aio_query_flag(struct ufs_hba *hba, enum query_opcode opcode,
  441. enum flag_idn idn, bool *flag_res);
  442. int ufs_aio_query_desc(struct ufs_hba *hba, enum query_opcode opcode,
  443. enum desc_idn idn, u8 index, void *desc, u16 len);
  444. #endif
  445. #define UIC_COMMAND(cmd, attr, index, value) \
  446. (struct uic_command) { \
  447. .command = (cmd), \
  448. .argument1 = UIC_ARG_MIB_SEL(attr, index), \
  449. .argument2 = 0, \
  450. .argument3 = (value), \
  451. .result = 0xff, \
  452. }
  453. #define UIC_CMD_DME_GET(attr, index, value) \
  454. UIC_COMMAND(UIC_CMD_DME_GET, attr, index, value)
  455. #define UIC_CMD_DME_PEER_GET(attr, index, value) \
  456. UIC_COMMAND(UIC_CMD_DME_PEER_GET, attr, index, value)
  457. #define UIC_CMD_DME_SET(attr, index, value) \
  458. UIC_COMMAND(UIC_CMD_DME_SET, attr, index, value)
  459. #define UIC_CMD_DME_PEER_SET(attr, index, value) \
  460. UIC_COMMAND(UIC_CMD_DME_PEER_SET, attr, index, value)
  461. /* UIC command interfaces for DME primitives */
  462. #define DME_LOCAL 0
  463. #define DME_PEER 1
  464. #define ATTR_SET_NOR 0 /* NORMAL */
  465. #define ATTR_SET_ST 1 /* STATIC */
  466. /*------------------------------------------------
  467. * UFS quirks related definitions and declarations
  468. *------------------------------------------------*/
  469. /* return true if s1 is a prefix of s2 */
  470. #define STR_PRFX_EQUAL(s1, s2) !strncmp(s1, s2, strlen(s1))
  471. #define UFS_ANY_VENDOR 0xFFFF
  472. #define UFS_ANY_MODEL "ANY_MODEL"
  473. #define UFS_VENDOR_MICRON_MP 0x12C
  474. #define UFS_VENDOR_MICRON_ES 0x02C
  475. #define UFS_VENDOR_TOSHIBA 0x198
  476. #define UFS_VENDOR_SAMSUNG 0x1CE
  477. #define UFS_VENDOR_SKHYNIX 0x1AD
  478. /**
  479. * ufs_dev_fix - ufs device quirk info
  480. * @card: ufs card details
  481. * @quirk: device quirk
  482. */
  483. struct ufs_dev_fix {
  484. u16 wmanufacturerid;
  485. char product_id[MAX_PRODUCT_ID_LEN + 1];
  486. unsigned int quirk;
  487. };
  488. #define END_FIX { 0 }
  489. /* add specific device quirk */
  490. #define UFS_FIX(_vendor, _model, _quirk) { \
  491. .wmanufacturerid = (_vendor), \
  492. .product_id = (_model), \
  493. .quirk = (_quirk), \
  494. }
  495. /*
  496. * Some UFS memory device needs to lock configuration descriptor after programming LU.
  497. */
  498. #define UFS_DEVICE_QUIRK_NEED_LOCK_CONFIG_DESC (1U << 31)
  499. #define UFS_DEVICE_QUIRK_NEED_CONFIGURATION_FOR_UNUSED_LU (1U << 30)
  500. #define UFS_DEVICE_QUIRK_NEED_8_BYTE_ALIGNED_BUF (1U << 29)
  501. /*
  502. * Some UFS memory device needs limited RPMB max rw size otherwise
  503. * device issue, for example, device hang, may happen in some scenarios.
  504. */
  505. #define UFS_DEVICE_QUIRK_LIMITED_RPMB_MAX_RW_SIZE (1U << 28)
  506. #define UFS_RPMB_DEV_MAX_RW_SIZE_LIMITATION (8)
  507. /*
  508. * UFS crypto related
  509. */
  510. enum {
  511. UFS_CRYPTO_ALGO_AES_XTS = 0,
  512. UFS_CRYPTO_ALGO_BITLOCKER_AES_CBC = 1,
  513. UFS_CRYPTO_ALGO_AES_ECB = 2,
  514. UFS_CRYPTO_ALGO_ESSIV_AES_CBC = 3,
  515. };
  516. enum {
  517. UFS_CRYPTO_DATA_UNIT_SIZE_4KB = 3,
  518. };
  519. union ufs_cpt_cap {
  520. u32 cap_raw;
  521. struct {
  522. u8 cap_cnt;
  523. u8 cfg_cnt;
  524. u8 resv;
  525. u8 cfg_ptr;
  526. } cap;
  527. };
  528. union ufs_cpt_capx {
  529. u32 capx_raw;
  530. struct {
  531. u8 alg_id;
  532. u8 du_size;
  533. u8 key_size;
  534. u8 resv;
  535. } capx;
  536. };
  537. union ufs_cap_cfg {
  538. u32 cfgx_raw[32];
  539. struct {
  540. u32 key[16];
  541. u8 du_size;
  542. u8 cap_id;
  543. u16 resv0 : 15;
  544. u16 cfg_en : 1;
  545. u8 mu1ti_host;
  546. u8 resv1;
  547. u16 vsb;
  548. u32 resv2[14];
  549. } cfgx;
  550. };
  551. #define UPIU_COMMAND_CRYPTO_EN_OFFSET 23
  552. /**
  553. * Exported API declaratoins
  554. */
  555. extern int ufs_aio_dma_nopin_nopout(struct ufs_hba * hba);
  556. extern int ufs_aio_pio_nopin_nopout(struct ufs_hba * hba);
  557. extern int ufs_aio_dma_query_flag(struct ufs_hba *hba, enum query_opcode opcode, enum flag_idn idn, bool *flag_res);
  558. extern int ufs_aio_pio_query_flag(struct ufs_hba *hba, enum query_opcode opcode, enum flag_idn idn, bool *flag_res);
  559. extern int ufs_aio_dma_read_desc(struct ufs_hba * hba, enum desc_idn desc_id, int desc_index, u8 selector, u8 *buf, u32 size);
  560. extern int ufs_aio_pio_read_desc(struct ufs_hba * hba, enum desc_idn desc_id, int desc_index, u8 selector, u8 * buf, u32 buf_size);
  561. extern int ufs_aio_dma_write_desc(struct ufs_hba *hba, enum desc_idn idn, int index, u8 selector, u8 *src_buf, u32 buf_len);
  562. extern int ufs_aio_pio_write_desc(struct ufs_hba *hba, enum desc_idn idn, int index, u8 selector, u8 *src_buf, u32 buf_len);
  563. extern int ufs_aio_dma_dme_get(struct ufs_hba *hba, u32 attr_sel, u32 *mib_val);
  564. extern int ufs_aio_pio_dme_get(struct ufs_hba *hba, u32 attr_sel, u32 *mib_val);
  565. extern int ufs_aio_dma_dme_peer_get(struct ufs_hba *hba, u32 attr_sel, u32 *mib_val);
  566. extern int ufs_aio_pio_dme_peer_get(struct ufs_hba *hba, u32 attr_sel, u32 *mib_val);
  567. extern int ufs_aio_dma_dme_set(struct ufs_hba *hba, u32 attr_sel, u32 mib_val);
  568. extern int ufs_aio_pio_dme_set(struct ufs_hba *hba, u32 attr_sel, u32 mib_val);
  569. extern int ufs_aio_dma_dme_peer_set(struct ufs_hba *hba, u32 attr_sel, u32 mib_val);
  570. extern int ufs_aio_pio_dme_peer_set(struct ufs_hba *hba, u32 attr_sel, u32 mib_val);
  571. extern int ufs_aio_dma_query_attr(struct ufs_hba *hba, enum query_opcode opcode, enum attr_idn idn, u8 index, u8 selector, u32 *attr_val);
  572. extern int ufs_aio_pio_query_attr(struct ufs_hba *hba, enum query_opcode opcode, enum attr_idn idn, u8 index, u8 selector, u32 *attr_val);
  573. extern int ufs_aio_crypto_init(struct ufs_hba *hba);
  574. extern int ufs_aio_get_device_info(struct ufs_hba *hba);
  575. extern int ufs_aio_get_lu_size(struct ufs_hba *hba, u32 lun, u32 *blk_size_in_byte, u32 *blk_cnt);
  576. extern int ufs_aio_read_unit_desc_cfg_param(struct ufs_hba *hba);
  577. extern int ufs_aio_set_boot_lu(struct ufs_hba *hba, u32 b_boot_lun_en);
  578. extern int ufs_aio_check_lu_cfg(struct ufs_hba *hba);
  579. extern struct ufs_hba * ufs_aio_get_host(u8 host_id);
  580. extern int ufshcd_init(void);
  581. extern int ufs_aio_init_mphy(struct ufs_hba *hba);
  582. extern bool ufshcd_get_free_tag(struct ufs_hba *hba, int *tag_out);
  583. extern void ufshcd_put_tag(struct ufs_hba *hba, int tag);
  584. extern int ufshcd_queuecommand(struct ufs_hba *hba, struct ufs_aio_scsi_cmd *cmd);
  585. extern int ufshcd_read_device_desc(struct ufs_hba *hba, u8 *buf, u32 size);
  586. extern int ufs_aio_pio_cport_direct_write(struct ufs_hba * hba, const unsigned char *data, unsigned long len, int eom, int retry_ms);
  587. extern int ufs_aio_pio_cport_direct_read(struct ufs_hba * hba, unsigned char *data, unsigned long buflen, u32 *plen, int retry_ms, bool isDummy, u32 real_byte);
  588. #if defined(MTK_UFS_DRV_DA)
  589. extern int ufs_aio_get_device_buf_alignment_req(struct ufs_hba *hba);
  590. extern void ufshcd_irq_handler(unsigned int irq);
  591. #endif
  592. #if defined(MTK_UFS_DRV_PRELOADER)
  593. extern int ufs_aio_get_boot_lu(struct ufs_hba *hba, u32 *b_boot_lun);
  594. extern u64 ufs_aio_rpmb_get_lu_size(void);
  595. extern int ufs_aio_rpmb_get_rw_size(void);
  596. #endif
  597. #if defined(MTK_UFS_DRV_CTP)
  598. extern int ufshcd_config_pwr_mode(struct ufs_hba *hba, struct ufs_pa_layer_attr *desired_pwr_mode);
  599. extern u8 ufs_crypto_rw_en;
  600. #endif
  601. extern unsigned char g_ufs_temp_buf[];
  602. #endif /* _UFS_AIO_HCD_H */