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 = { 124cec9128dSAmadeusz Sławiński .magic = SND_SOC_TPLG_MAGIC, 125cec9128dSAmadeusz Sławiński .abi = 5, 126cec9128dSAmadeusz Sławiński .version = 0, 127cec9128dSAmadeusz Sławiński .type = SND_SOC_TPLG_TYPE_MANIFEST, 128cec9128dSAmadeusz Sławiński .size = sizeof(struct snd_soc_tplg_hdr), 129cec9128dSAmadeusz Sławiński .vendor_type = 0, 130cec9128dSAmadeusz Sławiński .payload_size = sizeof(struct snd_soc_tplg_manifest), 131cec9128dSAmadeusz Sławiński .index = 0, 132cec9128dSAmadeusz Sławiński .count = 1, 133cec9128dSAmadeusz Sławiński }, 134cec9128dSAmadeusz Sławiński 135cec9128dSAmadeusz Sławiński .manifest = { 136cec9128dSAmadeusz Sławiński .size = 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 141*3ad8c8e9SAmadeusz Sławiński // Structural representation of topology containing SectionPCM 142*3ad8c8e9SAmadeusz Sławiński 143*3ad8c8e9SAmadeusz Sławiński struct tplg_tmpl_002 { 144*3ad8c8e9SAmadeusz Sławiński struct snd_soc_tplg_hdr header; 145*3ad8c8e9SAmadeusz Sławiński struct snd_soc_tplg_manifest manifest; 146*3ad8c8e9SAmadeusz Sławiński struct snd_soc_tplg_hdr pcm_header; 147*3ad8c8e9SAmadeusz Sławiński struct snd_soc_tplg_pcm pcm; 148*3ad8c8e9SAmadeusz Sławiński } __packed; 149*3ad8c8e9SAmadeusz Sławiński 150*3ad8c8e9SAmadeusz Sławiński static struct tplg_tmpl_002 tplg_tmpl_with_pcm = { 151*3ad8c8e9SAmadeusz Sławiński .header = { 152*3ad8c8e9SAmadeusz Sławiński .magic = SND_SOC_TPLG_MAGIC, 153*3ad8c8e9SAmadeusz Sławiński .abi = 5, 154*3ad8c8e9SAmadeusz Sławiński .version = 0, 155*3ad8c8e9SAmadeusz Sławiński .type = SND_SOC_TPLG_TYPE_MANIFEST, 156*3ad8c8e9SAmadeusz Sławiński .size = sizeof(struct snd_soc_tplg_hdr), 157*3ad8c8e9SAmadeusz Sławiński .vendor_type = 0, 158*3ad8c8e9SAmadeusz Sławiński .payload_size = sizeof(struct snd_soc_tplg_manifest), 159*3ad8c8e9SAmadeusz Sławiński .index = 0, 160*3ad8c8e9SAmadeusz Sławiński .count = 1, 161*3ad8c8e9SAmadeusz Sławiński }, 162*3ad8c8e9SAmadeusz Sławiński .manifest = { 163*3ad8c8e9SAmadeusz Sławiński .size = sizeof(struct snd_soc_tplg_manifest), 164*3ad8c8e9SAmadeusz Sławiński .pcm_elems = 1, 165*3ad8c8e9SAmadeusz Sławiński /* rest of fields is 0 */ 166*3ad8c8e9SAmadeusz Sławiński }, 167*3ad8c8e9SAmadeusz Sławiński .pcm_header = { 168*3ad8c8e9SAmadeusz Sławiński .magic = SND_SOC_TPLG_MAGIC, 169*3ad8c8e9SAmadeusz Sławiński .abi = 5, 170*3ad8c8e9SAmadeusz Sławiński .version = 0, 171*3ad8c8e9SAmadeusz Sławiński .type = SND_SOC_TPLG_TYPE_PCM, 172*3ad8c8e9SAmadeusz Sławiński .size = sizeof(struct snd_soc_tplg_hdr), 173*3ad8c8e9SAmadeusz Sławiński .vendor_type = 0, 174*3ad8c8e9SAmadeusz Sławiński .payload_size = sizeof(struct snd_soc_tplg_pcm), 175*3ad8c8e9SAmadeusz Sławiński .index = 0, 176*3ad8c8e9SAmadeusz Sławiński .count = 1, 177*3ad8c8e9SAmadeusz Sławiński }, 178*3ad8c8e9SAmadeusz Sławiński .pcm = { 179*3ad8c8e9SAmadeusz Sławiński .size = sizeof(struct snd_soc_tplg_pcm), 180*3ad8c8e9SAmadeusz Sławiński .pcm_name = "KUNIT Audio", 181*3ad8c8e9SAmadeusz Sławiński .dai_name = "kunit-audio-dai", 182*3ad8c8e9SAmadeusz Sławiński .pcm_id = 0, 183*3ad8c8e9SAmadeusz Sławiński .dai_id = 0, 184*3ad8c8e9SAmadeusz Sławiński .playback = 1, 185*3ad8c8e9SAmadeusz Sławiński .capture = 1, 186*3ad8c8e9SAmadeusz Sławiński .compress = 0, 187*3ad8c8e9SAmadeusz Sławiński .stream = { 188*3ad8c8e9SAmadeusz Sławiński [0] = { 189*3ad8c8e9SAmadeusz Sławiński .channels = 2, 190*3ad8c8e9SAmadeusz Sławiński }, 191*3ad8c8e9SAmadeusz Sławiński [1] = { 192*3ad8c8e9SAmadeusz Sławiński .channels = 2, 193*3ad8c8e9SAmadeusz Sławiński }, 194*3ad8c8e9SAmadeusz Sławiński }, 195*3ad8c8e9SAmadeusz Sławiński .num_streams = 0, 196*3ad8c8e9SAmadeusz Sławiński .caps = { 197*3ad8c8e9SAmadeusz Sławiński [0] = { 198*3ad8c8e9SAmadeusz Sławiński .name = "kunit-audio-playback", 199*3ad8c8e9SAmadeusz Sławiński .channels_min = 2, 200*3ad8c8e9SAmadeusz Sławiński .channels_max = 2, 201*3ad8c8e9SAmadeusz Sławiński }, 202*3ad8c8e9SAmadeusz Sławiński [1] = { 203*3ad8c8e9SAmadeusz Sławiński .name = "kunit-audio-capture", 204*3ad8c8e9SAmadeusz Sławiński .channels_min = 2, 205*3ad8c8e9SAmadeusz Sławiński .channels_max = 2, 206*3ad8c8e9SAmadeusz Sławiński }, 207*3ad8c8e9SAmadeusz Sławiński }, 208*3ad8c8e9SAmadeusz Sławiński .flag_mask = 0, 209*3ad8c8e9SAmadeusz Sławiński .flags = 0, 210*3ad8c8e9SAmadeusz Sławiński .priv = { 0 }, 211*3ad8c8e9SAmadeusz Sławiński }, 212*3ad8c8e9SAmadeusz Sławiński }; 213*3ad8c8e9SAmadeusz 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 */ 274d52bbf74SAmadeusz Sławiński ret = snd_soc_unregister_card(&kunit_comp->card); 275d52bbf74SAmadeusz Sławiński KUNIT_EXPECT_EQ(test, 0, ret); 276d52bbf74SAmadeusz Sławiński 277d52bbf74SAmadeusz Sławiński snd_soc_unregister_component(test_dev); 278d52bbf74SAmadeusz Sławiński } 279d52bbf74SAmadeusz Sławiński 280d52bbf74SAmadeusz Sławiński // TEST CASE 281d52bbf74SAmadeusz Sławiński // Test passing NULL ops as parameter to snd_soc_tplg_component_load 282d52bbf74SAmadeusz Sławiński 283d52bbf74SAmadeusz Sławiński /* 284d52bbf74SAmadeusz Sławiński * NULL ops is default case, we pass empty topology (fw), so we don't have 285d52bbf74SAmadeusz Sławiński * anything to parse and just do nothing, which results in return 0; from 286d52bbf74SAmadeusz Sławiński * calling soc_tplg_dapm_complete in soc_tplg_process_headers 287d52bbf74SAmadeusz Sławiński */ 288d52bbf74SAmadeusz Sławiński static void snd_soc_tplg_test_load_with_null_ops(struct kunit *test) 289d52bbf74SAmadeusz Sławiński { 290d52bbf74SAmadeusz Sławiński struct kunit_soc_component *kunit_comp; 291d52bbf74SAmadeusz Sławiński int ret; 292d52bbf74SAmadeusz Sławiński 293d52bbf74SAmadeusz Sławiński /* prepare */ 294d52bbf74SAmadeusz Sławiński kunit_comp = kunit_kzalloc(test, sizeof(*kunit_comp), GFP_KERNEL); 295d52bbf74SAmadeusz Sławiński KUNIT_EXPECT_NOT_ERR_OR_NULL(test, kunit_comp); 296d52bbf74SAmadeusz Sławiński kunit_comp->kunit = test; 297d52bbf74SAmadeusz Sławiński kunit_comp->expect = 0; /* expect success */ 298d52bbf74SAmadeusz Sławiński 299d52bbf74SAmadeusz Sławiński kunit_comp->card.dev = test_dev, 300d52bbf74SAmadeusz Sławiński kunit_comp->card.name = "kunit-card", 301d52bbf74SAmadeusz Sławiński kunit_comp->card.owner = THIS_MODULE, 302d52bbf74SAmadeusz Sławiński kunit_comp->card.dai_link = kunit_dai_links, 303d52bbf74SAmadeusz Sławiński kunit_comp->card.num_links = ARRAY_SIZE(kunit_dai_links), 304d52bbf74SAmadeusz Sławiński kunit_comp->card.fully_routed = true, 305d52bbf74SAmadeusz Sławiński 306d52bbf74SAmadeusz Sławiński /* run test */ 307d52bbf74SAmadeusz Sławiński ret = snd_soc_register_card(&kunit_comp->card); 308d52bbf74SAmadeusz Sławiński if (ret != 0 && ret != -EPROBE_DEFER) 309d52bbf74SAmadeusz Sławiński KUNIT_FAIL(test, "Failed to register card"); 310d52bbf74SAmadeusz Sławiński 311d52bbf74SAmadeusz Sławiński ret = snd_soc_component_initialize(&kunit_comp->comp, &test_component, test_dev); 312d52bbf74SAmadeusz Sławiński KUNIT_EXPECT_EQ(test, 0, ret); 313d52bbf74SAmadeusz Sławiński 314d52bbf74SAmadeusz Sławiński ret = snd_soc_add_component(&kunit_comp->comp, NULL, 0); 315d52bbf74SAmadeusz Sławiński KUNIT_EXPECT_EQ(test, 0, ret); 316d52bbf74SAmadeusz Sławiński 317d52bbf74SAmadeusz Sławiński /* cleanup */ 318d52bbf74SAmadeusz Sławiński ret = snd_soc_unregister_card(&kunit_comp->card); 319d52bbf74SAmadeusz Sławiński KUNIT_EXPECT_EQ(test, 0, ret); 320d52bbf74SAmadeusz Sławiński 321d52bbf74SAmadeusz Sławiński snd_soc_unregister_component(test_dev); 322d52bbf74SAmadeusz Sławiński } 323d52bbf74SAmadeusz Sławiński 324d52bbf74SAmadeusz Sławiński // TEST CASE 325d52bbf74SAmadeusz Sławiński // Test passing NULL fw as parameter to snd_soc_tplg_component_load 326d52bbf74SAmadeusz Sławiński 327d52bbf74SAmadeusz Sławiński /* 328d52bbf74SAmadeusz Sławiński * need to override generic probe function with one using NULL pointer to fw 329d52bbf74SAmadeusz Sławiński * when calling topology load during component initialization, we don't need 330d52bbf74SAmadeusz Sławiński * .remove handler as load should fail 331d52bbf74SAmadeusz Sławiński */ 332d52bbf74SAmadeusz Sławiński static int d_probe_null_fw(struct snd_soc_component *component) 333d52bbf74SAmadeusz Sławiński { 334d52bbf74SAmadeusz Sławiński struct kunit_soc_component *kunit_comp = 335d52bbf74SAmadeusz Sławiński container_of(component, struct kunit_soc_component, comp); 336d52bbf74SAmadeusz Sławiński int ret; 337d52bbf74SAmadeusz Sławiński 338d52bbf74SAmadeusz Sławiński /* instead of passing fw pointer as third argument, pass NULL here */ 339d52bbf74SAmadeusz Sławiński ret = snd_soc_tplg_component_load(component, NULL, NULL); 340d52bbf74SAmadeusz Sławiński KUNIT_EXPECT_EQ_MSG(kunit_comp->kunit, kunit_comp->expect, ret, 341d52bbf74SAmadeusz Sławiński "Failed topology load"); 342d52bbf74SAmadeusz Sławiński 343d52bbf74SAmadeusz Sławiński return 0; 344d52bbf74SAmadeusz Sławiński } 345d52bbf74SAmadeusz Sławiński 346d52bbf74SAmadeusz Sławiński static const struct snd_soc_component_driver test_component_null_fw = { 347d52bbf74SAmadeusz Sławiński .name = "sound-soc-topology-test", 348d52bbf74SAmadeusz Sławiński .probe = d_probe_null_fw, 349d52bbf74SAmadeusz Sławiński .non_legacy_dai_naming = 1, 350d52bbf74SAmadeusz Sławiński }; 351d52bbf74SAmadeusz Sławiński 352d52bbf74SAmadeusz Sławiński static void snd_soc_tplg_test_load_with_null_fw(struct kunit *test) 353d52bbf74SAmadeusz Sławiński { 354d52bbf74SAmadeusz Sławiński struct kunit_soc_component *kunit_comp; 355d52bbf74SAmadeusz Sławiński int ret; 356d52bbf74SAmadeusz Sławiński 357d52bbf74SAmadeusz Sławiński /* prepare */ 358d52bbf74SAmadeusz Sławiński kunit_comp = kunit_kzalloc(test, sizeof(*kunit_comp), GFP_KERNEL); 359d52bbf74SAmadeusz Sławiński KUNIT_EXPECT_NOT_ERR_OR_NULL(test, kunit_comp); 360d52bbf74SAmadeusz Sławiński kunit_comp->kunit = test; 361d52bbf74SAmadeusz Sławiński kunit_comp->expect = -EINVAL; /* expect failure */ 362d52bbf74SAmadeusz Sławiński 363d52bbf74SAmadeusz Sławiński kunit_comp->card.dev = test_dev, 364d52bbf74SAmadeusz Sławiński kunit_comp->card.name = "kunit-card", 365d52bbf74SAmadeusz Sławiński kunit_comp->card.owner = THIS_MODULE, 366d52bbf74SAmadeusz Sławiński kunit_comp->card.dai_link = kunit_dai_links, 367d52bbf74SAmadeusz Sławiński kunit_comp->card.num_links = ARRAY_SIZE(kunit_dai_links), 368d52bbf74SAmadeusz Sławiński kunit_comp->card.fully_routed = true, 369d52bbf74SAmadeusz Sławiński 370d52bbf74SAmadeusz Sławiński /* run test */ 371d52bbf74SAmadeusz Sławiński ret = snd_soc_register_card(&kunit_comp->card); 372d52bbf74SAmadeusz Sławiński if (ret != 0 && ret != -EPROBE_DEFER) 373d52bbf74SAmadeusz Sławiński KUNIT_FAIL(test, "Failed to register card"); 374d52bbf74SAmadeusz Sławiński 375d52bbf74SAmadeusz Sławiński ret = snd_soc_component_initialize(&kunit_comp->comp, &test_component_null_fw, test_dev); 376d52bbf74SAmadeusz Sławiński KUNIT_EXPECT_EQ(test, 0, ret); 377d52bbf74SAmadeusz Sławiński 378d52bbf74SAmadeusz Sławiński ret = snd_soc_add_component(&kunit_comp->comp, NULL, 0); 379d52bbf74SAmadeusz Sławiński KUNIT_EXPECT_EQ(test, 0, ret); 380d52bbf74SAmadeusz Sławiński 381d52bbf74SAmadeusz Sławiński /* cleanup */ 382d52bbf74SAmadeusz Sławiński ret = snd_soc_unregister_card(&kunit_comp->card); 383d52bbf74SAmadeusz Sławiński KUNIT_EXPECT_EQ(test, 0, ret); 384d52bbf74SAmadeusz Sławiński 385d52bbf74SAmadeusz Sławiński snd_soc_unregister_component(test_dev); 386d52bbf74SAmadeusz Sławiński } 387d52bbf74SAmadeusz Sławiński 388cec9128dSAmadeusz Sławiński // TEST CASE 389cec9128dSAmadeusz Sławiński // Test passing "empty" topology file 390cec9128dSAmadeusz Sławiński static void snd_soc_tplg_test_load_empty_tplg(struct kunit *test) 391cec9128dSAmadeusz Sławiński { 392cec9128dSAmadeusz Sławiński struct kunit_soc_component *kunit_comp; 393cec9128dSAmadeusz Sławiński struct tplg_tmpl_001 *data; 394cec9128dSAmadeusz Sławiński int size; 395cec9128dSAmadeusz Sławiński int ret; 396cec9128dSAmadeusz Sławiński 397cec9128dSAmadeusz Sławiński /* prepare */ 398cec9128dSAmadeusz Sławiński kunit_comp = kunit_kzalloc(test, sizeof(*kunit_comp), GFP_KERNEL); 399cec9128dSAmadeusz Sławiński KUNIT_EXPECT_NOT_ERR_OR_NULL(test, kunit_comp); 400cec9128dSAmadeusz Sławiński kunit_comp->kunit = test; 401cec9128dSAmadeusz Sławiński kunit_comp->expect = 0; /* expect success */ 402cec9128dSAmadeusz Sławiński 403cec9128dSAmadeusz Sławiński size = sizeof(tplg_tmpl_empty); 404cec9128dSAmadeusz Sławiński data = kunit_kzalloc(kunit_comp->kunit, size, GFP_KERNEL); 405cec9128dSAmadeusz Sławiński KUNIT_EXPECT_NOT_ERR_OR_NULL(kunit_comp->kunit, data); 406cec9128dSAmadeusz Sławiński 407cec9128dSAmadeusz Sławiński memcpy(data, &tplg_tmpl_empty, sizeof(tplg_tmpl_empty)); 408cec9128dSAmadeusz Sławiński 409cec9128dSAmadeusz Sławiński kunit_comp->fw.data = (u8 *)data; 410cec9128dSAmadeusz Sławiński kunit_comp->fw.size = size; 411cec9128dSAmadeusz Sławiński 412cec9128dSAmadeusz Sławiński kunit_comp->card.dev = test_dev, 413cec9128dSAmadeusz Sławiński kunit_comp->card.name = "kunit-card", 414cec9128dSAmadeusz Sławiński kunit_comp->card.owner = THIS_MODULE, 415cec9128dSAmadeusz Sławiński kunit_comp->card.dai_link = kunit_dai_links, 416cec9128dSAmadeusz Sławiński kunit_comp->card.num_links = ARRAY_SIZE(kunit_dai_links), 417cec9128dSAmadeusz Sławiński kunit_comp->card.fully_routed = true, 418cec9128dSAmadeusz Sławiński 419cec9128dSAmadeusz Sławiński /* run test */ 420cec9128dSAmadeusz Sławiński ret = snd_soc_register_card(&kunit_comp->card); 421cec9128dSAmadeusz Sławiński if (ret != 0 && ret != -EPROBE_DEFER) 422cec9128dSAmadeusz Sławiński KUNIT_FAIL(test, "Failed to register card"); 423cec9128dSAmadeusz Sławiński 424cec9128dSAmadeusz Sławiński ret = snd_soc_component_initialize(&kunit_comp->comp, &test_component, test_dev); 425cec9128dSAmadeusz Sławiński KUNIT_EXPECT_EQ(test, 0, ret); 426cec9128dSAmadeusz Sławiński 427cec9128dSAmadeusz Sławiński ret = snd_soc_add_component(&kunit_comp->comp, NULL, 0); 428cec9128dSAmadeusz Sławiński KUNIT_EXPECT_EQ(test, 0, ret); 429cec9128dSAmadeusz Sławiński 430cec9128dSAmadeusz Sławiński /* cleanup */ 431cec9128dSAmadeusz Sławiński ret = snd_soc_unregister_card(&kunit_comp->card); 432cec9128dSAmadeusz Sławiński KUNIT_EXPECT_EQ(test, 0, ret); 433cec9128dSAmadeusz Sławiński 434cec9128dSAmadeusz Sławiński snd_soc_unregister_component(test_dev); 435cec9128dSAmadeusz Sławiński } 436cec9128dSAmadeusz Sławiński 437cec9128dSAmadeusz Sławiński // TEST CASE 438cec9128dSAmadeusz Sławiński // Test "empty" topology file, but with bad "magic" 439cec9128dSAmadeusz Sławiński // In theory we could loop through all possible bad values, but it takes too 440cec9128dSAmadeusz Sławiński // long, so just use SND_SOC_TPLG_MAGIC + 1 441cec9128dSAmadeusz Sławiński static void snd_soc_tplg_test_load_empty_tplg_bad_magic(struct kunit *test) 442cec9128dSAmadeusz Sławiński { 443cec9128dSAmadeusz Sławiński struct kunit_soc_component *kunit_comp; 444cec9128dSAmadeusz Sławiński struct tplg_tmpl_001 *data; 445cec9128dSAmadeusz Sławiński int size; 446cec9128dSAmadeusz Sławiński int ret; 447cec9128dSAmadeusz Sławiński 448cec9128dSAmadeusz Sławiński /* prepare */ 449cec9128dSAmadeusz Sławiński kunit_comp = kunit_kzalloc(test, sizeof(*kunit_comp), GFP_KERNEL); 450cec9128dSAmadeusz Sławiński KUNIT_EXPECT_NOT_ERR_OR_NULL(test, kunit_comp); 451cec9128dSAmadeusz Sławiński kunit_comp->kunit = test; 452cec9128dSAmadeusz Sławiński kunit_comp->expect = -EINVAL; /* expect failure */ 453cec9128dSAmadeusz Sławiński 454cec9128dSAmadeusz Sławiński size = sizeof(tplg_tmpl_empty); 455cec9128dSAmadeusz Sławiński data = kunit_kzalloc(kunit_comp->kunit, size, GFP_KERNEL); 456cec9128dSAmadeusz Sławiński KUNIT_EXPECT_NOT_ERR_OR_NULL(kunit_comp->kunit, data); 457cec9128dSAmadeusz Sławiński 458cec9128dSAmadeusz Sławiński memcpy(data, &tplg_tmpl_empty, sizeof(tplg_tmpl_empty)); 459cec9128dSAmadeusz Sławiński /* 460cec9128dSAmadeusz Sławiński * override abi 461cec9128dSAmadeusz Sławiński * any value != magic number is wrong 462cec9128dSAmadeusz Sławiński */ 463cec9128dSAmadeusz Sławiński data->header.magic = SND_SOC_TPLG_MAGIC + 1; 464cec9128dSAmadeusz Sławiński 465cec9128dSAmadeusz Sławiński kunit_comp->fw.data = (u8 *)data; 466cec9128dSAmadeusz Sławiński kunit_comp->fw.size = size; 467cec9128dSAmadeusz Sławiński 468cec9128dSAmadeusz Sławiński kunit_comp->card.dev = test_dev, 469cec9128dSAmadeusz Sławiński kunit_comp->card.name = "kunit-card", 470cec9128dSAmadeusz Sławiński kunit_comp->card.owner = THIS_MODULE, 471cec9128dSAmadeusz Sławiński kunit_comp->card.dai_link = kunit_dai_links, 472cec9128dSAmadeusz Sławiński kunit_comp->card.num_links = ARRAY_SIZE(kunit_dai_links), 473cec9128dSAmadeusz Sławiński kunit_comp->card.fully_routed = true, 474cec9128dSAmadeusz Sławiński 475cec9128dSAmadeusz Sławiński /* run test */ 476cec9128dSAmadeusz Sławiński ret = snd_soc_register_card(&kunit_comp->card); 477cec9128dSAmadeusz Sławiński if (ret != 0 && ret != -EPROBE_DEFER) 478cec9128dSAmadeusz Sławiński KUNIT_FAIL(test, "Failed to register card"); 479cec9128dSAmadeusz Sławiński 480cec9128dSAmadeusz Sławiński ret = snd_soc_component_initialize(&kunit_comp->comp, &test_component, test_dev); 481cec9128dSAmadeusz Sławiński KUNIT_EXPECT_EQ(test, 0, ret); 482cec9128dSAmadeusz Sławiński 483cec9128dSAmadeusz Sławiński ret = snd_soc_add_component(&kunit_comp->comp, NULL, 0); 484cec9128dSAmadeusz Sławiński KUNIT_EXPECT_EQ(test, 0, ret); 485cec9128dSAmadeusz Sławiński 486cec9128dSAmadeusz Sławiński /* cleanup */ 487cec9128dSAmadeusz Sławiński ret = snd_soc_unregister_card(&kunit_comp->card); 488cec9128dSAmadeusz Sławiński KUNIT_EXPECT_EQ(test, 0, ret); 489cec9128dSAmadeusz Sławiński 490cec9128dSAmadeusz Sławiński snd_soc_unregister_component(test_dev); 491cec9128dSAmadeusz Sławiński } 492cec9128dSAmadeusz Sławiński 493cec9128dSAmadeusz Sławiński // TEST CASE 494cec9128dSAmadeusz Sławiński // Test "empty" topology file, but with bad "abi" 495cec9128dSAmadeusz Sławiński // In theory we could loop through all possible bad values, but it takes too 496cec9128dSAmadeusz Sławiński // long, so just use SND_SOC_TPLG_ABI_VERSION + 1 497cec9128dSAmadeusz Sławiński static void snd_soc_tplg_test_load_empty_tplg_bad_abi(struct kunit *test) 498cec9128dSAmadeusz Sławiński { 499cec9128dSAmadeusz Sławiński struct kunit_soc_component *kunit_comp; 500cec9128dSAmadeusz Sławiński struct tplg_tmpl_001 *data; 501cec9128dSAmadeusz Sławiński int size; 502cec9128dSAmadeusz Sławiński int ret; 503cec9128dSAmadeusz Sławiński 504cec9128dSAmadeusz Sławiński /* prepare */ 505cec9128dSAmadeusz Sławiński kunit_comp = kunit_kzalloc(test, sizeof(*kunit_comp), GFP_KERNEL); 506cec9128dSAmadeusz Sławiński KUNIT_EXPECT_NOT_ERR_OR_NULL(test, kunit_comp); 507cec9128dSAmadeusz Sławiński kunit_comp->kunit = test; 508cec9128dSAmadeusz Sławiński kunit_comp->expect = -EINVAL; /* expect failure */ 509cec9128dSAmadeusz Sławiński 510cec9128dSAmadeusz Sławiński size = sizeof(tplg_tmpl_empty); 511cec9128dSAmadeusz Sławiński data = kunit_kzalloc(kunit_comp->kunit, size, GFP_KERNEL); 512cec9128dSAmadeusz Sławiński KUNIT_EXPECT_NOT_ERR_OR_NULL(kunit_comp->kunit, data); 513cec9128dSAmadeusz Sławiński 514cec9128dSAmadeusz Sławiński memcpy(data, &tplg_tmpl_empty, sizeof(tplg_tmpl_empty)); 515cec9128dSAmadeusz Sławiński /* 516cec9128dSAmadeusz Sławiński * override abi 517cec9128dSAmadeusz Sławiński * any value != accepted range is wrong 518cec9128dSAmadeusz Sławiński */ 519cec9128dSAmadeusz Sławiński data->header.abi = SND_SOC_TPLG_ABI_VERSION + 1; 520cec9128dSAmadeusz Sławiński 521cec9128dSAmadeusz Sławiński kunit_comp->fw.data = (u8 *)data; 522cec9128dSAmadeusz Sławiński kunit_comp->fw.size = size; 523cec9128dSAmadeusz Sławiński 524cec9128dSAmadeusz Sławiński kunit_comp->card.dev = test_dev, 525cec9128dSAmadeusz Sławiński kunit_comp->card.name = "kunit-card", 526cec9128dSAmadeusz Sławiński kunit_comp->card.owner = THIS_MODULE, 527cec9128dSAmadeusz Sławiński kunit_comp->card.dai_link = kunit_dai_links, 528cec9128dSAmadeusz Sławiński kunit_comp->card.num_links = ARRAY_SIZE(kunit_dai_links), 529cec9128dSAmadeusz Sławiński kunit_comp->card.fully_routed = true, 530cec9128dSAmadeusz Sławiński 531cec9128dSAmadeusz Sławiński /* run test */ 532cec9128dSAmadeusz Sławiński ret = snd_soc_register_card(&kunit_comp->card); 533cec9128dSAmadeusz Sławiński if (ret != 0 && ret != -EPROBE_DEFER) 534cec9128dSAmadeusz Sławiński KUNIT_FAIL(test, "Failed to register card"); 535cec9128dSAmadeusz Sławiński 536cec9128dSAmadeusz Sławiński ret = snd_soc_component_initialize(&kunit_comp->comp, &test_component, test_dev); 537cec9128dSAmadeusz Sławiński KUNIT_EXPECT_EQ(test, 0, ret); 538cec9128dSAmadeusz Sławiński 539cec9128dSAmadeusz Sławiński ret = snd_soc_add_component(&kunit_comp->comp, NULL, 0); 540cec9128dSAmadeusz Sławiński KUNIT_EXPECT_EQ(test, 0, ret); 541cec9128dSAmadeusz Sławiński 542cec9128dSAmadeusz Sławiński /* cleanup */ 543cec9128dSAmadeusz Sławiński ret = snd_soc_unregister_card(&kunit_comp->card); 544cec9128dSAmadeusz Sławiński KUNIT_EXPECT_EQ(test, 0, ret); 545cec9128dSAmadeusz Sławiński 546cec9128dSAmadeusz Sławiński snd_soc_unregister_component(test_dev); 547cec9128dSAmadeusz Sławiński } 548cec9128dSAmadeusz Sławiński 549cec9128dSAmadeusz Sławiński // TEST CASE 550cec9128dSAmadeusz Sławiński // Test "empty" topology file, but with bad "size" 551cec9128dSAmadeusz Sławiński // In theory we could loop through all possible bad values, but it takes too 552cec9128dSAmadeusz Sławiński // long, so just use sizeof(struct snd_soc_tplg_hdr) + 1 553cec9128dSAmadeusz Sławiński static void snd_soc_tplg_test_load_empty_tplg_bad_size(struct kunit *test) 554cec9128dSAmadeusz Sławiński { 555cec9128dSAmadeusz Sławiński struct kunit_soc_component *kunit_comp; 556cec9128dSAmadeusz Sławiński struct tplg_tmpl_001 *data; 557cec9128dSAmadeusz Sławiński int size; 558cec9128dSAmadeusz Sławiński int ret; 559cec9128dSAmadeusz Sławiński 560cec9128dSAmadeusz Sławiński /* prepare */ 561cec9128dSAmadeusz Sławiński kunit_comp = kunit_kzalloc(test, sizeof(*kunit_comp), GFP_KERNEL); 562cec9128dSAmadeusz Sławiński KUNIT_EXPECT_NOT_ERR_OR_NULL(test, kunit_comp); 563cec9128dSAmadeusz Sławiński kunit_comp->kunit = test; 564cec9128dSAmadeusz Sławiński kunit_comp->expect = -EINVAL; /* expect failure */ 565cec9128dSAmadeusz Sławiński 566cec9128dSAmadeusz Sławiński size = sizeof(tplg_tmpl_empty); 567cec9128dSAmadeusz Sławiński data = kunit_kzalloc(kunit_comp->kunit, size, GFP_KERNEL); 568cec9128dSAmadeusz Sławiński KUNIT_EXPECT_NOT_ERR_OR_NULL(kunit_comp->kunit, data); 569cec9128dSAmadeusz Sławiński 570cec9128dSAmadeusz Sławiński memcpy(data, &tplg_tmpl_empty, sizeof(tplg_tmpl_empty)); 571cec9128dSAmadeusz Sławiński /* 572cec9128dSAmadeusz Sławiński * override size 573cec9128dSAmadeusz Sławiński * any value != struct size is wrong 574cec9128dSAmadeusz Sławiński */ 575cec9128dSAmadeusz Sławiński data->header.size = sizeof(struct snd_soc_tplg_hdr) + 1; 576cec9128dSAmadeusz Sławiński 577cec9128dSAmadeusz Sławiński kunit_comp->fw.data = (u8 *)data; 578cec9128dSAmadeusz Sławiński kunit_comp->fw.size = size; 579cec9128dSAmadeusz Sławiński 580cec9128dSAmadeusz Sławiński kunit_comp->card.dev = test_dev, 581cec9128dSAmadeusz Sławiński kunit_comp->card.name = "kunit-card", 582cec9128dSAmadeusz Sławiński kunit_comp->card.owner = THIS_MODULE, 583cec9128dSAmadeusz Sławiński kunit_comp->card.dai_link = kunit_dai_links, 584cec9128dSAmadeusz Sławiński kunit_comp->card.num_links = ARRAY_SIZE(kunit_dai_links), 585cec9128dSAmadeusz Sławiński kunit_comp->card.fully_routed = true, 586cec9128dSAmadeusz Sławiński 587cec9128dSAmadeusz Sławiński /* run test */ 588cec9128dSAmadeusz Sławiński ret = snd_soc_register_card(&kunit_comp->card); 589cec9128dSAmadeusz Sławiński if (ret != 0 && ret != -EPROBE_DEFER) 590cec9128dSAmadeusz Sławiński KUNIT_FAIL(test, "Failed to register card"); 591cec9128dSAmadeusz Sławiński 592cec9128dSAmadeusz Sławiński ret = snd_soc_component_initialize(&kunit_comp->comp, &test_component, test_dev); 593cec9128dSAmadeusz Sławiński KUNIT_EXPECT_EQ(test, 0, ret); 594cec9128dSAmadeusz Sławiński 595cec9128dSAmadeusz Sławiński ret = snd_soc_add_component(&kunit_comp->comp, NULL, 0); 596cec9128dSAmadeusz Sławiński KUNIT_EXPECT_EQ(test, 0, ret); 597cec9128dSAmadeusz Sławiński 598cec9128dSAmadeusz Sławiński /* cleanup */ 599cec9128dSAmadeusz Sławiński ret = snd_soc_unregister_card(&kunit_comp->card); 600cec9128dSAmadeusz Sławiński KUNIT_EXPECT_EQ(test, 0, ret); 601cec9128dSAmadeusz Sławiński 602cec9128dSAmadeusz Sławiński snd_soc_unregister_component(test_dev); 603cec9128dSAmadeusz Sławiński } 604cec9128dSAmadeusz Sławiński 605cec9128dSAmadeusz Sławiński // TEST CASE 606cec9128dSAmadeusz Sławiński // Test "empty" topology file, but with bad "payload_size" 607cec9128dSAmadeusz Sławiński // In theory we could loop through all possible bad values, but it takes too 608cec9128dSAmadeusz Sławiński // long, so just use the known wrong one 609cec9128dSAmadeusz Sławiński static void snd_soc_tplg_test_load_empty_tplg_bad_payload_size(struct kunit *test) 610cec9128dSAmadeusz Sławiński { 611cec9128dSAmadeusz Sławiński struct kunit_soc_component *kunit_comp; 612cec9128dSAmadeusz Sławiński struct tplg_tmpl_001 *data; 613cec9128dSAmadeusz Sławiński int size; 614cec9128dSAmadeusz Sławiński int ret; 615cec9128dSAmadeusz Sławiński 616cec9128dSAmadeusz Sławiński /* prepare */ 617cec9128dSAmadeusz Sławiński kunit_comp = kunit_kzalloc(test, sizeof(*kunit_comp), GFP_KERNEL); 618cec9128dSAmadeusz Sławiński KUNIT_EXPECT_NOT_ERR_OR_NULL(test, kunit_comp); 619cec9128dSAmadeusz Sławiński kunit_comp->kunit = test; 620cec9128dSAmadeusz Sławiński kunit_comp->expect = -EINVAL; /* expect failure */ 621cec9128dSAmadeusz Sławiński 622cec9128dSAmadeusz Sławiński size = sizeof(tplg_tmpl_empty); 623cec9128dSAmadeusz Sławiński data = kunit_kzalloc(kunit_comp->kunit, size, GFP_KERNEL); 624cec9128dSAmadeusz Sławiński KUNIT_EXPECT_NOT_ERR_OR_NULL(kunit_comp->kunit, data); 625cec9128dSAmadeusz Sławiński 626cec9128dSAmadeusz Sławiński memcpy(data, &tplg_tmpl_empty, sizeof(tplg_tmpl_empty)); 627cec9128dSAmadeusz Sławiński /* 628cec9128dSAmadeusz Sławiński * override payload size 629cec9128dSAmadeusz Sławiński * there is only explicit check for 0, so check with it, other values 630cec9128dSAmadeusz Sławiński * are handled by just not reading behind EOF 631cec9128dSAmadeusz Sławiński */ 632cec9128dSAmadeusz Sławiński data->header.payload_size = 0; 633cec9128dSAmadeusz Sławiński 634cec9128dSAmadeusz Sławiński kunit_comp->fw.data = (u8 *)data; 635cec9128dSAmadeusz Sławiński kunit_comp->fw.size = size; 636cec9128dSAmadeusz Sławiński 637cec9128dSAmadeusz Sławiński kunit_comp->card.dev = test_dev, 638cec9128dSAmadeusz Sławiński kunit_comp->card.name = "kunit-card", 639cec9128dSAmadeusz Sławiński kunit_comp->card.owner = THIS_MODULE, 640cec9128dSAmadeusz Sławiński kunit_comp->card.dai_link = kunit_dai_links, 641cec9128dSAmadeusz Sławiński kunit_comp->card.num_links = ARRAY_SIZE(kunit_dai_links), 642cec9128dSAmadeusz Sławiński kunit_comp->card.fully_routed = true, 643cec9128dSAmadeusz Sławiński 644cec9128dSAmadeusz Sławiński /* run test */ 645cec9128dSAmadeusz Sławiński ret = snd_soc_register_card(&kunit_comp->card); 646cec9128dSAmadeusz Sławiński if (ret != 0 && ret != -EPROBE_DEFER) 647cec9128dSAmadeusz Sławiński KUNIT_FAIL(test, "Failed to register card"); 648cec9128dSAmadeusz Sławiński 649cec9128dSAmadeusz Sławiński ret = snd_soc_component_initialize(&kunit_comp->comp, &test_component, test_dev); 650cec9128dSAmadeusz Sławiński KUNIT_EXPECT_EQ(test, 0, ret); 651cec9128dSAmadeusz Sławiński 652cec9128dSAmadeusz Sławiński ret = snd_soc_add_component(&kunit_comp->comp, NULL, 0); 653cec9128dSAmadeusz Sławiński KUNIT_EXPECT_EQ(test, 0, ret); 654cec9128dSAmadeusz Sławiński 655cec9128dSAmadeusz Sławiński /* cleanup */ 656cec9128dSAmadeusz Sławiński snd_soc_unregister_component(test_dev); 657cec9128dSAmadeusz Sławiński 658cec9128dSAmadeusz Sławiński ret = snd_soc_unregister_card(&kunit_comp->card); 659cec9128dSAmadeusz Sławiński KUNIT_EXPECT_EQ(test, 0, ret); 660cec9128dSAmadeusz Sławiński } 661cec9128dSAmadeusz Sławiński 662*3ad8c8e9SAmadeusz Sławiński // TEST CASE 663*3ad8c8e9SAmadeusz Sławiński // Test passing topology file with PCM definition 664*3ad8c8e9SAmadeusz Sławiński static void snd_soc_tplg_test_load_pcm_tplg(struct kunit *test) 665*3ad8c8e9SAmadeusz Sławiński { 666*3ad8c8e9SAmadeusz Sławiński struct kunit_soc_component *kunit_comp; 667*3ad8c8e9SAmadeusz Sławiński u8 *data; 668*3ad8c8e9SAmadeusz Sławiński int size; 669*3ad8c8e9SAmadeusz Sławiński int ret; 670*3ad8c8e9SAmadeusz Sławiński 671*3ad8c8e9SAmadeusz Sławiński /* prepare */ 672*3ad8c8e9SAmadeusz Sławiński kunit_comp = kunit_kzalloc(test, sizeof(*kunit_comp), GFP_KERNEL); 673*3ad8c8e9SAmadeusz Sławiński KUNIT_EXPECT_NOT_ERR_OR_NULL(test, kunit_comp); 674*3ad8c8e9SAmadeusz Sławiński kunit_comp->kunit = test; 675*3ad8c8e9SAmadeusz Sławiński kunit_comp->expect = 0; /* expect success */ 676*3ad8c8e9SAmadeusz Sławiński 677*3ad8c8e9SAmadeusz Sławiński size = sizeof(tplg_tmpl_with_pcm); 678*3ad8c8e9SAmadeusz Sławiński data = kunit_kzalloc(kunit_comp->kunit, size, GFP_KERNEL); 679*3ad8c8e9SAmadeusz Sławiński KUNIT_EXPECT_NOT_ERR_OR_NULL(kunit_comp->kunit, data); 680*3ad8c8e9SAmadeusz Sławiński 681*3ad8c8e9SAmadeusz Sławiński memcpy(data, &tplg_tmpl_with_pcm, sizeof(tplg_tmpl_with_pcm)); 682*3ad8c8e9SAmadeusz Sławiński 683*3ad8c8e9SAmadeusz Sławiński kunit_comp->fw.data = data; 684*3ad8c8e9SAmadeusz Sławiński kunit_comp->fw.size = size; 685*3ad8c8e9SAmadeusz Sławiński 686*3ad8c8e9SAmadeusz Sławiński kunit_comp->card.dev = test_dev, 687*3ad8c8e9SAmadeusz Sławiński kunit_comp->card.name = "kunit-card", 688*3ad8c8e9SAmadeusz Sławiński kunit_comp->card.owner = THIS_MODULE, 689*3ad8c8e9SAmadeusz Sławiński kunit_comp->card.dai_link = kunit_dai_links, 690*3ad8c8e9SAmadeusz Sławiński kunit_comp->card.num_links = ARRAY_SIZE(kunit_dai_links), 691*3ad8c8e9SAmadeusz Sławiński kunit_comp->card.fully_routed = true, 692*3ad8c8e9SAmadeusz Sławiński 693*3ad8c8e9SAmadeusz Sławiński /* run test */ 694*3ad8c8e9SAmadeusz Sławiński ret = snd_soc_register_card(&kunit_comp->card); 695*3ad8c8e9SAmadeusz Sławiński if (ret != 0 && ret != -EPROBE_DEFER) 696*3ad8c8e9SAmadeusz Sławiński KUNIT_FAIL(test, "Failed to register card"); 697*3ad8c8e9SAmadeusz Sławiński 698*3ad8c8e9SAmadeusz Sławiński ret = snd_soc_component_initialize(&kunit_comp->comp, &test_component, test_dev); 699*3ad8c8e9SAmadeusz Sławiński KUNIT_EXPECT_EQ(test, 0, ret); 700*3ad8c8e9SAmadeusz Sławiński 701*3ad8c8e9SAmadeusz Sławiński ret = snd_soc_add_component(&kunit_comp->comp, NULL, 0); 702*3ad8c8e9SAmadeusz Sławiński KUNIT_EXPECT_EQ(test, 0, ret); 703*3ad8c8e9SAmadeusz Sławiński 704*3ad8c8e9SAmadeusz Sławiński snd_soc_unregister_component(test_dev); 705*3ad8c8e9SAmadeusz Sławiński 706*3ad8c8e9SAmadeusz Sławiński /* cleanup */ 707*3ad8c8e9SAmadeusz Sławiński ret = snd_soc_unregister_card(&kunit_comp->card); 708*3ad8c8e9SAmadeusz Sławiński KUNIT_EXPECT_EQ(test, 0, ret); 709*3ad8c8e9SAmadeusz Sławiński } 710*3ad8c8e9SAmadeusz Sławiński 711*3ad8c8e9SAmadeusz Sławiński // TEST CASE 712*3ad8c8e9SAmadeusz Sławiński // Test passing topology file with PCM definition 713*3ad8c8e9SAmadeusz Sławiński // with component reload 714*3ad8c8e9SAmadeusz Sławiński static void snd_soc_tplg_test_load_pcm_tplg_reload_comp(struct kunit *test) 715*3ad8c8e9SAmadeusz Sławiński { 716*3ad8c8e9SAmadeusz Sławiński struct kunit_soc_component *kunit_comp; 717*3ad8c8e9SAmadeusz Sławiński u8 *data; 718*3ad8c8e9SAmadeusz Sławiński int size; 719*3ad8c8e9SAmadeusz Sławiński int ret; 720*3ad8c8e9SAmadeusz Sławiński int i; 721*3ad8c8e9SAmadeusz Sławiński 722*3ad8c8e9SAmadeusz Sławiński /* prepare */ 723*3ad8c8e9SAmadeusz Sławiński kunit_comp = kunit_kzalloc(test, sizeof(*kunit_comp), GFP_KERNEL); 724*3ad8c8e9SAmadeusz Sławiński KUNIT_EXPECT_NOT_ERR_OR_NULL(test, kunit_comp); 725*3ad8c8e9SAmadeusz Sławiński kunit_comp->kunit = test; 726*3ad8c8e9SAmadeusz Sławiński kunit_comp->expect = 0; /* expect success */ 727*3ad8c8e9SAmadeusz Sławiński 728*3ad8c8e9SAmadeusz Sławiński size = sizeof(tplg_tmpl_with_pcm); 729*3ad8c8e9SAmadeusz Sławiński data = kunit_kzalloc(kunit_comp->kunit, size, GFP_KERNEL); 730*3ad8c8e9SAmadeusz Sławiński KUNIT_EXPECT_NOT_ERR_OR_NULL(kunit_comp->kunit, data); 731*3ad8c8e9SAmadeusz Sławiński 732*3ad8c8e9SAmadeusz Sławiński memcpy(data, &tplg_tmpl_with_pcm, sizeof(tplg_tmpl_with_pcm)); 733*3ad8c8e9SAmadeusz Sławiński 734*3ad8c8e9SAmadeusz Sławiński kunit_comp->fw.data = data; 735*3ad8c8e9SAmadeusz Sławiński kunit_comp->fw.size = size; 736*3ad8c8e9SAmadeusz Sławiński 737*3ad8c8e9SAmadeusz Sławiński kunit_comp->card.dev = test_dev, 738*3ad8c8e9SAmadeusz Sławiński kunit_comp->card.name = "kunit-card", 739*3ad8c8e9SAmadeusz Sławiński kunit_comp->card.owner = THIS_MODULE, 740*3ad8c8e9SAmadeusz Sławiński kunit_comp->card.dai_link = kunit_dai_links, 741*3ad8c8e9SAmadeusz Sławiński kunit_comp->card.num_links = ARRAY_SIZE(kunit_dai_links), 742*3ad8c8e9SAmadeusz Sławiński kunit_comp->card.fully_routed = true, 743*3ad8c8e9SAmadeusz Sławiński 744*3ad8c8e9SAmadeusz Sławiński /* run test */ 745*3ad8c8e9SAmadeusz Sławiński ret = snd_soc_register_card(&kunit_comp->card); 746*3ad8c8e9SAmadeusz Sławiński if (ret != 0 && ret != -EPROBE_DEFER) 747*3ad8c8e9SAmadeusz Sławiński KUNIT_FAIL(test, "Failed to register card"); 748*3ad8c8e9SAmadeusz Sławiński 749*3ad8c8e9SAmadeusz Sławiński for (i = 0; i < 100; i++) { 750*3ad8c8e9SAmadeusz Sławiński ret = snd_soc_component_initialize(&kunit_comp->comp, &test_component, test_dev); 751*3ad8c8e9SAmadeusz Sławiński KUNIT_EXPECT_EQ(test, 0, ret); 752*3ad8c8e9SAmadeusz Sławiński 753*3ad8c8e9SAmadeusz Sławiński ret = snd_soc_add_component(&kunit_comp->comp, NULL, 0); 754*3ad8c8e9SAmadeusz Sławiński KUNIT_EXPECT_EQ(test, 0, ret); 755*3ad8c8e9SAmadeusz Sławiński 756*3ad8c8e9SAmadeusz Sławiński snd_soc_unregister_component(test_dev); 757*3ad8c8e9SAmadeusz Sławiński } 758*3ad8c8e9SAmadeusz Sławiński 759*3ad8c8e9SAmadeusz Sławiński /* cleanup */ 760*3ad8c8e9SAmadeusz Sławiński ret = snd_soc_unregister_card(&kunit_comp->card); 761*3ad8c8e9SAmadeusz Sławiński KUNIT_EXPECT_EQ(test, 0, ret); 762*3ad8c8e9SAmadeusz Sławiński } 763*3ad8c8e9SAmadeusz Sławiński 764*3ad8c8e9SAmadeusz Sławiński // TEST CASE 765*3ad8c8e9SAmadeusz Sławiński // Test passing topology file with PCM definition 766*3ad8c8e9SAmadeusz Sławiński // with card reload 767*3ad8c8e9SAmadeusz Sławiński static void snd_soc_tplg_test_load_pcm_tplg_reload_card(struct kunit *test) 768*3ad8c8e9SAmadeusz Sławiński { 769*3ad8c8e9SAmadeusz Sławiński struct kunit_soc_component *kunit_comp; 770*3ad8c8e9SAmadeusz Sławiński u8 *data; 771*3ad8c8e9SAmadeusz Sławiński int size; 772*3ad8c8e9SAmadeusz Sławiński int ret; 773*3ad8c8e9SAmadeusz Sławiński int i; 774*3ad8c8e9SAmadeusz Sławiński 775*3ad8c8e9SAmadeusz Sławiński /* prepare */ 776*3ad8c8e9SAmadeusz Sławiński kunit_comp = kunit_kzalloc(test, sizeof(*kunit_comp), GFP_KERNEL); 777*3ad8c8e9SAmadeusz Sławiński KUNIT_EXPECT_NOT_ERR_OR_NULL(test, kunit_comp); 778*3ad8c8e9SAmadeusz Sławiński kunit_comp->kunit = test; 779*3ad8c8e9SAmadeusz Sławiński kunit_comp->expect = 0; /* expect success */ 780*3ad8c8e9SAmadeusz Sławiński 781*3ad8c8e9SAmadeusz Sławiński size = sizeof(tplg_tmpl_with_pcm); 782*3ad8c8e9SAmadeusz Sławiński data = kunit_kzalloc(kunit_comp->kunit, size, GFP_KERNEL); 783*3ad8c8e9SAmadeusz Sławiński KUNIT_EXPECT_NOT_ERR_OR_NULL(kunit_comp->kunit, data); 784*3ad8c8e9SAmadeusz Sławiński 785*3ad8c8e9SAmadeusz Sławiński memcpy(data, &tplg_tmpl_with_pcm, sizeof(tplg_tmpl_with_pcm)); 786*3ad8c8e9SAmadeusz Sławiński 787*3ad8c8e9SAmadeusz Sławiński kunit_comp->fw.data = data; 788*3ad8c8e9SAmadeusz Sławiński kunit_comp->fw.size = size; 789*3ad8c8e9SAmadeusz Sławiński 790*3ad8c8e9SAmadeusz Sławiński kunit_comp->card.dev = test_dev, 791*3ad8c8e9SAmadeusz Sławiński kunit_comp->card.name = "kunit-card", 792*3ad8c8e9SAmadeusz Sławiński kunit_comp->card.owner = THIS_MODULE, 793*3ad8c8e9SAmadeusz Sławiński kunit_comp->card.dai_link = kunit_dai_links, 794*3ad8c8e9SAmadeusz Sławiński kunit_comp->card.num_links = ARRAY_SIZE(kunit_dai_links), 795*3ad8c8e9SAmadeusz Sławiński kunit_comp->card.fully_routed = true, 796*3ad8c8e9SAmadeusz Sławiński 797*3ad8c8e9SAmadeusz Sławiński /* run test */ 798*3ad8c8e9SAmadeusz Sławiński ret = snd_soc_component_initialize(&kunit_comp->comp, &test_component, test_dev); 799*3ad8c8e9SAmadeusz Sławiński KUNIT_EXPECT_EQ(test, 0, ret); 800*3ad8c8e9SAmadeusz Sławiński 801*3ad8c8e9SAmadeusz Sławiński ret = snd_soc_add_component(&kunit_comp->comp, NULL, 0); 802*3ad8c8e9SAmadeusz Sławiński KUNIT_EXPECT_EQ(test, 0, ret); 803*3ad8c8e9SAmadeusz Sławiński 804*3ad8c8e9SAmadeusz Sławiński for (i = 0; i < 100; i++) { 805*3ad8c8e9SAmadeusz Sławiński ret = snd_soc_register_card(&kunit_comp->card); 806*3ad8c8e9SAmadeusz Sławiński if (ret != 0 && ret != -EPROBE_DEFER) 807*3ad8c8e9SAmadeusz Sławiński KUNIT_FAIL(test, "Failed to register card"); 808*3ad8c8e9SAmadeusz Sławiński 809*3ad8c8e9SAmadeusz Sławiński ret = snd_soc_unregister_card(&kunit_comp->card); 810*3ad8c8e9SAmadeusz Sławiński KUNIT_EXPECT_EQ(test, 0, ret); 811*3ad8c8e9SAmadeusz Sławiński } 812*3ad8c8e9SAmadeusz Sławiński 813*3ad8c8e9SAmadeusz Sławiński /* cleanup */ 814*3ad8c8e9SAmadeusz Sławiński snd_soc_unregister_component(test_dev); 815*3ad8c8e9SAmadeusz Sławiński } 816*3ad8c8e9SAmadeusz Sławiński 817d52bbf74SAmadeusz Sławiński /* ===== KUNIT MODULE DEFINITIONS =========================================== */ 818d52bbf74SAmadeusz Sławiński 819d52bbf74SAmadeusz Sławiński static struct kunit_case snd_soc_tplg_test_cases[] = { 820d52bbf74SAmadeusz Sławiński KUNIT_CASE(snd_soc_tplg_test_load_with_null_comp), 821d52bbf74SAmadeusz Sławiński KUNIT_CASE(snd_soc_tplg_test_load_with_null_ops), 822d52bbf74SAmadeusz Sławiński KUNIT_CASE(snd_soc_tplg_test_load_with_null_fw), 823cec9128dSAmadeusz Sławiński KUNIT_CASE(snd_soc_tplg_test_load_empty_tplg), 824cec9128dSAmadeusz Sławiński KUNIT_CASE(snd_soc_tplg_test_load_empty_tplg_bad_magic), 825cec9128dSAmadeusz Sławiński KUNIT_CASE(snd_soc_tplg_test_load_empty_tplg_bad_abi), 826cec9128dSAmadeusz Sławiński KUNIT_CASE(snd_soc_tplg_test_load_empty_tplg_bad_size), 827cec9128dSAmadeusz Sławiński KUNIT_CASE(snd_soc_tplg_test_load_empty_tplg_bad_payload_size), 828*3ad8c8e9SAmadeusz Sławiński KUNIT_CASE(snd_soc_tplg_test_load_pcm_tplg), 829*3ad8c8e9SAmadeusz Sławiński KUNIT_CASE(snd_soc_tplg_test_load_pcm_tplg_reload_comp), 830*3ad8c8e9SAmadeusz Sławiński KUNIT_CASE(snd_soc_tplg_test_load_pcm_tplg_reload_card), 831d52bbf74SAmadeusz Sławiński {} 832d52bbf74SAmadeusz Sławiński }; 833d52bbf74SAmadeusz Sławiński 834d52bbf74SAmadeusz Sławiński static struct kunit_suite snd_soc_tplg_test_suite = { 835d52bbf74SAmadeusz Sławiński .name = "snd_soc_tplg_test", 836d52bbf74SAmadeusz Sławiński .init = snd_soc_tplg_test_init, 837d52bbf74SAmadeusz Sławiński .exit = snd_soc_tplg_test_exit, 838d52bbf74SAmadeusz Sławiński .test_cases = snd_soc_tplg_test_cases, 839d52bbf74SAmadeusz Sławiński }; 840d52bbf74SAmadeusz Sławiński 841d52bbf74SAmadeusz Sławiński kunit_test_suites(&snd_soc_tplg_test_suite); 842d52bbf74SAmadeusz Sławiński 843d52bbf74SAmadeusz Sławiński MODULE_LICENSE("GPL"); 844