87 lines
2.4 KiB
C
87 lines
2.4 KiB
C
|
|
// 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
|