xref: /rk3399_rockchip-uboot/drivers/ufs/ufs-rockchip-rpmb.h (revision 395c77b5f9b45eba4468a378527c654ac1160fc0)
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