-
Notifications
You must be signed in to change notification settings - Fork 133
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
load topology for each device #5209
base: topic/sof-dev
Are you sure you want to change the base?
load topology for each device #5209
Conversation
SOFCI TEST |
7eb5975
to
ffadfbb
Compare
ffadfbb
to
1deb725
Compare
1deb725
to
3264fc3
Compare
sound/soc/sof/topology.c
Outdated
ret = request_firmware(&fw, tplg_files[i].file, scomp->dev); | ||
if (ret < 0) { | ||
if (i == 0) { | ||
dev_dbg(scomp->dev,"Fail back to %s\n", tplg_name); |
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.
If it was a topology w/ DMIC then you have dropped the -2ch in a previous loop, you are not going to load the topology you supposed to be loading.
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.
Yes, you are right. I need to restore the original topology name.
tplg_name = strremove(tplg_name, "-2ch"); | ||
} else if (strstr(file, "-4ch")) { | ||
tplg_device = "dmic-4ch"; | ||
tplg_name = strremove(tplg_name, "-4ch"); |
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 are you dropping the 2ch/4ch from the original name?
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.
Because I would like to load the topology without dmic. For example, sof-hda-generic-2ch.tplg -> sof-hda-generic.tplg or similar.
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.
But the tplg_name is used only for loading the fallback, legacy, monolithic topology, in which case the fragments are not loaded. On a machine which have DMIC, you will load the topology w/o DMIC
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.
Not exactly, tplg_name topology will be also loaded if not all dai links are handled. For example, if the monolithic topology is sof-lnl-rt711-4ch
, then sof-lnl-rt711
and sof-lnl-dmic-4ch-id5
will be loaded
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.
right, but if something fails in between and we need to fallback to the monolithic topology then at line 2641 you will have sof-lnl-rt711.tplg
instead the correct monolithic sof-lnl-rt711-4ch.tplg
, or am I missing something?
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.
right, but if something fails in between and we need to fallback to the monolithic topology then at line 2641 you will have
sof-lnl-rt711.tplg
instead the correct monolithicsof-lnl-rt711-4ch.tplg
, or am I missing something?
Yeah, I will restore the tplg file name when it fails back to the monolithic topology, thanks.
sound/soc/sof/topology.c
Outdated
if (strstr(file, "hda-generic")) { | ||
tplg_device = "idisp"; | ||
} else { | ||
tplg_device = "sdca-hdmi"; |
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.
this is HDMI audio using SDW link or HDMI audio using HDA link, but used with SDW machine?
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.
This is the HDMI audio used with SDW codecs. I use different name for different codec interfaces is because that the existing topologies use different PCM id for different codec interfaces. For example, the HDMI PCM ids are 5,6,7 for SDW machines and 3,4,5 for HDA machines.
00-00: Jack Out (*) : : playback 1
00-01: Jack In (*) : : capture 1
00-02: Speaker (*) : : playback 1
00-03: Amp feedback (*) : : capture 1
00-04: Microphone (*) : : capture 1
00-05: HDMI1 (*) : : playback 1
00-06: HDMI2 (*) : : playback 1
00-07: HDMI3 (*) : : playback 1
00-31: Deepbuffer Jack Out (*) : : playback 1
00-00: HDA Analog (*) : : playback 1 : capture 1
00-03: HDMI1 (*) : : playback 1
00-04: HDMI2 (*) : : playback 1
00-05: HDMI3 (*) : : playback 1
00-06: DMIC Raw (*) : : capture 1
00-31: Deepbuffer HDA Analog (*) : : playback 1
sound/soc/sof/topology.c
Outdated
} else if (strstr(dai_link->name, "iDisp")) { | ||
tplg_dev = TPLG_DEVICE_HDMI; | ||
if (strstr(file, "hda-generic")) { | ||
tplg_device = "idisp"; |
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.
If I read the function right, this is not going to be used as the hda-generic will fall under load_default_tplg = true
, the HDA dai_link->name is not handled?
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.
load_default_tplg = true
means there are still some remaining pcms that are not loaded in the sparated topologies. And we need to load the renamed topology at line 2620.
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.
but can you load the idisp.tplg and the sof-hda-generic.tplg which also contains idisp definitions?
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.
but can you load the idisp.tplg and the sof-hda-generic.tplg which also contains idisp definitions?
No, so we need to make sure there is no idisp in sof-hda-generic.tplg.
"sdca-%damp", dai_link->num_cpus); | ||
} else if (strstr(dai_link->name, "SmartMic")) { | ||
tplg_dev = TPLG_DEVICE_SDW_MIC; | ||
tplg_device = "sdca-mic"; |
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.
Here and for the other checks: we need to update this match list every time a new component got introduced to products and we have new tplg fragment?
Is it going to scale?
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.
We need to update this match list when a new dai links got introduced. Given that we didn't update dai links in our machine drivers. I think we will only update the match list occasionally.
tplg_files[i].device, | ||
tplg_files[i].be_id); | ||
dev_dbg(scomp->dev, "Requesting %d %s\n", i, tplg_files[i].file); | ||
ret = request_firmware(&fw, tplg_files[i].file, scomp->dev); |
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.
the sof_create_ipc_file_profile()
will check if the firmware and the topology file (the monolithic one!) is in place.
The means that you always need to have the monolithic tplg and the split components installed, otherwise the profile is rejected and if not fallback IPC version is available then we will fail.
I have a feeling that this split tplg handling has to touch the fw-file-profile.c as well.
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.
Yeah, I am thinking this open, too. My idea is that we don't touch the monolithic topology. I.e. the monolithic topology will coexist with the split topologies. So that sof_create_ipc_file_profile() will still valid.
sound/soc/sof/topology.c
Outdated
"%s/sof-%s-%s-id%d.tplg", | ||
sof_pdata->tplg_filename_prefix, platform, | ||
tplg_files[i].device, | ||
tplg_files[i].be_id); |
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.
a clean documentation as commit message and comments to explain clearly the expected file naming and also an update to sof-docs must be done.
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.
Totally agree.
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.
have you thought about the documentation?
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.
I almost forget the document. I will do it next week.
6259f1d
to
78eed41
Compare
Topology PR: thesofproject/sof#9668. I would like to start with SDCA codecs only. SDCA is more urgent than others. If we can create dai links based on the supported SDCA functions, we don't need to use quirks for enabling/disabling specific dai links. |
78eed41
to
95da27b
Compare
The existing code point tuples[*num_copied_tuples].value.s to elem->string which works fine if there is only one topology is handled and all the tuples are handled before the topology fw is released. However, we will handle multiple topologies and the tuples may be used after the topology fw is release. Ues devm_kasprintf to allocate the string for the tuples to avoid invalid access. Signed-off-by: Bard Liao <[email protected]>
95da27b
to
9641e65
Compare
9641e65
to
788e9bf
Compare
sound/soc/sof/topology.c
Outdated
@@ -2489,7 +2489,6 @@ int snd_sof_load_topology(struct snd_soc_component *scomp, const char *file) | |||
if (ret < 0) { | |||
dev_err(scomp->dev, "error: tplg component load failed %d\n", | |||
ret); | |||
ret = -EINVAL; | |||
} |
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.
you can also drop the curly brackets
sound/soc/sof/topology.c
Outdated
@@ -2464,15 +2465,180 @@ static const struct snd_soc_tplg_ops sof_dspless_tplg_ops = { | |||
.bytes_ext_ops_count = ARRAY_SIZE(sof_dspless_bytes_ext_ops), | |||
}; | |||
|
|||
#define MAX_TPLG_NUM 5 |
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.
Add TPLG_DEVICE_MAX at the end of the enum?
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.
Yes, it would be better.
sound/soc/sof/topology.c
Outdated
|
||
static bool is_platform_support_separated_tplg(const char *platform) | ||
{ | ||
if (!strcmp(platform, "mtl") || !strcmp(platform, "lnl") || !strcmp(platform, "ptl")) |
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.
this is not going to scale... You are already missing ARL...
I would allow this for SOF_IPC4, I guess you handle the case when the topology files are not split, so it should just fallback?
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.
I guess you want to exclude the sof-hda on top of platform, right?
if !ipc4 || hda -> false ?
But this includes I2S machines also... Not sure what rule you want to make here.
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.
My first thought is to only list the platforms that we already have the topology support. And "HDA" is one of the "platform" because we use sof-hda-generic.tplg for all platforms. Yeah, we can remove this check and fallback if the driver doesn't find the topology files.
} else if (strstr(dai_link->name, "SmartAmp")) { | ||
tplg_dev = TPLG_DEVICE_SDW_AMP; | ||
tplg_device = devm_kasprintf(sdev->dev, GFP_KERNEL, | ||
"sdca-%damp", dai_link->num_cpus); |
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.
can there be multiple SmartAmp link? You only going to record the first one. The naming of the device is also interesting, it is postfixed with a number of CPU dais?
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.
We don't support multiple SmartAmp link in the machine driver. And, yes, postfixing with a number of CPU dais is intentional. We need to set NUM_SDW_AMP_LINKS in the topology.
sound/soc/sof/topology.c
Outdated
"%s/sof-%s-%s-id%d.tplg", | ||
sof_pdata->tplg_filename_prefix, platform, | ||
tplg_files[i].device, | ||
tplg_files[i].be_id); |
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.
have you thought about the documentation?
sound/soc/sof/topology.c
Outdated
TPLG_DEVICE_SDW_JACK, | ||
TPLG_DEVICE_SDW_AMP, | ||
TPLG_DEVICE_SDW_MIC, | ||
TPLG_DEVICE_HOST_DMIC, |
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.
This is awkwardly named, I think you meant INTEL_DMIC (conencted to PCH-DMIC)?
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.
I will change it to TPLG_DEVICE_PCH_DMIC, thanks
tplg_dev = TPLG_DEVICE_HOST_DMIC; | ||
} else if (strstr(dai_link->name, "iDisp")) { | ||
tplg_dev = TPLG_DEVICE_HDMI; | ||
tplg_device = "sdca-hdmi"; |
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.
I know that you have excluded generic HDA, but things might fall through the cracks and picks this as HDMI where the PCM device id range is not 5,6,7. Which I suppose this fragment will provide.
How this naming going to scale with display audio serviced by SDW?
I'm not sure how this can be handled, but if we let HDA generic into \this logic, it is going to fail.
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.
I added the be_id in the topology name, so that the PCM device id can be any number.
sound/soc/sof/topology.c
Outdated
goto legacy_tplg; | ||
} | ||
|
||
dev_err(scomp->dev, "error: tplg request firmware %s failed err: %d\n", |
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.
Please don't use 'error:' in new prints.
return -ENOMEM; | ||
|
||
dev_dbg(scomp->dev, "Requesting %d %s\n", i, tplg_files[i].file); | ||
ret = request_firmware(&fw, tplg_files[i].file, scomp->dev); |
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.
firmware_request_nowarn() to handle the fallback in case the fragmented tplg is not present, but what will happen if you load two fragment thn the third is missing and try to load the monolithic over it?
I'm sure that this is going to happen.
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.
and the original name is altered, the -2/4ch is dropped, so we are not going to load the right tplg in some cases.
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.
firmware_request_nowarn() to handle the fallback in case the fragmented tplg is not present, but what will happen if you load two fragment thn the third is missing and try to load the monolithic over it?
It will return error if the second or later topology is not present. My idea is that if we can't find the first fragmented topology, it means we don't have the required version of topologies, then we need to fall back to use the original topology. However, if we find the first fragmented topology, it means we use the new version of topology, and there should be something wrong if we don't find any required fragmented topology.
and the original name is altered, the -2/4ch is dropped, so we are not going to load the right tplg in some cases.
I will restore the file name in this case.
sound/soc/sof/topology.c
Outdated
|
||
for (i = 0; i < tplg_num; i++) { | ||
tplg_files[i].file = devm_kasprintf(sdev->dev, GFP_KERNEL, | ||
"%s/sof-%s-%s-id%d.tplg", |
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.
Another question: can a sof-sdca-jack.tplg
work on all platforms, do we really need the mtl/lnl/ptl/arl/etc variants?
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.
Good questions. We set 'PLATFORM' in the topology, but we don't set any variables for SDW. So, I think we can remove the platform name for the SDW topologies. It will be easier to implement the topologies.
No need to convert the return value of snd_soc_tplg_component_load(). Signed-off-by: Bard Liao <[email protected]>
Get device information from dai links and load topology for each device. This allow user create a topology for single device. The driver will select the needed topologies and we don't need to create topologies for each product. Signed-off-by: Bard Liao <[email protected]>
788e9bf
to
f5eb366
Compare
Get device information from dai links. load topology for each device.
This should not impact the existing devices.