1dd0b6b1fSRichard Fitzgerald // SPDX-License-Identifier: GPL-2.0-only
2dd0b6b1fSRichard Fitzgerald //
3dd0b6b1fSRichard Fitzgerald // KUnit tests for cs_dsp.
4dd0b6b1fSRichard Fitzgerald //
5dd0b6b1fSRichard Fitzgerald // Copyright (C) 2024 Cirrus Logic, Inc. and
6dd0b6b1fSRichard Fitzgerald // Cirrus Logic International Semiconductor Ltd.
7dd0b6b1fSRichard Fitzgerald
8dd0b6b1fSRichard Fitzgerald #include <kunit/device.h>
9dd0b6b1fSRichard Fitzgerald #include <kunit/resource.h>
10dd0b6b1fSRichard Fitzgerald #include <kunit/test.h>
11dd0b6b1fSRichard Fitzgerald #include <linux/build_bug.h>
12dd0b6b1fSRichard Fitzgerald #include <linux/firmware/cirrus/cs_dsp.h>
13dd0b6b1fSRichard Fitzgerald #include <linux/firmware/cirrus/cs_dsp_test_utils.h>
14dd0b6b1fSRichard Fitzgerald #include <linux/firmware/cirrus/wmfw.h>
15dd0b6b1fSRichard Fitzgerald #include <linux/firmware.h>
16dd0b6b1fSRichard Fitzgerald #include <linux/math.h>
17dd0b6b1fSRichard Fitzgerald #include <linux/random.h>
18dd0b6b1fSRichard Fitzgerald #include <linux/regmap.h>
19dd0b6b1fSRichard Fitzgerald
20dd0b6b1fSRichard Fitzgerald /*
21dd0b6b1fSRichard Fitzgerald * Test method is:
22dd0b6b1fSRichard Fitzgerald *
23dd0b6b1fSRichard Fitzgerald * 1) Create a mock regmap in cache-only mode so that all writes will be cached.
24dd0b6b1fSRichard Fitzgerald * 2) Create a XM header with an algorithm list in the cached regmap.
25dd0b6b1fSRichard Fitzgerald * 3) Create dummy wmfw file to satisfy cs_dsp.
26dd0b6b1fSRichard Fitzgerald * 4) Create bin file content.
27dd0b6b1fSRichard Fitzgerald * 5) Call cs_dsp_power_up() with the bin file.
28dd0b6b1fSRichard Fitzgerald * 6) Readback the cached value of registers that should have been written and
29dd0b6b1fSRichard Fitzgerald * check they have the correct value.
30dd0b6b1fSRichard Fitzgerald * 7) All the registers that are expected to have been written are dropped from
31dd0b6b1fSRichard Fitzgerald * the cache (including the XM header). This should leave the cache clean.
32dd0b6b1fSRichard Fitzgerald * 8) If the cache is still dirty there have been unexpected writes.
33dd0b6b1fSRichard Fitzgerald *
34dd0b6b1fSRichard Fitzgerald * There are multiple different schemes used for addressing across
35dd0b6b1fSRichard Fitzgerald * ADSP2 and Halo Core DSPs:
36dd0b6b1fSRichard Fitzgerald *
37dd0b6b1fSRichard Fitzgerald * dsp words: The addressing scheme used by the DSP, pointers and lengths
38dd0b6b1fSRichard Fitzgerald * in DSP memory use this. A memory region (XM, YM, ZM) is
39dd0b6b1fSRichard Fitzgerald * also required to create a unique DSP memory address.
40dd0b6b1fSRichard Fitzgerald * registers: Addresses in the register map. Older ADSP2 devices have
41dd0b6b1fSRichard Fitzgerald * 16-bit registers with an address stride of 1. Newer ADSP2
42dd0b6b1fSRichard Fitzgerald * devices have 32-bit registers with an address stride of 2.
43dd0b6b1fSRichard Fitzgerald * Halo Core devices have 32-bit registers with a stride of 4.
44dd0b6b1fSRichard Fitzgerald * unpacked: Registers that have a 1:1 mapping to DSP words
45dd0b6b1fSRichard Fitzgerald * packed: Registers that pack multiple DSP words more efficiently into
46dd0b6b1fSRichard Fitzgerald * multiple 32-bit registers. Because of this the relationship
47dd0b6b1fSRichard Fitzgerald * between a packed _register_ address and the corresponding
48dd0b6b1fSRichard Fitzgerald * _dsp word_ address is different from unpacked registers.
49dd0b6b1fSRichard Fitzgerald * Packed registers can only be accessed as a group of
50dd0b6b1fSRichard Fitzgerald * multiple registers, therefore can only read/write a group
51dd0b6b1fSRichard Fitzgerald * of multiple DSP words.
52dd0b6b1fSRichard Fitzgerald * Packed registers only exist on Halo Core DSPs.
53dd0b6b1fSRichard Fitzgerald *
54dd0b6b1fSRichard Fitzgerald * Addresses can also be relative to the start of an algorithm, and this
55dd0b6b1fSRichard Fitzgerald * can be expressed in dsp words, register addresses, or bytes.
56dd0b6b1fSRichard Fitzgerald */
57dd0b6b1fSRichard Fitzgerald
58dd0b6b1fSRichard Fitzgerald KUNIT_DEFINE_ACTION_WRAPPER(_put_device_wrapper, put_device, struct device *)
59dd0b6b1fSRichard Fitzgerald KUNIT_DEFINE_ACTION_WRAPPER(_cs_dsp_remove_wrapper, cs_dsp_remove, struct cs_dsp *)
60dd0b6b1fSRichard Fitzgerald
61dd0b6b1fSRichard Fitzgerald struct cs_dsp_test_local {
62dd0b6b1fSRichard Fitzgerald struct cs_dsp_mock_bin_builder *bin_builder;
63dd0b6b1fSRichard Fitzgerald struct cs_dsp_mock_wmfw_builder *wmfw_builder;
64dd0b6b1fSRichard Fitzgerald struct firmware *wmfw;
65dd0b6b1fSRichard Fitzgerald };
66dd0b6b1fSRichard Fitzgerald
67dd0b6b1fSRichard Fitzgerald struct bin_test_param {
68dd0b6b1fSRichard Fitzgerald const char *name;
69dd0b6b1fSRichard Fitzgerald int mem_type;
70dd0b6b1fSRichard Fitzgerald unsigned int offset_words;
71dd0b6b1fSRichard Fitzgerald int alg_idx;
72dd0b6b1fSRichard Fitzgerald };
73dd0b6b1fSRichard Fitzgerald
74dd0b6b1fSRichard Fitzgerald static const struct cs_dsp_mock_alg_def bin_test_mock_algs[] = {
75dd0b6b1fSRichard Fitzgerald {
76dd0b6b1fSRichard Fitzgerald .id = 0xfafa,
77dd0b6b1fSRichard Fitzgerald .ver = 0x100000,
78dd0b6b1fSRichard Fitzgerald .xm_size_words = 164,
79dd0b6b1fSRichard Fitzgerald .ym_size_words = 164,
80dd0b6b1fSRichard Fitzgerald .zm_size_words = 164,
81dd0b6b1fSRichard Fitzgerald },
82dd0b6b1fSRichard Fitzgerald {
83dd0b6b1fSRichard Fitzgerald .id = 0xfbfb,
84dd0b6b1fSRichard Fitzgerald .ver = 0x100000,
85dd0b6b1fSRichard Fitzgerald .xm_size_words = 99,
86dd0b6b1fSRichard Fitzgerald .ym_size_words = 99,
87dd0b6b1fSRichard Fitzgerald .zm_size_words = 99,
88dd0b6b1fSRichard Fitzgerald },
89dd0b6b1fSRichard Fitzgerald {
90dd0b6b1fSRichard Fitzgerald .id = 0xc321,
91dd0b6b1fSRichard Fitzgerald .ver = 0x100000,
92dd0b6b1fSRichard Fitzgerald .xm_size_words = 120,
93dd0b6b1fSRichard Fitzgerald .ym_size_words = 120,
94dd0b6b1fSRichard Fitzgerald .zm_size_words = 120,
95dd0b6b1fSRichard Fitzgerald },
96dd0b6b1fSRichard Fitzgerald {
97dd0b6b1fSRichard Fitzgerald .id = 0xb123,
98dd0b6b1fSRichard Fitzgerald .ver = 0x100000,
99dd0b6b1fSRichard Fitzgerald .xm_size_words = 96,
100dd0b6b1fSRichard Fitzgerald .ym_size_words = 96,
101dd0b6b1fSRichard Fitzgerald .zm_size_words = 96,
102dd0b6b1fSRichard Fitzgerald },
103dd0b6b1fSRichard Fitzgerald };
104dd0b6b1fSRichard Fitzgerald
105dd0b6b1fSRichard Fitzgerald /*
106dd0b6b1fSRichard Fitzgerald * Convert number of DSP words to number of packed registers rounded
107dd0b6b1fSRichard Fitzgerald * down to the nearest register.
108dd0b6b1fSRichard Fitzgerald * There are 3 registers for every 4 packed words.
109dd0b6b1fSRichard Fitzgerald */
_num_words_to_num_packed_regs(unsigned int num_dsp_words)110dd0b6b1fSRichard Fitzgerald static unsigned int _num_words_to_num_packed_regs(unsigned int num_dsp_words)
111dd0b6b1fSRichard Fitzgerald {
112dd0b6b1fSRichard Fitzgerald return (num_dsp_words * 3) / 4;
113dd0b6b1fSRichard Fitzgerald }
114dd0b6b1fSRichard Fitzgerald
115dd0b6b1fSRichard Fitzgerald /* bin file that patches a single DSP word */
bin_patch_one_word(struct kunit * test)116dd0b6b1fSRichard Fitzgerald static void bin_patch_one_word(struct kunit *test)
117dd0b6b1fSRichard Fitzgerald {
118dd0b6b1fSRichard Fitzgerald struct cs_dsp_test *priv = test->priv;
119dd0b6b1fSRichard Fitzgerald const struct bin_test_param *param = test->param_value;
120dd0b6b1fSRichard Fitzgerald unsigned int reg_inc_per_word = cs_dsp_mock_reg_addr_inc_per_unpacked_word(priv);
121dd0b6b1fSRichard Fitzgerald u32 reg_val, payload_data;
122dd0b6b1fSRichard Fitzgerald unsigned int alg_base_words, reg_addr;
123dd0b6b1fSRichard Fitzgerald struct firmware *fw;
124dd0b6b1fSRichard Fitzgerald
125dd0b6b1fSRichard Fitzgerald get_random_bytes(&payload_data, sizeof(payload_data));
126dd0b6b1fSRichard Fitzgerald
127dd0b6b1fSRichard Fitzgerald alg_base_words = cs_dsp_mock_xm_header_get_alg_base_in_words(priv,
128dd0b6b1fSRichard Fitzgerald bin_test_mock_algs[param->alg_idx].id,
129dd0b6b1fSRichard Fitzgerald param->mem_type);
130dd0b6b1fSRichard Fitzgerald
131dd0b6b1fSRichard Fitzgerald cs_dsp_mock_bin_add_patch(priv->local->bin_builder,
132dd0b6b1fSRichard Fitzgerald bin_test_mock_algs[param->alg_idx].id,
133dd0b6b1fSRichard Fitzgerald bin_test_mock_algs[param->alg_idx].ver,
134dd0b6b1fSRichard Fitzgerald param->mem_type,
135dd0b6b1fSRichard Fitzgerald param->offset_words * reg_inc_per_word,
136dd0b6b1fSRichard Fitzgerald &payload_data, sizeof(payload_data));
137dd0b6b1fSRichard Fitzgerald
138dd0b6b1fSRichard Fitzgerald fw = cs_dsp_mock_bin_get_firmware(priv->local->bin_builder);
139dd0b6b1fSRichard Fitzgerald KUNIT_ASSERT_EQ(test,
140dd0b6b1fSRichard Fitzgerald cs_dsp_power_up(priv->dsp, priv->local->wmfw, "mock_wmfw",
141dd0b6b1fSRichard Fitzgerald fw, "mock_bin", "misc"),
142dd0b6b1fSRichard Fitzgerald 0);
143dd0b6b1fSRichard Fitzgerald
144dd0b6b1fSRichard Fitzgerald /* Content of registers should match payload_data */
145dd0b6b1fSRichard Fitzgerald reg_addr = cs_dsp_mock_base_addr_for_mem(priv, param->mem_type) +
146dd0b6b1fSRichard Fitzgerald ((alg_base_words + param->offset_words) * reg_inc_per_word);
147dd0b6b1fSRichard Fitzgerald reg_val = 0;
148dd0b6b1fSRichard Fitzgerald KUNIT_EXPECT_EQ(test,
149dd0b6b1fSRichard Fitzgerald regmap_raw_read(priv->dsp->regmap, reg_addr,
150dd0b6b1fSRichard Fitzgerald ®_val, sizeof(reg_val)),
151dd0b6b1fSRichard Fitzgerald 0);
152dd0b6b1fSRichard Fitzgerald KUNIT_EXPECT_EQ(test, reg_val, payload_data);
153dd0b6b1fSRichard Fitzgerald
154dd0b6b1fSRichard Fitzgerald /* Drop expected writes and the cache should then be clean */
155dd0b6b1fSRichard Fitzgerald cs_dsp_mock_regmap_drop_range(priv, reg_addr, reg_addr + reg_inc_per_word - 1);
156dd0b6b1fSRichard Fitzgerald cs_dsp_mock_xm_header_drop_from_regmap_cache(priv);
157dd0b6b1fSRichard Fitzgerald
158dd0b6b1fSRichard Fitzgerald KUNIT_EXPECT_FALSE(test, cs_dsp_mock_regmap_is_dirty(priv, true));
159dd0b6b1fSRichard Fitzgerald }
160dd0b6b1fSRichard Fitzgerald
161dd0b6b1fSRichard Fitzgerald /* bin file with a single payload that patches consecutive words */
bin_patch_one_multiword(struct kunit * test)162dd0b6b1fSRichard Fitzgerald static void bin_patch_one_multiword(struct kunit *test)
163dd0b6b1fSRichard Fitzgerald {
164dd0b6b1fSRichard Fitzgerald struct cs_dsp_test *priv = test->priv;
165dd0b6b1fSRichard Fitzgerald const struct bin_test_param *param = test->param_value;
166dd0b6b1fSRichard Fitzgerald unsigned int reg_inc_per_word = cs_dsp_mock_reg_addr_inc_per_unpacked_word(priv);
167dd0b6b1fSRichard Fitzgerald u32 payload_data[16], readback[16];
168dd0b6b1fSRichard Fitzgerald unsigned int alg_base_words, reg_addr;
169dd0b6b1fSRichard Fitzgerald struct firmware *fw;
170dd0b6b1fSRichard Fitzgerald
171dd0b6b1fSRichard Fitzgerald static_assert(ARRAY_SIZE(readback) == ARRAY_SIZE(payload_data));
172dd0b6b1fSRichard Fitzgerald
173dd0b6b1fSRichard Fitzgerald get_random_bytes(&payload_data, sizeof(payload_data));
174dd0b6b1fSRichard Fitzgerald memset(readback, 0, sizeof(readback));
175dd0b6b1fSRichard Fitzgerald
176dd0b6b1fSRichard Fitzgerald alg_base_words = cs_dsp_mock_xm_header_get_alg_base_in_words(priv,
177dd0b6b1fSRichard Fitzgerald bin_test_mock_algs[param->alg_idx].id,
178dd0b6b1fSRichard Fitzgerald param->mem_type);
179dd0b6b1fSRichard Fitzgerald
180dd0b6b1fSRichard Fitzgerald cs_dsp_mock_bin_add_patch(priv->local->bin_builder,
181dd0b6b1fSRichard Fitzgerald bin_test_mock_algs[param->alg_idx].id,
182dd0b6b1fSRichard Fitzgerald bin_test_mock_algs[param->alg_idx].ver,
183dd0b6b1fSRichard Fitzgerald param->mem_type,
184dd0b6b1fSRichard Fitzgerald param->offset_words * reg_inc_per_word,
185dd0b6b1fSRichard Fitzgerald payload_data, sizeof(payload_data));
186dd0b6b1fSRichard Fitzgerald
187dd0b6b1fSRichard Fitzgerald fw = cs_dsp_mock_bin_get_firmware(priv->local->bin_builder);
188dd0b6b1fSRichard Fitzgerald KUNIT_ASSERT_EQ(test,
189dd0b6b1fSRichard Fitzgerald cs_dsp_power_up(priv->dsp, priv->local->wmfw, "mock_wmfw",
190dd0b6b1fSRichard Fitzgerald fw, "mock_bin", "misc"),
191dd0b6b1fSRichard Fitzgerald 0);
192dd0b6b1fSRichard Fitzgerald
193dd0b6b1fSRichard Fitzgerald /* Content of registers should match payload_data */
194dd0b6b1fSRichard Fitzgerald reg_addr = cs_dsp_mock_base_addr_for_mem(priv, param->mem_type) +
195dd0b6b1fSRichard Fitzgerald ((alg_base_words + param->offset_words) * reg_inc_per_word);
196dd0b6b1fSRichard Fitzgerald KUNIT_EXPECT_EQ(test,
197dd0b6b1fSRichard Fitzgerald regmap_raw_read(priv->dsp->regmap, reg_addr, readback,
198dd0b6b1fSRichard Fitzgerald sizeof(readback)),
199dd0b6b1fSRichard Fitzgerald 0);
200dd0b6b1fSRichard Fitzgerald KUNIT_EXPECT_MEMEQ(test, readback, payload_data, sizeof(payload_data));
201dd0b6b1fSRichard Fitzgerald
202dd0b6b1fSRichard Fitzgerald /* Drop expected writes and the cache should then be clean */
203dd0b6b1fSRichard Fitzgerald cs_dsp_mock_regmap_drop_range(priv, reg_addr,
204dd0b6b1fSRichard Fitzgerald reg_addr + (reg_inc_per_word * ARRAY_SIZE(payload_data)));
205dd0b6b1fSRichard Fitzgerald cs_dsp_mock_xm_header_drop_from_regmap_cache(priv);
206dd0b6b1fSRichard Fitzgerald KUNIT_EXPECT_FALSE(test, cs_dsp_mock_regmap_is_dirty(priv, true));
207dd0b6b1fSRichard Fitzgerald }
208dd0b6b1fSRichard Fitzgerald
209dd0b6b1fSRichard Fitzgerald /* bin file with a multiple one-word payloads that patch consecutive words */
bin_patch_multi_oneword(struct kunit * test)210dd0b6b1fSRichard Fitzgerald static void bin_patch_multi_oneword(struct kunit *test)
211dd0b6b1fSRichard Fitzgerald {
212dd0b6b1fSRichard Fitzgerald struct cs_dsp_test *priv = test->priv;
213dd0b6b1fSRichard Fitzgerald const struct bin_test_param *param = test->param_value;
214dd0b6b1fSRichard Fitzgerald unsigned int reg_inc_per_word = cs_dsp_mock_reg_addr_inc_per_unpacked_word(priv);
215dd0b6b1fSRichard Fitzgerald u32 payload_data[16], readback[16];
216dd0b6b1fSRichard Fitzgerald unsigned int alg_base_words, reg_addr;
217dd0b6b1fSRichard Fitzgerald struct firmware *fw;
218dd0b6b1fSRichard Fitzgerald int i;
219dd0b6b1fSRichard Fitzgerald
220dd0b6b1fSRichard Fitzgerald static_assert(ARRAY_SIZE(readback) == ARRAY_SIZE(payload_data));
221dd0b6b1fSRichard Fitzgerald
222dd0b6b1fSRichard Fitzgerald get_random_bytes(&payload_data, sizeof(payload_data));
223dd0b6b1fSRichard Fitzgerald memset(readback, 0, sizeof(readback));
224dd0b6b1fSRichard Fitzgerald
225dd0b6b1fSRichard Fitzgerald alg_base_words = cs_dsp_mock_xm_header_get_alg_base_in_words(priv,
226dd0b6b1fSRichard Fitzgerald bin_test_mock_algs[param->alg_idx].id,
227dd0b6b1fSRichard Fitzgerald param->mem_type);
228dd0b6b1fSRichard Fitzgerald
229dd0b6b1fSRichard Fitzgerald /* Add one payload per word */
230dd0b6b1fSRichard Fitzgerald for (i = 0; i < ARRAY_SIZE(payload_data); ++i) {
231dd0b6b1fSRichard Fitzgerald cs_dsp_mock_bin_add_patch(priv->local->bin_builder,
232dd0b6b1fSRichard Fitzgerald bin_test_mock_algs[param->alg_idx].id,
233dd0b6b1fSRichard Fitzgerald bin_test_mock_algs[param->alg_idx].ver,
234dd0b6b1fSRichard Fitzgerald param->mem_type,
235dd0b6b1fSRichard Fitzgerald (param->offset_words + i) * reg_inc_per_word,
236dd0b6b1fSRichard Fitzgerald &payload_data[i], sizeof(payload_data[i]));
237dd0b6b1fSRichard Fitzgerald }
238dd0b6b1fSRichard Fitzgerald
239dd0b6b1fSRichard Fitzgerald fw = cs_dsp_mock_bin_get_firmware(priv->local->bin_builder);
240dd0b6b1fSRichard Fitzgerald KUNIT_ASSERT_EQ(test,
241dd0b6b1fSRichard Fitzgerald cs_dsp_power_up(priv->dsp, priv->local->wmfw, "mock_wmfw",
242dd0b6b1fSRichard Fitzgerald fw, "mock_bin", "misc"),
243dd0b6b1fSRichard Fitzgerald 0);
244dd0b6b1fSRichard Fitzgerald
245dd0b6b1fSRichard Fitzgerald /* Content of registers should match payload_data */
246dd0b6b1fSRichard Fitzgerald reg_addr = cs_dsp_mock_base_addr_for_mem(priv, param->mem_type) +
247dd0b6b1fSRichard Fitzgerald ((alg_base_words + param->offset_words) * reg_inc_per_word);
248dd0b6b1fSRichard Fitzgerald KUNIT_EXPECT_EQ(test,
249dd0b6b1fSRichard Fitzgerald regmap_raw_read(priv->dsp->regmap, reg_addr, readback,
250dd0b6b1fSRichard Fitzgerald sizeof(readback)),
251dd0b6b1fSRichard Fitzgerald 0);
252dd0b6b1fSRichard Fitzgerald KUNIT_EXPECT_MEMEQ(test, readback, payload_data, sizeof(payload_data));
253dd0b6b1fSRichard Fitzgerald
254dd0b6b1fSRichard Fitzgerald /* Drop expected writes and the cache should then be clean */
255dd0b6b1fSRichard Fitzgerald cs_dsp_mock_xm_header_drop_from_regmap_cache(priv);
256dd0b6b1fSRichard Fitzgerald cs_dsp_mock_regmap_drop_range(priv, reg_addr,
257dd0b6b1fSRichard Fitzgerald reg_addr + (reg_inc_per_word * ARRAY_SIZE(payload_data)));
258dd0b6b1fSRichard Fitzgerald KUNIT_EXPECT_FALSE(test, cs_dsp_mock_regmap_is_dirty(priv, true));
259dd0b6b1fSRichard Fitzgerald }
260dd0b6b1fSRichard Fitzgerald
261dd0b6b1fSRichard Fitzgerald /*
262dd0b6b1fSRichard Fitzgerald * bin file with a multiple one-word payloads that patch a block of consecutive
263dd0b6b1fSRichard Fitzgerald * words but the payloads are not in address order.
264dd0b6b1fSRichard Fitzgerald */
bin_patch_multi_oneword_unordered(struct kunit * test)265dd0b6b1fSRichard Fitzgerald static void bin_patch_multi_oneword_unordered(struct kunit *test)
266dd0b6b1fSRichard Fitzgerald {
267dd0b6b1fSRichard Fitzgerald struct cs_dsp_test *priv = test->priv;
268dd0b6b1fSRichard Fitzgerald const struct bin_test_param *param = test->param_value;
269dd0b6b1fSRichard Fitzgerald unsigned int reg_inc_per_word = cs_dsp_mock_reg_addr_inc_per_unpacked_word(priv);
270dd0b6b1fSRichard Fitzgerald u32 payload_data[16], readback[16];
271dd0b6b1fSRichard Fitzgerald static const u8 word_order[] = { 10, 2, 12, 4, 0, 11, 6, 1, 3, 15, 5, 13, 8, 7, 9, 14 };
272dd0b6b1fSRichard Fitzgerald unsigned int alg_base_words, reg_addr;
273dd0b6b1fSRichard Fitzgerald struct firmware *fw;
274dd0b6b1fSRichard Fitzgerald int i;
275dd0b6b1fSRichard Fitzgerald
276dd0b6b1fSRichard Fitzgerald static_assert(ARRAY_SIZE(readback) == ARRAY_SIZE(payload_data));
277dd0b6b1fSRichard Fitzgerald static_assert(ARRAY_SIZE(word_order) == ARRAY_SIZE(payload_data));
278dd0b6b1fSRichard Fitzgerald
279dd0b6b1fSRichard Fitzgerald get_random_bytes(&payload_data, sizeof(payload_data));
280dd0b6b1fSRichard Fitzgerald memset(readback, 0, sizeof(readback));
281dd0b6b1fSRichard Fitzgerald
282dd0b6b1fSRichard Fitzgerald alg_base_words = cs_dsp_mock_xm_header_get_alg_base_in_words(priv,
283dd0b6b1fSRichard Fitzgerald bin_test_mock_algs[param->alg_idx].id,
284dd0b6b1fSRichard Fitzgerald param->mem_type);
285dd0b6b1fSRichard Fitzgerald
286dd0b6b1fSRichard Fitzgerald /* Add one payload per word */
287dd0b6b1fSRichard Fitzgerald for (i = 0; i < ARRAY_SIZE(word_order); ++i) {
288dd0b6b1fSRichard Fitzgerald cs_dsp_mock_bin_add_patch(priv->local->bin_builder,
289dd0b6b1fSRichard Fitzgerald bin_test_mock_algs[param->alg_idx].id,
290dd0b6b1fSRichard Fitzgerald bin_test_mock_algs[param->alg_idx].ver,
291dd0b6b1fSRichard Fitzgerald param->mem_type,
292dd0b6b1fSRichard Fitzgerald (param->offset_words + word_order[i]) *
293dd0b6b1fSRichard Fitzgerald reg_inc_per_word,
294dd0b6b1fSRichard Fitzgerald &payload_data[word_order[i]], sizeof(payload_data[0]));
295dd0b6b1fSRichard Fitzgerald }
296dd0b6b1fSRichard Fitzgerald
297dd0b6b1fSRichard Fitzgerald fw = cs_dsp_mock_bin_get_firmware(priv->local->bin_builder);
298dd0b6b1fSRichard Fitzgerald KUNIT_ASSERT_EQ(test,
299dd0b6b1fSRichard Fitzgerald cs_dsp_power_up(priv->dsp, priv->local->wmfw, "mock_wmfw",
300dd0b6b1fSRichard Fitzgerald fw, "mock_bin", "misc"),
301dd0b6b1fSRichard Fitzgerald 0);
302dd0b6b1fSRichard Fitzgerald
303dd0b6b1fSRichard Fitzgerald /* Content of registers should match payload_data */
304dd0b6b1fSRichard Fitzgerald reg_addr = cs_dsp_mock_base_addr_for_mem(priv, param->mem_type) +
305dd0b6b1fSRichard Fitzgerald ((alg_base_words + param->offset_words) * reg_inc_per_word);
306dd0b6b1fSRichard Fitzgerald KUNIT_EXPECT_EQ(test,
307dd0b6b1fSRichard Fitzgerald regmap_raw_read(priv->dsp->regmap, reg_addr, readback,
308dd0b6b1fSRichard Fitzgerald sizeof(readback)),
309dd0b6b1fSRichard Fitzgerald 0);
310dd0b6b1fSRichard Fitzgerald KUNIT_EXPECT_MEMEQ(test, readback, payload_data, sizeof(payload_data));
311dd0b6b1fSRichard Fitzgerald
312dd0b6b1fSRichard Fitzgerald /* Drop expected writes and the cache should then be clean */
313dd0b6b1fSRichard Fitzgerald cs_dsp_mock_xm_header_drop_from_regmap_cache(priv);
314dd0b6b1fSRichard Fitzgerald cs_dsp_mock_regmap_drop_range(priv, reg_addr,
315dd0b6b1fSRichard Fitzgerald reg_addr + (reg_inc_per_word * ARRAY_SIZE(payload_data)));
316dd0b6b1fSRichard Fitzgerald KUNIT_EXPECT_FALSE(test, cs_dsp_mock_regmap_is_dirty(priv, true));
317dd0b6b1fSRichard Fitzgerald }
318dd0b6b1fSRichard Fitzgerald
319dd0b6b1fSRichard Fitzgerald /*
320dd0b6b1fSRichard Fitzgerald * bin file with a multiple one-word payloads. The payloads are not in address
321dd0b6b1fSRichard Fitzgerald * order and collectively do not patch a contiguous block of memory.
322dd0b6b1fSRichard Fitzgerald */
bin_patch_multi_oneword_sparse_unordered(struct kunit * test)323dd0b6b1fSRichard Fitzgerald static void bin_patch_multi_oneword_sparse_unordered(struct kunit *test)
324dd0b6b1fSRichard Fitzgerald {
325dd0b6b1fSRichard Fitzgerald struct cs_dsp_test *priv = test->priv;
326dd0b6b1fSRichard Fitzgerald const struct bin_test_param *param = test->param_value;
327dd0b6b1fSRichard Fitzgerald unsigned int reg_inc_per_word = cs_dsp_mock_reg_addr_inc_per_unpacked_word(priv);
328dd0b6b1fSRichard Fitzgerald static const u8 word_offsets[] = {
329dd0b6b1fSRichard Fitzgerald 11, 69, 59, 61, 32, 75, 4, 38, 70, 13, 79, 47, 46, 53, 18, 44,
330dd0b6b1fSRichard Fitzgerald 54, 35, 51, 21, 26, 45, 27, 41, 66, 2, 17, 56, 40, 9, 8, 20,
331dd0b6b1fSRichard Fitzgerald 29, 19, 63, 42, 12, 16, 43, 3, 5, 55, 52, 22
332dd0b6b1fSRichard Fitzgerald };
333dd0b6b1fSRichard Fitzgerald u32 payload_data[44];
334dd0b6b1fSRichard Fitzgerald unsigned int alg_base_words, reg_addr;
335dd0b6b1fSRichard Fitzgerald struct firmware *fw;
336dd0b6b1fSRichard Fitzgerald u32 reg_val;
337dd0b6b1fSRichard Fitzgerald int i;
338dd0b6b1fSRichard Fitzgerald
339dd0b6b1fSRichard Fitzgerald static_assert(ARRAY_SIZE(word_offsets) == ARRAY_SIZE(payload_data));
340dd0b6b1fSRichard Fitzgerald
341dd0b6b1fSRichard Fitzgerald get_random_bytes(&payload_data, sizeof(payload_data));
342dd0b6b1fSRichard Fitzgerald
343dd0b6b1fSRichard Fitzgerald alg_base_words = cs_dsp_mock_xm_header_get_alg_base_in_words(priv,
344dd0b6b1fSRichard Fitzgerald bin_test_mock_algs[param->alg_idx].id,
345dd0b6b1fSRichard Fitzgerald param->mem_type);
346dd0b6b1fSRichard Fitzgerald
347dd0b6b1fSRichard Fitzgerald /* Add one payload per word */
348dd0b6b1fSRichard Fitzgerald for (i = 0; i < ARRAY_SIZE(word_offsets); ++i) {
349dd0b6b1fSRichard Fitzgerald cs_dsp_mock_bin_add_patch(priv->local->bin_builder,
350dd0b6b1fSRichard Fitzgerald bin_test_mock_algs[param->alg_idx].id,
351dd0b6b1fSRichard Fitzgerald bin_test_mock_algs[param->alg_idx].ver,
352dd0b6b1fSRichard Fitzgerald param->mem_type,
353dd0b6b1fSRichard Fitzgerald word_offsets[i] * reg_inc_per_word,
354dd0b6b1fSRichard Fitzgerald &payload_data[i], sizeof(payload_data[i]));
355dd0b6b1fSRichard Fitzgerald }
356dd0b6b1fSRichard Fitzgerald
357dd0b6b1fSRichard Fitzgerald fw = cs_dsp_mock_bin_get_firmware(priv->local->bin_builder);
358dd0b6b1fSRichard Fitzgerald KUNIT_ASSERT_EQ(test,
359dd0b6b1fSRichard Fitzgerald cs_dsp_power_up(priv->dsp, priv->local->wmfw, "mock_wmfw",
360dd0b6b1fSRichard Fitzgerald fw, "mock_bin", "misc"),
361dd0b6b1fSRichard Fitzgerald 0);
362dd0b6b1fSRichard Fitzgerald
363dd0b6b1fSRichard Fitzgerald /* Content of registers should match payload_data */
364dd0b6b1fSRichard Fitzgerald for (i = 0; i < ARRAY_SIZE(word_offsets); ++i) {
365dd0b6b1fSRichard Fitzgerald reg_addr = cs_dsp_mock_base_addr_for_mem(priv, param->mem_type) +
366dd0b6b1fSRichard Fitzgerald ((alg_base_words + word_offsets[i]) * reg_inc_per_word);
367dd0b6b1fSRichard Fitzgerald reg_val = 0;
368dd0b6b1fSRichard Fitzgerald KUNIT_EXPECT_EQ(test,
369dd0b6b1fSRichard Fitzgerald regmap_raw_read(priv->dsp->regmap, reg_addr, ®_val,
370dd0b6b1fSRichard Fitzgerald sizeof(reg_val)),
371dd0b6b1fSRichard Fitzgerald 0);
372dd0b6b1fSRichard Fitzgerald KUNIT_EXPECT_MEMEQ(test, ®_val, &payload_data[i], sizeof(reg_val));
373dd0b6b1fSRichard Fitzgerald
374dd0b6b1fSRichard Fitzgerald /* Drop expected writes from the cache */
375dd0b6b1fSRichard Fitzgerald cs_dsp_mock_regmap_drop_range(priv, reg_addr, reg_addr + reg_inc_per_word - 1);
376dd0b6b1fSRichard Fitzgerald }
377dd0b6b1fSRichard Fitzgerald
378dd0b6b1fSRichard Fitzgerald /* Drop expected writes and the cache should then be clean */
379dd0b6b1fSRichard Fitzgerald cs_dsp_mock_xm_header_drop_from_regmap_cache(priv);
380dd0b6b1fSRichard Fitzgerald KUNIT_EXPECT_FALSE(test, cs_dsp_mock_regmap_is_dirty(priv, true));
381dd0b6b1fSRichard Fitzgerald }
382dd0b6b1fSRichard Fitzgerald
383dd0b6b1fSRichard Fitzgerald /*
384dd0b6b1fSRichard Fitzgerald * bin file that patches a single DSP word in each of the memory regions
385dd0b6b1fSRichard Fitzgerald * of one algorithm.
386dd0b6b1fSRichard Fitzgerald */
bin_patch_one_word_multiple_mems(struct kunit * test)387dd0b6b1fSRichard Fitzgerald static void bin_patch_one_word_multiple_mems(struct kunit *test)
388dd0b6b1fSRichard Fitzgerald {
389dd0b6b1fSRichard Fitzgerald struct cs_dsp_test *priv = test->priv;
390dd0b6b1fSRichard Fitzgerald const struct bin_test_param *param = test->param_value;
391dd0b6b1fSRichard Fitzgerald unsigned int reg_inc_per_word = cs_dsp_mock_reg_addr_inc_per_unpacked_word(priv);
392dd0b6b1fSRichard Fitzgerald unsigned int alg_xm_base_words, alg_ym_base_words, alg_zm_base_words;
393dd0b6b1fSRichard Fitzgerald unsigned int reg_addr;
394dd0b6b1fSRichard Fitzgerald u32 payload_data[3];
395dd0b6b1fSRichard Fitzgerald struct firmware *fw;
396dd0b6b1fSRichard Fitzgerald u32 reg_val;
397dd0b6b1fSRichard Fitzgerald
398dd0b6b1fSRichard Fitzgerald get_random_bytes(&payload_data, sizeof(payload_data));
399dd0b6b1fSRichard Fitzgerald
400dd0b6b1fSRichard Fitzgerald alg_xm_base_words = cs_dsp_mock_xm_header_get_alg_base_in_words(priv,
401dd0b6b1fSRichard Fitzgerald bin_test_mock_algs[param->alg_idx].id,
402dd0b6b1fSRichard Fitzgerald WMFW_ADSP2_XM);
403dd0b6b1fSRichard Fitzgerald alg_ym_base_words = cs_dsp_mock_xm_header_get_alg_base_in_words(priv,
404dd0b6b1fSRichard Fitzgerald bin_test_mock_algs[param->alg_idx].id,
405dd0b6b1fSRichard Fitzgerald WMFW_ADSP2_YM);
406dd0b6b1fSRichard Fitzgerald
407dd0b6b1fSRichard Fitzgerald if (cs_dsp_mock_has_zm(priv)) {
408dd0b6b1fSRichard Fitzgerald alg_zm_base_words = cs_dsp_mock_xm_header_get_alg_base_in_words(priv,
409dd0b6b1fSRichard Fitzgerald bin_test_mock_algs[param->alg_idx].id,
410dd0b6b1fSRichard Fitzgerald WMFW_ADSP2_ZM);
411dd0b6b1fSRichard Fitzgerald } else {
412dd0b6b1fSRichard Fitzgerald alg_zm_base_words = 0;
413dd0b6b1fSRichard Fitzgerald }
414dd0b6b1fSRichard Fitzgerald
415dd0b6b1fSRichard Fitzgerald /* Add words to XM, YM and ZM */
416dd0b6b1fSRichard Fitzgerald cs_dsp_mock_bin_add_patch(priv->local->bin_builder,
417dd0b6b1fSRichard Fitzgerald bin_test_mock_algs[param->alg_idx].id,
418dd0b6b1fSRichard Fitzgerald bin_test_mock_algs[param->alg_idx].ver,
419dd0b6b1fSRichard Fitzgerald WMFW_ADSP2_XM,
420dd0b6b1fSRichard Fitzgerald param->offset_words * reg_inc_per_word,
421dd0b6b1fSRichard Fitzgerald &payload_data[0], sizeof(payload_data[0]));
422dd0b6b1fSRichard Fitzgerald
423dd0b6b1fSRichard Fitzgerald cs_dsp_mock_bin_add_patch(priv->local->bin_builder,
424dd0b6b1fSRichard Fitzgerald bin_test_mock_algs[param->alg_idx].id,
425dd0b6b1fSRichard Fitzgerald bin_test_mock_algs[param->alg_idx].ver,
426dd0b6b1fSRichard Fitzgerald WMFW_ADSP2_YM,
427dd0b6b1fSRichard Fitzgerald param->offset_words * reg_inc_per_word,
428dd0b6b1fSRichard Fitzgerald &payload_data[1], sizeof(payload_data[1]));
429dd0b6b1fSRichard Fitzgerald
430dd0b6b1fSRichard Fitzgerald if (cs_dsp_mock_has_zm(priv)) {
431dd0b6b1fSRichard Fitzgerald cs_dsp_mock_bin_add_patch(priv->local->bin_builder,
432dd0b6b1fSRichard Fitzgerald bin_test_mock_algs[param->alg_idx].id,
433dd0b6b1fSRichard Fitzgerald bin_test_mock_algs[param->alg_idx].ver,
434dd0b6b1fSRichard Fitzgerald WMFW_ADSP2_ZM,
435dd0b6b1fSRichard Fitzgerald param->offset_words * reg_inc_per_word,
436dd0b6b1fSRichard Fitzgerald &payload_data[2], sizeof(payload_data[2]));
437dd0b6b1fSRichard Fitzgerald }
438dd0b6b1fSRichard Fitzgerald
439dd0b6b1fSRichard Fitzgerald fw = cs_dsp_mock_bin_get_firmware(priv->local->bin_builder);
440dd0b6b1fSRichard Fitzgerald KUNIT_ASSERT_EQ(test,
441dd0b6b1fSRichard Fitzgerald cs_dsp_power_up(priv->dsp, priv->local->wmfw, "mock_wmfw",
442dd0b6b1fSRichard Fitzgerald fw, "mock_bin", "misc"),
443dd0b6b1fSRichard Fitzgerald 0);
444dd0b6b1fSRichard Fitzgerald
445dd0b6b1fSRichard Fitzgerald /* Content of registers should match payload_data */
446dd0b6b1fSRichard Fitzgerald reg_addr = cs_dsp_mock_base_addr_for_mem(priv, WMFW_ADSP2_XM) +
447dd0b6b1fSRichard Fitzgerald ((alg_xm_base_words + param->offset_words) * reg_inc_per_word);
448dd0b6b1fSRichard Fitzgerald reg_val = 0;
449dd0b6b1fSRichard Fitzgerald KUNIT_EXPECT_EQ(test,
450dd0b6b1fSRichard Fitzgerald regmap_raw_read(priv->dsp->regmap, reg_addr, ®_val, sizeof(reg_val)),
451dd0b6b1fSRichard Fitzgerald 0);
452dd0b6b1fSRichard Fitzgerald KUNIT_EXPECT_EQ(test, reg_val, payload_data[0]);
453dd0b6b1fSRichard Fitzgerald
454dd0b6b1fSRichard Fitzgerald cs_dsp_mock_regmap_drop_range(priv, reg_addr, reg_addr + reg_inc_per_word - 1);
455dd0b6b1fSRichard Fitzgerald
456dd0b6b1fSRichard Fitzgerald reg_addr = cs_dsp_mock_base_addr_for_mem(priv, WMFW_ADSP2_YM) +
457dd0b6b1fSRichard Fitzgerald ((alg_ym_base_words + param->offset_words) * reg_inc_per_word);
458dd0b6b1fSRichard Fitzgerald reg_val = 0;
459dd0b6b1fSRichard Fitzgerald KUNIT_EXPECT_EQ(test,
460dd0b6b1fSRichard Fitzgerald regmap_raw_read(priv->dsp->regmap, reg_addr, ®_val, sizeof(reg_val)),
461dd0b6b1fSRichard Fitzgerald 0);
462dd0b6b1fSRichard Fitzgerald KUNIT_EXPECT_EQ(test, reg_val, payload_data[1]);
463dd0b6b1fSRichard Fitzgerald
464dd0b6b1fSRichard Fitzgerald cs_dsp_mock_regmap_drop_range(priv, reg_addr, reg_addr + reg_inc_per_word - 1);
465dd0b6b1fSRichard Fitzgerald
466dd0b6b1fSRichard Fitzgerald if (cs_dsp_mock_has_zm(priv)) {
467dd0b6b1fSRichard Fitzgerald reg_addr = cs_dsp_mock_base_addr_for_mem(priv, WMFW_ADSP2_ZM) +
468dd0b6b1fSRichard Fitzgerald ((alg_zm_base_words + param->offset_words) * reg_inc_per_word);
469dd0b6b1fSRichard Fitzgerald reg_val = 0;
470dd0b6b1fSRichard Fitzgerald KUNIT_EXPECT_EQ(test,
471dd0b6b1fSRichard Fitzgerald regmap_raw_read(priv->dsp->regmap, reg_addr, ®_val,
472dd0b6b1fSRichard Fitzgerald sizeof(reg_val)),
473dd0b6b1fSRichard Fitzgerald 0);
474dd0b6b1fSRichard Fitzgerald KUNIT_EXPECT_EQ(test, reg_val, payload_data[2]);
475dd0b6b1fSRichard Fitzgerald
476dd0b6b1fSRichard Fitzgerald /* Drop expected writes from the cache */
477dd0b6b1fSRichard Fitzgerald cs_dsp_mock_regmap_drop_range(priv, reg_addr, reg_addr + reg_inc_per_word - 1);
478dd0b6b1fSRichard Fitzgerald }
479dd0b6b1fSRichard Fitzgerald
480dd0b6b1fSRichard Fitzgerald /* Drop expected writes and the cache should then be clean */
481dd0b6b1fSRichard Fitzgerald cs_dsp_mock_xm_header_drop_from_regmap_cache(priv);
482dd0b6b1fSRichard Fitzgerald KUNIT_EXPECT_FALSE(test, cs_dsp_mock_regmap_is_dirty(priv, true));
483dd0b6b1fSRichard Fitzgerald }
484dd0b6b1fSRichard Fitzgerald
485dd0b6b1fSRichard Fitzgerald /*
486dd0b6b1fSRichard Fitzgerald * bin file that patches a single DSP word in multiple algorithms.
487dd0b6b1fSRichard Fitzgerald */
bin_patch_one_word_multiple_algs(struct kunit * test)488dd0b6b1fSRichard Fitzgerald static void bin_patch_one_word_multiple_algs(struct kunit *test)
489dd0b6b1fSRichard Fitzgerald {
490dd0b6b1fSRichard Fitzgerald struct cs_dsp_test *priv = test->priv;
491dd0b6b1fSRichard Fitzgerald const struct bin_test_param *param = test->param_value;
492dd0b6b1fSRichard Fitzgerald u32 payload_data[ARRAY_SIZE(bin_test_mock_algs)];
493dd0b6b1fSRichard Fitzgerald unsigned int alg_base_words;
494dd0b6b1fSRichard Fitzgerald unsigned int reg_inc_per_word, reg_addr;
495dd0b6b1fSRichard Fitzgerald struct firmware *fw;
496dd0b6b1fSRichard Fitzgerald u32 reg_val;
497dd0b6b1fSRichard Fitzgerald int i;
498dd0b6b1fSRichard Fitzgerald
499dd0b6b1fSRichard Fitzgerald get_random_bytes(&payload_data, sizeof(payload_data));
500dd0b6b1fSRichard Fitzgerald
501dd0b6b1fSRichard Fitzgerald /* Add one payload per algorithm */
502dd0b6b1fSRichard Fitzgerald for (i = 0; i < ARRAY_SIZE(bin_test_mock_algs); ++i) {
503dd0b6b1fSRichard Fitzgerald reg_inc_per_word = cs_dsp_mock_reg_addr_inc_per_unpacked_word(priv);
504dd0b6b1fSRichard Fitzgerald
505dd0b6b1fSRichard Fitzgerald cs_dsp_mock_bin_add_patch(priv->local->bin_builder,
506dd0b6b1fSRichard Fitzgerald bin_test_mock_algs[i].id,
507dd0b6b1fSRichard Fitzgerald bin_test_mock_algs[i].ver,
508dd0b6b1fSRichard Fitzgerald param->mem_type,
509dd0b6b1fSRichard Fitzgerald param->offset_words * reg_inc_per_word,
510dd0b6b1fSRichard Fitzgerald &payload_data[i], sizeof(payload_data[i]));
511dd0b6b1fSRichard Fitzgerald }
512dd0b6b1fSRichard Fitzgerald
513dd0b6b1fSRichard Fitzgerald fw = cs_dsp_mock_bin_get_firmware(priv->local->bin_builder);
514dd0b6b1fSRichard Fitzgerald KUNIT_ASSERT_EQ(test,
515dd0b6b1fSRichard Fitzgerald cs_dsp_power_up(priv->dsp, priv->local->wmfw, "mock_wmfw",
516dd0b6b1fSRichard Fitzgerald fw, "mock_bin", "misc"),
517dd0b6b1fSRichard Fitzgerald 0);
518dd0b6b1fSRichard Fitzgerald
519dd0b6b1fSRichard Fitzgerald /* Content of registers should match payload_data */
520dd0b6b1fSRichard Fitzgerald for (i = 0; i < ARRAY_SIZE(bin_test_mock_algs); ++i) {
521dd0b6b1fSRichard Fitzgerald alg_base_words = cs_dsp_mock_xm_header_get_alg_base_in_words(priv,
522dd0b6b1fSRichard Fitzgerald bin_test_mock_algs[i].id,
523dd0b6b1fSRichard Fitzgerald param->mem_type);
524dd0b6b1fSRichard Fitzgerald reg_inc_per_word = cs_dsp_mock_reg_addr_inc_per_unpacked_word(priv);
525dd0b6b1fSRichard Fitzgerald reg_addr = cs_dsp_mock_base_addr_for_mem(priv, param->mem_type) +
526dd0b6b1fSRichard Fitzgerald ((alg_base_words + param->offset_words) * reg_inc_per_word);
527dd0b6b1fSRichard Fitzgerald reg_val = 0;
528dd0b6b1fSRichard Fitzgerald KUNIT_EXPECT_EQ(test,
529dd0b6b1fSRichard Fitzgerald regmap_raw_read(priv->dsp->regmap, reg_addr, ®_val,
530dd0b6b1fSRichard Fitzgerald sizeof(reg_val)),
531dd0b6b1fSRichard Fitzgerald 0);
532dd0b6b1fSRichard Fitzgerald KUNIT_EXPECT_EQ(test, reg_val, payload_data[i]);
533dd0b6b1fSRichard Fitzgerald
534dd0b6b1fSRichard Fitzgerald /* Drop expected writes from the cache */
535dd0b6b1fSRichard Fitzgerald cs_dsp_mock_regmap_drop_range(priv, reg_addr, reg_addr + reg_inc_per_word - 1);
536dd0b6b1fSRichard Fitzgerald }
537dd0b6b1fSRichard Fitzgerald
538dd0b6b1fSRichard Fitzgerald /* Drop expected writes and the cache should then be clean */
539dd0b6b1fSRichard Fitzgerald cs_dsp_mock_xm_header_drop_from_regmap_cache(priv);
540dd0b6b1fSRichard Fitzgerald KUNIT_EXPECT_FALSE(test, cs_dsp_mock_regmap_is_dirty(priv, true));
541dd0b6b1fSRichard Fitzgerald }
542dd0b6b1fSRichard Fitzgerald
543dd0b6b1fSRichard Fitzgerald /*
544dd0b6b1fSRichard Fitzgerald * bin file that patches a single DSP word in multiple algorithms.
545dd0b6b1fSRichard Fitzgerald * The algorithms are not patched in the same order they appear in the XM header.
546dd0b6b1fSRichard Fitzgerald */
bin_patch_one_word_multiple_algs_unordered(struct kunit * test)547dd0b6b1fSRichard Fitzgerald static void bin_patch_one_word_multiple_algs_unordered(struct kunit *test)
548dd0b6b1fSRichard Fitzgerald {
549dd0b6b1fSRichard Fitzgerald struct cs_dsp_test *priv = test->priv;
550dd0b6b1fSRichard Fitzgerald const struct bin_test_param *param = test->param_value;
551dd0b6b1fSRichard Fitzgerald static const u8 alg_order[] = { 3, 0, 2, 1 };
552dd0b6b1fSRichard Fitzgerald u32 payload_data[ARRAY_SIZE(bin_test_mock_algs)];
553dd0b6b1fSRichard Fitzgerald unsigned int alg_base_words;
554dd0b6b1fSRichard Fitzgerald unsigned int reg_inc_per_word, reg_addr;
555dd0b6b1fSRichard Fitzgerald struct firmware *fw;
556dd0b6b1fSRichard Fitzgerald u32 reg_val;
557dd0b6b1fSRichard Fitzgerald int i, alg_idx;
558dd0b6b1fSRichard Fitzgerald
559dd0b6b1fSRichard Fitzgerald static_assert(ARRAY_SIZE(alg_order) == ARRAY_SIZE(bin_test_mock_algs));
560dd0b6b1fSRichard Fitzgerald
561dd0b6b1fSRichard Fitzgerald get_random_bytes(&payload_data, sizeof(payload_data));
562dd0b6b1fSRichard Fitzgerald
563dd0b6b1fSRichard Fitzgerald /* Add one payload per algorithm */
564dd0b6b1fSRichard Fitzgerald for (i = 0; i < ARRAY_SIZE(bin_test_mock_algs); ++i) {
565dd0b6b1fSRichard Fitzgerald alg_idx = alg_order[i];
566dd0b6b1fSRichard Fitzgerald reg_inc_per_word = cs_dsp_mock_reg_addr_inc_per_unpacked_word(priv);
567dd0b6b1fSRichard Fitzgerald
568dd0b6b1fSRichard Fitzgerald cs_dsp_mock_bin_add_patch(priv->local->bin_builder,
569dd0b6b1fSRichard Fitzgerald bin_test_mock_algs[alg_idx].id,
570dd0b6b1fSRichard Fitzgerald bin_test_mock_algs[alg_idx].ver,
571dd0b6b1fSRichard Fitzgerald param->mem_type,
572dd0b6b1fSRichard Fitzgerald param->offset_words * reg_inc_per_word,
573dd0b6b1fSRichard Fitzgerald &payload_data[i], sizeof(payload_data[i]));
574dd0b6b1fSRichard Fitzgerald }
575dd0b6b1fSRichard Fitzgerald
576dd0b6b1fSRichard Fitzgerald fw = cs_dsp_mock_bin_get_firmware(priv->local->bin_builder);
577dd0b6b1fSRichard Fitzgerald KUNIT_ASSERT_EQ(test,
578dd0b6b1fSRichard Fitzgerald cs_dsp_power_up(priv->dsp, priv->local->wmfw, "mock_wmfw",
579dd0b6b1fSRichard Fitzgerald fw, "mock_bin", "misc"),
580dd0b6b1fSRichard Fitzgerald 0);
581dd0b6b1fSRichard Fitzgerald
582dd0b6b1fSRichard Fitzgerald /* Content of registers should match payload_data */
583dd0b6b1fSRichard Fitzgerald for (i = 0; i < ARRAY_SIZE(bin_test_mock_algs); ++i) {
584dd0b6b1fSRichard Fitzgerald alg_idx = alg_order[i];
585dd0b6b1fSRichard Fitzgerald alg_base_words = cs_dsp_mock_xm_header_get_alg_base_in_words(priv,
586dd0b6b1fSRichard Fitzgerald bin_test_mock_algs[alg_idx].id,
587dd0b6b1fSRichard Fitzgerald param->mem_type);
588dd0b6b1fSRichard Fitzgerald reg_inc_per_word = cs_dsp_mock_reg_addr_inc_per_unpacked_word(priv);
589dd0b6b1fSRichard Fitzgerald reg_addr = cs_dsp_mock_base_addr_for_mem(priv, param->mem_type) +
590dd0b6b1fSRichard Fitzgerald ((alg_base_words + param->offset_words) * reg_inc_per_word);
591dd0b6b1fSRichard Fitzgerald reg_val = 0;
592dd0b6b1fSRichard Fitzgerald KUNIT_EXPECT_EQ(test,
593dd0b6b1fSRichard Fitzgerald regmap_raw_read(priv->dsp->regmap, reg_addr, ®_val,
594dd0b6b1fSRichard Fitzgerald sizeof(reg_val)),
595dd0b6b1fSRichard Fitzgerald 0);
596dd0b6b1fSRichard Fitzgerald KUNIT_EXPECT_EQ(test, reg_val, payload_data[i]);
597dd0b6b1fSRichard Fitzgerald
598dd0b6b1fSRichard Fitzgerald /* Drop expected writes from the cache */
599dd0b6b1fSRichard Fitzgerald cs_dsp_mock_regmap_drop_range(priv, reg_addr, reg_addr + reg_inc_per_word - 1);
600dd0b6b1fSRichard Fitzgerald }
601dd0b6b1fSRichard Fitzgerald
602dd0b6b1fSRichard Fitzgerald /* Drop expected writes and the cache should then be clean */
603dd0b6b1fSRichard Fitzgerald cs_dsp_mock_xm_header_drop_from_regmap_cache(priv);
604dd0b6b1fSRichard Fitzgerald KUNIT_EXPECT_FALSE(test, cs_dsp_mock_regmap_is_dirty(priv, true));
605dd0b6b1fSRichard Fitzgerald }
606dd0b6b1fSRichard Fitzgerald
607dd0b6b1fSRichard Fitzgerald /* bin file that patches a single packed block of DSP words */
bin_patch_1_packed(struct kunit * test)608dd0b6b1fSRichard Fitzgerald static void bin_patch_1_packed(struct kunit *test)
609dd0b6b1fSRichard Fitzgerald {
610dd0b6b1fSRichard Fitzgerald struct cs_dsp_test *priv = test->priv;
611dd0b6b1fSRichard Fitzgerald const struct bin_test_param *param = test->param_value;
612dd0b6b1fSRichard Fitzgerald u32 packed_payload[3], readback[3];
613dd0b6b1fSRichard Fitzgerald unsigned int alg_base_words, patch_pos_words;
614dd0b6b1fSRichard Fitzgerald unsigned int alg_base_in_packed_regs, patch_pos_in_packed_regs;
615dd0b6b1fSRichard Fitzgerald unsigned int reg_addr;
616dd0b6b1fSRichard Fitzgerald struct firmware *fw;
617dd0b6b1fSRichard Fitzgerald
618dd0b6b1fSRichard Fitzgerald static_assert(sizeof(readback) == sizeof(packed_payload));
619dd0b6b1fSRichard Fitzgerald
620dd0b6b1fSRichard Fitzgerald get_random_bytes(packed_payload, sizeof(packed_payload));
621dd0b6b1fSRichard Fitzgerald
622dd0b6b1fSRichard Fitzgerald alg_base_words = cs_dsp_mock_xm_header_get_alg_base_in_words(priv,
623dd0b6b1fSRichard Fitzgerald bin_test_mock_algs[param->alg_idx].id,
624dd0b6b1fSRichard Fitzgerald param->mem_type);
625dd0b6b1fSRichard Fitzgerald alg_base_in_packed_regs = _num_words_to_num_packed_regs(alg_base_words);
626dd0b6b1fSRichard Fitzgerald
627dd0b6b1fSRichard Fitzgerald /* Round patch start word up to a packed boundary */
628dd0b6b1fSRichard Fitzgerald patch_pos_words = round_up(alg_base_words + param->offset_words, 4);
629dd0b6b1fSRichard Fitzgerald patch_pos_in_packed_regs = _num_words_to_num_packed_regs(patch_pos_words);
630dd0b6b1fSRichard Fitzgerald
631dd0b6b1fSRichard Fitzgerald cs_dsp_mock_bin_add_patch(priv->local->bin_builder,
632dd0b6b1fSRichard Fitzgerald bin_test_mock_algs[param->alg_idx].id,
633dd0b6b1fSRichard Fitzgerald bin_test_mock_algs[param->alg_idx].ver,
634dd0b6b1fSRichard Fitzgerald param->mem_type,
635dd0b6b1fSRichard Fitzgerald (patch_pos_in_packed_regs - alg_base_in_packed_regs) * 4,
636dd0b6b1fSRichard Fitzgerald packed_payload, sizeof(packed_payload));
637dd0b6b1fSRichard Fitzgerald
638dd0b6b1fSRichard Fitzgerald fw = cs_dsp_mock_bin_get_firmware(priv->local->bin_builder);
639dd0b6b1fSRichard Fitzgerald KUNIT_ASSERT_EQ(test,
640dd0b6b1fSRichard Fitzgerald cs_dsp_power_up(priv->dsp, priv->local->wmfw, "mock_wmfw",
641dd0b6b1fSRichard Fitzgerald fw, "mock_bin", "misc"),
642dd0b6b1fSRichard Fitzgerald 0);
643dd0b6b1fSRichard Fitzgerald
644dd0b6b1fSRichard Fitzgerald /* Content of registers should match payload_data */
645dd0b6b1fSRichard Fitzgerald reg_addr = cs_dsp_mock_base_addr_for_mem(priv, param->mem_type) +
646dd0b6b1fSRichard Fitzgerald (patch_pos_in_packed_regs * 4);
647dd0b6b1fSRichard Fitzgerald memset(readback, 0, sizeof(readback));
648dd0b6b1fSRichard Fitzgerald KUNIT_EXPECT_EQ(test,
649dd0b6b1fSRichard Fitzgerald regmap_raw_read(priv->dsp->regmap, reg_addr, readback,
650dd0b6b1fSRichard Fitzgerald sizeof(readback)),
651dd0b6b1fSRichard Fitzgerald 0);
652dd0b6b1fSRichard Fitzgerald KUNIT_EXPECT_MEMEQ(test, readback, packed_payload, sizeof(packed_payload));
653dd0b6b1fSRichard Fitzgerald
654dd0b6b1fSRichard Fitzgerald /* Drop expected writes and the cache should then be clean */
655dd0b6b1fSRichard Fitzgerald cs_dsp_mock_xm_header_drop_from_regmap_cache(priv);
656dd0b6b1fSRichard Fitzgerald cs_dsp_mock_regmap_drop_bytes(priv, reg_addr, sizeof(packed_payload));
657dd0b6b1fSRichard Fitzgerald KUNIT_EXPECT_FALSE(test, cs_dsp_mock_regmap_is_dirty(priv, true));
658dd0b6b1fSRichard Fitzgerald }
659dd0b6b1fSRichard Fitzgerald
660dd0b6b1fSRichard Fitzgerald /*
661dd0b6b1fSRichard Fitzgerald * Patch data that is one word longer than a packed block using one
662dd0b6b1fSRichard Fitzgerald * packed block followed by one unpacked word.
663dd0b6b1fSRichard Fitzgerald */
bin_patch_1_packed_1_single_trailing(struct kunit * test)664dd0b6b1fSRichard Fitzgerald static void bin_patch_1_packed_1_single_trailing(struct kunit *test)
665dd0b6b1fSRichard Fitzgerald {
666dd0b6b1fSRichard Fitzgerald struct cs_dsp_test *priv = test->priv;
667dd0b6b1fSRichard Fitzgerald const struct bin_test_param *param = test->param_value;
668dd0b6b1fSRichard Fitzgerald unsigned int unpacked_mem_type = cs_dsp_mock_packed_to_unpacked_mem_type(param->mem_type);
669dd0b6b1fSRichard Fitzgerald u32 packed_payload[3], unpacked_payload[1], readback[3];
670dd0b6b1fSRichard Fitzgerald unsigned int alg_base_words, patch_pos_words;
671dd0b6b1fSRichard Fitzgerald unsigned int alg_base_in_packed_regs, patch_pos_in_packed_regs;
672dd0b6b1fSRichard Fitzgerald unsigned int reg_addr;
673dd0b6b1fSRichard Fitzgerald struct firmware *fw;
674dd0b6b1fSRichard Fitzgerald
675dd0b6b1fSRichard Fitzgerald static_assert(sizeof(readback) == sizeof(packed_payload));
676dd0b6b1fSRichard Fitzgerald static_assert(sizeof(readback) >= sizeof(unpacked_payload));
677dd0b6b1fSRichard Fitzgerald
678dd0b6b1fSRichard Fitzgerald get_random_bytes(packed_payload, sizeof(packed_payload));
679dd0b6b1fSRichard Fitzgerald get_random_bytes(unpacked_payload, sizeof(unpacked_payload));
680dd0b6b1fSRichard Fitzgerald
681dd0b6b1fSRichard Fitzgerald alg_base_words = cs_dsp_mock_xm_header_get_alg_base_in_words(priv,
682dd0b6b1fSRichard Fitzgerald bin_test_mock_algs[param->alg_idx].id,
683dd0b6b1fSRichard Fitzgerald param->mem_type);
684dd0b6b1fSRichard Fitzgerald alg_base_in_packed_regs = _num_words_to_num_packed_regs(alg_base_words);
685dd0b6b1fSRichard Fitzgerald
686dd0b6b1fSRichard Fitzgerald /* Round patch start word up to a packed boundary */
687dd0b6b1fSRichard Fitzgerald patch_pos_words = round_up(alg_base_words + param->offset_words, 4);
688dd0b6b1fSRichard Fitzgerald patch_pos_in_packed_regs = _num_words_to_num_packed_regs(patch_pos_words);
689dd0b6b1fSRichard Fitzgerald
690dd0b6b1fSRichard Fitzgerald /* Patch packed block */
691dd0b6b1fSRichard Fitzgerald cs_dsp_mock_bin_add_patch(priv->local->bin_builder,
692dd0b6b1fSRichard Fitzgerald bin_test_mock_algs[param->alg_idx].id,
693dd0b6b1fSRichard Fitzgerald bin_test_mock_algs[param->alg_idx].ver,
694dd0b6b1fSRichard Fitzgerald param->mem_type,
695dd0b6b1fSRichard Fitzgerald (patch_pos_in_packed_regs - alg_base_in_packed_regs) * 4,
696dd0b6b1fSRichard Fitzgerald &packed_payload, sizeof(packed_payload));
697dd0b6b1fSRichard Fitzgerald
698dd0b6b1fSRichard Fitzgerald /* ... and the unpacked word following that */
699dd0b6b1fSRichard Fitzgerald cs_dsp_mock_bin_add_patch(priv->local->bin_builder,
700dd0b6b1fSRichard Fitzgerald bin_test_mock_algs[param->alg_idx].id,
701dd0b6b1fSRichard Fitzgerald bin_test_mock_algs[param->alg_idx].ver,
702dd0b6b1fSRichard Fitzgerald unpacked_mem_type,
703dd0b6b1fSRichard Fitzgerald ((patch_pos_words + 4) - alg_base_words) * 4,
704dd0b6b1fSRichard Fitzgerald unpacked_payload, sizeof(unpacked_payload));
705dd0b6b1fSRichard Fitzgerald
706dd0b6b1fSRichard Fitzgerald fw = cs_dsp_mock_bin_get_firmware(priv->local->bin_builder);
707dd0b6b1fSRichard Fitzgerald KUNIT_ASSERT_EQ(test,
708dd0b6b1fSRichard Fitzgerald cs_dsp_power_up(priv->dsp, priv->local->wmfw, "mock_wmfw",
709dd0b6b1fSRichard Fitzgerald fw, "mock_bin", "misc"),
710dd0b6b1fSRichard Fitzgerald 0);
711dd0b6b1fSRichard Fitzgerald
712dd0b6b1fSRichard Fitzgerald /* Content of packed registers should match packed_payload */
713dd0b6b1fSRichard Fitzgerald reg_addr = cs_dsp_mock_base_addr_for_mem(priv, param->mem_type) +
714dd0b6b1fSRichard Fitzgerald (patch_pos_in_packed_regs * 4);
715dd0b6b1fSRichard Fitzgerald memset(readback, 0, sizeof(readback));
716dd0b6b1fSRichard Fitzgerald KUNIT_EXPECT_EQ(test,
717dd0b6b1fSRichard Fitzgerald regmap_raw_read(priv->dsp->regmap, reg_addr, &readback, sizeof(readback)),
718dd0b6b1fSRichard Fitzgerald 0);
719dd0b6b1fSRichard Fitzgerald KUNIT_EXPECT_MEMEQ(test, &readback, &packed_payload, sizeof(packed_payload));
720dd0b6b1fSRichard Fitzgerald
721dd0b6b1fSRichard Fitzgerald cs_dsp_mock_regmap_drop_bytes(priv, reg_addr, sizeof(packed_payload));
722dd0b6b1fSRichard Fitzgerald
723dd0b6b1fSRichard Fitzgerald /* Content of unpacked registers should match unpacked_payload */
724dd0b6b1fSRichard Fitzgerald reg_addr = cs_dsp_mock_base_addr_for_mem(priv, unpacked_mem_type) +
725dd0b6b1fSRichard Fitzgerald (patch_pos_words + 4) * 4;
726dd0b6b1fSRichard Fitzgerald memset(readback, 0, sizeof(readback));
727dd0b6b1fSRichard Fitzgerald KUNIT_EXPECT_EQ(test,
728dd0b6b1fSRichard Fitzgerald regmap_raw_read(priv->dsp->regmap, reg_addr, &readback,
729dd0b6b1fSRichard Fitzgerald sizeof(unpacked_payload)),
730dd0b6b1fSRichard Fitzgerald 0);
731dd0b6b1fSRichard Fitzgerald KUNIT_EXPECT_MEMEQ(test, &readback, unpacked_payload, sizeof(unpacked_payload));
732dd0b6b1fSRichard Fitzgerald
733dd0b6b1fSRichard Fitzgerald cs_dsp_mock_regmap_drop_bytes(priv, reg_addr, sizeof(unpacked_payload));
734dd0b6b1fSRichard Fitzgerald
735dd0b6b1fSRichard Fitzgerald /* Drop expected writes and the cache should then be clean */
736dd0b6b1fSRichard Fitzgerald cs_dsp_mock_xm_header_drop_from_regmap_cache(priv);
737dd0b6b1fSRichard Fitzgerald KUNIT_EXPECT_FALSE(test, cs_dsp_mock_regmap_is_dirty(priv, true));
738dd0b6b1fSRichard Fitzgerald }
739dd0b6b1fSRichard Fitzgerald
740dd0b6b1fSRichard Fitzgerald /*
741dd0b6b1fSRichard Fitzgerald * Patch data that is two words longer than a packed block using one
742dd0b6b1fSRichard Fitzgerald * packed block followed by two blocks of one unpacked word.
743dd0b6b1fSRichard Fitzgerald */
bin_patch_1_packed_2_single_trailing(struct kunit * test)744dd0b6b1fSRichard Fitzgerald static void bin_patch_1_packed_2_single_trailing(struct kunit *test)
745dd0b6b1fSRichard Fitzgerald {
746dd0b6b1fSRichard Fitzgerald struct cs_dsp_test *priv = test->priv;
747dd0b6b1fSRichard Fitzgerald const struct bin_test_param *param = test->param_value;
748dd0b6b1fSRichard Fitzgerald unsigned int unpacked_mem_type = cs_dsp_mock_packed_to_unpacked_mem_type(param->mem_type);
749dd0b6b1fSRichard Fitzgerald u32 packed_payload[3], unpacked_payloads[2], readback[3];
750dd0b6b1fSRichard Fitzgerald unsigned int alg_base_words, patch_pos_words;
751dd0b6b1fSRichard Fitzgerald unsigned int alg_base_in_packed_regs, patch_pos_in_packed_regs;
752dd0b6b1fSRichard Fitzgerald unsigned int reg_addr;
753dd0b6b1fSRichard Fitzgerald struct firmware *fw;
754dd0b6b1fSRichard Fitzgerald
755dd0b6b1fSRichard Fitzgerald static_assert(sizeof(readback) == sizeof(packed_payload));
756dd0b6b1fSRichard Fitzgerald static_assert(sizeof(readback) >= sizeof(unpacked_payloads));
757dd0b6b1fSRichard Fitzgerald
758dd0b6b1fSRichard Fitzgerald get_random_bytes(packed_payload, sizeof(packed_payload));
759dd0b6b1fSRichard Fitzgerald get_random_bytes(unpacked_payloads, sizeof(unpacked_payloads));
760dd0b6b1fSRichard Fitzgerald
761dd0b6b1fSRichard Fitzgerald alg_base_words = cs_dsp_mock_xm_header_get_alg_base_in_words(priv,
762dd0b6b1fSRichard Fitzgerald bin_test_mock_algs[param->alg_idx].id,
763dd0b6b1fSRichard Fitzgerald param->mem_type);
764dd0b6b1fSRichard Fitzgerald alg_base_in_packed_regs = _num_words_to_num_packed_regs(alg_base_words);
765dd0b6b1fSRichard Fitzgerald
766dd0b6b1fSRichard Fitzgerald /* Round patch start word up to a packed boundary */
767dd0b6b1fSRichard Fitzgerald patch_pos_words = round_up(alg_base_words + param->offset_words, 4);
768dd0b6b1fSRichard Fitzgerald patch_pos_in_packed_regs = _num_words_to_num_packed_regs(patch_pos_words);
769dd0b6b1fSRichard Fitzgerald
770dd0b6b1fSRichard Fitzgerald /* Patch packed block */
771dd0b6b1fSRichard Fitzgerald cs_dsp_mock_bin_add_patch(priv->local->bin_builder,
772dd0b6b1fSRichard Fitzgerald bin_test_mock_algs[param->alg_idx].id,
773dd0b6b1fSRichard Fitzgerald bin_test_mock_algs[param->alg_idx].ver,
774dd0b6b1fSRichard Fitzgerald param->mem_type,
775dd0b6b1fSRichard Fitzgerald (patch_pos_in_packed_regs - alg_base_in_packed_regs) * 4,
776dd0b6b1fSRichard Fitzgerald &packed_payload, sizeof(packed_payload));
777dd0b6b1fSRichard Fitzgerald
778dd0b6b1fSRichard Fitzgerald /* ... and the unpacked words following that */
779dd0b6b1fSRichard Fitzgerald cs_dsp_mock_bin_add_patch(priv->local->bin_builder,
780dd0b6b1fSRichard Fitzgerald bin_test_mock_algs[param->alg_idx].id,
781dd0b6b1fSRichard Fitzgerald bin_test_mock_algs[param->alg_idx].ver,
782dd0b6b1fSRichard Fitzgerald unpacked_mem_type,
783dd0b6b1fSRichard Fitzgerald ((patch_pos_words + 4) - alg_base_words) * 4,
784dd0b6b1fSRichard Fitzgerald &unpacked_payloads[0], sizeof(unpacked_payloads[0]));
785dd0b6b1fSRichard Fitzgerald
786dd0b6b1fSRichard Fitzgerald cs_dsp_mock_bin_add_patch(priv->local->bin_builder,
787dd0b6b1fSRichard Fitzgerald bin_test_mock_algs[param->alg_idx].id,
788dd0b6b1fSRichard Fitzgerald bin_test_mock_algs[param->alg_idx].ver,
789dd0b6b1fSRichard Fitzgerald unpacked_mem_type,
790dd0b6b1fSRichard Fitzgerald ((patch_pos_words + 5) - alg_base_words) * 4,
791dd0b6b1fSRichard Fitzgerald &unpacked_payloads[1], sizeof(unpacked_payloads[1]));
792dd0b6b1fSRichard Fitzgerald
793dd0b6b1fSRichard Fitzgerald fw = cs_dsp_mock_bin_get_firmware(priv->local->bin_builder);
794dd0b6b1fSRichard Fitzgerald KUNIT_ASSERT_EQ(test,
795dd0b6b1fSRichard Fitzgerald cs_dsp_power_up(priv->dsp, priv->local->wmfw, "mock_wmfw",
796dd0b6b1fSRichard Fitzgerald fw, "mock_bin", "misc"),
797dd0b6b1fSRichard Fitzgerald 0);
798dd0b6b1fSRichard Fitzgerald
799dd0b6b1fSRichard Fitzgerald /* Content of packed registers should match packed_payload */
800dd0b6b1fSRichard Fitzgerald reg_addr = cs_dsp_mock_base_addr_for_mem(priv, param->mem_type) +
801dd0b6b1fSRichard Fitzgerald (patch_pos_in_packed_regs * 4);
802dd0b6b1fSRichard Fitzgerald memset(readback, 0, sizeof(readback));
803dd0b6b1fSRichard Fitzgerald KUNIT_EXPECT_EQ(test,
804dd0b6b1fSRichard Fitzgerald regmap_raw_read(priv->dsp->regmap, reg_addr, &readback, sizeof(readback)),
805dd0b6b1fSRichard Fitzgerald 0);
806dd0b6b1fSRichard Fitzgerald KUNIT_EXPECT_MEMEQ(test, &readback, &packed_payload, sizeof(packed_payload));
807dd0b6b1fSRichard Fitzgerald
808dd0b6b1fSRichard Fitzgerald /* Drop expected writes from the cache */
809dd0b6b1fSRichard Fitzgerald cs_dsp_mock_regmap_drop_bytes(priv, reg_addr, sizeof(packed_payload));
810dd0b6b1fSRichard Fitzgerald
811dd0b6b1fSRichard Fitzgerald /* Content of unpacked registers should match unpacked_payloads */
812dd0b6b1fSRichard Fitzgerald reg_addr = cs_dsp_mock_base_addr_for_mem(priv, unpacked_mem_type) +
813dd0b6b1fSRichard Fitzgerald (patch_pos_words + 4) * 4;
814dd0b6b1fSRichard Fitzgerald memset(readback, 0, sizeof(readback));
815dd0b6b1fSRichard Fitzgerald KUNIT_EXPECT_EQ(test,
816dd0b6b1fSRichard Fitzgerald regmap_raw_read(priv->dsp->regmap, reg_addr, &readback,
817dd0b6b1fSRichard Fitzgerald sizeof(unpacked_payloads)),
818dd0b6b1fSRichard Fitzgerald 0);
819dd0b6b1fSRichard Fitzgerald KUNIT_EXPECT_MEMEQ(test, &readback, unpacked_payloads, sizeof(unpacked_payloads));
820dd0b6b1fSRichard Fitzgerald
821dd0b6b1fSRichard Fitzgerald /* Drop expected writes from the cache */
822dd0b6b1fSRichard Fitzgerald cs_dsp_mock_regmap_drop_bytes(priv, reg_addr, sizeof(unpacked_payloads));
823dd0b6b1fSRichard Fitzgerald
824dd0b6b1fSRichard Fitzgerald /* Drop expected writes and the cache should then be clean */
825dd0b6b1fSRichard Fitzgerald cs_dsp_mock_xm_header_drop_from_regmap_cache(priv);
826dd0b6b1fSRichard Fitzgerald KUNIT_EXPECT_FALSE(test, cs_dsp_mock_regmap_is_dirty(priv, true));
827dd0b6b1fSRichard Fitzgerald }
828dd0b6b1fSRichard Fitzgerald
829dd0b6b1fSRichard Fitzgerald /*
830dd0b6b1fSRichard Fitzgerald * Patch data that is three words longer than a packed block using one
831dd0b6b1fSRichard Fitzgerald * packed block followed by three blocks of one unpacked word.
832dd0b6b1fSRichard Fitzgerald */
bin_patch_1_packed_3_single_trailing(struct kunit * test)833dd0b6b1fSRichard Fitzgerald static void bin_patch_1_packed_3_single_trailing(struct kunit *test)
834dd0b6b1fSRichard Fitzgerald {
835dd0b6b1fSRichard Fitzgerald struct cs_dsp_test *priv = test->priv;
836dd0b6b1fSRichard Fitzgerald const struct bin_test_param *param = test->param_value;
837dd0b6b1fSRichard Fitzgerald unsigned int unpacked_mem_type = cs_dsp_mock_packed_to_unpacked_mem_type(param->mem_type);
838dd0b6b1fSRichard Fitzgerald u32 packed_payload[3], unpacked_payloads[3], readback[3];
839dd0b6b1fSRichard Fitzgerald unsigned int alg_base_words, patch_pos_words;
840dd0b6b1fSRichard Fitzgerald unsigned int alg_base_in_packed_regs, patch_pos_in_packed_regs;
841dd0b6b1fSRichard Fitzgerald unsigned int reg_addr;
842dd0b6b1fSRichard Fitzgerald struct firmware *fw;
843dd0b6b1fSRichard Fitzgerald
844dd0b6b1fSRichard Fitzgerald static_assert(sizeof(readback) == sizeof(packed_payload));
845dd0b6b1fSRichard Fitzgerald static_assert(sizeof(readback) >= sizeof(unpacked_payloads));
846dd0b6b1fSRichard Fitzgerald
847dd0b6b1fSRichard Fitzgerald get_random_bytes(packed_payload, sizeof(packed_payload));
848dd0b6b1fSRichard Fitzgerald get_random_bytes(unpacked_payloads, sizeof(unpacked_payloads));
849dd0b6b1fSRichard Fitzgerald
850dd0b6b1fSRichard Fitzgerald alg_base_words = cs_dsp_mock_xm_header_get_alg_base_in_words(priv,
851dd0b6b1fSRichard Fitzgerald bin_test_mock_algs[param->alg_idx].id,
852dd0b6b1fSRichard Fitzgerald param->mem_type);
853dd0b6b1fSRichard Fitzgerald alg_base_in_packed_regs = _num_words_to_num_packed_regs(alg_base_words);
854dd0b6b1fSRichard Fitzgerald
855dd0b6b1fSRichard Fitzgerald /* Round patch start word up to a packed boundary */
856dd0b6b1fSRichard Fitzgerald patch_pos_words = round_up(alg_base_words + param->offset_words, 4);
857dd0b6b1fSRichard Fitzgerald patch_pos_in_packed_regs = _num_words_to_num_packed_regs(patch_pos_words);
858dd0b6b1fSRichard Fitzgerald
859dd0b6b1fSRichard Fitzgerald /* Patch packed block */
860dd0b6b1fSRichard Fitzgerald cs_dsp_mock_bin_add_patch(priv->local->bin_builder,
861dd0b6b1fSRichard Fitzgerald bin_test_mock_algs[param->alg_idx].id,
862dd0b6b1fSRichard Fitzgerald bin_test_mock_algs[param->alg_idx].ver,
863dd0b6b1fSRichard Fitzgerald param->mem_type,
864dd0b6b1fSRichard Fitzgerald (patch_pos_in_packed_regs - alg_base_in_packed_regs) * 4,
865dd0b6b1fSRichard Fitzgerald &packed_payload, sizeof(packed_payload));
866dd0b6b1fSRichard Fitzgerald
867dd0b6b1fSRichard Fitzgerald /* ... and the unpacked words following that */
868dd0b6b1fSRichard Fitzgerald cs_dsp_mock_bin_add_patch(priv->local->bin_builder,
869dd0b6b1fSRichard Fitzgerald bin_test_mock_algs[param->alg_idx].id,
870dd0b6b1fSRichard Fitzgerald bin_test_mock_algs[param->alg_idx].ver,
871dd0b6b1fSRichard Fitzgerald unpacked_mem_type,
872dd0b6b1fSRichard Fitzgerald ((patch_pos_words + 4) - alg_base_words) * 4,
873dd0b6b1fSRichard Fitzgerald &unpacked_payloads[0], sizeof(unpacked_payloads[0]));
874dd0b6b1fSRichard Fitzgerald
875dd0b6b1fSRichard Fitzgerald cs_dsp_mock_bin_add_patch(priv->local->bin_builder,
876dd0b6b1fSRichard Fitzgerald bin_test_mock_algs[param->alg_idx].id,
877dd0b6b1fSRichard Fitzgerald bin_test_mock_algs[param->alg_idx].ver,
878dd0b6b1fSRichard Fitzgerald unpacked_mem_type,
879dd0b6b1fSRichard Fitzgerald ((patch_pos_words + 5) - alg_base_words) * 4,
880dd0b6b1fSRichard Fitzgerald &unpacked_payloads[1], sizeof(unpacked_payloads[1]));
881dd0b6b1fSRichard Fitzgerald
882dd0b6b1fSRichard Fitzgerald cs_dsp_mock_bin_add_patch(priv->local->bin_builder,
883dd0b6b1fSRichard Fitzgerald bin_test_mock_algs[param->alg_idx].id,
884dd0b6b1fSRichard Fitzgerald bin_test_mock_algs[param->alg_idx].ver,
885dd0b6b1fSRichard Fitzgerald unpacked_mem_type,
886dd0b6b1fSRichard Fitzgerald ((patch_pos_words + 6) - alg_base_words) * 4,
887dd0b6b1fSRichard Fitzgerald &unpacked_payloads[2], sizeof(unpacked_payloads[2]));
888dd0b6b1fSRichard Fitzgerald
889dd0b6b1fSRichard Fitzgerald fw = cs_dsp_mock_bin_get_firmware(priv->local->bin_builder);
890dd0b6b1fSRichard Fitzgerald KUNIT_ASSERT_EQ(test,
891dd0b6b1fSRichard Fitzgerald cs_dsp_power_up(priv->dsp, priv->local->wmfw, "mock_wmfw",
892dd0b6b1fSRichard Fitzgerald fw, "mock_bin", "misc"),
893dd0b6b1fSRichard Fitzgerald 0);
894dd0b6b1fSRichard Fitzgerald
895dd0b6b1fSRichard Fitzgerald /* Content of packed registers should match packed_payload */
896dd0b6b1fSRichard Fitzgerald reg_addr = cs_dsp_mock_base_addr_for_mem(priv, param->mem_type) +
897dd0b6b1fSRichard Fitzgerald (patch_pos_in_packed_regs * 4);
898dd0b6b1fSRichard Fitzgerald memset(readback, 0, sizeof(readback));
899dd0b6b1fSRichard Fitzgerald KUNIT_EXPECT_EQ(test,
900dd0b6b1fSRichard Fitzgerald regmap_raw_read(priv->dsp->regmap, reg_addr, &readback, sizeof(readback)),
901dd0b6b1fSRichard Fitzgerald 0);
902dd0b6b1fSRichard Fitzgerald KUNIT_EXPECT_MEMEQ(test, &readback, &packed_payload, sizeof(packed_payload));
903dd0b6b1fSRichard Fitzgerald
904dd0b6b1fSRichard Fitzgerald /* Drop expected writes from the cache */
905dd0b6b1fSRichard Fitzgerald cs_dsp_mock_regmap_drop_bytes(priv, reg_addr, sizeof(packed_payload));
906dd0b6b1fSRichard Fitzgerald
907dd0b6b1fSRichard Fitzgerald /* Content of unpacked registers should match unpacked_payloads */
908dd0b6b1fSRichard Fitzgerald reg_addr = cs_dsp_mock_base_addr_for_mem(priv, unpacked_mem_type) +
909dd0b6b1fSRichard Fitzgerald (patch_pos_words + 4) * 4;
910dd0b6b1fSRichard Fitzgerald memset(readback, 0, sizeof(readback));
911dd0b6b1fSRichard Fitzgerald KUNIT_EXPECT_EQ(test,
912dd0b6b1fSRichard Fitzgerald regmap_raw_read(priv->dsp->regmap, reg_addr, &readback,
913dd0b6b1fSRichard Fitzgerald sizeof(unpacked_payloads)),
914dd0b6b1fSRichard Fitzgerald 0);
915dd0b6b1fSRichard Fitzgerald KUNIT_EXPECT_MEMEQ(test, &readback, unpacked_payloads, sizeof(unpacked_payloads));
916dd0b6b1fSRichard Fitzgerald
917dd0b6b1fSRichard Fitzgerald /* Drop expected writes from the cache */
918dd0b6b1fSRichard Fitzgerald cs_dsp_mock_regmap_drop_bytes(priv, reg_addr, sizeof(unpacked_payloads));
919dd0b6b1fSRichard Fitzgerald
920dd0b6b1fSRichard Fitzgerald /* Drop expected writes and the cache should then be clean */
921dd0b6b1fSRichard Fitzgerald cs_dsp_mock_xm_header_drop_from_regmap_cache(priv);
922dd0b6b1fSRichard Fitzgerald KUNIT_EXPECT_FALSE(test, cs_dsp_mock_regmap_is_dirty(priv, true));
923dd0b6b1fSRichard Fitzgerald }
924dd0b6b1fSRichard Fitzgerald
925dd0b6b1fSRichard Fitzgerald /*
926dd0b6b1fSRichard Fitzgerald * Patch data that is two words longer than a packed block using one
927dd0b6b1fSRichard Fitzgerald * packed block followed by a block of two unpacked words.
928dd0b6b1fSRichard Fitzgerald */
bin_patch_1_packed_2_trailing(struct kunit * test)929dd0b6b1fSRichard Fitzgerald static void bin_patch_1_packed_2_trailing(struct kunit *test)
930dd0b6b1fSRichard Fitzgerald {
931dd0b6b1fSRichard Fitzgerald struct cs_dsp_test *priv = test->priv;
932dd0b6b1fSRichard Fitzgerald const struct bin_test_param *param = test->param_value;
933dd0b6b1fSRichard Fitzgerald unsigned int unpacked_mem_type = cs_dsp_mock_packed_to_unpacked_mem_type(param->mem_type);
934dd0b6b1fSRichard Fitzgerald u32 packed_payload[3], unpacked_payload[2], readback[3];
935dd0b6b1fSRichard Fitzgerald unsigned int alg_base_words, patch_pos_words;
936dd0b6b1fSRichard Fitzgerald unsigned int alg_base_in_packed_regs, patch_pos_in_packed_regs;
937dd0b6b1fSRichard Fitzgerald unsigned int reg_addr;
938dd0b6b1fSRichard Fitzgerald struct firmware *fw;
939dd0b6b1fSRichard Fitzgerald
940dd0b6b1fSRichard Fitzgerald static_assert(sizeof(readback) == sizeof(packed_payload));
941dd0b6b1fSRichard Fitzgerald static_assert(sizeof(readback) >= sizeof(unpacked_payload));
942dd0b6b1fSRichard Fitzgerald
943dd0b6b1fSRichard Fitzgerald get_random_bytes(packed_payload, sizeof(packed_payload));
944dd0b6b1fSRichard Fitzgerald get_random_bytes(unpacked_payload, sizeof(unpacked_payload));
945dd0b6b1fSRichard Fitzgerald
946dd0b6b1fSRichard Fitzgerald alg_base_words = cs_dsp_mock_xm_header_get_alg_base_in_words(priv,
947dd0b6b1fSRichard Fitzgerald bin_test_mock_algs[param->alg_idx].id,
948dd0b6b1fSRichard Fitzgerald param->mem_type);
949dd0b6b1fSRichard Fitzgerald alg_base_in_packed_regs = _num_words_to_num_packed_regs(alg_base_words);
950dd0b6b1fSRichard Fitzgerald
951dd0b6b1fSRichard Fitzgerald /* Round patch start word up to a packed boundary */
952dd0b6b1fSRichard Fitzgerald patch_pos_words = round_up(alg_base_words + param->offset_words, 4);
953dd0b6b1fSRichard Fitzgerald patch_pos_in_packed_regs = _num_words_to_num_packed_regs(patch_pos_words);
954dd0b6b1fSRichard Fitzgerald
955dd0b6b1fSRichard Fitzgerald /* Patch packed block */
956dd0b6b1fSRichard Fitzgerald cs_dsp_mock_bin_add_patch(priv->local->bin_builder,
957dd0b6b1fSRichard Fitzgerald bin_test_mock_algs[param->alg_idx].id,
958dd0b6b1fSRichard Fitzgerald bin_test_mock_algs[param->alg_idx].ver,
959dd0b6b1fSRichard Fitzgerald param->mem_type,
960dd0b6b1fSRichard Fitzgerald (patch_pos_in_packed_regs - alg_base_in_packed_regs) * 4,
961dd0b6b1fSRichard Fitzgerald &packed_payload, sizeof(packed_payload));
962dd0b6b1fSRichard Fitzgerald
963dd0b6b1fSRichard Fitzgerald /* ... and the unpacked words following that */
964dd0b6b1fSRichard Fitzgerald cs_dsp_mock_bin_add_patch(priv->local->bin_builder,
965dd0b6b1fSRichard Fitzgerald bin_test_mock_algs[param->alg_idx].id,
966dd0b6b1fSRichard Fitzgerald bin_test_mock_algs[param->alg_idx].ver,
967dd0b6b1fSRichard Fitzgerald unpacked_mem_type,
968dd0b6b1fSRichard Fitzgerald ((patch_pos_words + 4) - alg_base_words) * 4,
969dd0b6b1fSRichard Fitzgerald unpacked_payload, sizeof(unpacked_payload));
970dd0b6b1fSRichard Fitzgerald
971dd0b6b1fSRichard Fitzgerald fw = cs_dsp_mock_bin_get_firmware(priv->local->bin_builder);
972dd0b6b1fSRichard Fitzgerald KUNIT_ASSERT_EQ(test,
973dd0b6b1fSRichard Fitzgerald cs_dsp_power_up(priv->dsp, priv->local->wmfw, "mock_wmfw",
974dd0b6b1fSRichard Fitzgerald fw, "mock_bin", "misc"),
975dd0b6b1fSRichard Fitzgerald 0);
976dd0b6b1fSRichard Fitzgerald
977dd0b6b1fSRichard Fitzgerald /* Content of packed registers should match packed_payload */
978dd0b6b1fSRichard Fitzgerald reg_addr = cs_dsp_mock_base_addr_for_mem(priv, param->mem_type) +
979dd0b6b1fSRichard Fitzgerald (patch_pos_in_packed_regs * 4);
980dd0b6b1fSRichard Fitzgerald memset(readback, 0, sizeof(readback));
981dd0b6b1fSRichard Fitzgerald KUNIT_EXPECT_EQ(test,
982dd0b6b1fSRichard Fitzgerald regmap_raw_read(priv->dsp->regmap, reg_addr, &readback, sizeof(readback)),
983dd0b6b1fSRichard Fitzgerald 0);
984dd0b6b1fSRichard Fitzgerald KUNIT_EXPECT_MEMEQ(test, &readback, &packed_payload, sizeof(packed_payload));
985dd0b6b1fSRichard Fitzgerald
986dd0b6b1fSRichard Fitzgerald /* Drop expected writes from the cache */
987dd0b6b1fSRichard Fitzgerald cs_dsp_mock_regmap_drop_bytes(priv, reg_addr, sizeof(packed_payload));
988dd0b6b1fSRichard Fitzgerald
989dd0b6b1fSRichard Fitzgerald /* Content of unpacked registers should match unpacked_payload */
990dd0b6b1fSRichard Fitzgerald reg_addr = cs_dsp_mock_base_addr_for_mem(priv, unpacked_mem_type) +
991dd0b6b1fSRichard Fitzgerald (patch_pos_words + 4) * 4;
992dd0b6b1fSRichard Fitzgerald memset(readback, 0, sizeof(readback));
993dd0b6b1fSRichard Fitzgerald KUNIT_EXPECT_EQ(test,
994dd0b6b1fSRichard Fitzgerald regmap_raw_read(priv->dsp->regmap, reg_addr, &readback,
995dd0b6b1fSRichard Fitzgerald sizeof(unpacked_payload)),
996dd0b6b1fSRichard Fitzgerald 0);
997dd0b6b1fSRichard Fitzgerald KUNIT_EXPECT_MEMEQ(test, &readback, unpacked_payload, sizeof(unpacked_payload));
998dd0b6b1fSRichard Fitzgerald
999dd0b6b1fSRichard Fitzgerald /* Drop expected writes from the cache */
1000dd0b6b1fSRichard Fitzgerald cs_dsp_mock_regmap_drop_bytes(priv, reg_addr, sizeof(unpacked_payload));
1001dd0b6b1fSRichard Fitzgerald
1002dd0b6b1fSRichard Fitzgerald /* Drop expected writes and the cache should then be clean */
1003dd0b6b1fSRichard Fitzgerald cs_dsp_mock_xm_header_drop_from_regmap_cache(priv);
1004dd0b6b1fSRichard Fitzgerald KUNIT_EXPECT_FALSE(test, cs_dsp_mock_regmap_is_dirty(priv, true));
1005dd0b6b1fSRichard Fitzgerald }
1006dd0b6b1fSRichard Fitzgerald
1007dd0b6b1fSRichard Fitzgerald /*
1008dd0b6b1fSRichard Fitzgerald * Patch data that is three words longer than a packed block using one
1009dd0b6b1fSRichard Fitzgerald * packed block followed by a block of three unpacked words.
1010dd0b6b1fSRichard Fitzgerald */
bin_patch_1_packed_3_trailing(struct kunit * test)1011dd0b6b1fSRichard Fitzgerald static void bin_patch_1_packed_3_trailing(struct kunit *test)
1012dd0b6b1fSRichard Fitzgerald {
1013dd0b6b1fSRichard Fitzgerald struct cs_dsp_test *priv = test->priv;
1014dd0b6b1fSRichard Fitzgerald const struct bin_test_param *param = test->param_value;
1015dd0b6b1fSRichard Fitzgerald unsigned int unpacked_mem_type = cs_dsp_mock_packed_to_unpacked_mem_type(param->mem_type);
1016dd0b6b1fSRichard Fitzgerald u32 packed_payload[3], unpacked_payload[3], readback[3];
1017dd0b6b1fSRichard Fitzgerald unsigned int alg_base_words, patch_pos_words;
1018dd0b6b1fSRichard Fitzgerald unsigned int alg_base_in_packed_regs, patch_pos_in_packed_regs;
1019dd0b6b1fSRichard Fitzgerald unsigned int reg_addr;
1020dd0b6b1fSRichard Fitzgerald struct firmware *fw;
1021dd0b6b1fSRichard Fitzgerald
1022dd0b6b1fSRichard Fitzgerald static_assert(sizeof(readback) == sizeof(packed_payload));
1023dd0b6b1fSRichard Fitzgerald static_assert(sizeof(readback) >= sizeof(unpacked_payload));
1024dd0b6b1fSRichard Fitzgerald
1025dd0b6b1fSRichard Fitzgerald get_random_bytes(packed_payload, sizeof(packed_payload));
1026dd0b6b1fSRichard Fitzgerald get_random_bytes(unpacked_payload, sizeof(unpacked_payload));
1027dd0b6b1fSRichard Fitzgerald
1028dd0b6b1fSRichard Fitzgerald alg_base_words = cs_dsp_mock_xm_header_get_alg_base_in_words(priv,
1029dd0b6b1fSRichard Fitzgerald bin_test_mock_algs[param->alg_idx].id,
1030dd0b6b1fSRichard Fitzgerald param->mem_type);
1031dd0b6b1fSRichard Fitzgerald alg_base_in_packed_regs = _num_words_to_num_packed_regs(alg_base_words);
1032dd0b6b1fSRichard Fitzgerald
1033dd0b6b1fSRichard Fitzgerald /* Round patch start word up to a packed boundary */
1034dd0b6b1fSRichard Fitzgerald patch_pos_words = round_up(alg_base_words + param->offset_words, 4);
1035dd0b6b1fSRichard Fitzgerald patch_pos_in_packed_regs = _num_words_to_num_packed_regs(patch_pos_words);
1036dd0b6b1fSRichard Fitzgerald
1037dd0b6b1fSRichard Fitzgerald /* Patch packed block */
1038dd0b6b1fSRichard Fitzgerald cs_dsp_mock_bin_add_patch(priv->local->bin_builder,
1039dd0b6b1fSRichard Fitzgerald bin_test_mock_algs[param->alg_idx].id,
1040dd0b6b1fSRichard Fitzgerald bin_test_mock_algs[param->alg_idx].ver,
1041dd0b6b1fSRichard Fitzgerald param->mem_type,
1042dd0b6b1fSRichard Fitzgerald (patch_pos_in_packed_regs - alg_base_in_packed_regs) * 4,
1043dd0b6b1fSRichard Fitzgerald &packed_payload, sizeof(packed_payload));
1044dd0b6b1fSRichard Fitzgerald
1045dd0b6b1fSRichard Fitzgerald /* ... and the unpacked words following that */
1046dd0b6b1fSRichard Fitzgerald cs_dsp_mock_bin_add_patch(priv->local->bin_builder,
1047dd0b6b1fSRichard Fitzgerald bin_test_mock_algs[param->alg_idx].id,
1048dd0b6b1fSRichard Fitzgerald bin_test_mock_algs[param->alg_idx].ver,
1049dd0b6b1fSRichard Fitzgerald unpacked_mem_type,
1050dd0b6b1fSRichard Fitzgerald ((patch_pos_words + 4) - alg_base_words) * 4,
1051dd0b6b1fSRichard Fitzgerald unpacked_payload, sizeof(unpacked_payload));
1052dd0b6b1fSRichard Fitzgerald
1053dd0b6b1fSRichard Fitzgerald fw = cs_dsp_mock_bin_get_firmware(priv->local->bin_builder);
1054dd0b6b1fSRichard Fitzgerald KUNIT_ASSERT_EQ(test,
1055dd0b6b1fSRichard Fitzgerald cs_dsp_power_up(priv->dsp, priv->local->wmfw, "mock_wmfw",
1056dd0b6b1fSRichard Fitzgerald fw, "mock_bin", "misc"),
1057dd0b6b1fSRichard Fitzgerald 0);
1058dd0b6b1fSRichard Fitzgerald
1059dd0b6b1fSRichard Fitzgerald /* Content of packed registers should match packed_payload */
1060dd0b6b1fSRichard Fitzgerald reg_addr = cs_dsp_mock_base_addr_for_mem(priv, param->mem_type) +
1061dd0b6b1fSRichard Fitzgerald (patch_pos_in_packed_regs * 4);
1062dd0b6b1fSRichard Fitzgerald memset(readback, 0, sizeof(readback));
1063dd0b6b1fSRichard Fitzgerald KUNIT_EXPECT_EQ(test,
1064dd0b6b1fSRichard Fitzgerald regmap_raw_read(priv->dsp->regmap, reg_addr, &readback, sizeof(readback)),
1065dd0b6b1fSRichard Fitzgerald 0);
1066dd0b6b1fSRichard Fitzgerald KUNIT_EXPECT_MEMEQ(test, &readback, &packed_payload, sizeof(packed_payload));
1067dd0b6b1fSRichard Fitzgerald
1068dd0b6b1fSRichard Fitzgerald /* Drop expected writes from the cache */
1069dd0b6b1fSRichard Fitzgerald cs_dsp_mock_regmap_drop_bytes(priv, reg_addr, sizeof(packed_payload));
1070dd0b6b1fSRichard Fitzgerald
1071dd0b6b1fSRichard Fitzgerald /* Content of unpacked registers should match unpacked_payload */
1072dd0b6b1fSRichard Fitzgerald reg_addr = cs_dsp_mock_base_addr_for_mem(priv, unpacked_mem_type) +
1073dd0b6b1fSRichard Fitzgerald (patch_pos_words + 4) * 4;
1074dd0b6b1fSRichard Fitzgerald memset(readback, 0, sizeof(readback));
1075dd0b6b1fSRichard Fitzgerald KUNIT_EXPECT_EQ(test,
1076dd0b6b1fSRichard Fitzgerald regmap_raw_read(priv->dsp->regmap, reg_addr, &readback,
1077dd0b6b1fSRichard Fitzgerald sizeof(unpacked_payload)),
1078dd0b6b1fSRichard Fitzgerald 0);
1079dd0b6b1fSRichard Fitzgerald KUNIT_EXPECT_MEMEQ(test, &readback, unpacked_payload, sizeof(unpacked_payload));
1080dd0b6b1fSRichard Fitzgerald
1081dd0b6b1fSRichard Fitzgerald /* Drop expected writes from the cache */
1082dd0b6b1fSRichard Fitzgerald cs_dsp_mock_regmap_drop_bytes(priv, reg_addr, sizeof(unpacked_payload));
1083dd0b6b1fSRichard Fitzgerald
1084dd0b6b1fSRichard Fitzgerald /* Drop expected writes and the cache should then be clean */
1085dd0b6b1fSRichard Fitzgerald cs_dsp_mock_xm_header_drop_from_regmap_cache(priv);
1086dd0b6b1fSRichard Fitzgerald KUNIT_EXPECT_FALSE(test, cs_dsp_mock_regmap_is_dirty(priv, true));
1087dd0b6b1fSRichard Fitzgerald }
1088dd0b6b1fSRichard Fitzgerald
1089dd0b6b1fSRichard Fitzgerald /*
1090dd0b6b1fSRichard Fitzgerald * Patch data that starts one word before a packed boundary using one
1091dd0b6b1fSRichard Fitzgerald * unpacked word followed by one packed block.
1092dd0b6b1fSRichard Fitzgerald */
bin_patch_1_single_leading_1_packed(struct kunit * test)1093dd0b6b1fSRichard Fitzgerald static void bin_patch_1_single_leading_1_packed(struct kunit *test)
1094dd0b6b1fSRichard Fitzgerald {
1095dd0b6b1fSRichard Fitzgerald struct cs_dsp_test *priv = test->priv;
1096dd0b6b1fSRichard Fitzgerald const struct bin_test_param *param = test->param_value;
1097dd0b6b1fSRichard Fitzgerald unsigned int unpacked_mem_type = cs_dsp_mock_packed_to_unpacked_mem_type(param->mem_type);
1098dd0b6b1fSRichard Fitzgerald u32 packed_payload[3], unpacked_payload[1], readback[3];
1099dd0b6b1fSRichard Fitzgerald unsigned int alg_base_words, packed_patch_pos_words;
1100dd0b6b1fSRichard Fitzgerald unsigned int alg_base_in_packed_regs, patch_pos_in_packed_regs;
1101dd0b6b1fSRichard Fitzgerald unsigned int reg_addr;
1102dd0b6b1fSRichard Fitzgerald struct firmware *fw;
1103dd0b6b1fSRichard Fitzgerald
1104dd0b6b1fSRichard Fitzgerald static_assert(sizeof(readback) == sizeof(packed_payload));
1105dd0b6b1fSRichard Fitzgerald static_assert(sizeof(readback) >= sizeof(unpacked_payload));
1106dd0b6b1fSRichard Fitzgerald
1107dd0b6b1fSRichard Fitzgerald get_random_bytes(packed_payload, sizeof(packed_payload));
1108dd0b6b1fSRichard Fitzgerald get_random_bytes(unpacked_payload, sizeof(unpacked_payload));
1109dd0b6b1fSRichard Fitzgerald memset(readback, 0, sizeof(readback));
1110dd0b6b1fSRichard Fitzgerald
1111dd0b6b1fSRichard Fitzgerald alg_base_words = cs_dsp_mock_xm_header_get_alg_base_in_words(priv,
1112dd0b6b1fSRichard Fitzgerald bin_test_mock_algs[param->alg_idx].id,
1113dd0b6b1fSRichard Fitzgerald param->mem_type);
1114dd0b6b1fSRichard Fitzgerald alg_base_in_packed_regs = _num_words_to_num_packed_regs(alg_base_words);
1115dd0b6b1fSRichard Fitzgerald
1116dd0b6b1fSRichard Fitzgerald /* Round packed start word up to a packed boundary and move to the next boundary */
1117dd0b6b1fSRichard Fitzgerald packed_patch_pos_words = round_up(alg_base_words + param->offset_words, 4) + 4;
1118dd0b6b1fSRichard Fitzgerald
1119dd0b6b1fSRichard Fitzgerald /* Patch the leading unpacked word */
1120dd0b6b1fSRichard Fitzgerald cs_dsp_mock_bin_add_patch(priv->local->bin_builder,
1121dd0b6b1fSRichard Fitzgerald bin_test_mock_algs[param->alg_idx].id,
1122dd0b6b1fSRichard Fitzgerald bin_test_mock_algs[param->alg_idx].ver,
1123dd0b6b1fSRichard Fitzgerald unpacked_mem_type,
1124dd0b6b1fSRichard Fitzgerald ((packed_patch_pos_words - 1) - alg_base_words) * 4,
1125dd0b6b1fSRichard Fitzgerald unpacked_payload, sizeof(unpacked_payload));
1126dd0b6b1fSRichard Fitzgerald /* ... then the packed block */
1127dd0b6b1fSRichard Fitzgerald patch_pos_in_packed_regs = _num_words_to_num_packed_regs(packed_patch_pos_words);
1128dd0b6b1fSRichard Fitzgerald cs_dsp_mock_bin_add_patch(priv->local->bin_builder,
1129dd0b6b1fSRichard Fitzgerald bin_test_mock_algs[param->alg_idx].id,
1130dd0b6b1fSRichard Fitzgerald bin_test_mock_algs[param->alg_idx].ver,
1131dd0b6b1fSRichard Fitzgerald param->mem_type,
1132dd0b6b1fSRichard Fitzgerald (patch_pos_in_packed_regs - alg_base_in_packed_regs) * 4,
1133dd0b6b1fSRichard Fitzgerald &packed_payload, sizeof(packed_payload));
1134dd0b6b1fSRichard Fitzgerald
1135dd0b6b1fSRichard Fitzgerald fw = cs_dsp_mock_bin_get_firmware(priv->local->bin_builder);
1136dd0b6b1fSRichard Fitzgerald KUNIT_ASSERT_EQ(test,
1137dd0b6b1fSRichard Fitzgerald cs_dsp_power_up(priv->dsp, priv->local->wmfw, "mock_wmfw",
1138dd0b6b1fSRichard Fitzgerald fw, "mock_bin", "misc"),
1139dd0b6b1fSRichard Fitzgerald 0);
1140dd0b6b1fSRichard Fitzgerald
1141dd0b6b1fSRichard Fitzgerald /* Content of packed registers should match packed_payload */
1142dd0b6b1fSRichard Fitzgerald reg_addr = cs_dsp_mock_base_addr_for_mem(priv, param->mem_type) +
1143dd0b6b1fSRichard Fitzgerald (patch_pos_in_packed_regs * 4);
1144dd0b6b1fSRichard Fitzgerald KUNIT_EXPECT_EQ(test,
1145dd0b6b1fSRichard Fitzgerald regmap_raw_read(priv->dsp->regmap, reg_addr, &readback, sizeof(readback)),
1146dd0b6b1fSRichard Fitzgerald 0);
1147dd0b6b1fSRichard Fitzgerald KUNIT_EXPECT_MEMEQ(test, &readback, &packed_payload, sizeof(packed_payload));
1148dd0b6b1fSRichard Fitzgerald
1149dd0b6b1fSRichard Fitzgerald /* Drop expected writes from the cache */
1150dd0b6b1fSRichard Fitzgerald cs_dsp_mock_regmap_drop_bytes(priv, reg_addr, sizeof(packed_payload));
1151dd0b6b1fSRichard Fitzgerald
1152dd0b6b1fSRichard Fitzgerald /* Content of unpacked registers should match unpacked_payload */
1153dd0b6b1fSRichard Fitzgerald reg_addr = cs_dsp_mock_base_addr_for_mem(priv, unpacked_mem_type) +
1154dd0b6b1fSRichard Fitzgerald (packed_patch_pos_words - 1) * 4;
1155dd0b6b1fSRichard Fitzgerald KUNIT_EXPECT_EQ(test,
1156dd0b6b1fSRichard Fitzgerald regmap_raw_read(priv->dsp->regmap, reg_addr, &readback,
1157dd0b6b1fSRichard Fitzgerald sizeof(unpacked_payload)),
1158dd0b6b1fSRichard Fitzgerald 0);
1159dd0b6b1fSRichard Fitzgerald KUNIT_EXPECT_MEMEQ(test, &readback, unpacked_payload, sizeof(unpacked_payload));
1160dd0b6b1fSRichard Fitzgerald
1161dd0b6b1fSRichard Fitzgerald /* Drop expected writes from the cache */
1162dd0b6b1fSRichard Fitzgerald cs_dsp_mock_regmap_drop_bytes(priv, reg_addr, sizeof(unpacked_payload));
1163dd0b6b1fSRichard Fitzgerald
1164dd0b6b1fSRichard Fitzgerald /* Drop expected writes and the cache should then be clean */
1165dd0b6b1fSRichard Fitzgerald cs_dsp_mock_xm_header_drop_from_regmap_cache(priv);
1166dd0b6b1fSRichard Fitzgerald KUNIT_EXPECT_FALSE(test, cs_dsp_mock_regmap_is_dirty(priv, true));
1167dd0b6b1fSRichard Fitzgerald }
1168dd0b6b1fSRichard Fitzgerald
1169dd0b6b1fSRichard Fitzgerald /*
1170dd0b6b1fSRichard Fitzgerald * Patch data that starts two words before a packed boundary using two
1171dd0b6b1fSRichard Fitzgerald * unpacked words followed by one packed block.
1172dd0b6b1fSRichard Fitzgerald */
bin_patch_2_single_leading_1_packed(struct kunit * test)1173dd0b6b1fSRichard Fitzgerald static void bin_patch_2_single_leading_1_packed(struct kunit *test)
1174dd0b6b1fSRichard Fitzgerald {
1175dd0b6b1fSRichard Fitzgerald struct cs_dsp_test *priv = test->priv;
1176dd0b6b1fSRichard Fitzgerald const struct bin_test_param *param = test->param_value;
1177dd0b6b1fSRichard Fitzgerald unsigned int unpacked_mem_type = cs_dsp_mock_packed_to_unpacked_mem_type(param->mem_type);
1178dd0b6b1fSRichard Fitzgerald u32 packed_payload[3], unpacked_payload[2], readback[3];
1179dd0b6b1fSRichard Fitzgerald unsigned int alg_base_words, packed_patch_pos_words;
1180dd0b6b1fSRichard Fitzgerald unsigned int alg_base_in_packed_regs, patch_pos_in_packed_regs;
1181dd0b6b1fSRichard Fitzgerald unsigned int reg_addr;
1182dd0b6b1fSRichard Fitzgerald struct firmware *fw;
1183dd0b6b1fSRichard Fitzgerald
1184dd0b6b1fSRichard Fitzgerald static_assert(sizeof(readback) == sizeof(packed_payload));
1185dd0b6b1fSRichard Fitzgerald static_assert(sizeof(readback) >= sizeof(unpacked_payload));
1186dd0b6b1fSRichard Fitzgerald
1187dd0b6b1fSRichard Fitzgerald get_random_bytes(packed_payload, sizeof(packed_payload));
1188dd0b6b1fSRichard Fitzgerald get_random_bytes(unpacked_payload, sizeof(unpacked_payload));
1189dd0b6b1fSRichard Fitzgerald
1190dd0b6b1fSRichard Fitzgerald alg_base_words = cs_dsp_mock_xm_header_get_alg_base_in_words(priv,
1191dd0b6b1fSRichard Fitzgerald bin_test_mock_algs[param->alg_idx].id,
1192dd0b6b1fSRichard Fitzgerald param->mem_type);
1193dd0b6b1fSRichard Fitzgerald alg_base_in_packed_regs = _num_words_to_num_packed_regs(alg_base_words);
1194dd0b6b1fSRichard Fitzgerald
1195dd0b6b1fSRichard Fitzgerald /* Round packed start word up to a packed boundary and move to the next boundary */
1196dd0b6b1fSRichard Fitzgerald packed_patch_pos_words = round_up(alg_base_words + param->offset_words, 4) + 4;
1197dd0b6b1fSRichard Fitzgerald
1198dd0b6b1fSRichard Fitzgerald /* Patch the leading unpacked words */
1199dd0b6b1fSRichard Fitzgerald cs_dsp_mock_bin_add_patch(priv->local->bin_builder,
1200dd0b6b1fSRichard Fitzgerald bin_test_mock_algs[param->alg_idx].id,
1201dd0b6b1fSRichard Fitzgerald bin_test_mock_algs[param->alg_idx].ver,
1202dd0b6b1fSRichard Fitzgerald unpacked_mem_type,
1203dd0b6b1fSRichard Fitzgerald ((packed_patch_pos_words - 2) - alg_base_words) * 4,
1204dd0b6b1fSRichard Fitzgerald &unpacked_payload[0], sizeof(unpacked_payload[0]));
1205dd0b6b1fSRichard Fitzgerald cs_dsp_mock_bin_add_patch(priv->local->bin_builder,
1206dd0b6b1fSRichard Fitzgerald bin_test_mock_algs[param->alg_idx].id,
1207dd0b6b1fSRichard Fitzgerald bin_test_mock_algs[param->alg_idx].ver,
1208dd0b6b1fSRichard Fitzgerald unpacked_mem_type,
1209dd0b6b1fSRichard Fitzgerald ((packed_patch_pos_words - 1) - alg_base_words) * 4,
1210dd0b6b1fSRichard Fitzgerald &unpacked_payload[1], sizeof(unpacked_payload[1]));
1211dd0b6b1fSRichard Fitzgerald /* ... then the packed block */
1212dd0b6b1fSRichard Fitzgerald patch_pos_in_packed_regs = _num_words_to_num_packed_regs(packed_patch_pos_words);
1213dd0b6b1fSRichard Fitzgerald cs_dsp_mock_bin_add_patch(priv->local->bin_builder,
1214dd0b6b1fSRichard Fitzgerald bin_test_mock_algs[param->alg_idx].id,
1215dd0b6b1fSRichard Fitzgerald bin_test_mock_algs[param->alg_idx].ver,
1216dd0b6b1fSRichard Fitzgerald param->mem_type,
1217dd0b6b1fSRichard Fitzgerald (patch_pos_in_packed_regs - alg_base_in_packed_regs) * 4,
1218dd0b6b1fSRichard Fitzgerald &packed_payload, sizeof(packed_payload));
1219dd0b6b1fSRichard Fitzgerald
1220dd0b6b1fSRichard Fitzgerald fw = cs_dsp_mock_bin_get_firmware(priv->local->bin_builder);
1221dd0b6b1fSRichard Fitzgerald KUNIT_ASSERT_EQ(test,
1222dd0b6b1fSRichard Fitzgerald cs_dsp_power_up(priv->dsp, priv->local->wmfw, "mock_wmfw",
1223dd0b6b1fSRichard Fitzgerald fw, "mock_bin", "misc"),
1224dd0b6b1fSRichard Fitzgerald 0);
1225dd0b6b1fSRichard Fitzgerald
1226dd0b6b1fSRichard Fitzgerald /* Content of packed registers should match packed_payload */
1227dd0b6b1fSRichard Fitzgerald reg_addr = cs_dsp_mock_base_addr_for_mem(priv, param->mem_type) +
1228dd0b6b1fSRichard Fitzgerald (patch_pos_in_packed_regs * 4);
1229dd0b6b1fSRichard Fitzgerald memset(readback, 0, sizeof(readback));
1230dd0b6b1fSRichard Fitzgerald KUNIT_EXPECT_EQ(test,
1231dd0b6b1fSRichard Fitzgerald regmap_raw_read(priv->dsp->regmap, reg_addr, &readback, sizeof(readback)),
1232dd0b6b1fSRichard Fitzgerald 0);
1233dd0b6b1fSRichard Fitzgerald KUNIT_EXPECT_MEMEQ(test, &readback, &packed_payload, sizeof(packed_payload));
1234dd0b6b1fSRichard Fitzgerald
1235dd0b6b1fSRichard Fitzgerald /* Drop expected writes from the cache */
1236dd0b6b1fSRichard Fitzgerald cs_dsp_mock_regmap_drop_bytes(priv, reg_addr, sizeof(packed_payload));
1237dd0b6b1fSRichard Fitzgerald
1238dd0b6b1fSRichard Fitzgerald /* Content of unpacked registers should match unpacked_payload */
1239dd0b6b1fSRichard Fitzgerald reg_addr = cs_dsp_mock_base_addr_for_mem(priv, unpacked_mem_type) +
1240dd0b6b1fSRichard Fitzgerald (packed_patch_pos_words - 2) * 4;
1241dd0b6b1fSRichard Fitzgerald memset(readback, 0, sizeof(readback));
1242dd0b6b1fSRichard Fitzgerald KUNIT_EXPECT_EQ(test,
1243dd0b6b1fSRichard Fitzgerald regmap_raw_read(priv->dsp->regmap, reg_addr, &readback,
1244dd0b6b1fSRichard Fitzgerald sizeof(unpacked_payload)),
1245dd0b6b1fSRichard Fitzgerald 0);
1246dd0b6b1fSRichard Fitzgerald KUNIT_EXPECT_MEMEQ(test, &readback, unpacked_payload, sizeof(unpacked_payload));
1247dd0b6b1fSRichard Fitzgerald
1248dd0b6b1fSRichard Fitzgerald /* Drop expected writes from the cache */
1249dd0b6b1fSRichard Fitzgerald cs_dsp_mock_regmap_drop_bytes(priv, reg_addr, sizeof(unpacked_payload));
1250dd0b6b1fSRichard Fitzgerald
1251dd0b6b1fSRichard Fitzgerald /* Drop expected writes and the cache should then be clean */
1252dd0b6b1fSRichard Fitzgerald cs_dsp_mock_xm_header_drop_from_regmap_cache(priv);
1253dd0b6b1fSRichard Fitzgerald KUNIT_EXPECT_FALSE(test, cs_dsp_mock_regmap_is_dirty(priv, true));
1254dd0b6b1fSRichard Fitzgerald }
1255dd0b6b1fSRichard Fitzgerald
1256dd0b6b1fSRichard Fitzgerald /*
1257dd0b6b1fSRichard Fitzgerald * Patch data that starts two words before a packed boundary using one
1258dd0b6b1fSRichard Fitzgerald * block of two unpacked words followed by one packed block.
1259dd0b6b1fSRichard Fitzgerald */
bin_patch_2_leading_1_packed(struct kunit * test)1260dd0b6b1fSRichard Fitzgerald static void bin_patch_2_leading_1_packed(struct kunit *test)
1261dd0b6b1fSRichard Fitzgerald {
1262dd0b6b1fSRichard Fitzgerald struct cs_dsp_test *priv = test->priv;
1263dd0b6b1fSRichard Fitzgerald const struct bin_test_param *param = test->param_value;
1264dd0b6b1fSRichard Fitzgerald unsigned int unpacked_mem_type = cs_dsp_mock_packed_to_unpacked_mem_type(param->mem_type);
1265dd0b6b1fSRichard Fitzgerald u32 packed_payload[3], unpacked_payload[2], readback[3];
1266dd0b6b1fSRichard Fitzgerald unsigned int alg_base_words, packed_patch_pos_words;
1267dd0b6b1fSRichard Fitzgerald unsigned int alg_base_in_packed_regs, patch_pos_in_packed_regs;
1268dd0b6b1fSRichard Fitzgerald unsigned int reg_addr;
1269dd0b6b1fSRichard Fitzgerald struct firmware *fw;
1270dd0b6b1fSRichard Fitzgerald
1271dd0b6b1fSRichard Fitzgerald static_assert(sizeof(readback) == sizeof(packed_payload));
1272dd0b6b1fSRichard Fitzgerald static_assert(sizeof(readback) >= sizeof(unpacked_payload));
1273dd0b6b1fSRichard Fitzgerald
1274dd0b6b1fSRichard Fitzgerald get_random_bytes(packed_payload, sizeof(packed_payload));
1275dd0b6b1fSRichard Fitzgerald get_random_bytes(unpacked_payload, sizeof(unpacked_payload));
1276dd0b6b1fSRichard Fitzgerald
1277dd0b6b1fSRichard Fitzgerald alg_base_words = cs_dsp_mock_xm_header_get_alg_base_in_words(priv,
1278dd0b6b1fSRichard Fitzgerald bin_test_mock_algs[param->alg_idx].id,
1279dd0b6b1fSRichard Fitzgerald param->mem_type);
1280dd0b6b1fSRichard Fitzgerald alg_base_in_packed_regs = _num_words_to_num_packed_regs(alg_base_words);
1281dd0b6b1fSRichard Fitzgerald
1282dd0b6b1fSRichard Fitzgerald /* Round packed start word up to a packed boundary and move to the next boundary */
1283dd0b6b1fSRichard Fitzgerald packed_patch_pos_words = round_up(alg_base_words + param->offset_words, 4) + 4;
1284dd0b6b1fSRichard Fitzgerald
1285dd0b6b1fSRichard Fitzgerald /* Patch the leading unpacked words */
1286dd0b6b1fSRichard Fitzgerald cs_dsp_mock_bin_add_patch(priv->local->bin_builder,
1287dd0b6b1fSRichard Fitzgerald bin_test_mock_algs[param->alg_idx].id,
1288dd0b6b1fSRichard Fitzgerald bin_test_mock_algs[param->alg_idx].ver,
1289dd0b6b1fSRichard Fitzgerald unpacked_mem_type,
1290dd0b6b1fSRichard Fitzgerald ((packed_patch_pos_words - 2) - alg_base_words) * 4,
1291dd0b6b1fSRichard Fitzgerald unpacked_payload, sizeof(unpacked_payload));
1292dd0b6b1fSRichard Fitzgerald /* ... then the packed block */
1293dd0b6b1fSRichard Fitzgerald patch_pos_in_packed_regs = _num_words_to_num_packed_regs(packed_patch_pos_words);
1294dd0b6b1fSRichard Fitzgerald cs_dsp_mock_bin_add_patch(priv->local->bin_builder,
1295dd0b6b1fSRichard Fitzgerald bin_test_mock_algs[param->alg_idx].id,
1296dd0b6b1fSRichard Fitzgerald bin_test_mock_algs[param->alg_idx].ver,
1297dd0b6b1fSRichard Fitzgerald param->mem_type,
1298dd0b6b1fSRichard Fitzgerald (patch_pos_in_packed_regs - alg_base_in_packed_regs) * 4,
1299dd0b6b1fSRichard Fitzgerald &packed_payload, sizeof(packed_payload));
1300dd0b6b1fSRichard Fitzgerald
1301dd0b6b1fSRichard Fitzgerald fw = cs_dsp_mock_bin_get_firmware(priv->local->bin_builder);
1302dd0b6b1fSRichard Fitzgerald KUNIT_ASSERT_EQ(test,
1303dd0b6b1fSRichard Fitzgerald cs_dsp_power_up(priv->dsp, priv->local->wmfw, "mock_wmfw",
1304dd0b6b1fSRichard Fitzgerald fw, "mock_bin", "misc"),
1305dd0b6b1fSRichard Fitzgerald 0);
1306dd0b6b1fSRichard Fitzgerald
1307dd0b6b1fSRichard Fitzgerald /* Content of packed registers should match packed_payload */
1308dd0b6b1fSRichard Fitzgerald reg_addr = cs_dsp_mock_base_addr_for_mem(priv, param->mem_type) +
1309dd0b6b1fSRichard Fitzgerald (patch_pos_in_packed_regs * 4);
1310dd0b6b1fSRichard Fitzgerald memset(readback, 0, sizeof(readback));
1311dd0b6b1fSRichard Fitzgerald KUNIT_EXPECT_EQ(test,
1312dd0b6b1fSRichard Fitzgerald regmap_raw_read(priv->dsp->regmap, reg_addr, &readback, sizeof(readback)),
1313dd0b6b1fSRichard Fitzgerald 0);
1314dd0b6b1fSRichard Fitzgerald KUNIT_EXPECT_MEMEQ(test, &readback, &packed_payload, sizeof(packed_payload));
1315dd0b6b1fSRichard Fitzgerald
1316dd0b6b1fSRichard Fitzgerald /* Drop expected writes from the cache */
1317dd0b6b1fSRichard Fitzgerald cs_dsp_mock_regmap_drop_bytes(priv, reg_addr, sizeof(packed_payload));
1318dd0b6b1fSRichard Fitzgerald
1319dd0b6b1fSRichard Fitzgerald /* Content of unpacked registers should match unpacked_payload */
1320dd0b6b1fSRichard Fitzgerald reg_addr = cs_dsp_mock_base_addr_for_mem(priv, unpacked_mem_type) +
1321dd0b6b1fSRichard Fitzgerald (packed_patch_pos_words - 2) * 4;
1322dd0b6b1fSRichard Fitzgerald memset(readback, 0, sizeof(readback));
1323dd0b6b1fSRichard Fitzgerald KUNIT_EXPECT_EQ(test,
1324dd0b6b1fSRichard Fitzgerald regmap_raw_read(priv->dsp->regmap, reg_addr, &readback,
1325dd0b6b1fSRichard Fitzgerald sizeof(unpacked_payload)),
1326dd0b6b1fSRichard Fitzgerald 0);
1327dd0b6b1fSRichard Fitzgerald KUNIT_EXPECT_MEMEQ(test, &readback, unpacked_payload, sizeof(unpacked_payload));
1328dd0b6b1fSRichard Fitzgerald
1329dd0b6b1fSRichard Fitzgerald /* Drop expected writes from the cache */
1330dd0b6b1fSRichard Fitzgerald cs_dsp_mock_regmap_drop_bytes(priv, reg_addr, sizeof(unpacked_payload));
1331dd0b6b1fSRichard Fitzgerald
1332dd0b6b1fSRichard Fitzgerald /* Drop expected writes and the cache should then be clean */
1333dd0b6b1fSRichard Fitzgerald cs_dsp_mock_xm_header_drop_from_regmap_cache(priv);
1334dd0b6b1fSRichard Fitzgerald KUNIT_EXPECT_FALSE(test, cs_dsp_mock_regmap_is_dirty(priv, true));
1335dd0b6b1fSRichard Fitzgerald }
1336dd0b6b1fSRichard Fitzgerald
1337dd0b6b1fSRichard Fitzgerald /*
1338dd0b6b1fSRichard Fitzgerald * Patch data that starts three words before a packed boundary using three
1339dd0b6b1fSRichard Fitzgerald * unpacked words followed by one packed block.
1340dd0b6b1fSRichard Fitzgerald */
bin_patch_3_single_leading_1_packed(struct kunit * test)1341dd0b6b1fSRichard Fitzgerald static void bin_patch_3_single_leading_1_packed(struct kunit *test)
1342dd0b6b1fSRichard Fitzgerald {
1343dd0b6b1fSRichard Fitzgerald struct cs_dsp_test *priv = test->priv;
1344dd0b6b1fSRichard Fitzgerald const struct bin_test_param *param = test->param_value;
1345dd0b6b1fSRichard Fitzgerald unsigned int unpacked_mem_type = cs_dsp_mock_packed_to_unpacked_mem_type(param->mem_type);
1346dd0b6b1fSRichard Fitzgerald u32 packed_payload[3], unpacked_payload[3], readback[3];
1347dd0b6b1fSRichard Fitzgerald unsigned int alg_base_words, packed_patch_pos_words;
1348dd0b6b1fSRichard Fitzgerald unsigned int alg_base_in_packed_regs, patch_pos_in_packed_regs;
1349dd0b6b1fSRichard Fitzgerald unsigned int reg_addr;
1350dd0b6b1fSRichard Fitzgerald struct firmware *fw;
1351dd0b6b1fSRichard Fitzgerald
1352dd0b6b1fSRichard Fitzgerald static_assert(sizeof(readback) == sizeof(packed_payload));
1353dd0b6b1fSRichard Fitzgerald static_assert(sizeof(readback) >= sizeof(unpacked_payload));
1354dd0b6b1fSRichard Fitzgerald
1355dd0b6b1fSRichard Fitzgerald get_random_bytes(packed_payload, sizeof(packed_payload));
1356dd0b6b1fSRichard Fitzgerald get_random_bytes(unpacked_payload, sizeof(unpacked_payload));
1357dd0b6b1fSRichard Fitzgerald
1358dd0b6b1fSRichard Fitzgerald alg_base_words = cs_dsp_mock_xm_header_get_alg_base_in_words(priv,
1359dd0b6b1fSRichard Fitzgerald bin_test_mock_algs[param->alg_idx].id,
1360dd0b6b1fSRichard Fitzgerald param->mem_type);
1361dd0b6b1fSRichard Fitzgerald alg_base_in_packed_regs = _num_words_to_num_packed_regs(alg_base_words);
1362dd0b6b1fSRichard Fitzgerald
1363dd0b6b1fSRichard Fitzgerald /* Round packed start word up to a packed boundary and move to the next boundary */
1364dd0b6b1fSRichard Fitzgerald packed_patch_pos_words = round_up(alg_base_words + param->offset_words, 4) + 4;
1365dd0b6b1fSRichard Fitzgerald
1366dd0b6b1fSRichard Fitzgerald /* Patch the leading unpacked words */
1367dd0b6b1fSRichard Fitzgerald cs_dsp_mock_bin_add_patch(priv->local->bin_builder,
1368dd0b6b1fSRichard Fitzgerald bin_test_mock_algs[param->alg_idx].id,
1369dd0b6b1fSRichard Fitzgerald bin_test_mock_algs[param->alg_idx].ver,
1370dd0b6b1fSRichard Fitzgerald unpacked_mem_type,
1371dd0b6b1fSRichard Fitzgerald ((packed_patch_pos_words - 3) - alg_base_words) * 4,
1372dd0b6b1fSRichard Fitzgerald &unpacked_payload[0], sizeof(unpacked_payload[0]));
1373dd0b6b1fSRichard Fitzgerald cs_dsp_mock_bin_add_patch(priv->local->bin_builder,
1374dd0b6b1fSRichard Fitzgerald bin_test_mock_algs[param->alg_idx].id,
1375dd0b6b1fSRichard Fitzgerald bin_test_mock_algs[param->alg_idx].ver,
1376dd0b6b1fSRichard Fitzgerald unpacked_mem_type,
1377dd0b6b1fSRichard Fitzgerald ((packed_patch_pos_words - 2) - alg_base_words) * 4,
1378dd0b6b1fSRichard Fitzgerald &unpacked_payload[1], sizeof(unpacked_payload[1]));
1379dd0b6b1fSRichard Fitzgerald cs_dsp_mock_bin_add_patch(priv->local->bin_builder,
1380dd0b6b1fSRichard Fitzgerald bin_test_mock_algs[param->alg_idx].id,
1381dd0b6b1fSRichard Fitzgerald bin_test_mock_algs[param->alg_idx].ver,
1382dd0b6b1fSRichard Fitzgerald unpacked_mem_type,
1383dd0b6b1fSRichard Fitzgerald ((packed_patch_pos_words - 1) - alg_base_words) * 4,
1384dd0b6b1fSRichard Fitzgerald &unpacked_payload[2], sizeof(unpacked_payload[2]));
1385dd0b6b1fSRichard Fitzgerald /* ... then the packed block */
1386dd0b6b1fSRichard Fitzgerald patch_pos_in_packed_regs = _num_words_to_num_packed_regs(packed_patch_pos_words);
1387dd0b6b1fSRichard Fitzgerald cs_dsp_mock_bin_add_patch(priv->local->bin_builder,
1388dd0b6b1fSRichard Fitzgerald bin_test_mock_algs[param->alg_idx].id,
1389dd0b6b1fSRichard Fitzgerald bin_test_mock_algs[param->alg_idx].ver,
1390dd0b6b1fSRichard Fitzgerald param->mem_type,
1391dd0b6b1fSRichard Fitzgerald (patch_pos_in_packed_regs - alg_base_in_packed_regs) * 4,
1392dd0b6b1fSRichard Fitzgerald &packed_payload, sizeof(packed_payload));
1393dd0b6b1fSRichard Fitzgerald
1394dd0b6b1fSRichard Fitzgerald fw = cs_dsp_mock_bin_get_firmware(priv->local->bin_builder);
1395dd0b6b1fSRichard Fitzgerald KUNIT_ASSERT_EQ(test,
1396dd0b6b1fSRichard Fitzgerald cs_dsp_power_up(priv->dsp, priv->local->wmfw, "mock_wmfw",
1397dd0b6b1fSRichard Fitzgerald fw, "mock_bin", "misc"),
1398dd0b6b1fSRichard Fitzgerald 0);
1399dd0b6b1fSRichard Fitzgerald
1400dd0b6b1fSRichard Fitzgerald /* Content of packed registers should match packed_payload */
1401dd0b6b1fSRichard Fitzgerald reg_addr = cs_dsp_mock_base_addr_for_mem(priv, param->mem_type) +
1402dd0b6b1fSRichard Fitzgerald (patch_pos_in_packed_regs * 4);
1403dd0b6b1fSRichard Fitzgerald memset(readback, 0, sizeof(readback));
1404dd0b6b1fSRichard Fitzgerald KUNIT_EXPECT_EQ(test,
1405dd0b6b1fSRichard Fitzgerald regmap_raw_read(priv->dsp->regmap, reg_addr, &readback, sizeof(readback)),
1406dd0b6b1fSRichard Fitzgerald 0);
1407dd0b6b1fSRichard Fitzgerald KUNIT_EXPECT_MEMEQ(test, &readback, &packed_payload, sizeof(packed_payload));
1408dd0b6b1fSRichard Fitzgerald
1409dd0b6b1fSRichard Fitzgerald /* Drop expected writes from the cache */
1410dd0b6b1fSRichard Fitzgerald cs_dsp_mock_regmap_drop_bytes(priv, reg_addr, sizeof(packed_payload));
1411dd0b6b1fSRichard Fitzgerald
1412dd0b6b1fSRichard Fitzgerald /* Content of unpacked registers should match unpacked_payload */
1413dd0b6b1fSRichard Fitzgerald reg_addr = cs_dsp_mock_base_addr_for_mem(priv, unpacked_mem_type) +
1414dd0b6b1fSRichard Fitzgerald (packed_patch_pos_words - 3) * 4;
1415dd0b6b1fSRichard Fitzgerald memset(readback, 0, sizeof(readback));
1416dd0b6b1fSRichard Fitzgerald KUNIT_EXPECT_EQ(test,
1417dd0b6b1fSRichard Fitzgerald regmap_raw_read(priv->dsp->regmap, reg_addr, &readback,
1418dd0b6b1fSRichard Fitzgerald sizeof(unpacked_payload)),
1419dd0b6b1fSRichard Fitzgerald 0);
1420dd0b6b1fSRichard Fitzgerald KUNIT_EXPECT_MEMEQ(test, &readback, unpacked_payload, sizeof(unpacked_payload));
1421dd0b6b1fSRichard Fitzgerald
1422dd0b6b1fSRichard Fitzgerald /* Drop expected writes from the cache */
1423dd0b6b1fSRichard Fitzgerald cs_dsp_mock_regmap_drop_bytes(priv, reg_addr, sizeof(unpacked_payload));
1424dd0b6b1fSRichard Fitzgerald
1425dd0b6b1fSRichard Fitzgerald /* Drop expected writes and the cache should then be clean */
1426dd0b6b1fSRichard Fitzgerald cs_dsp_mock_xm_header_drop_from_regmap_cache(priv);
1427dd0b6b1fSRichard Fitzgerald KUNIT_EXPECT_FALSE(test, cs_dsp_mock_regmap_is_dirty(priv, true));
1428dd0b6b1fSRichard Fitzgerald }
1429dd0b6b1fSRichard Fitzgerald
1430dd0b6b1fSRichard Fitzgerald /*
1431dd0b6b1fSRichard Fitzgerald * Patch data that starts three words before a packed boundary using one
1432dd0b6b1fSRichard Fitzgerald * block of three unpacked words followed by one packed block.
1433dd0b6b1fSRichard Fitzgerald */
bin_patch_3_leading_1_packed(struct kunit * test)1434dd0b6b1fSRichard Fitzgerald static void bin_patch_3_leading_1_packed(struct kunit *test)
1435dd0b6b1fSRichard Fitzgerald {
1436dd0b6b1fSRichard Fitzgerald struct cs_dsp_test *priv = test->priv;
1437dd0b6b1fSRichard Fitzgerald const struct bin_test_param *param = test->param_value;
1438dd0b6b1fSRichard Fitzgerald unsigned int unpacked_mem_type = cs_dsp_mock_packed_to_unpacked_mem_type(param->mem_type);
1439dd0b6b1fSRichard Fitzgerald u32 packed_payload[3], unpacked_payload[3], readback[3];
1440dd0b6b1fSRichard Fitzgerald unsigned int alg_base_words, packed_patch_pos_words;
1441dd0b6b1fSRichard Fitzgerald unsigned int alg_base_in_packed_regs, patch_pos_in_packed_regs;
1442dd0b6b1fSRichard Fitzgerald unsigned int reg_addr;
1443dd0b6b1fSRichard Fitzgerald struct firmware *fw;
1444dd0b6b1fSRichard Fitzgerald
1445dd0b6b1fSRichard Fitzgerald static_assert(sizeof(readback) == sizeof(packed_payload));
1446dd0b6b1fSRichard Fitzgerald static_assert(sizeof(readback) >= sizeof(unpacked_payload));
1447dd0b6b1fSRichard Fitzgerald
1448dd0b6b1fSRichard Fitzgerald get_random_bytes(packed_payload, sizeof(packed_payload));
1449dd0b6b1fSRichard Fitzgerald get_random_bytes(unpacked_payload, sizeof(unpacked_payload));
1450dd0b6b1fSRichard Fitzgerald
1451dd0b6b1fSRichard Fitzgerald alg_base_words = cs_dsp_mock_xm_header_get_alg_base_in_words(priv,
1452dd0b6b1fSRichard Fitzgerald bin_test_mock_algs[param->alg_idx].id,
1453dd0b6b1fSRichard Fitzgerald param->mem_type);
1454dd0b6b1fSRichard Fitzgerald alg_base_in_packed_regs = _num_words_to_num_packed_regs(alg_base_words);
1455dd0b6b1fSRichard Fitzgerald
1456dd0b6b1fSRichard Fitzgerald /* Round packed start word up to a packed boundary and move to the next boundary */
1457dd0b6b1fSRichard Fitzgerald packed_patch_pos_words = round_up(alg_base_words + param->offset_words, 4) + 4;
1458dd0b6b1fSRichard Fitzgerald
1459dd0b6b1fSRichard Fitzgerald /* Patch the leading unpacked words */
1460dd0b6b1fSRichard Fitzgerald cs_dsp_mock_bin_add_patch(priv->local->bin_builder,
1461dd0b6b1fSRichard Fitzgerald bin_test_mock_algs[param->alg_idx].id,
1462dd0b6b1fSRichard Fitzgerald bin_test_mock_algs[param->alg_idx].ver,
1463dd0b6b1fSRichard Fitzgerald unpacked_mem_type,
1464dd0b6b1fSRichard Fitzgerald ((packed_patch_pos_words - 3) - alg_base_words) * 4,
1465dd0b6b1fSRichard Fitzgerald unpacked_payload, sizeof(unpacked_payload));
1466dd0b6b1fSRichard Fitzgerald /* ... then the packed block */
1467dd0b6b1fSRichard Fitzgerald patch_pos_in_packed_regs = _num_words_to_num_packed_regs(packed_patch_pos_words);
1468dd0b6b1fSRichard Fitzgerald cs_dsp_mock_bin_add_patch(priv->local->bin_builder,
1469dd0b6b1fSRichard Fitzgerald bin_test_mock_algs[param->alg_idx].id,
1470dd0b6b1fSRichard Fitzgerald bin_test_mock_algs[param->alg_idx].ver,
1471dd0b6b1fSRichard Fitzgerald param->mem_type,
1472dd0b6b1fSRichard Fitzgerald (patch_pos_in_packed_regs - alg_base_in_packed_regs) * 4,
1473dd0b6b1fSRichard Fitzgerald &packed_payload, sizeof(packed_payload));
1474dd0b6b1fSRichard Fitzgerald
1475dd0b6b1fSRichard Fitzgerald fw = cs_dsp_mock_bin_get_firmware(priv->local->bin_builder);
1476dd0b6b1fSRichard Fitzgerald KUNIT_ASSERT_EQ(test,
1477dd0b6b1fSRichard Fitzgerald cs_dsp_power_up(priv->dsp, priv->local->wmfw, "mock_wmfw",
1478dd0b6b1fSRichard Fitzgerald fw, "mock_bin", "misc"),
1479dd0b6b1fSRichard Fitzgerald 0);
1480dd0b6b1fSRichard Fitzgerald
1481dd0b6b1fSRichard Fitzgerald /* Content of packed registers should match packed_payload */
1482dd0b6b1fSRichard Fitzgerald reg_addr = cs_dsp_mock_base_addr_for_mem(priv, param->mem_type) +
1483dd0b6b1fSRichard Fitzgerald (patch_pos_in_packed_regs * 4);
1484dd0b6b1fSRichard Fitzgerald memset(readback, 0, sizeof(readback));
1485dd0b6b1fSRichard Fitzgerald KUNIT_EXPECT_EQ(test,
1486dd0b6b1fSRichard Fitzgerald regmap_raw_read(priv->dsp->regmap, reg_addr, &readback, sizeof(readback)),
1487dd0b6b1fSRichard Fitzgerald 0);
1488dd0b6b1fSRichard Fitzgerald KUNIT_EXPECT_MEMEQ(test, &readback, &packed_payload, sizeof(packed_payload));
1489dd0b6b1fSRichard Fitzgerald
1490dd0b6b1fSRichard Fitzgerald /* Drop expected writes from the cache */
1491dd0b6b1fSRichard Fitzgerald cs_dsp_mock_regmap_drop_bytes(priv, reg_addr, sizeof(packed_payload));
1492dd0b6b1fSRichard Fitzgerald
1493dd0b6b1fSRichard Fitzgerald /* Content of unpacked registers should match unpacked_payload */
1494dd0b6b1fSRichard Fitzgerald reg_addr = cs_dsp_mock_base_addr_for_mem(priv, unpacked_mem_type) +
1495dd0b6b1fSRichard Fitzgerald (packed_patch_pos_words - 3) * 4;
1496dd0b6b1fSRichard Fitzgerald memset(readback, 0, sizeof(readback));
1497dd0b6b1fSRichard Fitzgerald KUNIT_EXPECT_EQ(test,
1498dd0b6b1fSRichard Fitzgerald regmap_raw_read(priv->dsp->regmap, reg_addr, &readback,
1499dd0b6b1fSRichard Fitzgerald sizeof(unpacked_payload)),
1500dd0b6b1fSRichard Fitzgerald 0);
1501dd0b6b1fSRichard Fitzgerald KUNIT_EXPECT_MEMEQ(test, &readback, unpacked_payload, sizeof(unpacked_payload));
1502dd0b6b1fSRichard Fitzgerald
1503dd0b6b1fSRichard Fitzgerald /* Drop expected writes from the cache */
1504dd0b6b1fSRichard Fitzgerald cs_dsp_mock_regmap_drop_bytes(priv, reg_addr, sizeof(unpacked_payload));
1505dd0b6b1fSRichard Fitzgerald
1506dd0b6b1fSRichard Fitzgerald /* Drop expected writes and the cache should then be clean */
1507dd0b6b1fSRichard Fitzgerald cs_dsp_mock_xm_header_drop_from_regmap_cache(priv);
1508dd0b6b1fSRichard Fitzgerald KUNIT_EXPECT_FALSE(test, cs_dsp_mock_regmap_is_dirty(priv, true));
1509dd0b6b1fSRichard Fitzgerald }
1510dd0b6b1fSRichard Fitzgerald
1511dd0b6b1fSRichard Fitzgerald /* bin file with a multiple payloads that each patch one packed block. */
bin_patch_multi_onepacked(struct kunit * test)1512dd0b6b1fSRichard Fitzgerald static void bin_patch_multi_onepacked(struct kunit *test)
1513dd0b6b1fSRichard Fitzgerald {
1514dd0b6b1fSRichard Fitzgerald struct cs_dsp_test *priv = test->priv;
1515dd0b6b1fSRichard Fitzgerald const struct bin_test_param *param = test->param_value;
1516dd0b6b1fSRichard Fitzgerald u32 packed_payloads[8][3], readback[8][3];
1517dd0b6b1fSRichard Fitzgerald unsigned int alg_base_words, patch_pos_words;
1518dd0b6b1fSRichard Fitzgerald unsigned int alg_base_in_packed_regs, patch_pos_in_packed_regs;
1519dd0b6b1fSRichard Fitzgerald unsigned int payload_offset;
1520dd0b6b1fSRichard Fitzgerald unsigned int reg_addr;
1521dd0b6b1fSRichard Fitzgerald struct firmware *fw;
1522dd0b6b1fSRichard Fitzgerald int i;
1523dd0b6b1fSRichard Fitzgerald
1524dd0b6b1fSRichard Fitzgerald static_assert(sizeof(readback) == sizeof(packed_payloads));
1525dd0b6b1fSRichard Fitzgerald
1526dd0b6b1fSRichard Fitzgerald get_random_bytes(packed_payloads, sizeof(packed_payloads));
1527dd0b6b1fSRichard Fitzgerald
1528dd0b6b1fSRichard Fitzgerald alg_base_words = cs_dsp_mock_xm_header_get_alg_base_in_words(priv,
1529dd0b6b1fSRichard Fitzgerald bin_test_mock_algs[param->alg_idx].id,
1530dd0b6b1fSRichard Fitzgerald param->mem_type);
1531dd0b6b1fSRichard Fitzgerald alg_base_in_packed_regs = _num_words_to_num_packed_regs(alg_base_words);
1532dd0b6b1fSRichard Fitzgerald
1533dd0b6b1fSRichard Fitzgerald /* Round patch start word up to a packed boundary */
1534dd0b6b1fSRichard Fitzgerald patch_pos_words = round_up(alg_base_words + param->offset_words, 4);
1535dd0b6b1fSRichard Fitzgerald
1536dd0b6b1fSRichard Fitzgerald /* Add one payload per packed block */
1537dd0b6b1fSRichard Fitzgerald for (i = 0; i < ARRAY_SIZE(packed_payloads); ++i) {
1538dd0b6b1fSRichard Fitzgerald patch_pos_in_packed_regs = _num_words_to_num_packed_regs(patch_pos_words + (i * 4));
1539dd0b6b1fSRichard Fitzgerald payload_offset = (patch_pos_in_packed_regs - alg_base_in_packed_regs) * 4;
1540dd0b6b1fSRichard Fitzgerald cs_dsp_mock_bin_add_patch(priv->local->bin_builder,
1541dd0b6b1fSRichard Fitzgerald bin_test_mock_algs[param->alg_idx].id,
1542dd0b6b1fSRichard Fitzgerald bin_test_mock_algs[param->alg_idx].ver,
1543dd0b6b1fSRichard Fitzgerald param->mem_type,
1544dd0b6b1fSRichard Fitzgerald payload_offset,
1545dd0b6b1fSRichard Fitzgerald &packed_payloads[i], sizeof(packed_payloads[i]));
1546dd0b6b1fSRichard Fitzgerald }
1547dd0b6b1fSRichard Fitzgerald
1548dd0b6b1fSRichard Fitzgerald fw = cs_dsp_mock_bin_get_firmware(priv->local->bin_builder);
1549dd0b6b1fSRichard Fitzgerald KUNIT_ASSERT_EQ(test,
1550dd0b6b1fSRichard Fitzgerald cs_dsp_power_up(priv->dsp, priv->local->wmfw, "mock_wmfw",
1551dd0b6b1fSRichard Fitzgerald fw, "mock_bin", "misc"),
1552dd0b6b1fSRichard Fitzgerald 0);
1553dd0b6b1fSRichard Fitzgerald
1554dd0b6b1fSRichard Fitzgerald /* Content of packed registers should match packed_payloads */
1555dd0b6b1fSRichard Fitzgerald patch_pos_in_packed_regs = _num_words_to_num_packed_regs(patch_pos_words);
1556dd0b6b1fSRichard Fitzgerald reg_addr = cs_dsp_mock_base_addr_for_mem(priv, param->mem_type) +
1557dd0b6b1fSRichard Fitzgerald (patch_pos_in_packed_regs * 4);
1558dd0b6b1fSRichard Fitzgerald memset(readback, 0, sizeof(readback));
1559dd0b6b1fSRichard Fitzgerald KUNIT_EXPECT_EQ(test,
1560dd0b6b1fSRichard Fitzgerald regmap_raw_read(priv->dsp->regmap, reg_addr, readback, sizeof(readback)),
1561dd0b6b1fSRichard Fitzgerald 0);
1562dd0b6b1fSRichard Fitzgerald KUNIT_EXPECT_MEMEQ(test, readback, packed_payloads, sizeof(packed_payloads));
1563dd0b6b1fSRichard Fitzgerald
1564dd0b6b1fSRichard Fitzgerald /* Drop expected writes and the cache should then be clean */
1565dd0b6b1fSRichard Fitzgerald cs_dsp_mock_xm_header_drop_from_regmap_cache(priv);
1566dd0b6b1fSRichard Fitzgerald cs_dsp_mock_regmap_drop_bytes(priv, reg_addr, sizeof(packed_payloads));
1567dd0b6b1fSRichard Fitzgerald KUNIT_EXPECT_FALSE(test, cs_dsp_mock_regmap_is_dirty(priv, true));
1568dd0b6b1fSRichard Fitzgerald }
1569dd0b6b1fSRichard Fitzgerald
1570dd0b6b1fSRichard Fitzgerald /*
1571dd0b6b1fSRichard Fitzgerald * bin file with a multiple payloads that each patch one packed block.
1572dd0b6b1fSRichard Fitzgerald * The payloads are not in address order.
1573dd0b6b1fSRichard Fitzgerald */
bin_patch_multi_onepacked_unordered(struct kunit * test)1574dd0b6b1fSRichard Fitzgerald static void bin_patch_multi_onepacked_unordered(struct kunit *test)
1575dd0b6b1fSRichard Fitzgerald {
1576dd0b6b1fSRichard Fitzgerald struct cs_dsp_test *priv = test->priv;
1577dd0b6b1fSRichard Fitzgerald const struct bin_test_param *param = test->param_value;
1578dd0b6b1fSRichard Fitzgerald static const u8 payload_order[] = { 4, 3, 6, 1, 0, 7, 5, 2 };
1579dd0b6b1fSRichard Fitzgerald u32 packed_payloads[8][3], readback[8][3];
1580dd0b6b1fSRichard Fitzgerald unsigned int alg_base_words, patch_pos_words;
1581dd0b6b1fSRichard Fitzgerald unsigned int alg_base_in_packed_regs, patch_pos_in_packed_regs;
1582dd0b6b1fSRichard Fitzgerald unsigned int payload_offset;
1583dd0b6b1fSRichard Fitzgerald unsigned int reg_addr;
1584dd0b6b1fSRichard Fitzgerald struct firmware *fw;
1585dd0b6b1fSRichard Fitzgerald int i;
1586dd0b6b1fSRichard Fitzgerald
1587dd0b6b1fSRichard Fitzgerald static_assert(ARRAY_SIZE(payload_order) == ARRAY_SIZE(packed_payloads));
1588dd0b6b1fSRichard Fitzgerald static_assert(sizeof(readback) == sizeof(packed_payloads));
1589dd0b6b1fSRichard Fitzgerald
1590dd0b6b1fSRichard Fitzgerald get_random_bytes(packed_payloads, sizeof(packed_payloads));
1591dd0b6b1fSRichard Fitzgerald
1592dd0b6b1fSRichard Fitzgerald alg_base_words = cs_dsp_mock_xm_header_get_alg_base_in_words(priv,
1593dd0b6b1fSRichard Fitzgerald bin_test_mock_algs[param->alg_idx].id,
1594dd0b6b1fSRichard Fitzgerald param->mem_type);
1595dd0b6b1fSRichard Fitzgerald alg_base_in_packed_regs = _num_words_to_num_packed_regs(alg_base_words);
1596dd0b6b1fSRichard Fitzgerald
1597dd0b6b1fSRichard Fitzgerald /* Round patch start word up to a packed boundary */
1598dd0b6b1fSRichard Fitzgerald patch_pos_words = round_up(alg_base_words + param->offset_words, 4);
1599dd0b6b1fSRichard Fitzgerald
1600dd0b6b1fSRichard Fitzgerald /* Add one payload per packed block */
1601dd0b6b1fSRichard Fitzgerald for (i = 0; i < ARRAY_SIZE(payload_order); ++i) {
1602dd0b6b1fSRichard Fitzgerald patch_pos_in_packed_regs =
1603dd0b6b1fSRichard Fitzgerald _num_words_to_num_packed_regs(patch_pos_words + (payload_order[i] * 4));
1604dd0b6b1fSRichard Fitzgerald payload_offset = (patch_pos_in_packed_regs - alg_base_in_packed_regs) * 4;
1605dd0b6b1fSRichard Fitzgerald cs_dsp_mock_bin_add_patch(priv->local->bin_builder,
1606dd0b6b1fSRichard Fitzgerald bin_test_mock_algs[param->alg_idx].id,
1607dd0b6b1fSRichard Fitzgerald bin_test_mock_algs[param->alg_idx].ver,
1608dd0b6b1fSRichard Fitzgerald param->mem_type,
1609dd0b6b1fSRichard Fitzgerald payload_offset,
1610dd0b6b1fSRichard Fitzgerald &packed_payloads[payload_order[i]],
1611dd0b6b1fSRichard Fitzgerald sizeof(packed_payloads[0]));
1612dd0b6b1fSRichard Fitzgerald }
1613dd0b6b1fSRichard Fitzgerald
1614dd0b6b1fSRichard Fitzgerald fw = cs_dsp_mock_bin_get_firmware(priv->local->bin_builder);
1615dd0b6b1fSRichard Fitzgerald KUNIT_ASSERT_EQ(test,
1616dd0b6b1fSRichard Fitzgerald cs_dsp_power_up(priv->dsp, priv->local->wmfw, "mock_wmfw",
1617dd0b6b1fSRichard Fitzgerald fw, "mock_bin", "misc"),
1618dd0b6b1fSRichard Fitzgerald 0);
1619dd0b6b1fSRichard Fitzgerald
1620dd0b6b1fSRichard Fitzgerald /* Content in registers should match the order of data in packed_payloads */
1621dd0b6b1fSRichard Fitzgerald patch_pos_in_packed_regs = _num_words_to_num_packed_regs(patch_pos_words);
1622dd0b6b1fSRichard Fitzgerald reg_addr = cs_dsp_mock_base_addr_for_mem(priv, param->mem_type) +
1623dd0b6b1fSRichard Fitzgerald (patch_pos_in_packed_regs * 4);
1624dd0b6b1fSRichard Fitzgerald memset(readback, 0, sizeof(readback));
1625dd0b6b1fSRichard Fitzgerald KUNIT_EXPECT_EQ(test,
1626dd0b6b1fSRichard Fitzgerald regmap_raw_read(priv->dsp->regmap, reg_addr, readback, sizeof(readback)),
1627dd0b6b1fSRichard Fitzgerald 0);
1628dd0b6b1fSRichard Fitzgerald KUNIT_EXPECT_MEMEQ(test, readback, packed_payloads, sizeof(packed_payloads));
1629dd0b6b1fSRichard Fitzgerald
1630dd0b6b1fSRichard Fitzgerald /* Drop expected writes and the cache should then be clean */
1631dd0b6b1fSRichard Fitzgerald cs_dsp_mock_xm_header_drop_from_regmap_cache(priv);
1632dd0b6b1fSRichard Fitzgerald cs_dsp_mock_regmap_drop_bytes(priv, reg_addr, sizeof(packed_payloads));
1633dd0b6b1fSRichard Fitzgerald KUNIT_EXPECT_FALSE(test, cs_dsp_mock_regmap_is_dirty(priv, true));
1634dd0b6b1fSRichard Fitzgerald }
1635dd0b6b1fSRichard Fitzgerald
1636dd0b6b1fSRichard Fitzgerald /*
1637dd0b6b1fSRichard Fitzgerald * bin file with a multiple payloads that each patch one packed block.
1638dd0b6b1fSRichard Fitzgerald * The payloads are not in address order. The patched memory is not contiguous.
1639dd0b6b1fSRichard Fitzgerald */
bin_patch_multi_onepacked_sparse_unordered(struct kunit * test)1640dd0b6b1fSRichard Fitzgerald static void bin_patch_multi_onepacked_sparse_unordered(struct kunit *test)
1641dd0b6b1fSRichard Fitzgerald {
1642dd0b6b1fSRichard Fitzgerald struct cs_dsp_test *priv = test->priv;
1643dd0b6b1fSRichard Fitzgerald const struct bin_test_param *param = test->param_value;
1644dd0b6b1fSRichard Fitzgerald static const u8 word_offsets[] = { 60, 24, 76, 4, 40, 52, 48, 36, 12 };
1645dd0b6b1fSRichard Fitzgerald u32 packed_payloads[9][3], readback[3];
1646dd0b6b1fSRichard Fitzgerald unsigned int alg_base_words, alg_base_in_packed_regs;
1647dd0b6b1fSRichard Fitzgerald unsigned int patch_pos_words, patch_pos_in_packed_regs, payload_offset;
1648dd0b6b1fSRichard Fitzgerald unsigned int reg_addr;
1649dd0b6b1fSRichard Fitzgerald struct firmware *fw;
1650dd0b6b1fSRichard Fitzgerald int i;
1651dd0b6b1fSRichard Fitzgerald
1652dd0b6b1fSRichard Fitzgerald static_assert(ARRAY_SIZE(word_offsets) == ARRAY_SIZE(packed_payloads));
1653dd0b6b1fSRichard Fitzgerald static_assert(sizeof(readback) == sizeof(packed_payloads[0]));
1654dd0b6b1fSRichard Fitzgerald
1655dd0b6b1fSRichard Fitzgerald get_random_bytes(packed_payloads, sizeof(packed_payloads));
1656dd0b6b1fSRichard Fitzgerald
1657dd0b6b1fSRichard Fitzgerald alg_base_words = cs_dsp_mock_xm_header_get_alg_base_in_words(priv,
1658dd0b6b1fSRichard Fitzgerald bin_test_mock_algs[param->alg_idx].id,
1659dd0b6b1fSRichard Fitzgerald param->mem_type);
1660dd0b6b1fSRichard Fitzgerald alg_base_in_packed_regs = _num_words_to_num_packed_regs(alg_base_words);
1661dd0b6b1fSRichard Fitzgerald
1662dd0b6b1fSRichard Fitzgerald /* Add one payload per packed block */
1663dd0b6b1fSRichard Fitzgerald for (i = 0; i < ARRAY_SIZE(word_offsets); ++i) {
1664dd0b6b1fSRichard Fitzgerald /* Round patch start word up to a packed boundary */
1665dd0b6b1fSRichard Fitzgerald patch_pos_words = round_up(alg_base_words + word_offsets[i], 4);
1666dd0b6b1fSRichard Fitzgerald patch_pos_in_packed_regs = _num_words_to_num_packed_regs(patch_pos_words);
1667dd0b6b1fSRichard Fitzgerald payload_offset = (patch_pos_in_packed_regs - alg_base_in_packed_regs) * 4;
1668dd0b6b1fSRichard Fitzgerald cs_dsp_mock_bin_add_patch(priv->local->bin_builder,
1669dd0b6b1fSRichard Fitzgerald bin_test_mock_algs[param->alg_idx].id,
1670dd0b6b1fSRichard Fitzgerald bin_test_mock_algs[param->alg_idx].ver,
1671dd0b6b1fSRichard Fitzgerald param->mem_type,
1672dd0b6b1fSRichard Fitzgerald payload_offset,
1673dd0b6b1fSRichard Fitzgerald &packed_payloads[i],
1674dd0b6b1fSRichard Fitzgerald sizeof(packed_payloads[0]));
1675dd0b6b1fSRichard Fitzgerald }
1676dd0b6b1fSRichard Fitzgerald
1677dd0b6b1fSRichard Fitzgerald fw = cs_dsp_mock_bin_get_firmware(priv->local->bin_builder);
1678dd0b6b1fSRichard Fitzgerald KUNIT_ASSERT_EQ(test,
1679dd0b6b1fSRichard Fitzgerald cs_dsp_power_up(priv->dsp, priv->local->wmfw, "mock_wmfw",
1680dd0b6b1fSRichard Fitzgerald fw, "mock_bin", "misc"),
1681dd0b6b1fSRichard Fitzgerald 0);
1682dd0b6b1fSRichard Fitzgerald
1683dd0b6b1fSRichard Fitzgerald /* Content of packed registers should match packed_payloads */
1684dd0b6b1fSRichard Fitzgerald for (i = 0; i < ARRAY_SIZE(word_offsets); ++i) {
1685dd0b6b1fSRichard Fitzgerald patch_pos_words = round_up(alg_base_words + word_offsets[i], 4);
1686dd0b6b1fSRichard Fitzgerald patch_pos_in_packed_regs = _num_words_to_num_packed_regs(patch_pos_words);
1687dd0b6b1fSRichard Fitzgerald reg_addr = cs_dsp_mock_base_addr_for_mem(priv, param->mem_type) +
1688dd0b6b1fSRichard Fitzgerald (patch_pos_in_packed_regs * 4);
1689dd0b6b1fSRichard Fitzgerald memset(readback, 0, sizeof(readback));
1690dd0b6b1fSRichard Fitzgerald KUNIT_EXPECT_EQ(test,
1691dd0b6b1fSRichard Fitzgerald regmap_raw_read(priv->dsp->regmap, reg_addr, readback,
1692dd0b6b1fSRichard Fitzgerald sizeof(readback)),
1693dd0b6b1fSRichard Fitzgerald 0);
1694dd0b6b1fSRichard Fitzgerald KUNIT_EXPECT_MEMEQ(test, readback, packed_payloads[i], sizeof(packed_payloads[i]));
1695dd0b6b1fSRichard Fitzgerald
1696dd0b6b1fSRichard Fitzgerald /* Drop expected writes from the cache */
1697dd0b6b1fSRichard Fitzgerald cs_dsp_mock_regmap_drop_bytes(priv, reg_addr, sizeof(packed_payloads[i]));
1698dd0b6b1fSRichard Fitzgerald }
1699dd0b6b1fSRichard Fitzgerald
1700dd0b6b1fSRichard Fitzgerald /* Drop expected writes and the cache should then be clean */
1701dd0b6b1fSRichard Fitzgerald cs_dsp_mock_xm_header_drop_from_regmap_cache(priv);
1702dd0b6b1fSRichard Fitzgerald KUNIT_EXPECT_FALSE(test, cs_dsp_mock_regmap_is_dirty(priv, true));
1703dd0b6b1fSRichard Fitzgerald }
1704dd0b6b1fSRichard Fitzgerald
1705dd0b6b1fSRichard Fitzgerald /*
1706dd0b6b1fSRichard Fitzgerald * bin file that patches a single packed block in each of the memory regions
1707dd0b6b1fSRichard Fitzgerald * of one algorithm.
1708dd0b6b1fSRichard Fitzgerald */
bin_patch_1_packed_multiple_mems(struct kunit * test)1709dd0b6b1fSRichard Fitzgerald static void bin_patch_1_packed_multiple_mems(struct kunit *test)
1710dd0b6b1fSRichard Fitzgerald {
1711dd0b6b1fSRichard Fitzgerald struct cs_dsp_test *priv = test->priv;
1712dd0b6b1fSRichard Fitzgerald const struct bin_test_param *param = test->param_value;
1713dd0b6b1fSRichard Fitzgerald u32 packed_xm_payload[3], packed_ym_payload[3], readback[3];
1714dd0b6b1fSRichard Fitzgerald unsigned int alg_xm_base_words, alg_ym_base_words;
1715dd0b6b1fSRichard Fitzgerald unsigned int xm_patch_pos_words, ym_patch_pos_words;
1716dd0b6b1fSRichard Fitzgerald unsigned int alg_base_in_packed_regs, patch_pos_in_packed_regs;
1717dd0b6b1fSRichard Fitzgerald unsigned int reg_addr;
1718dd0b6b1fSRichard Fitzgerald struct firmware *fw;
1719dd0b6b1fSRichard Fitzgerald
1720dd0b6b1fSRichard Fitzgerald static_assert(sizeof(readback) == sizeof(packed_xm_payload));
1721dd0b6b1fSRichard Fitzgerald static_assert(sizeof(readback) == sizeof(packed_ym_payload));
1722dd0b6b1fSRichard Fitzgerald
1723dd0b6b1fSRichard Fitzgerald get_random_bytes(packed_xm_payload, sizeof(packed_xm_payload));
1724dd0b6b1fSRichard Fitzgerald get_random_bytes(packed_ym_payload, sizeof(packed_ym_payload));
1725dd0b6b1fSRichard Fitzgerald
1726dd0b6b1fSRichard Fitzgerald alg_xm_base_words = cs_dsp_mock_xm_header_get_alg_base_in_words(priv,
1727dd0b6b1fSRichard Fitzgerald bin_test_mock_algs[param->alg_idx].id,
1728dd0b6b1fSRichard Fitzgerald WMFW_HALO_XM_PACKED);
1729dd0b6b1fSRichard Fitzgerald alg_ym_base_words = cs_dsp_mock_xm_header_get_alg_base_in_words(priv,
1730dd0b6b1fSRichard Fitzgerald bin_test_mock_algs[param->alg_idx].id,
1731dd0b6b1fSRichard Fitzgerald WMFW_HALO_YM_PACKED);
1732dd0b6b1fSRichard Fitzgerald
1733dd0b6b1fSRichard Fitzgerald /* Round patch start word up to a packed boundary */
1734dd0b6b1fSRichard Fitzgerald xm_patch_pos_words = round_up(alg_xm_base_words + param->offset_words, 4);
1735dd0b6b1fSRichard Fitzgerald ym_patch_pos_words = round_up(alg_ym_base_words + param->offset_words, 4);
1736dd0b6b1fSRichard Fitzgerald
1737dd0b6b1fSRichard Fitzgerald /* Add XM and YM patches */
1738dd0b6b1fSRichard Fitzgerald alg_base_in_packed_regs = _num_words_to_num_packed_regs(alg_xm_base_words);
1739dd0b6b1fSRichard Fitzgerald patch_pos_in_packed_regs = _num_words_to_num_packed_regs(xm_patch_pos_words);
1740dd0b6b1fSRichard Fitzgerald cs_dsp_mock_bin_add_patch(priv->local->bin_builder,
1741dd0b6b1fSRichard Fitzgerald bin_test_mock_algs[param->alg_idx].id,
1742dd0b6b1fSRichard Fitzgerald bin_test_mock_algs[param->alg_idx].ver,
1743dd0b6b1fSRichard Fitzgerald WMFW_HALO_XM_PACKED,
1744dd0b6b1fSRichard Fitzgerald (patch_pos_in_packed_regs - alg_base_in_packed_regs) * 4,
1745dd0b6b1fSRichard Fitzgerald packed_xm_payload, sizeof(packed_xm_payload));
1746dd0b6b1fSRichard Fitzgerald
1747dd0b6b1fSRichard Fitzgerald alg_base_in_packed_regs = _num_words_to_num_packed_regs(alg_ym_base_words);
1748dd0b6b1fSRichard Fitzgerald patch_pos_in_packed_regs = _num_words_to_num_packed_regs(ym_patch_pos_words);
1749dd0b6b1fSRichard Fitzgerald cs_dsp_mock_bin_add_patch(priv->local->bin_builder,
1750dd0b6b1fSRichard Fitzgerald bin_test_mock_algs[param->alg_idx].id,
1751dd0b6b1fSRichard Fitzgerald bin_test_mock_algs[param->alg_idx].ver,
1752dd0b6b1fSRichard Fitzgerald WMFW_HALO_YM_PACKED,
1753dd0b6b1fSRichard Fitzgerald (patch_pos_in_packed_regs - alg_base_in_packed_regs) * 4,
1754dd0b6b1fSRichard Fitzgerald packed_ym_payload, sizeof(packed_ym_payload));
1755dd0b6b1fSRichard Fitzgerald
1756dd0b6b1fSRichard Fitzgerald fw = cs_dsp_mock_bin_get_firmware(priv->local->bin_builder);
1757dd0b6b1fSRichard Fitzgerald KUNIT_ASSERT_EQ(test,
1758dd0b6b1fSRichard Fitzgerald cs_dsp_power_up(priv->dsp, priv->local->wmfw, "mock_wmfw",
1759dd0b6b1fSRichard Fitzgerald fw, "mock_bin", "misc"),
1760dd0b6b1fSRichard Fitzgerald 0);
1761dd0b6b1fSRichard Fitzgerald
1762dd0b6b1fSRichard Fitzgerald /* Content of packed XM registers should match packed_xm_payload */
1763dd0b6b1fSRichard Fitzgerald patch_pos_in_packed_regs = _num_words_to_num_packed_regs(xm_patch_pos_words);
1764dd0b6b1fSRichard Fitzgerald reg_addr = cs_dsp_mock_base_addr_for_mem(priv, WMFW_HALO_XM_PACKED) +
1765dd0b6b1fSRichard Fitzgerald (patch_pos_in_packed_regs * 4);
1766dd0b6b1fSRichard Fitzgerald memset(readback, 0, sizeof(readback));
1767dd0b6b1fSRichard Fitzgerald KUNIT_EXPECT_EQ(test,
1768dd0b6b1fSRichard Fitzgerald regmap_raw_read(priv->dsp->regmap, reg_addr, readback, sizeof(readback)),
1769dd0b6b1fSRichard Fitzgerald 0);
1770dd0b6b1fSRichard Fitzgerald KUNIT_EXPECT_MEMEQ(test, readback, packed_xm_payload, sizeof(packed_xm_payload));
1771dd0b6b1fSRichard Fitzgerald
1772dd0b6b1fSRichard Fitzgerald /* Drop expected writes from the cache */
1773dd0b6b1fSRichard Fitzgerald cs_dsp_mock_regmap_drop_bytes(priv, reg_addr, sizeof(packed_xm_payload));
1774dd0b6b1fSRichard Fitzgerald
1775dd0b6b1fSRichard Fitzgerald /* Content of packed YM registers should match packed_ym_payload */
1776dd0b6b1fSRichard Fitzgerald patch_pos_in_packed_regs = _num_words_to_num_packed_regs(ym_patch_pos_words);
1777dd0b6b1fSRichard Fitzgerald reg_addr = cs_dsp_mock_base_addr_for_mem(priv, WMFW_HALO_YM_PACKED) +
1778dd0b6b1fSRichard Fitzgerald (patch_pos_in_packed_regs * 4);
1779dd0b6b1fSRichard Fitzgerald memset(readback, 0, sizeof(readback));
1780dd0b6b1fSRichard Fitzgerald KUNIT_EXPECT_EQ(test,
1781dd0b6b1fSRichard Fitzgerald regmap_raw_read(priv->dsp->regmap, reg_addr, readback, sizeof(readback)),
1782dd0b6b1fSRichard Fitzgerald 0);
1783dd0b6b1fSRichard Fitzgerald KUNIT_EXPECT_MEMEQ(test, readback, packed_ym_payload, sizeof(packed_ym_payload));
1784dd0b6b1fSRichard Fitzgerald
1785dd0b6b1fSRichard Fitzgerald /* Drop expected writes from the cache */
1786dd0b6b1fSRichard Fitzgerald cs_dsp_mock_regmap_drop_bytes(priv, reg_addr, sizeof(packed_ym_payload));
1787dd0b6b1fSRichard Fitzgerald
1788dd0b6b1fSRichard Fitzgerald /* Drop expected writes and the cache should then be clean */
1789dd0b6b1fSRichard Fitzgerald cs_dsp_mock_xm_header_drop_from_regmap_cache(priv);
1790dd0b6b1fSRichard Fitzgerald KUNIT_EXPECT_FALSE(test, cs_dsp_mock_regmap_is_dirty(priv, true));
1791dd0b6b1fSRichard Fitzgerald }
1792dd0b6b1fSRichard Fitzgerald
1793dd0b6b1fSRichard Fitzgerald /*
1794dd0b6b1fSRichard Fitzgerald * bin file that patches a single packed block in multiple algorithms.
1795dd0b6b1fSRichard Fitzgerald */
bin_patch_1_packed_multiple_algs(struct kunit * test)1796dd0b6b1fSRichard Fitzgerald static void bin_patch_1_packed_multiple_algs(struct kunit *test)
1797dd0b6b1fSRichard Fitzgerald {
1798dd0b6b1fSRichard Fitzgerald struct cs_dsp_test *priv = test->priv;
1799dd0b6b1fSRichard Fitzgerald const struct bin_test_param *param = test->param_value;
1800dd0b6b1fSRichard Fitzgerald u32 packed_payload[ARRAY_SIZE(bin_test_mock_algs)][3];
1801dd0b6b1fSRichard Fitzgerald u32 readback[ARRAY_SIZE(bin_test_mock_algs)][3];
1802dd0b6b1fSRichard Fitzgerald unsigned int alg_base_words, patch_pos_words;
1803dd0b6b1fSRichard Fitzgerald unsigned int alg_base_in_packed_regs, patch_pos_in_packed_regs;
1804dd0b6b1fSRichard Fitzgerald unsigned int reg_addr, payload_offset;
1805dd0b6b1fSRichard Fitzgerald struct firmware *fw;
1806dd0b6b1fSRichard Fitzgerald int i;
1807dd0b6b1fSRichard Fitzgerald
1808dd0b6b1fSRichard Fitzgerald static_assert(sizeof(readback) == sizeof(packed_payload));
1809dd0b6b1fSRichard Fitzgerald
1810dd0b6b1fSRichard Fitzgerald get_random_bytes(packed_payload, sizeof(packed_payload));
1811dd0b6b1fSRichard Fitzgerald
1812dd0b6b1fSRichard Fitzgerald /* For each algorithm patch one DSP word to a value from packed_payload */
1813dd0b6b1fSRichard Fitzgerald for (i = 0; i < ARRAY_SIZE(bin_test_mock_algs); ++i) {
1814dd0b6b1fSRichard Fitzgerald alg_base_words = cs_dsp_mock_xm_header_get_alg_base_in_words(priv,
1815dd0b6b1fSRichard Fitzgerald bin_test_mock_algs[i].id,
1816dd0b6b1fSRichard Fitzgerald param->mem_type);
1817dd0b6b1fSRichard Fitzgerald alg_base_in_packed_regs = _num_words_to_num_packed_regs(alg_base_words);
1818dd0b6b1fSRichard Fitzgerald
1819dd0b6b1fSRichard Fitzgerald /* Round patch start word up to a packed boundary */
1820dd0b6b1fSRichard Fitzgerald patch_pos_words = round_up(alg_base_words + param->offset_words, 4);
1821dd0b6b1fSRichard Fitzgerald patch_pos_in_packed_regs = _num_words_to_num_packed_regs(patch_pos_words);
1822dd0b6b1fSRichard Fitzgerald
1823dd0b6b1fSRichard Fitzgerald payload_offset = (patch_pos_in_packed_regs - alg_base_in_packed_regs) * 4;
1824dd0b6b1fSRichard Fitzgerald cs_dsp_mock_bin_add_patch(priv->local->bin_builder,
1825dd0b6b1fSRichard Fitzgerald bin_test_mock_algs[i].id,
1826dd0b6b1fSRichard Fitzgerald bin_test_mock_algs[i].ver,
1827dd0b6b1fSRichard Fitzgerald param->mem_type,
1828dd0b6b1fSRichard Fitzgerald payload_offset,
1829dd0b6b1fSRichard Fitzgerald packed_payload[i], sizeof(packed_payload[i]));
1830dd0b6b1fSRichard Fitzgerald }
1831dd0b6b1fSRichard Fitzgerald
1832dd0b6b1fSRichard Fitzgerald fw = cs_dsp_mock_bin_get_firmware(priv->local->bin_builder);
1833dd0b6b1fSRichard Fitzgerald KUNIT_ASSERT_EQ(test,
1834dd0b6b1fSRichard Fitzgerald cs_dsp_power_up(priv->dsp, priv->local->wmfw, "mock_wmfw",
1835dd0b6b1fSRichard Fitzgerald fw, "mock_bin", "misc"),
1836dd0b6b1fSRichard Fitzgerald 0);
1837dd0b6b1fSRichard Fitzgerald
1838dd0b6b1fSRichard Fitzgerald memset(readback, 0, sizeof(readback));
1839dd0b6b1fSRichard Fitzgerald
1840dd0b6b1fSRichard Fitzgerald /*
1841dd0b6b1fSRichard Fitzgerald * Readback the registers that should have been written. Place
1842dd0b6b1fSRichard Fitzgerald * the values into the expected location in readback[] so that
1843dd0b6b1fSRichard Fitzgerald * the content of readback[] should match packed_payload[]
1844dd0b6b1fSRichard Fitzgerald */
1845dd0b6b1fSRichard Fitzgerald for (i = 0; i < ARRAY_SIZE(bin_test_mock_algs); ++i) {
1846dd0b6b1fSRichard Fitzgerald alg_base_words = cs_dsp_mock_xm_header_get_alg_base_in_words(priv,
1847dd0b6b1fSRichard Fitzgerald bin_test_mock_algs[i].id,
1848dd0b6b1fSRichard Fitzgerald param->mem_type);
1849dd0b6b1fSRichard Fitzgerald alg_base_in_packed_regs = _num_words_to_num_packed_regs(alg_base_words);
1850dd0b6b1fSRichard Fitzgerald
1851dd0b6b1fSRichard Fitzgerald patch_pos_words = round_up(alg_base_words + param->offset_words, 4);
1852dd0b6b1fSRichard Fitzgerald patch_pos_in_packed_regs = _num_words_to_num_packed_regs(patch_pos_words);
1853dd0b6b1fSRichard Fitzgerald
1854dd0b6b1fSRichard Fitzgerald reg_addr = cs_dsp_mock_base_addr_for_mem(priv, param->mem_type) +
1855dd0b6b1fSRichard Fitzgerald (patch_pos_in_packed_regs * 4);
1856dd0b6b1fSRichard Fitzgerald KUNIT_EXPECT_EQ(test,
1857dd0b6b1fSRichard Fitzgerald regmap_raw_read(priv->dsp->regmap, reg_addr,
1858dd0b6b1fSRichard Fitzgerald readback[i], sizeof(readback[i])),
1859dd0b6b1fSRichard Fitzgerald 0);
1860dd0b6b1fSRichard Fitzgerald
1861dd0b6b1fSRichard Fitzgerald /* Drop expected writes from the cache */
1862dd0b6b1fSRichard Fitzgerald cs_dsp_mock_regmap_drop_bytes(priv, reg_addr, sizeof(packed_payload[i]));
1863dd0b6b1fSRichard Fitzgerald }
1864dd0b6b1fSRichard Fitzgerald
1865dd0b6b1fSRichard Fitzgerald KUNIT_EXPECT_MEMEQ(test, readback, packed_payload, sizeof(packed_payload));
1866dd0b6b1fSRichard Fitzgerald
1867dd0b6b1fSRichard Fitzgerald /* Drop expected writes and the cache should then be clean */
1868dd0b6b1fSRichard Fitzgerald cs_dsp_mock_xm_header_drop_from_regmap_cache(priv);
1869dd0b6b1fSRichard Fitzgerald KUNIT_EXPECT_FALSE(test, cs_dsp_mock_regmap_is_dirty(priv, true));
1870dd0b6b1fSRichard Fitzgerald }
1871dd0b6b1fSRichard Fitzgerald
1872dd0b6b1fSRichard Fitzgerald /*
1873dd0b6b1fSRichard Fitzgerald * bin file that patches a single packed block in multiple algorithms.
1874dd0b6b1fSRichard Fitzgerald * The algorithms are not patched in the same order they appear in the XM header.
1875dd0b6b1fSRichard Fitzgerald */
bin_patch_1_packed_multiple_algs_unordered(struct kunit * test)1876dd0b6b1fSRichard Fitzgerald static void bin_patch_1_packed_multiple_algs_unordered(struct kunit *test)
1877dd0b6b1fSRichard Fitzgerald {
1878dd0b6b1fSRichard Fitzgerald struct cs_dsp_test *priv = test->priv;
1879dd0b6b1fSRichard Fitzgerald const struct bin_test_param *param = test->param_value;
1880dd0b6b1fSRichard Fitzgerald static const u8 alg_order[] = { 3, 0, 2, 1 };
1881dd0b6b1fSRichard Fitzgerald u32 packed_payload[ARRAY_SIZE(bin_test_mock_algs)][3];
1882dd0b6b1fSRichard Fitzgerald u32 readback[ARRAY_SIZE(bin_test_mock_algs)][3];
1883dd0b6b1fSRichard Fitzgerald unsigned int alg_base_words, patch_pos_words;
1884dd0b6b1fSRichard Fitzgerald unsigned int alg_base_in_packed_regs, patch_pos_in_packed_regs;
1885dd0b6b1fSRichard Fitzgerald unsigned int reg_addr, payload_offset;
1886dd0b6b1fSRichard Fitzgerald struct firmware *fw;
1887dd0b6b1fSRichard Fitzgerald int i, alg_idx;
1888dd0b6b1fSRichard Fitzgerald
1889dd0b6b1fSRichard Fitzgerald static_assert(ARRAY_SIZE(alg_order) == ARRAY_SIZE(bin_test_mock_algs));
1890dd0b6b1fSRichard Fitzgerald static_assert(sizeof(readback) == sizeof(packed_payload));
1891dd0b6b1fSRichard Fitzgerald
1892dd0b6b1fSRichard Fitzgerald get_random_bytes(packed_payload, sizeof(packed_payload));
1893dd0b6b1fSRichard Fitzgerald
1894dd0b6b1fSRichard Fitzgerald /*
1895dd0b6b1fSRichard Fitzgerald * For each algorithm index in alg_order[] patch one DSP word in
1896dd0b6b1fSRichard Fitzgerald * that algorithm to a value from packed_payload.
1897dd0b6b1fSRichard Fitzgerald */
1898dd0b6b1fSRichard Fitzgerald for (i = 0; i < ARRAY_SIZE(alg_order); ++i) {
1899dd0b6b1fSRichard Fitzgerald alg_idx = alg_order[i];
1900dd0b6b1fSRichard Fitzgerald alg_base_words = cs_dsp_mock_xm_header_get_alg_base_in_words(priv,
1901dd0b6b1fSRichard Fitzgerald bin_test_mock_algs[alg_idx].id,
1902dd0b6b1fSRichard Fitzgerald param->mem_type);
1903dd0b6b1fSRichard Fitzgerald alg_base_in_packed_regs = _num_words_to_num_packed_regs(alg_base_words);
1904dd0b6b1fSRichard Fitzgerald
1905dd0b6b1fSRichard Fitzgerald /* Round patch start word up to a packed boundary */
1906dd0b6b1fSRichard Fitzgerald patch_pos_words = round_up(alg_base_words + param->offset_words, 4);
1907dd0b6b1fSRichard Fitzgerald patch_pos_in_packed_regs = _num_words_to_num_packed_regs(patch_pos_words);
1908dd0b6b1fSRichard Fitzgerald
1909dd0b6b1fSRichard Fitzgerald payload_offset = (patch_pos_in_packed_regs - alg_base_in_packed_regs) * 4;
1910dd0b6b1fSRichard Fitzgerald cs_dsp_mock_bin_add_patch(priv->local->bin_builder,
1911dd0b6b1fSRichard Fitzgerald bin_test_mock_algs[alg_idx].id,
1912dd0b6b1fSRichard Fitzgerald bin_test_mock_algs[alg_idx].ver,
1913dd0b6b1fSRichard Fitzgerald param->mem_type,
1914dd0b6b1fSRichard Fitzgerald payload_offset,
1915dd0b6b1fSRichard Fitzgerald packed_payload[i], sizeof(packed_payload[i]));
1916dd0b6b1fSRichard Fitzgerald }
1917dd0b6b1fSRichard Fitzgerald
1918dd0b6b1fSRichard Fitzgerald fw = cs_dsp_mock_bin_get_firmware(priv->local->bin_builder);
1919dd0b6b1fSRichard Fitzgerald KUNIT_ASSERT_EQ(test,
1920dd0b6b1fSRichard Fitzgerald cs_dsp_power_up(priv->dsp, priv->local->wmfw, "mock_wmfw",
1921dd0b6b1fSRichard Fitzgerald fw, "mock_bin", "misc"),
1922dd0b6b1fSRichard Fitzgerald 0);
1923dd0b6b1fSRichard Fitzgerald
1924dd0b6b1fSRichard Fitzgerald memset(readback, 0, sizeof(readback));
1925dd0b6b1fSRichard Fitzgerald
1926dd0b6b1fSRichard Fitzgerald /*
1927dd0b6b1fSRichard Fitzgerald * Readback the registers that should have been written. Place
1928dd0b6b1fSRichard Fitzgerald * the values into the expected location in readback[] so that
1929dd0b6b1fSRichard Fitzgerald * the content of readback[] should match packed_payload[]
1930dd0b6b1fSRichard Fitzgerald */
1931dd0b6b1fSRichard Fitzgerald for (i = 0; i < ARRAY_SIZE(alg_order); ++i) {
1932dd0b6b1fSRichard Fitzgerald alg_idx = alg_order[i];
1933dd0b6b1fSRichard Fitzgerald alg_base_words = cs_dsp_mock_xm_header_get_alg_base_in_words(priv,
1934dd0b6b1fSRichard Fitzgerald bin_test_mock_algs[alg_idx].id,
1935dd0b6b1fSRichard Fitzgerald param->mem_type);
1936dd0b6b1fSRichard Fitzgerald
1937dd0b6b1fSRichard Fitzgerald patch_pos_words = round_up(alg_base_words + param->offset_words, 4);
1938dd0b6b1fSRichard Fitzgerald patch_pos_in_packed_regs = _num_words_to_num_packed_regs(patch_pos_words);
1939dd0b6b1fSRichard Fitzgerald
1940dd0b6b1fSRichard Fitzgerald reg_addr = cs_dsp_mock_base_addr_for_mem(priv, param->mem_type) +
1941dd0b6b1fSRichard Fitzgerald (patch_pos_in_packed_regs * 4);
1942dd0b6b1fSRichard Fitzgerald KUNIT_EXPECT_EQ(test,
1943dd0b6b1fSRichard Fitzgerald regmap_raw_read(priv->dsp->regmap, reg_addr,
1944dd0b6b1fSRichard Fitzgerald readback[i], sizeof(readback[i])),
1945dd0b6b1fSRichard Fitzgerald 0);
1946dd0b6b1fSRichard Fitzgerald
1947dd0b6b1fSRichard Fitzgerald /* Drop expected writes from the cache */
1948dd0b6b1fSRichard Fitzgerald cs_dsp_mock_regmap_drop_bytes(priv, reg_addr, sizeof(packed_payload[i]));
1949dd0b6b1fSRichard Fitzgerald }
1950dd0b6b1fSRichard Fitzgerald
1951dd0b6b1fSRichard Fitzgerald KUNIT_EXPECT_MEMEQ(test, readback, packed_payload, sizeof(packed_payload));
1952dd0b6b1fSRichard Fitzgerald
1953dd0b6b1fSRichard Fitzgerald /* Drop expected writes and the cache should then be clean */
1954dd0b6b1fSRichard Fitzgerald cs_dsp_mock_xm_header_drop_from_regmap_cache(priv);
1955dd0b6b1fSRichard Fitzgerald KUNIT_EXPECT_FALSE(test, cs_dsp_mock_regmap_is_dirty(priv, true));
1956dd0b6b1fSRichard Fitzgerald }
1957dd0b6b1fSRichard Fitzgerald
1958dd0b6b1fSRichard Fitzgerald /*
1959dd0b6b1fSRichard Fitzgerald * bin file that contains a mix of packed and unpacked words.
1960dd0b6b1fSRichard Fitzgerald * payloads are in random offset order. Offsets that are on a packed boundary
1961dd0b6b1fSRichard Fitzgerald * are written as a packed block. Offsets that are not on a packed boundary
1962dd0b6b1fSRichard Fitzgerald * are written as a single unpacked word.
1963dd0b6b1fSRichard Fitzgerald */
bin_patch_mixed_packed_unpacked_random(struct kunit * test)1964dd0b6b1fSRichard Fitzgerald static void bin_patch_mixed_packed_unpacked_random(struct kunit *test)
1965dd0b6b1fSRichard Fitzgerald {
1966dd0b6b1fSRichard Fitzgerald struct cs_dsp_test *priv = test->priv;
1967dd0b6b1fSRichard Fitzgerald const struct bin_test_param *param = test->param_value;
1968dd0b6b1fSRichard Fitzgerald static const u8 offset_words[] = {
1969dd0b6b1fSRichard Fitzgerald 58, 68, 50, 10, 44, 17, 74, 36, 8, 7, 49, 11, 78, 57, 65, 2,
1970dd0b6b1fSRichard Fitzgerald 48, 38, 22, 70, 77, 21, 61, 56, 75, 34, 27, 3, 31, 20, 43, 63,
1971dd0b6b1fSRichard Fitzgerald 5, 30, 32, 25, 33, 79, 29, 0, 37, 60, 69, 52, 13, 12, 24, 26,
1972dd0b6b1fSRichard Fitzgerald 4, 51, 76, 72, 16, 6, 39, 62, 15, 41, 28, 73, 53, 40, 45, 54,
1973dd0b6b1fSRichard Fitzgerald 14, 55, 46, 66, 64, 59, 23, 9, 67, 47, 19, 71, 35, 18, 42, 1,
1974dd0b6b1fSRichard Fitzgerald };
1975b0e4e203SArnd Bergmann struct {
1976b0e4e203SArnd Bergmann u32 packed[80][3];
1977b0e4e203SArnd Bergmann u32 unpacked[80];
1978b0e4e203SArnd Bergmann } *payload;
1979dd0b6b1fSRichard Fitzgerald u32 readback[3];
1980dd0b6b1fSRichard Fitzgerald unsigned int alg_base_words, patch_pos_words;
1981dd0b6b1fSRichard Fitzgerald unsigned int alg_base_in_packed_regs, patch_pos_in_packed_regs;
1982dd0b6b1fSRichard Fitzgerald unsigned int reg_addr, payload_offset;
1983dd0b6b1fSRichard Fitzgerald int unpacked_mem_type = cs_dsp_mock_packed_to_unpacked_mem_type(param->mem_type);
1984dd0b6b1fSRichard Fitzgerald struct firmware *fw;
1985dd0b6b1fSRichard Fitzgerald int i;
1986dd0b6b1fSRichard Fitzgerald
1987b0e4e203SArnd Bergmann payload = kunit_kmalloc(test, sizeof(*payload), GFP_KERNEL);
1988b0e4e203SArnd Bergmann KUNIT_ASSERT_NOT_NULL(test, payload);
1989b0e4e203SArnd Bergmann
1990b0e4e203SArnd Bergmann get_random_bytes(payload->packed, sizeof(payload->packed));
1991b0e4e203SArnd Bergmann get_random_bytes(payload->unpacked, sizeof(payload->unpacked));
1992dd0b6b1fSRichard Fitzgerald
1993dd0b6b1fSRichard Fitzgerald /* Create a patch entry for every offset in offset_words[] */
1994dd0b6b1fSRichard Fitzgerald for (i = 0; i < ARRAY_SIZE(offset_words); ++i) {
1995dd0b6b1fSRichard Fitzgerald alg_base_words = cs_dsp_mock_xm_header_get_alg_base_in_words(priv,
1996dd0b6b1fSRichard Fitzgerald bin_test_mock_algs[0].id,
1997dd0b6b1fSRichard Fitzgerald param->mem_type);
1998dd0b6b1fSRichard Fitzgerald /*
1999dd0b6b1fSRichard Fitzgerald * If the offset is on a packed boundary use a packed payload else
2000dd0b6b1fSRichard Fitzgerald * use an unpacked word
2001dd0b6b1fSRichard Fitzgerald */
2002dd0b6b1fSRichard Fitzgerald patch_pos_words = alg_base_words + offset_words[i];
2003dd0b6b1fSRichard Fitzgerald if ((patch_pos_words % 4) == 0) {
2004dd0b6b1fSRichard Fitzgerald alg_base_in_packed_regs = _num_words_to_num_packed_regs(alg_base_words);
2005dd0b6b1fSRichard Fitzgerald patch_pos_in_packed_regs = _num_words_to_num_packed_regs(patch_pos_words);
2006dd0b6b1fSRichard Fitzgerald payload_offset = (patch_pos_in_packed_regs - alg_base_in_packed_regs) * 4;
2007dd0b6b1fSRichard Fitzgerald cs_dsp_mock_bin_add_patch(priv->local->bin_builder,
2008dd0b6b1fSRichard Fitzgerald bin_test_mock_algs[0].id,
2009dd0b6b1fSRichard Fitzgerald bin_test_mock_algs[0].ver,
2010dd0b6b1fSRichard Fitzgerald param->mem_type,
2011dd0b6b1fSRichard Fitzgerald payload_offset,
2012b0e4e203SArnd Bergmann payload->packed[i],
2013b0e4e203SArnd Bergmann sizeof(payload->packed[i]));
2014dd0b6b1fSRichard Fitzgerald } else {
2015dd0b6b1fSRichard Fitzgerald payload_offset = offset_words[i] * 4;
2016dd0b6b1fSRichard Fitzgerald cs_dsp_mock_bin_add_patch(priv->local->bin_builder,
2017dd0b6b1fSRichard Fitzgerald bin_test_mock_algs[0].id,
2018dd0b6b1fSRichard Fitzgerald bin_test_mock_algs[0].ver,
2019dd0b6b1fSRichard Fitzgerald unpacked_mem_type,
2020dd0b6b1fSRichard Fitzgerald payload_offset,
2021b0e4e203SArnd Bergmann &payload->unpacked[i],
2022b0e4e203SArnd Bergmann sizeof(payload->unpacked[i]));
2023dd0b6b1fSRichard Fitzgerald }
2024dd0b6b1fSRichard Fitzgerald }
2025dd0b6b1fSRichard Fitzgerald
2026dd0b6b1fSRichard Fitzgerald fw = cs_dsp_mock_bin_get_firmware(priv->local->bin_builder);
2027dd0b6b1fSRichard Fitzgerald KUNIT_ASSERT_EQ(test,
2028dd0b6b1fSRichard Fitzgerald cs_dsp_power_up(priv->dsp, priv->local->wmfw, "mock_wmfw",
2029dd0b6b1fSRichard Fitzgerald fw, "mock_bin", "misc"),
2030dd0b6b1fSRichard Fitzgerald 0);
2031dd0b6b1fSRichard Fitzgerald
2032dd0b6b1fSRichard Fitzgerald /*
2033dd0b6b1fSRichard Fitzgerald * Readback the packed registers that should have been written.
2034dd0b6b1fSRichard Fitzgerald * Place the values into the expected location in readback[] so
2035b0e4e203SArnd Bergmann * that the content of readback[] should match payload->packed[]
2036dd0b6b1fSRichard Fitzgerald */
2037dd0b6b1fSRichard Fitzgerald for (i = 0; i < ARRAY_SIZE(offset_words); ++i) {
2038dd0b6b1fSRichard Fitzgerald alg_base_words = cs_dsp_mock_xm_header_get_alg_base_in_words(priv,
2039dd0b6b1fSRichard Fitzgerald bin_test_mock_algs[0].id,
2040dd0b6b1fSRichard Fitzgerald param->mem_type);
2041dd0b6b1fSRichard Fitzgerald patch_pos_words = alg_base_words + offset_words[i];
2042dd0b6b1fSRichard Fitzgerald
2043dd0b6b1fSRichard Fitzgerald /* Skip if the offset is not on a packed boundary */
2044dd0b6b1fSRichard Fitzgerald if ((patch_pos_words % 4) != 0)
2045dd0b6b1fSRichard Fitzgerald continue;
2046dd0b6b1fSRichard Fitzgerald
2047dd0b6b1fSRichard Fitzgerald patch_pos_in_packed_regs = _num_words_to_num_packed_regs(patch_pos_words);
2048dd0b6b1fSRichard Fitzgerald
2049dd0b6b1fSRichard Fitzgerald reg_addr = cs_dsp_mock_base_addr_for_mem(priv, param->mem_type) +
2050dd0b6b1fSRichard Fitzgerald (patch_pos_in_packed_regs * 4);
2051dd0b6b1fSRichard Fitzgerald
2052dd0b6b1fSRichard Fitzgerald memset(readback, 0, sizeof(readback));
2053dd0b6b1fSRichard Fitzgerald KUNIT_EXPECT_EQ(test,
2054dd0b6b1fSRichard Fitzgerald regmap_raw_read(priv->dsp->regmap, reg_addr, readback,
2055dd0b6b1fSRichard Fitzgerald sizeof(readback)),
2056dd0b6b1fSRichard Fitzgerald 0);
2057b0e4e203SArnd Bergmann KUNIT_EXPECT_MEMEQ(test, readback, payload->packed[i], sizeof(payload->packed[i]));
2058dd0b6b1fSRichard Fitzgerald
2059dd0b6b1fSRichard Fitzgerald /* Drop expected writes from the cache */
2060b0e4e203SArnd Bergmann cs_dsp_mock_regmap_drop_bytes(priv, reg_addr, sizeof(payload->packed[i]));
2061dd0b6b1fSRichard Fitzgerald }
2062dd0b6b1fSRichard Fitzgerald
2063dd0b6b1fSRichard Fitzgerald /*
2064dd0b6b1fSRichard Fitzgerald * Readback the unpacked registers that should have been written.
2065dd0b6b1fSRichard Fitzgerald * Place the values into the expected location in readback[] so
2066b0e4e203SArnd Bergmann * that the content of readback[] should match payload->unpacked[]
2067dd0b6b1fSRichard Fitzgerald */
2068dd0b6b1fSRichard Fitzgerald for (i = 0; i < ARRAY_SIZE(offset_words); ++i) {
2069dd0b6b1fSRichard Fitzgerald alg_base_words = cs_dsp_mock_xm_header_get_alg_base_in_words(priv,
2070dd0b6b1fSRichard Fitzgerald bin_test_mock_algs[0].id,
2071dd0b6b1fSRichard Fitzgerald unpacked_mem_type);
2072dd0b6b1fSRichard Fitzgerald
2073dd0b6b1fSRichard Fitzgerald patch_pos_words = alg_base_words + offset_words[i];
2074dd0b6b1fSRichard Fitzgerald
2075dd0b6b1fSRichard Fitzgerald /* Skip if the offset is on a packed boundary */
2076dd0b6b1fSRichard Fitzgerald if ((patch_pos_words % 4) == 0)
2077dd0b6b1fSRichard Fitzgerald continue;
2078dd0b6b1fSRichard Fitzgerald
2079dd0b6b1fSRichard Fitzgerald reg_addr = cs_dsp_mock_base_addr_for_mem(priv, unpacked_mem_type) +
2080dd0b6b1fSRichard Fitzgerald ((patch_pos_words) * 4);
2081dd0b6b1fSRichard Fitzgerald
2082dd0b6b1fSRichard Fitzgerald readback[0] = 0;
2083dd0b6b1fSRichard Fitzgerald KUNIT_EXPECT_EQ(test,
2084dd0b6b1fSRichard Fitzgerald regmap_raw_read(priv->dsp->regmap, reg_addr,
2085dd0b6b1fSRichard Fitzgerald &readback[0], sizeof(readback[0])),
2086dd0b6b1fSRichard Fitzgerald 0);
2087b0e4e203SArnd Bergmann KUNIT_EXPECT_EQ(test, readback[0], payload->unpacked[i]);
2088dd0b6b1fSRichard Fitzgerald
2089dd0b6b1fSRichard Fitzgerald /* Drop expected writes from the cache */
2090b0e4e203SArnd Bergmann cs_dsp_mock_regmap_drop_bytes(priv, reg_addr, sizeof(payload->unpacked[i]));
2091dd0b6b1fSRichard Fitzgerald }
2092dd0b6b1fSRichard Fitzgerald
2093dd0b6b1fSRichard Fitzgerald /* Drop expected writes and the cache should then be clean */
2094dd0b6b1fSRichard Fitzgerald cs_dsp_mock_xm_header_drop_from_regmap_cache(priv);
2095dd0b6b1fSRichard Fitzgerald KUNIT_EXPECT_FALSE(test, cs_dsp_mock_regmap_is_dirty(priv, true));
2096dd0b6b1fSRichard Fitzgerald }
2097dd0b6b1fSRichard Fitzgerald
2098dd0b6b1fSRichard Fitzgerald /* Bin file with name and multiple info blocks */
bin_patch_name_and_info(struct kunit * test)2099dd0b6b1fSRichard Fitzgerald static void bin_patch_name_and_info(struct kunit *test)
2100dd0b6b1fSRichard Fitzgerald {
2101dd0b6b1fSRichard Fitzgerald struct cs_dsp_test *priv = test->priv;
2102dd0b6b1fSRichard Fitzgerald unsigned int reg_inc_per_word = cs_dsp_mock_reg_addr_inc_per_unpacked_word(priv);
2103dd0b6b1fSRichard Fitzgerald u32 reg_val, payload_data;
2104dd0b6b1fSRichard Fitzgerald char *infobuf;
2105dd0b6b1fSRichard Fitzgerald unsigned int alg_base_words, reg_addr;
2106dd0b6b1fSRichard Fitzgerald struct firmware *fw;
2107dd0b6b1fSRichard Fitzgerald
2108dd0b6b1fSRichard Fitzgerald get_random_bytes(&payload_data, sizeof(payload_data));
2109dd0b6b1fSRichard Fitzgerald
2110dd0b6b1fSRichard Fitzgerald alg_base_words = cs_dsp_mock_xm_header_get_alg_base_in_words(priv,
2111dd0b6b1fSRichard Fitzgerald bin_test_mock_algs[0].id,
2112dd0b6b1fSRichard Fitzgerald WMFW_ADSP2_YM);
2113dd0b6b1fSRichard Fitzgerald
2114dd0b6b1fSRichard Fitzgerald /* Add a name block and info block */
2115dd0b6b1fSRichard Fitzgerald cs_dsp_mock_bin_add_name(priv->local->bin_builder, "The name");
2116dd0b6b1fSRichard Fitzgerald cs_dsp_mock_bin_add_info(priv->local->bin_builder, "Some info");
2117dd0b6b1fSRichard Fitzgerald
2118dd0b6b1fSRichard Fitzgerald /* Add a big block of info */
2119dd0b6b1fSRichard Fitzgerald infobuf = kunit_kzalloc(test, 512, GFP_KERNEL);
2120dd0b6b1fSRichard Fitzgerald KUNIT_ASSERT_NOT_ERR_OR_NULL(test, infobuf);
2121dd0b6b1fSRichard Fitzgerald
2122dd0b6b1fSRichard Fitzgerald for (; strlcat(infobuf, "Waffle{Blah}\n", 512) < 512; )
2123dd0b6b1fSRichard Fitzgerald ;
2124dd0b6b1fSRichard Fitzgerald
2125dd0b6b1fSRichard Fitzgerald cs_dsp_mock_bin_add_info(priv->local->bin_builder, infobuf);
2126dd0b6b1fSRichard Fitzgerald
2127dd0b6b1fSRichard Fitzgerald /* Add a patch */
2128dd0b6b1fSRichard Fitzgerald cs_dsp_mock_bin_add_patch(priv->local->bin_builder,
2129dd0b6b1fSRichard Fitzgerald bin_test_mock_algs[0].id,
2130dd0b6b1fSRichard Fitzgerald bin_test_mock_algs[0].ver,
2131dd0b6b1fSRichard Fitzgerald WMFW_ADSP2_YM,
2132dd0b6b1fSRichard Fitzgerald 0,
2133dd0b6b1fSRichard Fitzgerald &payload_data, sizeof(payload_data));
2134dd0b6b1fSRichard Fitzgerald
2135dd0b6b1fSRichard Fitzgerald fw = cs_dsp_mock_bin_get_firmware(priv->local->bin_builder);
2136dd0b6b1fSRichard Fitzgerald KUNIT_ASSERT_EQ(test,
2137dd0b6b1fSRichard Fitzgerald cs_dsp_power_up(priv->dsp, priv->local->wmfw, "mock_wmfw",
2138dd0b6b1fSRichard Fitzgerald fw, "mock_bin", "misc"),
2139dd0b6b1fSRichard Fitzgerald 0);
2140dd0b6b1fSRichard Fitzgerald
2141dd0b6b1fSRichard Fitzgerald /* Content of registers should match payload_data */
2142dd0b6b1fSRichard Fitzgerald reg_addr = cs_dsp_mock_base_addr_for_mem(priv, WMFW_ADSP2_YM);
2143dd0b6b1fSRichard Fitzgerald reg_addr += alg_base_words * reg_inc_per_word;
2144dd0b6b1fSRichard Fitzgerald reg_val = 0;
2145dd0b6b1fSRichard Fitzgerald KUNIT_EXPECT_EQ(test,
2146dd0b6b1fSRichard Fitzgerald regmap_raw_read(priv->dsp->regmap, reg_addr,
2147dd0b6b1fSRichard Fitzgerald ®_val, sizeof(reg_val)),
2148dd0b6b1fSRichard Fitzgerald 0);
2149dd0b6b1fSRichard Fitzgerald KUNIT_EXPECT_EQ(test, reg_val, payload_data);
2150dd0b6b1fSRichard Fitzgerald }
2151dd0b6b1fSRichard Fitzgerald
cs_dsp_bin_test_common_init(struct kunit * test,struct cs_dsp * dsp)2152dd0b6b1fSRichard Fitzgerald static int cs_dsp_bin_test_common_init(struct kunit *test, struct cs_dsp *dsp)
2153dd0b6b1fSRichard Fitzgerald {
2154dd0b6b1fSRichard Fitzgerald struct cs_dsp_test *priv;
2155dd0b6b1fSRichard Fitzgerald struct cs_dsp_mock_xm_header *xm_hdr;
2156dd0b6b1fSRichard Fitzgerald struct device *test_dev;
2157dd0b6b1fSRichard Fitzgerald int ret;
2158dd0b6b1fSRichard Fitzgerald
2159dd0b6b1fSRichard Fitzgerald priv = kunit_kzalloc(test, sizeof(*priv), GFP_KERNEL);
2160dd0b6b1fSRichard Fitzgerald if (!priv)
2161dd0b6b1fSRichard Fitzgerald return -ENOMEM;
2162dd0b6b1fSRichard Fitzgerald
2163dd0b6b1fSRichard Fitzgerald priv->local = kunit_kzalloc(test, sizeof(struct cs_dsp_test_local), GFP_KERNEL);
2164dd0b6b1fSRichard Fitzgerald if (!priv->local)
2165dd0b6b1fSRichard Fitzgerald return -ENOMEM;
2166dd0b6b1fSRichard Fitzgerald
2167dd0b6b1fSRichard Fitzgerald priv->test = test;
2168dd0b6b1fSRichard Fitzgerald priv->dsp = dsp;
2169dd0b6b1fSRichard Fitzgerald test->priv = priv;
2170dd0b6b1fSRichard Fitzgerald
2171dd0b6b1fSRichard Fitzgerald /* Create dummy struct device */
2172dd0b6b1fSRichard Fitzgerald test_dev = kunit_device_register(test, "cs_dsp_test_drv");
2173dd0b6b1fSRichard Fitzgerald if (IS_ERR(test_dev))
2174dd0b6b1fSRichard Fitzgerald return PTR_ERR(test_dev);
2175dd0b6b1fSRichard Fitzgerald
2176dd0b6b1fSRichard Fitzgerald dsp->dev = get_device(test_dev);
2177dd0b6b1fSRichard Fitzgerald if (!dsp->dev)
2178dd0b6b1fSRichard Fitzgerald return -ENODEV;
2179dd0b6b1fSRichard Fitzgerald
2180dd0b6b1fSRichard Fitzgerald ret = kunit_add_action_or_reset(test, _put_device_wrapper, dsp->dev);
2181dd0b6b1fSRichard Fitzgerald if (ret)
2182dd0b6b1fSRichard Fitzgerald return ret;
2183dd0b6b1fSRichard Fitzgerald
2184dd0b6b1fSRichard Fitzgerald dev_set_drvdata(dsp->dev, priv);
2185dd0b6b1fSRichard Fitzgerald
2186dd0b6b1fSRichard Fitzgerald /* Allocate regmap */
2187dd0b6b1fSRichard Fitzgerald ret = cs_dsp_mock_regmap_init(priv);
2188dd0b6b1fSRichard Fitzgerald if (ret)
2189dd0b6b1fSRichard Fitzgerald return ret;
2190dd0b6b1fSRichard Fitzgerald
2191dd0b6b1fSRichard Fitzgerald /* Create an XM header */
2192dd0b6b1fSRichard Fitzgerald xm_hdr = cs_dsp_create_mock_xm_header(priv,
2193dd0b6b1fSRichard Fitzgerald bin_test_mock_algs,
2194dd0b6b1fSRichard Fitzgerald ARRAY_SIZE(bin_test_mock_algs));
2195dd0b6b1fSRichard Fitzgerald KUNIT_ASSERT_NOT_ERR_OR_NULL(test, xm_hdr);
2196dd0b6b1fSRichard Fitzgerald ret = cs_dsp_mock_xm_header_write_to_regmap(xm_hdr);
2197dd0b6b1fSRichard Fitzgerald KUNIT_ASSERT_EQ(test, ret, 0);
2198dd0b6b1fSRichard Fitzgerald
2199dd0b6b1fSRichard Fitzgerald priv->local->bin_builder =
2200dd0b6b1fSRichard Fitzgerald cs_dsp_mock_bin_init(priv, 1,
2201*285b2c74SRichard Fitzgerald cs_dsp_mock_xm_header_get_fw_version(xm_hdr));
2202dd0b6b1fSRichard Fitzgerald KUNIT_ASSERT_NOT_ERR_OR_NULL(test, priv->local->bin_builder);
2203dd0b6b1fSRichard Fitzgerald
2204dd0b6b1fSRichard Fitzgerald /* We must provide a dummy wmfw to load */
2205dd0b6b1fSRichard Fitzgerald priv->local->wmfw_builder = cs_dsp_mock_wmfw_init(priv, -1);
2206dd0b6b1fSRichard Fitzgerald priv->local->wmfw = cs_dsp_mock_wmfw_get_firmware(priv->local->wmfw_builder);
2207dd0b6b1fSRichard Fitzgerald
2208dd0b6b1fSRichard Fitzgerald dsp->client_ops = kunit_kzalloc(test, sizeof(*dsp->client_ops), GFP_KERNEL);
2209dd0b6b1fSRichard Fitzgerald KUNIT_ASSERT_NOT_ERR_OR_NULL(test, dsp->client_ops);
2210dd0b6b1fSRichard Fitzgerald
2211dd0b6b1fSRichard Fitzgerald switch (dsp->type) {
2212dd0b6b1fSRichard Fitzgerald case WMFW_ADSP2:
2213dd0b6b1fSRichard Fitzgerald ret = cs_dsp_adsp2_init(dsp);
2214dd0b6b1fSRichard Fitzgerald break;
2215dd0b6b1fSRichard Fitzgerald case WMFW_HALO:
2216dd0b6b1fSRichard Fitzgerald ret = cs_dsp_halo_init(dsp);
2217dd0b6b1fSRichard Fitzgerald break;
2218dd0b6b1fSRichard Fitzgerald default:
2219dd0b6b1fSRichard Fitzgerald KUNIT_FAIL(test, "Untested DSP type %d\n", dsp->type);
2220dd0b6b1fSRichard Fitzgerald return -EINVAL;
2221dd0b6b1fSRichard Fitzgerald }
2222dd0b6b1fSRichard Fitzgerald
2223dd0b6b1fSRichard Fitzgerald if (ret)
2224dd0b6b1fSRichard Fitzgerald return ret;
2225dd0b6b1fSRichard Fitzgerald
2226dd0b6b1fSRichard Fitzgerald /* Automatically call cs_dsp_remove() when test case ends */
2227dd0b6b1fSRichard Fitzgerald return kunit_add_action_or_reset(priv->test, _cs_dsp_remove_wrapper, dsp);
2228dd0b6b1fSRichard Fitzgerald }
2229dd0b6b1fSRichard Fitzgerald
cs_dsp_bin_test_halo_init(struct kunit * test)2230dd0b6b1fSRichard Fitzgerald static int cs_dsp_bin_test_halo_init(struct kunit *test)
2231dd0b6b1fSRichard Fitzgerald {
2232dd0b6b1fSRichard Fitzgerald struct cs_dsp *dsp;
2233dd0b6b1fSRichard Fitzgerald
2234dd0b6b1fSRichard Fitzgerald /* Fill in cs_dsp and initialize */
2235dd0b6b1fSRichard Fitzgerald dsp = kunit_kzalloc(test, sizeof(*dsp), GFP_KERNEL);
2236dd0b6b1fSRichard Fitzgerald if (!dsp)
2237dd0b6b1fSRichard Fitzgerald return -ENOMEM;
2238dd0b6b1fSRichard Fitzgerald
2239dd0b6b1fSRichard Fitzgerald dsp->num = 1;
2240dd0b6b1fSRichard Fitzgerald dsp->type = WMFW_HALO;
2241dd0b6b1fSRichard Fitzgerald dsp->mem = cs_dsp_mock_halo_dsp1_regions;
2242dd0b6b1fSRichard Fitzgerald dsp->num_mems = cs_dsp_mock_count_regions(cs_dsp_mock_halo_dsp1_region_sizes);
2243dd0b6b1fSRichard Fitzgerald dsp->base = cs_dsp_mock_halo_core_base;
2244dd0b6b1fSRichard Fitzgerald dsp->base_sysinfo = cs_dsp_mock_halo_sysinfo_base;
2245dd0b6b1fSRichard Fitzgerald
2246dd0b6b1fSRichard Fitzgerald return cs_dsp_bin_test_common_init(test, dsp);
2247dd0b6b1fSRichard Fitzgerald }
2248dd0b6b1fSRichard Fitzgerald
cs_dsp_bin_test_adsp2_32bit_init(struct kunit * test)2249dd0b6b1fSRichard Fitzgerald static int cs_dsp_bin_test_adsp2_32bit_init(struct kunit *test)
2250dd0b6b1fSRichard Fitzgerald {
2251dd0b6b1fSRichard Fitzgerald struct cs_dsp *dsp;
2252dd0b6b1fSRichard Fitzgerald
2253dd0b6b1fSRichard Fitzgerald /* Fill in cs_dsp and initialize */
2254dd0b6b1fSRichard Fitzgerald dsp = kunit_kzalloc(test, sizeof(*dsp), GFP_KERNEL);
2255dd0b6b1fSRichard Fitzgerald if (!dsp)
2256dd0b6b1fSRichard Fitzgerald return -ENOMEM;
2257dd0b6b1fSRichard Fitzgerald
2258dd0b6b1fSRichard Fitzgerald dsp->num = 1;
2259dd0b6b1fSRichard Fitzgerald dsp->type = WMFW_ADSP2;
2260dd0b6b1fSRichard Fitzgerald dsp->rev = 1;
2261dd0b6b1fSRichard Fitzgerald dsp->mem = cs_dsp_mock_adsp2_32bit_dsp1_regions;
2262dd0b6b1fSRichard Fitzgerald dsp->num_mems = cs_dsp_mock_count_regions(cs_dsp_mock_adsp2_32bit_dsp1_region_sizes);
2263dd0b6b1fSRichard Fitzgerald dsp->base = cs_dsp_mock_adsp2_32bit_sysbase;
2264dd0b6b1fSRichard Fitzgerald
2265dd0b6b1fSRichard Fitzgerald return cs_dsp_bin_test_common_init(test, dsp);
2266dd0b6b1fSRichard Fitzgerald }
2267dd0b6b1fSRichard Fitzgerald
cs_dsp_bin_test_adsp2_16bit_init(struct kunit * test)2268dd0b6b1fSRichard Fitzgerald static int cs_dsp_bin_test_adsp2_16bit_init(struct kunit *test)
2269dd0b6b1fSRichard Fitzgerald {
2270dd0b6b1fSRichard Fitzgerald struct cs_dsp *dsp;
2271dd0b6b1fSRichard Fitzgerald
2272dd0b6b1fSRichard Fitzgerald /* Fill in cs_dsp and initialize */
2273dd0b6b1fSRichard Fitzgerald dsp = kunit_kzalloc(test, sizeof(*dsp), GFP_KERNEL);
2274dd0b6b1fSRichard Fitzgerald if (!dsp)
2275dd0b6b1fSRichard Fitzgerald return -ENOMEM;
2276dd0b6b1fSRichard Fitzgerald
2277dd0b6b1fSRichard Fitzgerald dsp->num = 1;
2278dd0b6b1fSRichard Fitzgerald dsp->type = WMFW_ADSP2;
2279dd0b6b1fSRichard Fitzgerald dsp->rev = 0;
2280dd0b6b1fSRichard Fitzgerald dsp->mem = cs_dsp_mock_adsp2_16bit_dsp1_regions;
2281dd0b6b1fSRichard Fitzgerald dsp->num_mems = cs_dsp_mock_count_regions(cs_dsp_mock_adsp2_16bit_dsp1_region_sizes);
2282dd0b6b1fSRichard Fitzgerald dsp->base = cs_dsp_mock_adsp2_16bit_sysbase;
2283dd0b6b1fSRichard Fitzgerald
2284dd0b6b1fSRichard Fitzgerald return cs_dsp_bin_test_common_init(test, dsp);
2285dd0b6b1fSRichard Fitzgerald }
2286dd0b6b1fSRichard Fitzgerald
2287dd0b6b1fSRichard Fitzgerald /* Parameterize on choice of XM or YM with a range of word offsets */
2288dd0b6b1fSRichard Fitzgerald static const struct bin_test_param x_or_y_and_offset_param_cases[] = {
2289dd0b6b1fSRichard Fitzgerald { .mem_type = WMFW_ADSP2_XM, .offset_words = 0 },
2290dd0b6b1fSRichard Fitzgerald { .mem_type = WMFW_ADSP2_XM, .offset_words = 1 },
2291dd0b6b1fSRichard Fitzgerald { .mem_type = WMFW_ADSP2_XM, .offset_words = 2 },
2292dd0b6b1fSRichard Fitzgerald { .mem_type = WMFW_ADSP2_XM, .offset_words = 3 },
2293dd0b6b1fSRichard Fitzgerald { .mem_type = WMFW_ADSP2_XM, .offset_words = 4 },
2294dd0b6b1fSRichard Fitzgerald { .mem_type = WMFW_ADSP2_XM, .offset_words = 23 },
2295dd0b6b1fSRichard Fitzgerald { .mem_type = WMFW_ADSP2_XM, .offset_words = 22 },
2296dd0b6b1fSRichard Fitzgerald { .mem_type = WMFW_ADSP2_XM, .offset_words = 21 },
2297dd0b6b1fSRichard Fitzgerald { .mem_type = WMFW_ADSP2_XM, .offset_words = 20 },
2298dd0b6b1fSRichard Fitzgerald
2299dd0b6b1fSRichard Fitzgerald { .mem_type = WMFW_ADSP2_YM, .offset_words = 0 },
2300dd0b6b1fSRichard Fitzgerald { .mem_type = WMFW_ADSP2_YM, .offset_words = 1 },
2301dd0b6b1fSRichard Fitzgerald { .mem_type = WMFW_ADSP2_YM, .offset_words = 2 },
2302dd0b6b1fSRichard Fitzgerald { .mem_type = WMFW_ADSP2_YM, .offset_words = 3 },
2303dd0b6b1fSRichard Fitzgerald { .mem_type = WMFW_ADSP2_YM, .offset_words = 4 },
2304dd0b6b1fSRichard Fitzgerald { .mem_type = WMFW_ADSP2_YM, .offset_words = 23 },
2305dd0b6b1fSRichard Fitzgerald { .mem_type = WMFW_ADSP2_YM, .offset_words = 22 },
2306dd0b6b1fSRichard Fitzgerald { .mem_type = WMFW_ADSP2_YM, .offset_words = 21 },
2307dd0b6b1fSRichard Fitzgerald { .mem_type = WMFW_ADSP2_YM, .offset_words = 20 },
2308dd0b6b1fSRichard Fitzgerald };
2309dd0b6b1fSRichard Fitzgerald
2310dd0b6b1fSRichard Fitzgerald /* Parameterize on ZM with a range of word offsets */
2311dd0b6b1fSRichard Fitzgerald static const struct bin_test_param z_and_offset_param_cases[] = {
2312dd0b6b1fSRichard Fitzgerald { .mem_type = WMFW_ADSP2_ZM, .offset_words = 0 },
2313dd0b6b1fSRichard Fitzgerald { .mem_type = WMFW_ADSP2_ZM, .offset_words = 1 },
2314dd0b6b1fSRichard Fitzgerald { .mem_type = WMFW_ADSP2_ZM, .offset_words = 2 },
2315dd0b6b1fSRichard Fitzgerald { .mem_type = WMFW_ADSP2_ZM, .offset_words = 3 },
2316dd0b6b1fSRichard Fitzgerald { .mem_type = WMFW_ADSP2_ZM, .offset_words = 4 },
2317dd0b6b1fSRichard Fitzgerald { .mem_type = WMFW_ADSP2_ZM, .offset_words = 23 },
2318dd0b6b1fSRichard Fitzgerald { .mem_type = WMFW_ADSP2_ZM, .offset_words = 22 },
2319dd0b6b1fSRichard Fitzgerald { .mem_type = WMFW_ADSP2_ZM, .offset_words = 21 },
2320dd0b6b1fSRichard Fitzgerald { .mem_type = WMFW_ADSP2_ZM, .offset_words = 20 },
2321dd0b6b1fSRichard Fitzgerald };
2322dd0b6b1fSRichard Fitzgerald
2323dd0b6b1fSRichard Fitzgerald /* Parameterize on choice of packed XM or YM with a range of word offsets */
2324dd0b6b1fSRichard Fitzgerald static const struct bin_test_param packed_x_or_y_and_offset_param_cases[] = {
2325dd0b6b1fSRichard Fitzgerald { .mem_type = WMFW_HALO_XM_PACKED, .offset_words = 0 },
2326dd0b6b1fSRichard Fitzgerald { .mem_type = WMFW_HALO_XM_PACKED, .offset_words = 4 },
2327dd0b6b1fSRichard Fitzgerald { .mem_type = WMFW_HALO_XM_PACKED, .offset_words = 8 },
2328dd0b6b1fSRichard Fitzgerald { .mem_type = WMFW_HALO_XM_PACKED, .offset_words = 12 },
2329dd0b6b1fSRichard Fitzgerald
2330dd0b6b1fSRichard Fitzgerald { .mem_type = WMFW_HALO_YM_PACKED, .offset_words = 0 },
2331dd0b6b1fSRichard Fitzgerald { .mem_type = WMFW_HALO_YM_PACKED, .offset_words = 4 },
2332dd0b6b1fSRichard Fitzgerald { .mem_type = WMFW_HALO_YM_PACKED, .offset_words = 8 },
2333dd0b6b1fSRichard Fitzgerald { .mem_type = WMFW_HALO_YM_PACKED, .offset_words = 12 },
2334dd0b6b1fSRichard Fitzgerald };
2335dd0b6b1fSRichard Fitzgerald
x_or_y_or_z_and_offset_param_desc(const struct bin_test_param * param,char * desc)2336dd0b6b1fSRichard Fitzgerald static void x_or_y_or_z_and_offset_param_desc(const struct bin_test_param *param,
2337dd0b6b1fSRichard Fitzgerald char *desc)
2338dd0b6b1fSRichard Fitzgerald {
2339dd0b6b1fSRichard Fitzgerald snprintf(desc, KUNIT_PARAM_DESC_SIZE, "%s@%u",
2340dd0b6b1fSRichard Fitzgerald cs_dsp_mem_region_name(param->mem_type),
2341dd0b6b1fSRichard Fitzgerald param->offset_words);
2342dd0b6b1fSRichard Fitzgerald }
2343dd0b6b1fSRichard Fitzgerald
2344dd0b6b1fSRichard Fitzgerald KUNIT_ARRAY_PARAM(x_or_y_and_offset,
2345dd0b6b1fSRichard Fitzgerald x_or_y_and_offset_param_cases,
2346dd0b6b1fSRichard Fitzgerald x_or_y_or_z_and_offset_param_desc);
2347dd0b6b1fSRichard Fitzgerald
2348dd0b6b1fSRichard Fitzgerald KUNIT_ARRAY_PARAM(z_and_offset,
2349dd0b6b1fSRichard Fitzgerald z_and_offset_param_cases,
2350dd0b6b1fSRichard Fitzgerald x_or_y_or_z_and_offset_param_desc);
2351dd0b6b1fSRichard Fitzgerald
2352dd0b6b1fSRichard Fitzgerald KUNIT_ARRAY_PARAM(packed_x_or_y_and_offset,
2353dd0b6b1fSRichard Fitzgerald packed_x_or_y_and_offset_param_cases,
2354dd0b6b1fSRichard Fitzgerald x_or_y_or_z_and_offset_param_desc);
2355dd0b6b1fSRichard Fitzgerald
2356dd0b6b1fSRichard Fitzgerald /* Parameterize on choice of packed XM or YM */
2357dd0b6b1fSRichard Fitzgerald static const struct bin_test_param packed_x_or_y_param_cases[] = {
2358dd0b6b1fSRichard Fitzgerald { .mem_type = WMFW_HALO_XM_PACKED, .offset_words = 0 },
2359dd0b6b1fSRichard Fitzgerald { .mem_type = WMFW_HALO_YM_PACKED, .offset_words = 0 },
2360dd0b6b1fSRichard Fitzgerald };
2361dd0b6b1fSRichard Fitzgerald
x_or_y_or_z_param_desc(const struct bin_test_param * param,char * desc)2362dd0b6b1fSRichard Fitzgerald static void x_or_y_or_z_param_desc(const struct bin_test_param *param,
2363dd0b6b1fSRichard Fitzgerald char *desc)
2364dd0b6b1fSRichard Fitzgerald {
2365dd0b6b1fSRichard Fitzgerald snprintf(desc, KUNIT_PARAM_DESC_SIZE, "%s", cs_dsp_mem_region_name(param->mem_type));
2366dd0b6b1fSRichard Fitzgerald }
2367dd0b6b1fSRichard Fitzgerald
2368dd0b6b1fSRichard Fitzgerald KUNIT_ARRAY_PARAM(packed_x_or_y, packed_x_or_y_param_cases, x_or_y_or_z_param_desc);
2369dd0b6b1fSRichard Fitzgerald
2370dd0b6b1fSRichard Fitzgerald static const struct bin_test_param offset_param_cases[] = {
2371dd0b6b1fSRichard Fitzgerald { .offset_words = 0 },
2372dd0b6b1fSRichard Fitzgerald { .offset_words = 1 },
2373dd0b6b1fSRichard Fitzgerald { .offset_words = 2 },
2374dd0b6b1fSRichard Fitzgerald { .offset_words = 3 },
2375dd0b6b1fSRichard Fitzgerald { .offset_words = 4 },
2376dd0b6b1fSRichard Fitzgerald { .offset_words = 23 },
2377dd0b6b1fSRichard Fitzgerald { .offset_words = 22 },
2378dd0b6b1fSRichard Fitzgerald { .offset_words = 21 },
2379dd0b6b1fSRichard Fitzgerald { .offset_words = 20 },
2380dd0b6b1fSRichard Fitzgerald };
2381dd0b6b1fSRichard Fitzgerald
offset_param_desc(const struct bin_test_param * param,char * desc)2382dd0b6b1fSRichard Fitzgerald static void offset_param_desc(const struct bin_test_param *param, char *desc)
2383dd0b6b1fSRichard Fitzgerald {
2384dd0b6b1fSRichard Fitzgerald snprintf(desc, KUNIT_PARAM_DESC_SIZE, "@%u", param->offset_words);
2385dd0b6b1fSRichard Fitzgerald }
2386dd0b6b1fSRichard Fitzgerald
2387dd0b6b1fSRichard Fitzgerald KUNIT_ARRAY_PARAM(offset, offset_param_cases, offset_param_desc);
2388dd0b6b1fSRichard Fitzgerald
2389dd0b6b1fSRichard Fitzgerald static const struct bin_test_param alg_param_cases[] = {
2390dd0b6b1fSRichard Fitzgerald { .alg_idx = 0 },
2391dd0b6b1fSRichard Fitzgerald { .alg_idx = 1 },
2392dd0b6b1fSRichard Fitzgerald { .alg_idx = 2 },
2393dd0b6b1fSRichard Fitzgerald { .alg_idx = 3 },
2394dd0b6b1fSRichard Fitzgerald };
2395dd0b6b1fSRichard Fitzgerald
alg_param_desc(const struct bin_test_param * param,char * desc)2396dd0b6b1fSRichard Fitzgerald static void alg_param_desc(const struct bin_test_param *param, char *desc)
2397dd0b6b1fSRichard Fitzgerald {
2398dd0b6b1fSRichard Fitzgerald WARN_ON(param->alg_idx >= ARRAY_SIZE(bin_test_mock_algs));
2399dd0b6b1fSRichard Fitzgerald
2400dd0b6b1fSRichard Fitzgerald snprintf(desc, KUNIT_PARAM_DESC_SIZE, "alg[%u] (%#x)",
2401dd0b6b1fSRichard Fitzgerald param->alg_idx, bin_test_mock_algs[param->alg_idx].id);
2402dd0b6b1fSRichard Fitzgerald }
2403dd0b6b1fSRichard Fitzgerald
2404dd0b6b1fSRichard Fitzgerald KUNIT_ARRAY_PARAM(alg, alg_param_cases, alg_param_desc);
2405dd0b6b1fSRichard Fitzgerald
2406dd0b6b1fSRichard Fitzgerald static const struct bin_test_param x_or_y_and_alg_param_cases[] = {
2407dd0b6b1fSRichard Fitzgerald { .mem_type = WMFW_ADSP2_XM, .alg_idx = 0 },
2408dd0b6b1fSRichard Fitzgerald { .mem_type = WMFW_ADSP2_XM, .alg_idx = 1 },
2409dd0b6b1fSRichard Fitzgerald { .mem_type = WMFW_ADSP2_XM, .alg_idx = 2 },
2410dd0b6b1fSRichard Fitzgerald { .mem_type = WMFW_ADSP2_XM, .alg_idx = 3 },
2411dd0b6b1fSRichard Fitzgerald
2412dd0b6b1fSRichard Fitzgerald { .mem_type = WMFW_ADSP2_YM, .alg_idx = 0 },
2413dd0b6b1fSRichard Fitzgerald { .mem_type = WMFW_ADSP2_YM, .alg_idx = 1 },
2414dd0b6b1fSRichard Fitzgerald { .mem_type = WMFW_ADSP2_YM, .alg_idx = 2 },
2415dd0b6b1fSRichard Fitzgerald { .mem_type = WMFW_ADSP2_YM, .alg_idx = 3 },
2416dd0b6b1fSRichard Fitzgerald };
2417dd0b6b1fSRichard Fitzgerald
x_or_y_or_z_and_alg_param_desc(const struct bin_test_param * param,char * desc)2418dd0b6b1fSRichard Fitzgerald static void x_or_y_or_z_and_alg_param_desc(const struct bin_test_param *param, char *desc)
2419dd0b6b1fSRichard Fitzgerald {
2420dd0b6b1fSRichard Fitzgerald WARN_ON(param->alg_idx >= ARRAY_SIZE(bin_test_mock_algs));
2421dd0b6b1fSRichard Fitzgerald
2422dd0b6b1fSRichard Fitzgerald snprintf(desc, KUNIT_PARAM_DESC_SIZE, "%s alg[%u] (%#x)",
2423dd0b6b1fSRichard Fitzgerald cs_dsp_mem_region_name(param->mem_type),
2424dd0b6b1fSRichard Fitzgerald param->alg_idx, bin_test_mock_algs[param->alg_idx].id);
2425dd0b6b1fSRichard Fitzgerald }
2426dd0b6b1fSRichard Fitzgerald
2427dd0b6b1fSRichard Fitzgerald KUNIT_ARRAY_PARAM(x_or_y_and_alg, x_or_y_and_alg_param_cases, x_or_y_or_z_and_alg_param_desc);
2428dd0b6b1fSRichard Fitzgerald
2429dd0b6b1fSRichard Fitzgerald static const struct bin_test_param z_and_alg_param_cases[] = {
2430dd0b6b1fSRichard Fitzgerald { .mem_type = WMFW_ADSP2_ZM, .alg_idx = 0 },
2431dd0b6b1fSRichard Fitzgerald { .mem_type = WMFW_ADSP2_ZM, .alg_idx = 1 },
2432dd0b6b1fSRichard Fitzgerald { .mem_type = WMFW_ADSP2_ZM, .alg_idx = 2 },
2433dd0b6b1fSRichard Fitzgerald { .mem_type = WMFW_ADSP2_ZM, .alg_idx = 3 },
2434dd0b6b1fSRichard Fitzgerald };
2435dd0b6b1fSRichard Fitzgerald
2436dd0b6b1fSRichard Fitzgerald KUNIT_ARRAY_PARAM(z_and_alg, z_and_alg_param_cases, x_or_y_or_z_and_alg_param_desc);
2437dd0b6b1fSRichard Fitzgerald
2438dd0b6b1fSRichard Fitzgerald static const struct bin_test_param packed_x_or_y_and_alg_param_cases[] = {
2439dd0b6b1fSRichard Fitzgerald { .mem_type = WMFW_HALO_XM_PACKED, .alg_idx = 0 },
2440dd0b6b1fSRichard Fitzgerald { .mem_type = WMFW_HALO_XM_PACKED, .alg_idx = 1 },
2441dd0b6b1fSRichard Fitzgerald { .mem_type = WMFW_HALO_XM_PACKED, .alg_idx = 2 },
2442dd0b6b1fSRichard Fitzgerald { .mem_type = WMFW_HALO_XM_PACKED, .alg_idx = 3 },
2443dd0b6b1fSRichard Fitzgerald
2444dd0b6b1fSRichard Fitzgerald { .mem_type = WMFW_HALO_YM_PACKED, .alg_idx = 0 },
2445dd0b6b1fSRichard Fitzgerald { .mem_type = WMFW_HALO_YM_PACKED, .alg_idx = 1 },
2446dd0b6b1fSRichard Fitzgerald { .mem_type = WMFW_HALO_YM_PACKED, .alg_idx = 2 },
2447dd0b6b1fSRichard Fitzgerald { .mem_type = WMFW_HALO_YM_PACKED, .alg_idx = 3 },
2448dd0b6b1fSRichard Fitzgerald };
2449dd0b6b1fSRichard Fitzgerald
2450dd0b6b1fSRichard Fitzgerald KUNIT_ARRAY_PARAM(packed_x_or_y_and_alg, packed_x_or_y_and_alg_param_cases,
2451dd0b6b1fSRichard Fitzgerald x_or_y_or_z_and_alg_param_desc);
2452dd0b6b1fSRichard Fitzgerald
2453dd0b6b1fSRichard Fitzgerald static struct kunit_case cs_dsp_bin_test_cases_halo[] = {
2454dd0b6b1fSRichard Fitzgerald /* Unpacked memory */
2455dd0b6b1fSRichard Fitzgerald KUNIT_CASE_PARAM(bin_patch_one_word, x_or_y_and_offset_gen_params),
2456dd0b6b1fSRichard Fitzgerald KUNIT_CASE_PARAM(bin_patch_one_multiword, x_or_y_and_offset_gen_params),
2457dd0b6b1fSRichard Fitzgerald KUNIT_CASE_PARAM(bin_patch_multi_oneword, x_or_y_and_offset_gen_params),
2458dd0b6b1fSRichard Fitzgerald KUNIT_CASE_PARAM(bin_patch_multi_oneword_unordered, x_or_y_and_offset_gen_params),
2459dd0b6b1fSRichard Fitzgerald KUNIT_CASE_PARAM(bin_patch_one_word_multiple_mems, offset_gen_params),
2460dd0b6b1fSRichard Fitzgerald KUNIT_CASE_PARAM(bin_patch_one_word_multiple_mems, alg_gen_params),
2461dd0b6b1fSRichard Fitzgerald KUNIT_CASE_PARAM(bin_patch_multi_oneword_sparse_unordered, x_or_y_and_alg_gen_params),
2462dd0b6b1fSRichard Fitzgerald KUNIT_CASE_PARAM(bin_patch_one_word_multiple_algs, x_or_y_and_offset_gen_params),
2463dd0b6b1fSRichard Fitzgerald KUNIT_CASE_PARAM(bin_patch_one_word_multiple_algs_unordered, x_or_y_and_offset_gen_params),
2464dd0b6b1fSRichard Fitzgerald
2465dd0b6b1fSRichard Fitzgerald /* Packed memory tests */
2466dd0b6b1fSRichard Fitzgerald KUNIT_CASE_PARAM(bin_patch_1_packed,
2467dd0b6b1fSRichard Fitzgerald packed_x_or_y_and_offset_gen_params),
2468dd0b6b1fSRichard Fitzgerald KUNIT_CASE_PARAM(bin_patch_1_packed_1_single_trailing,
2469dd0b6b1fSRichard Fitzgerald packed_x_or_y_and_offset_gen_params),
2470dd0b6b1fSRichard Fitzgerald KUNIT_CASE_PARAM(bin_patch_1_packed_2_single_trailing,
2471dd0b6b1fSRichard Fitzgerald packed_x_or_y_and_offset_gen_params),
2472dd0b6b1fSRichard Fitzgerald KUNIT_CASE_PARAM(bin_patch_1_packed_3_single_trailing,
2473dd0b6b1fSRichard Fitzgerald packed_x_or_y_and_offset_gen_params),
2474dd0b6b1fSRichard Fitzgerald KUNIT_CASE_PARAM(bin_patch_1_packed_2_trailing,
2475dd0b6b1fSRichard Fitzgerald packed_x_or_y_and_offset_gen_params),
2476dd0b6b1fSRichard Fitzgerald KUNIT_CASE_PARAM(bin_patch_1_packed_3_trailing,
2477dd0b6b1fSRichard Fitzgerald packed_x_or_y_and_offset_gen_params),
2478dd0b6b1fSRichard Fitzgerald KUNIT_CASE_PARAM(bin_patch_1_single_leading_1_packed,
2479dd0b6b1fSRichard Fitzgerald packed_x_or_y_and_offset_gen_params),
2480dd0b6b1fSRichard Fitzgerald KUNIT_CASE_PARAM(bin_patch_2_single_leading_1_packed,
2481dd0b6b1fSRichard Fitzgerald packed_x_or_y_and_offset_gen_params),
2482dd0b6b1fSRichard Fitzgerald KUNIT_CASE_PARAM(bin_patch_2_leading_1_packed,
2483dd0b6b1fSRichard Fitzgerald packed_x_or_y_and_offset_gen_params),
2484dd0b6b1fSRichard Fitzgerald KUNIT_CASE_PARAM(bin_patch_3_single_leading_1_packed,
2485dd0b6b1fSRichard Fitzgerald packed_x_or_y_and_offset_gen_params),
2486dd0b6b1fSRichard Fitzgerald KUNIT_CASE_PARAM(bin_patch_3_leading_1_packed,
2487dd0b6b1fSRichard Fitzgerald packed_x_or_y_and_offset_gen_params),
2488dd0b6b1fSRichard Fitzgerald KUNIT_CASE_PARAM(bin_patch_multi_onepacked,
2489dd0b6b1fSRichard Fitzgerald packed_x_or_y_and_offset_gen_params),
2490dd0b6b1fSRichard Fitzgerald KUNIT_CASE_PARAM(bin_patch_multi_onepacked_unordered,
2491dd0b6b1fSRichard Fitzgerald packed_x_or_y_and_offset_gen_params),
2492dd0b6b1fSRichard Fitzgerald KUNIT_CASE_PARAM(bin_patch_1_packed_multiple_mems, offset_gen_params),
2493dd0b6b1fSRichard Fitzgerald KUNIT_CASE_PARAM(bin_patch_1_packed_multiple_mems, alg_gen_params),
2494dd0b6b1fSRichard Fitzgerald KUNIT_CASE_PARAM(bin_patch_multi_onepacked_sparse_unordered,
2495dd0b6b1fSRichard Fitzgerald packed_x_or_y_and_alg_gen_params),
2496dd0b6b1fSRichard Fitzgerald KUNIT_CASE_PARAM(bin_patch_1_packed_multiple_algs,
2497dd0b6b1fSRichard Fitzgerald packed_x_or_y_and_offset_gen_params),
2498dd0b6b1fSRichard Fitzgerald KUNIT_CASE_PARAM(bin_patch_1_packed_multiple_algs_unordered,
2499dd0b6b1fSRichard Fitzgerald packed_x_or_y_and_offset_gen_params),
2500dd0b6b1fSRichard Fitzgerald KUNIT_CASE_PARAM(bin_patch_mixed_packed_unpacked_random,
2501dd0b6b1fSRichard Fitzgerald packed_x_or_y_gen_params),
2502dd0b6b1fSRichard Fitzgerald
2503dd0b6b1fSRichard Fitzgerald KUNIT_CASE(bin_patch_name_and_info),
2504dd0b6b1fSRichard Fitzgerald
2505dd0b6b1fSRichard Fitzgerald { } /* terminator */
2506dd0b6b1fSRichard Fitzgerald };
2507dd0b6b1fSRichard Fitzgerald
2508dd0b6b1fSRichard Fitzgerald static struct kunit_case cs_dsp_bin_test_cases_adsp2[] = {
2509dd0b6b1fSRichard Fitzgerald /* XM and YM */
2510dd0b6b1fSRichard Fitzgerald KUNIT_CASE_PARAM(bin_patch_one_word, x_or_y_and_offset_gen_params),
2511dd0b6b1fSRichard Fitzgerald KUNIT_CASE_PARAM(bin_patch_one_multiword, x_or_y_and_offset_gen_params),
2512dd0b6b1fSRichard Fitzgerald KUNIT_CASE_PARAM(bin_patch_multi_oneword, x_or_y_and_offset_gen_params),
2513dd0b6b1fSRichard Fitzgerald KUNIT_CASE_PARAM(bin_patch_multi_oneword_unordered, x_or_y_and_offset_gen_params),
2514dd0b6b1fSRichard Fitzgerald KUNIT_CASE_PARAM(bin_patch_multi_oneword_sparse_unordered, x_or_y_and_alg_gen_params),
2515dd0b6b1fSRichard Fitzgerald KUNIT_CASE_PARAM(bin_patch_one_word_multiple_algs, x_or_y_and_offset_gen_params),
2516dd0b6b1fSRichard Fitzgerald KUNIT_CASE_PARAM(bin_patch_one_word_multiple_algs_unordered, x_or_y_and_offset_gen_params),
2517dd0b6b1fSRichard Fitzgerald
2518dd0b6b1fSRichard Fitzgerald /* ZM */
2519dd0b6b1fSRichard Fitzgerald KUNIT_CASE_PARAM(bin_patch_one_word, z_and_offset_gen_params),
2520dd0b6b1fSRichard Fitzgerald KUNIT_CASE_PARAM(bin_patch_one_multiword, z_and_offset_gen_params),
2521dd0b6b1fSRichard Fitzgerald KUNIT_CASE_PARAM(bin_patch_multi_oneword, z_and_offset_gen_params),
2522dd0b6b1fSRichard Fitzgerald KUNIT_CASE_PARAM(bin_patch_multi_oneword_unordered, z_and_offset_gen_params),
2523dd0b6b1fSRichard Fitzgerald KUNIT_CASE_PARAM(bin_patch_multi_oneword_sparse_unordered, z_and_alg_gen_params),
2524dd0b6b1fSRichard Fitzgerald KUNIT_CASE_PARAM(bin_patch_one_word_multiple_algs, z_and_offset_gen_params),
2525dd0b6b1fSRichard Fitzgerald KUNIT_CASE_PARAM(bin_patch_one_word_multiple_algs_unordered, z_and_offset_gen_params),
2526dd0b6b1fSRichard Fitzgerald
2527dd0b6b1fSRichard Fitzgerald /* Other */
2528dd0b6b1fSRichard Fitzgerald KUNIT_CASE_PARAM(bin_patch_one_word_multiple_mems, offset_gen_params),
2529dd0b6b1fSRichard Fitzgerald KUNIT_CASE_PARAM(bin_patch_one_word_multiple_mems, alg_gen_params),
2530dd0b6b1fSRichard Fitzgerald
2531dd0b6b1fSRichard Fitzgerald KUNIT_CASE(bin_patch_name_and_info),
2532dd0b6b1fSRichard Fitzgerald
2533dd0b6b1fSRichard Fitzgerald { } /* terminator */
2534dd0b6b1fSRichard Fitzgerald };
2535dd0b6b1fSRichard Fitzgerald
2536dd0b6b1fSRichard Fitzgerald static struct kunit_suite cs_dsp_bin_test_halo = {
2537dd0b6b1fSRichard Fitzgerald .name = "cs_dsp_bin_halo",
2538dd0b6b1fSRichard Fitzgerald .init = cs_dsp_bin_test_halo_init,
2539dd0b6b1fSRichard Fitzgerald .test_cases = cs_dsp_bin_test_cases_halo,
2540dd0b6b1fSRichard Fitzgerald };
2541dd0b6b1fSRichard Fitzgerald
2542dd0b6b1fSRichard Fitzgerald static struct kunit_suite cs_dsp_bin_test_adsp2_32bit = {
2543dd0b6b1fSRichard Fitzgerald .name = "cs_dsp_bin_adsp2_32bit",
2544dd0b6b1fSRichard Fitzgerald .init = cs_dsp_bin_test_adsp2_32bit_init,
2545dd0b6b1fSRichard Fitzgerald .test_cases = cs_dsp_bin_test_cases_adsp2,
2546dd0b6b1fSRichard Fitzgerald };
2547dd0b6b1fSRichard Fitzgerald
2548dd0b6b1fSRichard Fitzgerald static struct kunit_suite cs_dsp_bin_test_adsp2_16bit = {
2549dd0b6b1fSRichard Fitzgerald .name = "cs_dsp_bin_adsp2_16bit",
2550dd0b6b1fSRichard Fitzgerald .init = cs_dsp_bin_test_adsp2_16bit_init,
2551dd0b6b1fSRichard Fitzgerald .test_cases = cs_dsp_bin_test_cases_adsp2,
2552dd0b6b1fSRichard Fitzgerald };
2553dd0b6b1fSRichard Fitzgerald
2554dd0b6b1fSRichard Fitzgerald kunit_test_suites(&cs_dsp_bin_test_halo,
2555dd0b6b1fSRichard Fitzgerald &cs_dsp_bin_test_adsp2_32bit,
2556dd0b6b1fSRichard Fitzgerald &cs_dsp_bin_test_adsp2_16bit);
2557