Merge patch series "UFS Advanced RPMB"

Bean Huo <beanhuo@iokpp.de> says:

This series of changes is to add support for UFS advanced RPMB in
ufs_bsg. The advanced RPMB application of user space is ufs_utils, the
reference code is at:

  https://github.com/beanhuo/ufs-utils-Micron/blob/ufs_arpmb/ufs_arpmb.c.

Changes to ufs_utils will be pushed to:

  https://github.com/westerndigitalcorporation/ufs-utils

Link: https://lore.kernel.org/r/20221201140437.549272-1-beanhuo@iokpp.de
Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
This commit is contained in:
Martin K. Petersen
2022-12-30 21:01:16 +00:00
6 changed files with 318 additions and 81 deletions

View File

@@ -14,10 +14,27 @@
*/
#define UFS_CDB_SIZE 16
#define UPIU_TRANSACTION_UIC_CMD 0x1F
/* uic commands are 4DW long, per UFSHCI V2.1 paragraph 5.6.1 */
#define UIC_CMD_SIZE (sizeof(__u32) * 4)
enum ufs_bsg_msg_code {
UPIU_TRANSACTION_UIC_CMD = 0x1F,
UPIU_TRANSACTION_ARPMB_CMD,
};
/* UFS RPMB Request Message Types */
enum ufs_rpmb_op_type {
UFS_RPMB_WRITE_KEY = 0x01,
UFS_RPMB_READ_CNT = 0x02,
UFS_RPMB_WRITE = 0x03,
UFS_RPMB_READ = 0x04,
UFS_RPMB_READ_RESP = 0x05,
UFS_RPMB_SEC_CONF_WRITE = 0x06,
UFS_RPMB_SEC_CONF_READ = 0x07,
UFS_RPMB_PURGE_ENABLE = 0x08,
UFS_RPMB_PURGE_STATUS_READ = 0x09,
};
/**
* struct utp_upiu_header - UPIU header structure
* @dword_0: UPIU header DW-0
@@ -79,6 +96,23 @@ struct utp_upiu_req {
};
};
struct ufs_arpmb_meta {
__u16 req_resp_type;
__u8 nonce[16];
__u32 write_counter;
__u16 addr_lun;
__u16 block_count;
__u16 result;
} __attribute__((__packed__));
struct ufs_ehs {
__u8 length;
__u8 ehs_type;
__u16 ehssub_type;
struct ufs_arpmb_meta meta;
__u8 mac_key[32];
} __attribute__((__packed__));
/* request (CDB) structure of the sg_io_v4 */
struct ufs_bsg_request {
__u32 msgcode;
@@ -95,11 +129,21 @@ struct ufs_bsg_reply {
* msg and status fields. The per-msgcode reply structure
* will contain valid data.
*/
__u32 result;
int result;
/* If there was reply_payload, how much was received? */
__u32 reply_payload_rcv_len;
struct utp_upiu_req upiu_rsp;
};
struct ufs_rpmb_request {
struct ufs_bsg_request bsg_request;
struct ufs_ehs ehs_req;
};
struct ufs_rpmb_reply {
struct ufs_bsg_reply bsg_reply;
struct ufs_ehs ehs_rsp;
};
#endif /* UFS_BSG_H */