139 lines
3.3 KiB
C
139 lines
3.3 KiB
C
|
// SPDX-License-Identifier: GPL-2.0
|
||
|
/*
|
||
|
* Samsung Specific feature
|
||
|
*
|
||
|
* Copyright (C) 2021 Samsung Electronics Co., Ltd.
|
||
|
*
|
||
|
* Authors:
|
||
|
* Storage Driver <storage.sec@samsung.com>
|
||
|
*/
|
||
|
|
||
|
#ifndef __UFS_SEC_FEATURE_H__
|
||
|
#define __UFS_SEC_FEATURE_H__
|
||
|
|
||
|
#include "ufshcd.h"
|
||
|
|
||
|
/* unique number */
|
||
|
#define SERIAL_NUM_SIZE 7
|
||
|
|
||
|
/* the user LU for mtk solution is set as 2 */
|
||
|
#define UFS_USER_LUN 2
|
||
|
|
||
|
#define SEC_UFS_ERR_COUNT_INC(count, max) ((count) += ((count) < (max)) ? 1 : 0)
|
||
|
|
||
|
struct SEC_UFS_op_count {
|
||
|
unsigned int HW_RESET_count;
|
||
|
unsigned int link_startup_count;
|
||
|
unsigned int Hibern8_enter_count;
|
||
|
unsigned int Hibern8_exit_count;
|
||
|
unsigned int op_err;
|
||
|
};
|
||
|
|
||
|
struct SEC_UFS_UIC_err_count {
|
||
|
u8 PA_ERR_cnt;
|
||
|
u8 DL_PA_INIT_ERROR_cnt;
|
||
|
u8 DL_NAC_RECEIVED_ERROR_cnt;
|
||
|
u8 DL_TC_REPLAY_ERROR_cnt;
|
||
|
u8 NL_ERROR_cnt;
|
||
|
u8 TL_ERROR_cnt;
|
||
|
u8 DME_ERROR_cnt;
|
||
|
unsigned int UIC_err;
|
||
|
unsigned int PA_ERR_linereset;
|
||
|
unsigned int PA_ERR_lane[3];
|
||
|
};
|
||
|
|
||
|
struct SEC_UFS_Fatal_err_count {
|
||
|
u8 DFE; // Device_Fatal
|
||
|
u8 CFE; // Controller_Fatal
|
||
|
u8 SBFE; // System_Bus_Fatal
|
||
|
u8 CEFE; // Crypto_Engine_Fatal
|
||
|
u8 LLE; // Link Lost
|
||
|
unsigned int Fatal_err;
|
||
|
};
|
||
|
|
||
|
struct SEC_UFS_UTP_count {
|
||
|
u8 UTMR_query_task_count;
|
||
|
u8 UTMR_abort_task_count;
|
||
|
u8 UTMR_logical_reset_count;
|
||
|
u8 UTR_read_err;
|
||
|
u8 UTR_write_err;
|
||
|
u8 UTR_sync_cache_err;
|
||
|
u8 UTR_unmap_err;
|
||
|
u8 UTR_etc_err;
|
||
|
unsigned int UTP_err;
|
||
|
};
|
||
|
|
||
|
struct SEC_UFS_UIC_cmd_count {
|
||
|
u8 DME_GET_err;
|
||
|
u8 DME_SET_err;
|
||
|
u8 DME_PEER_GET_err;
|
||
|
u8 DME_PEER_SET_err;
|
||
|
u8 DME_POWERON_err;
|
||
|
u8 DME_POWEROFF_err;
|
||
|
u8 DME_ENABLE_err;
|
||
|
u8 DME_RESET_err;
|
||
|
u8 DME_END_PT_RST_err;
|
||
|
u8 DME_LINK_STARTUP_err;
|
||
|
u8 DME_HIBER_ENTER_err;
|
||
|
u8 DME_HIBER_EXIT_err;
|
||
|
u8 DME_TEST_MODE_err;
|
||
|
unsigned int UIC_cmd_err;
|
||
|
};
|
||
|
|
||
|
struct SEC_UFS_QUERY_count {
|
||
|
u8 NOP_err;
|
||
|
u8 R_Desc_err;
|
||
|
u8 W_Desc_err;
|
||
|
u8 R_Attr_err;
|
||
|
u8 W_Attr_err;
|
||
|
u8 R_Flag_err;
|
||
|
u8 Set_Flag_err;
|
||
|
u8 Clear_Flag_err;
|
||
|
u8 Toggle_Flag_err;
|
||
|
unsigned int Query_err;
|
||
|
};
|
||
|
|
||
|
struct SEC_SCSI_SENSE_count {
|
||
|
unsigned int scsi_medium_err;
|
||
|
unsigned int scsi_hw_err;
|
||
|
};
|
||
|
|
||
|
#define SEC_MAX_LBA_LOGGING 10
|
||
|
#define SEC_ISSUE_REGION_STEP (250 * 1024 / 4) /* 250MB : 1 LBA = 4KB */
|
||
|
struct SEC_SCSI_SENSE_err_log {
|
||
|
unsigned long issue_LBA_list[SEC_MAX_LBA_LOGGING];
|
||
|
unsigned int issue_LBA_count;
|
||
|
u64 issue_region_map;
|
||
|
};
|
||
|
|
||
|
struct ufs_sec_cmd_info {
|
||
|
u8 opcode;
|
||
|
u32 lba;
|
||
|
int transfer_len;
|
||
|
u8 lun;
|
||
|
};
|
||
|
|
||
|
struct ufs_sec_err_info {
|
||
|
struct SEC_UFS_op_count op_count;
|
||
|
struct SEC_UFS_UIC_err_count UIC_err_count;
|
||
|
struct SEC_UFS_Fatal_err_count Fatal_err_count;
|
||
|
struct SEC_UFS_UTP_count UTP_count;
|
||
|
struct SEC_UFS_UIC_cmd_count UIC_cmd_count;
|
||
|
struct SEC_UFS_QUERY_count query_count;
|
||
|
struct SEC_SCSI_SENSE_count sense_count;
|
||
|
struct SEC_SCSI_SENSE_err_log sense_err_log;
|
||
|
};
|
||
|
|
||
|
void ufs_sec_get_health_info(struct ufs_hba *hba);
|
||
|
void ufs_set_sec_features(struct ufs_hba *hba, u8 *str_desc_buf, u8 *desc_buf);
|
||
|
void ufs_remove_sec_features(struct ufs_hba *hba);
|
||
|
void ufs_sec_hwrst_cnt_check(void);
|
||
|
void ufs_sec_op_err_check(struct ufs_hba *hba, enum ufs_event_type evt, void *data);
|
||
|
void ufs_sec_uic_cmd_error_check(struct ufs_hba *hba, u32 cmd);
|
||
|
void ufs_sec_tm_error_check(u8 tm_cmd);
|
||
|
void ufs_sec_compl_cmd_check(struct ufs_hba *hba, struct ufshcd_lrb *lrbp);
|
||
|
void ufs_sec_print_err_info(struct ufs_hba *hba);
|
||
|
void ufs_sec_send_errinfo(struct ufs_hba *hba);
|
||
|
|
||
|
#endif
|