]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
ASoC: SOF: sof-client: Add support for on-demand DSP boot
authorPeter Ujfalusi <peter.ujfalusi@linux.intel.com>
Mon, 15 Dec 2025 13:29:42 +0000 (15:29 +0200)
committerMark Brown <broonie@kernel.org>
Mon, 15 Dec 2025 14:07:42 +0000 (23:07 +0900)
With the introduction of on-demand DSP boot the rpm status not necessary
tells that the DSP firmware is booted up.

Introduce the sof_client_boot_dsp() which can be used to make sure that
the DSP is booted and it can handle IPCs.

Update the client drivers to use the new function where it is expected that
the DSP is booted up.

Signed-off-by: Peter Ujfalusi <peter.ujfalusi@linux.intel.com>
Reviewed-by: Bard Liao <yung-chuan.liao@linux.intel.com>
Reviewed-by: Kai Vehmanen <kai.vehmanen@linux.intel.com>
Reviewed-by: Liam Girdwood <liam.r.girdwood@intel.com>
Link: https://patch.msgid.link/20251215132946.2155-5-peter.ujfalusi@linux.intel.com
Signed-off-by: Mark Brown <broonie@kernel.org>
sound/soc/sof/sof-client-ipc-flood-test.c
sound/soc/sof/sof-client-ipc-kernel-injector.c
sound/soc/sof/sof-client-ipc-msg-injector.c
sound/soc/sof/sof-client-probes.c
sound/soc/sof/sof-client.c
sound/soc/sof/sof-client.h

index 373f3a12537216a954e57b02e7074c2f423c3b28..7b72d1c9c73919e81e622b56b657605cf4fad7bb 100644 (file)
@@ -219,9 +219,10 @@ static ssize_t sof_ipc_flood_dfs_write(struct file *file, const char __user *buf
                goto out;
        }
 
-       /* flood test */
-       ret = sof_debug_ipc_flood_test(cdev, flood_duration_test,
-                                      ipc_duration_ms, ipc_count);
+       ret = sof_client_boot_dsp(cdev);
+       if (!ret)
+               ret = sof_debug_ipc_flood_test(cdev, flood_duration_test,
+                                              ipc_duration_ms, ipc_count);
 
        err = pm_runtime_put_autosuspend(dev);
        if (err < 0)
index 249bd2d6c8d28bedeb64862928b160cbd9ab7aef..d5984990098a351786992179ae33c80a6059e34d 100644 (file)
@@ -63,7 +63,9 @@ static ssize_t sof_kernel_msg_inject_dfs_write(struct file *file, const char __u
                return ret;
        }
 
-       sof_client_ipc_rx_message(cdev, hdr, priv->kernel_buffer);
+       ret = sof_client_boot_dsp(cdev);
+       if (!ret)
+               sof_client_ipc_rx_message(cdev, hdr, priv->kernel_buffer);
 
        ret = pm_runtime_put_autosuspend(dev);
        if (ret < 0)
index 9c8a0fbfb8dfebc26b9a316c912eecbe2b6fe27f..c28f106de6ba768cff2871acd95d6dca4ec343c4 100644 (file)
@@ -131,11 +131,15 @@ static int sof_msg_inject_send_message(struct sof_client_dev *cdev)
                return ret;
        }
 
-       /* send the message */
-       ret = sof_client_ipc_tx_message(cdev, priv->tx_buffer, priv->rx_buffer,
-                                       priv->max_msg_size);
-       if (ret)
-               dev_err(dev, "IPC message send failed: %d\n", ret);
+       ret = sof_client_boot_dsp(cdev);
+       if (!ret) {
+               /* send the message */
+               ret = sof_client_ipc_tx_message(cdev, priv->tx_buffer,
+                                               priv->rx_buffer,
+                                               priv->max_msg_size);
+               if (ret)
+                       dev_err(dev, "IPC message send failed: %d\n", ret);
+       }
 
        err = pm_runtime_put_autosuspend(dev);
        if (err < 0)
index f753e0faff992bbb988c0c1a82e745eedf50cde7..124f555081592735f37116a2bd4c4d7ebe05dcc2 100644 (file)
@@ -123,6 +123,10 @@ static int sof_probes_compr_set_params(struct snd_compr_stream *cstream,
        if (ret)
                return ret;
 
+       ret = sof_client_boot_dsp(cdev);
+       if (ret)
+               return ret;
+
        ret = ipc->init(cdev, priv->extractor_stream_tag, rtd->dma_bytes);
        if (ret < 0) {
                dev_err(dai->dev, "Failed to init probe: %d\n", ret);
@@ -224,6 +228,10 @@ static ssize_t sof_probes_dfs_points_read(struct file *file, char __user *to,
                goto exit;
        }
 
+       ret = sof_client_boot_dsp(cdev);
+       if (ret)
+               goto pm_error;
+
        ret = ipc->points_info(cdev, &desc, &num_desc, type);
        if (ret < 0)
                goto pm_error;
@@ -312,9 +320,12 @@ sof_probes_dfs_points_write(struct file *file, const char __user *from,
                goto exit;
        }
 
-       ret = ipc->points_add(cdev, desc, bytes / sizeof(*desc));
-       if (!ret)
-               ret = count;
+       ret = sof_client_boot_dsp(cdev);
+       if (!ret) {
+               ret = ipc->points_add(cdev, desc, bytes / sizeof(*desc));
+               if (!ret)
+                       ret = count;
+       }
 
        err = pm_runtime_put_autosuspend(dev);
        if (err < 0)
@@ -367,9 +378,12 @@ sof_probes_dfs_points_remove_write(struct file *file, const char __user *from,
                goto exit;
        }
 
-       ret = ipc->points_remove(cdev, &array[1], array[0]);
-       if (!ret)
-               ret = count;
+       ret = sof_client_boot_dsp(cdev);
+       if (!ret) {
+               ret = ipc->points_remove(cdev, &array[1], array[0]);
+               if (!ret)
+                       ret = count;
+       }
 
        err = pm_runtime_put_autosuspend(dev);
        if (err < 0)
index 2dbfc7699c73a284e50e813994319d30852f230b..b0802484a2d3393c616e7c89526ef907fc138002 100644 (file)
@@ -486,6 +486,12 @@ enum sof_ipc_type sof_client_get_ipc_type(struct sof_client_dev *cdev)
 }
 EXPORT_SYMBOL_NS_GPL(sof_client_get_ipc_type, "SND_SOC_SOF_CLIENT");
 
+int sof_client_boot_dsp(struct sof_client_dev *cdev)
+{
+       return snd_sof_boot_dsp_firmware(sof_client_dev_to_sof_dev(cdev));
+}
+EXPORT_SYMBOL_NS_GPL(sof_client_boot_dsp, "SND_SOC_SOF_CLIENT");
+
 /* module refcount management of SOF core */
 int sof_client_core_module_get(struct sof_client_dev *cdev)
 {
index 1a9015e384748121391c24615b1467435911df16..3b02506c03f1ca677edaa383f06e374806d54879 100644 (file)
@@ -50,6 +50,9 @@ const struct sof_ipc_fw_version *sof_client_get_fw_version(struct sof_client_dev
 size_t sof_client_get_ipc_max_payload_size(struct sof_client_dev *cdev);
 enum sof_ipc_type sof_client_get_ipc_type(struct sof_client_dev *cdev);
 
+/* DSP/firmware boot request */
+int sof_client_boot_dsp(struct sof_client_dev *cdev);
+
 /* module refcount management of SOF core */
 int sof_client_core_module_get(struct sof_client_dev *cdev);
 void sof_client_core_module_put(struct sof_client_dev *cdev);