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 */ 274*1892a991SUwe 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 */ 316d52bbf74SAmadeusz Sławiński ret = snd_soc_unregister_card(&kunit_comp->card); 317d52bbf74SAmadeusz Sławiński KUNIT_EXPECT_EQ(test, 0, ret); 318d52bbf74SAmadeusz Sławiński 319d52bbf74SAmadeusz Sławiński snd_soc_unregister_component(test_dev); 320d52bbf74SAmadeusz Sławiński } 321d52bbf74SAmadeusz Sławiński 322d52bbf74SAmadeusz Sławiński // TEST CASE 323d52bbf74SAmadeusz Sławiński // Test passing NULL fw as parameter to snd_soc_tplg_component_load 324d52bbf74SAmadeusz Sławiński 325d52bbf74SAmadeusz Sławiński /* 326d52bbf74SAmadeusz Sławiński * need to override generic probe function with one using NULL pointer to fw 327d52bbf74SAmadeusz Sławiński * when calling topology load during component initialization, we don't need 328d52bbf74SAmadeusz Sławiński * .remove handler as load should fail 329d52bbf74SAmadeusz Sławiński */ 330d52bbf74SAmadeusz Sławiński static int d_probe_null_fw(struct snd_soc_component *component) 331d52bbf74SAmadeusz Sławiński { 332d52bbf74SAmadeusz Sławiński struct kunit_soc_component *kunit_comp = 333d52bbf74SAmadeusz Sławiński container_of(component, struct kunit_soc_component, comp); 334d52bbf74SAmadeusz Sławiński int ret; 335d52bbf74SAmadeusz Sławiński 336d52bbf74SAmadeusz Sławiński /* instead of passing fw pointer as third argument, pass NULL here */ 337d52bbf74SAmadeusz Sławiński ret = snd_soc_tplg_component_load(component, NULL, NULL); 338d52bbf74SAmadeusz Sławiński KUNIT_EXPECT_EQ_MSG(kunit_comp->kunit, kunit_comp->expect, ret, 339d52bbf74SAmadeusz Sławiński "Failed topology load"); 340d52bbf74SAmadeusz Sławiński 341d52bbf74SAmadeusz Sławiński return 0; 342d52bbf74SAmadeusz Sławiński } 343d52bbf74SAmadeusz Sławiński 344d52bbf74SAmadeusz Sławiński static const struct snd_soc_component_driver test_component_null_fw = { 345d52bbf74SAmadeusz Sławiński .name = "sound-soc-topology-test", 346d52bbf74SAmadeusz Sławiński .probe = d_probe_null_fw, 347d52bbf74SAmadeusz Sławiński .non_legacy_dai_naming = 1, 348d52bbf74SAmadeusz Sławiński }; 349d52bbf74SAmadeusz Sławiński 350d52bbf74SAmadeusz Sławiński static void snd_soc_tplg_test_load_with_null_fw(struct kunit *test) 351d52bbf74SAmadeusz Sławiński { 352d52bbf74SAmadeusz Sławiński struct kunit_soc_component *kunit_comp; 353d52bbf74SAmadeusz Sławiński int ret; 354d52bbf74SAmadeusz Sławiński 355d52bbf74SAmadeusz Sławiński /* prepare */ 356d52bbf74SAmadeusz Sławiński kunit_comp = kunit_kzalloc(test, sizeof(*kunit_comp), GFP_KERNEL); 357d52bbf74SAmadeusz Sławiński KUNIT_EXPECT_NOT_ERR_OR_NULL(test, kunit_comp); 358d52bbf74SAmadeusz Sławiński kunit_comp->kunit = test; 359d52bbf74SAmadeusz Sławiński kunit_comp->expect = -EINVAL; /* expect failure */ 360d52bbf74SAmadeusz Sławiński 361d52bbf74SAmadeusz Sławiński kunit_comp->card.dev = test_dev, 362d52bbf74SAmadeusz Sławiński kunit_comp->card.name = "kunit-card", 363d52bbf74SAmadeusz Sławiński kunit_comp->card.owner = THIS_MODULE, 364d52bbf74SAmadeusz Sławiński kunit_comp->card.dai_link = kunit_dai_links, 365d52bbf74SAmadeusz Sławiński kunit_comp->card.num_links = ARRAY_SIZE(kunit_dai_links), 366d52bbf74SAmadeusz Sławiński kunit_comp->card.fully_routed = true, 367d52bbf74SAmadeusz Sławiński 368d52bbf74SAmadeusz Sławiński /* run test */ 369d52bbf74SAmadeusz Sławiński ret = snd_soc_register_card(&kunit_comp->card); 370d52bbf74SAmadeusz Sławiński if (ret != 0 && ret != -EPROBE_DEFER) 371d52bbf74SAmadeusz Sławiński KUNIT_FAIL(test, "Failed to register card"); 372d52bbf74SAmadeusz Sławiński 373d52bbf74SAmadeusz Sławiński ret = snd_soc_component_initialize(&kunit_comp->comp, &test_component_null_fw, test_dev); 374d52bbf74SAmadeusz Sławiński KUNIT_EXPECT_EQ(test, 0, ret); 375d52bbf74SAmadeusz Sławiński 376d52bbf74SAmadeusz Sławiński ret = snd_soc_add_component(&kunit_comp->comp, NULL, 0); 377d52bbf74SAmadeusz Sławiński KUNIT_EXPECT_EQ(test, 0, ret); 378d52bbf74SAmadeusz Sławiński 379d52bbf74SAmadeusz Sławiński /* cleanup */ 380d52bbf74SAmadeusz Sławiński ret = snd_soc_unregister_card(&kunit_comp->card); 381d52bbf74SAmadeusz Sławiński KUNIT_EXPECT_EQ(test, 0, ret); 382d52bbf74SAmadeusz Sławiński 383d52bbf74SAmadeusz Sławiński snd_soc_unregister_component(test_dev); 384d52bbf74SAmadeusz Sławiński } 385d52bbf74SAmadeusz Sławiński 386cec9128dSAmadeusz Sławiński // TEST CASE 387cec9128dSAmadeusz Sławiński // Test passing "empty" topology file 388cec9128dSAmadeusz Sławiński static void snd_soc_tplg_test_load_empty_tplg(struct kunit *test) 389cec9128dSAmadeusz Sławiński { 390cec9128dSAmadeusz Sławiński struct kunit_soc_component *kunit_comp; 391cec9128dSAmadeusz Sławiński struct tplg_tmpl_001 *data; 392cec9128dSAmadeusz Sławiński int size; 393cec9128dSAmadeusz Sławiński int ret; 394cec9128dSAmadeusz Sławiński 395cec9128dSAmadeusz Sławiński /* prepare */ 396cec9128dSAmadeusz Sławiński kunit_comp = kunit_kzalloc(test, sizeof(*kunit_comp), GFP_KERNEL); 397cec9128dSAmadeusz Sławiński KUNIT_EXPECT_NOT_ERR_OR_NULL(test, kunit_comp); 398cec9128dSAmadeusz Sławiński kunit_comp->kunit = test; 399cec9128dSAmadeusz Sławiński kunit_comp->expect = 0; /* expect success */ 400cec9128dSAmadeusz Sławiński 401cec9128dSAmadeusz Sławiński size = sizeof(tplg_tmpl_empty); 402cec9128dSAmadeusz Sławiński data = kunit_kzalloc(kunit_comp->kunit, size, GFP_KERNEL); 403cec9128dSAmadeusz Sławiński KUNIT_EXPECT_NOT_ERR_OR_NULL(kunit_comp->kunit, data); 404cec9128dSAmadeusz Sławiński 405cec9128dSAmadeusz Sławiński memcpy(data, &tplg_tmpl_empty, sizeof(tplg_tmpl_empty)); 406cec9128dSAmadeusz Sławiński 407cec9128dSAmadeusz Sławiński kunit_comp->fw.data = (u8 *)data; 408cec9128dSAmadeusz Sławiński kunit_comp->fw.size = size; 409cec9128dSAmadeusz Sławiński 410cec9128dSAmadeusz Sławiński kunit_comp->card.dev = test_dev, 411cec9128dSAmadeusz Sławiński kunit_comp->card.name = "kunit-card", 412cec9128dSAmadeusz Sławiński kunit_comp->card.owner = THIS_MODULE, 413cec9128dSAmadeusz Sławiński kunit_comp->card.dai_link = kunit_dai_links, 414cec9128dSAmadeusz Sławiński kunit_comp->card.num_links = ARRAY_SIZE(kunit_dai_links), 415cec9128dSAmadeusz Sławiński kunit_comp->card.fully_routed = true, 416cec9128dSAmadeusz Sławiński 417cec9128dSAmadeusz Sławiński /* run test */ 418cec9128dSAmadeusz Sławiński ret = snd_soc_register_card(&kunit_comp->card); 419cec9128dSAmadeusz Sławiński if (ret != 0 && ret != -EPROBE_DEFER) 420cec9128dSAmadeusz Sławiński KUNIT_FAIL(test, "Failed to register card"); 421cec9128dSAmadeusz Sławiński 422cec9128dSAmadeusz Sławiński ret = snd_soc_component_initialize(&kunit_comp->comp, &test_component, test_dev); 423cec9128dSAmadeusz Sławiński KUNIT_EXPECT_EQ(test, 0, ret); 424cec9128dSAmadeusz Sławiński 425cec9128dSAmadeusz Sławiński ret = snd_soc_add_component(&kunit_comp->comp, NULL, 0); 426cec9128dSAmadeusz Sławiński KUNIT_EXPECT_EQ(test, 0, ret); 427cec9128dSAmadeusz Sławiński 428cec9128dSAmadeusz Sławiński /* cleanup */ 429cec9128dSAmadeusz Sławiński ret = snd_soc_unregister_card(&kunit_comp->card); 430cec9128dSAmadeusz Sławiński KUNIT_EXPECT_EQ(test, 0, ret); 431cec9128dSAmadeusz Sławiński 432cec9128dSAmadeusz Sławiński snd_soc_unregister_component(test_dev); 433cec9128dSAmadeusz Sławiński } 434cec9128dSAmadeusz Sławiński 435cec9128dSAmadeusz Sławiński // TEST CASE 436cec9128dSAmadeusz Sławiński // Test "empty" topology file, but with bad "magic" 437cec9128dSAmadeusz Sławiński // In theory we could loop through all possible bad values, but it takes too 438cec9128dSAmadeusz Sławiński // long, so just use SND_SOC_TPLG_MAGIC + 1 439cec9128dSAmadeusz Sławiński static void snd_soc_tplg_test_load_empty_tplg_bad_magic(struct kunit *test) 440cec9128dSAmadeusz Sławiński { 441cec9128dSAmadeusz Sławiński struct kunit_soc_component *kunit_comp; 442cec9128dSAmadeusz Sławiński struct tplg_tmpl_001 *data; 443cec9128dSAmadeusz Sławiński int size; 444cec9128dSAmadeusz Sławiński int ret; 445cec9128dSAmadeusz Sławiński 446cec9128dSAmadeusz Sławiński /* prepare */ 447cec9128dSAmadeusz Sławiński kunit_comp = kunit_kzalloc(test, sizeof(*kunit_comp), GFP_KERNEL); 448cec9128dSAmadeusz Sławiński KUNIT_EXPECT_NOT_ERR_OR_NULL(test, kunit_comp); 449cec9128dSAmadeusz Sławiński kunit_comp->kunit = test; 450cec9128dSAmadeusz Sławiński kunit_comp->expect = -EINVAL; /* expect failure */ 451cec9128dSAmadeusz Sławiński 452cec9128dSAmadeusz Sławiński size = sizeof(tplg_tmpl_empty); 453cec9128dSAmadeusz Sławiński data = kunit_kzalloc(kunit_comp->kunit, size, GFP_KERNEL); 454cec9128dSAmadeusz Sławiński KUNIT_EXPECT_NOT_ERR_OR_NULL(kunit_comp->kunit, data); 455cec9128dSAmadeusz Sławiński 456cec9128dSAmadeusz Sławiński memcpy(data, &tplg_tmpl_empty, sizeof(tplg_tmpl_empty)); 457cec9128dSAmadeusz Sławiński /* 458cec9128dSAmadeusz Sławiński * override abi 459cec9128dSAmadeusz Sławiński * any value != magic number is wrong 460cec9128dSAmadeusz Sławiński */ 461be6be67eSAmadeusz Sławiński data->header.magic = cpu_to_le32(SND_SOC_TPLG_MAGIC + 1); 462cec9128dSAmadeusz Sławiński 463cec9128dSAmadeusz Sławiński kunit_comp->fw.data = (u8 *)data; 464cec9128dSAmadeusz Sławiński kunit_comp->fw.size = size; 465cec9128dSAmadeusz Sławiński 466cec9128dSAmadeusz Sławiński kunit_comp->card.dev = test_dev, 467cec9128dSAmadeusz Sławiński kunit_comp->card.name = "kunit-card", 468cec9128dSAmadeusz Sławiński kunit_comp->card.owner = THIS_MODULE, 469cec9128dSAmadeusz Sławiński kunit_comp->card.dai_link = kunit_dai_links, 470cec9128dSAmadeusz Sławiński kunit_comp->card.num_links = ARRAY_SIZE(kunit_dai_links), 471cec9128dSAmadeusz Sławiński kunit_comp->card.fully_routed = true, 472cec9128dSAmadeusz Sławiński 473cec9128dSAmadeusz Sławiński /* run test */ 474cec9128dSAmadeusz Sławiński ret = snd_soc_register_card(&kunit_comp->card); 475cec9128dSAmadeusz Sławiński if (ret != 0 && ret != -EPROBE_DEFER) 476cec9128dSAmadeusz Sławiński KUNIT_FAIL(test, "Failed to register card"); 477cec9128dSAmadeusz Sławiński 478cec9128dSAmadeusz Sławiński ret = snd_soc_component_initialize(&kunit_comp->comp, &test_component, test_dev); 479cec9128dSAmadeusz Sławiński KUNIT_EXPECT_EQ(test, 0, ret); 480cec9128dSAmadeusz Sławiński 481cec9128dSAmadeusz Sławiński ret = snd_soc_add_component(&kunit_comp->comp, NULL, 0); 482cec9128dSAmadeusz Sławiński KUNIT_EXPECT_EQ(test, 0, ret); 483cec9128dSAmadeusz Sławiński 484cec9128dSAmadeusz Sławiński /* cleanup */ 485cec9128dSAmadeusz Sławiński ret = snd_soc_unregister_card(&kunit_comp->card); 486cec9128dSAmadeusz Sławiński KUNIT_EXPECT_EQ(test, 0, ret); 487cec9128dSAmadeusz Sławiński 488cec9128dSAmadeusz Sławiński snd_soc_unregister_component(test_dev); 489cec9128dSAmadeusz Sławiński } 490cec9128dSAmadeusz Sławiński 491cec9128dSAmadeusz Sławiński // TEST CASE 492cec9128dSAmadeusz Sławiński // Test "empty" topology file, but with bad "abi" 493cec9128dSAmadeusz Sławiński // In theory we could loop through all possible bad values, but it takes too 494cec9128dSAmadeusz Sławiński // long, so just use SND_SOC_TPLG_ABI_VERSION + 1 495cec9128dSAmadeusz Sławiński static void snd_soc_tplg_test_load_empty_tplg_bad_abi(struct kunit *test) 496cec9128dSAmadeusz Sławiński { 497cec9128dSAmadeusz Sławiński struct kunit_soc_component *kunit_comp; 498cec9128dSAmadeusz Sławiński struct tplg_tmpl_001 *data; 499cec9128dSAmadeusz Sławiński int size; 500cec9128dSAmadeusz Sławiński int ret; 501cec9128dSAmadeusz Sławiński 502cec9128dSAmadeusz Sławiński /* prepare */ 503cec9128dSAmadeusz Sławiński kunit_comp = kunit_kzalloc(test, sizeof(*kunit_comp), GFP_KERNEL); 504cec9128dSAmadeusz Sławiński KUNIT_EXPECT_NOT_ERR_OR_NULL(test, kunit_comp); 505cec9128dSAmadeusz Sławiński kunit_comp->kunit = test; 506cec9128dSAmadeusz Sławiński kunit_comp->expect = -EINVAL; /* expect failure */ 507cec9128dSAmadeusz Sławiński 508cec9128dSAmadeusz Sławiński size = sizeof(tplg_tmpl_empty); 509cec9128dSAmadeusz Sławiński data = kunit_kzalloc(kunit_comp->kunit, size, GFP_KERNEL); 510cec9128dSAmadeusz Sławiński KUNIT_EXPECT_NOT_ERR_OR_NULL(kunit_comp->kunit, data); 511cec9128dSAmadeusz Sławiński 512cec9128dSAmadeusz Sławiński memcpy(data, &tplg_tmpl_empty, sizeof(tplg_tmpl_empty)); 513cec9128dSAmadeusz Sławiński /* 514cec9128dSAmadeusz Sławiński * override abi 515cec9128dSAmadeusz Sławiński * any value != accepted range is wrong 516cec9128dSAmadeusz Sławiński */ 517be6be67eSAmadeusz Sławiński data->header.abi = cpu_to_le32(SND_SOC_TPLG_ABI_VERSION + 1); 518cec9128dSAmadeusz Sławiński 519cec9128dSAmadeusz Sławiński kunit_comp->fw.data = (u8 *)data; 520cec9128dSAmadeusz Sławiński kunit_comp->fw.size = size; 521cec9128dSAmadeusz Sławiński 522cec9128dSAmadeusz Sławiński kunit_comp->card.dev = test_dev, 523cec9128dSAmadeusz Sławiński kunit_comp->card.name = "kunit-card", 524cec9128dSAmadeusz Sławiński kunit_comp->card.owner = THIS_MODULE, 525cec9128dSAmadeusz Sławiński kunit_comp->card.dai_link = kunit_dai_links, 526cec9128dSAmadeusz Sławiński kunit_comp->card.num_links = ARRAY_SIZE(kunit_dai_links), 527cec9128dSAmadeusz Sławiński kunit_comp->card.fully_routed = true, 528cec9128dSAmadeusz Sławiński 529cec9128dSAmadeusz Sławiński /* run test */ 530cec9128dSAmadeusz Sławiński ret = snd_soc_register_card(&kunit_comp->card); 531cec9128dSAmadeusz Sławiński if (ret != 0 && ret != -EPROBE_DEFER) 532cec9128dSAmadeusz Sławiński KUNIT_FAIL(test, "Failed to register card"); 533cec9128dSAmadeusz Sławiński 534cec9128dSAmadeusz Sławiński ret = snd_soc_component_initialize(&kunit_comp->comp, &test_component, test_dev); 535cec9128dSAmadeusz Sławiński KUNIT_EXPECT_EQ(test, 0, ret); 536cec9128dSAmadeusz Sławiński 537cec9128dSAmadeusz Sławiński ret = snd_soc_add_component(&kunit_comp->comp, NULL, 0); 538cec9128dSAmadeusz Sławiński KUNIT_EXPECT_EQ(test, 0, ret); 539cec9128dSAmadeusz Sławiński 540cec9128dSAmadeusz Sławiński /* cleanup */ 541cec9128dSAmadeusz Sławiński ret = snd_soc_unregister_card(&kunit_comp->card); 542cec9128dSAmadeusz Sławiński KUNIT_EXPECT_EQ(test, 0, ret); 543cec9128dSAmadeusz Sławiński 544cec9128dSAmadeusz Sławiński snd_soc_unregister_component(test_dev); 545cec9128dSAmadeusz Sławiński } 546cec9128dSAmadeusz Sławiński 547cec9128dSAmadeusz Sławiński // TEST CASE 548cec9128dSAmadeusz Sławiński // Test "empty" topology file, but with bad "size" 549cec9128dSAmadeusz Sławiński // In theory we could loop through all possible bad values, but it takes too 550cec9128dSAmadeusz Sławiński // long, so just use sizeof(struct snd_soc_tplg_hdr) + 1 551cec9128dSAmadeusz Sławiński static void snd_soc_tplg_test_load_empty_tplg_bad_size(struct kunit *test) 552cec9128dSAmadeusz Sławiński { 553cec9128dSAmadeusz Sławiński struct kunit_soc_component *kunit_comp; 554cec9128dSAmadeusz Sławiński struct tplg_tmpl_001 *data; 555cec9128dSAmadeusz Sławiński int size; 556cec9128dSAmadeusz Sławiński int ret; 557cec9128dSAmadeusz Sławiński 558cec9128dSAmadeusz Sławiński /* prepare */ 559cec9128dSAmadeusz Sławiński kunit_comp = kunit_kzalloc(test, sizeof(*kunit_comp), GFP_KERNEL); 560cec9128dSAmadeusz Sławiński KUNIT_EXPECT_NOT_ERR_OR_NULL(test, kunit_comp); 561cec9128dSAmadeusz Sławiński kunit_comp->kunit = test; 562cec9128dSAmadeusz Sławiński kunit_comp->expect = -EINVAL; /* expect failure */ 563cec9128dSAmadeusz Sławiński 564cec9128dSAmadeusz Sławiński size = sizeof(tplg_tmpl_empty); 565cec9128dSAmadeusz Sławiński data = kunit_kzalloc(kunit_comp->kunit, size, GFP_KERNEL); 566cec9128dSAmadeusz Sławiński KUNIT_EXPECT_NOT_ERR_OR_NULL(kunit_comp->kunit, data); 567cec9128dSAmadeusz Sławiński 568cec9128dSAmadeusz Sławiński memcpy(data, &tplg_tmpl_empty, sizeof(tplg_tmpl_empty)); 569cec9128dSAmadeusz Sławiński /* 570cec9128dSAmadeusz Sławiński * override size 571cec9128dSAmadeusz Sławiński * any value != struct size is wrong 572cec9128dSAmadeusz Sławiński */ 573be6be67eSAmadeusz Sławiński data->header.size = cpu_to_le32(sizeof(struct snd_soc_tplg_hdr) + 1); 574cec9128dSAmadeusz Sławiński 575cec9128dSAmadeusz Sławiński kunit_comp->fw.data = (u8 *)data; 576cec9128dSAmadeusz Sławiński kunit_comp->fw.size = size; 577cec9128dSAmadeusz Sławiński 578cec9128dSAmadeusz Sławiński kunit_comp->card.dev = test_dev, 579cec9128dSAmadeusz Sławiński kunit_comp->card.name = "kunit-card", 580cec9128dSAmadeusz Sławiński kunit_comp->card.owner = THIS_MODULE, 581cec9128dSAmadeusz Sławiński kunit_comp->card.dai_link = kunit_dai_links, 582cec9128dSAmadeusz Sławiński kunit_comp->card.num_links = ARRAY_SIZE(kunit_dai_links), 583cec9128dSAmadeusz Sławiński kunit_comp->card.fully_routed = true, 584cec9128dSAmadeusz Sławiński 585cec9128dSAmadeusz Sławiński /* run test */ 586cec9128dSAmadeusz Sławiński ret = snd_soc_register_card(&kunit_comp->card); 587cec9128dSAmadeusz Sławiński if (ret != 0 && ret != -EPROBE_DEFER) 588cec9128dSAmadeusz Sławiński KUNIT_FAIL(test, "Failed to register card"); 589cec9128dSAmadeusz Sławiński 590cec9128dSAmadeusz Sławiński ret = snd_soc_component_initialize(&kunit_comp->comp, &test_component, test_dev); 591cec9128dSAmadeusz Sławiński KUNIT_EXPECT_EQ(test, 0, ret); 592cec9128dSAmadeusz Sławiński 593cec9128dSAmadeusz Sławiński ret = snd_soc_add_component(&kunit_comp->comp, NULL, 0); 594cec9128dSAmadeusz Sławiński KUNIT_EXPECT_EQ(test, 0, ret); 595cec9128dSAmadeusz Sławiński 596cec9128dSAmadeusz Sławiński /* cleanup */ 597cec9128dSAmadeusz Sławiński ret = snd_soc_unregister_card(&kunit_comp->card); 598cec9128dSAmadeusz Sławiński KUNIT_EXPECT_EQ(test, 0, ret); 599cec9128dSAmadeusz Sławiński 600cec9128dSAmadeusz Sławiński snd_soc_unregister_component(test_dev); 601cec9128dSAmadeusz Sławiński } 602cec9128dSAmadeusz Sławiński 603cec9128dSAmadeusz Sławiński // TEST CASE 604cec9128dSAmadeusz Sławiński // Test "empty" topology file, but with bad "payload_size" 605cec9128dSAmadeusz Sławiński // In theory we could loop through all possible bad values, but it takes too 606cec9128dSAmadeusz Sławiński // long, so just use the known wrong one 607cec9128dSAmadeusz Sławiński static void snd_soc_tplg_test_load_empty_tplg_bad_payload_size(struct kunit *test) 608cec9128dSAmadeusz Sławiński { 609cec9128dSAmadeusz Sławiński struct kunit_soc_component *kunit_comp; 610cec9128dSAmadeusz Sławiński struct tplg_tmpl_001 *data; 611cec9128dSAmadeusz Sławiński int size; 612cec9128dSAmadeusz Sławiński int ret; 613cec9128dSAmadeusz Sławiński 614cec9128dSAmadeusz Sławiński /* prepare */ 615cec9128dSAmadeusz Sławiński kunit_comp = kunit_kzalloc(test, sizeof(*kunit_comp), GFP_KERNEL); 616cec9128dSAmadeusz Sławiński KUNIT_EXPECT_NOT_ERR_OR_NULL(test, kunit_comp); 617cec9128dSAmadeusz Sławiński kunit_comp->kunit = test; 618cec9128dSAmadeusz Sławiński kunit_comp->expect = -EINVAL; /* expect failure */ 619cec9128dSAmadeusz Sławiński 620cec9128dSAmadeusz Sławiński size = sizeof(tplg_tmpl_empty); 621cec9128dSAmadeusz Sławiński data = kunit_kzalloc(kunit_comp->kunit, size, GFP_KERNEL); 622cec9128dSAmadeusz Sławiński KUNIT_EXPECT_NOT_ERR_OR_NULL(kunit_comp->kunit, data); 623cec9128dSAmadeusz Sławiński 624cec9128dSAmadeusz Sławiński memcpy(data, &tplg_tmpl_empty, sizeof(tplg_tmpl_empty)); 625cec9128dSAmadeusz Sławiński /* 626cec9128dSAmadeusz Sławiński * override payload size 627cec9128dSAmadeusz Sławiński * there is only explicit check for 0, so check with it, other values 628cec9128dSAmadeusz Sławiński * are handled by just not reading behind EOF 629cec9128dSAmadeusz Sławiński */ 630cec9128dSAmadeusz Sławiński data->header.payload_size = 0; 631cec9128dSAmadeusz Sławiński 632cec9128dSAmadeusz Sławiński kunit_comp->fw.data = (u8 *)data; 633cec9128dSAmadeusz Sławiński kunit_comp->fw.size = size; 634cec9128dSAmadeusz Sławiński 635cec9128dSAmadeusz Sławiński kunit_comp->card.dev = test_dev, 636cec9128dSAmadeusz Sławiński kunit_comp->card.name = "kunit-card", 637cec9128dSAmadeusz Sławiński kunit_comp->card.owner = THIS_MODULE, 638cec9128dSAmadeusz Sławiński kunit_comp->card.dai_link = kunit_dai_links, 639cec9128dSAmadeusz Sławiński kunit_comp->card.num_links = ARRAY_SIZE(kunit_dai_links), 640cec9128dSAmadeusz Sławiński kunit_comp->card.fully_routed = true, 641cec9128dSAmadeusz Sławiński 642cec9128dSAmadeusz Sławiński /* run test */ 643cec9128dSAmadeusz Sławiński ret = snd_soc_register_card(&kunit_comp->card); 644cec9128dSAmadeusz Sławiński if (ret != 0 && ret != -EPROBE_DEFER) 645cec9128dSAmadeusz Sławiński KUNIT_FAIL(test, "Failed to register card"); 646cec9128dSAmadeusz Sławiński 647cec9128dSAmadeusz Sławiński ret = snd_soc_component_initialize(&kunit_comp->comp, &test_component, test_dev); 648cec9128dSAmadeusz Sławiński KUNIT_EXPECT_EQ(test, 0, ret); 649cec9128dSAmadeusz Sławiński 650cec9128dSAmadeusz Sławiński ret = snd_soc_add_component(&kunit_comp->comp, NULL, 0); 651cec9128dSAmadeusz Sławiński KUNIT_EXPECT_EQ(test, 0, ret); 652cec9128dSAmadeusz Sławiński 653cec9128dSAmadeusz Sławiński /* cleanup */ 654cec9128dSAmadeusz Sławiński snd_soc_unregister_component(test_dev); 655cec9128dSAmadeusz Sławiński 656cec9128dSAmadeusz Sławiński ret = snd_soc_unregister_card(&kunit_comp->card); 657cec9128dSAmadeusz Sławiński KUNIT_EXPECT_EQ(test, 0, ret); 658cec9128dSAmadeusz Sławiński } 659cec9128dSAmadeusz Sławiński 6603ad8c8e9SAmadeusz Sławiński // TEST CASE 6613ad8c8e9SAmadeusz Sławiński // Test passing topology file with PCM definition 6623ad8c8e9SAmadeusz Sławiński static void snd_soc_tplg_test_load_pcm_tplg(struct kunit *test) 6633ad8c8e9SAmadeusz Sławiński { 6643ad8c8e9SAmadeusz Sławiński struct kunit_soc_component *kunit_comp; 6653ad8c8e9SAmadeusz Sławiński u8 *data; 6663ad8c8e9SAmadeusz Sławiński int size; 6673ad8c8e9SAmadeusz Sławiński int ret; 6683ad8c8e9SAmadeusz Sławiński 6693ad8c8e9SAmadeusz Sławiński /* prepare */ 6703ad8c8e9SAmadeusz Sławiński kunit_comp = kunit_kzalloc(test, sizeof(*kunit_comp), GFP_KERNEL); 6713ad8c8e9SAmadeusz Sławiński KUNIT_EXPECT_NOT_ERR_OR_NULL(test, kunit_comp); 6723ad8c8e9SAmadeusz Sławiński kunit_comp->kunit = test; 6733ad8c8e9SAmadeusz Sławiński kunit_comp->expect = 0; /* expect success */ 6743ad8c8e9SAmadeusz Sławiński 6753ad8c8e9SAmadeusz Sławiński size = sizeof(tplg_tmpl_with_pcm); 6763ad8c8e9SAmadeusz Sławiński data = kunit_kzalloc(kunit_comp->kunit, size, GFP_KERNEL); 6773ad8c8e9SAmadeusz Sławiński KUNIT_EXPECT_NOT_ERR_OR_NULL(kunit_comp->kunit, data); 6783ad8c8e9SAmadeusz Sławiński 6793ad8c8e9SAmadeusz Sławiński memcpy(data, &tplg_tmpl_with_pcm, sizeof(tplg_tmpl_with_pcm)); 6803ad8c8e9SAmadeusz Sławiński 6813ad8c8e9SAmadeusz Sławiński kunit_comp->fw.data = data; 6823ad8c8e9SAmadeusz Sławiński kunit_comp->fw.size = size; 6833ad8c8e9SAmadeusz Sławiński 6843ad8c8e9SAmadeusz Sławiński kunit_comp->card.dev = test_dev, 6853ad8c8e9SAmadeusz Sławiński kunit_comp->card.name = "kunit-card", 6863ad8c8e9SAmadeusz Sławiński kunit_comp->card.owner = THIS_MODULE, 6873ad8c8e9SAmadeusz Sławiński kunit_comp->card.dai_link = kunit_dai_links, 6883ad8c8e9SAmadeusz Sławiński kunit_comp->card.num_links = ARRAY_SIZE(kunit_dai_links), 6893ad8c8e9SAmadeusz Sławiński kunit_comp->card.fully_routed = true, 6903ad8c8e9SAmadeusz Sławiński 6913ad8c8e9SAmadeusz Sławiński /* run test */ 6923ad8c8e9SAmadeusz Sławiński ret = snd_soc_register_card(&kunit_comp->card); 6933ad8c8e9SAmadeusz Sławiński if (ret != 0 && ret != -EPROBE_DEFER) 6943ad8c8e9SAmadeusz Sławiński KUNIT_FAIL(test, "Failed to register card"); 6953ad8c8e9SAmadeusz Sławiński 6963ad8c8e9SAmadeusz Sławiński ret = snd_soc_component_initialize(&kunit_comp->comp, &test_component, test_dev); 6973ad8c8e9SAmadeusz Sławiński KUNIT_EXPECT_EQ(test, 0, ret); 6983ad8c8e9SAmadeusz Sławiński 6993ad8c8e9SAmadeusz Sławiński ret = snd_soc_add_component(&kunit_comp->comp, NULL, 0); 7003ad8c8e9SAmadeusz Sławiński KUNIT_EXPECT_EQ(test, 0, ret); 7013ad8c8e9SAmadeusz Sławiński 7023ad8c8e9SAmadeusz Sławiński snd_soc_unregister_component(test_dev); 7033ad8c8e9SAmadeusz Sławiński 7043ad8c8e9SAmadeusz Sławiński /* cleanup */ 7053ad8c8e9SAmadeusz Sławiński ret = snd_soc_unregister_card(&kunit_comp->card); 7063ad8c8e9SAmadeusz Sławiński KUNIT_EXPECT_EQ(test, 0, ret); 7073ad8c8e9SAmadeusz Sławiński } 7083ad8c8e9SAmadeusz Sławiński 7093ad8c8e9SAmadeusz Sławiński // TEST CASE 7103ad8c8e9SAmadeusz Sławiński // Test passing topology file with PCM definition 7113ad8c8e9SAmadeusz Sławiński // with component reload 7123ad8c8e9SAmadeusz Sławiński static void snd_soc_tplg_test_load_pcm_tplg_reload_comp(struct kunit *test) 7133ad8c8e9SAmadeusz Sławiński { 7143ad8c8e9SAmadeusz Sławiński struct kunit_soc_component *kunit_comp; 7153ad8c8e9SAmadeusz Sławiński u8 *data; 7163ad8c8e9SAmadeusz Sławiński int size; 7173ad8c8e9SAmadeusz Sławiński int ret; 7183ad8c8e9SAmadeusz Sławiński int i; 7193ad8c8e9SAmadeusz Sławiński 7203ad8c8e9SAmadeusz Sławiński /* prepare */ 7213ad8c8e9SAmadeusz Sławiński kunit_comp = kunit_kzalloc(test, sizeof(*kunit_comp), GFP_KERNEL); 7223ad8c8e9SAmadeusz Sławiński KUNIT_EXPECT_NOT_ERR_OR_NULL(test, kunit_comp); 7233ad8c8e9SAmadeusz Sławiński kunit_comp->kunit = test; 7243ad8c8e9SAmadeusz Sławiński kunit_comp->expect = 0; /* expect success */ 7253ad8c8e9SAmadeusz Sławiński 7263ad8c8e9SAmadeusz Sławiński size = sizeof(tplg_tmpl_with_pcm); 7273ad8c8e9SAmadeusz Sławiński data = kunit_kzalloc(kunit_comp->kunit, size, GFP_KERNEL); 7283ad8c8e9SAmadeusz Sławiński KUNIT_EXPECT_NOT_ERR_OR_NULL(kunit_comp->kunit, data); 7293ad8c8e9SAmadeusz Sławiński 7303ad8c8e9SAmadeusz Sławiński memcpy(data, &tplg_tmpl_with_pcm, sizeof(tplg_tmpl_with_pcm)); 7313ad8c8e9SAmadeusz Sławiński 7323ad8c8e9SAmadeusz Sławiński kunit_comp->fw.data = data; 7333ad8c8e9SAmadeusz Sławiński kunit_comp->fw.size = size; 7343ad8c8e9SAmadeusz Sławiński 7353ad8c8e9SAmadeusz Sławiński kunit_comp->card.dev = test_dev, 7363ad8c8e9SAmadeusz Sławiński kunit_comp->card.name = "kunit-card", 7373ad8c8e9SAmadeusz Sławiński kunit_comp->card.owner = THIS_MODULE, 7383ad8c8e9SAmadeusz Sławiński kunit_comp->card.dai_link = kunit_dai_links, 7393ad8c8e9SAmadeusz Sławiński kunit_comp->card.num_links = ARRAY_SIZE(kunit_dai_links), 7403ad8c8e9SAmadeusz Sławiński kunit_comp->card.fully_routed = true, 7413ad8c8e9SAmadeusz Sławiński 7423ad8c8e9SAmadeusz Sławiński /* run test */ 7433ad8c8e9SAmadeusz Sławiński ret = snd_soc_register_card(&kunit_comp->card); 7443ad8c8e9SAmadeusz Sławiński if (ret != 0 && ret != -EPROBE_DEFER) 7453ad8c8e9SAmadeusz Sławiński KUNIT_FAIL(test, "Failed to register card"); 7463ad8c8e9SAmadeusz Sławiński 7473ad8c8e9SAmadeusz Sławiński for (i = 0; i < 100; i++) { 7483ad8c8e9SAmadeusz Sławiński ret = snd_soc_component_initialize(&kunit_comp->comp, &test_component, test_dev); 7493ad8c8e9SAmadeusz Sławiński KUNIT_EXPECT_EQ(test, 0, ret); 7503ad8c8e9SAmadeusz Sławiński 7513ad8c8e9SAmadeusz Sławiński ret = snd_soc_add_component(&kunit_comp->comp, NULL, 0); 7523ad8c8e9SAmadeusz Sławiński KUNIT_EXPECT_EQ(test, 0, ret); 7533ad8c8e9SAmadeusz Sławiński 7543ad8c8e9SAmadeusz Sławiński snd_soc_unregister_component(test_dev); 7553ad8c8e9SAmadeusz Sławiński } 7563ad8c8e9SAmadeusz Sławiński 7573ad8c8e9SAmadeusz Sławiński /* cleanup */ 7583ad8c8e9SAmadeusz Sławiński ret = snd_soc_unregister_card(&kunit_comp->card); 7593ad8c8e9SAmadeusz Sławiński KUNIT_EXPECT_EQ(test, 0, ret); 7603ad8c8e9SAmadeusz Sławiński } 7613ad8c8e9SAmadeusz Sławiński 7623ad8c8e9SAmadeusz Sławiński // TEST CASE 7633ad8c8e9SAmadeusz Sławiński // Test passing topology file with PCM definition 7643ad8c8e9SAmadeusz Sławiński // with card reload 7653ad8c8e9SAmadeusz Sławiński static void snd_soc_tplg_test_load_pcm_tplg_reload_card(struct kunit *test) 7663ad8c8e9SAmadeusz Sławiński { 7673ad8c8e9SAmadeusz Sławiński struct kunit_soc_component *kunit_comp; 7683ad8c8e9SAmadeusz Sławiński u8 *data; 7693ad8c8e9SAmadeusz Sławiński int size; 7703ad8c8e9SAmadeusz Sławiński int ret; 7713ad8c8e9SAmadeusz Sławiński int i; 7723ad8c8e9SAmadeusz Sławiński 7733ad8c8e9SAmadeusz Sławiński /* prepare */ 7743ad8c8e9SAmadeusz Sławiński kunit_comp = kunit_kzalloc(test, sizeof(*kunit_comp), GFP_KERNEL); 7753ad8c8e9SAmadeusz Sławiński KUNIT_EXPECT_NOT_ERR_OR_NULL(test, kunit_comp); 7763ad8c8e9SAmadeusz Sławiński kunit_comp->kunit = test; 7773ad8c8e9SAmadeusz Sławiński kunit_comp->expect = 0; /* expect success */ 7783ad8c8e9SAmadeusz Sławiński 7793ad8c8e9SAmadeusz Sławiński size = sizeof(tplg_tmpl_with_pcm); 7803ad8c8e9SAmadeusz Sławiński data = kunit_kzalloc(kunit_comp->kunit, size, GFP_KERNEL); 7813ad8c8e9SAmadeusz Sławiński KUNIT_EXPECT_NOT_ERR_OR_NULL(kunit_comp->kunit, data); 7823ad8c8e9SAmadeusz Sławiński 7833ad8c8e9SAmadeusz Sławiński memcpy(data, &tplg_tmpl_with_pcm, sizeof(tplg_tmpl_with_pcm)); 7843ad8c8e9SAmadeusz Sławiński 7853ad8c8e9SAmadeusz Sławiński kunit_comp->fw.data = data; 7863ad8c8e9SAmadeusz Sławiński kunit_comp->fw.size = size; 7873ad8c8e9SAmadeusz Sławiński 7883ad8c8e9SAmadeusz Sławiński kunit_comp->card.dev = test_dev, 7893ad8c8e9SAmadeusz Sławiński kunit_comp->card.name = "kunit-card", 7903ad8c8e9SAmadeusz Sławiński kunit_comp->card.owner = THIS_MODULE, 7913ad8c8e9SAmadeusz Sławiński kunit_comp->card.dai_link = kunit_dai_links, 7923ad8c8e9SAmadeusz Sławiński kunit_comp->card.num_links = ARRAY_SIZE(kunit_dai_links), 7933ad8c8e9SAmadeusz Sławiński kunit_comp->card.fully_routed = true, 7943ad8c8e9SAmadeusz Sławiński 7953ad8c8e9SAmadeusz Sławiński /* run test */ 7963ad8c8e9SAmadeusz Sławiński ret = snd_soc_component_initialize(&kunit_comp->comp, &test_component, test_dev); 7973ad8c8e9SAmadeusz Sławiński KUNIT_EXPECT_EQ(test, 0, ret); 7983ad8c8e9SAmadeusz Sławiński 7993ad8c8e9SAmadeusz Sławiński ret = snd_soc_add_component(&kunit_comp->comp, NULL, 0); 8003ad8c8e9SAmadeusz Sławiński KUNIT_EXPECT_EQ(test, 0, ret); 8013ad8c8e9SAmadeusz Sławiński 8023ad8c8e9SAmadeusz Sławiński for (i = 0; i < 100; i++) { 8033ad8c8e9SAmadeusz Sławiński ret = snd_soc_register_card(&kunit_comp->card); 8043ad8c8e9SAmadeusz Sławiński if (ret != 0 && ret != -EPROBE_DEFER) 8053ad8c8e9SAmadeusz Sławiński KUNIT_FAIL(test, "Failed to register card"); 8063ad8c8e9SAmadeusz Sławiński 8073ad8c8e9SAmadeusz Sławiński ret = snd_soc_unregister_card(&kunit_comp->card); 8083ad8c8e9SAmadeusz Sławiński KUNIT_EXPECT_EQ(test, 0, ret); 8093ad8c8e9SAmadeusz Sławiński } 8103ad8c8e9SAmadeusz Sławiński 8113ad8c8e9SAmadeusz Sławiński /* cleanup */ 8123ad8c8e9SAmadeusz Sławiński snd_soc_unregister_component(test_dev); 8133ad8c8e9SAmadeusz Sławiński } 8143ad8c8e9SAmadeusz Sławiński 815d52bbf74SAmadeusz Sławiński /* ===== KUNIT MODULE DEFINITIONS =========================================== */ 816d52bbf74SAmadeusz Sławiński 817d52bbf74SAmadeusz Sławiński static struct kunit_case snd_soc_tplg_test_cases[] = { 818d52bbf74SAmadeusz Sławiński KUNIT_CASE(snd_soc_tplg_test_load_with_null_comp), 819d52bbf74SAmadeusz Sławiński KUNIT_CASE(snd_soc_tplg_test_load_with_null_ops), 820d52bbf74SAmadeusz Sławiński KUNIT_CASE(snd_soc_tplg_test_load_with_null_fw), 821cec9128dSAmadeusz Sławiński KUNIT_CASE(snd_soc_tplg_test_load_empty_tplg), 822cec9128dSAmadeusz Sławiński KUNIT_CASE(snd_soc_tplg_test_load_empty_tplg_bad_magic), 823cec9128dSAmadeusz Sławiński KUNIT_CASE(snd_soc_tplg_test_load_empty_tplg_bad_abi), 824cec9128dSAmadeusz Sławiński KUNIT_CASE(snd_soc_tplg_test_load_empty_tplg_bad_size), 825cec9128dSAmadeusz Sławiński KUNIT_CASE(snd_soc_tplg_test_load_empty_tplg_bad_payload_size), 8263ad8c8e9SAmadeusz Sławiński KUNIT_CASE(snd_soc_tplg_test_load_pcm_tplg), 8273ad8c8e9SAmadeusz Sławiński KUNIT_CASE(snd_soc_tplg_test_load_pcm_tplg_reload_comp), 8283ad8c8e9SAmadeusz Sławiński KUNIT_CASE(snd_soc_tplg_test_load_pcm_tplg_reload_card), 829d52bbf74SAmadeusz Sławiński {} 830d52bbf74SAmadeusz Sławiński }; 831d52bbf74SAmadeusz Sławiński 832d52bbf74SAmadeusz Sławiński static struct kunit_suite snd_soc_tplg_test_suite = { 833d52bbf74SAmadeusz Sławiński .name = "snd_soc_tplg_test", 834d52bbf74SAmadeusz Sławiński .init = snd_soc_tplg_test_init, 835d52bbf74SAmadeusz Sławiński .exit = snd_soc_tplg_test_exit, 836d52bbf74SAmadeusz Sławiński .test_cases = snd_soc_tplg_test_cases, 837d52bbf74SAmadeusz Sławiński }; 838d52bbf74SAmadeusz Sławiński 839d52bbf74SAmadeusz Sławiński kunit_test_suites(&snd_soc_tplg_test_suite); 840d52bbf74SAmadeusz Sławiński 841d52bbf74SAmadeusz Sławiński MODULE_LICENSE("GPL"); 842