ufs.h 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670
  1. /* SPDX-License-Identifier: GPL-2.0-or-later */
  2. /*
  3. * Universal Flash Storage Host controller driver
  4. * Copyright (C) 2011-2013 Samsung India Software Operations
  5. *
  6. * Authors:
  7. * Santosh Yaraganavi <[email protected]>
  8. * Vinayak Holikatti <[email protected]>
  9. */
  10. #ifndef _UFS_H
  11. #define _UFS_H
  12. #include <linux/mutex.h>
  13. #include <linux/types.h>
  14. #include <linux/android_kabi.h>
  15. #include <linux/android_vendor.h>
  16. #include <uapi/scsi/scsi_bsg_ufs.h>
  17. #define GENERAL_UPIU_REQUEST_SIZE (sizeof(struct utp_upiu_req))
  18. #define QUERY_DESC_MAX_SIZE 255
  19. #define QUERY_DESC_MIN_SIZE 2
  20. #define QUERY_DESC_HDR_SIZE 2
  21. #define QUERY_OSF_SIZE (GENERAL_UPIU_REQUEST_SIZE - \
  22. (sizeof(struct utp_upiu_header)))
  23. #define UFS_SENSE_SIZE 18
  24. #define UPIU_HEADER_DWORD(byte3, byte2, byte1, byte0)\
  25. cpu_to_be32((byte3 << 24) | (byte2 << 16) |\
  26. (byte1 << 8) | (byte0))
  27. /*
  28. * UFS device may have standard LUs and LUN id could be from 0x00 to
  29. * 0x7F. Standard LUs use "Peripheral Device Addressing Format".
  30. * UFS device may also have the Well Known LUs (also referred as W-LU)
  31. * which again could be from 0x00 to 0x7F. For W-LUs, device only use
  32. * the "Extended Addressing Format" which means the W-LUNs would be
  33. * from 0xc100 (SCSI_W_LUN_BASE) onwards.
  34. * This means max. LUN number reported from UFS device could be 0xC17F.
  35. */
  36. #define UFS_UPIU_MAX_UNIT_NUM_ID 0x7F
  37. #define UFS_MAX_LUNS (SCSI_W_LUN_BASE + UFS_UPIU_MAX_UNIT_NUM_ID)
  38. #define UFS_UPIU_WLUN_ID (1 << 7)
  39. /* WriteBooster buffer is available only for the logical unit from 0 to 7 */
  40. #define UFS_UPIU_MAX_WB_LUN_ID 8
  41. /*
  42. * WriteBooster buffer lifetime has a limit setted by vendor.
  43. * If it is over the limit, WriteBooster feature will be disabled.
  44. */
  45. #define UFS_WB_EXCEED_LIFETIME 0x0B
  46. /*
  47. * In UFS Spec, the Extra Header Segment (EHS) starts from byte 32 in UPIU request/response packet
  48. */
  49. #define EHS_OFFSET_IN_RESPONSE 32
  50. /* Well known logical unit id in LUN field of UPIU */
  51. enum {
  52. UFS_UPIU_REPORT_LUNS_WLUN = 0x81,
  53. UFS_UPIU_UFS_DEVICE_WLUN = 0xD0,
  54. UFS_UPIU_BOOT_WLUN = 0xB0,
  55. UFS_UPIU_RPMB_WLUN = 0xC4,
  56. };
  57. /*
  58. * UFS Protocol Information Unit related definitions
  59. */
  60. /* Task management functions */
  61. enum {
  62. UFS_ABORT_TASK = 0x01,
  63. UFS_ABORT_TASK_SET = 0x02,
  64. UFS_CLEAR_TASK_SET = 0x04,
  65. UFS_LOGICAL_RESET = 0x08,
  66. UFS_QUERY_TASK = 0x80,
  67. UFS_QUERY_TASK_SET = 0x81,
  68. };
  69. /* UTP UPIU Transaction Codes Initiator to Target */
  70. enum {
  71. UPIU_TRANSACTION_NOP_OUT = 0x00,
  72. UPIU_TRANSACTION_COMMAND = 0x01,
  73. UPIU_TRANSACTION_DATA_OUT = 0x02,
  74. UPIU_TRANSACTION_TASK_REQ = 0x04,
  75. UPIU_TRANSACTION_QUERY_REQ = 0x16,
  76. };
  77. /* UTP UPIU Transaction Codes Target to Initiator */
  78. enum {
  79. UPIU_TRANSACTION_NOP_IN = 0x20,
  80. UPIU_TRANSACTION_RESPONSE = 0x21,
  81. UPIU_TRANSACTION_DATA_IN = 0x22,
  82. UPIU_TRANSACTION_TASK_RSP = 0x24,
  83. UPIU_TRANSACTION_READY_XFER = 0x31,
  84. UPIU_TRANSACTION_QUERY_RSP = 0x36,
  85. UPIU_TRANSACTION_REJECT_UPIU = 0x3F,
  86. };
  87. /* UPIU Read/Write flags */
  88. enum {
  89. UPIU_CMD_FLAGS_NONE = 0x00,
  90. UPIU_CMD_FLAGS_WRITE = 0x20,
  91. UPIU_CMD_FLAGS_READ = 0x40,
  92. };
  93. /* UPIU Command Priority flags */
  94. enum {
  95. UPIU_CMD_PRIO_NONE = 0x00,
  96. UPIU_CMD_PRIO_HIGH = 0x04,
  97. };
  98. /* UPIU Task Attributes */
  99. enum {
  100. UPIU_TASK_ATTR_SIMPLE = 0x00,
  101. UPIU_TASK_ATTR_ORDERED = 0x01,
  102. UPIU_TASK_ATTR_HEADQ = 0x02,
  103. UPIU_TASK_ATTR_ACA = 0x03,
  104. };
  105. /* UPIU Query request function */
  106. enum {
  107. UPIU_QUERY_FUNC_STANDARD_READ_REQUEST = 0x01,
  108. UPIU_QUERY_FUNC_STANDARD_WRITE_REQUEST = 0x81,
  109. };
  110. /* Flag idn for Query Requests*/
  111. enum flag_idn {
  112. QUERY_FLAG_IDN_FDEVICEINIT = 0x01,
  113. QUERY_FLAG_IDN_PERMANENT_WPE = 0x02,
  114. QUERY_FLAG_IDN_PWR_ON_WPE = 0x03,
  115. QUERY_FLAG_IDN_BKOPS_EN = 0x04,
  116. QUERY_FLAG_IDN_LIFE_SPAN_MODE_ENABLE = 0x05,
  117. QUERY_FLAG_IDN_PURGE_ENABLE = 0x06,
  118. QUERY_FLAG_IDN_RESERVED2 = 0x07,
  119. QUERY_FLAG_IDN_FPHYRESOURCEREMOVAL = 0x08,
  120. QUERY_FLAG_IDN_BUSY_RTC = 0x09,
  121. QUERY_FLAG_IDN_RESERVED3 = 0x0A,
  122. QUERY_FLAG_IDN_PERMANENTLY_DISABLE_FW_UPDATE = 0x0B,
  123. QUERY_FLAG_IDN_WB_EN = 0x0E,
  124. QUERY_FLAG_IDN_WB_BUFF_FLUSH_EN = 0x0F,
  125. QUERY_FLAG_IDN_WB_BUFF_FLUSH_DURING_HIBERN8 = 0x10,
  126. QUERY_FLAG_IDN_HPB_RESET = 0x11,
  127. QUERY_FLAG_IDN_HPB_EN = 0x12,
  128. };
  129. /* Attribute idn for Query requests */
  130. enum attr_idn {
  131. QUERY_ATTR_IDN_BOOT_LU_EN = 0x00,
  132. QUERY_ATTR_IDN_MAX_HPB_SINGLE_CMD = 0x01,
  133. QUERY_ATTR_IDN_POWER_MODE = 0x02,
  134. QUERY_ATTR_IDN_ACTIVE_ICC_LVL = 0x03,
  135. QUERY_ATTR_IDN_OOO_DATA_EN = 0x04,
  136. QUERY_ATTR_IDN_BKOPS_STATUS = 0x05,
  137. QUERY_ATTR_IDN_PURGE_STATUS = 0x06,
  138. QUERY_ATTR_IDN_MAX_DATA_IN = 0x07,
  139. QUERY_ATTR_IDN_MAX_DATA_OUT = 0x08,
  140. QUERY_ATTR_IDN_DYN_CAP_NEEDED = 0x09,
  141. QUERY_ATTR_IDN_REF_CLK_FREQ = 0x0A,
  142. QUERY_ATTR_IDN_CONF_DESC_LOCK = 0x0B,
  143. QUERY_ATTR_IDN_MAX_NUM_OF_RTT = 0x0C,
  144. QUERY_ATTR_IDN_EE_CONTROL = 0x0D,
  145. QUERY_ATTR_IDN_EE_STATUS = 0x0E,
  146. QUERY_ATTR_IDN_SECONDS_PASSED = 0x0F,
  147. QUERY_ATTR_IDN_CNTX_CONF = 0x10,
  148. QUERY_ATTR_IDN_CORR_PRG_BLK_NUM = 0x11,
  149. QUERY_ATTR_IDN_RESERVED2 = 0x12,
  150. QUERY_ATTR_IDN_RESERVED3 = 0x13,
  151. QUERY_ATTR_IDN_FFU_STATUS = 0x14,
  152. QUERY_ATTR_IDN_PSA_STATE = 0x15,
  153. QUERY_ATTR_IDN_PSA_DATA_SIZE = 0x16,
  154. QUERY_ATTR_IDN_REF_CLK_GATING_WAIT_TIME = 0x17,
  155. QUERY_ATTR_IDN_CASE_ROUGH_TEMP = 0x18,
  156. QUERY_ATTR_IDN_HIGH_TEMP_BOUND = 0x19,
  157. QUERY_ATTR_IDN_LOW_TEMP_BOUND = 0x1A,
  158. QUERY_ATTR_IDN_WB_FLUSH_STATUS = 0x1C,
  159. QUERY_ATTR_IDN_AVAIL_WB_BUFF_SIZE = 0x1D,
  160. QUERY_ATTR_IDN_WB_BUFF_LIFE_TIME_EST = 0x1E,
  161. QUERY_ATTR_IDN_CURR_WB_BUFF_SIZE = 0x1F,
  162. QUERY_ATTR_IDN_EXT_IID_EN = 0x2A,
  163. };
  164. /* Descriptor idn for Query requests */
  165. enum desc_idn {
  166. QUERY_DESC_IDN_DEVICE = 0x0,
  167. QUERY_DESC_IDN_CONFIGURATION = 0x1,
  168. QUERY_DESC_IDN_UNIT = 0x2,
  169. QUERY_DESC_IDN_RFU_0 = 0x3,
  170. QUERY_DESC_IDN_INTERCONNECT = 0x4,
  171. QUERY_DESC_IDN_STRING = 0x5,
  172. QUERY_DESC_IDN_RFU_1 = 0x6,
  173. QUERY_DESC_IDN_GEOMETRY = 0x7,
  174. QUERY_DESC_IDN_POWER = 0x8,
  175. QUERY_DESC_IDN_HEALTH = 0x9,
  176. QUERY_DESC_IDN_MAX,
  177. };
  178. enum desc_header_offset {
  179. QUERY_DESC_LENGTH_OFFSET = 0x00,
  180. QUERY_DESC_DESC_TYPE_OFFSET = 0x01,
  181. };
  182. /* Unit descriptor parameters offsets in bytes*/
  183. enum unit_desc_param {
  184. UNIT_DESC_PARAM_LEN = 0x0,
  185. UNIT_DESC_PARAM_TYPE = 0x1,
  186. UNIT_DESC_PARAM_UNIT_INDEX = 0x2,
  187. UNIT_DESC_PARAM_LU_ENABLE = 0x3,
  188. UNIT_DESC_PARAM_BOOT_LUN_ID = 0x4,
  189. UNIT_DESC_PARAM_LU_WR_PROTECT = 0x5,
  190. UNIT_DESC_PARAM_LU_Q_DEPTH = 0x6,
  191. UNIT_DESC_PARAM_PSA_SENSITIVE = 0x7,
  192. UNIT_DESC_PARAM_MEM_TYPE = 0x8,
  193. UNIT_DESC_PARAM_DATA_RELIABILITY = 0x9,
  194. UNIT_DESC_PARAM_LOGICAL_BLK_SIZE = 0xA,
  195. UNIT_DESC_PARAM_LOGICAL_BLK_COUNT = 0xB,
  196. UNIT_DESC_PARAM_ERASE_BLK_SIZE = 0x13,
  197. UNIT_DESC_PARAM_PROVISIONING_TYPE = 0x17,
  198. UNIT_DESC_PARAM_PHY_MEM_RSRC_CNT = 0x18,
  199. UNIT_DESC_PARAM_CTX_CAPABILITIES = 0x20,
  200. UNIT_DESC_PARAM_LARGE_UNIT_SIZE_M1 = 0x22,
  201. UNIT_DESC_PARAM_HPB_LU_MAX_ACTIVE_RGNS = 0x23,
  202. UNIT_DESC_PARAM_HPB_PIN_RGN_START_OFF = 0x25,
  203. UNIT_DESC_PARAM_HPB_NUM_PIN_RGNS = 0x27,
  204. UNIT_DESC_PARAM_WB_BUF_ALLOC_UNITS = 0x29,
  205. };
  206. /* RPMB Unit descriptor parameters offsets in bytes*/
  207. enum rpmb_unit_desc_param {
  208. RPMB_UNIT_DESC_PARAM_LEN = 0x0,
  209. RPMB_UNIT_DESC_PARAM_TYPE = 0x1,
  210. RPMB_UNIT_DESC_PARAM_UNIT_INDEX = 0x2,
  211. RPMB_UNIT_DESC_PARAM_LU_ENABLE = 0x3,
  212. RPMB_UNIT_DESC_PARAM_BOOT_LUN_ID = 0x4,
  213. RPMB_UNIT_DESC_PARAM_LU_WR_PROTECT = 0x5,
  214. RPMB_UNIT_DESC_PARAM_LU_Q_DEPTH = 0x6,
  215. RPMB_UNIT_DESC_PARAM_PSA_SENSITIVE = 0x7,
  216. RPMB_UNIT_DESC_PARAM_MEM_TYPE = 0x8,
  217. RPMB_UNIT_DESC_PARAM_REGION_EN = 0x9,
  218. RPMB_UNIT_DESC_PARAM_LOGICAL_BLK_SIZE = 0xA,
  219. RPMB_UNIT_DESC_PARAM_LOGICAL_BLK_COUNT = 0xB,
  220. RPMB_UNIT_DESC_PARAM_REGION0_SIZE = 0x13,
  221. RPMB_UNIT_DESC_PARAM_REGION1_SIZE = 0x14,
  222. RPMB_UNIT_DESC_PARAM_REGION2_SIZE = 0x15,
  223. RPMB_UNIT_DESC_PARAM_REGION3_SIZE = 0x16,
  224. RPMB_UNIT_DESC_PARAM_PROVISIONING_TYPE = 0x17,
  225. RPMB_UNIT_DESC_PARAM_PHY_MEM_RSRC_CNT = 0x18,
  226. };
  227. /* Device descriptor parameters offsets in bytes*/
  228. enum device_desc_param {
  229. DEVICE_DESC_PARAM_LEN = 0x0,
  230. DEVICE_DESC_PARAM_TYPE = 0x1,
  231. DEVICE_DESC_PARAM_DEVICE_TYPE = 0x2,
  232. DEVICE_DESC_PARAM_DEVICE_CLASS = 0x3,
  233. DEVICE_DESC_PARAM_DEVICE_SUB_CLASS = 0x4,
  234. DEVICE_DESC_PARAM_PRTCL = 0x5,
  235. DEVICE_DESC_PARAM_NUM_LU = 0x6,
  236. DEVICE_DESC_PARAM_NUM_WLU = 0x7,
  237. DEVICE_DESC_PARAM_BOOT_ENBL = 0x8,
  238. DEVICE_DESC_PARAM_DESC_ACCSS_ENBL = 0x9,
  239. DEVICE_DESC_PARAM_INIT_PWR_MODE = 0xA,
  240. DEVICE_DESC_PARAM_HIGH_PR_LUN = 0xB,
  241. DEVICE_DESC_PARAM_SEC_RMV_TYPE = 0xC,
  242. DEVICE_DESC_PARAM_SEC_LU = 0xD,
  243. DEVICE_DESC_PARAM_BKOP_TERM_LT = 0xE,
  244. DEVICE_DESC_PARAM_ACTVE_ICC_LVL = 0xF,
  245. DEVICE_DESC_PARAM_SPEC_VER = 0x10,
  246. DEVICE_DESC_PARAM_MANF_DATE = 0x12,
  247. DEVICE_DESC_PARAM_MANF_NAME = 0x14,
  248. DEVICE_DESC_PARAM_PRDCT_NAME = 0x15,
  249. DEVICE_DESC_PARAM_SN = 0x16,
  250. DEVICE_DESC_PARAM_OEM_ID = 0x17,
  251. DEVICE_DESC_PARAM_MANF_ID = 0x18,
  252. DEVICE_DESC_PARAM_UD_OFFSET = 0x1A,
  253. DEVICE_DESC_PARAM_UD_LEN = 0x1B,
  254. DEVICE_DESC_PARAM_RTT_CAP = 0x1C,
  255. DEVICE_DESC_PARAM_FRQ_RTC = 0x1D,
  256. DEVICE_DESC_PARAM_UFS_FEAT = 0x1F,
  257. DEVICE_DESC_PARAM_FFU_TMT = 0x20,
  258. DEVICE_DESC_PARAM_Q_DPTH = 0x21,
  259. DEVICE_DESC_PARAM_DEV_VER = 0x22,
  260. DEVICE_DESC_PARAM_NUM_SEC_WPA = 0x24,
  261. DEVICE_DESC_PARAM_PSA_MAX_DATA = 0x25,
  262. DEVICE_DESC_PARAM_PSA_TMT = 0x29,
  263. DEVICE_DESC_PARAM_PRDCT_REV = 0x2A,
  264. DEVICE_DESC_PARAM_HPB_VER = 0x40,
  265. DEVICE_DESC_PARAM_HPB_CONTROL = 0x42,
  266. DEVICE_DESC_PARAM_EXT_UFS_FEATURE_SUP = 0x4F,
  267. DEVICE_DESC_PARAM_WB_PRESRV_USRSPC_EN = 0x53,
  268. DEVICE_DESC_PARAM_WB_TYPE = 0x54,
  269. DEVICE_DESC_PARAM_WB_SHARED_ALLOC_UNITS = 0x55,
  270. };
  271. /* Interconnect descriptor parameters offsets in bytes*/
  272. enum interconnect_desc_param {
  273. INTERCONNECT_DESC_PARAM_LEN = 0x0,
  274. INTERCONNECT_DESC_PARAM_TYPE = 0x1,
  275. INTERCONNECT_DESC_PARAM_UNIPRO_VER = 0x2,
  276. INTERCONNECT_DESC_PARAM_MPHY_VER = 0x4,
  277. };
  278. /* Geometry descriptor parameters offsets in bytes*/
  279. enum geometry_desc_param {
  280. GEOMETRY_DESC_PARAM_LEN = 0x0,
  281. GEOMETRY_DESC_PARAM_TYPE = 0x1,
  282. GEOMETRY_DESC_PARAM_DEV_CAP = 0x4,
  283. GEOMETRY_DESC_PARAM_MAX_NUM_LUN = 0xC,
  284. GEOMETRY_DESC_PARAM_SEG_SIZE = 0xD,
  285. GEOMETRY_DESC_PARAM_ALLOC_UNIT_SIZE = 0x11,
  286. GEOMETRY_DESC_PARAM_MIN_BLK_SIZE = 0x12,
  287. GEOMETRY_DESC_PARAM_OPT_RD_BLK_SIZE = 0x13,
  288. GEOMETRY_DESC_PARAM_OPT_WR_BLK_SIZE = 0x14,
  289. GEOMETRY_DESC_PARAM_MAX_IN_BUF_SIZE = 0x15,
  290. GEOMETRY_DESC_PARAM_MAX_OUT_BUF_SIZE = 0x16,
  291. GEOMETRY_DESC_PARAM_RPMB_RW_SIZE = 0x17,
  292. GEOMETRY_DESC_PARAM_DYN_CAP_RSRC_PLC = 0x18,
  293. GEOMETRY_DESC_PARAM_DATA_ORDER = 0x19,
  294. GEOMETRY_DESC_PARAM_MAX_NUM_CTX = 0x1A,
  295. GEOMETRY_DESC_PARAM_TAG_UNIT_SIZE = 0x1B,
  296. GEOMETRY_DESC_PARAM_TAG_RSRC_SIZE = 0x1C,
  297. GEOMETRY_DESC_PARAM_SEC_RM_TYPES = 0x1D,
  298. GEOMETRY_DESC_PARAM_MEM_TYPES = 0x1E,
  299. GEOMETRY_DESC_PARAM_SCM_MAX_NUM_UNITS = 0x20,
  300. GEOMETRY_DESC_PARAM_SCM_CAP_ADJ_FCTR = 0x24,
  301. GEOMETRY_DESC_PARAM_NPM_MAX_NUM_UNITS = 0x26,
  302. GEOMETRY_DESC_PARAM_NPM_CAP_ADJ_FCTR = 0x2A,
  303. GEOMETRY_DESC_PARAM_ENM1_MAX_NUM_UNITS = 0x2C,
  304. GEOMETRY_DESC_PARAM_ENM1_CAP_ADJ_FCTR = 0x30,
  305. GEOMETRY_DESC_PARAM_ENM2_MAX_NUM_UNITS = 0x32,
  306. GEOMETRY_DESC_PARAM_ENM2_CAP_ADJ_FCTR = 0x36,
  307. GEOMETRY_DESC_PARAM_ENM3_MAX_NUM_UNITS = 0x38,
  308. GEOMETRY_DESC_PARAM_ENM3_CAP_ADJ_FCTR = 0x3C,
  309. GEOMETRY_DESC_PARAM_ENM4_MAX_NUM_UNITS = 0x3E,
  310. GEOMETRY_DESC_PARAM_ENM4_CAP_ADJ_FCTR = 0x42,
  311. GEOMETRY_DESC_PARAM_OPT_LOG_BLK_SIZE = 0x44,
  312. GEOMETRY_DESC_PARAM_HPB_REGION_SIZE = 0x48,
  313. GEOMETRY_DESC_PARAM_HPB_NUMBER_LU = 0x49,
  314. GEOMETRY_DESC_PARAM_HPB_SUBREGION_SIZE = 0x4A,
  315. GEOMETRY_DESC_PARAM_HPB_MAX_ACTIVE_REGS = 0x4B,
  316. GEOMETRY_DESC_PARAM_WB_MAX_ALLOC_UNITS = 0x4F,
  317. GEOMETRY_DESC_PARAM_WB_MAX_WB_LUNS = 0x53,
  318. GEOMETRY_DESC_PARAM_WB_BUFF_CAP_ADJ = 0x54,
  319. GEOMETRY_DESC_PARAM_WB_SUP_RED_TYPE = 0x55,
  320. GEOMETRY_DESC_PARAM_WB_SUP_WB_TYPE = 0x56,
  321. };
  322. /* Health descriptor parameters offsets in bytes*/
  323. enum health_desc_param {
  324. HEALTH_DESC_PARAM_LEN = 0x0,
  325. HEALTH_DESC_PARAM_TYPE = 0x1,
  326. HEALTH_DESC_PARAM_EOL_INFO = 0x2,
  327. HEALTH_DESC_PARAM_LIFE_TIME_EST_A = 0x3,
  328. HEALTH_DESC_PARAM_LIFE_TIME_EST_B = 0x4,
  329. };
  330. /* WriteBooster buffer mode */
  331. enum {
  332. WB_BUF_MODE_LU_DEDICATED = 0x0,
  333. WB_BUF_MODE_SHARED = 0x1,
  334. };
  335. /*
  336. * Logical Unit Write Protect
  337. * 00h: LU not write protected
  338. * 01h: LU write protected when fPowerOnWPEn =1
  339. * 02h: LU permanently write protected when fPermanentWPEn =1
  340. */
  341. enum ufs_lu_wp_type {
  342. UFS_LU_NO_WP = 0x00,
  343. UFS_LU_POWER_ON_WP = 0x01,
  344. UFS_LU_PERM_WP = 0x02,
  345. };
  346. /* bActiveICCLevel parameter current units */
  347. enum {
  348. UFSHCD_NANO_AMP = 0,
  349. UFSHCD_MICRO_AMP = 1,
  350. UFSHCD_MILI_AMP = 2,
  351. UFSHCD_AMP = 3,
  352. };
  353. /* Possible values for dExtendedUFSFeaturesSupport */
  354. enum {
  355. UFS_DEV_LOW_TEMP_NOTIF = BIT(4),
  356. UFS_DEV_HIGH_TEMP_NOTIF = BIT(5),
  357. UFS_DEV_EXT_TEMP_NOTIF = BIT(6),
  358. UFS_DEV_HPB_SUPPORT = BIT(7),
  359. UFS_DEV_WRITE_BOOSTER_SUP = BIT(8),
  360. UFS_DEV_EXT_IID_SUP = BIT(16),
  361. };
  362. #define UFS_DEV_HPB_SUPPORT_VERSION 0x310
  363. #define POWER_DESC_MAX_ACTV_ICC_LVLS 16
  364. /* Attribute bActiveICCLevel parameter bit masks definitions */
  365. #define ATTR_ICC_LVL_UNIT_OFFSET 14
  366. #define ATTR_ICC_LVL_UNIT_MASK (0x3 << ATTR_ICC_LVL_UNIT_OFFSET)
  367. #define ATTR_ICC_LVL_VALUE_MASK 0x3FF
  368. /* Power descriptor parameters offsets in bytes */
  369. enum power_desc_param_offset {
  370. PWR_DESC_LEN = 0x0,
  371. PWR_DESC_TYPE = 0x1,
  372. PWR_DESC_ACTIVE_LVLS_VCC_0 = 0x2,
  373. PWR_DESC_ACTIVE_LVLS_VCCQ_0 = 0x22,
  374. PWR_DESC_ACTIVE_LVLS_VCCQ2_0 = 0x42,
  375. };
  376. /* Exception event mask values */
  377. enum {
  378. MASK_EE_STATUS = 0xFFFF,
  379. MASK_EE_DYNCAP_EVENT = BIT(0),
  380. MASK_EE_SYSPOOL_EVENT = BIT(1),
  381. MASK_EE_URGENT_BKOPS = BIT(2),
  382. MASK_EE_TOO_HIGH_TEMP = BIT(3),
  383. MASK_EE_TOO_LOW_TEMP = BIT(4),
  384. MASK_EE_WRITEBOOSTER_EVENT = BIT(5),
  385. MASK_EE_PERFORMANCE_THROTTLING = BIT(6),
  386. };
  387. #define MASK_EE_URGENT_TEMP (MASK_EE_TOO_HIGH_TEMP | MASK_EE_TOO_LOW_TEMP)
  388. /* Background operation status */
  389. enum bkops_status {
  390. BKOPS_STATUS_NO_OP = 0x0,
  391. BKOPS_STATUS_NON_CRITICAL = 0x1,
  392. BKOPS_STATUS_PERF_IMPACT = 0x2,
  393. BKOPS_STATUS_CRITICAL = 0x3,
  394. BKOPS_STATUS_MAX = BKOPS_STATUS_CRITICAL,
  395. };
  396. /* UTP QUERY Transaction Specific Fields OpCode */
  397. enum query_opcode {
  398. UPIU_QUERY_OPCODE_NOP = 0x0,
  399. UPIU_QUERY_OPCODE_READ_DESC = 0x1,
  400. UPIU_QUERY_OPCODE_WRITE_DESC = 0x2,
  401. UPIU_QUERY_OPCODE_READ_ATTR = 0x3,
  402. UPIU_QUERY_OPCODE_WRITE_ATTR = 0x4,
  403. UPIU_QUERY_OPCODE_READ_FLAG = 0x5,
  404. UPIU_QUERY_OPCODE_SET_FLAG = 0x6,
  405. UPIU_QUERY_OPCODE_CLEAR_FLAG = 0x7,
  406. UPIU_QUERY_OPCODE_TOGGLE_FLAG = 0x8,
  407. };
  408. /* bRefClkFreq attribute values */
  409. enum ufs_ref_clk_freq {
  410. REF_CLK_FREQ_19_2_MHZ = 0,
  411. REF_CLK_FREQ_26_MHZ = 1,
  412. REF_CLK_FREQ_38_4_MHZ = 2,
  413. REF_CLK_FREQ_52_MHZ = 3,
  414. REF_CLK_FREQ_INVAL = -1,
  415. };
  416. /* Query response result code */
  417. enum {
  418. QUERY_RESULT_SUCCESS = 0x00,
  419. QUERY_RESULT_NOT_READABLE = 0xF6,
  420. QUERY_RESULT_NOT_WRITEABLE = 0xF7,
  421. QUERY_RESULT_ALREADY_WRITTEN = 0xF8,
  422. QUERY_RESULT_INVALID_LENGTH = 0xF9,
  423. QUERY_RESULT_INVALID_VALUE = 0xFA,
  424. QUERY_RESULT_INVALID_SELECTOR = 0xFB,
  425. QUERY_RESULT_INVALID_INDEX = 0xFC,
  426. QUERY_RESULT_INVALID_IDN = 0xFD,
  427. QUERY_RESULT_INVALID_OPCODE = 0xFE,
  428. QUERY_RESULT_GENERAL_FAILURE = 0xFF,
  429. };
  430. /* UTP Transfer Request Command Type (CT) */
  431. enum {
  432. UPIU_COMMAND_SET_TYPE_SCSI = 0x0,
  433. UPIU_COMMAND_SET_TYPE_UFS = 0x1,
  434. UPIU_COMMAND_SET_TYPE_QUERY = 0x2,
  435. };
  436. /* UTP Transfer Request Command Offset */
  437. #define UPIU_COMMAND_TYPE_OFFSET 28
  438. /* Offset of the response code in the UPIU header */
  439. #define UPIU_RSP_CODE_OFFSET 8
  440. enum {
  441. MASK_SCSI_STATUS = 0xFF,
  442. MASK_TASK_RESPONSE = 0xFF00,
  443. MASK_RSP_UPIU_RESULT = 0xFFFF,
  444. MASK_QUERY_DATA_SEG_LEN = 0xFFFF,
  445. MASK_RSP_UPIU_DATA_SEG_LEN = 0xFFFF,
  446. MASK_RSP_EXCEPTION_EVENT = 0x10000,
  447. MASK_TM_SERVICE_RESP = 0xFF,
  448. MASK_TM_FUNC = 0xFF,
  449. };
  450. /* Task management service response */
  451. enum {
  452. UPIU_TASK_MANAGEMENT_FUNC_COMPL = 0x00,
  453. UPIU_TASK_MANAGEMENT_FUNC_NOT_SUPPORTED = 0x04,
  454. UPIU_TASK_MANAGEMENT_FUNC_SUCCEEDED = 0x08,
  455. UPIU_TASK_MANAGEMENT_FUNC_FAILED = 0x05,
  456. UPIU_INCORRECT_LOGICAL_UNIT_NO = 0x09,
  457. };
  458. /* UFS device power modes */
  459. enum ufs_dev_pwr_mode {
  460. UFS_ACTIVE_PWR_MODE = 1,
  461. UFS_SLEEP_PWR_MODE = 2,
  462. UFS_POWERDOWN_PWR_MODE = 3,
  463. UFS_DEEPSLEEP_PWR_MODE = 4,
  464. };
  465. #define UFS_WB_BUF_REMAIN_PERCENT(val) ((val) / 10)
  466. /**
  467. * struct utp_cmd_rsp - Response UPIU structure
  468. * @residual_transfer_count: Residual transfer count DW-3
  469. * @reserved: Reserved double words DW-4 to DW-7
  470. * @sense_data_len: Sense data length DW-8 U16
  471. * @sense_data: Sense data field DW-8 to DW-12
  472. */
  473. struct utp_cmd_rsp {
  474. __be32 residual_transfer_count;
  475. __be32 reserved[4];
  476. __be16 sense_data_len;
  477. u8 sense_data[UFS_SENSE_SIZE];
  478. };
  479. struct ufshpb_active_field {
  480. __be16 active_rgn;
  481. __be16 active_srgn;
  482. };
  483. #define HPB_ACT_FIELD_SIZE 4
  484. /**
  485. * struct utp_hpb_rsp - Response UPIU structure
  486. * @residual_transfer_count: Residual transfer count DW-3
  487. * @reserved1: Reserved double words DW-4 to DW-7
  488. * @sense_data_len: Sense data length DW-8 U16
  489. * @desc_type: Descriptor type of sense data
  490. * @additional_len: Additional length of sense data
  491. * @hpb_op: HPB operation type
  492. * @lun: LUN of response UPIU
  493. * @active_rgn_cnt: Active region count
  494. * @inactive_rgn_cnt: Inactive region count
  495. * @hpb_active_field: Recommended to read HPB region and subregion
  496. * @hpb_inactive_field: To be inactivated HPB region and subregion
  497. */
  498. struct utp_hpb_rsp {
  499. __be32 residual_transfer_count;
  500. __be32 reserved1[4];
  501. __be16 sense_data_len;
  502. u8 desc_type;
  503. u8 additional_len;
  504. u8 hpb_op;
  505. u8 lun;
  506. u8 active_rgn_cnt;
  507. u8 inactive_rgn_cnt;
  508. struct ufshpb_active_field hpb_active_field[2];
  509. __be16 hpb_inactive_field[2];
  510. };
  511. #define UTP_HPB_RSP_SIZE 40
  512. /**
  513. * struct utp_upiu_rsp - general upiu response structure
  514. * @header: UPIU header structure DW-0 to DW-2
  515. * @sr: fields structure for scsi command DW-3 to DW-12
  516. * @qr: fields structure for query request DW-3 to DW-7
  517. */
  518. struct utp_upiu_rsp {
  519. struct utp_upiu_header header;
  520. union {
  521. struct utp_cmd_rsp sr;
  522. struct utp_hpb_rsp hr;
  523. struct utp_upiu_query qr;
  524. };
  525. };
  526. /**
  527. * struct ufs_query_req - parameters for building a query request
  528. * @query_func: UPIU header query function
  529. * @upiu_req: the query request data
  530. */
  531. struct ufs_query_req {
  532. u8 query_func;
  533. struct utp_upiu_query upiu_req;
  534. };
  535. /**
  536. * struct ufs_query_resp - UPIU QUERY
  537. * @response: device response code
  538. * @upiu_res: query response data
  539. */
  540. struct ufs_query_res {
  541. u8 response;
  542. struct utp_upiu_query upiu_res;
  543. };
  544. /*
  545. * VCCQ & VCCQ2 current requirement when UFS device is in sleep state
  546. * and link is in Hibern8 state.
  547. */
  548. #define UFS_VREG_LPM_LOAD_UA 1000 /* uA */
  549. struct ufs_vreg {
  550. struct regulator *reg;
  551. const char *name;
  552. bool always_on;
  553. bool enabled;
  554. int max_uA;
  555. };
  556. struct ufs_vreg_info {
  557. struct ufs_vreg *vcc;
  558. struct ufs_vreg *vccq;
  559. struct ufs_vreg *vccq2;
  560. struct ufs_vreg *vdd_hba;
  561. };
  562. struct ufs_dev_info {
  563. bool f_power_on_wp_en;
  564. /* Keeps information if any of the LU is power on write protected */
  565. bool is_lu_power_on_wp;
  566. /* Maximum number of general LU supported by the UFS device */
  567. u8 max_lu_supported;
  568. u16 wmanufacturerid;
  569. /*UFS device Product Name */
  570. u8 *model;
  571. u16 wspecversion;
  572. u32 clk_gating_wait_us;
  573. /* Stores the depth of queue in UFS device */
  574. u8 bqueuedepth;
  575. /* UFS HPB related flag */
  576. bool hpb_enabled;
  577. /* UFS WB related flags */
  578. bool wb_enabled;
  579. bool wb_buf_flush_enabled;
  580. u8 wb_dedicated_lu;
  581. u8 wb_buffer_type;
  582. bool b_rpm_dev_flush_capable;
  583. u8 b_presrv_uspc_en;
  584. bool b_advanced_rpmb_en;
  585. /* UFS EXT_IID Enable */
  586. bool b_ext_iid_en;
  587. ANDROID_OEM_DATA(1);
  588. ANDROID_KABI_RESERVE(1);
  589. };
  590. /*
  591. * This enum is used in string mapping in include/trace/events/ufs.h.
  592. */
  593. enum ufs_trace_str_t {
  594. UFS_CMD_SEND, UFS_CMD_COMP, UFS_DEV_COMP,
  595. UFS_QUERY_SEND, UFS_QUERY_COMP, UFS_QUERY_ERR,
  596. UFS_TM_SEND, UFS_TM_COMP, UFS_TM_ERR,
  597. UFS_CMD_ERR
  598. };
  599. /*
  600. * Transaction Specific Fields (TSF) type in the UPIU package, this enum is
  601. * used in include/trace/events/ufs.h for UFS command trace.
  602. */
  603. enum ufs_trace_tsf_t {
  604. UFS_TSF_CDB, UFS_TSF_OSF, UFS_TSF_TM_INPUT, UFS_TSF_TM_OUTPUT
  605. };
  606. #endif /* End of Header */