File Index
Files and directories
Sign in
FILE

cs_dsp_test_bin_error.c

File preview with syntax highlighting.

linux-6.19.14/drivers/firmware/cirrus/test/cs_dsp_test_bin_error.c C
  1// SPDX-License-Identifier: GPL-2.0-only
  2//
  3// KUnit tests for cs_dsp.
  4//
  5// Copyright (C) 2024 Cirrus Logic, Inc. and
  6//                    Cirrus Logic International Semiconductor Ltd.
  7//
  8
  9#include <kunit/device.h>
 10#include <kunit/resource.h>
 11#include <kunit/test.h>
 12#include <linux/build_bug.h>
 13#include <linux/firmware/cirrus/cs_dsp.h>
 14#include <linux/firmware/cirrus/cs_dsp_test_utils.h>
 15#include <linux/firmware/cirrus/wmfw.h>
 16#include <linux/random.h>
 17#include <linux/regmap.h>
 18#include <linux/string.h>
 19#include <linux/vmalloc.h>
 20
 21#include "../cs_dsp.h"
 22
 23KUNIT_DEFINE_ACTION_WRAPPER(_put_device_wrapper, put_device, struct device *);
 24KUNIT_DEFINE_ACTION_WRAPPER(_cs_dsp_remove_wrapper, cs_dsp_remove, struct cs_dsp *);
 25
 26struct cs_dsp_test_local {
 27	struct cs_dsp_mock_bin_builder *bin_builder;
 28	struct cs_dsp_mock_xm_header *xm_header;
 29	struct cs_dsp_mock_wmfw_builder *wmfw_builder;
 30	struct firmware *wmfw;
 31	int wmfw_version;
 32};
 33
 34struct cs_dsp_bin_test_param {
 35	int block_type;
 36};
 37
 38static const struct cs_dsp_mock_alg_def cs_dsp_bin_err_test_mock_algs[] = {
 39	{
 40		.id = 0xfafa,
 41		.ver = 0x100000,
 42		.xm_size_words = 164,
 43		.ym_size_words = 164,
 44		.zm_size_words = 164,
 45	},
 46};
 47
 48/* Load a bin containing unknown blocks. They should be skipped. */
 49static void bin_load_with_unknown_blocks(struct kunit *test)
 50{
 51	struct cs_dsp_test *priv = test->priv;
 52	struct cs_dsp_test_local *local = priv->local;
 53	struct firmware *bin;
 54	unsigned int reg_addr;
 55	u8 *payload_data, *readback;
 56	u8 random_data[8];
 57	const unsigned int payload_size_bytes = 64;
 58
 59	payload_data = kunit_kmalloc(test, payload_size_bytes, GFP_KERNEL);
 60	KUNIT_ASSERT_NOT_ERR_OR_NULL(test, payload_data);
 61	get_random_bytes(payload_data, payload_size_bytes);
 62
 63	readback = kunit_kzalloc(test, payload_size_bytes, GFP_KERNEL);
 64	KUNIT_ASSERT_NOT_ERR_OR_NULL(test, readback);
 65
 66	/* Add some unknown blocks at the start of the bin */
 67	get_random_bytes(random_data, sizeof(random_data));
 68	cs_dsp_mock_bin_add_raw_block(local->bin_builder,
 69				      cs_dsp_bin_err_test_mock_algs[0].id,
 70				      cs_dsp_bin_err_test_mock_algs[0].ver,
 71				      0xf5, 0,
 72				      random_data, sizeof(random_data));
 73	cs_dsp_mock_bin_add_raw_block(local->bin_builder,
 74				      cs_dsp_bin_err_test_mock_algs[0].id,
 75				      cs_dsp_bin_err_test_mock_algs[0].ver,
 76				      0xf500, 0,
 77				      random_data, sizeof(random_data));
 78	cs_dsp_mock_bin_add_raw_block(local->bin_builder,
 79				      cs_dsp_bin_err_test_mock_algs[0].id,
 80				      cs_dsp_bin_err_test_mock_algs[0].ver,
 81				      0xc300, 0,
 82				      random_data, sizeof(random_data));
 83
 84	/* Add a single payload to be written to DSP memory */
 85	cs_dsp_mock_bin_add_raw_block(local->bin_builder,
 86				      cs_dsp_bin_err_test_mock_algs[0].id,
 87				      cs_dsp_bin_err_test_mock_algs[0].ver,
 88				      WMFW_ADSP2_YM, 0,
 89				      payload_data, payload_size_bytes);
 90
 91	bin = cs_dsp_mock_bin_get_firmware(local->bin_builder);
 92	KUNIT_EXPECT_EQ(test,
 93			cs_dsp_power_up(priv->dsp, local->wmfw, "wmfw", bin, "bin", "misc"),
 94			0);
 95
 96	/* Check that the payload was written to memory */
 97	reg_addr = cs_dsp_mock_base_addr_for_mem(priv, WMFW_ADSP2_YM);
 98	KUNIT_EXPECT_EQ(test,
 99			regmap_raw_read(priv->dsp->regmap, reg_addr, readback, payload_size_bytes),
100			0);
101	KUNIT_EXPECT_MEMEQ(test, readback, payload_data, payload_size_bytes);
102}
103
104/* Load a bin that doesn't have a valid magic marker. */
105static void bin_err_wrong_magic(struct kunit *test)
106{
107	struct cs_dsp_test *priv = test->priv;
108	struct cs_dsp_test_local *local = priv->local;
109	struct firmware *bin;
110
111	/* Sanity-check that the wmfw loads ok without the bin */
112	KUNIT_EXPECT_EQ(test,
113			cs_dsp_power_up(priv->dsp, local->wmfw, "wmfw", NULL, NULL, "misc"),
114			0);
115	cs_dsp_power_down(priv->dsp);
116
117	bin = cs_dsp_mock_bin_get_firmware(local->bin_builder);
118
119	memcpy((void *)bin->data, "WMFW", 4);
120	KUNIT_EXPECT_LT(test,
121			cs_dsp_power_up(priv->dsp, local->wmfw, "wmfw", bin, "bin", "misc"),
122			0);
123
124	memcpy((void *)bin->data, "xMDR", 4);
125	KUNIT_EXPECT_LT(test,
126			cs_dsp_power_up(priv->dsp, local->wmfw, "wmfw", bin, "bin", "misc"),
127			0);
128
129	memcpy((void *)bin->data, "WxDR", 4);
130	KUNIT_EXPECT_LT(test,
131			cs_dsp_power_up(priv->dsp, local->wmfw, "wmfw", bin, "bin", "misc"),
132			0);
133
134	memcpy((void *)bin->data, "WMxR", 4);
135	KUNIT_EXPECT_LT(test,
136			cs_dsp_power_up(priv->dsp, local->wmfw, "wmfw", bin, "bin", "misc"),
137			0);
138
139	memcpy((void *)bin->data, "WMDx", 4);
140	KUNIT_EXPECT_LT(test,
141			cs_dsp_power_up(priv->dsp, local->wmfw, "wmfw", bin, "bin", "misc"),
142			0);
143
144	memset((void *)bin->data, 0, 4);
145	KUNIT_EXPECT_LT(test,
146			cs_dsp_power_up(priv->dsp, local->wmfw, "wmfw", bin, "bin", "misc"),
147			0);
148}
149
150/* Load a bin that is too short for a valid header. */
151static void bin_err_too_short_for_header(struct kunit *test)
152{
153	struct cs_dsp_test *priv = test->priv;
154	struct cs_dsp_test_local *local = priv->local;
155	struct firmware *bin;
156
157	/* Sanity-check that the wmfw loads ok without the bin */
158	KUNIT_EXPECT_EQ(test,
159			cs_dsp_power_up(priv->dsp, local->wmfw, "wmfw", NULL, NULL, "misc"),
160			0);
161	cs_dsp_power_down(priv->dsp);
162
163	bin = cs_dsp_mock_bin_get_firmware(local->bin_builder);
164	do {
165		bin->size--;
166
167		KUNIT_EXPECT_LT(test,
168				cs_dsp_power_up(priv->dsp, local->wmfw, "wmfw", bin, "bin", "misc"),
169				0);
170	} while (bin->size > 0);
171}
172
173/* Header length field isn't a valid header length. */
174static void bin_err_bad_header_length(struct kunit *test)
175{
176	struct cs_dsp_test *priv = test->priv;
177	struct cs_dsp_test_local *local = priv->local;
178	struct firmware *bin;
179	struct wmfw_coeff_hdr *header;
180	unsigned int real_len, len;
181
182	/* Sanity-check that the wmfw loads ok without the bin */
183	KUNIT_EXPECT_EQ(test,
184			cs_dsp_power_up(priv->dsp, local->wmfw, "wmfw", NULL, NULL, "misc"),
185			0);
186	cs_dsp_power_down(priv->dsp);
187
188	bin = cs_dsp_mock_bin_get_firmware(local->bin_builder);
189	header = (struct wmfw_coeff_hdr *)bin->data;
190	real_len = le32_to_cpu(header->len);
191
192	for (len = 0; len < real_len; len++) {
193		header->len = cpu_to_le32(len);
194		KUNIT_EXPECT_LT(test,
195				cs_dsp_power_up(priv->dsp, local->wmfw, "wmfw", bin, "bin", "misc"),
196				0);
197	}
198
199	for (len = real_len + 1; len < real_len + 7; len++) {
200		header->len = cpu_to_le32(len);
201		KUNIT_EXPECT_LT(test,
202				cs_dsp_power_up(priv->dsp, local->wmfw, "wmfw", bin, "bin", "misc"),
203				0);
204	}
205
206	header->len = cpu_to_le32(0xffffffff);
207	KUNIT_EXPECT_LT(test,
208			cs_dsp_power_up(priv->dsp, local->wmfw, "wmfw", bin, "bin", "misc"),
209			0);
210
211	header->len = cpu_to_le32(0x80000000);
212	KUNIT_EXPECT_LT(test,
213			cs_dsp_power_up(priv->dsp, local->wmfw, "wmfw", bin, "bin", "misc"),
214			0);
215
216	header->len = cpu_to_le32(0x7fffffff);
217	KUNIT_EXPECT_LT(test,
218			cs_dsp_power_up(priv->dsp, local->wmfw, "wmfw", bin, "bin", "misc"),
219			0);
220}
221
222/* Wrong core type in header. */
223static void bin_err_bad_core_type(struct kunit *test)
224{
225	struct cs_dsp_test *priv = test->priv;
226	struct cs_dsp_test_local *local = priv->local;
227	struct firmware *bin;
228	struct wmfw_coeff_hdr *header;
229
230	/* Sanity-check that the wmfw loads ok without the bin */
231	KUNIT_EXPECT_EQ(test,
232			cs_dsp_power_up(priv->dsp, local->wmfw, "wmfw", NULL, NULL, "misc"),
233			0);
234	cs_dsp_power_down(priv->dsp);
235
236	bin = cs_dsp_mock_bin_get_firmware(local->bin_builder);
237	header = (struct wmfw_coeff_hdr *)bin->data;
238
239	header->core_ver = cpu_to_le32(0);
240	KUNIT_EXPECT_LT(test,
241			cs_dsp_power_up(priv->dsp, local->wmfw, "wmfw", bin, "bin", "misc"),
242			0);
243
244	header->core_ver = cpu_to_le32(1);
245	KUNIT_EXPECT_LT(test,
246			cs_dsp_power_up(priv->dsp, local->wmfw, "wmfw", bin, "bin", "misc"),
247			0);
248
249	header->core_ver = cpu_to_le32(priv->dsp->type + 1);
250	KUNIT_EXPECT_LT(test,
251			cs_dsp_power_up(priv->dsp, local->wmfw, "wmfw", bin, "bin", "misc"),
252			0);
253
254	header->core_ver = cpu_to_le32(0xff);
255	KUNIT_EXPECT_LT(test,
256			cs_dsp_power_up(priv->dsp, local->wmfw, "wmfw", bin, "bin", "misc"),
257			0);
258}
259
260/* File too short to contain a full block header */
261static void bin_too_short_for_block_header(struct kunit *test)
262{
263	const struct cs_dsp_bin_test_param *param = test->param_value;
264	struct cs_dsp_test *priv = test->priv;
265	struct cs_dsp_test_local *local = priv->local;
266	struct firmware *bin;
267	unsigned int header_length;
268
269	/* Sanity-check that the wmfw loads ok without the bin */
270	KUNIT_EXPECT_EQ(test,
271			cs_dsp_power_up(priv->dsp, local->wmfw, "wmfw", NULL, NULL, "misc"),
272			0);
273	cs_dsp_power_down(priv->dsp);
274
275	bin = cs_dsp_mock_bin_get_firmware(local->bin_builder);
276	header_length = bin->size;
277	kunit_kfree(test, bin);
278
279	cs_dsp_mock_bin_add_raw_block(local->bin_builder,
280				      cs_dsp_bin_err_test_mock_algs[0].id,
281				      cs_dsp_bin_err_test_mock_algs[0].ver,
282				      param->block_type, 0,
283				      NULL, 0);
284
285	bin = cs_dsp_mock_bin_get_firmware(local->bin_builder);
286	KUNIT_ASSERT_GT(test, bin->size, header_length);
287
288	for (bin->size--; bin->size > header_length; bin->size--) {
289		KUNIT_EXPECT_LT(test,
290				cs_dsp_power_up(priv->dsp, local->wmfw, "wmfw", bin, "bin", "misc"),
291				0);
292	}
293}
294
295/* File too short to contain the block payload */
296static void bin_too_short_for_block_payload(struct kunit *test)
297{
298	const struct cs_dsp_bin_test_param *param = test->param_value;
299	struct cs_dsp_test *priv = test->priv;
300	struct cs_dsp_test_local *local = priv->local;
301	struct firmware *bin;
302	static const u8 payload[256] = { };
303	int i;
304
305	/* Sanity-check that the wmfw loads ok without the bin */
306	KUNIT_EXPECT_EQ(test,
307			cs_dsp_power_up(priv->dsp, local->wmfw, "wmfw", NULL, NULL, "misc"),
308			0);
309	cs_dsp_power_down(priv->dsp);
310
311	cs_dsp_mock_bin_add_raw_block(local->bin_builder,
312				      cs_dsp_bin_err_test_mock_algs[0].id,
313				      cs_dsp_bin_err_test_mock_algs[0].ver,
314				      param->block_type, 0,
315				      payload, sizeof(payload));
316
317	bin = cs_dsp_mock_bin_get_firmware(local->bin_builder);
318	for (i = 0; i < sizeof(payload); i++) {
319		bin->size--;
320		KUNIT_EXPECT_LT(test,
321				cs_dsp_power_up(priv->dsp, local->wmfw, "wmfw", bin, "bin", "misc"),
322				0);
323	}
324}
325
326/* Block payload length is a garbage value */
327static void bin_block_payload_len_garbage(struct kunit *test)
328{
329	const struct cs_dsp_bin_test_param *param = test->param_value;
330	struct cs_dsp_test *priv = test->priv;
331	struct cs_dsp_test_local *local = priv->local;
332	struct firmware *bin;
333	struct wmfw_coeff_hdr *header;
334	struct wmfw_coeff_item *block;
335	u32 payload = 0;
336
337	/* Sanity-check that the wmfw loads ok without the bin */
338	KUNIT_EXPECT_EQ(test,
339			cs_dsp_power_up(priv->dsp, local->wmfw, "wmfw", NULL, NULL, "misc"),
340			0);
341	cs_dsp_power_down(priv->dsp);
342
343	cs_dsp_mock_bin_add_raw_block(local->bin_builder,
344				      cs_dsp_bin_err_test_mock_algs[0].id,
345				      cs_dsp_bin_err_test_mock_algs[0].ver,
346				      param->block_type, 0,
347				      &payload, sizeof(payload));
348
349	bin = cs_dsp_mock_bin_get_firmware(local->bin_builder);
350	header = (struct wmfw_coeff_hdr *)bin->data;
351	block = (struct wmfw_coeff_item *)&bin->data[le32_to_cpu(header->len)];
352
353	/* Sanity check that we're looking at the correct part of the bin */
354	KUNIT_ASSERT_EQ(test, le16_to_cpu(block->type), param->block_type);
355	KUNIT_ASSERT_EQ(test, le32_to_cpu(block->len), sizeof(payload));
356
357	block->len = cpu_to_le32(0x8000);
358	KUNIT_EXPECT_LT(test,
359			cs_dsp_power_up(priv->dsp, local->wmfw, "wmfw", bin, "bin", "misc"),
360			0);
361
362	block->len = cpu_to_le32(0xffff);
363	KUNIT_EXPECT_LT(test,
364			cs_dsp_power_up(priv->dsp, local->wmfw, "wmfw", bin, "bin", "misc"),
365			0);
366
367	block->len = cpu_to_le32(0x7fffffff);
368	KUNIT_EXPECT_LT(test,
369			cs_dsp_power_up(priv->dsp, local->wmfw, "wmfw", bin, "bin", "misc"),
370			0);
371
372	block->len = cpu_to_le32(0x80000000);
373	KUNIT_EXPECT_LT(test,
374			cs_dsp_power_up(priv->dsp, local->wmfw, "wmfw", bin, "bin", "misc"),
375			0);
376
377	block->len = cpu_to_le32(0xffffffff);
378	KUNIT_EXPECT_LT(test,
379			cs_dsp_power_up(priv->dsp, local->wmfw, "wmfw", bin, "bin", "misc"),
380			0);
381}
382
383static void cs_dsp_bin_err_test_exit(struct kunit *test)
384{
385	cs_dsp_suppress_err_messages = false;
386	cs_dsp_suppress_warn_messages = false;
387	cs_dsp_suppress_info_messages = false;
388}
389
390static int cs_dsp_bin_err_test_common_init(struct kunit *test, struct cs_dsp *dsp,
391					   int wmfw_version)
392{
393	struct cs_dsp_test *priv;
394	struct cs_dsp_test_local *local;
395	struct device *test_dev;
396	int ret;
397
398	priv = kunit_kzalloc(test, sizeof(*priv), GFP_KERNEL);
399	if (!priv)
400		return -ENOMEM;
401
402	local = kunit_kzalloc(test, sizeof(struct cs_dsp_test_local), GFP_KERNEL);
403	if (!local)
404		return -ENOMEM;
405
406	priv->test = test;
407	priv->dsp = dsp;
408	test->priv = priv;
409	priv->local = local;
410	priv->local->wmfw_version = wmfw_version;
411
412	/* Create dummy struct device */
413	test_dev = kunit_device_register(test, "cs_dsp_test_drv");
414	if (IS_ERR(test_dev))
415		return PTR_ERR(test_dev);
416
417	dsp->dev = get_device(test_dev);
418	if (!dsp->dev)
419		return -ENODEV;
420
421	ret = kunit_add_action_or_reset(test, _put_device_wrapper, dsp->dev);
422	if (ret)
423		return ret;
424
425	dev_set_drvdata(dsp->dev, priv);
426
427	/* Allocate regmap */
428	ret = cs_dsp_mock_regmap_init(priv);
429	if (ret)
430		return ret;
431
432	/*
433	 * There must always be a XM header with at least 1 algorithm, so create
434	 * a dummy one that tests can use and extract it to a data payload.
435	 */
436	local->xm_header = cs_dsp_create_mock_xm_header(priv,
437							cs_dsp_bin_err_test_mock_algs,
438							ARRAY_SIZE(cs_dsp_bin_err_test_mock_algs));
439	KUNIT_ASSERT_NOT_ERR_OR_NULL(test, local->xm_header);
440
441	local->wmfw_builder = cs_dsp_mock_wmfw_init(priv, priv->local->wmfw_version);
442	KUNIT_ASSERT_NOT_ERR_OR_NULL(test, local->wmfw_builder);
443
444	/* Add dummy XM header payload to wmfw */
445	cs_dsp_mock_wmfw_add_data_block(local->wmfw_builder,
446					WMFW_ADSP2_XM, 0,
447					local->xm_header->blob_data,
448					local->xm_header->blob_size_bytes);
449
450	local->wmfw = cs_dsp_mock_wmfw_get_firmware(priv->local->wmfw_builder);
451
452	local->bin_builder =
453		cs_dsp_mock_bin_init(priv, 1,
454				     cs_dsp_mock_xm_header_get_fw_version(local->xm_header));
455	KUNIT_ASSERT_NOT_ERR_OR_NULL(test, local->bin_builder);
456
457	/* Init cs_dsp */
458	dsp->client_ops = kunit_kzalloc(test, sizeof(*dsp->client_ops), GFP_KERNEL);
459	KUNIT_ASSERT_NOT_ERR_OR_NULL(test, dsp->client_ops);
460
461	switch (dsp->type) {
462	case WMFW_ADSP2:
463		ret = cs_dsp_adsp2_init(dsp);
464		break;
465	case WMFW_HALO:
466		ret = cs_dsp_halo_init(dsp);
467		break;
468	default:
469		KUNIT_FAIL(test, "Untested DSP type %d\n", dsp->type);
470		return -EINVAL;
471	}
472
473	if (ret)
474		return ret;
475
476	/* Automatically call cs_dsp_remove() when test case ends */
477	ret = kunit_add_action_or_reset(priv->test, _cs_dsp_remove_wrapper, dsp);
478	if (ret)
479		return ret;
480
481	/*
482	 * Testing error conditions can produce a lot of log output
483	 * from cs_dsp error messages, so suppress messages.
484	 */
485	cs_dsp_suppress_err_messages = true;
486	cs_dsp_suppress_warn_messages = true;
487	cs_dsp_suppress_info_messages = true;
488
489	return 0;
490}
491
492static int cs_dsp_bin_err_test_halo_init(struct kunit *test)
493{
494	struct cs_dsp *dsp;
495
496	/* Fill in cs_dsp and initialize */
497	dsp = kunit_kzalloc(test, sizeof(*dsp), GFP_KERNEL);
498	if (!dsp)
499		return -ENOMEM;
500
501	dsp->num = 1;
502	dsp->type = WMFW_HALO;
503	dsp->mem = cs_dsp_mock_halo_dsp1_regions;
504	dsp->num_mems = cs_dsp_mock_count_regions(cs_dsp_mock_halo_dsp1_region_sizes);
505	dsp->base = cs_dsp_mock_halo_core_base;
506	dsp->base_sysinfo = cs_dsp_mock_halo_sysinfo_base;
507
508	return cs_dsp_bin_err_test_common_init(test, dsp, 3);
509}
510
511static int cs_dsp_bin_err_test_adsp2_32bit_init(struct kunit *test)
512{
513	struct cs_dsp *dsp;
514
515	/* Fill in cs_dsp and initialize */
516	dsp = kunit_kzalloc(test, sizeof(*dsp), GFP_KERNEL);
517	if (!dsp)
518		return -ENOMEM;
519
520	dsp->num = 1;
521	dsp->type = WMFW_ADSP2;
522	dsp->rev = 1;
523	dsp->mem = cs_dsp_mock_adsp2_32bit_dsp1_regions;
524	dsp->num_mems = cs_dsp_mock_count_regions(cs_dsp_mock_adsp2_32bit_dsp1_region_sizes);
525	dsp->base = cs_dsp_mock_adsp2_32bit_sysbase;
526
527	return cs_dsp_bin_err_test_common_init(test, dsp, 2);
528}
529
530static int cs_dsp_bin_err_test_adsp2_16bit_init(struct kunit *test)
531{
532	struct cs_dsp *dsp;
533
534	/* Fill in cs_dsp and initialize */
535	dsp = kunit_kzalloc(test, sizeof(*dsp), GFP_KERNEL);
536	if (!dsp)
537		return -ENOMEM;
538
539	dsp->num = 1;
540	dsp->type = WMFW_ADSP2;
541	dsp->rev = 0;
542	dsp->mem = cs_dsp_mock_adsp2_16bit_dsp1_regions;
543	dsp->num_mems = cs_dsp_mock_count_regions(cs_dsp_mock_adsp2_16bit_dsp1_region_sizes);
544	dsp->base = cs_dsp_mock_adsp2_16bit_sysbase;
545
546	return cs_dsp_bin_err_test_common_init(test, dsp, 1);
547}
548
549static void cs_dsp_bin_err_block_types_desc(const struct cs_dsp_bin_test_param *param,
550					    char *desc)
551{
552	snprintf(desc, KUNIT_PARAM_DESC_SIZE, "block_type:%#x", param->block_type);
553}
554
555/* Some block types to test against, including illegal types */
556static const struct cs_dsp_bin_test_param bin_test_block_types_cases[] = {
557	{ .block_type = WMFW_INFO_TEXT << 8 },
558	{ .block_type = WMFW_METADATA << 8 },
559	{ .block_type = WMFW_ADSP2_PM },
560	{ .block_type = WMFW_ADSP2_XM },
561	{ .block_type = 0x33 },
562	{ .block_type = 0xf500 },
563	{ .block_type = 0xc000 },
564};
565
566KUNIT_ARRAY_PARAM(bin_test_block_types,
567		  bin_test_block_types_cases,
568		  cs_dsp_bin_err_block_types_desc);
569
570static struct kunit_case cs_dsp_bin_err_test_cases[] = {
571	KUNIT_CASE(bin_load_with_unknown_blocks),
572	KUNIT_CASE(bin_err_wrong_magic),
573	KUNIT_CASE(bin_err_too_short_for_header),
574	KUNIT_CASE(bin_err_bad_header_length),
575	KUNIT_CASE(bin_err_bad_core_type),
576
577	KUNIT_CASE_PARAM(bin_too_short_for_block_header, bin_test_block_types_gen_params),
578	KUNIT_CASE_PARAM(bin_too_short_for_block_payload, bin_test_block_types_gen_params),
579	KUNIT_CASE_PARAM(bin_block_payload_len_garbage, bin_test_block_types_gen_params),
580
581	{ } /* terminator */
582};
583
584static struct kunit_suite cs_dsp_bin_err_test_halo = {
585	.name = "cs_dsp_bin_err_halo",
586	.init = cs_dsp_bin_err_test_halo_init,
587	.exit = cs_dsp_bin_err_test_exit,
588	.test_cases = cs_dsp_bin_err_test_cases,
589};
590
591static struct kunit_suite cs_dsp_bin_err_test_adsp2_32bit = {
592	.name = "cs_dsp_bin_err_adsp2_32bit",
593	.init = cs_dsp_bin_err_test_adsp2_32bit_init,
594	.exit = cs_dsp_bin_err_test_exit,
595	.test_cases = cs_dsp_bin_err_test_cases,
596};
597
598static struct kunit_suite cs_dsp_bin_err_test_adsp2_16bit = {
599	.name = "cs_dsp_bin_err_adsp2_16bit",
600	.init = cs_dsp_bin_err_test_adsp2_16bit_init,
601	.exit = cs_dsp_bin_err_test_exit,
602	.test_cases = cs_dsp_bin_err_test_cases,
603};
604
605kunit_test_suites(&cs_dsp_bin_err_test_halo,
606		  &cs_dsp_bin_err_test_adsp2_32bit,
607		  &cs_dsp_bin_err_test_adsp2_16bit);
~/ Read-only file preview.