-
Notifications
You must be signed in to change notification settings - Fork 140
New memory domain logic #5537
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: topic/sof-dev
Are you sure you want to change the base?
New memory domain logic #5537
Changes from all commits
fa0de06
a94d278
4ddf658
df3a5df
79f90d8
91c9b6e
b1e5288
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -159,11 +159,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[] = { | ||
|
|
@@ -1313,6 +1317,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 maximun 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; | ||
| if (pipe_widget->stack_bytes < swidget->stack_bytes) | ||
| pipe_widget->stack_bytes = swidget->stack_bytes; | ||
jsarha marked this conversation as resolved.
Show resolved
Hide resolved
|
||
|
|
||
| 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); | ||
|
|
||
|
|
@@ -2993,11 +3017,11 @@ 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 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; | ||
|
|
@@ -3021,26 +3045,28 @@ static int sof_ipc4_widget_setup_msg_payload(struct snd_sof_dev *sdev, | |
|
|
||
| /* 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 */ | ||
| /* Add memory_data if comp_domain indicates DP */ | ||
| if (swidget->comp_domain == SOF_COMP_DOMAIN_DP) { | ||
| ext_init->word0 |= SOF_IPC4_MOD_INIT_EXT_OBJ_ARRAY_MASK; | ||
|
|
||
| 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; | ||
| 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->interim_bytes; | ||
| dp_mem_data->shared_bytes = swidget->shared_bytes; | ||
| ext_pos += DIV_ROUND_UP(sizeof(*dp_mem_data), sizeof(u32)); | ||
| } | ||
|
|
||
| /* If another array object is added, remember clear previous OBJ_LAST bit */ | ||
|
|
||
| /* Calculate final size and check that it fits to max payload size */ | ||
|
|
@@ -3064,6 +3090,58 @@ static int sof_ipc4_widget_setup_msg_payload(struct snd_sof_dev *sdev, | |
| return new_size; | ||
| } | ||
|
|
||
| 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_ext_obj_memory_data *mem_data; | ||
| struct sof_ipc4_glb_pipe_payload *payload_hdr; | ||
| struct sof_ipc4_glb_pipe_ext_object *obj; | ||
| u32 *payload; | ||
| u32 ext_pos; | ||
|
|
||
| payload = kzalloc(sdev->ipc->max_payload_size, GFP_KERNEL); | ||
|
Member
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. we are doing multiple ROUND_UP()s below, do we need to factor this in to the size here ?
Author
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. All the sizes are indicated in number of 32-bit words and the payload array is also indexed as uint32_t table. So all should be good. If there would be structs with sizes not multiple of sizeof(uint32_t) in the payload then those would be padded to up to the nearest uint32_t border. (In fact all the related structs have sizes that are multiple of sizeof(uint32_t)). In the end the size of the whole payload is taken from the uint32_t table index so everything should be good. |
||
| 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)); | ||
|
|
||
| obj = (struct sof_ipc4_glb_pipe_ext_object *)&payload[ext_pos]; | ||
| /* Add object array objects after payload_hdr */ | ||
| obj->header = SOF_IPC4_GLB_PIPE_EXT_OBJ_LAST_MASK | | ||
| 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(*obj), 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_bytes = swidget->interim_bytes; | ||
| mem_data->lifetime_bytes = swidget->lifetime_bytes; | ||
| mem_data->shared_bytes = swidget->shared_bytes; | ||
| ext_pos += DIV_ROUND_UP(sizeof(*mem_data), sizeof(u32)); | ||
|
|
||
| /* If another array object is added, remember clear previous OBJ_LAST bit */ | ||
|
|
||
| /* 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, | ||
| "payload word0 %#x domain_id %u stack %u interim %u lifetime %u shared %u bytes", | ||
| payload_hdr->word0, mem_data->domain_id, mem_data->stack_bytes, | ||
| mem_data->interim_bytes, mem_data->lifetime_bytes, mem_data->shared_bytes); | ||
|
|
||
| return ext_pos * sizeof(int32_t); | ||
| } | ||
|
|
||
| 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; | ||
|
|
@@ -3217,8 +3295,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); | ||
|
Member
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. are we freeing the payload on error ?
Author
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Yes, see line 3340. |
||
| if (ret < 0) | ||
| goto fail; | ||
|
|
||
|
|
@@ -3230,6 +3308,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; | ||
| } | ||
| } | ||
|
|
||
| msg->data_size = ipc_size; | ||
|
|
||
Uh oh!
There was an error while loading. Please reload this page.