hw/ufs: ufs flag read/write test implemented
New test function "ufstest_flag_request" added, which can check one's virtual UFS device can properly read and write its flag data. It tests if reading, setting, clearing and toggling flags work properly. There are some testcases that are intended to make an error caused by permission issues. 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
7c85332a2b
commit
4aac30299b
@ -539,6 +539,87 @@ static void ufstest_read_write(void *obj, void *data, QGuestAllocator *alloc)
|
|||||||
ufs_exit(ufs, alloc);
|
ufs_exit(ufs, alloc);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void ufstest_query_flag_request(void *obj, void *data,
|
||||||
|
QGuestAllocator *alloc)
|
||||||
|
{
|
||||||
|
QUfs *ufs = obj;
|
||||||
|
|
||||||
|
UtpTransferReqDesc utrd;
|
||||||
|
UtpUpiuRsp rsp_upiu;
|
||||||
|
ufs_init(ufs, alloc);
|
||||||
|
|
||||||
|
/* Read read-only flag */
|
||||||
|
ufs_send_query(ufs, 0, UFS_UPIU_QUERY_FUNC_STANDARD_READ_REQUEST,
|
||||||
|
UFS_UPIU_QUERY_OPCODE_READ_FLAG,
|
||||||
|
UFS_QUERY_FLAG_IDN_FDEVICEINIT, 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_FLAG);
|
||||||
|
g_assert_cmpuint(rsp_upiu.qr.idn, ==, UFS_QUERY_FLAG_IDN_FDEVICEINIT);
|
||||||
|
g_assert_cmpuint(rsp_upiu.qr.value, ==, be32_to_cpu(0));
|
||||||
|
|
||||||
|
/* Flag Set, Clear, Toggle Test with fDeviceLifeSpanModeEn */
|
||||||
|
ufs_send_query(ufs, 0, UFS_UPIU_QUERY_FUNC_STANDARD_READ_REQUEST,
|
||||||
|
UFS_UPIU_QUERY_OPCODE_READ_FLAG,
|
||||||
|
UFS_QUERY_FLAG_IDN_LIFE_SPAN_MODE_ENABLE, 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, ==, be32_to_cpu(0));
|
||||||
|
|
||||||
|
ufs_send_query(ufs, 0, UFS_UPIU_QUERY_FUNC_STANDARD_WRITE_REQUEST,
|
||||||
|
UFS_UPIU_QUERY_OPCODE_SET_FLAG,
|
||||||
|
UFS_QUERY_FLAG_IDN_LIFE_SPAN_MODE_ENABLE, 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, ==, be32_to_cpu(1));
|
||||||
|
|
||||||
|
ufs_send_query(ufs, 0, UFS_UPIU_QUERY_FUNC_STANDARD_WRITE_REQUEST,
|
||||||
|
UFS_UPIU_QUERY_OPCODE_CLEAR_FLAG,
|
||||||
|
UFS_QUERY_FLAG_IDN_LIFE_SPAN_MODE_ENABLE, 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, ==, be32_to_cpu(0));
|
||||||
|
|
||||||
|
ufs_send_query(ufs, 0, UFS_UPIU_QUERY_FUNC_STANDARD_WRITE_REQUEST,
|
||||||
|
UFS_UPIU_QUERY_OPCODE_TOGGLE_FLAG,
|
||||||
|
UFS_QUERY_FLAG_IDN_LIFE_SPAN_MODE_ENABLE, 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, ==, be32_to_cpu(1));
|
||||||
|
|
||||||
|
ufs_send_query(ufs, 0, UFS_UPIU_QUERY_FUNC_STANDARD_WRITE_REQUEST,
|
||||||
|
UFS_UPIU_QUERY_OPCODE_TOGGLE_FLAG,
|
||||||
|
UFS_QUERY_FLAG_IDN_LIFE_SPAN_MODE_ENABLE, 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, ==, be32_to_cpu(0));
|
||||||
|
|
||||||
|
/* Read Write-only Flag (Intended Failure) */
|
||||||
|
ufs_send_query(ufs, 0, UFS_UPIU_QUERY_FUNC_STANDARD_READ_REQUEST,
|
||||||
|
UFS_UPIU_QUERY_OPCODE_READ_FLAG,
|
||||||
|
UFS_QUERY_FLAG_IDN_PURGE_ENABLE, 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 Flag (Intended Failure) */
|
||||||
|
ufs_send_query(ufs, 0, UFS_UPIU_QUERY_FUNC_STANDARD_WRITE_REQUEST,
|
||||||
|
UFS_UPIU_QUERY_OPCODE_SET_FLAG, UFS_QUERY_FLAG_IDN_BUSY_RTC,
|
||||||
|
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_WRITEABLE);
|
||||||
|
|
||||||
|
ufs_exit(ufs, alloc);
|
||||||
|
}
|
||||||
|
|
||||||
static void drive_destroy(void *path)
|
static void drive_destroy(void *path)
|
||||||
{
|
{
|
||||||
unlink(path);
|
unlink(path);
|
||||||
@ -606,6 +687,8 @@ static void ufs_register_nodes(void)
|
|||||||
}
|
}
|
||||||
qos_add_test("init", "ufs", ufstest_init, NULL);
|
qos_add_test("init", "ufs", ufstest_init, NULL);
|
||||||
qos_add_test("read-write", "ufs", ufstest_read_write, &io_test_opts);
|
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);
|
||||||
}
|
}
|
||||||
|
|
||||||
libqos_init(ufs_register_nodes);
|
libqos_init(ufs_register_nodes);
|
||||||
|
Loading…
Reference in New Issue
Block a user