ufs-sec-feature.h 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158
  1. // SPDX-License-Identifier: GPL-2.0
  2. /*
  3. * Samsung Specific feature
  4. *
  5. * Copyright (C) 2023 Samsung Electronics Co., Ltd.
  6. *
  7. * Authors:
  8. * Storage Driver <[email protected]>
  9. */
  10. #ifndef __UFS_SEC_FEATURE_H__
  11. #define __UFS_SEC_FEATURE_H__
  12. #include "../core/ufshcd-priv.h"
  13. #include <ufs/ufshci.h>
  14. #include <linux/sched/clock.h>
  15. #include <linux/notifier.h>
  16. #if IS_ENABLED(CONFIG_SEC_ABC)
  17. #include <linux/sti/abc_common.h>
  18. #endif
  19. /*unique number*/
  20. #define UFS_UN_20_DIGITS 20
  21. #define UFS_UN_MAX_DIGITS (UFS_UN_20_DIGITS + 1)
  22. #define SERIAL_NUM_SIZE 7
  23. #define SCSI_UFS_TIMEOUT (10 * HZ)
  24. #define HEALTH_DESC_PARAM_VENDOR_LIFE_TIME_EST 0x22
  25. struct ufs_vendor_dev_info {
  26. struct ufs_hba *hba;
  27. char unique_number[UFS_UN_MAX_DIGITS];
  28. u8 lt;
  29. u8 flt;
  30. u8 eli;
  31. unsigned int ic;
  32. char s_info[512];
  33. char shi[256];
  34. bool device_stuck;
  35. };
  36. struct ufs_sec_cmd_info {
  37. u8 opcode;
  38. u32 lba;
  39. int transfer_len;
  40. u8 lun;
  41. };
  42. enum ufs_sec_wb_state {
  43. WB_OFF = 0,
  44. WB_ON
  45. };
  46. struct ufs_sec_wb_info {
  47. bool support;
  48. u64 state_ts;
  49. u64 enable_ms;
  50. u64 disable_ms;
  51. u64 amount_kb;
  52. u64 enable_cnt;
  53. u64 disable_cnt;
  54. u64 err_cnt;
  55. };
  56. enum ufs_sec_log_str_t {
  57. UFS_SEC_CMD_SEND,
  58. UFS_SEC_CMD_COMP,
  59. UFS_SEC_QUERY_SEND,
  60. UFS_SEC_QUERY_COMP,
  61. UFS_SEC_NOP_SEND,
  62. UFS_SEC_NOP_COMP,
  63. UFS_SEC_TM_SEND,
  64. UFS_SEC_TM_COMP,
  65. UFS_SEC_TM_ERR,
  66. UFS_SEC_UIC_SEND,
  67. UFS_SEC_UIC_COMP,
  68. };
  69. static const char * const ufs_sec_log_str[] = {
  70. [UFS_SEC_CMD_SEND] = "scsi_send",
  71. [UFS_SEC_CMD_COMP] = "scsi_cmpl",
  72. [UFS_SEC_QUERY_SEND] = "query_send",
  73. [UFS_SEC_QUERY_COMP] = "query_cmpl",
  74. [UFS_SEC_NOP_SEND] = "nop_send",
  75. [UFS_SEC_NOP_COMP] = "nop_cmpl",
  76. [UFS_SEC_TM_SEND] = "tm_send",
  77. [UFS_SEC_TM_COMP] = "tm_cmpl",
  78. [UFS_SEC_TM_ERR] = "tm_err",
  79. [UFS_SEC_UIC_SEND] = "uic_send",
  80. [UFS_SEC_UIC_COMP] = "uic_cmpl",
  81. };
  82. struct ufs_sec_cmd_log_entry {
  83. const char *str; /* ufs_sec_log_str */
  84. u8 lun;
  85. u8 cmd_id;
  86. u32 lba;
  87. int transfer_len;
  88. u8 idn; /* used only for query idn */
  89. unsigned long outstanding_reqs;
  90. unsigned int tag;
  91. u64 tstamp;
  92. };
  93. #define UFS_SEC_CMD_LOGGING_MAX 200
  94. #define UFS_SEC_CMD_LOGNODE_MAX 64
  95. struct ufs_sec_cmd_log_info {
  96. struct ufs_sec_cmd_log_entry *entries;
  97. int pos;
  98. };
  99. struct ufs_sec_feature_info {
  100. struct ufs_vendor_dev_info *vdi;
  101. struct ufs_sec_wb_info *ufs_wb;
  102. struct ufs_sec_wb_info *ufs_wb_backup;
  103. struct ufs_sec_err_info *ufs_err;
  104. struct ufs_sec_err_info *ufs_err_backup;
  105. struct ufs_sec_err_info *ufs_err_hist;
  106. struct ufs_sec_cmd_log_info *ufs_cmd_log;
  107. struct notifier_block reboot_notify;
  108. struct delayed_work noti_work;
  109. u32 ext_ufs_feature_sup;
  110. u32 last_ucmd;
  111. bool ucmd_complete;
  112. enum query_opcode last_qcmd;
  113. enum dev_cmd_type qcmd_type;
  114. bool qcmd_complete;
  115. };
  116. extern struct device *sec_ufs_node_dev;
  117. /* call by vendor module */
  118. void ufs_sec_config_features(struct ufs_hba *hba);
  119. void ufs_sec_adjust_caps_quirks(struct ufs_hba *hba);
  120. void ufs_sec_init_logging(struct device *dev);
  121. void ufs_sec_set_features(struct ufs_hba *hba);
  122. void ufs_sec_remove_features(struct ufs_hba *hba);
  123. void ufs_sec_register_vendor_hooks(void);
  124. void ufs_sec_get_health_desc(struct ufs_hba *hba);
  125. bool ufs_sec_is_wb_supported(void);
  126. int ufs_sec_wb_ctrl(bool enable);
  127. void ufs_sec_wb_register_reset_notify(void *func);
  128. inline bool ufs_sec_is_err_cnt_allowed(void);
  129. void ufs_sec_inc_hwrst_cnt(void);
  130. void ufs_sec_inc_op_err(struct ufs_hba *hba, enum ufs_event_type evt, void *data);
  131. void ufs_sec_check_device_stuck(void);
  132. void ufs_sec_print_err(void);
  133. #endif