linuxOS_AP06/u-boot/drivers/ufs/ufs-rockchip-rpmb.h

87 lines
2.4 KiB
C
Raw Normal View History

2025-06-03 04:28:32 +00:00
// SPDX-License-Identifier: GPL-2.0+
/*
* Rockchip UFS Host Controller driver
*
* Copyright (C) 2024 Rockchip Electronics Co.Ltd.
*/
#ifndef _UFS_ROCKCHIP_RPMB_H
#define _UFS_ROCKCHIP_RPMB_H
#define RPMB_DATA_FRAME_SIZE 512
#define RPMB_RESP_AUTH_KEY_PROGRAM 0x0100
#define RPMB_RESP_WRITE_COUNTER_VAL_READ 0x0200
#define RPMB_RESP_AUTH_DATA_WRITE 0x0300
#define RPMB_RESP_AUTH_DATA_READ 0x0400
#define RPMB_DATA_HAM_SIZE 284
#define RPMB_STUFF_DATA_SIZE 196
#define RPMB_KEY_MAC_SIZE 32
#define RPMB_DATA_SIZE 256
#define RPMB_NONCE_SIZE 16
#define RPMB_RESULT_OK 0x00
#define RPMB_RES_NO_AUTH_KEY 0x0007
enum rpmb_op_type {
RPMB_WRITE_KEY = 0x01,
RPMB_READ_CNT = 0x02,
RPMB_WRITE = 0x03,
RPMB_READ = 0x04,
RPMB_READ_RESP = 0x05,
RPMB_SEC_CONF_WRITE = 0x06,
RPMB_SEC_CONF_READ = 0x07,
RPMB_PURGE_ENABLE = 0x08,
READ_RPMB_PURGE_STATUS = 0x09
};
struct ufs_rpmb_unit_desc_tbl {
uint8_t bLength;
uint8_t bDescriptorType;
uint8_t bUnitIndex;
uint8_t bLUEnable;
uint8_t bBootLunID;
uint8_t bLUWriteProtect;
uint8_t bLUQueueDepth;
uint8_t reserved;
uint8_t bMemoryType;
uint8_t reserved1;
uint8_t bLogicalBlockSize;
uint64_t qLogicalBlockCount;
uint32_t dEraseBlockSize;
uint8_t bProvisioningType;
uint64_t qPhyMemResourceCount;
uint8_t reserved2[3];
} __attribute__ ((packed));
struct rpmb_data_frame {
uint8_t stuff_bytes[RPMB_STUFF_DATA_SIZE];
uint8_t key_mac[RPMB_KEY_MAC_SIZE];
uint8_t data[RPMB_DATA_SIZE];
uint8_t nonce[RPMB_NONCE_SIZE];
uint8_t write_counter[4];
uint8_t address[2];
uint8_t block_count[2];
uint8_t op_result[2];
uint8_t msg_type[2];
};
extern struct lu_info_tbl rpmb_lu_info;
int ufs_rpmb_blk_read(char *blk_data, uint8_t *key, uint16_t blk_index, uint16_t block_count);
int ufs_rpmb_blk_write(char *write_data, uint8_t *key, uint16_t blk_index, uint16_t blk_count);
uint32_t ufs_rpmb_read_writecount(void);
/* @retrun 0 rpmb key unwritten */
int is_wr_ufs_rpmb_key(void);
int prepare_rpmb_lu(void);
int ufs_rpmb_init(struct ufs_hba *hba);
int ufs_rpmb_write_key(uint8_t * key, uint8_t len);
int ufs_read_device_desc(u8 *buf, u32 size);
int ufs_read_string_desc(int desc_index, u8 *buf, u32 size);
int ufs_read_geo_desc(u8 *buf, u32 size);
int ufs_read_rpmb_unit_desc(u8 *buf, u32 size);
int do_rpmb_op(struct rpmb_data_frame *frame_in, uint32_t in_cnt,
struct rpmb_data_frame *frame_out, uint32_t out_cnt);
#endif