Path: blob/master/drivers/firmware/cirrus/test/cs_dsp_test_callbacks.c
26444 views
// SPDX-License-Identifier: GPL-2.0-only1//2// KUnit tests for cs_dsp.3//4// Copyright (C) 2024 Cirrus Logic, Inc. and5// Cirrus Logic International Semiconductor Ltd.6//78#include <kunit/device.h>9#include <kunit/resource.h>10#include <kunit/test.h>11#include <kunit/test-bug.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>2021#define ADSP2_LOCK_REGION_CTRL 0x7A22#define ADSP2_WDT_TIMEOUT_STS_MASK 0x20002324KUNIT_DEFINE_ACTION_WRAPPER(_put_device_wrapper, put_device, struct device *)25KUNIT_DEFINE_ACTION_WRAPPER(_cs_dsp_remove_wrapper, cs_dsp_remove, struct cs_dsp *)2627struct cs_dsp_test_local {28struct cs_dsp_mock_wmfw_builder *wmfw_builder;2930int num_control_add;31int num_control_remove;32int num_pre_run;33int num_post_run;34int num_pre_stop;35int num_post_stop;36int num_watchdog_expired;3738struct cs_dsp_coeff_ctl *passed_ctl[16];39struct cs_dsp *passed_dsp;40};4142struct cs_dsp_callbacks_test_param {43const struct cs_dsp_client_ops *ops;44const char *case_name;45};4647static const struct cs_dsp_mock_alg_def cs_dsp_callbacks_test_mock_algs[] = {48{49.id = 0xfafa,50.ver = 0x100000,51.xm_size_words = 164,52.ym_size_words = 164,53.zm_size_words = 164,54},55};5657static const struct cs_dsp_mock_coeff_def mock_coeff_template = {58.shortname = "Dummy Coeff",59.type = WMFW_CTL_TYPE_BYTES,60.mem_type = WMFW_ADSP2_YM,61.flags = WMFW_CTL_FLAG_VOLATILE,62.length_bytes = 4,63};6465static int cs_dsp_test_control_add_callback(struct cs_dsp_coeff_ctl *ctl)66{67struct kunit *test = kunit_get_current_test();68struct cs_dsp_test *priv = test->priv;69struct cs_dsp_test_local *local = priv->local;7071local->passed_ctl[local->num_control_add] = ctl;72local->num_control_add++;7374return 0;75}7677static void cs_dsp_test_control_remove_callback(struct cs_dsp_coeff_ctl *ctl)78{79struct kunit *test = kunit_get_current_test();80struct cs_dsp_test *priv = test->priv;81struct cs_dsp_test_local *local = priv->local;8283local->passed_ctl[local->num_control_remove] = ctl;84local->num_control_remove++;85}8687static int cs_dsp_test_pre_run_callback(struct cs_dsp *dsp)88{89struct kunit *test = kunit_get_current_test();90struct cs_dsp_test *priv = test->priv;91struct cs_dsp_test_local *local = priv->local;9293local->passed_dsp = dsp;94local->num_pre_run++;9596return 0;97}9899static int cs_dsp_test_post_run_callback(struct cs_dsp *dsp)100{101struct kunit *test = kunit_get_current_test();102struct cs_dsp_test *priv = test->priv;103struct cs_dsp_test_local *local = priv->local;104105local->passed_dsp = dsp;106local->num_post_run++;107108return 0;109}110111static void cs_dsp_test_pre_stop_callback(struct cs_dsp *dsp)112{113struct kunit *test = kunit_get_current_test();114struct cs_dsp_test *priv = test->priv;115struct cs_dsp_test_local *local = priv->local;116117local->passed_dsp = dsp;118local->num_pre_stop++;119}120121static void cs_dsp_test_post_stop_callback(struct cs_dsp *dsp)122{123struct kunit *test = kunit_get_current_test();124struct cs_dsp_test *priv = test->priv;125struct cs_dsp_test_local *local = priv->local;126127local->passed_dsp = dsp;128local->num_post_stop++;129}130131static void cs_dsp_test_watchdog_expired_callback(struct cs_dsp *dsp)132{133struct kunit *test = kunit_get_current_test();134struct cs_dsp_test *priv = test->priv;135struct cs_dsp_test_local *local = priv->local;136137local->passed_dsp = dsp;138local->num_watchdog_expired++;139}140141static const struct cs_dsp_client_ops cs_dsp_callback_test_client_ops = {142.control_add = cs_dsp_test_control_add_callback,143.control_remove = cs_dsp_test_control_remove_callback,144.pre_run = cs_dsp_test_pre_run_callback,145.post_run = cs_dsp_test_post_run_callback,146.pre_stop = cs_dsp_test_pre_stop_callback,147.post_stop = cs_dsp_test_post_stop_callback,148.watchdog_expired = cs_dsp_test_watchdog_expired_callback,149};150151static const struct cs_dsp_client_ops cs_dsp_callback_test_empty_client_ops = {152/* No entries */153};154155static void cs_dsp_test_run_stop_callbacks(struct kunit *test)156{157struct cs_dsp_test *priv = test->priv;158struct cs_dsp_test_local *local = priv->local;159struct firmware *wmfw;160161wmfw = cs_dsp_mock_wmfw_get_firmware(local->wmfw_builder);162163KUNIT_EXPECT_EQ(test,164cs_dsp_power_up(priv->dsp, wmfw, "wmfw", NULL, NULL, "misc"),1650);166167KUNIT_EXPECT_EQ(test, cs_dsp_run(priv->dsp), 0);168KUNIT_EXPECT_EQ(test, local->num_pre_run, 1);169KUNIT_EXPECT_EQ(test, local->num_post_run, 1);170KUNIT_EXPECT_EQ(test, local->num_pre_stop, 0);171KUNIT_EXPECT_EQ(test, local->num_post_stop, 0);172KUNIT_EXPECT_PTR_EQ(test, local->passed_dsp, priv->dsp);173local->passed_dsp = NULL;174175cs_dsp_stop(priv->dsp);176KUNIT_EXPECT_EQ(test, local->num_pre_run, 1);177KUNIT_EXPECT_EQ(test, local->num_post_run, 1);178KUNIT_EXPECT_EQ(test, local->num_pre_stop, 1);179KUNIT_EXPECT_EQ(test, local->num_post_stop, 1);180KUNIT_EXPECT_PTR_EQ(test, local->passed_dsp, priv->dsp);181local->passed_dsp = NULL;182183KUNIT_EXPECT_EQ(test, cs_dsp_run(priv->dsp), 0);184KUNIT_EXPECT_EQ(test, local->num_pre_run, 2);185KUNIT_EXPECT_EQ(test, local->num_post_run, 2);186KUNIT_EXPECT_EQ(test, local->num_pre_stop, 1);187KUNIT_EXPECT_EQ(test, local->num_post_stop, 1);188KUNIT_EXPECT_PTR_EQ(test, local->passed_dsp, priv->dsp);189local->passed_dsp = NULL;190191cs_dsp_stop(priv->dsp);192KUNIT_EXPECT_EQ(test, local->num_pre_run, 2);193KUNIT_EXPECT_EQ(test, local->num_post_run, 2);194KUNIT_EXPECT_EQ(test, local->num_pre_stop, 2);195KUNIT_EXPECT_EQ(test, local->num_post_stop, 2);196KUNIT_EXPECT_PTR_EQ(test, local->passed_dsp, priv->dsp);197local->passed_dsp = NULL;198}199200static void cs_dsp_test_ctl_v1_callbacks(struct kunit *test)201{202struct cs_dsp_test *priv = test->priv;203struct cs_dsp_test_local *local = priv->local;204struct cs_dsp_mock_coeff_def def = mock_coeff_template;205struct cs_dsp_coeff_ctl *ctl;206struct firmware *wmfw;207int i;208209/* Add a control for each memory */210cs_dsp_mock_wmfw_start_alg_info_block(local->wmfw_builder,211cs_dsp_callbacks_test_mock_algs[0].id,212"dummyalg", NULL);213def.shortname = "zm";214def.mem_type = WMFW_ADSP2_ZM;215cs_dsp_mock_wmfw_add_coeff_desc(local->wmfw_builder, &def);216217def.shortname = "ym";218def.mem_type = WMFW_ADSP2_YM;219cs_dsp_mock_wmfw_add_coeff_desc(local->wmfw_builder, &def);220221def.shortname = "xm";222def.mem_type = WMFW_ADSP2_XM;223cs_dsp_mock_wmfw_add_coeff_desc(local->wmfw_builder, &def);224225cs_dsp_mock_wmfw_end_alg_info_block(local->wmfw_builder);226227wmfw = cs_dsp_mock_wmfw_get_firmware(local->wmfw_builder);228KUNIT_EXPECT_EQ(test,229cs_dsp_power_up(priv->dsp, wmfw, "wmfw", NULL, NULL, "misc"),2300);231232/* There should have been an add callback for each control */233KUNIT_EXPECT_EQ(test, list_count_nodes(&priv->dsp->ctl_list), 3);234KUNIT_EXPECT_EQ(test, local->num_control_add, 3);235KUNIT_EXPECT_EQ(test, local->num_control_remove, 0);236237i = 0;238list_for_each_entry_reverse(ctl, &priv->dsp->ctl_list, list)239KUNIT_EXPECT_PTR_EQ(test, local->passed_ctl[i++], ctl);240241/*242* Call cs_dsp_remove() and there should be a remove callback243* for each control244*/245memset(local->passed_ctl, 0, sizeof(local->passed_ctl));246cs_dsp_remove(priv->dsp);247248/* Prevent double cleanup */249kunit_remove_action(priv->test, _cs_dsp_remove_wrapper, priv->dsp);250251KUNIT_EXPECT_EQ(test, local->num_control_add, 3);252KUNIT_EXPECT_EQ(test, local->num_control_remove, 3);253254i = 0;255list_for_each_entry_reverse(ctl, &priv->dsp->ctl_list, list)256KUNIT_EXPECT_PTR_EQ(test, local->passed_ctl[i++], ctl);257}258259static void cs_dsp_test_ctl_v2_callbacks(struct kunit *test)260{261struct cs_dsp_test *priv = test->priv;262struct cs_dsp_test_local *local = priv->local;263struct cs_dsp_mock_coeff_def def = mock_coeff_template;264struct cs_dsp_coeff_ctl *ctl;265struct firmware *wmfw;266char name[2] = { };267int i;268269/* Add some controls */270def.shortname = name;271cs_dsp_mock_wmfw_start_alg_info_block(local->wmfw_builder,272cs_dsp_callbacks_test_mock_algs[0].id,273"dummyalg", NULL);274for (i = 0; i < ARRAY_SIZE(local->passed_ctl); ++i) {275name[0] = 'A' + i;276def.offset_dsp_words = i;277cs_dsp_mock_wmfw_add_coeff_desc(local->wmfw_builder, &def);278}279cs_dsp_mock_wmfw_end_alg_info_block(local->wmfw_builder);280281wmfw = cs_dsp_mock_wmfw_get_firmware(local->wmfw_builder);282KUNIT_EXPECT_EQ(test,283cs_dsp_power_up(priv->dsp, wmfw, "wmfw", NULL, NULL, "misc"),2840);285286/* There should have been an add callback for each control */287KUNIT_EXPECT_EQ(test, list_count_nodes(&priv->dsp->ctl_list),288ARRAY_SIZE(local->passed_ctl));289KUNIT_EXPECT_EQ(test, local->num_control_add, ARRAY_SIZE(local->passed_ctl));290KUNIT_EXPECT_EQ(test, local->num_control_remove, 0);291292i = 0;293list_for_each_entry_reverse(ctl, &priv->dsp->ctl_list, list)294KUNIT_EXPECT_PTR_EQ(test, local->passed_ctl[i++], ctl);295296/*297* Call cs_dsp_remove() and there should be a remove callback298* for each control299*/300memset(local->passed_ctl, 0, sizeof(local->passed_ctl));301cs_dsp_remove(priv->dsp);302303/* Prevent double cleanup */304kunit_remove_action(priv->test, _cs_dsp_remove_wrapper, priv->dsp);305306KUNIT_EXPECT_EQ(test, local->num_control_add, ARRAY_SIZE(local->passed_ctl));307KUNIT_EXPECT_EQ(test, local->num_control_remove, ARRAY_SIZE(local->passed_ctl));308309i = 0;310list_for_each_entry_reverse(ctl, &priv->dsp->ctl_list, list)311KUNIT_EXPECT_PTR_EQ(test, local->passed_ctl[i++], ctl);312}313314static void cs_dsp_test_no_callbacks(struct kunit *test)315{316struct cs_dsp_test *priv = test->priv;317struct cs_dsp_test_local *local = priv->local;318struct cs_dsp_mock_coeff_def def = mock_coeff_template;319struct firmware *wmfw;320321/* Add a controls */322def.shortname = "A";323cs_dsp_mock_wmfw_start_alg_info_block(local->wmfw_builder,324cs_dsp_callbacks_test_mock_algs[0].id,325"dummyalg", NULL);326cs_dsp_mock_wmfw_add_coeff_desc(local->wmfw_builder, &def);327cs_dsp_mock_wmfw_end_alg_info_block(local->wmfw_builder);328329wmfw = cs_dsp_mock_wmfw_get_firmware(local->wmfw_builder);330331/* Run a sequence of ops that would invoke callbacks */332KUNIT_EXPECT_EQ(test,333cs_dsp_power_up(priv->dsp, wmfw, "wmfw", NULL, NULL, "misc"),3340);335KUNIT_EXPECT_EQ(test, cs_dsp_run(priv->dsp), 0);336cs_dsp_stop(priv->dsp);337cs_dsp_remove(priv->dsp);338339/* Prevent double cleanup */340kunit_remove_action(priv->test, _cs_dsp_remove_wrapper, priv->dsp);341342/* Something went very wrong if any of our callbacks were called */343KUNIT_EXPECT_EQ(test, local->num_control_add, 0);344KUNIT_EXPECT_EQ(test, local->num_control_remove, 0);345KUNIT_EXPECT_EQ(test, local->num_pre_run, 0);346KUNIT_EXPECT_EQ(test, local->num_post_run, 0);347KUNIT_EXPECT_EQ(test, local->num_pre_stop, 0);348KUNIT_EXPECT_EQ(test, local->num_post_stop, 0);349}350351static void cs_dsp_test_adsp2v2_watchdog_callback(struct kunit *test)352{353struct cs_dsp_test *priv = test->priv;354struct cs_dsp_test_local *local = priv->local;355struct firmware *wmfw;356357wmfw = cs_dsp_mock_wmfw_get_firmware(local->wmfw_builder);358359KUNIT_EXPECT_EQ(test,360cs_dsp_power_up(priv->dsp, wmfw, "wmfw", NULL, NULL, "misc"),3610);362363KUNIT_EXPECT_EQ(test, cs_dsp_run(priv->dsp), 0);364365/* Set the watchdog timeout bit */366regmap_write(priv->dsp->regmap, priv->dsp->base + ADSP2_LOCK_REGION_CTRL,367ADSP2_WDT_TIMEOUT_STS_MASK);368369/* Notify an interrupt and the watchdog callback should be called */370cs_dsp_adsp2_bus_error(priv->dsp);371KUNIT_EXPECT_EQ(test, local->num_watchdog_expired, 1);372KUNIT_EXPECT_PTR_EQ(test, local->passed_dsp, priv->dsp);373}374375static void cs_dsp_test_adsp2v2_watchdog_no_callbacks(struct kunit *test)376{377struct cs_dsp_test *priv = test->priv;378struct cs_dsp_test_local *local = priv->local;379struct firmware *wmfw;380381wmfw = cs_dsp_mock_wmfw_get_firmware(local->wmfw_builder);382KUNIT_EXPECT_EQ(test,383cs_dsp_power_up(priv->dsp, wmfw, "wmfw", NULL, NULL, "misc"),3840);385KUNIT_EXPECT_EQ(test, cs_dsp_run(priv->dsp), 0);386387/* Set the watchdog timeout bit */388regmap_write(priv->dsp->regmap, priv->dsp->base + ADSP2_LOCK_REGION_CTRL,389ADSP2_WDT_TIMEOUT_STS_MASK);390391/* Notify an interrupt, which will look for a watchdog callback */392cs_dsp_adsp2_bus_error(priv->dsp);393KUNIT_EXPECT_EQ(test, local->num_watchdog_expired, 0);394}395396static void cs_dsp_test_halo_watchdog_callback(struct kunit *test)397{398struct cs_dsp_test *priv = test->priv;399struct cs_dsp_test_local *local = priv->local;400struct firmware *wmfw;401402wmfw = cs_dsp_mock_wmfw_get_firmware(local->wmfw_builder);403404KUNIT_EXPECT_EQ(test,405cs_dsp_power_up(priv->dsp, wmfw, "wmfw", NULL, NULL, "misc"),4060);407408KUNIT_EXPECT_EQ(test, cs_dsp_run(priv->dsp), 0);409410/* Notify an interrupt and the watchdog callback should be called */411cs_dsp_halo_wdt_expire(priv->dsp);412KUNIT_EXPECT_EQ(test, local->num_watchdog_expired, 1);413KUNIT_EXPECT_PTR_EQ(test, local->passed_dsp, priv->dsp);414}415416static void cs_dsp_test_halo_watchdog_no_callbacks(struct kunit *test)417{418struct cs_dsp_test *priv = test->priv;419struct cs_dsp_test_local *local = priv->local;420struct firmware *wmfw;421422wmfw = cs_dsp_mock_wmfw_get_firmware(local->wmfw_builder);423KUNIT_EXPECT_EQ(test,424cs_dsp_power_up(priv->dsp, wmfw, "wmfw", NULL, NULL, "misc"),4250);426KUNIT_EXPECT_EQ(test, cs_dsp_run(priv->dsp), 0);427428/* Notify an interrupt, which will look for a watchdog callback */429cs_dsp_halo_wdt_expire(priv->dsp);430KUNIT_EXPECT_EQ(test, local->num_watchdog_expired, 0);431}432433static int cs_dsp_callbacks_test_common_init(struct kunit *test, struct cs_dsp *dsp,434int wmfw_version)435{436const struct cs_dsp_callbacks_test_param *param = test->param_value;437struct cs_dsp_test *priv;438struct cs_dsp_test_local *local;439struct device *test_dev;440struct cs_dsp_mock_xm_header *xm_header;441int ret;442443priv = kunit_kzalloc(test, sizeof(*priv), GFP_KERNEL);444if (!priv)445return -ENOMEM;446447local = kunit_kzalloc(test, sizeof(struct cs_dsp_test_local), GFP_KERNEL);448if (!local)449return -ENOMEM;450451priv->test = test;452priv->dsp = dsp;453test->priv = priv;454priv->local = local;455456/* Create dummy struct device */457test_dev = kunit_device_register(test, "cs_dsp_test_drv");458if (IS_ERR(test_dev))459return PTR_ERR(test_dev);460461dsp->dev = get_device(test_dev);462if (!dsp->dev)463return -ENODEV;464465ret = kunit_add_action_or_reset(test, _put_device_wrapper, dsp->dev);466if (ret)467return ret;468469dev_set_drvdata(dsp->dev, priv);470471/* Allocate regmap */472ret = cs_dsp_mock_regmap_init(priv);473if (ret)474return ret;475476/*477* There must always be a XM header with at least 1 algorithm,478* so create a dummy one and pre-populate XM so the wmfw doesn't479* have to contain an XM blob.480*/481xm_header = cs_dsp_create_mock_xm_header(priv,482cs_dsp_callbacks_test_mock_algs,483ARRAY_SIZE(cs_dsp_callbacks_test_mock_algs));484KUNIT_ASSERT_NOT_ERR_OR_NULL(test, xm_header);485cs_dsp_mock_xm_header_write_to_regmap(xm_header);486487local->wmfw_builder = cs_dsp_mock_wmfw_init(priv, wmfw_version);488KUNIT_ASSERT_NOT_ERR_OR_NULL(test, local->wmfw_builder);489490/* Add dummy XM header payload to wmfw */491cs_dsp_mock_wmfw_add_data_block(local->wmfw_builder,492WMFW_ADSP2_XM, 0,493xm_header->blob_data,494xm_header->blob_size_bytes);495496/* Init cs_dsp */497dsp->client_ops = param->ops;498499switch (dsp->type) {500case WMFW_ADSP2:501ret = cs_dsp_adsp2_init(dsp);502break;503case WMFW_HALO:504ret = cs_dsp_halo_init(dsp);505break;506default:507KUNIT_FAIL(test, "Untested DSP type %d\n", dsp->type);508return -EINVAL;509}510511if (ret)512return ret;513514/* Automatically call cs_dsp_remove() when test case ends */515return kunit_add_action_or_reset(priv->test, _cs_dsp_remove_wrapper, dsp);516}517518static int cs_dsp_callbacks_test_halo_init(struct kunit *test)519{520struct cs_dsp *dsp;521522/* Fill in cs_dsp and initialize */523dsp = kunit_kzalloc(test, sizeof(*dsp), GFP_KERNEL);524if (!dsp)525return -ENOMEM;526527dsp->num = 1;528dsp->type = WMFW_HALO;529dsp->mem = cs_dsp_mock_halo_dsp1_regions;530dsp->num_mems = cs_dsp_mock_count_regions(cs_dsp_mock_halo_dsp1_region_sizes);531dsp->base = cs_dsp_mock_halo_core_base;532dsp->base_sysinfo = cs_dsp_mock_halo_sysinfo_base;533534return cs_dsp_callbacks_test_common_init(test, dsp, 3);535}536537static int cs_dsp_callbacks_test_adsp2_32bit_init(struct kunit *test, int rev)538{539struct cs_dsp *dsp;540541/* Fill in cs_dsp and initialize */542dsp = kunit_kzalloc(test, sizeof(*dsp), GFP_KERNEL);543if (!dsp)544return -ENOMEM;545546dsp->num = 1;547dsp->type = WMFW_ADSP2;548dsp->rev = rev;549dsp->mem = cs_dsp_mock_adsp2_32bit_dsp1_regions;550dsp->num_mems = cs_dsp_mock_count_regions(cs_dsp_mock_adsp2_32bit_dsp1_region_sizes);551dsp->base = cs_dsp_mock_adsp2_32bit_sysbase;552553return cs_dsp_callbacks_test_common_init(test, dsp, 2);554}555556static int cs_dsp_callbacks_test_adsp2v2_32bit_init(struct kunit *test)557{558return cs_dsp_callbacks_test_adsp2_32bit_init(test, 2);559}560561static int cs_dsp_callbacks_test_adsp2v1_32bit_init(struct kunit *test)562{563return cs_dsp_callbacks_test_adsp2_32bit_init(test, 1);564}565566static int cs_dsp_callbacks_test_adsp2_16bit_init(struct kunit *test)567{568struct cs_dsp *dsp;569570/* Fill in cs_dsp and initialize */571dsp = kunit_kzalloc(test, sizeof(*dsp), GFP_KERNEL);572if (!dsp)573return -ENOMEM;574575dsp->num = 1;576dsp->type = WMFW_ADSP2;577dsp->rev = 0;578dsp->mem = cs_dsp_mock_adsp2_16bit_dsp1_regions;579dsp->num_mems = cs_dsp_mock_count_regions(cs_dsp_mock_adsp2_16bit_dsp1_region_sizes);580dsp->base = cs_dsp_mock_adsp2_16bit_sysbase;581582return cs_dsp_callbacks_test_common_init(test, dsp, 1);583}584585static void cs_dsp_callbacks_param_desc(const struct cs_dsp_callbacks_test_param *param,586char *desc)587{588snprintf(desc, KUNIT_PARAM_DESC_SIZE, "%s", param->case_name);589}590591/* Parameterize on different client callback ops tables */592static const struct cs_dsp_callbacks_test_param cs_dsp_callbacks_ops_cases[] = {593{ .ops = &cs_dsp_callback_test_client_ops, .case_name = "all ops" },594};595596KUNIT_ARRAY_PARAM(cs_dsp_callbacks_ops,597cs_dsp_callbacks_ops_cases,598cs_dsp_callbacks_param_desc);599600static const struct cs_dsp_callbacks_test_param cs_dsp_no_callbacks_cases[] = {601{ .ops = &cs_dsp_callback_test_empty_client_ops, .case_name = "empty ops" },602};603604KUNIT_ARRAY_PARAM(cs_dsp_no_callbacks,605cs_dsp_no_callbacks_cases,606cs_dsp_callbacks_param_desc);607608static struct kunit_case cs_dsp_callbacks_adsp2_wmfwv1_test_cases[] = {609KUNIT_CASE_PARAM(cs_dsp_test_run_stop_callbacks, cs_dsp_callbacks_ops_gen_params),610KUNIT_CASE_PARAM(cs_dsp_test_ctl_v1_callbacks, cs_dsp_callbacks_ops_gen_params),611KUNIT_CASE_PARAM(cs_dsp_test_no_callbacks, cs_dsp_no_callbacks_gen_params),612613{ } /* terminator */614};615616static struct kunit_case cs_dsp_callbacks_adsp2_wmfwv2_test_cases[] = {617KUNIT_CASE_PARAM(cs_dsp_test_run_stop_callbacks, cs_dsp_callbacks_ops_gen_params),618KUNIT_CASE_PARAM(cs_dsp_test_ctl_v2_callbacks, cs_dsp_callbacks_ops_gen_params),619KUNIT_CASE_PARAM(cs_dsp_test_no_callbacks, cs_dsp_no_callbacks_gen_params),620621{ } /* terminator */622};623624static struct kunit_case cs_dsp_callbacks_halo_test_cases[] = {625KUNIT_CASE_PARAM(cs_dsp_test_run_stop_callbacks, cs_dsp_callbacks_ops_gen_params),626KUNIT_CASE_PARAM(cs_dsp_test_ctl_v2_callbacks, cs_dsp_callbacks_ops_gen_params),627KUNIT_CASE_PARAM(cs_dsp_test_no_callbacks, cs_dsp_no_callbacks_gen_params),628629{ } /* terminator */630};631632static struct kunit_case cs_dsp_watchdog_adsp2v2_test_cases[] = {633KUNIT_CASE_PARAM(cs_dsp_test_adsp2v2_watchdog_callback, cs_dsp_callbacks_ops_gen_params),634KUNIT_CASE_PARAM(cs_dsp_test_adsp2v2_watchdog_no_callbacks, cs_dsp_no_callbacks_gen_params),635636{ } /* terminator */637};638639static struct kunit_case cs_dsp_watchdog_halo_test_cases[] = {640KUNIT_CASE_PARAM(cs_dsp_test_halo_watchdog_callback, cs_dsp_callbacks_ops_gen_params),641KUNIT_CASE_PARAM(cs_dsp_test_halo_watchdog_no_callbacks, cs_dsp_no_callbacks_gen_params),642643{ } /* terminator */644};645646static struct kunit_suite cs_dsp_callbacks_test_halo = {647.name = "cs_dsp_callbacks_halo",648.init = cs_dsp_callbacks_test_halo_init,649.test_cases = cs_dsp_callbacks_halo_test_cases,650};651652static struct kunit_suite cs_dsp_callbacks_test_adsp2v2_32bit = {653.name = "cs_dsp_callbacks_adsp2v2_32bit_wmfwv2",654.init = cs_dsp_callbacks_test_adsp2v2_32bit_init,655.test_cases = cs_dsp_callbacks_adsp2_wmfwv2_test_cases,656};657658static struct kunit_suite cs_dsp_callbacks_test_adsp2v1_32bit = {659.name = "cs_dsp_callbacks_adsp2v1_32bit_wmfwv2",660.init = cs_dsp_callbacks_test_adsp2v1_32bit_init,661.test_cases = cs_dsp_callbacks_adsp2_wmfwv2_test_cases,662};663664static struct kunit_suite cs_dsp_callbacks_test_adsp2_16bit = {665.name = "cs_dsp_callbacks_adsp2_16bit_wmfwv1",666.init = cs_dsp_callbacks_test_adsp2_16bit_init,667.test_cases = cs_dsp_callbacks_adsp2_wmfwv1_test_cases,668};669670static struct kunit_suite cs_dsp_watchdog_test_adsp2v2_32bit = {671.name = "cs_dsp_watchdog_adsp2v2_32bit",672.init = cs_dsp_callbacks_test_adsp2v2_32bit_init,673.test_cases = cs_dsp_watchdog_adsp2v2_test_cases,674};675676static struct kunit_suite cs_dsp_watchdog_test_halo_32bit = {677.name = "cs_dsp_watchdog_halo",678.init = cs_dsp_callbacks_test_halo_init,679.test_cases = cs_dsp_watchdog_halo_test_cases,680};681682kunit_test_suites(&cs_dsp_callbacks_test_halo,683&cs_dsp_callbacks_test_adsp2v2_32bit,684&cs_dsp_callbacks_test_adsp2v1_32bit,685&cs_dsp_callbacks_test_adsp2_16bit,686&cs_dsp_watchdog_test_adsp2v2_32bit,687&cs_dsp_watchdog_test_halo_32bit);688689690