1d52bbf74SAmadeusz Sławiński // SPDX-License-Identifier: GPL-2.0-only 2d52bbf74SAmadeusz Sławiński /* 3d52bbf74SAmadeusz Sławiński * soc-topology-test.c -- ALSA SoC Topology Kernel Unit Tests 4d52bbf74SAmadeusz Sławiński * 5d52bbf74SAmadeusz Sławiński * Copyright(c) 2021 Intel Corporation. All rights reserved. 6d52bbf74SAmadeusz Sławiński */ 7d52bbf74SAmadeusz Sławiński 8d52bbf74SAmadeusz Sławiński #include <linux/firmware.h> 9d52bbf74SAmadeusz Sławiński #include <sound/core.h> 10d52bbf74SAmadeusz Sławiński #include <sound/soc.h> 11d52bbf74SAmadeusz Sławiński #include <sound/soc-topology.h> 12d52bbf74SAmadeusz Sławiński #include <kunit/test.h> 13d52bbf74SAmadeusz Sławiński 14d52bbf74SAmadeusz Sławiński /* ===== HELPER FUNCTIONS =================================================== */ 15d52bbf74SAmadeusz Sławiński 16d52bbf74SAmadeusz Sławiński /* 17d52bbf74SAmadeusz Sławiński * snd_soc_component needs device to operate on (primarily for prints), create 18d52bbf74SAmadeusz Sławiński * fake one, as we don't register with PCI or anything else 19d52bbf74SAmadeusz Sławiński * device_driver name is used in some of the prints (fmt_single_name) so 20d52bbf74SAmadeusz Sławiński * we also mock up minimal one 21d52bbf74SAmadeusz Sławiński */ 22d52bbf74SAmadeusz Sławiński static struct device *test_dev; 23d52bbf74SAmadeusz Sławiński 24d52bbf74SAmadeusz Sławiński static struct device_driver test_drv = { 25d52bbf74SAmadeusz Sławiński .name = "sound-soc-topology-test-driver", 26d52bbf74SAmadeusz Sławiński }; 27d52bbf74SAmadeusz Sławiński 28d52bbf74SAmadeusz Sławiński static int snd_soc_tplg_test_init(struct kunit *test) 29d52bbf74SAmadeusz Sławiński { 30d52bbf74SAmadeusz Sławiński test_dev = root_device_register("sound-soc-topology-test"); 31d52bbf74SAmadeusz Sławiński test_dev = get_device(test_dev); 32d52bbf74SAmadeusz Sławiński if (!test_dev) 33d52bbf74SAmadeusz Sławiński return -ENODEV; 34d52bbf74SAmadeusz Sławiński 35d52bbf74SAmadeusz Sławiński test_dev->driver = &test_drv; 36d52bbf74SAmadeusz Sławiński 37d52bbf74SAmadeusz Sławiński return 0; 38d52bbf74SAmadeusz Sławiński } 39d52bbf74SAmadeusz Sławiński 40d52bbf74SAmadeusz Sławiński static void snd_soc_tplg_test_exit(struct kunit *test) 41d52bbf74SAmadeusz Sławiński { 42d52bbf74SAmadeusz Sławiński put_device(test_dev); 43d52bbf74SAmadeusz Sławiński root_device_unregister(test_dev); 44d52bbf74SAmadeusz Sławiński } 45d52bbf74SAmadeusz Sławiński 46d52bbf74SAmadeusz Sławiński /* 47d52bbf74SAmadeusz Sławiński * helper struct we use when registering component, as we load topology during 48d52bbf74SAmadeusz Sławiński * component probe, we need to pass struct kunit somehow to probe function, so 49d52bbf74SAmadeusz Sławiński * we can report test result 50d52bbf74SAmadeusz Sławiński */ 51d52bbf74SAmadeusz Sławiński struct kunit_soc_component { 52d52bbf74SAmadeusz Sławiński struct kunit *kunit; 53d52bbf74SAmadeusz Sławiński int expect; /* what result we expect when loading topology */ 54d52bbf74SAmadeusz Sławiński struct snd_soc_component comp; 55d52bbf74SAmadeusz Sławiński struct snd_soc_card card; 56d52bbf74SAmadeusz Sławiński struct firmware fw; 57d52bbf74SAmadeusz Sławiński }; 58d52bbf74SAmadeusz Sławiński 59d52bbf74SAmadeusz Sławiński static int d_probe(struct snd_soc_component *component) 60d52bbf74SAmadeusz Sławiński { 61d52bbf74SAmadeusz Sławiński struct kunit_soc_component *kunit_comp = 62d52bbf74SAmadeusz Sławiński container_of(component, struct kunit_soc_component, comp); 63d52bbf74SAmadeusz Sławiński int ret; 64d52bbf74SAmadeusz Sławiński 65d52bbf74SAmadeusz Sławiński ret = snd_soc_tplg_component_load(component, NULL, &kunit_comp->fw); 66d52bbf74SAmadeusz Sławiński KUNIT_EXPECT_EQ_MSG(kunit_comp->kunit, kunit_comp->expect, ret, 67d52bbf74SAmadeusz Sławiński "Failed topology load"); 68d52bbf74SAmadeusz Sławiński 69d52bbf74SAmadeusz Sławiński return 0; 70d52bbf74SAmadeusz Sławiński } 71d52bbf74SAmadeusz Sławiński 72d52bbf74SAmadeusz Sławiński static void d_remove(struct snd_soc_component *component) 73d52bbf74SAmadeusz Sławiński { 74d52bbf74SAmadeusz Sławiński struct kunit_soc_component *kunit_comp = 75d52bbf74SAmadeusz Sławiński container_of(component, struct kunit_soc_component, comp); 76d52bbf74SAmadeusz Sławiński int ret; 77d52bbf74SAmadeusz Sławiński 78d52bbf74SAmadeusz Sławiński ret = snd_soc_tplg_component_remove(component); 79d52bbf74SAmadeusz Sławiński KUNIT_EXPECT_EQ(kunit_comp->kunit, 0, ret); 80d52bbf74SAmadeusz Sławiński } 81d52bbf74SAmadeusz Sławiński 82d52bbf74SAmadeusz Sławiński /* 83d52bbf74SAmadeusz Sławiński * ASoC minimal boiler plate 84d52bbf74SAmadeusz Sławiński */ 85d52bbf74SAmadeusz Sławiński SND_SOC_DAILINK_DEF(dummy, DAILINK_COMP_ARRAY(COMP_DUMMY())); 86d52bbf74SAmadeusz Sławiński 87d52bbf74SAmadeusz Sławiński SND_SOC_DAILINK_DEF(platform, DAILINK_COMP_ARRAY(COMP_PLATFORM("sound-soc-topology-test"))); 88d52bbf74SAmadeusz Sławiński 89d52bbf74SAmadeusz Sławiński static struct snd_soc_dai_link kunit_dai_links[] = { 90d52bbf74SAmadeusz Sławiński { 91d52bbf74SAmadeusz Sławiński .name = "KUNIT Audio Port", 92d52bbf74SAmadeusz Sławiński .id = 0, 93d52bbf74SAmadeusz Sławiński .stream_name = "Audio Playback/Capture", 94d52bbf74SAmadeusz Sławiński .nonatomic = 1, 95d52bbf74SAmadeusz Sławiński .dynamic = 1, 96d52bbf74SAmadeusz Sławiński .trigger = {SND_SOC_DPCM_TRIGGER_POST, SND_SOC_DPCM_TRIGGER_POST}, 97d52bbf74SAmadeusz Sławiński .dpcm_playback = 1, 98d52bbf74SAmadeusz Sławiński .dpcm_capture = 1, 99d52bbf74SAmadeusz Sławiński SND_SOC_DAILINK_REG(dummy, dummy, platform), 100d52bbf74SAmadeusz Sławiński }, 101d52bbf74SAmadeusz Sławiński }; 102d52bbf74SAmadeusz Sławiński 103d52bbf74SAmadeusz Sławiński static const struct snd_soc_component_driver test_component = { 104d52bbf74SAmadeusz Sławiński .name = "sound-soc-topology-test", 105d52bbf74SAmadeusz Sławiński .probe = d_probe, 106d52bbf74SAmadeusz Sławiński .remove = d_remove, 107d52bbf74SAmadeusz Sławiński .non_legacy_dai_naming = 1, 108d52bbf74SAmadeusz Sławiński }; 109d52bbf74SAmadeusz Sławiński 110cec9128dSAmadeusz Sławiński /* ===== TOPOLOGY TEMPLATES ================================================= */ 111cec9128dSAmadeusz Sławiński 112cec9128dSAmadeusz Sławiński // Structural representation of topology which can be generated with: 113cec9128dSAmadeusz Sławiński // $ touch empty 114cec9128dSAmadeusz Sławiński // $ alsatplg -c empty -o empty.tplg 115cec9128dSAmadeusz Sławiński // $ xxd -i empty.tplg 116cec9128dSAmadeusz Sławiński 117cec9128dSAmadeusz Sławiński struct tplg_tmpl_001 { 118cec9128dSAmadeusz Sławiński struct snd_soc_tplg_hdr header; 119cec9128dSAmadeusz Sławiński struct snd_soc_tplg_manifest manifest; 120cec9128dSAmadeusz Sławiński } __packed; 121cec9128dSAmadeusz Sławiński 122cec9128dSAmadeusz Sławiński static struct tplg_tmpl_001 tplg_tmpl_empty = { 123cec9128dSAmadeusz Sławiński .header = { 124be6be67eSAmadeusz Sławiński .magic = cpu_to_le32(SND_SOC_TPLG_MAGIC), 125be6be67eSAmadeusz Sławiński .abi = cpu_to_le32(5), 126cec9128dSAmadeusz Sławiński .version = 0, 127be6be67eSAmadeusz Sławiński .type = cpu_to_le32(SND_SOC_TPLG_TYPE_MANIFEST), 128be6be67eSAmadeusz Sławiński .size = cpu_to_le32(sizeof(struct snd_soc_tplg_hdr)), 129cec9128dSAmadeusz Sławiński .vendor_type = 0, 130be6be67eSAmadeusz Sławiński .payload_size = cpu_to_le32(sizeof(struct snd_soc_tplg_manifest)), 131cec9128dSAmadeusz Sławiński .index = 0, 132be6be67eSAmadeusz Sławiński .count = cpu_to_le32(1), 133cec9128dSAmadeusz Sławiński }, 134cec9128dSAmadeusz Sławiński 135cec9128dSAmadeusz Sławiński .manifest = { 136be6be67eSAmadeusz Sławiński .size = cpu_to_le32(sizeof(struct snd_soc_tplg_manifest)), 137cec9128dSAmadeusz Sławiński /* rest of fields is 0 */ 138cec9128dSAmadeusz Sławiński }, 139cec9128dSAmadeusz Sławiński }; 140cec9128dSAmadeusz Sławiński 1413ad8c8e9SAmadeusz Sławiński // Structural representation of topology containing SectionPCM 1423ad8c8e9SAmadeusz Sławiński 1433ad8c8e9SAmadeusz Sławiński struct tplg_tmpl_002 { 1443ad8c8e9SAmadeusz Sławiński struct snd_soc_tplg_hdr header; 1453ad8c8e9SAmadeusz Sławiński struct snd_soc_tplg_manifest manifest; 1463ad8c8e9SAmadeusz Sławiński struct snd_soc_tplg_hdr pcm_header; 1473ad8c8e9SAmadeusz Sławiński struct snd_soc_tplg_pcm pcm; 1483ad8c8e9SAmadeusz Sławiński } __packed; 1493ad8c8e9SAmadeusz Sławiński 1503ad8c8e9SAmadeusz Sławiński static struct tplg_tmpl_002 tplg_tmpl_with_pcm = { 1513ad8c8e9SAmadeusz Sławiński .header = { 152be6be67eSAmadeusz Sławiński .magic = cpu_to_le32(SND_SOC_TPLG_MAGIC), 153be6be67eSAmadeusz Sławiński .abi = cpu_to_le32(5), 1543ad8c8e9SAmadeusz Sławiński .version = 0, 155be6be67eSAmadeusz Sławiński .type = cpu_to_le32(SND_SOC_TPLG_TYPE_MANIFEST), 156be6be67eSAmadeusz Sławiński .size = cpu_to_le32(sizeof(struct snd_soc_tplg_hdr)), 1573ad8c8e9SAmadeusz Sławiński .vendor_type = 0, 158be6be67eSAmadeusz Sławiński .payload_size = cpu_to_le32(sizeof(struct snd_soc_tplg_manifest)), 1593ad8c8e9SAmadeusz Sławiński .index = 0, 160be6be67eSAmadeusz Sławiński .count = cpu_to_le32(1), 1613ad8c8e9SAmadeusz Sławiński }, 1623ad8c8e9SAmadeusz Sławiński .manifest = { 163be6be67eSAmadeusz Sławiński .size = cpu_to_le32(sizeof(struct snd_soc_tplg_manifest)), 164be6be67eSAmadeusz Sławiński .pcm_elems = cpu_to_le32(1), 1653ad8c8e9SAmadeusz Sławiński /* rest of fields is 0 */ 1663ad8c8e9SAmadeusz Sławiński }, 1673ad8c8e9SAmadeusz Sławiński .pcm_header = { 168be6be67eSAmadeusz Sławiński .magic = cpu_to_le32(SND_SOC_TPLG_MAGIC), 169be6be67eSAmadeusz Sławiński .abi = cpu_to_le32(5), 1703ad8c8e9SAmadeusz Sławiński .version = 0, 171be6be67eSAmadeusz Sławiński .type = cpu_to_le32(SND_SOC_TPLG_TYPE_PCM), 172be6be67eSAmadeusz Sławiński .size = cpu_to_le32(sizeof(struct snd_soc_tplg_hdr)), 1733ad8c8e9SAmadeusz Sławiński .vendor_type = 0, 174be6be67eSAmadeusz Sławiński .payload_size = cpu_to_le32(sizeof(struct snd_soc_tplg_pcm)), 1753ad8c8e9SAmadeusz Sławiński .index = 0, 176be6be67eSAmadeusz Sławiński .count = cpu_to_le32(1), 1773ad8c8e9SAmadeusz Sławiński }, 1783ad8c8e9SAmadeusz Sławiński .pcm = { 179be6be67eSAmadeusz Sławiński .size = cpu_to_le32(sizeof(struct snd_soc_tplg_pcm)), 1803ad8c8e9SAmadeusz Sławiński .pcm_name = "KUNIT Audio", 1813ad8c8e9SAmadeusz Sławiński .dai_name = "kunit-audio-dai", 1823ad8c8e9SAmadeusz Sławiński .pcm_id = 0, 1833ad8c8e9SAmadeusz Sławiński .dai_id = 0, 184be6be67eSAmadeusz Sławiński .playback = cpu_to_le32(1), 185be6be67eSAmadeusz Sławiński .capture = cpu_to_le32(1), 1863ad8c8e9SAmadeusz Sławiński .compress = 0, 1873ad8c8e9SAmadeusz Sławiński .stream = { 1883ad8c8e9SAmadeusz Sławiński [0] = { 189be6be67eSAmadeusz Sławiński .channels = cpu_to_le32(2), 1903ad8c8e9SAmadeusz Sławiński }, 1913ad8c8e9SAmadeusz Sławiński [1] = { 192be6be67eSAmadeusz Sławiński .channels = cpu_to_le32(2), 1933ad8c8e9SAmadeusz Sławiński }, 1943ad8c8e9SAmadeusz Sławiński }, 1953ad8c8e9SAmadeusz Sławiński .num_streams = 0, 1963ad8c8e9SAmadeusz Sławiński .caps = { 1973ad8c8e9SAmadeusz Sławiński [0] = { 1983ad8c8e9SAmadeusz Sławiński .name = "kunit-audio-playback", 199be6be67eSAmadeusz Sławiński .channels_min = cpu_to_le32(2), 200be6be67eSAmadeusz Sławiński .channels_max = cpu_to_le32(2), 2013ad8c8e9SAmadeusz Sławiński }, 2023ad8c8e9SAmadeusz Sławiński [1] = { 2033ad8c8e9SAmadeusz Sławiński .name = "kunit-audio-capture", 204be6be67eSAmadeusz Sławiński .channels_min = cpu_to_le32(2), 205be6be67eSAmadeusz Sławiński .channels_max = cpu_to_le32(2), 2063ad8c8e9SAmadeusz Sławiński }, 2073ad8c8e9SAmadeusz Sławiński }, 2083ad8c8e9SAmadeusz Sławiński .flag_mask = 0, 2093ad8c8e9SAmadeusz Sławiński .flags = 0, 2103ad8c8e9SAmadeusz Sławiński .priv = { 0 }, 2113ad8c8e9SAmadeusz Sławiński }, 2123ad8c8e9SAmadeusz Sławiński }; 2133ad8c8e9SAmadeusz Sławiński 214d52bbf74SAmadeusz Sławiński /* ===== TEST CASES ========================================================= */ 215d52bbf74SAmadeusz Sławiński 216d52bbf74SAmadeusz Sławiński // TEST CASE 217d52bbf74SAmadeusz Sławiński // Test passing NULL component as parameter to snd_soc_tplg_component_load 218d52bbf74SAmadeusz Sławiński 219d52bbf74SAmadeusz Sławiński /* 220d52bbf74SAmadeusz Sławiński * need to override generic probe function with one using NULL when calling 221d52bbf74SAmadeusz Sławiński * topology load during component initialization, we don't need .remove 222d52bbf74SAmadeusz Sławiński * handler as load should fail 223d52bbf74SAmadeusz Sławiński */ 224d52bbf74SAmadeusz Sławiński static int d_probe_null_comp(struct snd_soc_component *component) 225d52bbf74SAmadeusz Sławiński { 226d52bbf74SAmadeusz Sławiński struct kunit_soc_component *kunit_comp = 227d52bbf74SAmadeusz Sławiński container_of(component, struct kunit_soc_component, comp); 228d52bbf74SAmadeusz Sławiński int ret; 229d52bbf74SAmadeusz Sławiński 230d52bbf74SAmadeusz Sławiński /* instead of passing component pointer as first argument, pass NULL here */ 231d52bbf74SAmadeusz Sławiński ret = snd_soc_tplg_component_load(NULL, NULL, &kunit_comp->fw); 232d52bbf74SAmadeusz Sławiński KUNIT_EXPECT_EQ_MSG(kunit_comp->kunit, kunit_comp->expect, ret, 233d52bbf74SAmadeusz Sławiński "Failed topology load"); 234d52bbf74SAmadeusz Sławiński 235d52bbf74SAmadeusz Sławiński return 0; 236d52bbf74SAmadeusz Sławiński } 237d52bbf74SAmadeusz Sławiński 238d52bbf74SAmadeusz Sławiński static const struct snd_soc_component_driver test_component_null_comp = { 239d52bbf74SAmadeusz Sławiński .name = "sound-soc-topology-test", 240d52bbf74SAmadeusz Sławiński .probe = d_probe_null_comp, 241d52bbf74SAmadeusz Sławiński .non_legacy_dai_naming = 1, 242d52bbf74SAmadeusz Sławiński }; 243d52bbf74SAmadeusz Sławiński 244d52bbf74SAmadeusz Sławiński static void snd_soc_tplg_test_load_with_null_comp(struct kunit *test) 245d52bbf74SAmadeusz Sławiński { 246d52bbf74SAmadeusz Sławiński struct kunit_soc_component *kunit_comp; 247d52bbf74SAmadeusz Sławiński int ret; 248d52bbf74SAmadeusz Sławiński 249d52bbf74SAmadeusz Sławiński /* prepare */ 250d52bbf74SAmadeusz Sławiński kunit_comp = kunit_kzalloc(test, sizeof(*kunit_comp), GFP_KERNEL); 251d52bbf74SAmadeusz Sławiński KUNIT_EXPECT_NOT_ERR_OR_NULL(test, kunit_comp); 252d52bbf74SAmadeusz Sławiński kunit_comp->kunit = test; 253d52bbf74SAmadeusz Sławiński kunit_comp->expect = -EINVAL; /* expect failure */ 254d52bbf74SAmadeusz Sławiński 255d52bbf74SAmadeusz Sławiński kunit_comp->card.dev = test_dev, 256d52bbf74SAmadeusz Sławiński kunit_comp->card.name = "kunit-card", 257d52bbf74SAmadeusz Sławiński kunit_comp->card.owner = THIS_MODULE, 258d52bbf74SAmadeusz Sławiński kunit_comp->card.dai_link = kunit_dai_links, 259d52bbf74SAmadeusz Sławiński kunit_comp->card.num_links = ARRAY_SIZE(kunit_dai_links), 260d52bbf74SAmadeusz Sławiński kunit_comp->card.fully_routed = true, 261d52bbf74SAmadeusz Sławiński 262d52bbf74SAmadeusz Sławiński /* run test */ 263d52bbf74SAmadeusz Sławiński ret = snd_soc_register_card(&kunit_comp->card); 264d52bbf74SAmadeusz Sławiński if (ret != 0 && ret != -EPROBE_DEFER) 265d52bbf74SAmadeusz Sławiński KUNIT_FAIL(test, "Failed to register card"); 266d52bbf74SAmadeusz Sławiński 267d52bbf74SAmadeusz Sławiński ret = snd_soc_component_initialize(&kunit_comp->comp, &test_component_null_comp, test_dev); 268d52bbf74SAmadeusz Sławiński KUNIT_EXPECT_EQ(test, 0, ret); 269d52bbf74SAmadeusz Sławiński 270d52bbf74SAmadeusz Sławiński ret = snd_soc_add_component(&kunit_comp->comp, NULL, 0); 271d52bbf74SAmadeusz Sławiński KUNIT_EXPECT_EQ(test, 0, ret); 272d52bbf74SAmadeusz Sławiński 273d52bbf74SAmadeusz Sławiński /* cleanup */ 2741892a991SUwe Kleine-König snd_soc_unregister_card(&kunit_comp->card); 275d52bbf74SAmadeusz Sławiński snd_soc_unregister_component(test_dev); 276d52bbf74SAmadeusz Sławiński } 277d52bbf74SAmadeusz Sławiński 278d52bbf74SAmadeusz Sławiński // TEST CASE 279d52bbf74SAmadeusz Sławiński // Test passing NULL ops as parameter to snd_soc_tplg_component_load 280d52bbf74SAmadeusz Sławiński 281d52bbf74SAmadeusz Sławiński /* 282d52bbf74SAmadeusz Sławiński * NULL ops is default case, we pass empty topology (fw), so we don't have 283d52bbf74SAmadeusz Sławiński * anything to parse and just do nothing, which results in return 0; from 284d52bbf74SAmadeusz Sławiński * calling soc_tplg_dapm_complete in soc_tplg_process_headers 285d52bbf74SAmadeusz Sławiński */ 286d52bbf74SAmadeusz Sławiński static void snd_soc_tplg_test_load_with_null_ops(struct kunit *test) 287d52bbf74SAmadeusz Sławiński { 288d52bbf74SAmadeusz Sławiński struct kunit_soc_component *kunit_comp; 289d52bbf74SAmadeusz Sławiński int ret; 290d52bbf74SAmadeusz Sławiński 291d52bbf74SAmadeusz Sławiński /* prepare */ 292d52bbf74SAmadeusz Sławiński kunit_comp = kunit_kzalloc(test, sizeof(*kunit_comp), GFP_KERNEL); 293d52bbf74SAmadeusz Sławiński KUNIT_EXPECT_NOT_ERR_OR_NULL(test, kunit_comp); 294d52bbf74SAmadeusz Sławiński kunit_comp->kunit = test; 295d52bbf74SAmadeusz Sławiński kunit_comp->expect = 0; /* expect success */ 296d52bbf74SAmadeusz Sławiński 297d52bbf74SAmadeusz Sławiński kunit_comp->card.dev = test_dev, 298d52bbf74SAmadeusz Sławiński kunit_comp->card.name = "kunit-card", 299d52bbf74SAmadeusz Sławiński kunit_comp->card.owner = THIS_MODULE, 300d52bbf74SAmadeusz Sławiński kunit_comp->card.dai_link = kunit_dai_links, 301d52bbf74SAmadeusz Sławiński kunit_comp->card.num_links = ARRAY_SIZE(kunit_dai_links), 302d52bbf74SAmadeusz Sławiński kunit_comp->card.fully_routed = true, 303d52bbf74SAmadeusz Sławiński 304d52bbf74SAmadeusz Sławiński /* run test */ 305d52bbf74SAmadeusz Sławiński ret = snd_soc_register_card(&kunit_comp->card); 306d52bbf74SAmadeusz Sławiński if (ret != 0 && ret != -EPROBE_DEFER) 307d52bbf74SAmadeusz Sławiński KUNIT_FAIL(test, "Failed to register card"); 308d52bbf74SAmadeusz Sławiński 309d52bbf74SAmadeusz Sławiński ret = snd_soc_component_initialize(&kunit_comp->comp, &test_component, test_dev); 310d52bbf74SAmadeusz Sławiński KUNIT_EXPECT_EQ(test, 0, ret); 311d52bbf74SAmadeusz Sławiński 312d52bbf74SAmadeusz Sławiński ret = snd_soc_add_component(&kunit_comp->comp, NULL, 0); 313d52bbf74SAmadeusz Sławiński KUNIT_EXPECT_EQ(test, 0, ret); 314d52bbf74SAmadeusz Sławiński 315d52bbf74SAmadeusz Sławiński /* cleanup */ 316*d5017d13SUwe Kleine-König snd_soc_unregister_card(&kunit_comp->card); 317d52bbf74SAmadeusz Sławiński 318d52bbf74SAmadeusz Sławiński snd_soc_unregister_component(test_dev); 319d52bbf74SAmadeusz Sławiński } 320d52bbf74SAmadeusz Sławiński 321d52bbf74SAmadeusz Sławiński // TEST CASE 322d52bbf74SAmadeusz Sławiński // Test passing NULL fw as parameter to snd_soc_tplg_component_load 323d52bbf74SAmadeusz Sławiński 324d52bbf74SAmadeusz Sławiński /* 325d52bbf74SAmadeusz Sławiński * need to override generic probe function with one using NULL pointer to fw 326d52bbf74SAmadeusz Sławiński * when calling topology load during component initialization, we don't need 327d52bbf74SAmadeusz Sławiński * .remove handler as load should fail 328d52bbf74SAmadeusz Sławiński */ 329d52bbf74SAmadeusz Sławiński static int d_probe_null_fw(struct snd_soc_component *component) 330d52bbf74SAmadeusz Sławiński { 331d52bbf74SAmadeusz Sławiński struct kunit_soc_component *kunit_comp = 332d52bbf74SAmadeusz Sławiński container_of(component, struct kunit_soc_component, comp); 333d52bbf74SAmadeusz Sławiński int ret; 334d52bbf74SAmadeusz Sławiński 335d52bbf74SAmadeusz Sławiński /* instead of passing fw pointer as third argument, pass NULL here */ 336d52bbf74SAmadeusz Sławiński ret = snd_soc_tplg_component_load(component, NULL, NULL); 337d52bbf74SAmadeusz Sławiński KUNIT_EXPECT_EQ_MSG(kunit_comp->kunit, kunit_comp->expect, ret, 338d52bbf74SAmadeusz Sławiński "Failed topology load"); 339d52bbf74SAmadeusz Sławiński 340d52bbf74SAmadeusz Sławiński return 0; 341d52bbf74SAmadeusz Sławiński } 342d52bbf74SAmadeusz Sławiński 343d52bbf74SAmadeusz Sławiński static const struct snd_soc_component_driver test_component_null_fw = { 344d52bbf74SAmadeusz Sławiński .name = "sound-soc-topology-test", 345d52bbf74SAmadeusz Sławiński .probe = d_probe_null_fw, 346d52bbf74SAmadeusz Sławiński .non_legacy_dai_naming = 1, 347d52bbf74SAmadeusz Sławiński }; 348d52bbf74SAmadeusz Sławiński 349d52bbf74SAmadeusz Sławiński static void snd_soc_tplg_test_load_with_null_fw(struct kunit *test) 350d52bbf74SAmadeusz Sławiński { 351d52bbf74SAmadeusz Sławiński struct kunit_soc_component *kunit_comp; 352d52bbf74SAmadeusz Sławiński int ret; 353d52bbf74SAmadeusz Sławiński 354d52bbf74SAmadeusz Sławiński /* prepare */ 355d52bbf74SAmadeusz Sławiński kunit_comp = kunit_kzalloc(test, sizeof(*kunit_comp), GFP_KERNEL); 356d52bbf74SAmadeusz Sławiński KUNIT_EXPECT_NOT_ERR_OR_NULL(test, kunit_comp); 357d52bbf74SAmadeusz Sławiński kunit_comp->kunit = test; 358d52bbf74SAmadeusz Sławiński kunit_comp->expect = -EINVAL; /* expect failure */ 359d52bbf74SAmadeusz Sławiński 360d52bbf74SAmadeusz Sławiński kunit_comp->card.dev = test_dev, 361d52bbf74SAmadeusz Sławiński kunit_comp->card.name = "kunit-card", 362d52bbf74SAmadeusz Sławiński kunit_comp->card.owner = THIS_MODULE, 363d52bbf74SAmadeusz Sławiński kunit_comp->card.dai_link = kunit_dai_links, 364d52bbf74SAmadeusz Sławiński kunit_comp->card.num_links = ARRAY_SIZE(kunit_dai_links), 365d52bbf74SAmadeusz Sławiński kunit_comp->card.fully_routed = true, 366d52bbf74SAmadeusz Sławiński 367d52bbf74SAmadeusz Sławiński /* run test */ 368d52bbf74SAmadeusz Sławiński ret = snd_soc_register_card(&kunit_comp->card); 369d52bbf74SAmadeusz Sławiński if (ret != 0 && ret != -EPROBE_DEFER) 370d52bbf74SAmadeusz Sławiński KUNIT_FAIL(test, "Failed to register card"); 371d52bbf74SAmadeusz Sławiński 372d52bbf74SAmadeusz Sławiński ret = snd_soc_component_initialize(&kunit_comp->comp, &test_component_null_fw, test_dev); 373d52bbf74SAmadeusz Sławiński KUNIT_EXPECT_EQ(test, 0, ret); 374d52bbf74SAmadeusz Sławiński 375d52bbf74SAmadeusz Sławiński ret = snd_soc_add_component(&kunit_comp->comp, NULL, 0); 376d52bbf74SAmadeusz Sławiński KUNIT_EXPECT_EQ(test, 0, ret); 377d52bbf74SAmadeusz Sławiński 378d52bbf74SAmadeusz Sławiński /* cleanup */ 379*d5017d13SUwe Kleine-König snd_soc_unregister_card(&kunit_comp->card); 380d52bbf74SAmadeusz Sławiński 381d52bbf74SAmadeusz Sławiński snd_soc_unregister_component(test_dev); 382d52bbf74SAmadeusz Sławiński } 383d52bbf74SAmadeusz Sławiński 384cec9128dSAmadeusz Sławiński // TEST CASE 385cec9128dSAmadeusz Sławiński // Test passing "empty" topology file 386cec9128dSAmadeusz Sławiński static void snd_soc_tplg_test_load_empty_tplg(struct kunit *test) 387cec9128dSAmadeusz Sławiński { 388cec9128dSAmadeusz Sławiński struct kunit_soc_component *kunit_comp; 389cec9128dSAmadeusz Sławiński struct tplg_tmpl_001 *data; 390cec9128dSAmadeusz Sławiński int size; 391cec9128dSAmadeusz Sławiński int ret; 392cec9128dSAmadeusz Sławiński 393cec9128dSAmadeusz Sławiński /* prepare */ 394cec9128dSAmadeusz Sławiński kunit_comp = kunit_kzalloc(test, sizeof(*kunit_comp), GFP_KERNEL); 395cec9128dSAmadeusz Sławiński KUNIT_EXPECT_NOT_ERR_OR_NULL(test, kunit_comp); 396cec9128dSAmadeusz Sławiński kunit_comp->kunit = test; 397cec9128dSAmadeusz Sławiński kunit_comp->expect = 0; /* expect success */ 398cec9128dSAmadeusz Sławiński 399cec9128dSAmadeusz Sławiński size = sizeof(tplg_tmpl_empty); 400cec9128dSAmadeusz Sławiński data = kunit_kzalloc(kunit_comp->kunit, size, GFP_KERNEL); 401cec9128dSAmadeusz Sławiński KUNIT_EXPECT_NOT_ERR_OR_NULL(kunit_comp->kunit, data); 402cec9128dSAmadeusz Sławiński 403cec9128dSAmadeusz Sławiński memcpy(data, &tplg_tmpl_empty, sizeof(tplg_tmpl_empty)); 404cec9128dSAmadeusz Sławiński 405cec9128dSAmadeusz Sławiński kunit_comp->fw.data = (u8 *)data; 406cec9128dSAmadeusz Sławiński kunit_comp->fw.size = size; 407cec9128dSAmadeusz Sławiński 408cec9128dSAmadeusz Sławiński kunit_comp->card.dev = test_dev, 409cec9128dSAmadeusz Sławiński kunit_comp->card.name = "kunit-card", 410cec9128dSAmadeusz Sławiński kunit_comp->card.owner = THIS_MODULE, 411cec9128dSAmadeusz Sławiński kunit_comp->card.dai_link = kunit_dai_links, 412cec9128dSAmadeusz Sławiński kunit_comp->card.num_links = ARRAY_SIZE(kunit_dai_links), 413cec9128dSAmadeusz Sławiński kunit_comp->card.fully_routed = true, 414cec9128dSAmadeusz Sławiński 415cec9128dSAmadeusz Sławiński /* run test */ 416cec9128dSAmadeusz Sławiński ret = snd_soc_register_card(&kunit_comp->card); 417cec9128dSAmadeusz Sławiński if (ret != 0 && ret != -EPROBE_DEFER) 418cec9128dSAmadeusz Sławiński KUNIT_FAIL(test, "Failed to register card"); 419cec9128dSAmadeusz Sławiński 420cec9128dSAmadeusz Sławiński ret = snd_soc_component_initialize(&kunit_comp->comp, &test_component, test_dev); 421cec9128dSAmadeusz Sławiński KUNIT_EXPECT_EQ(test, 0, ret); 422cec9128dSAmadeusz Sławiński 423cec9128dSAmadeusz Sławiński ret = snd_soc_add_component(&kunit_comp->comp, NULL, 0); 424cec9128dSAmadeusz Sławiński KUNIT_EXPECT_EQ(test, 0, ret); 425cec9128dSAmadeusz Sławiński 426cec9128dSAmadeusz Sławiński /* cleanup */ 427*d5017d13SUwe Kleine-König snd_soc_unregister_card(&kunit_comp->card); 428cec9128dSAmadeusz Sławiński 429cec9128dSAmadeusz Sławiński snd_soc_unregister_component(test_dev); 430cec9128dSAmadeusz Sławiński } 431cec9128dSAmadeusz Sławiński 432cec9128dSAmadeusz Sławiński // TEST CASE 433cec9128dSAmadeusz Sławiński // Test "empty" topology file, but with bad "magic" 434cec9128dSAmadeusz Sławiński // In theory we could loop through all possible bad values, but it takes too 435cec9128dSAmadeusz Sławiński // long, so just use SND_SOC_TPLG_MAGIC + 1 436cec9128dSAmadeusz Sławiński static void snd_soc_tplg_test_load_empty_tplg_bad_magic(struct kunit *test) 437cec9128dSAmadeusz Sławiński { 438cec9128dSAmadeusz Sławiński struct kunit_soc_component *kunit_comp; 439cec9128dSAmadeusz Sławiński struct tplg_tmpl_001 *data; 440cec9128dSAmadeusz Sławiński int size; 441cec9128dSAmadeusz Sławiński int ret; 442cec9128dSAmadeusz Sławiński 443cec9128dSAmadeusz Sławiński /* prepare */ 444cec9128dSAmadeusz Sławiński kunit_comp = kunit_kzalloc(test, sizeof(*kunit_comp), GFP_KERNEL); 445cec9128dSAmadeusz Sławiński KUNIT_EXPECT_NOT_ERR_OR_NULL(test, kunit_comp); 446cec9128dSAmadeusz Sławiński kunit_comp->kunit = test; 447cec9128dSAmadeusz Sławiński kunit_comp->expect = -EINVAL; /* expect failure */ 448cec9128dSAmadeusz Sławiński 449cec9128dSAmadeusz Sławiński size = sizeof(tplg_tmpl_empty); 450cec9128dSAmadeusz Sławiński data = kunit_kzalloc(kunit_comp->kunit, size, GFP_KERNEL); 451cec9128dSAmadeusz Sławiński KUNIT_EXPECT_NOT_ERR_OR_NULL(kunit_comp->kunit, data); 452cec9128dSAmadeusz Sławiński 453cec9128dSAmadeusz Sławiński memcpy(data, &tplg_tmpl_empty, sizeof(tplg_tmpl_empty)); 454cec9128dSAmadeusz Sławiński /* 455cec9128dSAmadeusz Sławiński * override abi 456cec9128dSAmadeusz Sławiński * any value != magic number is wrong 457cec9128dSAmadeusz Sławiński */ 458be6be67eSAmadeusz Sławiński data->header.magic = cpu_to_le32(SND_SOC_TPLG_MAGIC + 1); 459cec9128dSAmadeusz Sławiński 460cec9128dSAmadeusz Sławiński kunit_comp->fw.data = (u8 *)data; 461cec9128dSAmadeusz Sławiński kunit_comp->fw.size = size; 462cec9128dSAmadeusz Sławiński 463cec9128dSAmadeusz Sławiński kunit_comp->card.dev = test_dev, 464cec9128dSAmadeusz Sławiński kunit_comp->card.name = "kunit-card", 465cec9128dSAmadeusz Sławiński kunit_comp->card.owner = THIS_MODULE, 466cec9128dSAmadeusz Sławiński kunit_comp->card.dai_link = kunit_dai_links, 467cec9128dSAmadeusz Sławiński kunit_comp->card.num_links = ARRAY_SIZE(kunit_dai_links), 468cec9128dSAmadeusz Sławiński kunit_comp->card.fully_routed = true, 469cec9128dSAmadeusz Sławiński 470cec9128dSAmadeusz Sławiński /* run test */ 471cec9128dSAmadeusz Sławiński ret = snd_soc_register_card(&kunit_comp->card); 472cec9128dSAmadeusz Sławiński if (ret != 0 && ret != -EPROBE_DEFER) 473cec9128dSAmadeusz Sławiński KUNIT_FAIL(test, "Failed to register card"); 474cec9128dSAmadeusz Sławiński 475cec9128dSAmadeusz Sławiński ret = snd_soc_component_initialize(&kunit_comp->comp, &test_component, test_dev); 476cec9128dSAmadeusz Sławiński KUNIT_EXPECT_EQ(test, 0, ret); 477cec9128dSAmadeusz Sławiński 478cec9128dSAmadeusz Sławiński ret = snd_soc_add_component(&kunit_comp->comp, NULL, 0); 479cec9128dSAmadeusz Sławiński KUNIT_EXPECT_EQ(test, 0, ret); 480cec9128dSAmadeusz Sławiński 481cec9128dSAmadeusz Sławiński /* cleanup */ 482*d5017d13SUwe Kleine-König snd_soc_unregister_card(&kunit_comp->card); 483cec9128dSAmadeusz Sławiński 484cec9128dSAmadeusz Sławiński snd_soc_unregister_component(test_dev); 485cec9128dSAmadeusz Sławiński } 486cec9128dSAmadeusz Sławiński 487cec9128dSAmadeusz Sławiński // TEST CASE 488cec9128dSAmadeusz Sławiński // Test "empty" topology file, but with bad "abi" 489cec9128dSAmadeusz Sławiński // In theory we could loop through all possible bad values, but it takes too 490cec9128dSAmadeusz Sławiński // long, so just use SND_SOC_TPLG_ABI_VERSION + 1 491cec9128dSAmadeusz Sławiński static void snd_soc_tplg_test_load_empty_tplg_bad_abi(struct kunit *test) 492cec9128dSAmadeusz Sławiński { 493cec9128dSAmadeusz Sławiński struct kunit_soc_component *kunit_comp; 494cec9128dSAmadeusz Sławiński struct tplg_tmpl_001 *data; 495cec9128dSAmadeusz Sławiński int size; 496cec9128dSAmadeusz Sławiński int ret; 497cec9128dSAmadeusz Sławiński 498cec9128dSAmadeusz Sławiński /* prepare */ 499cec9128dSAmadeusz Sławiński kunit_comp = kunit_kzalloc(test, sizeof(*kunit_comp), GFP_KERNEL); 500cec9128dSAmadeusz Sławiński KUNIT_EXPECT_NOT_ERR_OR_NULL(test, kunit_comp); 501cec9128dSAmadeusz Sławiński kunit_comp->kunit = test; 502cec9128dSAmadeusz Sławiński kunit_comp->expect = -EINVAL; /* expect failure */ 503cec9128dSAmadeusz Sławiński 504cec9128dSAmadeusz Sławiński size = sizeof(tplg_tmpl_empty); 505cec9128dSAmadeusz Sławiński data = kunit_kzalloc(kunit_comp->kunit, size, GFP_KERNEL); 506cec9128dSAmadeusz Sławiński KUNIT_EXPECT_NOT_ERR_OR_NULL(kunit_comp->kunit, data); 507cec9128dSAmadeusz Sławiński 508cec9128dSAmadeusz Sławiński memcpy(data, &tplg_tmpl_empty, sizeof(tplg_tmpl_empty)); 509cec9128dSAmadeusz Sławiński /* 510cec9128dSAmadeusz Sławiński * override abi 511cec9128dSAmadeusz Sławiński * any value != accepted range is wrong 512cec9128dSAmadeusz Sławiński */ 513be6be67eSAmadeusz Sławiński data->header.abi = cpu_to_le32(SND_SOC_TPLG_ABI_VERSION + 1); 514cec9128dSAmadeusz Sławiński 515cec9128dSAmadeusz Sławiński kunit_comp->fw.data = (u8 *)data; 516cec9128dSAmadeusz Sławiński kunit_comp->fw.size = size; 517cec9128dSAmadeusz Sławiński 518cec9128dSAmadeusz Sławiński kunit_comp->card.dev = test_dev, 519cec9128dSAmadeusz Sławiński kunit_comp->card.name = "kunit-card", 520cec9128dSAmadeusz Sławiński kunit_comp->card.owner = THIS_MODULE, 521cec9128dSAmadeusz Sławiński kunit_comp->card.dai_link = kunit_dai_links, 522cec9128dSAmadeusz Sławiński kunit_comp->card.num_links = ARRAY_SIZE(kunit_dai_links), 523cec9128dSAmadeusz Sławiński kunit_comp->card.fully_routed = true, 524cec9128dSAmadeusz Sławiński 525cec9128dSAmadeusz Sławiński /* run test */ 526cec9128dSAmadeusz Sławiński ret = snd_soc_register_card(&kunit_comp->card); 527cec9128dSAmadeusz Sławiński if (ret != 0 && ret != -EPROBE_DEFER) 528cec9128dSAmadeusz Sławiński KUNIT_FAIL(test, "Failed to register card"); 529cec9128dSAmadeusz Sławiński 530cec9128dSAmadeusz Sławiński ret = snd_soc_component_initialize(&kunit_comp->comp, &test_component, test_dev); 531cec9128dSAmadeusz Sławiński KUNIT_EXPECT_EQ(test, 0, ret); 532cec9128dSAmadeusz Sławiński 533cec9128dSAmadeusz Sławiński ret = snd_soc_add_component(&kunit_comp->comp, NULL, 0); 534cec9128dSAmadeusz Sławiński KUNIT_EXPECT_EQ(test, 0, ret); 535cec9128dSAmadeusz Sławiński 536cec9128dSAmadeusz Sławiński /* cleanup */ 537*d5017d13SUwe Kleine-König snd_soc_unregister_card(&kunit_comp->card); 538cec9128dSAmadeusz Sławiński 539cec9128dSAmadeusz Sławiński snd_soc_unregister_component(test_dev); 540cec9128dSAmadeusz Sławiński } 541cec9128dSAmadeusz Sławiński 542cec9128dSAmadeusz Sławiński // TEST CASE 543cec9128dSAmadeusz Sławiński // Test "empty" topology file, but with bad "size" 544cec9128dSAmadeusz Sławiński // In theory we could loop through all possible bad values, but it takes too 545cec9128dSAmadeusz Sławiński // long, so just use sizeof(struct snd_soc_tplg_hdr) + 1 546cec9128dSAmadeusz Sławiński static void snd_soc_tplg_test_load_empty_tplg_bad_size(struct kunit *test) 547cec9128dSAmadeusz Sławiński { 548cec9128dSAmadeusz Sławiński struct kunit_soc_component *kunit_comp; 549cec9128dSAmadeusz Sławiński struct tplg_tmpl_001 *data; 550cec9128dSAmadeusz Sławiński int size; 551cec9128dSAmadeusz Sławiński int ret; 552cec9128dSAmadeusz Sławiński 553cec9128dSAmadeusz Sławiński /* prepare */ 554cec9128dSAmadeusz Sławiński kunit_comp = kunit_kzalloc(test, sizeof(*kunit_comp), GFP_KERNEL); 555cec9128dSAmadeusz Sławiński KUNIT_EXPECT_NOT_ERR_OR_NULL(test, kunit_comp); 556cec9128dSAmadeusz Sławiński kunit_comp->kunit = test; 557cec9128dSAmadeusz Sławiński kunit_comp->expect = -EINVAL; /* expect failure */ 558cec9128dSAmadeusz Sławiński 559cec9128dSAmadeusz Sławiński size = sizeof(tplg_tmpl_empty); 560cec9128dSAmadeusz Sławiński data = kunit_kzalloc(kunit_comp->kunit, size, GFP_KERNEL); 561cec9128dSAmadeusz Sławiński KUNIT_EXPECT_NOT_ERR_OR_NULL(kunit_comp->kunit, data); 562cec9128dSAmadeusz Sławiński 563cec9128dSAmadeusz Sławiński memcpy(data, &tplg_tmpl_empty, sizeof(tplg_tmpl_empty)); 564cec9128dSAmadeusz Sławiński /* 565cec9128dSAmadeusz Sławiński * override size 566cec9128dSAmadeusz Sławiński * any value != struct size is wrong 567cec9128dSAmadeusz Sławiński */ 568be6be67eSAmadeusz Sławiński data->header.size = cpu_to_le32(sizeof(struct snd_soc_tplg_hdr) + 1); 569cec9128dSAmadeusz Sławiński 570cec9128dSAmadeusz Sławiński kunit_comp->fw.data = (u8 *)data; 571cec9128dSAmadeusz Sławiński kunit_comp->fw.size = size; 572cec9128dSAmadeusz Sławiński 573cec9128dSAmadeusz Sławiński kunit_comp->card.dev = test_dev, 574cec9128dSAmadeusz Sławiński kunit_comp->card.name = "kunit-card", 575cec9128dSAmadeusz Sławiński kunit_comp->card.owner = THIS_MODULE, 576cec9128dSAmadeusz Sławiński kunit_comp->card.dai_link = kunit_dai_links, 577cec9128dSAmadeusz Sławiński kunit_comp->card.num_links = ARRAY_SIZE(kunit_dai_links), 578cec9128dSAmadeusz Sławiński kunit_comp->card.fully_routed = true, 579cec9128dSAmadeusz Sławiński 580cec9128dSAmadeusz Sławiński /* run test */ 581cec9128dSAmadeusz Sławiński ret = snd_soc_register_card(&kunit_comp->card); 582cec9128dSAmadeusz Sławiński if (ret != 0 && ret != -EPROBE_DEFER) 583cec9128dSAmadeusz Sławiński KUNIT_FAIL(test, "Failed to register card"); 584cec9128dSAmadeusz Sławiński 585cec9128dSAmadeusz Sławiński ret = snd_soc_component_initialize(&kunit_comp->comp, &test_component, test_dev); 586cec9128dSAmadeusz Sławiński KUNIT_EXPECT_EQ(test, 0, ret); 587cec9128dSAmadeusz Sławiński 588cec9128dSAmadeusz Sławiński ret = snd_soc_add_component(&kunit_comp->comp, NULL, 0); 589cec9128dSAmadeusz Sławiński KUNIT_EXPECT_EQ(test, 0, ret); 590cec9128dSAmadeusz Sławiński 591cec9128dSAmadeusz Sławiński /* cleanup */ 592*d5017d13SUwe Kleine-König snd_soc_unregister_card(&kunit_comp->card); 593cec9128dSAmadeusz Sławiński 594cec9128dSAmadeusz Sławiński snd_soc_unregister_component(test_dev); 595cec9128dSAmadeusz Sławiński } 596cec9128dSAmadeusz Sławiński 597cec9128dSAmadeusz Sławiński // TEST CASE 598cec9128dSAmadeusz Sławiński // Test "empty" topology file, but with bad "payload_size" 599cec9128dSAmadeusz Sławiński // In theory we could loop through all possible bad values, but it takes too 600cec9128dSAmadeusz Sławiński // long, so just use the known wrong one 601cec9128dSAmadeusz Sławiński static void snd_soc_tplg_test_load_empty_tplg_bad_payload_size(struct kunit *test) 602cec9128dSAmadeusz Sławiński { 603cec9128dSAmadeusz Sławiński struct kunit_soc_component *kunit_comp; 604cec9128dSAmadeusz Sławiński struct tplg_tmpl_001 *data; 605cec9128dSAmadeusz Sławiński int size; 606cec9128dSAmadeusz Sławiński int ret; 607cec9128dSAmadeusz Sławiński 608cec9128dSAmadeusz Sławiński /* prepare */ 609cec9128dSAmadeusz Sławiński kunit_comp = kunit_kzalloc(test, sizeof(*kunit_comp), GFP_KERNEL); 610cec9128dSAmadeusz Sławiński KUNIT_EXPECT_NOT_ERR_OR_NULL(test, kunit_comp); 611cec9128dSAmadeusz Sławiński kunit_comp->kunit = test; 612cec9128dSAmadeusz Sławiński kunit_comp->expect = -EINVAL; /* expect failure */ 613cec9128dSAmadeusz Sławiński 614cec9128dSAmadeusz Sławiński size = sizeof(tplg_tmpl_empty); 615cec9128dSAmadeusz Sławiński data = kunit_kzalloc(kunit_comp->kunit, size, GFP_KERNEL); 616cec9128dSAmadeusz Sławiński KUNIT_EXPECT_NOT_ERR_OR_NULL(kunit_comp->kunit, data); 617cec9128dSAmadeusz Sławiński 618cec9128dSAmadeusz Sławiński memcpy(data, &tplg_tmpl_empty, sizeof(tplg_tmpl_empty)); 619cec9128dSAmadeusz Sławiński /* 620cec9128dSAmadeusz Sławiński * override payload size 621cec9128dSAmadeusz Sławiński * there is only explicit check for 0, so check with it, other values 622cec9128dSAmadeusz Sławiński * are handled by just not reading behind EOF 623cec9128dSAmadeusz Sławiński */ 624cec9128dSAmadeusz Sławiński data->header.payload_size = 0; 625cec9128dSAmadeusz Sławiński 626cec9128dSAmadeusz Sławiński kunit_comp->fw.data = (u8 *)data; 627cec9128dSAmadeusz Sławiński kunit_comp->fw.size = size; 628cec9128dSAmadeusz Sławiński 629cec9128dSAmadeusz Sławiński kunit_comp->card.dev = test_dev, 630cec9128dSAmadeusz Sławiński kunit_comp->card.name = "kunit-card", 631cec9128dSAmadeusz Sławiński kunit_comp->card.owner = THIS_MODULE, 632cec9128dSAmadeusz Sławiński kunit_comp->card.dai_link = kunit_dai_links, 633cec9128dSAmadeusz Sławiński kunit_comp->card.num_links = ARRAY_SIZE(kunit_dai_links), 634cec9128dSAmadeusz Sławiński kunit_comp->card.fully_routed = true, 635cec9128dSAmadeusz Sławiński 636cec9128dSAmadeusz Sławiński /* run test */ 637cec9128dSAmadeusz Sławiński ret = snd_soc_register_card(&kunit_comp->card); 638cec9128dSAmadeusz Sławiński if (ret != 0 && ret != -EPROBE_DEFER) 639cec9128dSAmadeusz Sławiński KUNIT_FAIL(test, "Failed to register card"); 640cec9128dSAmadeusz Sławiński 641cec9128dSAmadeusz Sławiński ret = snd_soc_component_initialize(&kunit_comp->comp, &test_component, test_dev); 642cec9128dSAmadeusz Sławiński KUNIT_EXPECT_EQ(test, 0, ret); 643cec9128dSAmadeusz Sławiński 644cec9128dSAmadeusz Sławiński ret = snd_soc_add_component(&kunit_comp->comp, NULL, 0); 645cec9128dSAmadeusz Sławiński KUNIT_EXPECT_EQ(test, 0, ret); 646cec9128dSAmadeusz Sławiński 647cec9128dSAmadeusz Sławiński /* cleanup */ 648cec9128dSAmadeusz Sławiński snd_soc_unregister_component(test_dev); 649cec9128dSAmadeusz Sławiński 650*d5017d13SUwe Kleine-König snd_soc_unregister_card(&kunit_comp->card); 651cec9128dSAmadeusz Sławiński } 652cec9128dSAmadeusz Sławiński 6533ad8c8e9SAmadeusz Sławiński // TEST CASE 6543ad8c8e9SAmadeusz Sławiński // Test passing topology file with PCM definition 6553ad8c8e9SAmadeusz Sławiński static void snd_soc_tplg_test_load_pcm_tplg(struct kunit *test) 6563ad8c8e9SAmadeusz Sławiński { 6573ad8c8e9SAmadeusz Sławiński struct kunit_soc_component *kunit_comp; 6583ad8c8e9SAmadeusz Sławiński u8 *data; 6593ad8c8e9SAmadeusz Sławiński int size; 6603ad8c8e9SAmadeusz Sławiński int ret; 6613ad8c8e9SAmadeusz Sławiński 6623ad8c8e9SAmadeusz Sławiński /* prepare */ 6633ad8c8e9SAmadeusz Sławiński kunit_comp = kunit_kzalloc(test, sizeof(*kunit_comp), GFP_KERNEL); 6643ad8c8e9SAmadeusz Sławiński KUNIT_EXPECT_NOT_ERR_OR_NULL(test, kunit_comp); 6653ad8c8e9SAmadeusz Sławiński kunit_comp->kunit = test; 6663ad8c8e9SAmadeusz Sławiński kunit_comp->expect = 0; /* expect success */ 6673ad8c8e9SAmadeusz Sławiński 6683ad8c8e9SAmadeusz Sławiński size = sizeof(tplg_tmpl_with_pcm); 6693ad8c8e9SAmadeusz Sławiński data = kunit_kzalloc(kunit_comp->kunit, size, GFP_KERNEL); 6703ad8c8e9SAmadeusz Sławiński KUNIT_EXPECT_NOT_ERR_OR_NULL(kunit_comp->kunit, data); 6713ad8c8e9SAmadeusz Sławiński 6723ad8c8e9SAmadeusz Sławiński memcpy(data, &tplg_tmpl_with_pcm, sizeof(tplg_tmpl_with_pcm)); 6733ad8c8e9SAmadeusz Sławiński 6743ad8c8e9SAmadeusz Sławiński kunit_comp->fw.data = data; 6753ad8c8e9SAmadeusz Sławiński kunit_comp->fw.size = size; 6763ad8c8e9SAmadeusz Sławiński 6773ad8c8e9SAmadeusz Sławiński kunit_comp->card.dev = test_dev, 6783ad8c8e9SAmadeusz Sławiński kunit_comp->card.name = "kunit-card", 6793ad8c8e9SAmadeusz Sławiński kunit_comp->card.owner = THIS_MODULE, 6803ad8c8e9SAmadeusz Sławiński kunit_comp->card.dai_link = kunit_dai_links, 6813ad8c8e9SAmadeusz Sławiński kunit_comp->card.num_links = ARRAY_SIZE(kunit_dai_links), 6823ad8c8e9SAmadeusz Sławiński kunit_comp->card.fully_routed = true, 6833ad8c8e9SAmadeusz Sławiński 6843ad8c8e9SAmadeusz Sławiński /* run test */ 6853ad8c8e9SAmadeusz Sławiński ret = snd_soc_register_card(&kunit_comp->card); 6863ad8c8e9SAmadeusz Sławiński if (ret != 0 && ret != -EPROBE_DEFER) 6873ad8c8e9SAmadeusz Sławiński KUNIT_FAIL(test, "Failed to register card"); 6883ad8c8e9SAmadeusz Sławiński 6893ad8c8e9SAmadeusz Sławiński ret = snd_soc_component_initialize(&kunit_comp->comp, &test_component, test_dev); 6903ad8c8e9SAmadeusz Sławiński KUNIT_EXPECT_EQ(test, 0, ret); 6913ad8c8e9SAmadeusz Sławiński 6923ad8c8e9SAmadeusz Sławiński ret = snd_soc_add_component(&kunit_comp->comp, NULL, 0); 6933ad8c8e9SAmadeusz Sławiński KUNIT_EXPECT_EQ(test, 0, ret); 6943ad8c8e9SAmadeusz Sławiński 6953ad8c8e9SAmadeusz Sławiński snd_soc_unregister_component(test_dev); 6963ad8c8e9SAmadeusz Sławiński 6973ad8c8e9SAmadeusz Sławiński /* cleanup */ 698*d5017d13SUwe Kleine-König snd_soc_unregister_card(&kunit_comp->card); 6993ad8c8e9SAmadeusz Sławiński } 7003ad8c8e9SAmadeusz Sławiński 7013ad8c8e9SAmadeusz Sławiński // TEST CASE 7023ad8c8e9SAmadeusz Sławiński // Test passing topology file with PCM definition 7033ad8c8e9SAmadeusz Sławiński // with component reload 7043ad8c8e9SAmadeusz Sławiński static void snd_soc_tplg_test_load_pcm_tplg_reload_comp(struct kunit *test) 7053ad8c8e9SAmadeusz Sławiński { 7063ad8c8e9SAmadeusz Sławiński struct kunit_soc_component *kunit_comp; 7073ad8c8e9SAmadeusz Sławiński u8 *data; 7083ad8c8e9SAmadeusz Sławiński int size; 7093ad8c8e9SAmadeusz Sławiński int ret; 7103ad8c8e9SAmadeusz Sławiński int i; 7113ad8c8e9SAmadeusz Sławiński 7123ad8c8e9SAmadeusz Sławiński /* prepare */ 7133ad8c8e9SAmadeusz Sławiński kunit_comp = kunit_kzalloc(test, sizeof(*kunit_comp), GFP_KERNEL); 7143ad8c8e9SAmadeusz Sławiński KUNIT_EXPECT_NOT_ERR_OR_NULL(test, kunit_comp); 7153ad8c8e9SAmadeusz Sławiński kunit_comp->kunit = test; 7163ad8c8e9SAmadeusz Sławiński kunit_comp->expect = 0; /* expect success */ 7173ad8c8e9SAmadeusz Sławiński 7183ad8c8e9SAmadeusz Sławiński size = sizeof(tplg_tmpl_with_pcm); 7193ad8c8e9SAmadeusz Sławiński data = kunit_kzalloc(kunit_comp->kunit, size, GFP_KERNEL); 7203ad8c8e9SAmadeusz Sławiński KUNIT_EXPECT_NOT_ERR_OR_NULL(kunit_comp->kunit, data); 7213ad8c8e9SAmadeusz Sławiński 7223ad8c8e9SAmadeusz Sławiński memcpy(data, &tplg_tmpl_with_pcm, sizeof(tplg_tmpl_with_pcm)); 7233ad8c8e9SAmadeusz Sławiński 7243ad8c8e9SAmadeusz Sławiński kunit_comp->fw.data = data; 7253ad8c8e9SAmadeusz Sławiński kunit_comp->fw.size = size; 7263ad8c8e9SAmadeusz Sławiński 7273ad8c8e9SAmadeusz Sławiński kunit_comp->card.dev = test_dev, 7283ad8c8e9SAmadeusz Sławiński kunit_comp->card.name = "kunit-card", 7293ad8c8e9SAmadeusz Sławiński kunit_comp->card.owner = THIS_MODULE, 7303ad8c8e9SAmadeusz Sławiński kunit_comp->card.dai_link = kunit_dai_links, 7313ad8c8e9SAmadeusz Sławiński kunit_comp->card.num_links = ARRAY_SIZE(kunit_dai_links), 7323ad8c8e9SAmadeusz Sławiński kunit_comp->card.fully_routed = true, 7333ad8c8e9SAmadeusz Sławiński 7343ad8c8e9SAmadeusz Sławiński /* run test */ 7353ad8c8e9SAmadeusz Sławiński ret = snd_soc_register_card(&kunit_comp->card); 7363ad8c8e9SAmadeusz Sławiński if (ret != 0 && ret != -EPROBE_DEFER) 7373ad8c8e9SAmadeusz Sławiński KUNIT_FAIL(test, "Failed to register card"); 7383ad8c8e9SAmadeusz Sławiński 7393ad8c8e9SAmadeusz Sławiński for (i = 0; i < 100; i++) { 7403ad8c8e9SAmadeusz Sławiński ret = snd_soc_component_initialize(&kunit_comp->comp, &test_component, test_dev); 7413ad8c8e9SAmadeusz Sławiński KUNIT_EXPECT_EQ(test, 0, ret); 7423ad8c8e9SAmadeusz Sławiński 7433ad8c8e9SAmadeusz Sławiński ret = snd_soc_add_component(&kunit_comp->comp, NULL, 0); 7443ad8c8e9SAmadeusz Sławiński KUNIT_EXPECT_EQ(test, 0, ret); 7453ad8c8e9SAmadeusz Sławiński 7463ad8c8e9SAmadeusz Sławiński snd_soc_unregister_component(test_dev); 7473ad8c8e9SAmadeusz Sławiński } 7483ad8c8e9SAmadeusz Sławiński 7493ad8c8e9SAmadeusz Sławiński /* cleanup */ 750*d5017d13SUwe Kleine-König snd_soc_unregister_card(&kunit_comp->card); 7513ad8c8e9SAmadeusz Sławiński } 7523ad8c8e9SAmadeusz Sławiński 7533ad8c8e9SAmadeusz Sławiński // TEST CASE 7543ad8c8e9SAmadeusz Sławiński // Test passing topology file with PCM definition 7553ad8c8e9SAmadeusz Sławiński // with card reload 7563ad8c8e9SAmadeusz Sławiński static void snd_soc_tplg_test_load_pcm_tplg_reload_card(struct kunit *test) 7573ad8c8e9SAmadeusz Sławiński { 7583ad8c8e9SAmadeusz Sławiński struct kunit_soc_component *kunit_comp; 7593ad8c8e9SAmadeusz Sławiński u8 *data; 7603ad8c8e9SAmadeusz Sławiński int size; 7613ad8c8e9SAmadeusz Sławiński int ret; 7623ad8c8e9SAmadeusz Sławiński int i; 7633ad8c8e9SAmadeusz Sławiński 7643ad8c8e9SAmadeusz Sławiński /* prepare */ 7653ad8c8e9SAmadeusz Sławiński kunit_comp = kunit_kzalloc(test, sizeof(*kunit_comp), GFP_KERNEL); 7663ad8c8e9SAmadeusz Sławiński KUNIT_EXPECT_NOT_ERR_OR_NULL(test, kunit_comp); 7673ad8c8e9SAmadeusz Sławiński kunit_comp->kunit = test; 7683ad8c8e9SAmadeusz Sławiński kunit_comp->expect = 0; /* expect success */ 7693ad8c8e9SAmadeusz Sławiński 7703ad8c8e9SAmadeusz Sławiński size = sizeof(tplg_tmpl_with_pcm); 7713ad8c8e9SAmadeusz Sławiński data = kunit_kzalloc(kunit_comp->kunit, size, GFP_KERNEL); 7723ad8c8e9SAmadeusz Sławiński KUNIT_EXPECT_NOT_ERR_OR_NULL(kunit_comp->kunit, data); 7733ad8c8e9SAmadeusz Sławiński 7743ad8c8e9SAmadeusz Sławiński memcpy(data, &tplg_tmpl_with_pcm, sizeof(tplg_tmpl_with_pcm)); 7753ad8c8e9SAmadeusz Sławiński 7763ad8c8e9SAmadeusz Sławiński kunit_comp->fw.data = data; 7773ad8c8e9SAmadeusz Sławiński kunit_comp->fw.size = size; 7783ad8c8e9SAmadeusz Sławiński 7793ad8c8e9SAmadeusz Sławiński kunit_comp->card.dev = test_dev, 7803ad8c8e9SAmadeusz Sławiński kunit_comp->card.name = "kunit-card", 7813ad8c8e9SAmadeusz Sławiński kunit_comp->card.owner = THIS_MODULE, 7823ad8c8e9SAmadeusz Sławiński kunit_comp->card.dai_link = kunit_dai_links, 7833ad8c8e9SAmadeusz Sławiński kunit_comp->card.num_links = ARRAY_SIZE(kunit_dai_links), 7843ad8c8e9SAmadeusz Sławiński kunit_comp->card.fully_routed = true, 7853ad8c8e9SAmadeusz Sławiński 7863ad8c8e9SAmadeusz Sławiński /* run test */ 7873ad8c8e9SAmadeusz Sławiński ret = snd_soc_component_initialize(&kunit_comp->comp, &test_component, test_dev); 7883ad8c8e9SAmadeusz Sławiński KUNIT_EXPECT_EQ(test, 0, ret); 7893ad8c8e9SAmadeusz Sławiński 7903ad8c8e9SAmadeusz Sławiński ret = snd_soc_add_component(&kunit_comp->comp, NULL, 0); 7913ad8c8e9SAmadeusz Sławiński KUNIT_EXPECT_EQ(test, 0, ret); 7923ad8c8e9SAmadeusz Sławiński 7933ad8c8e9SAmadeusz Sławiński for (i = 0; i < 100; i++) { 7943ad8c8e9SAmadeusz Sławiński ret = snd_soc_register_card(&kunit_comp->card); 7953ad8c8e9SAmadeusz Sławiński if (ret != 0 && ret != -EPROBE_DEFER) 7963ad8c8e9SAmadeusz Sławiński KUNIT_FAIL(test, "Failed to register card"); 7973ad8c8e9SAmadeusz Sławiński 798*d5017d13SUwe Kleine-König snd_soc_unregister_card(&kunit_comp->card); 7993ad8c8e9SAmadeusz Sławiński } 8003ad8c8e9SAmadeusz Sławiński 8013ad8c8e9SAmadeusz Sławiński /* cleanup */ 8023ad8c8e9SAmadeusz Sławiński snd_soc_unregister_component(test_dev); 8033ad8c8e9SAmadeusz Sławiński } 8043ad8c8e9SAmadeusz Sławiński 805d52bbf74SAmadeusz Sławiński /* ===== KUNIT MODULE DEFINITIONS =========================================== */ 806d52bbf74SAmadeusz Sławiński 807d52bbf74SAmadeusz Sławiński static struct kunit_case snd_soc_tplg_test_cases[] = { 808d52bbf74SAmadeusz Sławiński KUNIT_CASE(snd_soc_tplg_test_load_with_null_comp), 809d52bbf74SAmadeusz Sławiński KUNIT_CASE(snd_soc_tplg_test_load_with_null_ops), 810d52bbf74SAmadeusz Sławiński KUNIT_CASE(snd_soc_tplg_test_load_with_null_fw), 811cec9128dSAmadeusz Sławiński KUNIT_CASE(snd_soc_tplg_test_load_empty_tplg), 812cec9128dSAmadeusz Sławiński KUNIT_CASE(snd_soc_tplg_test_load_empty_tplg_bad_magic), 813cec9128dSAmadeusz Sławiński KUNIT_CASE(snd_soc_tplg_test_load_empty_tplg_bad_abi), 814cec9128dSAmadeusz Sławiński KUNIT_CASE(snd_soc_tplg_test_load_empty_tplg_bad_size), 815cec9128dSAmadeusz Sławiński KUNIT_CASE(snd_soc_tplg_test_load_empty_tplg_bad_payload_size), 8163ad8c8e9SAmadeusz Sławiński KUNIT_CASE(snd_soc_tplg_test_load_pcm_tplg), 8173ad8c8e9SAmadeusz Sławiński KUNIT_CASE(snd_soc_tplg_test_load_pcm_tplg_reload_comp), 8183ad8c8e9SAmadeusz Sławiński KUNIT_CASE(snd_soc_tplg_test_load_pcm_tplg_reload_card), 819d52bbf74SAmadeusz Sławiński {} 820d52bbf74SAmadeusz Sławiński }; 821d52bbf74SAmadeusz Sławiński 822d52bbf74SAmadeusz Sławiński static struct kunit_suite snd_soc_tplg_test_suite = { 823d52bbf74SAmadeusz Sławiński .name = "snd_soc_tplg_test", 824d52bbf74SAmadeusz Sławiński .init = snd_soc_tplg_test_init, 825d52bbf74SAmadeusz Sławiński .exit = snd_soc_tplg_test_exit, 826d52bbf74SAmadeusz Sławiński .test_cases = snd_soc_tplg_test_cases, 827d52bbf74SAmadeusz Sławiński }; 828d52bbf74SAmadeusz Sławiński 829d52bbf74SAmadeusz Sławiński kunit_test_suites(&snd_soc_tplg_test_suite); 830d52bbf74SAmadeusz Sławiński 831d52bbf74SAmadeusz Sławiński MODULE_LICENSE("GPL"); 832