@ -620,6 +620,141 @@ static void ufstest_query_flag_request(void *obj, void *data,
ufs_exit ( ufs , alloc ) ;
}
static void ufstest_query_attr_request ( void * obj , void * data ,
QGuestAllocator * alloc )
{
QUfs * ufs = obj ;
UtpTransferReqDesc utrd ;
UtpUpiuRsp rsp_upiu ;
ufs_init ( ufs , alloc ) ;
/* Read Readable Attributes*/
ufs_send_query ( ufs , 0 , UFS_UPIU_QUERY_FUNC_STANDARD_READ_REQUEST ,
UFS_UPIU_QUERY_OPCODE_READ_ATTR ,
UFS_QUERY_ATTR_IDN_BOOT_LU_EN , 0 , 0 , 0 , & utrd , & rsp_upiu ) ;
g_assert_cmpuint ( le32_to_cpu ( utrd . header . dword_2 ) , = = , UFS_OCS_SUCCESS ) ;
g_assert_cmpuint ( rsp_upiu . header . response , = = , UFS_COMMAND_RESULT_SUCCESS ) ;
g_assert_cmpuint ( rsp_upiu . qr . opcode , = = , UFS_UPIU_QUERY_OPCODE_READ_ATTR ) ;
g_assert_cmpuint ( rsp_upiu . qr . idn , = = , UFS_QUERY_ATTR_IDN_BOOT_LU_EN ) ;
g_assert_cmpuint ( rsp_upiu . qr . value , = = , cpu_to_be32 ( 0x00 ) ) ;
ufs_send_query ( ufs , 0 , UFS_UPIU_QUERY_FUNC_STANDARD_READ_REQUEST ,
UFS_UPIU_QUERY_OPCODE_READ_ATTR ,
UFS_QUERY_ATTR_IDN_BKOPS_STATUS , 0 , 0 , 0 , & utrd , & rsp_upiu ) ;
g_assert_cmpuint ( le32_to_cpu ( utrd . header . dword_2 ) , = = , UFS_OCS_SUCCESS ) ;
g_assert_cmpuint ( rsp_upiu . header . response , = = , UFS_COMMAND_RESULT_SUCCESS ) ;
g_assert_cmpuint ( rsp_upiu . qr . value , = = , cpu_to_be32 ( 0x00 ) ) ;
/* Write Writable Attributes & Read Again */
ufs_send_query ( ufs , 0 , UFS_UPIU_QUERY_FUNC_STANDARD_WRITE_REQUEST ,
UFS_UPIU_QUERY_OPCODE_WRITE_ATTR ,
UFS_QUERY_ATTR_IDN_ACTIVE_ICC_LVL , 0 , 0 , 0x03 , & utrd ,
& rsp_upiu ) ;
g_assert_cmpuint ( le32_to_cpu ( utrd . header . dword_2 ) , = = , UFS_OCS_SUCCESS ) ;
g_assert_cmpuint ( rsp_upiu . header . response , = = , UFS_COMMAND_RESULT_SUCCESS ) ;
g_assert_cmpuint ( rsp_upiu . qr . value , = = , cpu_to_be32 ( 0x03 ) ) ;
ufs_send_query ( ufs , 0 , UFS_UPIU_QUERY_FUNC_STANDARD_WRITE_REQUEST ,
UFS_UPIU_QUERY_OPCODE_WRITE_ATTR ,
UFS_QUERY_ATTR_IDN_EE_CONTROL , 0 , 0 , 0x07 , & utrd , & rsp_upiu ) ;
g_assert_cmpuint ( le32_to_cpu ( utrd . header . dword_2 ) , = = , UFS_OCS_SUCCESS ) ;
g_assert_cmpuint ( rsp_upiu . header . response , = = , UFS_COMMAND_RESULT_SUCCESS ) ;
g_assert_cmpuint ( rsp_upiu . qr . value , = = , cpu_to_be32 ( 0x07 ) ) ;
ufs_send_query ( ufs , 0 , UFS_UPIU_QUERY_FUNC_STANDARD_READ_REQUEST ,
UFS_UPIU_QUERY_OPCODE_READ_ATTR ,
UFS_QUERY_ATTR_IDN_ACTIVE_ICC_LVL , 0 , 0 , 0 , & utrd ,
& rsp_upiu ) ;
g_assert_cmpuint ( le32_to_cpu ( utrd . header . dword_2 ) , = = , UFS_OCS_SUCCESS ) ;
g_assert_cmpuint ( rsp_upiu . header . response , = = , UFS_COMMAND_RESULT_SUCCESS ) ;
g_assert_cmpuint ( rsp_upiu . qr . value , = = , cpu_to_be32 ( 0x03 ) ) ;
ufs_send_query ( ufs , 0 , UFS_UPIU_QUERY_FUNC_STANDARD_READ_REQUEST ,
UFS_UPIU_QUERY_OPCODE_READ_ATTR ,
UFS_QUERY_ATTR_IDN_EE_CONTROL , 0 , 0 , 0 , & utrd , & rsp_upiu ) ;
g_assert_cmpuint ( le32_to_cpu ( utrd . header . dword_2 ) , = = , UFS_OCS_SUCCESS ) ;
g_assert_cmpuint ( rsp_upiu . header . response , = = , UFS_COMMAND_RESULT_SUCCESS ) ;
g_assert_cmpuint ( rsp_upiu . qr . value , = = , cpu_to_be32 ( 0x07 ) ) ;
/* Write Invalid Value (Intended Error) */
ufs_send_query ( ufs , 0 , UFS_UPIU_QUERY_FUNC_STANDARD_WRITE_REQUEST ,
UFS_UPIU_QUERY_OPCODE_WRITE_ATTR ,
UFS_QUERY_ATTR_IDN_ACTIVE_ICC_LVL , 0 , 0 , 0x10 , & utrd ,
& rsp_upiu ) ;
g_assert_cmpuint ( le32_to_cpu ( utrd . header . dword_2 ) , = = ,
UFS_OCS_INVALID_CMD_TABLE_ATTR ) ;
g_assert_cmpuint ( rsp_upiu . header . response , = = ,
UFS_QUERY_RESULT_INVALID_VALUE ) ;
ufs_send_query ( ufs , 0 , UFS_UPIU_QUERY_FUNC_STANDARD_READ_REQUEST ,
UFS_UPIU_QUERY_OPCODE_READ_ATTR ,
UFS_QUERY_ATTR_IDN_ACTIVE_ICC_LVL , 0 , 0 , 0 , & utrd ,
& rsp_upiu ) ;
g_assert_cmpuint ( le32_to_cpu ( utrd . header . dword_2 ) , = = , UFS_OCS_SUCCESS ) ;
g_assert_cmpuint ( rsp_upiu . header . response , = = , UFS_COMMAND_RESULT_SUCCESS ) ;
g_assert_cmpuint ( rsp_upiu . qr . value , = = , cpu_to_be32 ( 0x03 ) ) ;
/* Read Write-Only Attribute (Intended Error) */
ufs_send_query ( ufs , 0 , UFS_UPIU_QUERY_FUNC_STANDARD_READ_REQUEST ,
UFS_UPIU_QUERY_OPCODE_READ_ATTR ,
UFS_QUERY_ATTR_IDN_SECONDS_PASSED , 0 , 0 , 0 , & utrd ,
& rsp_upiu ) ;
g_assert_cmpuint ( le32_to_cpu ( utrd . header . dword_2 ) , = = ,
UFS_OCS_INVALID_CMD_TABLE_ATTR ) ;
g_assert_cmpuint ( rsp_upiu . header . response , = = ,
UFS_QUERY_RESULT_NOT_READABLE ) ;
/* Write Read-Only Attribute (Intended Error) */
ufs_send_query ( ufs , 0 , UFS_UPIU_QUERY_FUNC_STANDARD_WRITE_REQUEST ,
UFS_UPIU_QUERY_OPCODE_WRITE_ATTR ,
UFS_QUERY_ATTR_IDN_POWER_MODE , 0 , 0 , 0x01 , & utrd , & rsp_upiu ) ;
g_assert_cmpuint ( le32_to_cpu ( utrd . header . dword_2 ) , = = ,
UFS_OCS_INVALID_CMD_TABLE_ATTR ) ;
g_assert_cmpuint ( rsp_upiu . header . response , = = ,
UFS_QUERY_RESULT_NOT_WRITEABLE ) ;
ufs_send_query ( ufs , 0 , UFS_UPIU_QUERY_FUNC_STANDARD_READ_REQUEST ,
UFS_UPIU_QUERY_OPCODE_READ_ATTR ,
UFS_QUERY_ATTR_IDN_POWER_MODE , 0 , 0 , 0 , & utrd , & rsp_upiu ) ;
g_assert_cmpuint ( le32_to_cpu ( utrd . header . dword_2 ) , = = , UFS_OCS_SUCCESS ) ;
g_assert_cmpuint ( rsp_upiu . header . response , = = , UFS_COMMAND_RESULT_SUCCESS ) ;
g_assert_cmpuint ( rsp_upiu . qr . value , = = , cpu_to_be32 ( 0x00 ) ) ;
/* Reset Written Attributes */
ufs_send_query ( ufs , 0 , UFS_UPIU_QUERY_FUNC_STANDARD_WRITE_REQUEST ,
UFS_UPIU_QUERY_OPCODE_WRITE_ATTR ,
UFS_QUERY_ATTR_IDN_ACTIVE_ICC_LVL , 0 , 0 , 0 , & utrd ,
& rsp_upiu ) ;
g_assert_cmpuint ( le32_to_cpu ( utrd . header . dword_2 ) , = = , UFS_OCS_SUCCESS ) ;
g_assert_cmpuint ( rsp_upiu . header . response , = = , UFS_COMMAND_RESULT_SUCCESS ) ;
g_assert_cmpuint ( rsp_upiu . qr . value , = = , cpu_to_be32 ( 0x00 ) ) ;
ufs_send_query ( ufs , 0 , UFS_UPIU_QUERY_FUNC_STANDARD_WRITE_REQUEST ,
UFS_UPIU_QUERY_OPCODE_WRITE_ATTR ,
UFS_QUERY_ATTR_IDN_EE_CONTROL , 0 , 0 , 0 , & utrd , & rsp_upiu ) ;
g_assert_cmpuint ( le32_to_cpu ( utrd . header . dword_2 ) , = = , UFS_OCS_SUCCESS ) ;
g_assert_cmpuint ( rsp_upiu . header . response , = = , UFS_COMMAND_RESULT_SUCCESS ) ;
g_assert_cmpuint ( rsp_upiu . qr . value , = = , cpu_to_be32 ( 0x00 ) ) ;
ufs_send_query ( ufs , 0 , UFS_UPIU_QUERY_FUNC_STANDARD_READ_REQUEST ,
UFS_UPIU_QUERY_OPCODE_READ_ATTR ,
UFS_QUERY_ATTR_IDN_ACTIVE_ICC_LVL , 0 , 0 , 0 , & utrd ,
& rsp_upiu ) ;
g_assert_cmpuint ( le32_to_cpu ( utrd . header . dword_2 ) , = = , UFS_OCS_SUCCESS ) ;
g_assert_cmpuint ( rsp_upiu . header . response , = = , UFS_COMMAND_RESULT_SUCCESS ) ;
g_assert_cmpuint ( rsp_upiu . qr . value , = = , cpu_to_be32 ( 0x00 ) ) ;
ufs_send_query ( ufs , 0 , UFS_UPIU_QUERY_FUNC_STANDARD_READ_REQUEST ,
UFS_UPIU_QUERY_OPCODE_READ_ATTR ,
UFS_QUERY_ATTR_IDN_EE_CONTROL , 0 , 0 , 0 , & utrd , & rsp_upiu ) ;
g_assert_cmpuint ( le32_to_cpu ( utrd . header . dword_2 ) , = = , UFS_OCS_SUCCESS ) ;
g_assert_cmpuint ( rsp_upiu . header . response , = = , UFS_COMMAND_RESULT_SUCCESS ) ;
g_assert_cmpuint ( rsp_upiu . qr . value , = = , cpu_to_be32 ( 0x00 ) ) ;
ufs_exit ( ufs , alloc ) ;
}
static void drive_destroy ( void * path )
{
unlink ( path ) ;
@ -689,6 +824,8 @@ static void ufs_register_nodes(void)
qos_add_test ( " read-write " , " ufs " , ufstest_read_write , & io_test_opts ) ;
qos_add_test ( " flag read-write " , " ufs " ,
ufstest_query_flag_request , & io_test_opts ) ;
qos_add_test ( " attr read-write " , " ufs " ,
ufstest_query_attr_request , & io_test_opts ) ;
}
libqos_init ( ufs_register_nodes ) ;