Skip to content
82 changes: 80 additions & 2 deletions include/sound/sof/ipc4/header.h
Original file line number Diff line number Diff line change
Expand Up @@ -188,6 +188,10 @@ enum sof_ipc4_pipeline_state {
#define SOF_IPC4_GLB_PIPE_EXT_CORE_ID_MASK GENMASK(23, 20)
#define SOF_IPC4_GLB_PIPE_EXT_CORE_ID(x) ((x) << SOF_IPC4_GLB_PIPE_EXT_CORE_ID_SHIFT)

#define SOF_IPC4_GLB_PIPE_PAYLOAD_SHIFT 29
#define SOF_IPC4_GLB_PIPE_PAYLOAD_MASK BIT(29)
#define SOF_IPC4_GLB_PIPE_PAYLOAD(x) ((x) << SOF_IPC4_GLB_PIPE_PAYLOAD_SHIFT)

/* pipeline set state ipc msg */
#define SOF_IPC4_GLB_PIPE_STATE_ID_SHIFT 16
#define SOF_IPC4_GLB_PIPE_STATE_ID_MASK GENMASK(23, 16)
Expand Down Expand Up @@ -686,9 +690,83 @@ enum sof_ipc4_mod_init_ext_obj_id {

/* DP module memory configuration data object for ext_init object array */
struct sof_ipc4_mod_init_ext_dp_memory_data {
u32 domain_id; /* userspace domain ID */
u32 stack_bytes; /* required stack size in bytes */
u32 interim_heap_bytes; /* required interim heap size in bytes */
u32 lifetime_heap_bytes; /* required lifetime heap size in bytes */
u32 shared_bytes; /* required shared memory size in bytes */
} __packed __aligned(4);

/*
* This set of macros are very similar to the set above, but these are
* for building payload to SOF_IPC4_GLB_CREATE_PIPELINE message.
*
* Macros for creating struct sof_ipc4_glb_pipe_payload payload with
* its associated data. ext_init payload should be the first piece of
* payload following SOF_IPC4_GLB_CREATE_PIPELINE msg, and its
* existence is indicated with SOF_IPC4_GLB_PIPE_PAYLOAD bit.
Comment on lines +704 to +707
*
* The macros below apply to sof_ipc4_glb_pipe_payload.word0
*/
#define SOF_IPC4_GLB_PIPE_PAYLOAD_WORDS_SHIFT 0
#define SOF_IPC4_GLB_PIPE_PAYLOAD_WORDS_MASK GENMASK(23, 0)
#define SOF_IPC4_GLB_PIPE_PAYLOAD_WORDS(x) ((x) << SOF_IPC4_GLB_PIPE_PAYLOAD_WORDS_SHIFT)

#define SOF_IPC4_GLB_PIPE_EXT_OBJ_ARRAY_SHIFT 24
#define SOF_IPC4_GLB_PIPE_EXT_OBJ_ARRAY_MASK BIT(24)
#define SOF_IPC4_GLB_PIPE_EXT_OBJ_ARRAY(x) ((x) << SOF_IPC4_GLB_PIPE_EXT_OBJ_ARRAY_SHIFT)

struct sof_ipc4_glb_pipe_payload {
u32 word0;
u32 rsvd1;
u32 rsvd2;
} __packed __aligned(4);

/*
* SOF_IPC4_GLB_CREATE_PIPELINE payload may be followed by arbitrary
* number of object array objects. SOF_IPC4_GLB_PIPE_EXT_OBJ_ARRAY-bit
* indicates that an array object follows struct
* sof_ipc4_glb_pipe_payload.
*
* The object header's SOF_IPC4_GLB_PIPE_EXT_OBJ_LAST-bit in struct
* sof_ipc4_glb_pipe_ext_object indicates if the array is continued
* with another object. The header has also fields to identify the
* object, SOF_IPC4_GLB_PIPE_EXT_OBJ_ID, and to indicate the object's
* size in 32-bit words, SOF_IPC4_GLB_PIPE_EXT_OBJ_WORDS, not
* including the header itself.
Comment on lines +731 to +736
*
* The macros below apply to sof_ipc4_glb_pipe_ext_object.header
*/
#define SOF_IPC4_GLB_PIPE_EXT_OBJ_LAST_SHIFT 0
#define SOF_IPC4_GLB_PIPE_EXT_OBJ_LAST_MASK BIT(0)
#define SOF_IPC4_GLB_PIPE_EXT_OBJ_LAST(x) ((x) << SOF_IPC4_GLB_PIPE_EXT_OBJ_LAST_SHIFT)

#define SOF_IPC4_GLB_PIPE_EXT_OBJ_ID_SHIFT 1
#define SOF_IPC4_GLB_PIPE_EXT_OBJ_ID_MASK GENMASK(15, 1)
#define SOF_IPC4_GLB_PIPE_EXT_OBJ_ID(x) ((x) << SOF_IPC4_GLB_PIPE_EXT_OBJ_ID_SHIFT)

#define SOF_IPC4_GLB_PIPE_EXT_OBJ_WORDS_SHIFT 16
#define SOF_IPC4_GLB_PIPE_EXT_OBJ_WORDS_MASK GENMASK(31, 16)
#define SOF_IPC4_GLB_PIPE_EXT_OBJ_WORDS(x) ((x) << SOF_IPC4_GLB_PIPE_EXT_OBJ_WORDS_SHIFT)

struct sof_ipc4_glb_pipe_ext_object {
u32 header;
u32 data[];
} __packed __aligned(4);

enum sof_ipc4_glb_pipe_ext_obj_id {
SOF_IPC4_GLB_PIPE_DATA_ID_INVALID = 0,
SOF_IPC4_GLB_PIPE_DATA_ID_MEM_DATA,
SOF_IPC4_GLB_PIPE_DATA_ID_MAX = SOF_IPC4_GLB_PIPE_DATA_ID_MEM_DATA,
};

/* Pipeline memory configuration data object for ext_init object array */
struct sof_ipc4_glb_pipe_ext_obj_memory_data {
u32 domain_id; /* userspace domain ID */
u32 stack_bytes; /* stack size in bytes, 0 means default size */
u32 heap_bytes; /* stack size in bytes, 0 means default size */
u32 stack_bytes; /* stack size in bytes */
u32 interim_heap_bytes; /* interim heap size in bytes */
u32 lifetime_heap_bytes;/* lifetime heap size in bytes */
u32 shared_bytes; /* shared size in bytes */
} __packed __aligned(4);

/** @}*/
Expand Down
6 changes: 4 additions & 2 deletions include/uapi/sound/sof/tokens.h
Original file line number Diff line number Diff line change
Expand Up @@ -111,8 +111,10 @@

#define SOF_TKN_COMP_SCHED_DOMAIN 418
#define SOF_TKN_COMP_DOMAIN_ID 419
#define SOF_TKN_COMP_HEAP_BYTES_REQUIREMENT 420
#define SOF_TKN_COMP_STACK_BYTES_REQUIREMENT 421
#define SOF_TKN_COMP_STACK_BYTES_REQUIREMENT 420
#define SOF_TKN_COMP_INTERIM_HEAP_BYTES_REQUIREMENT 421
#define SOF_TKN_COMP_LIFETIME_HEAP_BYTES_REQUIREMENT 422
#define SOF_TKN_COMP_SHARED_BYTES_REQUIREMENT 423
Comment on lines +114 to +117
Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The topology tokens were not really used for anything yet on the firmware side so its safe change the definitions.

Comment on lines +114 to +117

/* SSP */
#define SOF_TKN_INTEL_SSP_CLKS_CONTROL 500
Expand Down
198 changes: 164 additions & 34 deletions sound/soc/sof/ipc4-topology.c
Original file line number Diff line number Diff line change
Expand Up @@ -163,11 +163,15 @@ static const struct sof_topology_token comp_ext_tokens[] = {
{SOF_TKN_COMP_SCHED_DOMAIN, SND_SOC_TPLG_TUPLE_TYPE_STRING, get_token_comp_domain,
offsetof(struct snd_sof_widget, comp_domain)},
{SOF_TKN_COMP_DOMAIN_ID, SND_SOC_TPLG_TUPLE_TYPE_WORD, get_token_u32,
offsetof(struct snd_sof_widget, dp_domain_id)},
{SOF_TKN_COMP_HEAP_BYTES_REQUIREMENT, SND_SOC_TPLG_TUPLE_TYPE_WORD, get_token_u32,
offsetof(struct snd_sof_widget, dp_heap_bytes)},
offsetof(struct snd_sof_widget, domain_id)},
{SOF_TKN_COMP_STACK_BYTES_REQUIREMENT, SND_SOC_TPLG_TUPLE_TYPE_WORD, get_token_u32,
offsetof(struct snd_sof_widget, dp_stack_bytes)},
offsetof(struct snd_sof_widget, stack_bytes)},
{SOF_TKN_COMP_INTERIM_HEAP_BYTES_REQUIREMENT, SND_SOC_TPLG_TUPLE_TYPE_WORD, get_token_u32,
offsetof(struct snd_sof_widget, interim_bytes)},
{SOF_TKN_COMP_LIFETIME_HEAP_BYTES_REQUIREMENT, SND_SOC_TPLG_TUPLE_TYPE_WORD, get_token_u32,
offsetof(struct snd_sof_widget, lifetime_bytes)},
{SOF_TKN_COMP_SHARED_BYTES_REQUIREMENT, SND_SOC_TPLG_TUPLE_TYPE_WORD, get_token_u32,
offsetof(struct snd_sof_widget, shared_bytes)},
};

static const struct sof_topology_token gain_tokens[] = {
Expand Down Expand Up @@ -1344,6 +1348,26 @@ sof_ipc4_update_resource_usage(struct snd_sof_dev *sdev, struct snd_sof_widget *
pipeline = pipe_widget->private;
pipeline->mem_usage += total;

/*
* If this is not a Data Processing module instance, add the
* required heap sizes to the sum of all modules instance's
* belonging to same pipeline and find the maximum stack
* requirement of all module instances belonging to the same
* pipeline.
*/
if (swidget->comp_domain != SOF_COMP_DOMAIN_DP) {
pipe_widget->interim_bytes += swidget->interim_bytes;
pipe_widget->lifetime_bytes += swidget->lifetime_bytes;
pipe_widget->shared_bytes += swidget->shared_bytes;
Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I suppose in theory these can overflow... We don't expect any realistic configurations to do that, but a malicious one could, especially once we start loading unsigned userspace modules

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I do not think adding any safeguards to the Linux driver side serves any purpose. The FW however should have some sanity checks about the values give to it through IPC.

if (pipe_widget->stack_bytes < swidget->stack_bytes)
pipe_widget->stack_bytes = swidget->stack_bytes;
Comment on lines +1358 to +1363
Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It looks like the Copilot does not have the slightest idea of what is going on here.

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Not just the copilot :) I assume pipeline object is built from scratch, so this reset logic is needed, but good to double-check. But I'm ok if you have checked for new pipelines we are starting from zero always (and we have no code-paths to refresh same widgets again).


dev_dbg(sdev->dev, "%s mem reqs to %s lifetime %u heap %u shared %u stack %u",
swidget->widget->name, pipe_widget->widget->name,
pipe_widget->lifetime_bytes, pipe_widget->interim_bytes,
pipe_widget->shared_bytes, pipe_widget->stack_bytes);
}

/* Update base_config->cpc from the module manifest */
sof_ipc4_update_cpc_from_manifest(sdev, fw_module, base_config);

Expand Down Expand Up @@ -1661,6 +1685,10 @@ static void sof_ipc4_unprepare_copier_module(struct snd_sof_widget *swidget)
pipe_widget = swidget->spipe->pipe_widget;
pipeline = pipe_widget->private;
pipeline->mem_usage = 0;
pipe_widget->lifetime_bytes = 0;
pipe_widget->interim_bytes = 0;
pipe_widget->shared_bytes = 0;
pipe_widget->stack_bytes = 0;

if (WIDGET_IS_AIF(swidget->id) || swidget->id == snd_soc_dapm_buffer) {
if (pipeline->use_chain_dma) {
Expand Down Expand Up @@ -3105,55 +3133,76 @@ static int sof_ipc4_control_setup(struct snd_sof_dev *sdev, struct snd_sof_contr
return 0;
}

static int sof_ipc4_widget_setup_msg_payload(struct snd_sof_dev *sdev,
struct snd_sof_widget *swidget,
struct sof_ipc4_msg *msg,
void *ipc_data, u32 ipc_size,
void **new_data)
static void sof_ipc4_add_init_ext_dp_memory_data(struct snd_sof_dev *sdev,
struct snd_sof_widget *swidget,
u32 *payload, u32 *ext_pos,
struct sof_ipc4_module_init_ext_object **hdr)
{
/* Add memory_data if comp_domain indicates DP */
if (swidget->comp_domain == SOF_COMP_DOMAIN_DP) {
struct sof_ipc4_mod_init_ext_dp_memory_data *dp_mem_data;

*hdr = (struct sof_ipc4_module_init_ext_object *)&payload[*ext_pos];
(*hdr)->header =
SOF_IPC4_MOD_INIT_EXT_OBJ_ID(SOF_IPC4_MOD_INIT_DATA_ID_DP_DATA) |
SOF_IPC4_MOD_INIT_EXT_OBJ_WORDS(DIV_ROUND_UP(sizeof(*dp_mem_data),
sizeof(u32)));
*ext_pos += DIV_ROUND_UP(sizeof(**hdr), sizeof(u32));
dp_mem_data = (struct sof_ipc4_mod_init_ext_dp_memory_data *)&payload[*ext_pos];
dp_mem_data->domain_id = swidget->domain_id;
dp_mem_data->stack_bytes = swidget->stack_bytes;
dp_mem_data->interim_heap_bytes = swidget->interim_bytes;
dp_mem_data->lifetime_heap_bytes = swidget->lifetime_bytes;
dp_mem_data->shared_bytes = swidget->shared_bytes;
*ext_pos += DIV_ROUND_UP(sizeof(*dp_mem_data), sizeof(u32));
}
}

static int sof_ipc4_widget_mod_init_msg_payload(struct snd_sof_dev *sdev,
struct snd_sof_widget *swidget,
struct sof_ipc4_msg *msg,
void *ipc_data, u32 ipc_size,
void **new_data)
{
struct sof_ipc4_mod_init_ext_dp_memory_data *dp_mem_data;
struct sof_ipc4_module_init_ext_init *ext_init;
struct sof_ipc4_module_init_ext_object *hdr;
struct sof_ipc4_module_init_ext_object *hdr = NULL;
int new_size;
u32 *payload;
u32 ext_pos;

/* For the moment the only reason for adding init_ext_init payload is DP
* memory data. If both stack and heap size are 0 (= use default), then
* there is no need for init_ext_init payload.
/*
* Only DP widgets currently add init-ext objects here. Avoid allocating
* a max-sized payload buffer for widgets that will immediately return 0.
*/
if (swidget->comp_domain != SOF_COMP_DOMAIN_DP) {
msg->extension &= ~SOF_IPC4_MOD_EXT_EXTENDED_INIT_MASK;
if (swidget->comp_domain != SOF_COMP_DOMAIN_DP)
return 0;
}

payload = kzalloc(sdev->ipc->max_payload_size, GFP_KERNEL);
if (!payload)
return -ENOMEM;
Comment thread
jsarha marked this conversation as resolved.

/* Add ext_init first and set objects array flag to 1 */
ext_init = (struct sof_ipc4_module_init_ext_init *)payload;
ext_init->word0 |= SOF_IPC4_MOD_INIT_EXT_OBJ_ARRAY_MASK;
ext_pos = DIV_ROUND_UP(sizeof(*ext_init), sizeof(u32));

/* Add object array objects after ext_init */

/* Add dp_memory_data if comp_domain indicates DP */
if (swidget->comp_domain == SOF_COMP_DOMAIN_DP) {
hdr = (struct sof_ipc4_module_init_ext_object *)&payload[ext_pos];
hdr->header = SOF_IPC4_MOD_INIT_EXT_OBJ_LAST_MASK |
SOF_IPC4_MOD_INIT_EXT_OBJ_ID(SOF_IPC4_MOD_INIT_DATA_ID_DP_DATA) |
SOF_IPC4_MOD_INIT_EXT_OBJ_WORDS(DIV_ROUND_UP(sizeof(*dp_mem_data),
sizeof(u32)));
ext_pos += DIV_ROUND_UP(sizeof(*hdr), sizeof(u32));
dp_mem_data = (struct sof_ipc4_mod_init_ext_dp_memory_data *)&payload[ext_pos];
dp_mem_data->domain_id = swidget->dp_domain_id;
dp_mem_data->stack_bytes = swidget->dp_stack_bytes;
dp_mem_data->heap_bytes = swidget->dp_heap_bytes;
ext_pos += DIV_ROUND_UP(sizeof(*dp_mem_data), sizeof(u32));
sof_ipc4_add_init_ext_dp_memory_data(sdev, swidget, payload, &ext_pos, &hdr);

/* Add following object array items here */

if (!hdr) {
/*
* NOTE: Remove this early bail out, when struct
* sof_ipc4_module_init_ext_init alone has some
* function.
*/
kfree(payload);
return 0;
Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

nitpick: I'd do if (!hdr) {kfree(payload); return 0;} and then continue below with the rest

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I wanted to have the both sides of the if statement, because it may be that sof_ipc4_add_init_ext_dp_memory_data() did not add an object to the object array, and then we should not add the array at all, let alone mark the last element. There was an ext init payload even before my time and there are some bits defined there, so we may need to add the payload even if the array is not present. In that situation if (hdr) part remains, but the else branch should be removed. If I am to do something about this, then that would be adding the non array part always, e.g removing the the else branch.

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

sorry, my proposal wasn't really addressing the meaning of the code, it was rather cosmetic with no change to functionality. What this your hunk does is organise code as follows:

if (x) {
  a;
  b;
} else {
  y;
  return;
}
c;
d;
}

which means that a, b, c and d are always either executed or not executed together, so making some of them under the if and others outside of it is a bit strange. And that's exactly equivalent to

if (!x) {
  y;
  return;
}
a;
b;
c;
d;
}

which IMHO is more straight-forward. Also regarding your remark about removing the else part - the above would make it even easier by removing the whole of if.

}

/* If another array object is added, remember clear previous OBJ_LAST bit */
ext_init->word0 |= SOF_IPC4_MOD_INIT_EXT_OBJ_ARRAY_MASK;
hdr->header |= SOF_IPC4_MOD_INIT_EXT_OBJ_LAST_MASK;

/* Calculate final size and check that it fits to max payload size */
new_size = ext_pos * sizeof(u32) + ipc_size;
Expand All @@ -3176,6 +3225,72 @@ static int sof_ipc4_widget_setup_msg_payload(struct snd_sof_dev *sdev,
return new_size;
}

static void sof_ipc4_widget_pipe_ext_obj_memory_data(struct snd_sof_dev *sdev,
struct snd_sof_widget *swidget,
u32 *payload, u32 *ext_pos,
struct sof_ipc4_glb_pipe_ext_object **hdr)
{
struct sof_ipc4_glb_pipe_ext_obj_memory_data *mem_data;

*hdr = (struct sof_ipc4_glb_pipe_ext_object *)&payload[*ext_pos];
(*hdr)->header =
SOF_IPC4_GLB_PIPE_EXT_OBJ_ID(SOF_IPC4_GLB_PIPE_DATA_ID_MEM_DATA) |
SOF_IPC4_GLB_PIPE_EXT_OBJ_WORDS(DIV_ROUND_UP(sizeof(*mem_data),
sizeof(u32)));
*ext_pos += DIV_ROUND_UP(sizeof(**hdr), sizeof(u32));
mem_data = (struct sof_ipc4_glb_pipe_ext_obj_memory_data *)&payload[*ext_pos];
mem_data->domain_id = swidget->domain_id;
mem_data->stack_bytes = swidget->stack_bytes;
mem_data->interim_heap_bytes = swidget->interim_bytes;
mem_data->lifetime_heap_bytes = swidget->lifetime_bytes;
mem_data->shared_bytes = swidget->shared_bytes;
*ext_pos += DIV_ROUND_UP(sizeof(*mem_data), sizeof(u32));

dev_dbg(sdev->dev,
"%s; domain_id %u stack %u interim %u lifetime %u shared %u bytes",
swidget->widget->name, mem_data->domain_id, mem_data->stack_bytes,
mem_data->interim_heap_bytes, mem_data->lifetime_heap_bytes,
mem_data->shared_bytes);
}

static int sof_ipc4_widget_pipe_create_msg_payload(struct snd_sof_dev *sdev,
struct snd_sof_widget *swidget,
struct sof_ipc4_msg *msg,
void **new_data)
{
struct sof_ipc4_glb_pipe_payload *payload_hdr;
struct sof_ipc4_glb_pipe_ext_object *hdr = NULL;
u32 *payload;
u32 ext_pos;

payload = kzalloc(sdev->ipc->max_payload_size, GFP_KERNEL);
if (!payload)
return -ENOMEM;

/* Add sof_ipc4_glb_pipe_payload and set array bit to 1 */
payload_hdr = (struct sof_ipc4_glb_pipe_payload *)payload;
payload_hdr->word0 |= SOF_IPC4_GLB_PIPE_EXT_OBJ_ARRAY_MASK;
ext_pos = DIV_ROUND_UP(sizeof(*payload_hdr), sizeof(u32));

sof_ipc4_widget_pipe_ext_obj_memory_data(sdev, swidget, payload, &ext_pos, &hdr);
/* Add following array objects here */

/* Mark end of object array */
hdr->header |= SOF_IPC4_GLB_PIPE_EXT_OBJ_LAST_MASK;

/* Put total payload size in words to the payload header */
payload_hdr->word0 |= SOF_IPC4_GLB_PIPE_PAYLOAD_WORDS(ext_pos);
*new_data = payload;

/* Update msg extension bits according to the payload changes */
msg->extension |= SOF_IPC4_GLB_PIPE_PAYLOAD_MASK;

dev_dbg(sdev->dev, "%s: payload word0 %#x", swidget->widget->name,
payload_hdr->word0);

return ext_pos * sizeof(int32_t);
Comment on lines +3281 to +3291
}

static int sof_ipc4_widget_setup(struct snd_sof_dev *sdev, struct snd_sof_widget *swidget)
{
struct snd_sof_widget *pipe_widget = swidget->spipe->pipe_widget;
Expand Down Expand Up @@ -3329,8 +3444,8 @@ static int sof_ipc4_widget_setup(struct snd_sof_dev *sdev, struct snd_sof_widget
swidget->widget->name, swidget->pipeline_id, module_id,
swidget->instance_id, swidget->core);

ret = sof_ipc4_widget_setup_msg_payload(sdev, swidget, msg, ipc_data, ipc_size,
&ext_data);
ret = sof_ipc4_widget_mod_init_msg_payload(sdev, swidget, msg, ipc_data, ipc_size,
&ext_data);
if (ret < 0)
goto fail;

Expand All @@ -3342,6 +3457,17 @@ static int sof_ipc4_widget_setup(struct snd_sof_dev *sdev, struct snd_sof_widget
dev_dbg(sdev->dev, "Create pipeline %s (pipe %d) - instance %d, core %d\n",
swidget->widget->name, swidget->pipeline_id,
swidget->instance_id, swidget->core);

msg->extension &= ~SOF_IPC4_GLB_PIPE_PAYLOAD_MASK;
ret = sof_ipc4_widget_pipe_create_msg_payload(sdev, swidget, msg,
&ext_data);
if (ret < 0)
goto fail;

if (ret > 0) {
ipc_size = ret;
ipc_data = ext_data;
}
Comment thread
jsarha marked this conversation as resolved.
}

msg->data_size = ipc_size;
Expand Down Expand Up @@ -3399,6 +3525,10 @@ static int sof_ipc4_widget_free(struct snd_sof_dev *sdev, struct snd_sof_widget
swidget->widget->name);

pipeline->mem_usage = 0;
swidget->lifetime_bytes = 0;
swidget->interim_bytes = 0;
swidget->shared_bytes = 0;
swidget->stack_bytes = 0;
pipeline->state = SOF_IPC4_PIPE_UNINITIALIZED;
ida_free(&pipeline_ida, swidget->instance_id);
swidget->instance_id = -EINVAL;
Expand Down
Loading
Loading