blob: f382aa072222b03118ee85c450ac7b0522127393 [file] [log] [blame]
/*
* Copyright (c) 2020, Mediatek Inc. All rights reserved.
*
* SPDX-License-Identifier: BSD-3-Clause
*/
#ifndef UFS_H_
#define UFS_H_
#include "ioctl.h"
#include "scsi_bsg_util.h"
#define BLOCK_SIZE 512
/*
* Generally the max HW max chunk is 512KB,
* but in order to be in safe side tool using 256KB as max chunk size
* between user and kernel space
*/
#define MAX_IOCTL_BUF_SIZE (256L * 1024)
enum sg_struct_type {
SG4_TYPE = 0,
SG3_TYPE
};
/* Flag idn for Query Requests*/
enum flag_idn {
QUERY_FLAG_IDN_RESERVED1 = 0x00,
QUERY_FLAG_IDN_FDEVICEINIT = 0x01,
QUERY_FLAG_IDN_PERMANENT_WPE = 0x02,
QUERY_FLAG_IDN_PWR_ON_WPE = 0x03,
QUERY_FLAG_IDN_BKOPS_EN = 0x04,
QUERY_FLAG_IDN_DEVICE_LIFE_SPAN_MODE_EN = 0x05,
QUERY_FLAG_IDN_PURGE_ENABLE = 0x06,
QUERY_FLAG_IDN_REFRESH_ENABLE = 0x07,
QUERY_FLAG_IDN_FPHYRESOURCEREMOVAL = 0x08,
QUERY_FLAG_IDN_BUSY_RTC = 0x09,
QUERY_FLAG_IDN_RESERVED4 = 0x0A,
QUERY_FLAG_IDN_PERMANENTLYDISABLEFW = 0x0B,
QUERY_FLAG_IDN_WB_EN = 0x0E,
QUERY_FLAG_IDN_WB_BUF_FLUSH_EN = 0x0F,
QUERY_FLAG_IDN_WB_BUF_FLUSH_H8 = 0x10,
QUERY_FLAG_IDN_HPB_RESET = 0x11,
QUERY_FLAG_IDN_HPB_EN = 0x12,
QUERY_FLAG_IDN_MAX
};
/* Attribute idn for Query requests */
enum attr_idn {
QUERY_ATTR_IDN_BOOT_LU_EN = 0x00,
QUERY_ATTR_IDN_RESERVED1 = 0x01,
QUERY_ATTR_IDN_POWER_MODE = 0x02,
QUERY_ATTR_IDN_ACTIVE_ICC_LVL = 0x03,
QUERY_ATTR_IDN_OOO_DATA_EN = 0x04,
QUERY_ATTR_IDN_BKOPS_STATUS = 0x05,
QUERY_ATTR_IDN_PURGE_STATUS = 0x06,
QUERY_ATTR_IDN_MAX_DATA_IN = 0x07,
QUERY_ATTR_IDN_MAX_DATA_OUT = 0x08,
QUERY_ATTR_IDN_DYN_CAP_NEEDED = 0x09,
QUERY_ATTR_IDN_REF_CLK_FREQ = 0x0A,
QUERY_ATTR_IDN_CONF_DESC_LOCK = 0x0B,
QUERY_ATTR_IDN_MAX_NUM_OF_RTT = 0x0C,
QUERY_ATTR_IDN_EE_CONTROL = 0x0D,
QUERY_ATTR_IDN_EE_STATUS = 0x0E,
QUERY_ATTR_IDN_SECONDS_PASSED = 0x0F,
QUERY_ATTR_IDN_CNTX_CONF = 0x10,
QUERY_ATTR_IDN_OBSOLETE = 0x11,
QUERY_ATTR_IDN_RESERVED2 = 0x12,
QUERY_ATTR_IDN_RESERVED3 = 0x13,
QUERY_ATTR_IDN_DEVICE_FFU_STATUS = 0x14,
QUERY_ATTR_IDN_DEVICE_PSA_STATE = 0x15,
QUERY_ATTR_IDN_DEVICE_PSA_DATA_SIZE = 0x16,
QUERY_ATTR_IDN_CASE_REF_CLK_GATING_WAIT_TIME = 0x17,
QUERY_ATTR_IDN_CASE_ROUGH_TEMPERAURE = 0x18,
QUERY_ATTR_IDN_TOO_HIGH_TEMP_BOUNDARY = 0x19,
QUERY_ATTR_IDN_TOO_LOW_TEMP_BOUNDARY = 0x1A,
QUERY_ATTR_IDN_THROTTLING_STAT = 0x1B,
QUERY_ATTR_IDN_WB_FLUSH_STAT = 0x1C,
QUERY_ATTR_IDN_WB_BUF_SIZE = 0x1D,
QUERY_ATTR_IDN_WB_LIFE_TIME_EST = 0x1E,
QUERY_ATTR_IDN_WB_CUR_BUF_SIZE = 0x1F,
QUERY_ATTR_IDN_REFRESH_STATUS = 0x2C,
QUERY_ATTR_IDN_REFRESH_FREQ = 0x2D,
QUERY_ATTR_IDN_REFRESH_UNIT = 0x2E,
QUERY_ATTR_IDN_REFRESH_METHOD = 0x2F,
QUERY_ATTR_IDN_MAX
};
/* Descriptor idn for Query requests */
enum desc_idn {
QUERY_DESC_IDN_DEVICE = 0x0,
QUERY_DESC_IDN_CONFIGURAION = 0x1,
QUERY_DESC_IDN_UNIT = 0x2,
QUERY_DESC_IDN_RFU_0 = 0x3,
QUERY_DESC_IDN_INTERCONNECT = 0x4,
QUERY_DESC_IDN_STRING = 0x5,
QUERY_DESC_IDN_RFU_1 = 0x6,
QUERY_DESC_IDN_GEOMETRY = 0x7,
QUERY_DESC_IDN_POWER = 0x8,
QUERY_DESC_IDN_HEALTH = 0x9,
QUERY_DESC_IDN_RFU_3 = 0xA,
QUERY_DESC_IDN_MAX = 0xFF,
};
/* UTP QUERY Transaction Specific Fields OpCode */
enum query_opcode {
UPIU_QUERY_OPCODE_NOP = 0x0,
UPIU_QUERY_OPCODE_READ_DESC = 0x1,
UPIU_QUERY_OPCODE_WRITE_DESC = 0x2,
UPIU_QUERY_OPCODE_READ_ATTR = 0x3,
UPIU_QUERY_OPCODE_WRITE_ATTR = 0x4,
UPIU_QUERY_OPCODE_READ_FLAG = 0x5,
UPIU_QUERY_OPCODE_SET_FLAG = 0x6,
UPIU_QUERY_OPCODE_CLEAR_FLAG = 0x7,
UPIU_QUERY_OPCODE_TOGGLE_FLAG = 0x8,
UPIU_QUERY_OPCODE_MAX,
};
enum ufs_desc_max_size {
/* Max descriptors size from 2.1 to 3.0 UFS spec */
QUERY_DESC_DEVICE_MAX_SIZE_3_0 = 0x40,
QUERY_DESC_CONFIGURAION_MAX_SIZE_3_0 = 0x90,
QUERY_DESC_UNIT_MAX_SIZE_3_0 = 0x23,
QUERY_DESC_GEOMETRY_MAX_SIZE_3_0 = 0x48,
QUERY_DESC_HEALTH_MAX_SIZE_2_1 = 0x25,
/* Max descriptors size for 3.1 UFS spec */
QUERY_DESC_DEVICE_MAX_SIZE = 0x59,
QUERY_DESC_CONFIGURAION_MAX_SIZE = 0xe6,
QUERY_DESC_GEOMETRY_MAX_SIZE = 0x57,
QUERY_DESC_UNIT_MAX_SIZE = 0x2d,
/*
* Max. 126 UNICODE characters (2 bytes per character) plus 2 bytes
* of descriptor header.
*/
QUERY_DESC_STRING_MAX_SIZE = 0xFE,
QUERY_DESC_INTERCONNECT_MAX_SIZE = 0x06,
QUERY_DESC_POWER_MAX_SIZE = 0x62,
QUERY_DESC_HEALTH_MAX_SIZE = 0x2d
};
/* UPIU Read/Write flags */
enum {
UPIU_CMD_FLAGS_NONE = 0x00,
UPIU_CMD_FLAGS_WRITE = 0x20,
UPIU_CMD_FLAGS_READ = 0x40,
};
/* UPIU Query request function */
enum {
UPIU_QUERY_FUNC_STANDARD_READ_REQUEST = 0x01,
UPIU_QUERY_FUNC_STANDARD_WRITE_REQUEST = 0x81,
};
enum ufs_cong_type {
DESC_TYPE = 0,
ATTR_TYPE,
FLAG_TYPE,
ERR_HIST_TYPE,
UIC_TYPE,
FFU_TYPE,
VENDOR_BUFFER_TYPE,
RPMB_CMD_TYPE,
HMR_TYPE
};
/* UTP UPIU Transaction Codes Initiator to Target */
enum {
UPIU_TRANSACTION_NOP_OUT = 0x00,
UPIU_TRANSACTION_COMMAND = 0x01,
UPIU_TRANSACTION_DATA_OUT = 0x02,
UPIU_TRANSACTION_TASK_REQ = 0x04,
UPIU_TRANSACTION_QUERY_REQ = 0x16,
};
int write_file(const char *name, const void *buffer, int length);
void print_error(const char *msg, ...);
void print_warn(const char *msg, ...);
long str_to_long(char *nptr, int base, long *result);
#ifdef DEBUG
#define WRITE_LOG(format, ...) fprintf(stderr, format"\n", __VA_ARGS__)
#define WRITE_LOG0(text) fprintf(stderr, "%s\n", text)
#else
#define WRITE_LOG(...)
#define WRITE_LOG0(...)
#endif
#endif /* UFS_H_ */