/* Content of registers should match payload_data */
reg_addr = cs_dsp_mock_base_addr_for_mem(priv, param->mem_type) +
((alg_base_words + param->offset_words) * reg_inc_per_word);
reg_val = 0;
KUNIT_EXPECT_EQ(test,
regmap_raw_read(priv->dsp->regmap, reg_addr,
®_val, sizeof(reg_val)), 0);
KUNIT_EXPECT_EQ(test, reg_val, payload_data);
/* Drop expected writes and the cache should then be clean */
cs_dsp_mock_regmap_drop_range(priv, reg_addr, reg_addr + reg_inc_per_word - 1);
cs_dsp_mock_xm_header_drop_from_regmap_cache(priv);
/* Content of registers should match payload_data */
reg_addr = cs_dsp_mock_base_addr_for_mem(priv, param->mem_type) +
((alg_base_words + param->offset_words) * reg_inc_per_word);
KUNIT_EXPECT_EQ(test,
regmap_raw_read(priv->dsp->regmap, reg_addr, readback, sizeof(readback)), 0);
KUNIT_EXPECT_MEMEQ(test, readback, payload_data, sizeof(payload_data));
/* Drop expected writes and the cache should then be clean */
cs_dsp_mock_regmap_drop_range(priv, reg_addr,
reg_addr + (reg_inc_per_word * ARRAY_SIZE(payload_data)));
cs_dsp_mock_xm_header_drop_from_regmap_cache(priv);
KUNIT_EXPECT_FALSE(test, cs_dsp_mock_regmap_is_dirty(priv, true));
}
/* bin file with a multiple one-word payloads that patch consecutive words */ staticvoid bin_patch_multi_oneword(struct kunit *test)
{ struct cs_dsp_test *priv = test->priv; conststruct bin_test_param *param = test->param_value; unsignedint reg_inc_per_word = cs_dsp_mock_reg_addr_inc_per_unpacked_word(priv);
u32 payload_data[16], readback[16]; unsignedint alg_base_words, reg_addr; struct firmware *fw; int i;
/* Add one payload per word */ for (i = 0; i < ARRAY_SIZE(payload_data); ++i) {
cs_dsp_mock_bin_add_patch(priv->local->bin_builder,
bin_test_mock_algs[param->alg_idx].id,
bin_test_mock_algs[param->alg_idx].ver,
param->mem_type,
(param->offset_words + i) * reg_inc_per_word,
&payload_data[i], sizeof(payload_data[i]));
}
/* Content of registers should match payload_data */
reg_addr = cs_dsp_mock_base_addr_for_mem(priv, param->mem_type) +
((alg_base_words + param->offset_words) * reg_inc_per_word);
KUNIT_EXPECT_EQ(test,
regmap_raw_read(priv->dsp->regmap, reg_addr, readback, sizeof(readback)), 0);
KUNIT_EXPECT_MEMEQ(test, readback, payload_data, sizeof(payload_data));
/* Drop expected writes and the cache should then be clean */
cs_dsp_mock_xm_header_drop_from_regmap_cache(priv);
cs_dsp_mock_regmap_drop_range(priv, reg_addr,
reg_addr + (reg_inc_per_word * ARRAY_SIZE(payload_data)));
KUNIT_EXPECT_FALSE(test, cs_dsp_mock_regmap_is_dirty(priv, true));
}
/* Add one payload per word */ for (i = 0; i < ARRAY_SIZE(word_order); ++i) {
cs_dsp_mock_bin_add_patch(priv->local->bin_builder,
bin_test_mock_algs[param->alg_idx].id,
bin_test_mock_algs[param->alg_idx].ver,
param->mem_type,
(param->offset_words + word_order[i]) *
reg_inc_per_word,
&payload_data[word_order[i]], sizeof(payload_data[0]));
}
/* Content of registers should match payload_data */
reg_addr = cs_dsp_mock_base_addr_for_mem(priv, param->mem_type) +
((alg_base_words + param->offset_words) * reg_inc_per_word);
KUNIT_EXPECT_EQ(test,
regmap_raw_read(priv->dsp->regmap, reg_addr, readback, sizeof(readback)), 0);
KUNIT_EXPECT_MEMEQ(test, readback, payload_data, sizeof(payload_data));
/* Drop expected writes and the cache should then be clean */
cs_dsp_mock_xm_header_drop_from_regmap_cache(priv);
cs_dsp_mock_regmap_drop_range(priv, reg_addr,
reg_addr + (reg_inc_per_word * ARRAY_SIZE(payload_data)));
KUNIT_EXPECT_FALSE(test, cs_dsp_mock_regmap_is_dirty(priv, true));
}
/* Add one payload per word */ for (i = 0; i < ARRAY_SIZE(word_offsets); ++i) {
cs_dsp_mock_bin_add_patch(priv->local->bin_builder,
bin_test_mock_algs[param->alg_idx].id,
bin_test_mock_algs[param->alg_idx].ver,
param->mem_type,
word_offsets[i] * reg_inc_per_word,
&payload_data[i], sizeof(payload_data[i]));
}
/* Content of registers should match payload_data */ for (i = 0; i < ARRAY_SIZE(word_offsets); ++i) {
reg_addr = cs_dsp_mock_base_addr_for_mem(priv, param->mem_type) +
((alg_base_words + word_offsets[i]) * reg_inc_per_word);
reg_val = 0;
KUNIT_EXPECT_EQ(test,
regmap_raw_read(priv->dsp->regmap, reg_addr, ®_val, sizeof(reg_val)), 0);
KUNIT_EXPECT_MEMEQ(test, ®_val, &payload_data[i], sizeof(reg_val));
/* Drop expected writes from the cache */
cs_dsp_mock_regmap_drop_range(priv, reg_addr, reg_addr + reg_inc_per_word - 1);
}
/* Drop expected writes and the cache should then be clean */
cs_dsp_mock_xm_header_drop_from_regmap_cache(priv);
KUNIT_EXPECT_FALSE(test, cs_dsp_mock_regmap_is_dirty(priv, true));
}
/* Add words to XM, YM and ZM */
cs_dsp_mock_bin_add_patch(priv->local->bin_builder,
bin_test_mock_algs[param->alg_idx].id,
bin_test_mock_algs[param->alg_idx].ver,
WMFW_ADSP2_XM,
param->offset_words * reg_inc_per_word,
&payload_data[0], sizeof(payload_data[0]));
/* Drop expected writes from the cache */
cs_dsp_mock_regmap_drop_range(priv, reg_addr, reg_addr + reg_inc_per_word - 1);
}
/* Drop expected writes and the cache should then be clean */
cs_dsp_mock_xm_header_drop_from_regmap_cache(priv);
KUNIT_EXPECT_FALSE(test, cs_dsp_mock_regmap_is_dirty(priv, true));
}
/* Add one payload per algorithm */ for (i = 0; i < ARRAY_SIZE(bin_test_mock_algs); ++i) {
reg_inc_per_word = cs_dsp_mock_reg_addr_inc_per_unpacked_word(priv);
/* Content of registers should match payload_data */ for (i = 0; i < ARRAY_SIZE(bin_test_mock_algs); ++i) {
alg_base_words = cs_dsp_mock_xm_header_get_alg_base_in_words(priv,
bin_test_mock_algs[i].id,
param->mem_type);
reg_inc_per_word = cs_dsp_mock_reg_addr_inc_per_unpacked_word(priv);
reg_addr = cs_dsp_mock_base_addr_for_mem(priv, param->mem_type) +
((alg_base_words + param->offset_words) * reg_inc_per_word);
reg_val = 0;
KUNIT_EXPECT_EQ(test,
regmap_raw_read(priv->dsp->regmap, reg_addr, ®_val, sizeof(reg_val)), 0);
KUNIT_EXPECT_EQ(test, reg_val, payload_data[i]);
/* Drop expected writes from the cache */
cs_dsp_mock_regmap_drop_range(priv, reg_addr, reg_addr + reg_inc_per_word - 1);
}
/* Drop expected writes and the cache should then be clean */
cs_dsp_mock_xm_header_drop_from_regmap_cache(priv);
KUNIT_EXPECT_FALSE(test, cs_dsp_mock_regmap_is_dirty(priv, true));
}
/* Add one payload per algorithm */ for (i = 0; i < ARRAY_SIZE(bin_test_mock_algs); ++i) {
alg_idx = alg_order[i];
reg_inc_per_word = cs_dsp_mock_reg_addr_inc_per_unpacked_word(priv);
/* Content of registers should match payload_data */ for (i = 0; i < ARRAY_SIZE(bin_test_mock_algs); ++i) {
alg_idx = alg_order[i];
alg_base_words = cs_dsp_mock_xm_header_get_alg_base_in_words(priv,
bin_test_mock_algs[alg_idx].id,
param->mem_type);
reg_inc_per_word = cs_dsp_mock_reg_addr_inc_per_unpacked_word(priv);
reg_addr = cs_dsp_mock_base_addr_for_mem(priv, param->mem_type) +
((alg_base_words + param->offset_words) * reg_inc_per_word);
reg_val = 0;
KUNIT_EXPECT_EQ(test,
regmap_raw_read(priv->dsp->regmap, reg_addr, ®_val, sizeof(reg_val)), 0);
KUNIT_EXPECT_EQ(test, reg_val, payload_data[i]);
/* Drop expected writes from the cache */
cs_dsp_mock_regmap_drop_range(priv, reg_addr, reg_addr + reg_inc_per_word - 1);
}
/* Drop expected writes and the cache should then be clean */
cs_dsp_mock_xm_header_drop_from_regmap_cache(priv);
KUNIT_EXPECT_FALSE(test, cs_dsp_mock_regmap_is_dirty(priv, true));
}
/* bin file that patches a single packed block of DSP words */ staticvoid bin_patch_1_packed(struct kunit *test)
{ struct cs_dsp_test *priv = test->priv; conststruct bin_test_param *param = test->param_value;
u32 packed_payload[3], readback[3]; unsignedint alg_base_words, patch_pos_words; unsignedint alg_base_in_packed_regs, patch_pos_in_packed_regs; unsignedint reg_addr; struct firmware *fw;
/* Round patch start word up to a packed boundary */
patch_pos_words = round_up(alg_base_words + param->offset_words, 4);
patch_pos_in_packed_regs = _num_words_to_num_packed_regs(patch_pos_words);
/* Content of registers should match payload_data */
reg_addr = cs_dsp_mock_base_addr_for_mem(priv, param->mem_type) +
(patch_pos_in_packed_regs * 4);
memset(readback, 0, sizeof(readback));
KUNIT_EXPECT_EQ(test,
regmap_raw_read(priv->dsp->regmap, reg_addr, readback, sizeof(readback)), 0);
KUNIT_EXPECT_MEMEQ(test, readback, packed_payload, sizeof(packed_payload));
/* Drop expected writes and the cache should then be clean */
cs_dsp_mock_xm_header_drop_from_regmap_cache(priv);
cs_dsp_mock_regmap_drop_bytes(priv, reg_addr, sizeof(packed_payload));
KUNIT_EXPECT_FALSE(test, cs_dsp_mock_regmap_is_dirty(priv, true));
}
/* Round patch start word up to a packed boundary */
patch_pos_words = round_up(alg_base_words + param->offset_words, 4);
patch_pos_in_packed_regs = _num_words_to_num_packed_regs(patch_pos_words);
/* ... and the unpacked word following that */
cs_dsp_mock_bin_add_patch(priv->local->bin_builder,
bin_test_mock_algs[param->alg_idx].id,
bin_test_mock_algs[param->alg_idx].ver,
unpacked_mem_type,
((patch_pos_words + 4) - alg_base_words) * 4,
unpacked_payload, sizeof(unpacked_payload));
/* Drop expected writes and the cache should then be clean */
cs_dsp_mock_xm_header_drop_from_regmap_cache(priv);
KUNIT_EXPECT_FALSE(test, cs_dsp_mock_regmap_is_dirty(priv, true));
}
/* Round patch start word up to a packed boundary */
patch_pos_words = round_up(alg_base_words + param->offset_words, 4);
patch_pos_in_packed_regs = _num_words_to_num_packed_regs(patch_pos_words);
/* ... and the unpacked words following that */
cs_dsp_mock_bin_add_patch(priv->local->bin_builder,
bin_test_mock_algs[param->alg_idx].id,
bin_test_mock_algs[param->alg_idx].ver,
unpacked_mem_type,
((patch_pos_words + 4) - alg_base_words) * 4,
&unpacked_payloads[0], sizeof(unpacked_payloads[0]));
/* Drop expected writes from the cache */
cs_dsp_mock_regmap_drop_bytes(priv, reg_addr, sizeof(unpacked_payloads));
/* Drop expected writes and the cache should then be clean */
cs_dsp_mock_xm_header_drop_from_regmap_cache(priv);
KUNIT_EXPECT_FALSE(test, cs_dsp_mock_regmap_is_dirty(priv, true));
}
/* Round patch start word up to a packed boundary */
patch_pos_words = round_up(alg_base_words + param->offset_words, 4);
patch_pos_in_packed_regs = _num_words_to_num_packed_regs(patch_pos_words);
/* ... and the unpacked words following that */
cs_dsp_mock_bin_add_patch(priv->local->bin_builder,
bin_test_mock_algs[param->alg_idx].id,
bin_test_mock_algs[param->alg_idx].ver,
unpacked_mem_type,
((patch_pos_words + 4) - alg_base_words) * 4,
&unpacked_payloads[0], sizeof(unpacked_payloads[0]));
/* Drop expected writes from the cache */
cs_dsp_mock_regmap_drop_bytes(priv, reg_addr, sizeof(unpacked_payloads));
/* Drop expected writes and the cache should then be clean */
cs_dsp_mock_xm_header_drop_from_regmap_cache(priv);
KUNIT_EXPECT_FALSE(test, cs_dsp_mock_regmap_is_dirty(priv, true));
}
/* Round patch start word up to a packed boundary */
patch_pos_words = round_up(alg_base_words + param->offset_words, 4);
patch_pos_in_packed_regs = _num_words_to_num_packed_regs(patch_pos_words);
/* ... and the unpacked words following that */
cs_dsp_mock_bin_add_patch(priv->local->bin_builder,
bin_test_mock_algs[param->alg_idx].id,
bin_test_mock_algs[param->alg_idx].ver,
unpacked_mem_type,
((patch_pos_words + 4) - alg_base_words) * 4,
unpacked_payload, sizeof(unpacked_payload));
/* Drop expected writes from the cache */
cs_dsp_mock_regmap_drop_bytes(priv, reg_addr, sizeof(unpacked_payload));
/* Drop expected writes and the cache should then be clean */
cs_dsp_mock_xm_header_drop_from_regmap_cache(priv);
KUNIT_EXPECT_FALSE(test, cs_dsp_mock_regmap_is_dirty(priv, true));
}
/* Round patch start word up to a packed boundary */
patch_pos_words = round_up(alg_base_words + param->offset_words, 4);
patch_pos_in_packed_regs = _num_words_to_num_packed_regs(patch_pos_words);
/* ... and the unpacked words following that */
cs_dsp_mock_bin_add_patch(priv->local->bin_builder,
bin_test_mock_algs[param->alg_idx].id,
bin_test_mock_algs[param->alg_idx].ver,
unpacked_mem_type,
((patch_pos_words + 4) - alg_base_words) * 4,
unpacked_payload, sizeof(unpacked_payload));
/* Drop expected writes from the cache */
cs_dsp_mock_regmap_drop_bytes(priv, reg_addr, sizeof(unpacked_payload));
/* Drop expected writes and the cache should then be clean */
cs_dsp_mock_xm_header_drop_from_regmap_cache(priv);
KUNIT_EXPECT_FALSE(test, cs_dsp_mock_regmap_is_dirty(priv, true));
}
/* Round packed start word up to a packed boundary and move to the next boundary */
packed_patch_pos_words = round_up(alg_base_words + param->offset_words, 4) + 4;
/* Patch the leading unpacked word */
cs_dsp_mock_bin_add_patch(priv->local->bin_builder,
bin_test_mock_algs[param->alg_idx].id,
bin_test_mock_algs[param->alg_idx].ver,
unpacked_mem_type,
((packed_patch_pos_words - 1) - alg_base_words) * 4,
unpacked_payload, sizeof(unpacked_payload)); /* ... then the packed block */
patch_pos_in_packed_regs = _num_words_to_num_packed_regs(packed_patch_pos_words);
cs_dsp_mock_bin_add_patch(priv->local->bin_builder,
bin_test_mock_algs[param->alg_idx].id,
bin_test_mock_algs[param->alg_idx].ver,
param->mem_type,
(patch_pos_in_packed_regs - alg_base_in_packed_regs) * 4,
&packed_payload, sizeof(packed_payload));
/* Content of packed registers should match packed_payload */
reg_addr = cs_dsp_mock_base_addr_for_mem(priv, param->mem_type) +
(patch_pos_in_packed_regs * 4);
KUNIT_EXPECT_EQ(test,
regmap_raw_read(priv->dsp->regmap, reg_addr, &readback, sizeof(readback)), 0);
KUNIT_EXPECT_MEMEQ(test, &readback, &packed_payload, sizeof(packed_payload));
/* Drop expected writes from the cache */
cs_dsp_mock_regmap_drop_bytes(priv, reg_addr, sizeof(packed_payload));
/* Content of unpacked registers should match unpacked_payload */
reg_addr = cs_dsp_mock_base_addr_for_mem(priv, unpacked_mem_type) +
(packed_patch_pos_words - 1) * 4;
KUNIT_EXPECT_EQ(test,
regmap_raw_read(priv->dsp->regmap, reg_addr, &readback, sizeof(unpacked_payload)), 0);
KUNIT_EXPECT_MEMEQ(test, &readback, unpacked_payload, sizeof(unpacked_payload));
/* Drop expected writes from the cache */
cs_dsp_mock_regmap_drop_bytes(priv, reg_addr, sizeof(unpacked_payload));
/* Drop expected writes and the cache should then be clean */
cs_dsp_mock_xm_header_drop_from_regmap_cache(priv);
KUNIT_EXPECT_FALSE(test, cs_dsp_mock_regmap_is_dirty(priv, true));
}
/* Round packed start word up to a packed boundary and move to the next boundary */
packed_patch_pos_words = round_up(alg_base_words + param->offset_words, 4) + 4;
/* Drop expected writes from the cache */
cs_dsp_mock_regmap_drop_bytes(priv, reg_addr, sizeof(unpacked_payload));
/* Drop expected writes and the cache should then be clean */
cs_dsp_mock_xm_header_drop_from_regmap_cache(priv);
KUNIT_EXPECT_FALSE(test, cs_dsp_mock_regmap_is_dirty(priv, true));
}
/* Round packed start word up to a packed boundary and move to the next boundary */
packed_patch_pos_words = round_up(alg_base_words + param->offset_words, 4) + 4;
/* Patch the leading unpacked words */
cs_dsp_mock_bin_add_patch(priv->local->bin_builder,
bin_test_mock_algs[param->alg_idx].id,
bin_test_mock_algs[param->alg_idx].ver,
unpacked_mem_type,
((packed_patch_pos_words - 2) - alg_base_words) * 4,
unpacked_payload, sizeof(unpacked_payload)); /* ... then the packed block */
patch_pos_in_packed_regs = _num_words_to_num_packed_regs(packed_patch_pos_words);
cs_dsp_mock_bin_add_patch(priv->local->bin_builder,
bin_test_mock_algs[param->alg_idx].id,
bin_test_mock_algs[param->alg_idx].ver,
param->mem_type,
(patch_pos_in_packed_regs - alg_base_in_packed_regs) * 4,
&packed_payload, sizeof(packed_payload));
/* Drop expected writes from the cache */
cs_dsp_mock_regmap_drop_bytes(priv, reg_addr, sizeof(unpacked_payload));
/* Drop expected writes and the cache should then be clean */
cs_dsp_mock_xm_header_drop_from_regmap_cache(priv);
KUNIT_EXPECT_FALSE(test, cs_dsp_mock_regmap_is_dirty(priv, true));
}
/* Round packed start word up to a packed boundary and move to the next boundary */
packed_patch_pos_words = round_up(alg_base_words + param->offset_words, 4) + 4;
/* Drop expected writes from the cache */
cs_dsp_mock_regmap_drop_bytes(priv, reg_addr, sizeof(unpacked_payload));
/* Drop expected writes and the cache should then be clean */
cs_dsp_mock_xm_header_drop_from_regmap_cache(priv);
KUNIT_EXPECT_FALSE(test, cs_dsp_mock_regmap_is_dirty(priv, true));
}
/* Round packed start word up to a packed boundary and move to the next boundary */
packed_patch_pos_words = round_up(alg_base_words + param->offset_words, 4) + 4;
/* Patch the leading unpacked words */
cs_dsp_mock_bin_add_patch(priv->local->bin_builder,
bin_test_mock_algs[param->alg_idx].id,
bin_test_mock_algs[param->alg_idx].ver,
unpacked_mem_type,
((packed_patch_pos_words - 3) - alg_base_words) * 4,
unpacked_payload, sizeof(unpacked_payload)); /* ... then the packed block */
patch_pos_in_packed_regs = _num_words_to_num_packed_regs(packed_patch_pos_words);
cs_dsp_mock_bin_add_patch(priv->local->bin_builder,
bin_test_mock_algs[param->alg_idx].id,
bin_test_mock_algs[param->alg_idx].ver,
param->mem_type,
(patch_pos_in_packed_regs - alg_base_in_packed_regs) * 4,
&packed_payload, sizeof(packed_payload));
/* Drop expected writes from the cache */
cs_dsp_mock_regmap_drop_bytes(priv, reg_addr, sizeof(unpacked_payload));
/* Drop expected writes and the cache should then be clean */
cs_dsp_mock_xm_header_drop_from_regmap_cache(priv);
KUNIT_EXPECT_FALSE(test, cs_dsp_mock_regmap_is_dirty(priv, true));
}
/* bin file with a multiple payloads that each patch one packed block. */ staticvoid bin_patch_multi_onepacked(struct kunit *test)
{ struct cs_dsp_test *priv = test->priv; conststruct bin_test_param *param = test->param_value;
u32 packed_payloads[8][3], readback[8][3]; unsignedint alg_base_words, patch_pos_words; unsignedint alg_base_in_packed_regs, patch_pos_in_packed_regs; unsignedint payload_offset; unsignedint reg_addr; struct firmware *fw; int i;
/* Drop expected writes and the cache should then be clean */
cs_dsp_mock_xm_header_drop_from_regmap_cache(priv);
cs_dsp_mock_regmap_drop_bytes(priv, reg_addr, sizeof(packed_payloads));
KUNIT_EXPECT_FALSE(test, cs_dsp_mock_regmap_is_dirty(priv, true));
}
/* Content in registers should match the order of data in packed_payloads */
patch_pos_in_packed_regs = _num_words_to_num_packed_regs(patch_pos_words);
reg_addr = cs_dsp_mock_base_addr_for_mem(priv, param->mem_type) +
(patch_pos_in_packed_regs * 4);
memset(readback, 0, sizeof(readback));
KUNIT_EXPECT_EQ(test,
regmap_raw_read(priv->dsp->regmap, reg_addr, readback, sizeof(readback)), 0);
KUNIT_EXPECT_MEMEQ(test, readback, packed_payloads, sizeof(packed_payloads));
/* Drop expected writes and the cache should then be clean */
cs_dsp_mock_xm_header_drop_from_regmap_cache(priv);
cs_dsp_mock_regmap_drop_bytes(priv, reg_addr, sizeof(packed_payloads));
KUNIT_EXPECT_FALSE(test, cs_dsp_mock_regmap_is_dirty(priv, true));
}
/* Content of packed registers should match packed_payloads */ for (i = 0; i < ARRAY_SIZE(word_offsets); ++i) {
patch_pos_words = round_up(alg_base_words + word_offsets[i], 4);
patch_pos_in_packed_regs = _num_words_to_num_packed_regs(patch_pos_words);
reg_addr = cs_dsp_mock_base_addr_for_mem(priv, param->mem_type) +
(patch_pos_in_packed_regs * 4);
memset(readback, 0, sizeof(readback));
KUNIT_EXPECT_EQ(test,
regmap_raw_read(priv->dsp->regmap, reg_addr, readback, sizeof(readback)), 0);
KUNIT_EXPECT_MEMEQ(test, readback, packed_payloads[i], sizeof(packed_payloads[i]));
/* Drop expected writes from the cache */
cs_dsp_mock_regmap_drop_bytes(priv, reg_addr, sizeof(packed_payloads[i]));
}
/* Drop expected writes and the cache should then be clean */
cs_dsp_mock_xm_header_drop_from_regmap_cache(priv);
KUNIT_EXPECT_FALSE(test, cs_dsp_mock_regmap_is_dirty(priv, true));
}
/* Drop expected writes from the cache */
cs_dsp_mock_regmap_drop_bytes(priv, reg_addr, sizeof(packed_xm_payload));
/* Content of packed YM registers should match packed_ym_payload */
patch_pos_in_packed_regs = _num_words_to_num_packed_regs(ym_patch_pos_words);
reg_addr = cs_dsp_mock_base_addr_for_mem(priv, WMFW_HALO_YM_PACKED) +
(patch_pos_in_packed_regs * 4);
memset(readback, 0, sizeof(readback));
KUNIT_EXPECT_EQ(test,
regmap_raw_read(priv->dsp->regmap, reg_addr, readback, sizeof(readback)), 0);
KUNIT_EXPECT_MEMEQ(test, readback, packed_ym_payload, sizeof(packed_ym_payload));
/* Drop expected writes from the cache */
cs_dsp_mock_regmap_drop_bytes(priv, reg_addr, sizeof(packed_ym_payload));
/* Drop expected writes and the cache should then be clean */
cs_dsp_mock_xm_header_drop_from_regmap_cache(priv);
KUNIT_EXPECT_FALSE(test, cs_dsp_mock_regmap_is_dirty(priv, true));
}
/* For each algorithm patch one DSP word to a value from packed_payload */ for (i = 0; i < ARRAY_SIZE(bin_test_mock_algs); ++i) {
alg_base_words = cs_dsp_mock_xm_header_get_alg_base_in_words(priv,
bin_test_mock_algs[i].id,
param->mem_type);
alg_base_in_packed_regs = _num_words_to_num_packed_regs(alg_base_words);
/* Round patch start word up to a packed boundary */
patch_pos_words = round_up(alg_base_words + param->offset_words, 4);
patch_pos_in_packed_regs = _num_words_to_num_packed_regs(patch_pos_words);
/* Drop expected writes and the cache should then be clean */
cs_dsp_mock_xm_header_drop_from_regmap_cache(priv);
KUNIT_EXPECT_FALSE(test, cs_dsp_mock_regmap_is_dirty(priv, true));
}
/* *Foreachalgorithmindexinalg_order[]patchoneDSPwordin *thatalgorithmtoavaluefrompacked_payload.
*/ for (i = 0; i < ARRAY_SIZE(alg_order); ++i) {
alg_idx = alg_order[i];
alg_base_words = cs_dsp_mock_xm_header_get_alg_base_in_words(priv,
bin_test_mock_algs[alg_idx].id,
param->mem_type);
alg_base_in_packed_regs = _num_words_to_num_packed_regs(alg_base_words);
/* Round patch start word up to a packed boundary */
patch_pos_words = round_up(alg_base_words + param->offset_words, 4);
patch_pos_in_packed_regs = _num_words_to_num_packed_regs(patch_pos_words);
/* Drop expected writes and the cache should then be clean */
cs_dsp_mock_xm_header_drop_from_regmap_cache(priv);
KUNIT_EXPECT_FALSE(test, cs_dsp_mock_regmap_is_dirty(priv, true));
}
/* Drop expected writes from the cache */
cs_dsp_mock_regmap_drop_bytes(priv, reg_addr, sizeof(payload->unpacked[i]));
}
/* Drop expected writes and the cache should then be clean */
cs_dsp_mock_xm_header_drop_from_regmap_cache(priv);
KUNIT_EXPECT_FALSE(test, cs_dsp_mock_regmap_is_dirty(priv, true));
}
/* Bin file with name and multiple info blocks */ staticvoid bin_patch_name_and_info(struct kunit *test)
{ struct cs_dsp_test *priv = test->priv; unsignedint reg_inc_per_word = cs_dsp_mock_reg_addr_inc_per_unpacked_word(priv);
u32 reg_val, payload_data; char *infobuf; unsignedint alg_base_words, reg_addr; struct firmware *fw;
/* Add a name block and info block */
cs_dsp_mock_bin_add_name(priv->local->bin_builder, "The name");
cs_dsp_mock_bin_add_info(priv->local->bin_builder, "Some info");
/* Add a big block of info */
infobuf = kunit_kzalloc(test, 512, GFP_KERNEL);
KUNIT_ASSERT_NOT_ERR_OR_NULL(test, infobuf);
for (; strlcat(infobuf, "Waffle{Blah}\n", 512) < 512; )
;
/* We must provide a dummy wmfw to load */
priv->local->wmfw_builder = cs_dsp_mock_wmfw_init(priv, -1);
priv->local->wmfw = cs_dsp_mock_wmfw_get_firmware(priv->local->wmfw_builder);
switch (dsp->type) { case WMFW_ADSP2:
ret = cs_dsp_adsp2_init(dsp); break; case WMFW_HALO:
ret = cs_dsp_halo_init(dsp); break; default:
KUNIT_FAIL(test, "Untested DSP type %d\n", dsp->type); return -EINVAL;
}
if (ret) return ret;
/* Automatically call cs_dsp_remove() when test case ends */ return kunit_add_action_or_reset(priv->test, _cs_dsp_remove_wrapper, dsp);
}
¤ Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.0.115Bemerkung:
(Wie Sie bei der Firma Beratungs- und Dienstleistungen beauftragen können 2026-10-02)
¤
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.