Lines Matching +full:x +full:- +full:size

1 // SPDX-License-Identifier: (GPL-2.0-only OR BSD-3-Clause)
9 #include "sof-priv.h"
10 #include "sof-audio.h"
11 #include "ipc3-priv.h"
20 memcpy(&sdev->fw_ready.version, &v->version, sizeof(v->version)); in ipc3_fw_ext_man_get_version()
21 sdev->fw_ready.flags = v->flags; in ipc3_fw_ext_man_get_version()
34 return sof_ipc3_get_ext_windows(sdev, &w->ipc_window.ext_hdr); in ipc3_fw_ext_man_get_windows()
44 return sof_ipc3_get_cc_info(sdev, &cc->cc_version.ext_hdr); in ipc3_fw_ext_man_get_cc_info()
53 if (sdev->first_boot) in ipc3_fw_ext_man_get_dbg_abi_info()
54 dev_dbg(sdev->dev, in ipc3_fw_ext_man_get_dbg_abi_info()
56 SOF_ABI_VERSION_MAJOR(dbg_abi->dbg_abi.abi_dbg_version), in ipc3_fw_ext_man_get_dbg_abi_info()
57 SOF_ABI_VERSION_MINOR(dbg_abi->dbg_abi.abi_dbg_version), in ipc3_fw_ext_man_get_dbg_abi_info()
58 SOF_ABI_VERSION_PATCH(dbg_abi->dbg_abi.abi_dbg_version)); in ipc3_fw_ext_man_get_dbg_abi_info()
75 elems_size = config->hdr.size - sizeof(struct sof_ext_man_elem_header); in ipc3_fw_ext_man_get_config_data()
78 dev_dbg(sdev->dev, "manifest can hold up to %d config elements\n", elems_counter); in ipc3_fw_ext_man_get_config_data()
81 elem = &config->elems[i]; in ipc3_fw_ext_man_get_config_data()
82 dev_dbg(sdev->dev, "get index %d token %d val %d\n", in ipc3_fw_ext_man_get_config_data()
83 i, elem->token, elem->value); in ipc3_fw_ext_man_get_config_data()
84 switch (elem->token) { in ipc3_fw_ext_man_get_config_data()
86 /* unused memory space is zero filled - mapped to EMPTY elements */ in ipc3_fw_ext_man_get_config_data()
89 /* TODO: use ipc msg size from config data */ in ipc3_fw_ext_man_get_config_data()
92 if (sdev->first_boot && elem->value) in ipc3_fw_ext_man_get_config_data()
96 dev_info(sdev->dev, in ipc3_fw_ext_man_get_config_data()
98 elem->token, elem->value); in ipc3_fw_ext_man_get_config_data()
102 dev_err(sdev->dev, in ipc3_fw_ext_man_get_config_data()
103 "%s: processing failed for token %d value %#x, %d\n", in ipc3_fw_ext_man_get_config_data()
104 __func__, elem->token, elem->value, ret); in ipc3_fw_ext_man_get_config_data()
116 head = (struct sof_ext_man_header *)fw->data; in ipc3_fw_ext_man_size()
119 * assert fw size is big enough to contain extended manifest header, in ipc3_fw_ext_man_size()
123 if (fw->size < sizeof(*head)) in ipc3_fw_ext_man_size()
124 return -EINVAL; in ipc3_fw_ext_man_size()
130 if (head->magic == SOF_EXT_MAN_MAGIC_NUMBER) in ipc3_fw_ext_man_size()
131 return head->full_size; in ipc3_fw_ext_man_size()
134 dev_dbg(sdev->dev, "Unexpected extended manifest magic number: %#x\n", in ipc3_fw_ext_man_size()
135 head->magic); in ipc3_fw_ext_man_size()
141 const struct firmware *fw = sdev->basefw.fw; in sof_ipc3_fw_parse_ext_man()
149 head = (struct sof_ext_man_header *)fw->data; in sof_ipc3_fw_parse_ext_man()
150 remaining = head->full_size - head->header_size; in sof_ipc3_fw_parse_ext_man()
151 if (remaining < 0 || remaining > sdev->basefw.fw->size) in sof_ipc3_fw_parse_ext_man()
152 return -EINVAL; in sof_ipc3_fw_parse_ext_man()
161 head->header_version)) { in sof_ipc3_fw_parse_ext_man()
162 dev_err(sdev->dev, in sof_ipc3_fw_parse_ext_man()
163 "extended manifest version %#x differ from used %#x\n", in sof_ipc3_fw_parse_ext_man()
164 head->header_version, SOF_EXT_MAN_VERSION); in sof_ipc3_fw_parse_ext_man()
165 return -EINVAL; in sof_ipc3_fw_parse_ext_man()
169 iptr = (uintptr_t)fw->data + head->header_size; in sof_ipc3_fw_parse_ext_man()
174 dev_dbg(sdev->dev, "found sof_ext_man header type %d size %#x\n", in sof_ipc3_fw_parse_ext_man()
175 elem_hdr->type, elem_hdr->size); in sof_ipc3_fw_parse_ext_man()
177 if (elem_hdr->size < sizeof(*elem_hdr) || in sof_ipc3_fw_parse_ext_man()
178 elem_hdr->size > remaining) { in sof_ipc3_fw_parse_ext_man()
179 dev_err(sdev->dev, in sof_ipc3_fw_parse_ext_man()
180 "invalid sof_ext_man header size, type %d size %#x\n", in sof_ipc3_fw_parse_ext_man()
181 elem_hdr->type, elem_hdr->size); in sof_ipc3_fw_parse_ext_man()
182 return -EINVAL; in sof_ipc3_fw_parse_ext_man()
186 switch (elem_hdr->type) { in sof_ipc3_fw_parse_ext_man()
197 dev_dbg(sdev->dev, "Probe info (not parsed)\n"); in sof_ipc3_fw_parse_ext_man()
209 dev_info(sdev->dev, in sof_ipc3_fw_parse_ext_man()
210 "unknown sof_ext_man header type %d size %#x\n", in sof_ipc3_fw_parse_ext_man()
211 elem_hdr->type, elem_hdr->size); in sof_ipc3_fw_parse_ext_man()
216 dev_err(sdev->dev, in sof_ipc3_fw_parse_ext_man()
217 "failed to parse sof_ext_man header type %d size %#x\n", in sof_ipc3_fw_parse_ext_man()
218 elem_hdr->type, elem_hdr->size); in sof_ipc3_fw_parse_ext_man()
222 remaining -= elem_hdr->size; in sof_ipc3_fw_parse_ext_man()
223 iptr += elem_hdr->size; in sof_ipc3_fw_parse_ext_man()
227 dev_err(sdev->dev, "error: sof_ext_man header is inconsistent\n"); in sof_ipc3_fw_parse_ext_man()
228 return -EINVAL; in sof_ipc3_fw_parse_ext_man()
243 dev_dbg(sdev->dev, "new module size %#x blocks %#x type %#x\n", in sof_ipc3_parse_module_memcpy()
244 module->size, module->num_blocks, module->type); in sof_ipc3_parse_module_memcpy()
248 /* module->size doesn't include header size */ in sof_ipc3_parse_module_memcpy()
249 remaining = module->size; in sof_ipc3_parse_module_memcpy()
250 for (count = 0; count < module->num_blocks; count++) { in sof_ipc3_parse_module_memcpy()
253 dev_err(sdev->dev, "not enough data remaining\n"); in sof_ipc3_parse_module_memcpy()
254 return -EINVAL; in sof_ipc3_parse_module_memcpy()
257 /* minus header size of block */ in sof_ipc3_parse_module_memcpy()
258 remaining -= sizeof(*block); in sof_ipc3_parse_module_memcpy()
260 if (block->size == 0) { in sof_ipc3_parse_module_memcpy()
261 dev_warn(sdev->dev, in sof_ipc3_parse_module_memcpy()
262 "warning: block %d size zero\n", count); in sof_ipc3_parse_module_memcpy()
263 dev_warn(sdev->dev, " type %#x offset %#x\n", in sof_ipc3_parse_module_memcpy()
264 block->type, block->offset); in sof_ipc3_parse_module_memcpy()
268 switch (block->type) { in sof_ipc3_parse_module_memcpy()
275 offset = block->offset; in sof_ipc3_parse_module_memcpy()
278 dev_err(sdev->dev, "%s: bad type %#x for block %#x\n", in sof_ipc3_parse_module_memcpy()
279 __func__, block->type, count); in sof_ipc3_parse_module_memcpy()
280 return -EINVAL; in sof_ipc3_parse_module_memcpy()
283 dev_dbg(sdev->dev, "block %d type %#x size %#x ==> offset %#x\n", in sof_ipc3_parse_module_memcpy()
284 count, block->type, block->size, offset); in sof_ipc3_parse_module_memcpy()
286 /* checking block->size to avoid unaligned access */ in sof_ipc3_parse_module_memcpy()
287 if (block->size % sizeof(u32)) { in sof_ipc3_parse_module_memcpy()
288 dev_err(sdev->dev, "%s: invalid block size %#x\n", in sof_ipc3_parse_module_memcpy()
289 __func__, block->size); in sof_ipc3_parse_module_memcpy()
290 return -EINVAL; in sof_ipc3_parse_module_memcpy()
292 ret = snd_sof_dsp_block_write(sdev, block->type, offset, in sof_ipc3_parse_module_memcpy()
293 block + 1, block->size); in sof_ipc3_parse_module_memcpy()
295 dev_err(sdev->dev, "%s: write to block type %#x failed\n", in sof_ipc3_parse_module_memcpy()
296 __func__, block->type); in sof_ipc3_parse_module_memcpy()
300 if (remaining < block->size) { in sof_ipc3_parse_module_memcpy()
301 dev_err(sdev->dev, "%s: not enough data remaining\n", __func__); in sof_ipc3_parse_module_memcpy()
302 return -EINVAL; in sof_ipc3_parse_module_memcpy()
305 /* minus body size of block */ in sof_ipc3_parse_module_memcpy()
306 remaining -= block->size; in sof_ipc3_parse_module_memcpy()
309 + block->size); in sof_ipc3_parse_module_memcpy()
317 u32 payload_offset = sdev->basefw.payload_offset; in sof_ipc3_load_fw_to_dsp()
318 const struct firmware *fw = sdev->basefw.fw; in sof_ipc3_load_fw_to_dsp()
326 return -EINVAL; in sof_ipc3_load_fw_to_dsp()
328 header = (struct snd_sof_fw_header *)(fw->data + payload_offset); in sof_ipc3_load_fw_to_dsp()
329 load_module = sof_ops(sdev)->load_module; in sof_ipc3_load_fw_to_dsp()
331 dev_dbg(sdev->dev, "Using generic module loading\n"); in sof_ipc3_load_fw_to_dsp()
334 dev_dbg(sdev->dev, "Using custom module loading\n"); in sof_ipc3_load_fw_to_dsp()
338 module = (struct snd_sof_mod_hdr *)(fw->data + payload_offset + sizeof(*header)); in sof_ipc3_load_fw_to_dsp()
339 remaining = fw->size - sizeof(*header) - payload_offset; in sof_ipc3_load_fw_to_dsp()
341 if (remaining > fw->size) { in sof_ipc3_load_fw_to_dsp()
342 dev_err(sdev->dev, "%s: fw size smaller than header size\n", __func__); in sof_ipc3_load_fw_to_dsp()
343 return -EINVAL; in sof_ipc3_load_fw_to_dsp()
346 for (count = 0; count < header->num_modules; count++) { in sof_ipc3_load_fw_to_dsp()
349 dev_err(sdev->dev, "%s: not enough data for a module\n", in sof_ipc3_load_fw_to_dsp()
351 return -EINVAL; in sof_ipc3_load_fw_to_dsp()
354 /* minus header size of module */ in sof_ipc3_load_fw_to_dsp()
355 remaining -= sizeof(*module); in sof_ipc3_load_fw_to_dsp()
360 dev_err(sdev->dev, "%s: invalid module %d\n", __func__, count); in sof_ipc3_load_fw_to_dsp()
364 if (remaining < module->size) { in sof_ipc3_load_fw_to_dsp()
365 dev_err(sdev->dev, "%s: not enough data remaining\n", __func__); in sof_ipc3_load_fw_to_dsp()
366 return -EINVAL; in sof_ipc3_load_fw_to_dsp()
369 /* minus body size of module */ in sof_ipc3_load_fw_to_dsp()
370 remaining -= module->size; in sof_ipc3_load_fw_to_dsp()
372 sizeof(*module) + module->size); in sof_ipc3_load_fw_to_dsp()
380 u32 payload_offset = sdev->basefw.payload_offset; in sof_ipc3_validate_firmware()
381 const struct firmware *fw = sdev->basefw.fw; in sof_ipc3_validate_firmware()
383 size_t fw_size = fw->size - payload_offset; in sof_ipc3_validate_firmware()
385 if (fw->size <= payload_offset) { in sof_ipc3_validate_firmware()
386 dev_err(sdev->dev, in sof_ipc3_validate_firmware()
387 "firmware size must be greater than firmware offset\n"); in sof_ipc3_validate_firmware()
388 return -EINVAL; in sof_ipc3_validate_firmware()
392 header = (struct snd_sof_fw_header *)(fw->data + payload_offset); in sof_ipc3_validate_firmware()
395 if (strncmp(header->sig, SND_SOF_FW_SIG, SND_SOF_FW_SIG_SIZE) != 0) { in sof_ipc3_validate_firmware()
396 dev_err(sdev->dev, "invalid firmware signature\n"); in sof_ipc3_validate_firmware()
397 return -EINVAL; in sof_ipc3_validate_firmware()
400 /* check size is valid */ in sof_ipc3_validate_firmware()
401 if (fw_size != header->file_size + sizeof(*header)) { in sof_ipc3_validate_firmware()
402 dev_err(sdev->dev, in sof_ipc3_validate_firmware()
403 "invalid filesize mismatch got 0x%zx expected 0x%zx\n", in sof_ipc3_validate_firmware()
404 fw_size, header->file_size + sizeof(*header)); in sof_ipc3_validate_firmware()
405 return -EINVAL; in sof_ipc3_validate_firmware()
408 dev_dbg(sdev->dev, "header size=0x%x modules=0x%x abi=0x%x size=%zu\n", in sof_ipc3_validate_firmware()
409 header->file_size, header->num_modules, in sof_ipc3_validate_firmware()
410 header->abi, sizeof(*header)); in sof_ipc3_validate_firmware()