@ -755,6 +755,157 @@ static void ufstest_query_attr_request(void *obj, void *data,
ufs_exit ( ufs , alloc ) ;
}
static void ufstest_query_desc_request ( void * obj , void * data ,
QGuestAllocator * alloc )
{
QUfs * ufs = obj ;
UtpTransferReqDesc utrd ;
UtpUpiuRsp rsp_upiu ;
ufs_init ( ufs , alloc ) ;
/* Write Descriptor is not supported yet */
/* Read Device Descriptor */
ufs_send_query ( ufs , 0 , UFS_UPIU_QUERY_FUNC_STANDARD_READ_REQUEST ,
UFS_UPIU_QUERY_OPCODE_READ_DESC , UFS_QUERY_DESC_IDN_DEVICE ,
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_DESC ) ;
g_assert_cmpuint ( rsp_upiu . qr . idn , = = , UFS_QUERY_DESC_IDN_DEVICE ) ;
g_assert_cmpuint ( rsp_upiu . qr . data [ 0 ] , = = , sizeof ( DeviceDescriptor ) ) ;
g_assert_cmpuint ( rsp_upiu . qr . data [ 1 ] , = = , UFS_QUERY_DESC_IDN_DEVICE ) ;
/* Read Configuration Descriptor is not supported yet*/
/* Read Unit Descriptor */
ufs_send_query ( ufs , 0 , UFS_UPIU_QUERY_FUNC_STANDARD_READ_REQUEST ,
UFS_UPIU_QUERY_OPCODE_READ_DESC , UFS_QUERY_DESC_IDN_UNIT , 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 . data [ 0 ] , = = , sizeof ( UnitDescriptor ) ) ;
g_assert_cmpuint ( rsp_upiu . qr . data [ 1 ] , = = , UFS_QUERY_DESC_IDN_UNIT ) ;
g_assert_cmpuint ( rsp_upiu . qr . data [ 2 ] , = = , 0 ) ;
ufs_send_query ( ufs , 0 , UFS_UPIU_QUERY_FUNC_STANDARD_READ_REQUEST ,
UFS_UPIU_QUERY_OPCODE_READ_DESC , UFS_QUERY_DESC_IDN_UNIT , 1 ,
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 . data [ 0 ] , = = , sizeof ( UnitDescriptor ) ) ;
g_assert_cmpuint ( rsp_upiu . qr . data [ 1 ] , = = , UFS_QUERY_DESC_IDN_UNIT ) ;
g_assert_cmpuint ( rsp_upiu . qr . data [ 2 ] , = = , 1 ) ;
ufs_send_query ( ufs , 0 , UFS_UPIU_QUERY_FUNC_STANDARD_READ_REQUEST ,
UFS_UPIU_QUERY_OPCODE_READ_DESC , UFS_QUERY_DESC_IDN_UNIT ,
UFS_UPIU_RPMB_WLUN , 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 . data [ 0 ] , = = , sizeof ( RpmbUnitDescriptor ) ) ;
g_assert_cmpuint ( rsp_upiu . qr . data [ 1 ] , = = , UFS_QUERY_DESC_IDN_UNIT ) ;
g_assert_cmpuint ( rsp_upiu . qr . data [ 2 ] , = = , UFS_UPIU_RPMB_WLUN ) ;
/* Read Interconnect Descriptor */
ufs_send_query ( ufs , 0 , UFS_UPIU_QUERY_FUNC_STANDARD_READ_REQUEST ,
UFS_UPIU_QUERY_OPCODE_READ_DESC ,
UFS_QUERY_DESC_IDN_INTERCONNECT , 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 . data [ 0 ] , = = , sizeof ( InterconnectDescriptor ) ) ;
g_assert_cmpuint ( rsp_upiu . qr . data [ 1 ] , = = , UFS_QUERY_DESC_IDN_INTERCONNECT ) ;
/* Read String Descriptor */
ufs_send_query ( ufs , 0 , UFS_UPIU_QUERY_FUNC_STANDARD_READ_REQUEST ,
UFS_UPIU_QUERY_OPCODE_READ_DESC , UFS_QUERY_DESC_IDN_STRING ,
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 . data [ 0 ] , = = , 0x12 ) ;
g_assert_cmpuint ( rsp_upiu . qr . data [ 1 ] , = = , UFS_QUERY_DESC_IDN_STRING ) ;
ufs_send_query ( ufs , 0 , UFS_UPIU_QUERY_FUNC_STANDARD_READ_REQUEST ,
UFS_UPIU_QUERY_OPCODE_READ_DESC , UFS_QUERY_DESC_IDN_STRING ,
1 , 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 . data [ 0 ] , = = , 0x22 ) ;
g_assert_cmpuint ( rsp_upiu . qr . data [ 1 ] , = = , UFS_QUERY_DESC_IDN_STRING ) ;
ufs_send_query ( ufs , 0 , UFS_UPIU_QUERY_FUNC_STANDARD_READ_REQUEST ,
UFS_UPIU_QUERY_OPCODE_READ_DESC , UFS_QUERY_DESC_IDN_STRING ,
4 , 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 . data [ 0 ] , = = , 0x0a ) ;
g_assert_cmpuint ( rsp_upiu . qr . data [ 1 ] , = = , UFS_QUERY_DESC_IDN_STRING ) ;
/* Read Geometry Descriptor */
ufs_send_query ( ufs , 0 , UFS_UPIU_QUERY_FUNC_STANDARD_READ_REQUEST ,
UFS_UPIU_QUERY_OPCODE_READ_DESC , UFS_QUERY_DESC_IDN_GEOMETRY ,
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 . data [ 0 ] , = = , sizeof ( GeometryDescriptor ) ) ;
g_assert_cmpuint ( rsp_upiu . qr . data [ 1 ] , = = , UFS_QUERY_DESC_IDN_GEOMETRY ) ;
/* Read Power Descriptor */
ufs_send_query ( ufs , 0 , UFS_UPIU_QUERY_FUNC_STANDARD_READ_REQUEST ,
UFS_UPIU_QUERY_OPCODE_READ_DESC , UFS_QUERY_DESC_IDN_POWER , 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 . data [ 0 ] , = = ,
sizeof ( PowerParametersDescriptor ) ) ;
g_assert_cmpuint ( rsp_upiu . qr . data [ 1 ] , = = , UFS_QUERY_DESC_IDN_POWER ) ;
/* Read Health Descriptor */
ufs_send_query ( ufs , 0 , UFS_UPIU_QUERY_FUNC_STANDARD_READ_REQUEST ,
UFS_UPIU_QUERY_OPCODE_READ_DESC , UFS_QUERY_DESC_IDN_HEALTH ,
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 . data [ 0 ] , = = , sizeof ( DeviceHealthDescriptor ) ) ;
g_assert_cmpuint ( rsp_upiu . qr . data [ 1 ] , = = , UFS_QUERY_DESC_IDN_HEALTH ) ;
/* Invalid Index (Intended Failure) */
ufs_send_query ( ufs , 0 , UFS_UPIU_QUERY_FUNC_STANDARD_READ_REQUEST ,
UFS_UPIU_QUERY_OPCODE_READ_DESC , UFS_QUERY_DESC_IDN_UNIT , 4 ,
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_INVALID_INDEX ) ;
ufs_send_query ( ufs , 0 , UFS_UPIU_QUERY_FUNC_STANDARD_READ_REQUEST ,
UFS_UPIU_QUERY_OPCODE_READ_DESC , UFS_QUERY_DESC_IDN_STRING ,
5 , 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_INVALID_INDEX ) ;
/* Invalid Selector (Intended Failure) */
ufs_send_query ( ufs , 0 , UFS_UPIU_QUERY_FUNC_STANDARD_READ_REQUEST ,
UFS_UPIU_QUERY_OPCODE_READ_DESC , UFS_QUERY_DESC_IDN_DEVICE ,
0 , 1 , 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_INVALID_SELECTOR ) ;
ufs_send_query ( ufs , 0 , UFS_UPIU_QUERY_FUNC_STANDARD_READ_REQUEST ,
UFS_UPIU_QUERY_OPCODE_READ_DESC , UFS_QUERY_DESC_IDN_STRING ,
0 , 1 , 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_INVALID_SELECTOR ) ;
ufs_exit ( ufs , alloc ) ;
}
static void drive_destroy ( void * path )
{
unlink ( path ) ;
@ -826,6 +977,8 @@ static void ufs_register_nodes(void)
ufstest_query_flag_request , & io_test_opts ) ;
qos_add_test ( " attr read-write " , " ufs " ,
ufstest_query_attr_request , & io_test_opts ) ;
qos_add_test ( " desc read-write " , " ufs " ,
ufstest_query_desc_request , & io_test_opts ) ;
}
libqos_init ( ufs_register_nodes ) ;