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