// SPDX-License-Identifier: (GPL-2.0-only OR BSD-3-Clause) // // This file is provided under a dual BSD/GPLv2 license. When using or // redistributing this file, you may do so under either license. // // Copyright(c) 2022 Intel Corporation
dev_dbg(sdev->dev, "manifest can hold up to %d config elements\n", elems_counter);
for (i = 0; i < elems_counter; ++i) {
elem = &config->elems[i];
dev_dbg(sdev->dev, "get index %d token %d val %d\n",
i, elem->token, elem->value); switch (elem->token) { case SOF_EXT_MAN_CONFIG_EMPTY: /* unused memory space is zero filled - mapped to EMPTY elements */ break; case SOF_EXT_MAN_CONFIG_IPC_MSG_SIZE: /* TODO: use ipc msg size from config data */ break; case SOF_EXT_MAN_CONFIG_MEMORY_USAGE_SCAN: if (sdev->first_boot && elem->value)
ret = snd_sof_dbg_memory_info_init(sdev); break; default:
dev_info(sdev->dev, "Unknown firmware configuration token %d value %d",
elem->token, elem->value); break;
} if (ret < 0) {
dev_err(sdev->dev, "%s: processing failed for token %d value %#x, %d\n",
__func__, elem->token, elem->value, ret); return ret;
}
}
/* * assert fw size is big enough to contain extended manifest header, * it prevents from reading unallocated memory from `head` in following * step.
*/ if (fw->size < sizeof(*head)) return -EINVAL;
/* * When fw points to extended manifest, * then first u32 must be equal SOF_EXT_MAN_MAGIC_NUMBER.
*/ if (head->magic == SOF_EXT_MAN_MAGIC_NUMBER) return head->full_size;
/* otherwise given fw don't have an extended manifest */
dev_dbg(sdev->dev, "Unexpected extended manifest magic number: %#x\n",
head->magic); return 0;
}
/* Assert firmware starts with extended manifest */ if (ext_man_size <= 0) return ext_man_size;
/* incompatible version */ if (SOF_EXT_MAN_VERSION_INCOMPATIBLE(SOF_EXT_MAN_VERSION,
head->header_version)) {
dev_err(sdev->dev, "extended manifest version %#x differ from used %#x\n",
head->header_version, SOF_EXT_MAN_VERSION); return -EINVAL;
}
/* get first extended manifest element header */
iptr = (uintptr_t)fw->data + head->header_size;
while (remaining > sizeof(*elem_hdr)) {
elem_hdr = (struct sof_ext_man_elem_header *)iptr;
dev_dbg(sdev->dev, "found sof_ext_man header type %d size %#x\n",
elem_hdr->type, elem_hdr->size);
/* process structure data */ switch (elem_hdr->type) { case SOF_EXT_MAN_ELEM_FW_VERSION:
ret = ipc3_fw_ext_man_get_version(sdev, elem_hdr); break; case SOF_EXT_MAN_ELEM_WINDOW:
ret = ipc3_fw_ext_man_get_windows(sdev, elem_hdr); break; case SOF_EXT_MAN_ELEM_CC_VERSION:
ret = ipc3_fw_ext_man_get_cc_info(sdev, elem_hdr); break; case SOF_EXT_MAN_ELEM_PROBE_INFO:
dev_dbg(sdev->dev, "Probe info (not parsed)\n"); break; case SOF_EXT_MAN_ELEM_DBG_ABI:
ret = ipc3_fw_ext_man_get_dbg_abi_info(sdev, elem_hdr); break; case SOF_EXT_MAN_ELEM_CONFIG_DATA:
ret = ipc3_fw_ext_man_get_config_data(sdev, elem_hdr); break; case SOF_EXT_MAN_ELEM_PLATFORM_CONFIG_DATA:
ret = snd_sof_dsp_parse_platform_ext_manifest(sdev, elem_hdr); break; default:
dev_info(sdev->dev, "unknown sof_ext_man header type %d size %#x\n",
elem_hdr->type, elem_hdr->size); break;
}
if (ret < 0) {
dev_err(sdev->dev, "failed to parse sof_ext_man header type %d size %#x\n",
elem_hdr->type, elem_hdr->size); return ret;
}
switch (block->type) { case SOF_FW_BLK_TYPE_RSRVD0: case SOF_FW_BLK_TYPE_ROM...SOF_FW_BLK_TYPE_RSRVD14: continue; /* not handled atm */ case SOF_FW_BLK_TYPE_IRAM: case SOF_FW_BLK_TYPE_DRAM: case SOF_FW_BLK_TYPE_SRAM:
offset = block->offset; break; default:
dev_err(sdev->dev, "%s: bad type %#x for block %#x\n",
__func__, block->type, count); return -EINVAL;
}
for (count = 0; count < header->num_modules; count++) { /* check for wrap */ if (remaining < sizeof(*module)) {
dev_err(sdev->dev, "%s: not enough data for a module\n",
__func__); return -EINVAL;
}
/* minus header size of module */
remaining -= sizeof(*module);
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.