Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

ASoC: SOF: ipc4: Send heap/stack bytes via new

Merge series from Peter Ujfalusi <peter.ujfalusi@linux.intel.com>:

Add new module init payload (this has already been partly specified in
SOF FW src/include/ipc4/module.h) and use that to pass new topology widget
properties to FW.

The original ext_init payload extension for this is already already
supported by the firmware.

+174
+75
include/sound/sof/ipc4/header.h
··· 352 352 #define SOF_IPC4_MOD_EXT_DOMAIN_MASK BIT(28) 353 353 #define SOF_IPC4_MOD_EXT_DOMAIN(x) ((x) << SOF_IPC4_MOD_EXT_DOMAIN_SHIFT) 354 354 355 + #define SOF_IPC4_MOD_EXT_EXTENDED_INIT_SHIFT 29 356 + #define SOF_IPC4_MOD_EXT_EXTENDED_INIT_MASK BIT(29) 357 + #define SOF_IPC4_MOD_EXT_EXTENDED_INIT(x) ((x) << SOF_IPC4_MOD_EXT_EXTENDED_SHIFT) 358 + 355 359 /* bind/unbind module ipc msg */ 356 360 #define SOF_IPC4_MOD_EXT_DST_MOD_ID_SHIFT 0 357 361 #define SOF_IPC4_MOD_EXT_DST_MOD_ID_MASK GENMASK(15, 0) ··· 589 585 #define SOF_IPC4_NOTIFY_MODULE_EVENTID_ALSA_MAGIC_MASK GENMASK(31, 16) 590 586 #define SOF_IPC4_NOTIFY_MODULE_EVENTID_ALSA_MAGIC_VAL 0xA15A0000 591 587 #define SOF_IPC4_NOTIFY_MODULE_EVENTID_ALSA_PARAMID_MASK GENMASK(15, 0) 588 + 589 + /* 590 + * Macros for creating struct sof_ipc4_module_init_ext_init payload 591 + * with its associated data. ext_init payload should be the first 592 + * piece of payload following SOF_IPC4_MOD_INIT_INSTANCE msg, and its 593 + * existence is indicated with SOF_IPC4_MOD_EXT_EXTENDED-bit. 594 + * 595 + * The macros below apply to sof_ipc4_module_init_ext_init.word0 596 + */ 597 + #define SOF_IPC4_MOD_INIT_EXT_RTOS_DOMAIN_SHIFT 0 598 + #define SOF_IPC4_MOD_INIT_EXT_RTOS_DOMAIN_MASK BIT(0) 599 + #define SOF_IPC4_MOD_INIT_EXT_RTOS_DOMAIN(x) ((x) << SOF_IPC4_MOD_INIT_EXT_RTOS_DOMAIN_SHIFT) 600 + 601 + #define SOF_IPC4_MOD_INIT_EXT_GNA_USED_SHIFT 1 602 + #define SOF_IPC4_MOD_INIT_EXT_GNA_USED_MASK BIT(1) 603 + #define SOF_IPC4_MOD_INIT_EXT_GNA_USED(x) ((x) << SOF_IPC4_MOD_INIT_EXT_GNA_USED_SHIFT) 604 + 605 + #define SOF_IPC4_MOD_INIT_EXT_OBJ_ARRAY_SHIFT 2 606 + #define SOF_IPC4_MOD_INIT_EXT_OBJ_ARRAY_MASK BIT(2) 607 + #define SOF_IPC4_MOD_INIT_EXT_DATA_ARRAY(x) ((x) << SOF_IPC4_MOD_INIT_EXT_OBJ_ARRAY_SHIFT) 608 + 609 + struct sof_ipc4_module_init_ext_init { 610 + u32 word0; 611 + u32 rsvd1; 612 + u32 rsvd2; 613 + } __packed __aligned(4); 614 + 615 + /* 616 + * SOF_IPC4_MOD_EXT_EXTENDED payload may be followed by arbitrary 617 + * number of object array objects. SOF_IPC4_MOD_INIT_EXT_DATA_ARRAY 618 + * -bit indicates that an array object follows struct 619 + * sof_ipc4_module_init_ext_init. 620 + * 621 + * The object header's SOF_IPC4_MOD_INIT_EXT_OBJ_LAST-bit in struct 622 + * sof_ipc4_module_init_ext_object indicates if the array is continued 623 + * with another object. The header has also fields to identify the 624 + * object, SOF_IPC4_MOD_INIT_EXT_OBJ_ID, and to indicate the object's 625 + * size in 32-bit words, SOF_IPC4_MOD_INIT_EXT_OBJ_WORDS, not 626 + * including the header itself. 627 + * 628 + * The macros below apply to sof_ipc4_module_init_ext_object.header 629 + */ 630 + #define SOF_IPC4_MOD_INIT_EXT_OBJ_LAST_SHIFT 0 631 + #define SOF_IPC4_MOD_INIT_EXT_OBJ_LAST_MASK BIT(0) 632 + #define SOF_IPC4_MOD_INIT_EXT_OBJ_LAST(x) ((x) << SOF_IPC4_MOD_INIT_EXT_OBJ_LAST_SHIFT) 633 + 634 + #define SOF_IPC4_MOD_INIT_EXT_OBJ_ID_SHIFT 1 635 + #define SOF_IPC4_MOD_INIT_EXT_OBJ_ID_MASK GENMASK(15, 1) 636 + #define SOF_IPC4_MOD_INIT_EXT_OBJ_ID(x) ((x) << SOF_IPC4_MOD_INIT_EXT_OBJ_ID_SHIFT) 637 + 638 + #define SOF_IPC4_MOD_INIT_EXT_OBJ_WORDS_SHIFT 16 639 + #define SOF_IPC4_MOD_INIT_EXT_OBJ_WORDS_MASK GENMASK(31, 16) 640 + #define SOF_IPC4_MOD_INIT_EXT_OBJ_WORDS(x) ((x) << SOF_IPC4_MOD_INIT_EXT_OBJ_WORDS_SHIFT) 641 + 642 + struct sof_ipc4_module_init_ext_object { 643 + u32 header; 644 + u32 data[]; 645 + } __packed __aligned(4); 646 + 647 + enum sof_ipc4_mod_init_ext_obj_id { 648 + SOF_IPC4_MOD_INIT_DATA_ID_INVALID = 0, 649 + SOF_IPC4_MOD_INIT_DATA_ID_DP_DATA, 650 + SOF_IPC4_MOD_INIT_DATA_ID_MAX = SOF_IPC4_MOD_INIT_DATA_ID_DP_DATA, 651 + }; 652 + 653 + /* DP module memory configuration data object for ext_init object array */ 654 + struct sof_ipc4_mod_init_ext_dp_memory_data { 655 + u32 domain_id; /* userspace domain ID */ 656 + u32 stack_bytes; /* stack size in bytes, 0 means default size */ 657 + u32 heap_bytes; /* stack size in bytes, 0 means default size */ 658 + } __packed __aligned(4); 592 659 593 660 /** @}*/ 594 661
+3
include/uapi/sound/sof/tokens.h
··· 107 107 #define SOF_TKN_COMP_NO_WNAME_IN_KCONTROL_NAME 417 108 108 109 109 #define SOF_TKN_COMP_SCHED_DOMAIN 418 110 + #define SOF_TKN_COMP_DOMAIN_ID 419 111 + #define SOF_TKN_COMP_HEAP_BYTES_REQUIREMENT 420 112 + #define SOF_TKN_COMP_STACK_BYTES_REQUIREMENT 421 110 113 111 114 /* SSP */ 112 115 #define SOF_TKN_INTEL_SSP_CLKS_CONTROL 500
+91
sound/soc/sof/ipc4-topology.c
··· 158 158 offsetof(struct snd_sof_widget, core)}, 159 159 {SOF_TKN_COMP_SCHED_DOMAIN, SND_SOC_TPLG_TUPLE_TYPE_STRING, get_token_comp_domain, 160 160 offsetof(struct snd_sof_widget, comp_domain)}, 161 + {SOF_TKN_COMP_DOMAIN_ID, SND_SOC_TPLG_TUPLE_TYPE_WORD, get_token_u32, 162 + offsetof(struct snd_sof_widget, dp_domain_id)}, 163 + {SOF_TKN_COMP_HEAP_BYTES_REQUIREMENT, SND_SOC_TPLG_TUPLE_TYPE_WORD, get_token_u32, 164 + offsetof(struct snd_sof_widget, dp_heap_bytes)}, 165 + {SOF_TKN_COMP_STACK_BYTES_REQUIREMENT, SND_SOC_TPLG_TUPLE_TYPE_WORD, get_token_u32, 166 + offsetof(struct snd_sof_widget, dp_stack_bytes)}, 161 167 }; 162 168 163 169 static const struct sof_topology_token gain_tokens[] = { ··· 2974 2968 return 0; 2975 2969 } 2976 2970 2971 + static int sof_ipc4_widget_setup_msg_payload(struct snd_sof_dev *sdev, 2972 + struct snd_sof_widget *swidget, 2973 + struct sof_ipc4_msg *msg, 2974 + void *ipc_data, u32 ipc_size, 2975 + void **new_data) 2976 + { 2977 + struct sof_ipc4_mod_init_ext_dp_memory_data *dp_mem_data; 2978 + struct sof_ipc4_module_init_ext_init *ext_init; 2979 + struct sof_ipc4_module_init_ext_object *hdr; 2980 + int new_size; 2981 + u32 *payload; 2982 + u32 ext_pos; 2983 + 2984 + /* For the moment the only reason for adding init_ext_init payload is DP 2985 + * memory data. If both stack and heap size are 0 (= use default), then 2986 + * there is no need for init_ext_init payload. 2987 + */ 2988 + if (swidget->comp_domain != SOF_COMP_DOMAIN_DP) { 2989 + msg->extension &= ~SOF_IPC4_MOD_EXT_EXTENDED_INIT_MASK; 2990 + return 0; 2991 + } 2992 + 2993 + payload = kzalloc(sdev->ipc->max_payload_size, GFP_KERNEL); 2994 + if (!payload) 2995 + return -ENOMEM; 2996 + 2997 + /* Add ext_init first and set objects array flag to 1 */ 2998 + ext_init = (struct sof_ipc4_module_init_ext_init *)payload; 2999 + ext_init->word0 |= SOF_IPC4_MOD_INIT_EXT_OBJ_ARRAY_MASK; 3000 + ext_pos = DIV_ROUND_UP(sizeof(*ext_init), sizeof(u32)); 3001 + 3002 + /* Add object array objects after ext_init */ 3003 + 3004 + /* Add dp_memory_data if comp_domain indicates DP */ 3005 + if (swidget->comp_domain == SOF_COMP_DOMAIN_DP) { 3006 + hdr = (struct sof_ipc4_module_init_ext_object *)&payload[ext_pos]; 3007 + hdr->header = SOF_IPC4_MOD_INIT_EXT_OBJ_LAST_MASK | 3008 + SOF_IPC4_MOD_INIT_EXT_OBJ_ID(SOF_IPC4_MOD_INIT_DATA_ID_DP_DATA) | 3009 + SOF_IPC4_MOD_INIT_EXT_OBJ_WORDS(DIV_ROUND_UP(sizeof(*dp_mem_data), 3010 + sizeof(u32))); 3011 + ext_pos += DIV_ROUND_UP(sizeof(*hdr), sizeof(u32)); 3012 + dp_mem_data = (struct sof_ipc4_mod_init_ext_dp_memory_data *)&payload[ext_pos]; 3013 + dp_mem_data->domain_id = swidget->dp_domain_id; 3014 + dp_mem_data->stack_bytes = swidget->dp_stack_bytes; 3015 + dp_mem_data->heap_bytes = swidget->dp_heap_bytes; 3016 + ext_pos += DIV_ROUND_UP(sizeof(*dp_mem_data), sizeof(u32)); 3017 + } 3018 + 3019 + /* If another array object is added, remember clear previous OBJ_LAST bit */ 3020 + 3021 + /* Calculate final size and check that it fits to max payload size */ 3022 + new_size = ext_pos * sizeof(u32) + ipc_size; 3023 + if (new_size > sdev->ipc->max_payload_size) { 3024 + dev_err(sdev->dev, "Max ipc payload size %zu exceeded: %u", 3025 + sdev->ipc->max_payload_size, new_size); 3026 + kfree(payload); 3027 + return -EINVAL; 3028 + } 3029 + *new_data = payload; 3030 + 3031 + /* Copy module specific ipc_payload to end */ 3032 + memcpy(&payload[ext_pos], ipc_data, ipc_size); 3033 + 3034 + /* Update msg extension bits according to the payload changes */ 3035 + msg->extension |= SOF_IPC4_MOD_EXT_EXTENDED_INIT_MASK; 3036 + msg->extension &= ~SOF_IPC4_MOD_EXT_PARAM_SIZE_MASK; 3037 + msg->extension |= SOF_IPC4_MOD_EXT_PARAM_SIZE(DIV_ROUND_UP(new_size, sizeof(u32))); 3038 + 3039 + return new_size; 3040 + } 3041 + 2977 3042 static int sof_ipc4_widget_setup(struct snd_sof_dev *sdev, struct snd_sof_widget *swidget) 2978 3043 { 2979 3044 struct snd_sof_widget *pipe_widget = swidget->spipe->pipe_widget; ··· 3052 2975 struct sof_ipc4_pipeline *pipeline; 3053 2976 struct sof_ipc4_msg *msg; 3054 2977 void *ipc_data = NULL; 2978 + void *ext_data = NULL; 3055 2979 u32 ipc_size = 0; 3056 2980 int ret; 3057 2981 ··· 3197 3119 dev_dbg(sdev->dev, "Create widget %s (pipe %d) - ID %d, instance %d, core %d\n", 3198 3120 swidget->widget->name, swidget->pipeline_id, module_id, 3199 3121 swidget->instance_id, swidget->core); 3122 + 3123 + ret = sof_ipc4_widget_setup_msg_payload(sdev, swidget, msg, ipc_data, ipc_size, 3124 + &ext_data); 3125 + if (ret < 0) 3126 + goto fail; 3127 + 3128 + if (ret > 0) { 3129 + ipc_size = ret; 3130 + ipc_data = ext_data; 3131 + } 3200 3132 } else { 3201 3133 dev_dbg(sdev->dev, "Create pipeline %s (pipe %d) - instance %d, core %d\n", 3202 3134 swidget->widget->name, swidget->pipeline_id, ··· 3217 3129 msg->data_ptr = ipc_data; 3218 3130 3219 3131 ret = sof_ipc_tx_message_no_reply(sdev->ipc, msg, ipc_size); 3132 + 3133 + fail: 3220 3134 if (ret < 0) { 3221 3135 dev_err(sdev->dev, "failed to create module %s\n", swidget->widget->name); 3222 3136 ··· 3231 3141 } 3232 3142 } 3233 3143 3144 + kfree(ext_data); 3234 3145 return ret; 3235 3146 } 3236 3147
+5
sound/soc/sof/sof-audio.h
··· 454 454 /* Scheduling domain (enum sof_comp_domain), unset, Low Latency, or Data Processing */ 455 455 u32 comp_domain; 456 456 457 + /* The values below are added to mod_init pay load if comp_domain indicates DP component */ 458 + u32 dp_domain_id; /* DP process userspace domain ID */ 459 + u32 dp_stack_bytes; /* DP process stack size requirement in bytes */ 460 + u32 dp_heap_bytes; /* DP process heap size requirement in bytes */ 461 + 457 462 struct snd_soc_dapm_widget *widget; 458 463 struct list_head list; /* list in sdev widget list */ 459 464 struct snd_sof_pipeline *spipe;