162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0-only
262306a36Sopenharmony_ci//
362306a36Sopenharmony_ci// uapi_test.c - An application of Kunit to check layout of structures exposed to user space for
462306a36Sopenharmony_ci//		 FireWire subsystem.
562306a36Sopenharmony_ci//
662306a36Sopenharmony_ci// Copyright (c) 2023 Takashi Sakamoto
762306a36Sopenharmony_ci
862306a36Sopenharmony_ci#include <kunit/test.h>
962306a36Sopenharmony_ci#include <linux/firewire-cdev.h>
1062306a36Sopenharmony_ci
1162306a36Sopenharmony_ci// Known issue added at v2.6.27 kernel.
1262306a36Sopenharmony_cistatic void structure_layout_event_response(struct kunit *test)
1362306a36Sopenharmony_ci{
1462306a36Sopenharmony_ci#if defined(CONFIG_X86_32)
1562306a36Sopenharmony_ci	// 4 bytes alignment for aggregate type including 8 bytes storage types.
1662306a36Sopenharmony_ci	KUNIT_EXPECT_EQ(test, 20, sizeof(struct fw_cdev_event_response));
1762306a36Sopenharmony_ci#else
1862306a36Sopenharmony_ci	// 8 bytes alignment for aggregate type including 8 bytes storage types.
1962306a36Sopenharmony_ci	KUNIT_EXPECT_EQ(test, 24, sizeof(struct fw_cdev_event_response));
2062306a36Sopenharmony_ci#endif
2162306a36Sopenharmony_ci
2262306a36Sopenharmony_ci	KUNIT_EXPECT_EQ(test, 0, offsetof(struct fw_cdev_event_response, closure));
2362306a36Sopenharmony_ci	KUNIT_EXPECT_EQ(test, 8, offsetof(struct fw_cdev_event_response, type));
2462306a36Sopenharmony_ci	KUNIT_EXPECT_EQ(test, 12, offsetof(struct fw_cdev_event_response, rcode));
2562306a36Sopenharmony_ci	KUNIT_EXPECT_EQ(test, 16, offsetof(struct fw_cdev_event_response, length));
2662306a36Sopenharmony_ci	KUNIT_EXPECT_EQ(test, 20, offsetof(struct fw_cdev_event_response, data));
2762306a36Sopenharmony_ci}
2862306a36Sopenharmony_ci
2962306a36Sopenharmony_ci// Added at v6.5.
3062306a36Sopenharmony_cistatic void structure_layout_event_request3(struct kunit *test)
3162306a36Sopenharmony_ci{
3262306a36Sopenharmony_ci	KUNIT_EXPECT_EQ(test, 56, sizeof(struct fw_cdev_event_request3));
3362306a36Sopenharmony_ci
3462306a36Sopenharmony_ci	KUNIT_EXPECT_EQ(test, 0, offsetof(struct fw_cdev_event_request3, closure));
3562306a36Sopenharmony_ci	KUNIT_EXPECT_EQ(test, 8, offsetof(struct fw_cdev_event_request3, type));
3662306a36Sopenharmony_ci	KUNIT_EXPECT_EQ(test, 12, offsetof(struct fw_cdev_event_request3, tcode));
3762306a36Sopenharmony_ci	KUNIT_EXPECT_EQ(test, 16, offsetof(struct fw_cdev_event_request3, offset));
3862306a36Sopenharmony_ci	KUNIT_EXPECT_EQ(test, 24, offsetof(struct fw_cdev_event_request3, source_node_id));
3962306a36Sopenharmony_ci	KUNIT_EXPECT_EQ(test, 28, offsetof(struct fw_cdev_event_request3, destination_node_id));
4062306a36Sopenharmony_ci	KUNIT_EXPECT_EQ(test, 32, offsetof(struct fw_cdev_event_request3, card));
4162306a36Sopenharmony_ci	KUNIT_EXPECT_EQ(test, 36, offsetof(struct fw_cdev_event_request3, generation));
4262306a36Sopenharmony_ci	KUNIT_EXPECT_EQ(test, 40, offsetof(struct fw_cdev_event_request3, handle));
4362306a36Sopenharmony_ci	KUNIT_EXPECT_EQ(test, 44, offsetof(struct fw_cdev_event_request3, length));
4462306a36Sopenharmony_ci	KUNIT_EXPECT_EQ(test, 48, offsetof(struct fw_cdev_event_request3, tstamp));
4562306a36Sopenharmony_ci	KUNIT_EXPECT_EQ(test, 56, offsetof(struct fw_cdev_event_request3, data));
4662306a36Sopenharmony_ci}
4762306a36Sopenharmony_ci
4862306a36Sopenharmony_ci// Added at v6.5.
4962306a36Sopenharmony_cistatic void structure_layout_event_response2(struct kunit *test)
5062306a36Sopenharmony_ci{
5162306a36Sopenharmony_ci	KUNIT_EXPECT_EQ(test, 32, sizeof(struct fw_cdev_event_response2));
5262306a36Sopenharmony_ci
5362306a36Sopenharmony_ci	KUNIT_EXPECT_EQ(test, 0, offsetof(struct fw_cdev_event_response2, closure));
5462306a36Sopenharmony_ci	KUNIT_EXPECT_EQ(test, 8, offsetof(struct fw_cdev_event_response2, type));
5562306a36Sopenharmony_ci	KUNIT_EXPECT_EQ(test, 12, offsetof(struct fw_cdev_event_response2, rcode));
5662306a36Sopenharmony_ci	KUNIT_EXPECT_EQ(test, 16, offsetof(struct fw_cdev_event_response2, length));
5762306a36Sopenharmony_ci	KUNIT_EXPECT_EQ(test, 20, offsetof(struct fw_cdev_event_response2, request_tstamp));
5862306a36Sopenharmony_ci	KUNIT_EXPECT_EQ(test, 24, offsetof(struct fw_cdev_event_response2, response_tstamp));
5962306a36Sopenharmony_ci	KUNIT_EXPECT_EQ(test, 32, offsetof(struct fw_cdev_event_response2, data));
6062306a36Sopenharmony_ci}
6162306a36Sopenharmony_ci
6262306a36Sopenharmony_ci// Added at v6.5.
6362306a36Sopenharmony_cistatic void structure_layout_event_phy_packet2(struct kunit *test)
6462306a36Sopenharmony_ci{
6562306a36Sopenharmony_ci	KUNIT_EXPECT_EQ(test, 24, sizeof(struct fw_cdev_event_phy_packet2));
6662306a36Sopenharmony_ci
6762306a36Sopenharmony_ci	KUNIT_EXPECT_EQ(test, 0, offsetof(struct fw_cdev_event_phy_packet2, closure));
6862306a36Sopenharmony_ci	KUNIT_EXPECT_EQ(test, 8, offsetof(struct fw_cdev_event_phy_packet2, type));
6962306a36Sopenharmony_ci	KUNIT_EXPECT_EQ(test, 12, offsetof(struct fw_cdev_event_phy_packet2, rcode));
7062306a36Sopenharmony_ci	KUNIT_EXPECT_EQ(test, 16, offsetof(struct fw_cdev_event_phy_packet2, length));
7162306a36Sopenharmony_ci	KUNIT_EXPECT_EQ(test, 20, offsetof(struct fw_cdev_event_phy_packet2, tstamp));
7262306a36Sopenharmony_ci	KUNIT_EXPECT_EQ(test, 24, offsetof(struct fw_cdev_event_phy_packet2, data));
7362306a36Sopenharmony_ci}
7462306a36Sopenharmony_ci
7562306a36Sopenharmony_cistatic struct kunit_case structure_layout_test_cases[] = {
7662306a36Sopenharmony_ci	KUNIT_CASE(structure_layout_event_response),
7762306a36Sopenharmony_ci	KUNIT_CASE(structure_layout_event_request3),
7862306a36Sopenharmony_ci	KUNIT_CASE(structure_layout_event_response2),
7962306a36Sopenharmony_ci	KUNIT_CASE(structure_layout_event_phy_packet2),
8062306a36Sopenharmony_ci	{}
8162306a36Sopenharmony_ci};
8262306a36Sopenharmony_ci
8362306a36Sopenharmony_cistatic struct kunit_suite structure_layout_test_suite = {
8462306a36Sopenharmony_ci	.name = "firewire-uapi-structure-layout",
8562306a36Sopenharmony_ci	.test_cases = structure_layout_test_cases,
8662306a36Sopenharmony_ci};
8762306a36Sopenharmony_cikunit_test_suite(structure_layout_test_suite);
8862306a36Sopenharmony_ci
8962306a36Sopenharmony_ciMODULE_LICENSE("GPL");
90