ASoC: SOF: log compiler name and version information
authorKarol Trzcinski <karolx.trzcinski@linux.intel.com>
Wed, 18 Dec 2019 00:26:11 +0000 (18:26 -0600)
committerMark Brown <broonie@kernel.org>
Wed, 18 Dec 2019 19:52:57 +0000 (19:52 +0000)
Log information about used compilator and optimization level
in sof firmware to host system.
It will be helful to catch some compiler dependent bugs.

Signed-off-by: Karol Trzcinski <karolx.trzcinski@linux.intel.com>
Signed-off-by: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com>
Link: https://lore.kernel.org/r/20191218002616.7652-4-pierre-louis.bossart@linux.intel.com
Signed-off-by: Mark Brown <broonie@kernel.org>
sound/soc/sof/loader.c
sound/soc/sof/sof-priv.h

index 31847aa..235be4f 100644 (file)
@@ -32,6 +32,42 @@ static int get_ext_windows(struct snd_sof_dev *sdev,
        return 0;
 }
 
+static int get_cc_info(struct snd_sof_dev *sdev,
+                      struct sof_ipc_ext_data_hdr *ext_hdr)
+{
+       int ret;
+
+       struct sof_ipc_cc_version *cc =
+               container_of(ext_hdr, struct sof_ipc_cc_version, ext_hdr);
+
+       dev_dbg(sdev->dev, "Firmware info: used compiler %s %d:%d:%d%s used optimization flags %s\n",
+               cc->name, cc->major, cc->minor, cc->micro, cc->desc,
+               cc->optim);
+
+       /* create read-only cc_version debugfs to store compiler version info */
+       /* use local copy of the cc_version to prevent data corruption */
+       if (sdev->first_boot) {
+               sdev->cc_version = devm_kmalloc(sdev->dev, cc->ext_hdr.hdr.size,
+                                               GFP_KERNEL);
+
+               if (!sdev->cc_version)
+                       return -ENOMEM;
+
+               memcpy(sdev->cc_version, cc, cc->ext_hdr.hdr.size);
+               ret = snd_sof_debugfs_buf_item(sdev, sdev->cc_version,
+                                              cc->ext_hdr.hdr.size,
+                                              "cc_version", 0444);
+
+               /* errors are only due to memory allocation, not debugfs */
+               if (ret < 0) {
+                       dev_err(sdev->dev, "error: snd_sof_debugfs_buf_item failed\n");
+                       return ret;
+               }
+       }
+
+       return 0;
+}
+
 /* parse the extended FW boot data structures from FW boot message */
 int snd_sof_fw_parse_ext_data(struct snd_sof_dev *sdev, u32 bar, u32 offset)
 {
@@ -65,6 +101,9 @@ int snd_sof_fw_parse_ext_data(struct snd_sof_dev *sdev, u32 bar, u32 offset)
                case SOF_IPC_EXT_WINDOW:
                        ret = get_ext_windows(sdev, ext_hdr);
                        break;
+               case SOF_IPC_EXT_CC_INFO:
+                       ret = get_cc_info(sdev, ext_hdr);
+                       break;
                default:
                        dev_warn(sdev->dev, "warning: unknown ext header type %d size 0x%x\n",
                                 ext_hdr->type, ext_hdr->hdr.size);
index 220b351..3f1e1eb 100644 (file)
@@ -361,6 +361,7 @@ struct snd_sof_dev {
        struct snd_dma_buffer dmab_bdl;
        struct sof_ipc_fw_ready fw_ready;
        struct sof_ipc_fw_version fw_version;
+       struct sof_ipc_cc_version *cc_version;
 
        /* topology */
        struct snd_soc_tplg_ops *tplg_ops;