mirror of
https://github.com/Motorhead1991/qemu.git
synced 2025-08-06 17:23:56 -06:00
hw/ufs: ufs attribute read/write test implemented
New test function "ufstest_query_attr_request" added, which can check one's virtual UFS device can properly read and write its attribute data. It tests if reading and writing attributes work properly. There are some testcases that are intended to make an error caused by writing an invalid value, allocating an invalid selector and 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
4aac30299b
commit
49ccea4be9
1 changed files with 137 additions and 0 deletions
|
@ -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);
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue