ufs_aio_hcd.h 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715
  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_SET_DONE = 0x80000000
  125. };
  126. enum {
  127. SW_RST_TARGET_HCI = 0x1,
  128. SW_RST_TARGET_UNIPRO = 0x2,
  129. SW_RST_TARGET_CPT = 0x4, // crypto engine
  130. SW_RST_TARGET_MPHY = 0x8,
  131. SW_RST_TARGET_MAC_ALL = (SW_RST_TARGET_HCI | SW_RST_TARGET_UNIPRO | SW_RST_TARGET_CPT),
  132. };
  133. enum {
  134. ATTR_SIMPLE = 0,
  135. ATTR_ORDERED = 1,
  136. ATTR_HEAD_OF_QUEUE = 2,
  137. };
  138. enum dev_cmd_type {
  139. DEV_CMD_TYPE_NOP = 0x0,
  140. DEV_CMD_TYPE_QUERY = 0x1,
  141. };
  142. enum dma_data_direction {
  143. DMA_BIDIRECTIONAL = 0,
  144. DMA_TO_DEVICE = 1,
  145. DMA_FROM_DEVICE = 2,
  146. DMA_NONE = 3,
  147. };
  148. typedef enum {
  149. UFS_LU_0 = 0
  150. ,UFS_LU_1 = 1
  151. ,UFS_LU_2 = 2
  152. ,UFS_LU_INTERNAL_CNT = 3
  153. } ufs_logical_unit_internal;
  154. /*
  155. * UFS driver/device status
  156. */
  157. #define UFS_DRV_STS_DMA_WAIT_INTERRUPT (0x00000002)
  158. /**
  159. * struct uic_command - UIC command structure
  160. * @command: UIC command
  161. * @argument1: UIC command argument 1
  162. * @argument2: UIC command argument 2
  163. * @argument3: UIC command argument 3
  164. * @cmd_active: Indicate if UIC command is outstanding
  165. * @result: UIC command result
  166. * @done: UIC command completion
  167. */
  168. struct uic_command {
  169. u32 command;
  170. u32 argument1;
  171. u32 argument2;
  172. u32 argument3;
  173. int cmd_active;
  174. int result;
  175. };
  176. /**
  177. * struct ufshcd_sg_entry - UFSHCI PRD Entry
  178. * @base_addr: Lower 32bit physical address DW-0
  179. * @upper_addr: Upper 32bit physical address DW-1
  180. * @reserved: Reserved for future use DW-2
  181. * @size: size of physical segment DW-3
  182. */
  183. struct ufshcd_sg_entry {
  184. __le32 base_addr;
  185. __le32 upper_addr;
  186. __le32 reserved;
  187. __le32 size;
  188. };
  189. /**
  190. * struct ufs_query - holds relevent data structures for query request
  191. * @request: request upiu and function
  192. * @descriptor: buffer for sending/receiving descriptor
  193. * @response: response upiu and response
  194. */
  195. struct ufs_query {
  196. struct ufs_query_req request;
  197. u8 *descriptor;
  198. struct ufs_query_res response;
  199. };
  200. /**
  201. * struct ufshcd_lrb - local reference block
  202. * @utr_descriptor_ptr: UTRD address of the command
  203. * @ucd_req_ptr: UCD address of the command
  204. * @ucd_rsp_ptr: Response UPIU address for this command
  205. * @ucd_prdt_ptr: PRDT address of the command
  206. * @cmd: pointer to SCSI command
  207. * @sense_buffer: pointer to sense buffer address of the SCSI command
  208. * @sense_bufflen: Length of the sense buffer
  209. * @scsi_status: SCSI status of the command
  210. * @command_type: SCSI, UFS, Query.
  211. * @task_tag: Task tag of the command
  212. * @lun: LUN of the command
  213. * @intr_cmd: Interrupt command (doesn't participate in interrupt aggregation)
  214. */
  215. struct ufshcd_lrb {
  216. struct utp_transfer_req_desc *utr_descriptor_ptr;
  217. struct utp_upiu_req *ucd_req_ptr;
  218. struct utp_upiu_rsp *ucd_rsp_ptr;
  219. struct ufshcd_sg_entry *ucd_prdt_ptr;
  220. struct ufs_aio_scsi_cmd *cmd;
  221. u8 *sense_buffer;
  222. unsigned int sense_bufflen;
  223. int scsi_status;
  224. int command_type;
  225. int task_tag;
  226. u8 lun; /* UPIU LUN id field is only 8-bit wide */
  227. bool intr_cmd;
  228. #ifdef UFS_CFG_CRYPTO
  229. u32 crypto_en;
  230. u32 crypto_cfgid;
  231. u32 crypto_dunl;
  232. u32 crypto_dunu;
  233. #endif
  234. };
  235. struct ufs_pa_layer_attr {
  236. u32 gear_rx;
  237. u32 gear_tx;
  238. u32 lane_rx;
  239. u32 lane_tx;
  240. u32 pwr_rx;
  241. u32 pwr_tx;
  242. u32 hs_rate;
  243. };
  244. struct ufs_pwr_mode_info {
  245. bool is_valid;
  246. struct ufs_pa_layer_attr info;
  247. };
  248. struct ufs_aio_scsi_cmd {
  249. unsigned int lun;
  250. int tag;
  251. enum dma_data_direction dir;
  252. unsigned char attr;
  253. unsigned char cmd_data[MAX_CDB_SIZE];
  254. unsigned short cmd_len;
  255. unsigned int exp_len;
  256. void * data_buf;
  257. };
  258. struct ufs_aio_unmap_block_descriptor { // 16 bytes
  259. u8 unmap_logical_block_address[8];
  260. u8 num_logical_blocks[4];
  261. u8 reserved[4];
  262. };
  263. struct ufs_aio_unmap_param_list { // 24 bytes
  264. u8 unmap_data_length[2];
  265. u8 unmap_block_descriptor_data_length[2];
  266. u8 reserved[4];
  267. struct ufs_aio_unmap_block_descriptor unmap_block_descriptor;
  268. };
  269. #define UFS_MAX_CMD_DATA_SIZE (64)
  270. /**
  271. * struct ufs_dev_cmd - all assosiated fields with device management commands
  272. * @type: device management command type - Query, NOP OUT
  273. * @lock: lock to allow one command at a time
  274. * @complete: internal commands completion
  275. * @tag_wq: wait queue until free command slot is available
  276. */
  277. struct ufs_dev_cmd {
  278. enum dev_cmd_type type;
  279. struct ufs_query query;
  280. };
  281. #define MAX_PRODUCT_ID_LEN (16)
  282. #define MAX_PRODUCT_REVISION_LEVEL_LEN (4)
  283. #define MAX_SERAL_NUMBER_LEN (64) /* spec (126*2), 64 because code size */
  284. struct ufs_device_info {
  285. u16 wmanufacturerid; // from Device Descriptor
  286. u8 num_active_lu; // from Device Descriptor
  287. u16 ufs_ver; // from Device Descriptor
  288. u8 bootable;
  289. char product_id[MAX_PRODUCT_ID_LEN + 1];
  290. char product_revision_level[MAX_PRODUCT_REVISION_LEVEL_LEN + 1];
  291. char serial_number[MAX_SERAL_NUMBER_LEN * 2 + 1]; /* 1 byte need 2 char(ex.FF) + 1 end */
  292. u8 serial_number_len;
  293. u8 ud0_base_offset;
  294. u8 ud_config_len;
  295. u8 hpb_support;
  296. u16 hpb_ver;
  297. u8 tw_support;
  298. u8 tw_red;
  299. u8 tw_type;
  300. u16 tw_ver;
  301. u32 wb_buf_au;
  302. u8 pre_eol_info;
  303. u8 life_time_est_a;
  304. u8 life_time_est_b;
  305. };
  306. struct ufs_custom_info {
  307. u32 custom_flag;
  308. bool force_provision;
  309. u32 tw_size_gb;
  310. u32 tw_no_red;
  311. u32 hpb_size_gb;
  312. };
  313. struct ufs_geometry_info {
  314. u8 b_allocation_units_size; // number of segment
  315. u16 w_adj_factor_enahnced_1;
  316. u32 d_segment_size; // in 512 bytes
  317. u64 q_total_raw_device_capacity; // in 512 bytes
  318. u16 w_hpb_device_max_active_regions;
  319. u16 w_hpb_lu_max_active_regions;
  320. u64 q_hpb_region_size; // in 512 bytes
  321. u32 d_tw_buf_max_au;
  322. u32 d_tw_buf_au;
  323. u8 b_tw_buf_adj_fac;
  324. u8 b_tw_support_red_type;
  325. u8 b_tw_support_buf_type;
  326. };
  327. struct ufs_unit_desc_cfg_param {
  328. u8 b_lu_enable;
  329. u8 b_boot_lun_id;
  330. u8 b_lu_write_protect;
  331. u8 b_memory_type;
  332. u8 d_num_alloc_units[4];
  333. u8 b_data_reliability;
  334. u8 b_logical_block_size;
  335. u8 b_provisioning_type;
  336. u8 w_context_capabilities[2];
  337. u8 reserved[3];
  338. };
  339. struct ufs_platform_info {
  340. void *hci_base;
  341. void *pericfg_base;
  342. void *mphy_base;
  343. u32 reg_ufs_pericfg;
  344. u32 reg_ufs_pericfg_rst_n_bit;
  345. u32 reg_ufs_pericfg_ldo_n_bit;
  346. u32 reg_ufs_pericfg_lp_n_bit;
  347. };
  348. struct ufs_unique_id {
  349. u16 vid;
  350. char pid[MAX_PRODUCT_ID_LEN + 1];
  351. char sn[MAX_SERAL_NUMBER_LEN * 2 + 1];
  352. };
  353. struct ufs_hba {
  354. void *hci_base;
  355. void *pericfg_base;
  356. void *mphy_base;
  357. int nutrs;
  358. //int nutmrs;
  359. /* Virtual memory reference */
  360. struct utp_transfer_cmd_desc *ucdl_base_addr;
  361. struct utp_transfer_req_desc *utrdl_base_addr;
  362. //struct utp_task_req_desc *utmrdl_base_addr;
  363. //void * sense_buf_base_addr[UFS_AIO_MAX_NUTRS];
  364. /* DMA memory reference */
  365. ufs_paddr_t ucdl_dma_addr;
  366. ufs_paddr_t utrdl_dma_addr;
  367. //ufs_paddr_t utmrdl_dma_addr;
  368. //ufs_paddr_t sense_buf_dma_addr[UFS_AIO_MAX_NUTRS];
  369. unsigned int hci_quirks;
  370. unsigned int dev_quirks;
  371. struct uic_command *active_uic_cmd;
  372. struct ufs_pa_layer_attr pwr_info;
  373. struct ufshcd_lrb *lrb;
  374. unsigned long lrb_in_use;
  375. struct ufs_device_info dev_info;
  376. struct ufs_custom_info custom_info;
  377. u8 active_tr_tag;
  378. u8 mode;
  379. #if defined(MTK_UFS_DRV_DA)
  380. u8 unit_desc_cfg_param_valid;
  381. #endif
  382. //u8 active_tm_tag;
  383. int active_lun;
  384. unsigned long outstanding_reqs;
  385. struct ufs_pwr_mode_info max_pwr_info;
  386. /* Device management request data */
  387. struct ufs_dev_cmd dev_cmd;
  388. int (* blk_read)(struct ufs_hba * hba, u32 lun, u32 blk_start, u32 blk_cnt, unsigned long * buf);
  389. int (* blk_write)(struct ufs_hba * hba, u32 lun, u32 blk_start, u32 blk_cnt, unsigned long * buf);
  390. int (* blk_erase)(struct ufs_hba * hba, u32 lun, u32 blk_start, u32 blk_cnt);
  391. int (* nopin_nopout)(struct ufs_hba * hba);
  392. int (* query_flag)(struct ufs_hba *hba, enum query_opcode opcode, enum flag_idn idn, bool *flag_res);
  393. int (* query_attr)(struct ufs_hba *hba, enum query_opcode opcode, enum attr_idn idn, u8 index, u8 selector, u32 *attr_val);
  394. int (* read_descriptor)(struct ufs_hba * hba, enum desc_idn desc_id, int desc_index, u8 selector, u8 *buf, u32 size);
  395. int (* write_descriptor)(struct ufs_hba * hba, enum desc_idn desc_id, int desc_index, u8 selector, u8 *buf, u32 size);
  396. int (* dme_get)(struct ufs_hba *hba, u32 attr_sel, u32 *mib_val);
  397. int (* dme_peer_get)(struct ufs_hba *hba, u32 attr_sel, u32 *mib_val);
  398. int (* dme_set)(struct ufs_hba *hba, u32 attr_sel, u32 mib_val);
  399. int (* dme_peer_set)(struct ufs_hba *hba, u32 attr_sel, u32 mib_val);
  400. int (* ffu_write)(struct ufs_hba * hba, unsigned long * buf, u32 buf_size);
  401. #if defined(MTK_UFS_DRV_DA)
  402. // unit descriptor configurable parameters (in Configuration Descriptor)
  403. struct ufs_unit_desc_cfg_param unit_desc_cfg_param[UFS_UPIU_MAX_GENERAL_LUN];
  404. #endif
  405. #if defined(MTK_UFS_DRV_LK)
  406. u32 blk_cnt[UFS_LU_INTERNAL_CNT];
  407. #endif
  408. u32 drv_status;
  409. u32 irq;
  410. };
  411. #if !defined(MTK_UFS_DRV_LK)
  412. #define writel(val, reg) (*((volatile u32 *)(reg)) = (val))
  413. #define readl(reg) (*((volatile u32 *)(reg)))
  414. #endif
  415. #define ufs_aio_writel(hba, val, reg) \
  416. writel((val), (hba)->hci_base + (reg))
  417. #define ufs_aio_readl(hba, reg) \
  418. readl((hba)->hci_base + (reg))
  419. /**
  420. * ufs_aio_hba_stop - Send controller to reset state
  421. * @hba: per adapter instance
  422. */
  423. static inline void ufs_aio_hba_stop(struct ufs_hba *hba)
  424. {
  425. ufs_aio_writel(hba, CONTROLLER_DISABLE, REG_CONTROLLER_ENABLE);
  426. }
  427. #ifdef CONFIG_MTK_UFS_TEST
  428. int ufs_aio_query_attr(struct ufs_hba *hba, enum query_opcode opcode,
  429. enum attr_idn idn, u8 index, u8 selector, u32 *attr_val);
  430. int ufs_aio_query_flag(struct ufs_hba *hba, enum query_opcode opcode,
  431. enum flag_idn idn, bool *flag_res);
  432. int ufs_aio_query_desc(struct ufs_hba *hba, enum query_opcode opcode,
  433. enum desc_idn idn, u8 index, void *desc, u16 len);
  434. #endif
  435. #define UIC_COMMAND(cmd, attr, index, value) \
  436. (struct uic_command) { \
  437. .command = (cmd), \
  438. .argument1 = UIC_ARG_MIB_SEL(attr, index), \
  439. .argument2 = 0, \
  440. .argument3 = (value), \
  441. .result = 0xff, \
  442. }
  443. #define UIC_CMD_DME_GET(attr, index, value) \
  444. UIC_COMMAND(UIC_CMD_DME_GET, attr, index, value)
  445. #define UIC_CMD_DME_PEER_GET(attr, index, value) \
  446. UIC_COMMAND(UIC_CMD_DME_PEER_GET, attr, index, value)
  447. #define UIC_CMD_DME_SET(attr, index, value) \
  448. UIC_COMMAND(UIC_CMD_DME_SET, attr, index, value)
  449. #define UIC_CMD_DME_PEER_SET(attr, index, value) \
  450. UIC_COMMAND(UIC_CMD_DME_PEER_SET, attr, index, value)
  451. /* UIC command interfaces for DME primitives */
  452. #define DME_LOCAL 0
  453. #define DME_PEER 1
  454. #define ATTR_SET_NOR 0 /* NORMAL */
  455. #define ATTR_SET_ST 1 /* STATIC */
  456. /*------------------------------------------------
  457. * UFS quirks related definitions and declarations
  458. *------------------------------------------------*/
  459. /* return true if s1 is a prefix of s2 */
  460. #define STR_PRFX_EQUAL(s1, s2) !strncmp(s1, s2, strlen(s1))
  461. #define UFS_ANY_VENDOR 0xFFFF
  462. #define UFS_ANY_MODEL "ANY_MODEL"
  463. #define UFS_VENDOR_MICRON_MP 0x12C
  464. #define UFS_VENDOR_MICRON_ES 0x02C
  465. #define UFS_VENDOR_TOSHIBA 0x198
  466. #define UFS_VENDOR_SAMSUNG 0x1CE
  467. #define UFS_VENDOR_SKHYNIX 0x1AD
  468. /**
  469. * ufs_dev_fix - ufs device quirk info
  470. * @card: ufs card details
  471. * @quirk: device quirk
  472. */
  473. struct ufs_dev_fix {
  474. u16 wmanufacturerid;
  475. char product_id[MAX_PRODUCT_ID_LEN + 1];
  476. unsigned int quirk;
  477. };
  478. #define END_FIX { 0 }
  479. /* add specific device quirk */
  480. #define UFS_FIX(_vendor, _model, _quirk) { \
  481. .wmanufacturerid = (_vendor), \
  482. .product_id = (_model), \
  483. .quirk = (_quirk), \
  484. }
  485. /*
  486. * Some UFS memory device needs to lock configuration descriptor after programming LU.
  487. */
  488. #define UFS_DEVICE_QUIRK_NEED_LOCK_CONFIG_DESC (1 << 31)
  489. #define UFS_DEVICE_QUIRK_NEED_CONFIGURATION_FOR_UNUSED_LU (1 << 30)
  490. #define UFS_DEVICE_QUIRK_NEED_8_BYTE_ALIGNED_BUF (1 << 29)
  491. /*
  492. * Some UFS memory device needs limited RPMB max rw size otherwise
  493. * device issue, for example, device hang, may happen in some scenarios.
  494. */
  495. #define UFS_DEVICE_QUIRK_LIMITED_RPMB_MAX_RW_SIZE (1 << 28)
  496. #define UFS_RPMB_DEV_MAX_RW_SIZE_LIMITATION (8)
  497. /*
  498. * UFS crypto related
  499. */
  500. enum {
  501. UFS_CRYPTO_ALGO_AES_XTS = 0,
  502. UFS_CRYPTO_ALGO_BITLOCKER_AES_CBC = 1,
  503. UFS_CRYPTO_ALGO_AES_ECB = 2,
  504. UFS_CRYPTO_ALGO_ESSIV_AES_CBC = 3,
  505. };
  506. enum {
  507. UFS_CRYPTO_DATA_UNIT_SIZE_4KB = 3,
  508. };
  509. union ufs_cpt_cap {
  510. u32 cap_raw;
  511. struct {
  512. u8 cap_cnt;
  513. u8 cfg_cnt;
  514. u8 resv;
  515. u8 cfg_ptr;
  516. } cap;
  517. };
  518. union ufs_cpt_capx {
  519. u32 capx_raw;
  520. struct {
  521. u8 alg_id;
  522. u8 du_size;
  523. u8 key_size;
  524. u8 resv;
  525. } capx;
  526. };
  527. union ufs_cap_cfg {
  528. u32 cfgx_raw[32];
  529. struct {
  530. u32 key[16];
  531. u8 du_size;
  532. u8 cap_id;
  533. u16 resv0 : 15;
  534. u16 cfg_en : 1;
  535. u8 mu1ti_host;
  536. u8 resv1;
  537. u16 vsb;
  538. u32 resv2[14];
  539. } cfgx;
  540. };
  541. #define UPIU_COMMAND_CRYPTO_EN_OFFSET 23
  542. /**
  543. * Exported API declaratoins
  544. */
  545. extern int ufs_aio_dma_nopin_nopout(struct ufs_hba * hba);
  546. extern int ufs_aio_pio_nopin_nopout(struct ufs_hba * hba);
  547. extern int ufs_aio_dma_query_flag(struct ufs_hba *hba, enum query_opcode opcode, enum flag_idn idn, bool *flag_res);
  548. extern int ufs_aio_pio_query_flag(struct ufs_hba *hba, enum query_opcode opcode, enum flag_idn idn, bool *flag_res);
  549. 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);
  550. 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);
  551. 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);
  552. 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);
  553. extern int ufs_aio_dma_dme_get(struct ufs_hba *hba, u32 attr_sel, u32 *mib_val);
  554. extern int ufs_aio_pio_dme_get(struct ufs_hba *hba, u32 attr_sel, u32 *mib_val);
  555. extern int ufs_aio_dma_dme_peer_get(struct ufs_hba *hba, u32 attr_sel, u32 *mib_val);
  556. extern int ufs_aio_pio_dme_peer_get(struct ufs_hba *hba, u32 attr_sel, u32 *mib_val);
  557. extern int ufs_aio_dma_dme_set(struct ufs_hba *hba, u32 attr_sel, u32 mib_val);
  558. extern int ufs_aio_pio_dme_set(struct ufs_hba *hba, u32 attr_sel, u32 mib_val);
  559. extern int ufs_aio_dma_dme_peer_set(struct ufs_hba *hba, u32 attr_sel, u32 mib_val);
  560. extern int ufs_aio_pio_dme_peer_set(struct ufs_hba *hba, u32 attr_sel, u32 mib_val);
  561. 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);
  562. 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);
  563. extern int ufs_aio_crypto_init(struct ufs_hba *hba);
  564. extern int ufs_aio_get_device_info(struct ufs_hba *hba);
  565. extern int ufs_aio_get_lu_size(struct ufs_hba *hba, u32 lun, u32 *blk_size_in_byte, u32 *blk_cnt);
  566. extern int ufs_aio_read_unit_desc_cfg_param(struct ufs_hba *hba);
  567. extern int ufs_aio_set_boot_lu(struct ufs_hba *hba, u32 b_boot_lun_en);
  568. extern int ufs_aio_check_lu_cfg(struct ufs_hba *hba);
  569. extern struct ufs_hba * ufs_aio_get_host(u8 host_id);
  570. extern int ufshcd_init(void);
  571. extern int ufs_aio_init_mphy(struct ufs_hba *hba);
  572. extern bool ufshcd_get_free_tag(struct ufs_hba *hba, int *tag_out);
  573. extern void ufshcd_put_tag(struct ufs_hba *hba, int tag);
  574. extern int ufshcd_queuecommand(struct ufs_hba *hba, struct ufs_aio_scsi_cmd *cmd);
  575. extern int ufshcd_read_device_desc(struct ufs_hba *hba, u8 *buf, u32 size);
  576. extern int ufs_aio_pio_cport_direct_write(struct ufs_hba * hba, const unsigned char *data, unsigned long len, int eom, int retry_ms);
  577. 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);
  578. #if defined(MTK_UFS_DRV_DA)
  579. extern int ufs_aio_get_device_buf_alignment_req(struct ufs_hba *hba);
  580. extern void ufshcd_irq_handler(unsigned int irq);
  581. #endif
  582. #if defined(MTK_UFS_DRV_PRELOADER)
  583. extern int ufs_aio_get_boot_lu(struct ufs_hba *hba, u32 *b_boot_lun);
  584. extern u64 ufs_aio_rpmb_get_lu_size(void);
  585. extern int ufs_aio_rpmb_get_rw_size(void);
  586. #endif
  587. #if defined(MTK_UFS_DRV_CTP)
  588. extern int ufshcd_config_pwr_mode(struct ufs_hba *hba, struct ufs_pa_layer_attr *desired_pwr_mode);
  589. extern u8 ufs_crypto_rw_en;
  590. #endif
  591. extern unsigned char g_ufs_temp_buf[];
  592. #endif /* _UFS_AIO_HCD_H */