@@ -1535,6 +1535,151 @@ static void cros_ec_proto_test_query_all_default_wake_mask_return0(struct kunit
15351535 }
15361536}
15371537
1538+ static void cros_ec_proto_test_cmd_xfer_normal (struct kunit * test )
1539+ {
1540+ struct cros_ec_proto_test_priv * priv = test -> priv ;
1541+ struct cros_ec_device * ec_dev = & priv -> ec_dev ;
1542+ struct ec_xfer_mock * mock ;
1543+ int ret ;
1544+ struct {
1545+ struct cros_ec_command msg ;
1546+ u8 data [0x100 ];
1547+ } __packed buf ;
1548+
1549+ ec_dev -> max_request = 0xff ;
1550+ ec_dev -> max_response = 0xee ;
1551+ ec_dev -> max_passthru = 0xdd ;
1552+
1553+ buf .msg .version = 0 ;
1554+ buf .msg .command = EC_CMD_HELLO ;
1555+ buf .msg .insize = 4 ;
1556+ buf .msg .outsize = 2 ;
1557+ buf .data [0 ] = 0x55 ;
1558+ buf .data [1 ] = 0xaa ;
1559+
1560+ {
1561+ u8 * data ;
1562+
1563+ mock = cros_kunit_ec_xfer_mock_add (test , 4 );
1564+ KUNIT_ASSERT_PTR_NE (test , mock , NULL );
1565+
1566+ data = (u8 * )mock -> o_data ;
1567+ data [0 ] = 0xaa ;
1568+ data [1 ] = 0x55 ;
1569+ data [2 ] = 0xcc ;
1570+ data [3 ] = 0x33 ;
1571+ }
1572+
1573+ ret = cros_ec_cmd_xfer (ec_dev , & buf .msg );
1574+ KUNIT_EXPECT_EQ (test , ret , 4 );
1575+
1576+ {
1577+ u8 * data ;
1578+
1579+ mock = cros_kunit_ec_xfer_mock_next ();
1580+ KUNIT_EXPECT_PTR_NE (test , mock , NULL );
1581+
1582+ KUNIT_EXPECT_EQ (test , mock -> msg .version , 0 );
1583+ KUNIT_EXPECT_EQ (test , mock -> msg .command , EC_CMD_HELLO );
1584+ KUNIT_EXPECT_EQ (test , mock -> msg .insize , 4 );
1585+ KUNIT_EXPECT_EQ (test , mock -> msg .outsize , 2 );
1586+
1587+ data = (u8 * )mock -> i_data ;
1588+ KUNIT_EXPECT_EQ (test , data [0 ], 0x55 );
1589+ KUNIT_EXPECT_EQ (test , data [1 ], 0xaa );
1590+
1591+ KUNIT_EXPECT_EQ (test , buf .data [0 ], 0xaa );
1592+ KUNIT_EXPECT_EQ (test , buf .data [1 ], 0x55 );
1593+ KUNIT_EXPECT_EQ (test , buf .data [2 ], 0xcc );
1594+ KUNIT_EXPECT_EQ (test , buf .data [3 ], 0x33 );
1595+ }
1596+ }
1597+
1598+ static void cros_ec_proto_test_cmd_xfer_excess_msg_insize (struct kunit * test )
1599+ {
1600+ struct cros_ec_proto_test_priv * priv = test -> priv ;
1601+ struct cros_ec_device * ec_dev = & priv -> ec_dev ;
1602+ struct ec_xfer_mock * mock ;
1603+ int ret ;
1604+ struct {
1605+ struct cros_ec_command msg ;
1606+ u8 data [0x100 ];
1607+ } __packed buf ;
1608+
1609+ ec_dev -> max_request = 0xff ;
1610+ ec_dev -> max_response = 0xee ;
1611+ ec_dev -> max_passthru = 0xdd ;
1612+
1613+ buf .msg .version = 0 ;
1614+ buf .msg .command = EC_CMD_HELLO ;
1615+ buf .msg .insize = 0xee + 1 ;
1616+ buf .msg .outsize = 2 ;
1617+
1618+ {
1619+ mock = cros_kunit_ec_xfer_mock_add (test , 0xcc );
1620+ KUNIT_ASSERT_PTR_NE (test , mock , NULL );
1621+ }
1622+
1623+ ret = cros_ec_cmd_xfer (ec_dev , & buf .msg );
1624+ KUNIT_EXPECT_EQ (test , ret , 0xcc );
1625+
1626+ {
1627+ mock = cros_kunit_ec_xfer_mock_next ();
1628+ KUNIT_EXPECT_PTR_NE (test , mock , NULL );
1629+
1630+ KUNIT_EXPECT_EQ (test , mock -> msg .version , 0 );
1631+ KUNIT_EXPECT_EQ (test , mock -> msg .command , EC_CMD_HELLO );
1632+ KUNIT_EXPECT_EQ (test , mock -> msg .insize , 0xee );
1633+ KUNIT_EXPECT_EQ (test , mock -> msg .outsize , 2 );
1634+ }
1635+ }
1636+
1637+ static void cros_ec_proto_test_cmd_xfer_excess_msg_outsize_without_passthru (struct kunit * test )
1638+ {
1639+ struct cros_ec_proto_test_priv * priv = test -> priv ;
1640+ struct cros_ec_device * ec_dev = & priv -> ec_dev ;
1641+ int ret ;
1642+ struct {
1643+ struct cros_ec_command msg ;
1644+ u8 data [0x100 ];
1645+ } __packed buf ;
1646+
1647+ ec_dev -> max_request = 0xff ;
1648+ ec_dev -> max_response = 0xee ;
1649+ ec_dev -> max_passthru = 0xdd ;
1650+
1651+ buf .msg .version = 0 ;
1652+ buf .msg .command = EC_CMD_HELLO ;
1653+ buf .msg .insize = 4 ;
1654+ buf .msg .outsize = 0xff + 1 ;
1655+
1656+ ret = cros_ec_cmd_xfer (ec_dev , & buf .msg );
1657+ KUNIT_EXPECT_EQ (test , ret , - EMSGSIZE );
1658+ }
1659+
1660+ static void cros_ec_proto_test_cmd_xfer_excess_msg_outsize_with_passthru (struct kunit * test )
1661+ {
1662+ struct cros_ec_proto_test_priv * priv = test -> priv ;
1663+ struct cros_ec_device * ec_dev = & priv -> ec_dev ;
1664+ int ret ;
1665+ struct {
1666+ struct cros_ec_command msg ;
1667+ u8 data [0x100 ];
1668+ } __packed buf ;
1669+
1670+ ec_dev -> max_request = 0xff ;
1671+ ec_dev -> max_response = 0xee ;
1672+ ec_dev -> max_passthru = 0xdd ;
1673+
1674+ buf .msg .version = 0 ;
1675+ buf .msg .command = EC_CMD_PASSTHRU_OFFSET (CROS_EC_DEV_PD_INDEX ) + EC_CMD_HELLO ;
1676+ buf .msg .insize = 4 ;
1677+ buf .msg .outsize = 0xdd + 1 ;
1678+
1679+ ret = cros_ec_cmd_xfer (ec_dev , & buf .msg );
1680+ KUNIT_EXPECT_EQ (test , ret , - EMSGSIZE );
1681+ }
1682+
15381683static void cros_ec_proto_test_release (struct device * dev )
15391684{
15401685}
@@ -1601,6 +1746,10 @@ static struct kunit_case cros_ec_proto_test_cases[] = {
16011746 KUNIT_CASE (cros_ec_proto_test_query_all_no_host_sleep_return0 ),
16021747 KUNIT_CASE (cros_ec_proto_test_query_all_default_wake_mask_return_error ),
16031748 KUNIT_CASE (cros_ec_proto_test_query_all_default_wake_mask_return0 ),
1749+ KUNIT_CASE (cros_ec_proto_test_cmd_xfer_normal ),
1750+ KUNIT_CASE (cros_ec_proto_test_cmd_xfer_excess_msg_insize ),
1751+ KUNIT_CASE (cros_ec_proto_test_cmd_xfer_excess_msg_outsize_without_passthru ),
1752+ KUNIT_CASE (cros_ec_proto_test_cmd_xfer_excess_msg_outsize_with_passthru ),
16041753 {}
16051754};
16061755
0 commit comments