-
Notifications
You must be signed in to change notification settings - Fork 350
Part 2 of compressed offload support for IPC4 (no topology changes) #10534
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
Changes from 4 commits
7966ba4
e79442a
c357597
d4166b4
1a81a1c
546e129
02d8b40
4b74d4e
7a5dae5
3e38b64
6b2712d
f3f018b
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 |
|---|---|---|
|
|
@@ -12,6 +12,7 @@ | |
| #include <ipc4/pipeline.h> | ||
| #include <ipc4/logging.h> | ||
| #include <ipc/topology.h> | ||
| #include <ipc/compress_params.h> | ||
| #include <sof_versions.h> | ||
| #include <sof/lib/cpu-clk-manager.h> | ||
| #include <sof/lib/cpu.h> | ||
|
|
@@ -65,6 +66,69 @@ __cold static uint32_t get_host_buffer_size(void) | |
| return periods; | ||
| } | ||
|
|
||
| struct sof_ipc4_codec_info_data { | ||
| uint32_t count; | ||
| uint32_t items[32]; | ||
| } __packed __aligned(4); | ||
|
|
||
| /** | ||
| * Encodes codec and direction information into a single 32-bit value. | ||
| * @param codec Codec type (bits 0-7) | ||
| * @param dir Stream direction (bits 8-11) | ||
| * @return Encoded 32-bit value | ||
| */ | ||
| #define SET_CODEC_INFO_ITEM(codec, dir) (((codec) & 0xff) | (((dir) & 0xf) << 8)) | ||
|
|
||
| static void get_codec_info(struct sof_tlv **tuple) | ||
| { | ||
| struct sof_ipc4_codec_info_data codec_info = { 0 }; | ||
|
|
||
| #ifdef CONFIG_CADENCE_CODEC_AAC_DEC | ||
| codec_info.items[codec_info.count++] = | ||
| SET_CODEC_INFO_ITEM(SND_AUDIOCODEC_AAC, SOF_IPC_STREAM_PLAYBACK); | ||
| #endif | ||
| #ifdef CONFIG_CADENCE_CODEC_MP3_DEC | ||
| codec_info.items[codec_info.count++] = | ||
| SET_CODEC_INFO_ITEM(SND_AUDIOCODEC_MP3, SOF_IPC_STREAM_PLAYBACK); | ||
| #endif | ||
| #ifdef CONFIG_CADENCE_CODEC_MP3_ENC | ||
| codec_info.items[codec_info.count++] = | ||
| SET_CODEC_INFO_ITEM(SND_AUDIOCODEC_MP3, SOF_IPC_STREAM_CAPTURE); | ||
| #endif | ||
| #ifdef CONFIG_CADENCE_CODEC_VORBIS_DEC | ||
| codec_info.items[codec_info.count++] = | ||
| SET_CODEC_INFO_ITEM(SND_AUDIOCODEC_VORBIS, SOF_IPC_STREAM_PLAYBACK); | ||
| #endif | ||
|
|
||
| if (!codec_info.count) | ||
| return; | ||
|
|
||
| tlv_value_set(*tuple, IPC4_SOF_CODEC_INFO, sizeof(codec_info.count) + | ||
| sizeof(codec_info.items[0]) * codec_info.count, &codec_info); | ||
|
|
||
| *tuple = tlv_next(*tuple); | ||
| } | ||
|
|
||
| #define SOF_CONFIG_MEMBER_SIZE(struct_name) (sizeof(struct sof_tlv) + \ | ||
| sizeof(struct struct_name)) | ||
| #define SOF_CONFIG_SIZE_MAX (SOF_CONFIG_MEMBER_SIZE(sof_ipc4_codec_info_data)) | ||
|
|
||
| static void base_fw_sof_config(struct sof_tlv **tuple) | ||
| { | ||
| char sof_config_data[SOF_CONFIG_SIZE_MAX] = { 0 }; | ||
| struct sof_tlv *sof_config_tuple = (struct sof_tlv *)sof_config_data; | ||
| uint32_t sof_config_size; | ||
|
Collaborator
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.
|
||
|
|
||
| get_codec_info(&sof_config_tuple); | ||
| sof_config_size = (uint32_t)((char *)sof_config_tuple - sof_config_data); | ||
|
Collaborator
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. you could just type-cast |
||
| if (sof_config_size == 0) | ||
|
Collaborator
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. can it turn negative? |
||
| return; | ||
|
|
||
| tlv_value_set(*tuple, IPC4_FW_SOF_INFO, sof_config_size, sof_config_data); | ||
|
|
||
| *tuple = tlv_next(*tuple); | ||
| } | ||
|
|
||
| __cold static int basefw_config(uint32_t *data_offset, char *data) | ||
| { | ||
| uint16_t version[4] = {SOF_MAJOR, SOF_MINOR, SOF_MICRO, SOF_BUILD}; | ||
|
|
@@ -150,6 +214,8 @@ __cold static int basefw_config(uint32_t *data_offset, char *data) | |
|
|
||
| tuple = tlv_next(tuple); | ||
|
|
||
| base_fw_sof_config(&tuple); | ||
|
|
||
| /* add platform specific tuples */ | ||
| basefw_vendor_fw_config(&plat_data_offset, (char *)tuple); | ||
|
|
||
|
|
||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -376,12 +376,28 @@ enum ipc4_fw_config_params { | |
| IPC4_FW_CONTEXT_SAVE = 29, | ||
| /* Minimum size of host buffer in ms */ | ||
| IPC4_FW_MIN_HOST_BUFFER_PERIODS = 33, | ||
| /* decoder/encoder codec information */ | ||
| IPC4_FW_SOF_INFO = 35, | ||
|
Contributor
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. If this ID is good than we need to reserve it...
Collaborator
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. 35 seems free. We need to reserve it.
Contributor
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, can we initiate the reservation process? |
||
| /* Total number of FW config parameters */ | ||
| IPC4_FW_CFG_PARAMS_COUNT, | ||
| /* Max config parameter id */ | ||
| IPC4_MAX_FW_CFG_PARAM = IPC4_FW_CFG_PARAMS_COUNT - 1, | ||
| }; | ||
|
|
||
| /* | ||
| * tuple based array for SOF specific information under IPC4_FW_SOF_INFO | ||
| * tuple of fw_config | ||
| */ | ||
| enum ipc4_fw_sof_info_params { | ||
| /* decoder/encoder codec information */ | ||
| IPC4_SOF_CODEC_INFO = 0, | ||
|
|
||
| /* Total number of SOF config parameters */ | ||
| IPC4_SOF_CFG_PARAMS_COUNT, | ||
| /* Max config parameter id */ | ||
| IPC4_MAX_SOF_CFG_PARAM = IPC4_SOF_CFG_PARAMS_COUNT - 1, | ||
| }; | ||
|
|
||
| enum ipc4_hw_config_params { | ||
| /* Version of cAVS implemented by FW (from ROMInfo) */ | ||
| IPC4_CAVS_VER_HW_CFG = 0, | ||
|
|
||
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Why 32? Future-proofing or aligning to some existing spec/convention?