summaryrefslogtreecommitdiff
path: root/src/soc/mediatek/common
diff options
context:
space:
mode:
authorRex-BC Chen <rex-bc.chen@mediatek.com>2021-06-01 11:22:32 +0800
committerHung-Te Lin <hungte@chromium.org>2021-06-04 10:10:54 +0000
commit80373767ed5a74867d92408ca572483f58ef7ff5 (patch)
tree13dd97b27188e87ee897fd98b035dbf3ee271b5a /src/soc/mediatek/common
parentc6c54439f8caa9796bd28313469bd740eb671275 (diff)
soc/mediatek: Extract spm_parse_firmware to common
spm_parse_firmware can be shared by MT8192 and MT8195. TEST=emerge-asurada coreboot; Signed-off-by: Rex-BC Chen <rex-bc.chen@mediatek.com> Change-Id: I54d9672aa9ee9078ec9fe3fa4f2e9fe860a50636 Reviewed-on: https://review.coreboot.org/c/coreboot/+/55139 Reviewed-by: Rex-BC Chen <rex-bc.chen@mediatek.corp-partner.google.com> Reviewed-by: Yu-Ping Wu <yupingso@google.com> Tested-by: build bot (Jenkins) <no-reply@coreboot.org>
Diffstat (limited to 'src/soc/mediatek/common')
-rw-r--r--src/soc/mediatek/common/include/soc/spm_common.h9
-rw-r--r--src/soc/mediatek/common/spm.c55
2 files changed, 64 insertions, 0 deletions
diff --git a/src/soc/mediatek/common/include/soc/spm_common.h b/src/soc/mediatek/common/include/soc/spm_common.h
new file mode 100644
index 0000000000..43c4dcf46e
--- /dev/null
+++ b/src/soc/mediatek/common/include/soc/spm_common.h
@@ -0,0 +1,9 @@
+/* SPDX-License-Identifier: GPL-2.0-only */
+
+#ifndef SOC_MEDIATEK_SPM_COMMON_H
+#define SOC_MEDIATEK_SPM_COMMON_H
+
+#include <soc/mcu_common.h>
+
+void spm_parse_firmware(struct mtk_mcu *mcu);
+#endif /* SOC_MEDIATEK_SPM_COMMON_H */
diff --git a/src/soc/mediatek/common/spm.c b/src/soc/mediatek/common/spm.c
new file mode 100644
index 0000000000..48f75fe661
--- /dev/null
+++ b/src/soc/mediatek/common/spm.c
@@ -0,0 +1,55 @@
+/* SPDX-License-Identifier: GPL-2.0-only */
+
+#include <assert.h>
+#include <console/console.h>
+#include <soc/mcu_common.h>
+#include <soc/spm.h>
+#include <soc/spm_common.h>
+#include <string.h>
+#include <timer.h>
+
+#define SPMFW_HEADER_SIZE 16
+
+void spm_parse_firmware(struct mtk_mcu *mcu)
+{
+ size_t file_size, copy_size;
+ int offset;
+ u16 firmware_size;
+
+ struct dyna_load_pcm *pcm = (struct dyna_load_pcm *)mcu->priv;
+ file_size = mcu->run_size;
+
+ /*
+ * spmfw layout:
+ * u16 firmware_size
+ * u32 binary[firmware_size]
+ * struct pcm_desc descriptor
+ * char *version
+ */
+
+ /* Firmware size */
+ offset = 0;
+ copy_size = sizeof(firmware_size);
+ memcpy(&firmware_size, mcu->load_buffer + offset, copy_size);
+ printk(BIOS_DEBUG, "SPM: binary array size = %#x\n", firmware_size);
+
+ /* Binary */
+ offset = SPMFW_HEADER_SIZE; /* binary start offset */
+ copy_size = firmware_size * sizeof(u32);
+ assert(offset < file_size);
+ pcm->buf = (u8 *)(mcu->load_buffer + offset);
+
+ /* Descriptor */
+ offset += copy_size;
+ assert(offset < file_size);
+ copy_size = sizeof(pcm->desc);
+ memcpy(&pcm->desc, mcu->load_buffer + offset, copy_size);
+
+ /* Firmware size and total words need to be the same */
+ assert(firmware_size == pcm->desc.total_words);
+
+ /* Version */
+ offset += copy_size;
+ assert(offset < file_size);
+ printk(BIOS_INFO, "SPM: spmfw (version %s)\n", (u8 *)mcu->load_buffer + offset);
+}