Skip to content

Commit 2b7ed92

Browse files
author
Tzung-Bi Shih
committed
platform/chrome: cros_ec_proto: add Kunit tests for get_next_event
cros_ec_get_next_event() gets events from EC. It consists of 3 versions of event retrieval: 1. No MKBP event. 2. MKBP event version 0. 3. MKBP event version >0. Add Kunit tests for cros_ec_get_next_event(). Signed-off-by: Tzung-Bi Shih <tzungbi@kernel.org> Reviewed-by: Guenter Roeck <groeck@chromium.org> Link: https://lore.kernel.org/r/20220622041040.202737-4-tzungbi@kernel.org
1 parent 1242688 commit 2b7ed92

1 file changed

Lines changed: 266 additions & 0 deletions

File tree

drivers/platform/chrome/cros_ec_proto_test.c

Lines changed: 266 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55

66
#include <kunit/test.h>
77

8+
#include <asm-generic/unaligned.h>
89
#include <linux/platform_data/cros_ec_commands.h>
910
#include <linux/platform_data/cros_ec_proto.h>
1011

@@ -2052,6 +2053,265 @@ static void cros_ec_proto_test_cmd_xfer_status_return_error(struct kunit *test)
20522053
}
20532054
}
20542055

2056+
static void cros_ec_proto_test_get_next_event_no_mkbp_event(struct kunit *test)
2057+
{
2058+
struct cros_ec_proto_test_priv *priv = test->priv;
2059+
struct cros_ec_device *ec_dev = &priv->ec_dev;
2060+
struct ec_xfer_mock *mock;
2061+
int ret;
2062+
bool wake_event, more_events;
2063+
2064+
ec_dev->max_request = 0xff;
2065+
ec_dev->max_response = 0xee;
2066+
ec_dev->mkbp_event_supported = 0;
2067+
2068+
/* Set some garbage bytes. */
2069+
wake_event = false;
2070+
more_events = true;
2071+
2072+
/* For get_keyboard_state_event(). */
2073+
{
2074+
union ec_response_get_next_data_v1 *data;
2075+
2076+
mock = cros_kunit_ec_xfer_mock_add(test, sizeof(*data));
2077+
KUNIT_ASSERT_PTR_NE(test, mock, NULL);
2078+
2079+
data = (union ec_response_get_next_data_v1 *)mock->o_data;
2080+
data->host_event = 0xbeef;
2081+
}
2082+
2083+
ret = cros_ec_get_next_event(ec_dev, &wake_event, &more_events);
2084+
KUNIT_EXPECT_EQ(test, ret, sizeof(union ec_response_get_next_data_v1));
2085+
2086+
KUNIT_EXPECT_EQ(test, ec_dev->event_data.event_type, EC_MKBP_EVENT_KEY_MATRIX);
2087+
KUNIT_EXPECT_EQ(test, ec_dev->event_data.data.host_event, 0xbeef);
2088+
2089+
KUNIT_EXPECT_TRUE(test, wake_event);
2090+
KUNIT_EXPECT_FALSE(test, more_events);
2091+
2092+
/* For get_keyboard_state_event(). */
2093+
{
2094+
mock = cros_kunit_ec_xfer_mock_next();
2095+
KUNIT_EXPECT_PTR_NE(test, mock, NULL);
2096+
2097+
KUNIT_EXPECT_EQ(test, mock->msg.version, 0);
2098+
KUNIT_EXPECT_EQ(test, mock->msg.command, EC_CMD_MKBP_STATE);
2099+
KUNIT_EXPECT_EQ(test, mock->msg.insize, sizeof(union ec_response_get_next_data_v1));
2100+
KUNIT_EXPECT_EQ(test, mock->msg.outsize, 0);
2101+
}
2102+
}
2103+
2104+
static void cros_ec_proto_test_get_next_event_mkbp_event_ec_suspended(struct kunit *test)
2105+
{
2106+
struct cros_ec_proto_test_priv *priv = test->priv;
2107+
struct cros_ec_device *ec_dev = &priv->ec_dev;
2108+
int ret;
2109+
2110+
ec_dev->mkbp_event_supported = 1;
2111+
ec_dev->suspended = true;
2112+
2113+
ret = cros_ec_get_next_event(ec_dev, NULL, NULL);
2114+
KUNIT_EXPECT_EQ(test, ret, -EHOSTDOWN);
2115+
}
2116+
2117+
static void cros_ec_proto_test_get_next_event_mkbp_event_version0(struct kunit *test)
2118+
{
2119+
struct cros_ec_proto_test_priv *priv = test->priv;
2120+
struct cros_ec_device *ec_dev = &priv->ec_dev;
2121+
struct ec_xfer_mock *mock;
2122+
int ret;
2123+
bool wake_event, more_events;
2124+
2125+
ec_dev->max_request = 0xff;
2126+
ec_dev->max_response = 0xee;
2127+
ec_dev->mkbp_event_supported = 1;
2128+
2129+
/* Set some garbage bytes. */
2130+
wake_event = true;
2131+
more_events = false;
2132+
2133+
/* For get_next_event_xfer(). */
2134+
{
2135+
struct ec_response_get_next_event *data;
2136+
2137+
mock = cros_kunit_ec_xfer_mock_add(test, sizeof(*data));
2138+
KUNIT_ASSERT_PTR_NE(test, mock, NULL);
2139+
2140+
data = (struct ec_response_get_next_event *)mock->o_data;
2141+
data->event_type = EC_MKBP_EVENT_SENSOR_FIFO | EC_MKBP_HAS_MORE_EVENTS;
2142+
data->data.sysrq = 0xbeef;
2143+
}
2144+
2145+
ret = cros_ec_get_next_event(ec_dev, &wake_event, &more_events);
2146+
KUNIT_EXPECT_EQ(test, ret, sizeof(struct ec_response_get_next_event));
2147+
2148+
KUNIT_EXPECT_EQ(test, ec_dev->event_data.event_type, EC_MKBP_EVENT_SENSOR_FIFO);
2149+
KUNIT_EXPECT_EQ(test, ec_dev->event_data.data.sysrq, 0xbeef);
2150+
2151+
KUNIT_EXPECT_FALSE(test, wake_event);
2152+
KUNIT_EXPECT_TRUE(test, more_events);
2153+
2154+
/* For get_next_event_xfer(). */
2155+
{
2156+
mock = cros_kunit_ec_xfer_mock_next();
2157+
KUNIT_EXPECT_PTR_NE(test, mock, NULL);
2158+
2159+
KUNIT_EXPECT_EQ(test, mock->msg.version, 0);
2160+
KUNIT_EXPECT_EQ(test, mock->msg.command, EC_CMD_GET_NEXT_EVENT);
2161+
KUNIT_EXPECT_EQ(test, mock->msg.insize, sizeof(struct ec_response_get_next_event));
2162+
KUNIT_EXPECT_EQ(test, mock->msg.outsize, 0);
2163+
}
2164+
}
2165+
2166+
static void cros_ec_proto_test_get_next_event_mkbp_event_version2(struct kunit *test)
2167+
{
2168+
struct cros_ec_proto_test_priv *priv = test->priv;
2169+
struct cros_ec_device *ec_dev = &priv->ec_dev;
2170+
struct ec_xfer_mock *mock;
2171+
int ret;
2172+
bool wake_event, more_events;
2173+
2174+
ec_dev->max_request = 0xff;
2175+
ec_dev->max_response = 0xee;
2176+
ec_dev->mkbp_event_supported = 3;
2177+
2178+
/* Set some garbage bytes. */
2179+
wake_event = false;
2180+
more_events = true;
2181+
2182+
/* For get_next_event_xfer(). */
2183+
{
2184+
struct ec_response_get_next_event_v1 *data;
2185+
2186+
mock = cros_kunit_ec_xfer_mock_add(test, sizeof(*data));
2187+
KUNIT_ASSERT_PTR_NE(test, mock, NULL);
2188+
2189+
data = (struct ec_response_get_next_event_v1 *)mock->o_data;
2190+
data->event_type = EC_MKBP_EVENT_FINGERPRINT;
2191+
data->data.sysrq = 0xbeef;
2192+
}
2193+
2194+
ret = cros_ec_get_next_event(ec_dev, &wake_event, &more_events);
2195+
KUNIT_EXPECT_EQ(test, ret, sizeof(struct ec_response_get_next_event_v1));
2196+
2197+
KUNIT_EXPECT_EQ(test, ec_dev->event_data.event_type, EC_MKBP_EVENT_FINGERPRINT);
2198+
KUNIT_EXPECT_EQ(test, ec_dev->event_data.data.sysrq, 0xbeef);
2199+
2200+
KUNIT_EXPECT_TRUE(test, wake_event);
2201+
KUNIT_EXPECT_FALSE(test, more_events);
2202+
2203+
/* For get_next_event_xfer(). */
2204+
{
2205+
mock = cros_kunit_ec_xfer_mock_next();
2206+
KUNIT_EXPECT_PTR_NE(test, mock, NULL);
2207+
2208+
KUNIT_EXPECT_EQ(test, mock->msg.version, 2);
2209+
KUNIT_EXPECT_EQ(test, mock->msg.command, EC_CMD_GET_NEXT_EVENT);
2210+
KUNIT_EXPECT_EQ(test, mock->msg.insize,
2211+
sizeof(struct ec_response_get_next_event_v1));
2212+
KUNIT_EXPECT_EQ(test, mock->msg.outsize, 0);
2213+
}
2214+
}
2215+
2216+
static void cros_ec_proto_test_get_next_event_mkbp_event_host_event_rtc(struct kunit *test)
2217+
{
2218+
struct cros_ec_proto_test_priv *priv = test->priv;
2219+
struct cros_ec_device *ec_dev = &priv->ec_dev;
2220+
struct ec_xfer_mock *mock;
2221+
int ret;
2222+
bool wake_event;
2223+
struct ec_response_get_next_event_v1 *data;
2224+
2225+
ec_dev->max_request = 0xff;
2226+
ec_dev->max_response = 0xee;
2227+
ec_dev->mkbp_event_supported = 3;
2228+
ec_dev->host_event_wake_mask = U32_MAX;
2229+
2230+
/* Set some garbage bytes. */
2231+
wake_event = true;
2232+
2233+
/* For get_next_event_xfer(). */
2234+
{
2235+
mock = cros_kunit_ec_xfer_mock_add(test,
2236+
sizeof(data->event_type) +
2237+
sizeof(data->data.host_event));
2238+
KUNIT_ASSERT_PTR_NE(test, mock, NULL);
2239+
2240+
data = (struct ec_response_get_next_event_v1 *)mock->o_data;
2241+
data->event_type = EC_MKBP_EVENT_HOST_EVENT;
2242+
put_unaligned_le32(EC_HOST_EVENT_MASK(EC_HOST_EVENT_RTC), &data->data.host_event);
2243+
}
2244+
2245+
ret = cros_ec_get_next_event(ec_dev, &wake_event, NULL);
2246+
KUNIT_EXPECT_EQ(test, ret, sizeof(data->event_type) + sizeof(data->data.host_event));
2247+
2248+
KUNIT_EXPECT_EQ(test, ec_dev->event_data.event_type, EC_MKBP_EVENT_HOST_EVENT);
2249+
2250+
KUNIT_EXPECT_FALSE(test, wake_event);
2251+
2252+
/* For get_next_event_xfer(). */
2253+
{
2254+
mock = cros_kunit_ec_xfer_mock_next();
2255+
KUNIT_EXPECT_PTR_NE(test, mock, NULL);
2256+
2257+
KUNIT_EXPECT_EQ(test, mock->msg.version, 2);
2258+
KUNIT_EXPECT_EQ(test, mock->msg.command, EC_CMD_GET_NEXT_EVENT);
2259+
KUNIT_EXPECT_EQ(test, mock->msg.insize,
2260+
sizeof(struct ec_response_get_next_event_v1));
2261+
KUNIT_EXPECT_EQ(test, mock->msg.outsize, 0);
2262+
}
2263+
}
2264+
2265+
static void cros_ec_proto_test_get_next_event_mkbp_event_host_event_masked(struct kunit *test)
2266+
{
2267+
struct cros_ec_proto_test_priv *priv = test->priv;
2268+
struct cros_ec_device *ec_dev = &priv->ec_dev;
2269+
struct ec_xfer_mock *mock;
2270+
int ret;
2271+
bool wake_event;
2272+
struct ec_response_get_next_event_v1 *data;
2273+
2274+
ec_dev->max_request = 0xff;
2275+
ec_dev->max_response = 0xee;
2276+
ec_dev->mkbp_event_supported = 3;
2277+
ec_dev->host_event_wake_mask = U32_MAX & ~EC_HOST_EVENT_MASK(EC_HOST_EVENT_AC_DISCONNECTED);
2278+
2279+
/* Set some garbage bytes. */
2280+
wake_event = true;
2281+
2282+
/* For get_next_event_xfer(). */
2283+
{
2284+
mock = cros_kunit_ec_xfer_mock_add(test,
2285+
sizeof(data->event_type) +
2286+
sizeof(data->data.host_event));
2287+
KUNIT_ASSERT_PTR_NE(test, mock, NULL);
2288+
2289+
data = (struct ec_response_get_next_event_v1 *)mock->o_data;
2290+
data->event_type = EC_MKBP_EVENT_HOST_EVENT;
2291+
put_unaligned_le32(EC_HOST_EVENT_MASK(EC_HOST_EVENT_AC_DISCONNECTED),
2292+
&data->data.host_event);
2293+
}
2294+
2295+
ret = cros_ec_get_next_event(ec_dev, &wake_event, NULL);
2296+
KUNIT_EXPECT_EQ(test, ret, sizeof(data->event_type) + sizeof(data->data.host_event));
2297+
2298+
KUNIT_EXPECT_EQ(test, ec_dev->event_data.event_type, EC_MKBP_EVENT_HOST_EVENT);
2299+
2300+
KUNIT_EXPECT_FALSE(test, wake_event);
2301+
2302+
/* For get_next_event_xfer(). */
2303+
{
2304+
mock = cros_kunit_ec_xfer_mock_next();
2305+
KUNIT_EXPECT_PTR_NE(test, mock, NULL);
2306+
2307+
KUNIT_EXPECT_EQ(test, mock->msg.version, 2);
2308+
KUNIT_EXPECT_EQ(test, mock->msg.command, EC_CMD_GET_NEXT_EVENT);
2309+
KUNIT_EXPECT_EQ(test, mock->msg.insize,
2310+
sizeof(struct ec_response_get_next_event_v1));
2311+
KUNIT_EXPECT_EQ(test, mock->msg.outsize, 0);
2312+
}
2313+
}
2314+
20552315
static void cros_ec_proto_test_release(struct device *dev)
20562316
{
20572317
}
@@ -2135,6 +2395,12 @@ static struct kunit_case cros_ec_proto_test_cases[] = {
21352395
KUNIT_CASE(cros_ec_proto_test_cmd_xfer_status_normal),
21362396
KUNIT_CASE(cros_ec_proto_test_cmd_xfer_status_xfer_error),
21372397
KUNIT_CASE(cros_ec_proto_test_cmd_xfer_status_return_error),
2398+
KUNIT_CASE(cros_ec_proto_test_get_next_event_no_mkbp_event),
2399+
KUNIT_CASE(cros_ec_proto_test_get_next_event_mkbp_event_ec_suspended),
2400+
KUNIT_CASE(cros_ec_proto_test_get_next_event_mkbp_event_version0),
2401+
KUNIT_CASE(cros_ec_proto_test_get_next_event_mkbp_event_version2),
2402+
KUNIT_CASE(cros_ec_proto_test_get_next_event_mkbp_event_host_event_rtc),
2403+
KUNIT_CASE(cros_ec_proto_test_get_next_event_mkbp_event_host_event_masked),
21382404
{}
21392405
};
21402406

0 commit comments

Comments
 (0)