| 1 | /* SPDX-License-Identifier: GPL-2.0-only */ |
| 2 | /* |
| 3 | * Support utilities for cs_dsp testing. |
| 4 | * |
| 5 | * Copyright (C) 2024 Cirrus Logic, Inc. and |
| 6 | * Cirrus Logic International Semiconductor Ltd. |
| 7 | */ |
| 8 | |
| 9 | #include <linux/regmap.h> |
| 10 | #include <linux/firmware/cirrus/wmfw.h> |
| 11 | |
| 12 | struct kunit; |
| 13 | struct cs_dsp_test; |
| 14 | struct cs_dsp_test_local; |
| 15 | |
| 16 | /** |
| 17 | * struct cs_dsp_test - base class for test utilities |
| 18 | * |
| 19 | * @test: Pointer to struct kunit instance. |
| 20 | * @dsp: Pointer to struct cs_dsp instance. |
| 21 | * @local: Private data for each test suite. |
| 22 | */ |
| 23 | struct cs_dsp_test { |
| 24 | struct kunit *test; |
| 25 | struct cs_dsp *dsp; |
| 26 | |
| 27 | struct cs_dsp_test_local *local; |
| 28 | |
| 29 | /* private: Following members are private */ |
| 30 | bool saw_bus_write; |
| 31 | }; |
| 32 | |
| 33 | /** |
| 34 | * struct cs_dsp_mock_alg_def - Info for creating a mock algorithm entry. |
| 35 | * |
| 36 | * @id: Algorithm ID. |
| 37 | * @ver: Algorithm version. |
| 38 | * @xm_base_words: XM base address in DSP words. |
| 39 | * @xm_size_words: XM size in DSP words. |
| 40 | * @ym_base_words: YM base address in DSP words. |
| 41 | * @ym_size_words: YM size in DSP words. |
| 42 | * @zm_base_words: ZM base address in DSP words. |
| 43 | * @zm_size_words: ZM size in DSP words. |
| 44 | */ |
| 45 | struct cs_dsp_mock_alg_def { |
| 46 | unsigned int id; |
| 47 | unsigned int ver; |
| 48 | unsigned int xm_base_words; |
| 49 | unsigned int xm_size_words; |
| 50 | unsigned int ym_base_words; |
| 51 | unsigned int ym_size_words; |
| 52 | unsigned int zm_base_words; |
| 53 | unsigned int zm_size_words; |
| 54 | }; |
| 55 | |
| 56 | struct cs_dsp_mock_coeff_def { |
| 57 | const char *shortname; |
| 58 | const char *fullname; |
| 59 | const char *description; |
| 60 | u16 type; |
| 61 | u16 flags; |
| 62 | u16 mem_type; |
| 63 | unsigned int offset_dsp_words; |
| 64 | unsigned int length_bytes; |
| 65 | }; |
| 66 | |
| 67 | /** |
| 68 | * struct cs_dsp_mock_xm_header - XM header builder |
| 69 | * |
| 70 | * @test_priv: Pointer to the struct cs_dsp_test. |
| 71 | * @blob_data: Pointer to the created blob data. |
| 72 | * @blob_size_bytes: Size of the data at blob_data. |
| 73 | */ |
| 74 | struct { |
| 75 | struct cs_dsp_test *; |
| 76 | void *; |
| 77 | size_t ; |
| 78 | }; |
| 79 | |
| 80 | struct cs_dsp_mock_wmfw_builder; |
| 81 | struct cs_dsp_mock_bin_builder; |
| 82 | |
| 83 | extern const unsigned int cs_dsp_mock_adsp2_32bit_sysbase; |
| 84 | extern const unsigned int cs_dsp_mock_adsp2_16bit_sysbase; |
| 85 | extern const unsigned int cs_dsp_mock_halo_core_base; |
| 86 | extern const unsigned int cs_dsp_mock_halo_sysinfo_base; |
| 87 | |
| 88 | extern const struct cs_dsp_region cs_dsp_mock_halo_dsp1_regions[]; |
| 89 | extern const unsigned int cs_dsp_mock_halo_dsp1_region_sizes[]; |
| 90 | extern const struct cs_dsp_region cs_dsp_mock_adsp2_32bit_dsp1_regions[]; |
| 91 | extern const unsigned int cs_dsp_mock_adsp2_32bit_dsp1_region_sizes[]; |
| 92 | extern const struct cs_dsp_region cs_dsp_mock_adsp2_16bit_dsp1_regions[]; |
| 93 | extern const unsigned int cs_dsp_mock_adsp2_16bit_dsp1_region_sizes[]; |
| 94 | int cs_dsp_mock_count_regions(const unsigned int *region_sizes); |
| 95 | unsigned int cs_dsp_mock_size_of_region(const struct cs_dsp *dsp, int mem_type); |
| 96 | unsigned int cs_dsp_mock_base_addr_for_mem(struct cs_dsp_test *priv, int mem_type); |
| 97 | unsigned int cs_dsp_mock_reg_addr_inc_per_unpacked_word(struct cs_dsp_test *priv); |
| 98 | unsigned int cs_dsp_mock_reg_block_length_bytes(struct cs_dsp_test *priv, int mem_type); |
| 99 | unsigned int cs_dsp_mock_reg_block_length_registers(struct cs_dsp_test *priv, int mem_type); |
| 100 | unsigned int cs_dsp_mock_reg_block_length_dsp_words(struct cs_dsp_test *priv, int mem_type); |
| 101 | bool cs_dsp_mock_has_zm(struct cs_dsp_test *priv); |
| 102 | int cs_dsp_mock_packed_to_unpacked_mem_type(int packed_mem_type); |
| 103 | unsigned int cs_dsp_mock_num_dsp_words_to_num_packed_regs(unsigned int num_dsp_words); |
| 104 | unsigned int (struct cs_dsp_test *priv, |
| 105 | unsigned int alg_id, |
| 106 | int mem_type); |
| 107 | unsigned int (struct cs_dsp_mock_xm_header *); |
| 108 | void (struct cs_dsp_test *priv); |
| 109 | int (struct cs_dsp_mock_xm_header *); |
| 110 | struct cs_dsp_mock_xm_header *(struct cs_dsp_test *priv, |
| 111 | const struct cs_dsp_mock_alg_def *algs, |
| 112 | size_t num_algs); |
| 113 | |
| 114 | int cs_dsp_mock_regmap_init(struct cs_dsp_test *priv); |
| 115 | void cs_dsp_mock_regmap_drop_range(struct cs_dsp_test *priv, |
| 116 | unsigned int first_reg, unsigned int last_reg); |
| 117 | void cs_dsp_mock_regmap_drop_regs(struct cs_dsp_test *priv, |
| 118 | unsigned int first_reg, size_t num_regs); |
| 119 | void cs_dsp_mock_regmap_drop_bytes(struct cs_dsp_test *priv, |
| 120 | unsigned int first_reg, size_t num_bytes); |
| 121 | void cs_dsp_mock_regmap_drop_system_regs(struct cs_dsp_test *priv); |
| 122 | bool cs_dsp_mock_regmap_is_dirty(struct cs_dsp_test *priv, bool drop_system_regs); |
| 123 | |
| 124 | struct cs_dsp_mock_bin_builder *cs_dsp_mock_bin_init(struct cs_dsp_test *priv, |
| 125 | int format_version, |
| 126 | unsigned int fw_version); |
| 127 | void cs_dsp_mock_bin_add_raw_block(struct cs_dsp_mock_bin_builder *builder, |
| 128 | unsigned int alg_id, unsigned int alg_ver, |
| 129 | int type, unsigned int offset, |
| 130 | const void *payload_data, size_t payload_len_bytes); |
| 131 | void cs_dsp_mock_bin_add_info(struct cs_dsp_mock_bin_builder *builder, |
| 132 | const char *info); |
| 133 | void cs_dsp_mock_bin_add_name(struct cs_dsp_mock_bin_builder *builder, |
| 134 | const char *name); |
| 135 | void cs_dsp_mock_bin_add_patch(struct cs_dsp_mock_bin_builder *builder, |
| 136 | unsigned int alg_id, unsigned int alg_ver, |
| 137 | int mem_region, unsigned int reg_addr_offset, |
| 138 | const void *payload_data, size_t payload_len_bytes); |
| 139 | struct firmware *cs_dsp_mock_bin_get_firmware(struct cs_dsp_mock_bin_builder *builder); |
| 140 | |
| 141 | struct cs_dsp_mock_wmfw_builder *cs_dsp_mock_wmfw_init(struct cs_dsp_test *priv, |
| 142 | int format_version); |
| 143 | void cs_dsp_mock_wmfw_add_raw_block(struct cs_dsp_mock_wmfw_builder *builder, |
| 144 | int mem_region, unsigned int mem_offset_dsp_words, |
| 145 | const void *payload_data, size_t payload_len_bytes); |
| 146 | void cs_dsp_mock_wmfw_add_info(struct cs_dsp_mock_wmfw_builder *builder, |
| 147 | const char *info); |
| 148 | void cs_dsp_mock_wmfw_add_data_block(struct cs_dsp_mock_wmfw_builder *builder, |
| 149 | int mem_region, unsigned int mem_offset_dsp_words, |
| 150 | const void *payload_data, size_t payload_len_bytes); |
| 151 | void cs_dsp_mock_wmfw_start_alg_info_block(struct cs_dsp_mock_wmfw_builder *builder, |
| 152 | unsigned int alg_id, |
| 153 | const char *name, |
| 154 | const char *description); |
| 155 | void cs_dsp_mock_wmfw_add_coeff_desc(struct cs_dsp_mock_wmfw_builder *builder, |
| 156 | const struct cs_dsp_mock_coeff_def *def); |
| 157 | void cs_dsp_mock_wmfw_end_alg_info_block(struct cs_dsp_mock_wmfw_builder *builder); |
| 158 | struct firmware *cs_dsp_mock_wmfw_get_firmware(struct cs_dsp_mock_wmfw_builder *builder); |
| 159 | int cs_dsp_mock_wmfw_format_version(struct cs_dsp_mock_wmfw_builder *builder); |
| 160 | |