struct snd_sof_widget *pipe_widget = swidget->pipe_widget;
                struct sof_ipc4_pipeline *pipeline = pipe_widget->private;
 
-               ret = sof_ipc4_set_pipeline_state(sdev, swidget->pipeline_id,
+               ret = sof_ipc4_set_pipeline_state(sdev, pipe_widget->instance_id,
                                                  SOF_IPC4_PIPE_PAUSED);
                if (ret < 0)
                        return ret;
 
                snd_hdac_ext_stream_clear(hext_stream);
 
-               ret = sof_ipc4_set_pipeline_state(sdev, swidget->pipeline_id,
+               ret = sof_ipc4_set_pipeline_state(sdev, pipe_widget->instance_id,
                                                  SOF_IPC4_PIPE_RESET);
                if (ret < 0)
                        return ret;
                struct snd_sof_widget *pipe_widget = swidget->pipe_widget;
                struct sof_ipc4_pipeline *pipeline = pipe_widget->private;
 
-               ret = sof_ipc4_set_pipeline_state(sdev, swidget->pipeline_id,
+               ret = sof_ipc4_set_pipeline_state(sdev, pipe_widget->instance_id,
                                                  SOF_IPC4_PIPE_PAUSED);
                if (ret < 0)
                        return ret;
        switch (cmd) {
        case SNDRV_PCM_TRIGGER_SUSPEND:
        case SNDRV_PCM_TRIGGER_STOP:
-               ret = sof_ipc4_set_pipeline_state(sdev, swidget->pipeline_id,
+               ret = sof_ipc4_set_pipeline_state(sdev, pipe_widget->instance_id,
                                                  SOF_IPC4_PIPE_PAUSED);
                if (ret < 0)
                        return ret;
                pipeline->state = SOF_IPC4_PIPE_PAUSED;
 
-               ret = sof_ipc4_set_pipeline_state(sdev, swidget->pipeline_id,
+               ret = sof_ipc4_set_pipeline_state(sdev, pipe_widget->instance_id,
                                                  SOF_IPC4_PIPE_RESET);
                if (ret < 0)
                        return ret;
                pipeline->state = SOF_IPC4_PIPE_RESET;
                break;
        case SNDRV_PCM_TRIGGER_PAUSE_PUSH:
-               ret = sof_ipc4_set_pipeline_state(sdev, swidget->pipeline_id,
+               ret = sof_ipc4_set_pipeline_state(sdev, pipe_widget->instance_id,
                                                  SOF_IPC4_PIPE_PAUSED);
                if (ret < 0)
                        return ret;
 
 
                /* first set the pipeline to PAUSED state */
                if (pipeline->state != SOF_IPC4_PIPE_PAUSED) {
-                       ret = sof_ipc4_set_pipeline_state(sdev, swidget->pipeline_id,
+                       ret = sof_ipc4_set_pipeline_state(sdev, pipeline_widget->instance_id,
                                                          SOF_IPC4_PIPE_PAUSED);
                        if (ret < 0) {
                                dev_err(sdev->dev, "failed to pause pipeline %d\n",
                        continue;
 
                /* then set the final state */
-               ret = sof_ipc4_set_pipeline_state(sdev, swidget->pipeline_id, state);
+               ret = sof_ipc4_set_pipeline_state(sdev, pipeline_widget->instance_id, state);
                if (ret < 0) {
                        dev_err(sdev->dev, "failed to set state %d for pipeline %d\n",
                                state, swidget->pipeline_id);
 
 #define SOF_IPC4_TPLG_ABI_SIZE 6
 
 static DEFINE_IDA(alh_group_ida);
+static DEFINE_IDA(pipeline_ida);
 
 static const struct sof_topology_token ipc4_sched_tokens[] = {
        {SOF_TKN_SCHED_LP_MODE, SND_SOC_TPLG_TUPLE_TYPE_WORD, get_token_u32,
        msg->primary |= SOF_IPC4_MSG_DIR(SOF_IPC4_MSG_REQUEST);
        msg->primary |= SOF_IPC4_MSG_TARGET(SOF_IPC4_MODULE_MSG);
 
-       msg->extension = SOF_IPC4_MOD_EXT_PPL_ID(swidget->pipeline_id);
-       msg->extension |= SOF_IPC4_MOD_EXT_CORE_ID(swidget->core);
+       msg->extension = SOF_IPC4_MOD_EXT_CORE_ID(swidget->core);
 
        type = (fw_module->man4_module_entry.type & SOF_IPC4_MODULE_DP) ? 1 : 0;
        msg->extension |= SOF_IPC4_MOD_EXT_DOMAIN(type);
        swidget->private = pipeline;
 
        pipeline->msg.primary = SOF_IPC4_GLB_PIPE_PRIORITY(pipeline->priority);
-       pipeline->msg.primary |= SOF_IPC4_GLB_PIPE_INSTANCE_ID(swidget->pipeline_id);
        pipeline->msg.primary |= SOF_IPC4_MSG_TYPE_SET(SOF_IPC4_GLB_CREATE_PIPELINE);
        pipeline->msg.primary |= SOF_IPC4_MSG_DIR(SOF_IPC4_MSG_REQUEST);
        pipeline->msg.primary |= SOF_IPC4_MSG_TARGET(SOF_IPC4_FW_GEN_MSG);
 
 static int sof_ipc4_widget_setup(struct snd_sof_dev *sdev, struct snd_sof_widget *swidget)
 {
+       struct snd_sof_widget *pipe_widget = swidget->pipe_widget;
+       struct sof_ipc4_fw_data *ipc4_data = sdev->private;
        struct sof_ipc4_pipeline *pipeline;
        struct sof_ipc4_msg *msg;
        void *ipc_data = NULL;
 
                msg = &pipeline->msg;
                msg->primary |= pipeline->mem_usage;
+
+               swidget->instance_id = ida_alloc_max(&pipeline_ida, ipc4_data->max_num_pipelines,
+                                                    GFP_KERNEL);
+               if (swidget->instance_id < 0) {
+                       dev_err(sdev->dev, "failed to assign pipeline id for %s: %d\n",
+                               swidget->widget->name, swidget->instance_id);
+                       return swidget->instance_id;
+               }
+               msg->primary &= ~SOF_IPC4_GLB_PIPE_INSTANCE_MASK;
+               msg->primary |= SOF_IPC4_GLB_PIPE_INSTANCE_ID(swidget->instance_id);
                break;
        case snd_soc_dapm_aif_in:
        case snd_soc_dapm_aif_out:
 
                msg->extension &= ~SOF_IPC4_MOD_EXT_PARAM_SIZE_MASK;
                msg->extension |= ipc_size >> 2;
+
+               msg->extension &= ~SOF_IPC4_MOD_EXT_PPL_ID_MASK;
+               msg->extension |= SOF_IPC4_MOD_EXT_PPL_ID(pipe_widget->instance_id);
        }
        dev_dbg(sdev->dev, "Create widget %s instance %d - pipe %d - core %d\n",
                swidget->widget->name, swidget->instance_id, swidget->pipeline_id, swidget->core);
                        struct sof_ipc4_fw_module *fw_module = swidget->module_info;
 
                        ida_free(&fw_module->m_ida, swidget->instance_id);
+               } else {
+                       ida_free(&pipeline_ida, swidget->instance_id);
                }
        }
 
                struct sof_ipc4_msg msg = {{ 0 }};
                u32 header;
 
-               header = SOF_IPC4_GLB_PIPE_INSTANCE_ID(swidget->pipeline_id);
+               header = SOF_IPC4_GLB_PIPE_INSTANCE_ID(swidget->instance_id);
                header |= SOF_IPC4_MSG_TYPE_SET(SOF_IPC4_GLB_DELETE_PIPELINE);
                header |= SOF_IPC4_MSG_DIR(SOF_IPC4_MSG_REQUEST);
                header |= SOF_IPC4_MSG_TARGET(SOF_IPC4_FW_GEN_MSG);
 
                pipeline->mem_usage = 0;
                pipeline->state = SOF_IPC4_PIPE_UNINITIALIZED;
+               ida_free(&pipeline_ida, swidget->instance_id);
        } else {
                ida_free(&fw_module->m_ida, swidget->instance_id);
        }