ASoC: SOF: ipc4: add a helper function to search debug slot
authorRander Wang <rander.wang@intel.com>
Tue, 19 Sep 2023 09:24:10 +0000 (12:24 +0300)
committerMark Brown <broonie@kernel.org>
Tue, 19 Sep 2023 12:48:46 +0000 (13:48 +0100)
Currently IPC4 supports GDB slot, telemetry slot and
debug slot. This helper function will be used to get
the slot offset in debug windows for further processing.

Signed-off-by: Rander Wang <rander.wang@intel.com>
Reviewed-by: Péter Ujfalusi <peter.ujfalusi@linux.intel.com>
Reviewed-by: Kai Vehmanen <kai.vehmanen@linux.intel.com>
Reviewed-by: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com>
Reviewed-by: Guennadi Liakhovetski <guennadi.liakhovetski@linux.intel.com>
Signed-off-by: Peter Ujfalusi <peter.ujfalusi@linux.intel.com>
Link: https://lore.kernel.org/r/20230919092416.4137-4-peter.ujfalusi@linux.intel.com
Signed-off-by: Mark Brown <broonie@kernel.org>
sound/soc/sof/ipc4-priv.h
sound/soc/sof/ipc4.c

index a5d0b2eae4641265b32112096d991d402238e307..9e69b7c2911709c7a2f4c6415d51fd6d274bd47e 100644 (file)
@@ -120,4 +120,7 @@ void sof_ipc4_update_cpc_from_manifest(struct snd_sof_dev *sdev,
                                       struct sof_ipc4_fw_module *fw_module,
                                       struct sof_ipc4_base_module_cfg *basecfg);
 
+size_t sof_ipc4_find_debug_slot_offset_by_type(struct snd_sof_dev *sdev,
+                                              u32 slot_type);
+
 #endif
index 6c33ee5af32b094f49e55ee8f13cfd0e6983baa8..4673c53f6c036bf1b6b41df97da3f4469590b275 100644 (file)
@@ -547,6 +547,29 @@ static int sof_ipc4_init_msg_memory(struct snd_sof_dev *sdev)
        return 0;
 }
 
+size_t sof_ipc4_find_debug_slot_offset_by_type(struct snd_sof_dev *sdev,
+                                              u32 slot_type)
+{
+       size_t slot_desc_type_offset;
+       u32 type;
+       int i;
+
+       /* The type is the second u32 in the slot descriptor */
+       slot_desc_type_offset = sdev->debug_box.offset + sizeof(u32);
+       for (i = 0; i < SOF_IPC4_MAX_DEBUG_SLOTS; i++) {
+               sof_mailbox_read(sdev, slot_desc_type_offset, &type, sizeof(type));
+
+               if (type == slot_type)
+                       return sdev->debug_box.offset + (i + 1) * SOF_IPC4_DEBUG_SLOT_SIZE;
+
+               slot_desc_type_offset += SOF_IPC4_DEBUG_DESCRIPTOR_SIZE;
+       }
+
+       dev_dbg(sdev->dev, "Slot type %#x is not available in debug window\n", slot_type);
+       return 0;
+}
+EXPORT_SYMBOL(sof_ipc4_find_debug_slot_offset_by_type);
+
 static int ipc4_fw_ready(struct snd_sof_dev *sdev, struct sof_ipc4_msg *ipc4_msg)
 {
        int inbox_offset, inbox_size, outbox_offset, outbox_size;