-
Notifications
You must be signed in to change notification settings - Fork 2
[RFC][WIP]Nhlt plugin and simple topology plugin interface #5
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
Conversation
|
Initial something... I need to figure out:
|
925309d to
6293c61
Compare
|
@perexg FYI. if you have time to comment... sorry this is against sof not-up-to-date tree, so only 2 last commits are relevant. Don't have so much experience on the .so loading code, this is taken from alsa-plugins mostly. So my questions like above:
I've now hardcoded the nhlt plugin loading and can pretty much use the nhlt as in my previous version. |
|
@juimonen probably worth to send to alsa repo now. |
6293c61 to
d75c3eb
Compare
97f9e79 to
5523cd4
Compare
Signed-off-by: Jaroslav Kysela <perex@perex.cz>
Signed-off-by: Jaroslav Kysela <perex@perex.cz>
Signed-off-by: Jaroslav Kysela <perex@perex.cz>
Introduce the -K,--lock-dir parameter to specify the locking directory. If the locking is active, files card<NUM>.lock are used to serialize the multiple initialization requests (udev, service). Allow the relative -O,--lock-file argument (it's default now). Signed-off-by: Jaroslav Kysela <perex@perex.cz>
780a540 to
0e617d4
Compare
| /* get dmic endpoint count */ | ||
| int nhlt_dmic_get_ep_count(struct intel_nhlt_params *nhlt) | ||
| { | ||
| return dmic_get_vendor_blob_count(nhlt); |
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.
is this correct? an endpoint can support multiple formats, and each format will expose a blob. The blob count is not identical to endpoint count IMHO.
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.
so it is bad naming... this 1 "vendor blob" would include all hw config variants
topology/nhlt/intel/ssp-nhlt.c
Outdated
| ep.revision_id = 0; | ||
| ep.subsystem_id = 0; | ||
| ep.device_type = 0; | ||
| ep.direction = NHLT_ENDPOINT_DIRECTION_RENDER; |
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.
what about capture?
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.
so not sure what to do here... NHLT doesn't have duplex definition, so should I just duplicate the endpoint data in that case? anyway can take this somehow from direction param
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 I think the endpoints are duplicated for the SSP. That's what you see from the NHTL tool from Bob Moore.
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.
sure I can add the duplication
| * id 0 | ||
| * mclk_freq 38400000 | ||
| * bclk_freq 4800000 | ||
| * tdm_slot_width 32 |
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 example cannot work, the bclk would be 3072000 Hz...
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.
oh, maybe bclk 2400000
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.
nope, blck of 2.4 MHz cannot work because that would mean slots of 25 bits that NHLT cannot represent.
for NHLT, you have to assume the slot_width is a multiple of 8, and then find the bclk=fsync * number of slots * slots_width.
that will not work of course for platforms with a 24 MHz root clock, where I think the only solution might be to use the dreaded M/N dividers.
| uint32_t ssc3; | ||
| uint32_t ssioc; | ||
| uint32_t mdivc; | ||
| uint32_t mdivr; |
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.
mdivr[] ?
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.
hmm I have here mdivc and mdivr separately, I see them in some spec mdiv[2], is that what you mean?
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, we have two MCLK IDs, and you can configure them separately.
| ssp_freq[MAX_SSP_FREQ_INDEX].freq); | ||
| return -EINVAL; | ||
| } | ||
| #endif |
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.
??
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.
hmm this is a check against maximum possible ssp frequency, which I understand is platform dependent. So not sure I can get this somewhere nicely.
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.
for e.g. in tgl this would be 96000000, so if this is added to the topology I can do the check
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 yeah will now just check for 0 mclk
| else | ||
| clk_div = 0xFFF; /* bypass clk divider */ | ||
|
|
||
| /* use clock source 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 ? Some folks need MCLK1!
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.
ok, I need to discuss this with you as this is a copy from initial code against closed fw...
bac507f to
a6ea097
Compare
Add a simple plugin interface for processing the topology tree. There
can be cases where parts of the topology need to be translated from the
original format into something else. For example one could calculate
some kind of filter coefficients from filter parameters or some other
binary interface parameters from plain text topology tokens.
Mechanism is similar as in alsa-plugins and in the plugin there should
be only 1 function exported of the form:
int _snd_topology_##pluginname##_process (snd_config_t *input, snd_config_t *output)
Input and output parameters are snd_config tree before and after topology2
pre-processing. So the plugin can modify both if needed. There are cases
where the plugin may need to get information from input tree, but make
modifications to the output.
The plugins to be used can be defined in command line with:
alsatplg -DPREPROCESS_PLUGINS="foobar" -c topology.conf -p -o topology.tplg
Multiple plugins should be separated by ":".
Plugins to be used can also be defined with "Define" clause inside the
topology file (but command line takes precedence):
Define {
PREPROCESS_PLUGINS "foobar"
}
Signed-off-by: Jaska Uimonen <jaska.uimonen@linux.intel.com>
a6ea097 to
77065c1
Compare
|
@juimonen is this ready to send upstream once SSP is aligned (now DMIC is working) or are there other items WIP ? |
0382c29 to
551df49
Compare
7f28666 to
b76bdc7
Compare
Add Intel nhlt acpi table encoder plugin into topology2.0 processing. Nhlt internal structure is defined in: https://01.org/sites/default/files/595976_intel_sst_nhlt.pdf Nhlt acpi table contain vendor specific binary data blobs that are used in some Intel dsp platforms for configuring the dmic and ssp hardware. The function of this code is mainly to generate the vendor specific binary blobs, but as there is existing nhlt parser code and header in kernel there's no point of re-inventing the container: just use the existing nhlt acpi table format. Basically this code is creating similar nhlt acpi table that you would get from: cat /sys/firmware/acpi/tables/NHLT This code will have implementation for dmic and ssp endpoints. Thus the code will translate the topology dai tokens into vendor specific binary blobs and pack them into nhlt acpi table. Ssp and dmic code is lifted from Sound Open Firmware (sof) code base, thus it will have BSD-3 license. This plugin can be enabled from command line with: alsatplg -DPREPROCESS_PLUGINS="nhlt" -c foo.conf -p -o bar.tplg You can also dump the nhlt binary into a file with additional define: -DNHLT_BIN="nhlt.bin" Signed-off-by: Jaska Uimonen <jaska.uimonen@linux.intel.com>
alsactl distributed as part of Fedora 40 got a SEGV:
# journalctl
...
May 17 00:55:58 dev64.localdomain kernel: alsactl[1923]: segfault at 28 ip 00005600705b3373 sp 00007ffd9712bef0 error 4 in alsactl[5600705af000+13000] likely on CPU 5 (core 8, socket 0)
...
As the following output of the debug session, card_free() tried a card
pointing NULL:
$ sudo coredumpctl debug alsactl
PID: 1923 (alsactl)
UID: 0 (root)
GID: 0 (root)
Signal: 11 (SEGV)
Timestamp: Fri 2024-05-17 00:55:58 JST (3h 34min ago)
Command Line: /usr/sbin/alsactl -s -n 19 -c -E ALSA_CONFIG_PATH=/etc/alsa/alsactl.conf --initfile=/lib/alsa/init/00main rdaemon
Executable: /usr/sbin/alsactl
Control Group: /system.slice/alsa-state.service
Unit: alsa-state.service
Slice: system.slice
Boot ID: 241b5a2ef86f4940bb3d340583c80d88
Machine ID: 437365709a8c488c9481ee4b6651c2ec
Hostname: dev64.localdomain
Storage: /var/lib/systemd/coredump/core.alsactl.0.241b5a2ef86f4940bb3d340583c80d88.1923.1715874958000000.zst (present)
Size on Disk: 81.7K
Package: alsa-utils/1.2.11-1.fc40
build-id: 3b6fec58b3566d666d6e9fd48e8fcf04f03f0152
Message: Process 1923 (alsactl) of user 0 dumped core.
Module libasound.so.2 from rpm alsa-lib-1.2.11-2.fc40.x86_64
Module alsactl from rpm alsa-utils-1.2.11-1.fc40.x86_64
Stack trace of thread 1923:
#0 0x00005600705b3373 card_free (alsactl + 0xa373)
#1 0x00005600705c0e54 state_daemon (alsactl + 0x17e54)
#2 0x00005600705b2339 main (alsactl + 0x9339)
#3 0x00007f4c0b9b7088 __libc_start_call_main (libc.so.6 + 0x2a088)
#4 0x00007f4c0b9b714b __libc_start_main_impl (libc.so.6 + 0x2a14b)
#5 0x00005600705b2df5 _start (alsactl + 0x9df5)
ELF object binary architecture: AMD x86-64
GNU gdb (Fedora Linux) 14.2-1.fc40
Copyright (C) 2023 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
Type "show copying" and "show warranty" for details.
This GDB was configured as "x86_64-redhat-linux-gnu".
Type "show configuration" for configuration details.
For bug reporting instructions, please see:
<https://www.gnu.org/software/gdb/bugs/>.
Find the GDB manual and other documentation resources online at:
<http://www.gnu.org/software/gdb/documentation/>.
For help, type "help".
Type "apropos word" to search for commands related to "word"...
Reading symbols from /usr/sbin/alsactl...
Reading symbols from /usr/lib/debug/usr/sbin/alsactl-1.2.11-1.fc40.x86_64.debug...
[New LWP 1923]
[Thread debugging using libthread_db enabled]
Using host libthread_db library "/lib64/libthread_db.so.1".
Core was generated by `/usr/sbin/alsactl -s -n 19 -c -E ALSA_CONFIG_PATH=/etc/alsa/alsactl.conf --init'.
Program terminated with signal SIGSEGV, Segmentation fault.
#0 free_list (list=0x20) at /usr/src/debug/alsa-utils-1.2.11-1.fc40.x86_64/alsactl/daemon.c:73
73 for (i = 0; i < list->size; i++)
(gdb) where
#0 free_list (list=0x20) at /usr/src/debug/alsa-utils-1.2.11-1.fc40.x86_64/alsactl/daemon.c:73
#1 card_free (card=card@entry=0x5600707455f0) at /usr/src/debug/alsa-utils-1.2.11-1.fc40.x86_64/alsactl/daemon.c:82
#2 0x00005600705c0e54 in state_daemon (file=file@entry=0x5600705c31a1 "/var/lib/alsa/asound.state", cardname=cardname@entry=0x0, period=period@entry=300,
pidfile=pidfile@entry=0x5600705c3170 "/var/run/alsactl.pid") at /usr/src/debug/alsa-utils-1.2.11-1.fc40.x86_64/alsactl/daemon.c:455
#3 0x00005600705b2339 in main (argc=<optimized out>, argv=<optimized out>) at /usr/src/debug/alsa-utils-1.2.11-1.fc40.x86_64/alsactl/alsactl.c:459
(gdb) list
68
69 static void free_list(struct id_list *list)
70 {
71 int i;
72
73 for (i = 0; i < list->size; i++)
74 free(list->list[i]);
75 free(list->list);
76 }
77
(gdb) up
#1 card_free (card=card@entry=0x5600707455f0) at /usr/src/debug/alsa-utils-1.2.11-1.fc40.x86_64/alsactl/daemon.c:82
82 free_list(&c->blacklist);
(gdb) p c
$1 = (struct card *) 0x0
(gdb)
Closes: alsa-project#267
Signed-off-by: Masatake YAMATO <yamato@redhat.com>
Signed-off-by: Jaroslav Kysela <perex@perex.cz>
No description provided.