/** * cs_dsp_mock_size_of_region() - Return size of given memory region. * * @dsp: Pointer to struct cs_dsp. * @mem_type: Memory region type. * * Return: Size of region in bytes.
*/ unsignedint cs_dsp_mock_size_of_region(conststruct cs_dsp *dsp, int mem_type)
{ constunsignedint *sizes; int i;
/** * cs_dsp_mock_reg_addr_inc_per_unpacked_word() - Unpacked register address increment per DSP word. * * @priv: Pointer to struct cs_dsp_test. * * Return: Amount by which register address increments to move to the next * DSP word in unpacked XM/YM/ZM.
*/ unsignedint cs_dsp_mock_reg_addr_inc_per_unpacked_word(struct cs_dsp_test *priv)
{ switch (priv->dsp->type) { case WMFW_ADSP2: return 2; /* two 16-bit register indexes per XM/YM/ZM word */ case WMFW_HALO: return 4; /* one byte-addressed 32-bit register per XM/YM/ZM word */ default:
KUNIT_FAIL(priv->test, "Unexpected DSP type\n"); return -1;
}
}
EXPORT_SYMBOL_NS_GPL(cs_dsp_mock_reg_addr_inc_per_unpacked_word, "FW_CS_DSP_KUNIT_TEST_UTILS");
/** * cs_dsp_mock_reg_block_length_bytes() - Number of bytes in an access block. * * @priv: Pointer to struct cs_dsp_test. * @mem_type: Memory region type. * * Return: Total number of bytes in a group of registers forming the * smallest bus access size (including any padding bits). For unpacked * memory this is the number of registers containing one DSP word. * For packed memory this is the number of registers in one packed * access block.
*/ unsignedint cs_dsp_mock_reg_block_length_bytes(struct cs_dsp_test *priv, int mem_type)
{ switch (priv->dsp->type) { case WMFW_ADSP2: switch (mem_type) { case WMFW_ADSP2_PM: return 3 * regmap_get_val_bytes(priv->dsp->regmap); case WMFW_ADSP2_XM: case WMFW_ADSP2_YM: case WMFW_ADSP2_ZM: returnsizeof(u32); default: break;
} break; case WMFW_HALO: switch (mem_type) { case WMFW_ADSP2_XM: case WMFW_ADSP2_YM: returnsizeof(u32); case WMFW_HALO_PM_PACKED: return 5 * sizeof(u32); case WMFW_HALO_XM_PACKED: case WMFW_HALO_YM_PACKED: return 3 * sizeof(u32); default: break;
} break; default:
KUNIT_FAIL(priv->test, "Unexpected DSP type\n"); return 0;
}
/** * cs_dsp_mock_reg_block_length_registers() - Number of registers in an access block. * * @priv: Pointer to struct cs_dsp_test. * @mem_type: Memory region type. * * Return: Total number of register forming the smallest bus access size. * For unpacked memory this is the number of registers containing one * DSP word. For packed memory this is the number of registers in one * packed access block.
*/ unsignedint cs_dsp_mock_reg_block_length_registers(struct cs_dsp_test *priv, int mem_type)
{ return cs_dsp_mock_reg_block_length_bytes(priv, mem_type) /
regmap_get_val_bytes(priv->dsp->regmap);
}
EXPORT_SYMBOL_NS_GPL(cs_dsp_mock_reg_block_length_registers, "FW_CS_DSP_KUNIT_TEST_UTILS");
/** * cs_dsp_mock_reg_block_length_dsp_words() - Number of dsp_words in an access block. * * @priv: Pointer to struct cs_dsp_test. * @mem_type: Memory region type. * * Return: Total number of DSP words in a group of registers forming the * smallest bus access size.
*/ unsignedint cs_dsp_mock_reg_block_length_dsp_words(struct cs_dsp_test *priv, int mem_type)
{ switch (priv->dsp->type) { case WMFW_ADSP2: switch (mem_type) { case WMFW_ADSP2_PM: return regmap_get_val_bytes(priv->dsp->regmap) / 2; case WMFW_ADSP2_XM: case WMFW_ADSP2_YM: case WMFW_ADSP2_ZM: return 1; default: break;
} break; case WMFW_HALO: switch (mem_type) { case WMFW_ADSP2_XM: case WMFW_ADSP2_YM: return 1; case WMFW_HALO_PM_PACKED: case WMFW_HALO_XM_PACKED: case WMFW_HALO_YM_PACKED: return 4; default: break;
} break; default:
KUNIT_FAIL(priv->test, "Unexpected DSP type\n"); return 0;
}
/** * cs_dsp_mock_has_zm() - DSP has ZM * * @priv: Pointer to struct cs_dsp_test. * * Return: True if DSP has ZM.
*/ bool cs_dsp_mock_has_zm(struct cs_dsp_test *priv)
{ switch (priv->dsp->type) { case WMFW_ADSP2: returntrue; default: returnfalse;
}
}
EXPORT_SYMBOL_NS_GPL(cs_dsp_mock_has_zm, "FW_CS_DSP_KUNIT_TEST_UTILS");
/** * cs_dsp_mock_packed_to_unpacked_mem_type() - Unpacked region that is * the same memory as a packed region. * * @packed_mem_type: Type of packed memory region. * * Return: unpacked type that is the same memory as packed_mem_type.
*/ int cs_dsp_mock_packed_to_unpacked_mem_type(int packed_mem_type)
{ switch (packed_mem_type) { case WMFW_HALO_XM_PACKED: return WMFW_ADSP2_XM; case WMFW_HALO_YM_PACKED: return WMFW_ADSP2_YM; default: return -1;
}
}
EXPORT_SYMBOL_NS_GPL(cs_dsp_mock_packed_to_unpacked_mem_type, "FW_CS_DSP_KUNIT_TEST_UTILS");
/** * cs_dsp_mock_num_dsp_words_to_num_packed_regs() - Number of DSP words * to number of packed registers. * * @num_dsp_words: Number of DSP words. * * Convert number of DSP words to number of packed registers rounded * down to the nearest register. * * Return: Number of packed registers.
*/ unsignedint cs_dsp_mock_num_dsp_words_to_num_packed_regs(unsignedint num_dsp_words)
{ /* There are 3 registers for every 4 packed words */ return (num_dsp_words * 3) / 4;
}
EXPORT_SYMBOL_NS_GPL(cs_dsp_mock_num_dsp_words_to_num_packed_regs, "FW_CS_DSP_KUNIT_TEST_UTILS");
/* * Leave enough space for this header and 40 algorithm descriptors. * base and size are counted in DSP words.
*/
.xm_base = cpu_to_be32(((sizeof(struct wmfw_halo_id_hdr) +
(40 * sizeof(struct wmfw_halo_alg_hdr)))
/ 4) * 3),
.xm_size = cpu_to_be32(0x20),
/* Allocate a dummy word of YM */
.ym_base = cpu_to_be32(0),
.ym_size = cpu_to_be32(1),
/* * Leave enough space for this header and 40 algorithm descriptors. * base and size are counted in DSP words.
*/
.xm = cpu_to_be32(((sizeof(struct wmfw_adsp2_id_hdr) +
(40 * sizeof(struct wmfw_adsp2_alg_hdr)))
/ 4) * 3),
.ym = cpu_to_be32(0),
.zm = cpu_to_be32(0),
.n_algs = 0,
};
/** * cs_dsp_mock_xm_header_get_alg_base_in_words() - Algorithm base offset in DSP words. * * @priv: Pointer to struct cs_dsp_test. * @alg_id: Algorithm ID. * @mem_type: Memory region type. * * Lookup an algorithm in the XM header and return the base offset in * DSP words of the algorithm data in the requested memory region. * * Return: Offset in DSP words.
*/ unsignedint cs_dsp_mock_xm_header_get_alg_base_in_words(struct cs_dsp_test *priv, unsignedint alg_id, int mem_type)
{ unsignedint xm = cs_dsp_mock_base_addr_for_mem(priv, WMFW_ADSP2_XM); union { struct wmfw_adsp2_alg_hdr adsp2; struct wmfw_halo_alg_hdr halo;
} alg; unsignedint alg_hdr_addr; unsignedint val, xm_base = 0, ym_base = 0, zm_base = 0; int ret;
switch (priv->dsp->type) { case WMFW_ADSP2: /* * Could be one 32-bit register or two 16-bit registers. * A raw read will read the requested number of bytes.
*/
KUNIT_ASSERT_GE(priv->test, 0,
regmap_raw_read(priv->dsp->regmap,
xm +
(offsetof(struct wmfw_adsp2_id_hdr, n_algs) / 2),
&num_algs_be32, sizeof(num_algs_be32)));
num_algs = be32_to_cpu(num_algs_be32);
bytes = sizeof(struct wmfw_adsp2_id_hdr) +
(num_algs * sizeof(struct wmfw_adsp2_alg_hdr)) +
4 /* terminator word */;
/* Check if we need to auto-allocate base addresses */ if (!alg_info->xm_base && alg_info->xm_size)
alg_info->xm_base = cpu_to_be32(next_free_xm_word);
if (!alg_info->ym_base && alg_info->ym_size)
alg_info->ym_base = cpu_to_be32(next_free_ym_word);
/* Write list terminator */
*(__be32 *)(alg_info) = cpu_to_be32(0xbedead);
}
/** * cs_dsp_mock_xm_header_write_to_regmap() - Write XM header to regmap. * * @header: Pointer to struct cs_dsp_mock_xm_header. * * The data in header is written to the XM addresses in the regmap. * * Return: 0 on success, else negative error code.
*/ int cs_dsp_mock_xm_header_write_to_regmap(struct cs_dsp_mock_xm_header *header)
{ struct cs_dsp_test *priv = header->test_priv; unsignedint reg_addr = cs_dsp_mock_base_addr_for_mem(priv, WMFW_ADSP2_XM);
/* * One 32-bit word corresponds to one 32-bit unpacked XM word so the * blob can be written directly to the regmap.
*/ return regmap_raw_write(priv->dsp->regmap, reg_addr,
header->blob_data, header->blob_size_bytes);
}
EXPORT_SYMBOL_NS_GPL(cs_dsp_mock_xm_header_write_to_regmap, "FW_CS_DSP_KUNIT_TEST_UTILS");
/** * cs_dsp_create_mock_xm_header() - Create a dummy XM header. * * @priv: Pointer to struct cs_dsp_test. * @algs: Pointer to array of struct cs_dsp_mock_alg_def listing the * dummy algorithm entries to include in the XM header. * @num_algs: Number of entries in the algs array. * * Return: Pointer to created struct cs_dsp_mock_xm_header.
*/ struct cs_dsp_mock_xm_header *cs_dsp_create_mock_xm_header(struct cs_dsp_test *priv, conststruct cs_dsp_mock_alg_def *algs,
size_t num_algs)
{ struct cs_dsp_mock_xm_header *builder;
size_t total_bytes_required; constvoid *header;
size_t header_size_bytes;
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.