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