1c16ecc08SYifeng Zhao // SPDX-License-Identifier: GPL-2.0+ 2c16ecc08SYifeng Zhao /* 3c16ecc08SYifeng Zhao * Rockchip UFS Host Controller driver 4c16ecc08SYifeng Zhao * 5c16ecc08SYifeng Zhao * Copyright (C) 2024 Rockchip Electronics Co.Ltd. 6c16ecc08SYifeng Zhao */ 7c16ecc08SYifeng Zhao 8c16ecc08SYifeng Zhao #ifndef _UFS_ROCKCHIP_RPMB_H 9c16ecc08SYifeng Zhao #define _UFS_ROCKCHIP_RPMB_H 10c16ecc08SYifeng Zhao 11c16ecc08SYifeng Zhao #define RPMB_DATA_FRAME_SIZE 512 12c16ecc08SYifeng Zhao 13c16ecc08SYifeng Zhao #define RPMB_RESP_AUTH_KEY_PROGRAM 0x0100 14c16ecc08SYifeng Zhao #define RPMB_RESP_WRITE_COUNTER_VAL_READ 0x0200 15c16ecc08SYifeng Zhao #define RPMB_RESP_AUTH_DATA_WRITE 0x0300 16c16ecc08SYifeng Zhao #define RPMB_RESP_AUTH_DATA_READ 0x0400 17c16ecc08SYifeng Zhao 18c16ecc08SYifeng Zhao #define RPMB_DATA_HAM_SIZE 284 19c16ecc08SYifeng Zhao #define RPMB_STUFF_DATA_SIZE 196 20c16ecc08SYifeng Zhao #define RPMB_KEY_MAC_SIZE 32 21c16ecc08SYifeng Zhao #define RPMB_DATA_SIZE 256 22c16ecc08SYifeng Zhao #define RPMB_NONCE_SIZE 16 23c16ecc08SYifeng Zhao #define RPMB_RESULT_OK 0x00 24c16ecc08SYifeng Zhao #define RPMB_RES_NO_AUTH_KEY 0x0007 25c16ecc08SYifeng Zhao 26c16ecc08SYifeng Zhao enum rpmb_op_type { 27c16ecc08SYifeng Zhao RPMB_WRITE_KEY = 0x01, 28c16ecc08SYifeng Zhao RPMB_READ_CNT = 0x02, 29c16ecc08SYifeng Zhao RPMB_WRITE = 0x03, 30c16ecc08SYifeng Zhao RPMB_READ = 0x04, 31c16ecc08SYifeng Zhao RPMB_READ_RESP = 0x05, 32c16ecc08SYifeng Zhao RPMB_SEC_CONF_WRITE = 0x06, 33c16ecc08SYifeng Zhao RPMB_SEC_CONF_READ = 0x07, 34c16ecc08SYifeng Zhao RPMB_PURGE_ENABLE = 0x08, 35c16ecc08SYifeng Zhao READ_RPMB_PURGE_STATUS = 0x09 36c16ecc08SYifeng Zhao }; 37c16ecc08SYifeng Zhao 38c16ecc08SYifeng Zhao struct ufs_rpmb_unit_desc_tbl { 39c16ecc08SYifeng Zhao uint8_t bLength; 40c16ecc08SYifeng Zhao uint8_t bDescriptorType; 41c16ecc08SYifeng Zhao uint8_t bUnitIndex; 42c16ecc08SYifeng Zhao uint8_t bLUEnable; 43c16ecc08SYifeng Zhao uint8_t bBootLunID; 44c16ecc08SYifeng Zhao uint8_t bLUWriteProtect; 45c16ecc08SYifeng Zhao uint8_t bLUQueueDepth; 46c16ecc08SYifeng Zhao uint8_t reserved; 47c16ecc08SYifeng Zhao uint8_t bMemoryType; 48c16ecc08SYifeng Zhao uint8_t reserved1; 49c16ecc08SYifeng Zhao uint8_t bLogicalBlockSize; 50c16ecc08SYifeng Zhao uint64_t qLogicalBlockCount; 51c16ecc08SYifeng Zhao uint32_t dEraseBlockSize; 52c16ecc08SYifeng Zhao uint8_t bProvisioningType; 53c16ecc08SYifeng Zhao uint64_t qPhyMemResourceCount; 54c16ecc08SYifeng Zhao uint8_t reserved2[3]; 55c16ecc08SYifeng Zhao } __attribute__ ((packed)); 56c16ecc08SYifeng Zhao 57c16ecc08SYifeng Zhao struct rpmb_data_frame { 58c16ecc08SYifeng Zhao uint8_t stuff_bytes[RPMB_STUFF_DATA_SIZE]; 59c16ecc08SYifeng Zhao uint8_t key_mac[RPMB_KEY_MAC_SIZE]; 60c16ecc08SYifeng Zhao uint8_t data[RPMB_DATA_SIZE]; 61c16ecc08SYifeng Zhao uint8_t nonce[RPMB_NONCE_SIZE]; 62c16ecc08SYifeng Zhao uint8_t write_counter[4]; 63c16ecc08SYifeng Zhao uint8_t address[2]; 64c16ecc08SYifeng Zhao uint8_t block_count[2]; 65c16ecc08SYifeng Zhao uint8_t op_result[2]; 66c16ecc08SYifeng Zhao uint8_t msg_type[2]; 67c16ecc08SYifeng Zhao }; 68c16ecc08SYifeng Zhao 69c16ecc08SYifeng Zhao extern struct lu_info_tbl rpmb_lu_info; 70c16ecc08SYifeng Zhao int ufs_rpmb_blk_read(char *blk_data, uint8_t *key, uint16_t blk_index, uint16_t block_count); 71c16ecc08SYifeng Zhao int ufs_rpmb_blk_write(char *write_data, uint8_t *key, uint16_t blk_index, uint16_t blk_count); 72c16ecc08SYifeng Zhao uint32_t ufs_rpmb_read_writecount(void); 73c16ecc08SYifeng Zhao /* @retrun 0 rpmb key unwritten */ 74c16ecc08SYifeng Zhao int is_wr_ufs_rpmb_key(void); 75c16ecc08SYifeng Zhao int prepare_rpmb_lu(void); 76c16ecc08SYifeng Zhao int ufs_rpmb_init(struct ufs_hba *hba); 77c16ecc08SYifeng Zhao int ufs_rpmb_write_key(uint8_t * key, uint8_t len); 78c16ecc08SYifeng Zhao 79*395c77b5SHisping Lin int ufs_read_device_desc(u8 *buf, u32 size); 80*395c77b5SHisping Lin int ufs_read_string_desc(int desc_index, u8 *buf, u32 size); 81*395c77b5SHisping Lin int ufs_read_geo_desc(u8 *buf, u32 size); 82*395c77b5SHisping Lin int ufs_read_rpmb_unit_desc(u8 *buf, u32 size); 83*395c77b5SHisping Lin int do_rpmb_op(struct rpmb_data_frame *frame_in, uint32_t in_cnt, 84*395c77b5SHisping Lin struct rpmb_data_frame *frame_out, uint32_t out_cnt); 85*395c77b5SHisping Lin 86c16ecc08SYifeng Zhao #endif 87