Skip to content

Commit 6bbbbb5

Browse files
author
Jyri Sarha
committed
ASoC: sof: ipc4-topology: Add support to sched_domain attribute
Add SOF_TKN_COMP_SCHED_DOMAIN and connect it to struct snd_sof_widget comp_domain member, with new get_token_comp_domain() function. The logic is such that if the topology attribute is not present in the widget node the corresponding IPC4 extension value is taken from the module's manifest like before. But if the attribute is found its value overrides what is there in the manifest. Signed-off-by: Jyri Sarha <jyri.sarha@linux.intel.com>
1 parent fb66eed commit 6bbbbb5

5 files changed

Lines changed: 56 additions & 0 deletions

File tree

include/sound/sof/topology.h

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,13 @@ enum sof_comp_type {
4545
SOF_COMP_FILEWRITE = 10001, /**< host test based file IO */
4646
};
4747

48+
/* Scheduling domain, unset, Low Latency, or Data Processing */
49+
enum sof_comp_domain {
50+
SOF_COMP_DOMAIN_UNSET = 0,
51+
SOF_COMP_DOMAIN_LL,
52+
SOF_COMP_DOMAIN_DP,
53+
};
54+
4855
/* XRUN action for component */
4956
#define SOF_XRUN_STOP 1 /**< stop stream */
5057
#define SOF_XRUN_UNDER_ZERO 2 /**< send 0s to sink */

include/uapi/sound/sof/tokens.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -106,6 +106,8 @@
106106
*/
107107
#define SOF_TKN_COMP_NO_WNAME_IN_KCONTROL_NAME 417
108108

109+
#define SOF_TKN_COMP_SCHED_DOMAIN 418
110+
109111
/* SSP */
110112
#define SOF_TKN_INTEL_SSP_CLKS_CONTROL 500
111113
#define SOF_TKN_INTEL_SSP_MCLK_ID 501

sound/soc/sof/ipc4-topology.c

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -127,6 +127,8 @@ static const struct sof_topology_token comp_ext_tokens[] = {
127127
offsetof(struct snd_sof_widget, uuid)},
128128
{SOF_TKN_COMP_CORE_ID, SND_SOC_TPLG_TUPLE_TYPE_WORD, get_token_u32,
129129
offsetof(struct snd_sof_widget, core)},
130+
{SOF_TKN_COMP_SCHED_DOMAIN, SND_SOC_TPLG_TUPLE_TYPE_STRING, get_token_comp_domain,
131+
offsetof(struct snd_sof_widget, comp_domain)},
130132
};
131133

132134
static const struct sof_topology_token gain_tokens[] = {
@@ -498,6 +500,16 @@ static int sof_ipc4_widget_setup_msg(struct snd_sof_widget *swidget, struct sof_
498500
msg->extension = SOF_IPC4_MOD_EXT_CORE_ID(swidget->core);
499501

500502
type = (fw_module->man4_module_entry.type & SOF_IPC4_MODULE_DP) ? 1 : 0;
503+
switch (swidget->comp_domain) {
504+
case SOF_COMP_DOMAIN_LL:
505+
type = 0;
506+
break;
507+
case SOF_COMP_DOMAIN_DP:
508+
type = 1;
509+
break;
510+
default:
511+
break;
512+
}
501513
msg->extension |= SOF_IPC4_MOD_EXT_DOMAIN(type);
502514

503515
return 0;

sound/soc/sof/sof-audio.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -456,6 +456,9 @@ struct snd_sof_widget {
456456
*/
457457
bool dynamic_pipeline_widget;
458458

459+
/* Scheduling domain, unset, Low Latency, or Data Processing */
460+
enum sof_comp_domain comp_domain;
461+
459462
struct snd_soc_dapm_widget *widget;
460463
struct list_head list; /* list in sdev widget list */
461464
struct snd_sof_pipeline *spipe;
@@ -678,6 +681,7 @@ int get_token_u32(void *elem, void *object, u32 offset);
678681
int get_token_u16(void *elem, void *object, u32 offset);
679682
int get_token_comp_format(void *elem, void *object, u32 offset);
680683
int get_token_dai_type(void *elem, void *object, u32 offset);
684+
int get_token_comp_domain(void *elem, void *object, u32 offset);
681685
int get_token_uuid(void *elem, void *object, u32 offset);
682686
int get_token_string(void *elem, void *object, u32 offset);
683687
int sof_update_ipc_object(struct snd_soc_component *scomp, void *object, enum sof_tokens token_id,

sound/soc/sof/topology.c

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
#include <linux/workqueue.h>
1616
#include <sound/tlv.h>
1717
#include <uapi/sound/sof/tokens.h>
18+
#include <sound/sof/topology.h>
1819
#include "sof-priv.h"
1920
#include "sof-audio.h"
2021
#include "ops.h"
@@ -317,6 +318,28 @@ static enum sof_ipc_dai_type find_dai(const char *name)
317318
return SOF_DAI_INTEL_NONE;
318319
}
319320

321+
struct sof_comp_domains {
322+
const char *name;
323+
enum sof_comp_domain domain;
324+
};
325+
326+
static const struct sof_comp_domains sof_domains[] = {
327+
{ "LL", SOF_COMP_DOMAIN_LL, },
328+
{ "DP", SOF_COMP_DOMAIN_DP, }
329+
};
330+
331+
static enum sof_comp_domain find_domain(const char *name)
332+
{
333+
int i;
334+
335+
for (i = 0; i < ARRAY_SIZE(sof_domains); i++) {
336+
if (strcmp(name, sof_domains[i].name) == 0)
337+
return sof_domains[i].domain;
338+
}
339+
340+
return SOF_COMP_DOMAIN_UNSET;
341+
}
342+
320343
/*
321344
* Supported Frame format types and lookup, add new ones to end of list.
322345
*/
@@ -405,6 +428,14 @@ int get_token_dai_type(void *elem, void *object, u32 offset)
405428
return 0;
406429
}
407430

431+
int get_token_comp_domain(void *elem, void *object, u32 offset)
432+
{
433+
u32 *val = (u32 *)((u8 *)object + offset);
434+
435+
*val = find_domain((const char *)elem);
436+
return 0;
437+
}
438+
408439
/* PCM */
409440
static const struct sof_topology_token stream_tokens[] = {
410441
{SOF_TKN_STREAM_PLAYBACK_COMPATIBLE_D0I3, SND_SOC_TPLG_TUPLE_TYPE_BOOL, get_token_u16,

0 commit comments

Comments
 (0)