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)
 {
                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);