hw/ufs: ufs descriptor read test implemented
New test function "ufstest_query_desc_request" added, which can check one's virtual UFS device can properly read and its descriptor data. (Writing descriptors are not implemented yet.) The testcases attempt to read all kinds of descriptors at least once, except for configuration descriptors (which are not implemented yet.) There are some testcases that are intended to make an error caused by an invalid index value or an invalid selector value. Signed-off-by: Yoochan Jeong <yc01.jeong@samsung.com> Reviewed-by: Jeuk Kim <jeuk20.kim@samsung.com> Signed-off-by: Jeuk Kim <jeuk20.kim@samsung.com>
This commit is contained in:
parent
49ccea4be9
commit
9fe8e2c68a
@ -755,6 +755,157 @@ static void ufstest_query_attr_request(void *obj, void *data,
|
|||||||
ufs_exit(ufs, alloc);
|
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)
|
static void drive_destroy(void *path)
|
||||||
{
|
{
|
||||||
unlink(path);
|
unlink(path);
|
||||||
@ -826,6 +977,8 @@ static void ufs_register_nodes(void)
|
|||||||
ufstest_query_flag_request, &io_test_opts);
|
ufstest_query_flag_request, &io_test_opts);
|
||||||
qos_add_test("attr read-write", "ufs",
|
qos_add_test("attr read-write", "ufs",
|
||||||
ufstest_query_attr_request, &io_test_opts);
|
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);
|
libqos_init(ufs_register_nodes);
|
||||||
|
Loading…
Reference in New Issue
Block a user